Skip to content

Commit

Permalink
feat: add way to inject custom prom-client instance (#100)
Browse files Browse the repository at this point in the history
  • Loading branch information
wiktor-obrebski committed Jan 14, 2024
1 parent 8d62106 commit aa873d8
Show file tree
Hide file tree
Showing 6 changed files with 47 additions and 7 deletions.
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,8 @@ See for details [docs](docs/api/fastify-metrics.imetricspluginoptions.md)
| [endpoint?](./docs/api/fastify-metrics.imetricspluginoptions.endpoint.md) | string \| null \| [`Fastify.RouteOptions`](https://www.fastify.io/docs/api/latest/Reference/Routes/#routes-options) | `'/metrics'` |
| [name?](./docs/api/fastify-metrics.imetricspluginoptions.name.md) | string | `'metrics'` |
| [routeMetrics?](./docs/api/fastify-metrics.imetricspluginoptions.routemetrics.md) | [IRouteMetricsConfig](./docs/api/fastify-metrics.iroutemetricsconfig.md) | `{ enabled: true }` |
| [promClient?](./docs/api/fastify-metrics.imetricspluginoptions.promclient.md) | `prom-client` instance \| null | `null` |


#### Route metrics

Expand Down
11 changes: 6 additions & 5 deletions docs/api/fastify-metrics.imetricspluginoptions.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,9 @@ export interface IMetricsPluginOptions

| Property | Modifiers | Type | Description |
| ------------------------------------------------------------------------------------- | --------- | ------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
| [clearRegisterOnInit](./fastify-metrics.imetricspluginoptions.clearregisteroninit.md) | | boolean | Clears the prom-client global registry before adding metrics. Default to <code>false</code> |
| [defaultMetrics](./fastify-metrics.imetricspluginoptions.defaultmetrics.md) | | [IDefaultMetricsConfig](./fastify-metrics.idefaultmetricsconfig.md) | Default prom-client metrics config. Collect prometheus recommended and node.js specific metrics like event loop lag. |
| [endpoint](./fastify-metrics.imetricspluginoptions.endpoint.md) | | string \| null \| RouteOptions | Endpoint to expose metrics in prometheus format. <code>null</code> - disables metrics exposure |
| [name](./fastify-metrics.imetricspluginoptions.name.md) | | string | Plugin name that will be registered in fastify instance. |
| [routeMetrics](./fastify-metrics.imetricspluginoptions.routemetrics.md) | | [IRouteMetricsConfig](./fastify-metrics.iroutemetricsconfig.md) | Per route metrics config. Collect response time metric on requests |
| [clearRegisterOnInit](./fastify-metrics.imetricspluginoptions.clearregisteroninit.md) | | boolean | Clears the prom-client global registry before adding metrics. Defaults to <code>false</code>. |
| [defaultMetrics](./fastify-metrics.imetricspluginoptions.defaultmetrics.md) | | [IDefaultMetricsConfig](./fastify-metrics.idefaultmetricsconfig.md) | Default prom-client metrics config. Collects Prometheus recommended and Node.js specific metrics like event loop lag.|
| [endpoint](./fastify-metrics.imetricspluginoptions.endpoint.md) | | string \| null \| RouteOptions | Endpoint to expose metrics in Prometheus format. <code>null</code> - disables metrics exposure. |
| [name](./fastify-metrics.imetricspluginoptions.name.md) | | string | Plugin name that will be registered in Fastify instance. |
| [routeMetrics](./fastify-metrics.imetricspluginoptions.routemetrics.md) | | [IRouteMetricsConfig](./fastify-metrics.iroutemetricsconfig.md) | Per route metrics config. Collects response time metric on requests. |
| [promClient](./fastify-metrics.imetricspluginoptions.promclient.md) | | `Client` \| null | Optional. Allows overriding the internally used Prometheus client instance. Defaults to `null`. |
27 changes: 27 additions & 0 deletions src/__tests__/inject-prom-client.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { afterEach, describe, expect, test } from '@jest/globals';
import fastify from 'fastify';
import type promClient from 'prom-client';
import fastifyPlugin from '../';

describe('metrics plugin', () => {
let app = fastify();

afterEach(async () => {
await app.close();
});

test('uses provided prom-client instance', async () => {
const testPromClient = {} as unknown as typeof promClient;

app = fastify();
await app.register(fastifyPlugin, {
promClient: testPromClient,
endpoint: '/metrics',
defaultMetrics: { enabled: false },
routeMetrics: { enabled: false },
});
await app.ready();

expect(app.metrics.client).toEqual(testPromClient);
});
});
1 change: 1 addition & 0 deletions src/fastify-metrics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ export const DEFAULT_OPTIONS: IMetricsPluginOptions = {
defaultMetrics: {
enabled: true,
},
promClient: null,
};

/**
Expand Down
6 changes: 4 additions & 2 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,11 +57,13 @@ export default fastifyPlugin<Partial<IMetricsPluginOptions>>(
async (fastify, options) => {
const { name = 'metrics', clearRegisterOnInit = false } = options;

const promClient = options.promClient ?? client;

if (clearRegisterOnInit) {
client.register.clear();
promClient.register.clear();
}

const fm = new FastifyMetrics({ client, fastify, options });
const fm = new FastifyMetrics({ client: promClient, fastify, options });
fastify.decorate<IFastifyMetrics>(name, fm);
},
{
Expand Down
7 changes: 7 additions & 0 deletions src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,13 @@ export interface IRouteMetricsConfig {
* @public
*/
export interface IMetricsPluginOptions {
/**
* PromClient instance to override default internal promClient
*
* @defaultValue promClient
*/
promClient: typeof client | null;

/**
* Endpoint to expose metrics in prometheus format. `null` - disables metrics
* exposure
Expand Down

0 comments on commit aa873d8

Please sign in to comment.