diff --git a/README.md b/README.md index 356b836..44cb9b0 100644 --- a/README.md +++ b/README.md @@ -140,7 +140,8 @@ See for details [docs](docs/api/fastify-metrics.imetricspluginoptions.md) | Property | Type | Default Value | | ------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | --------------------------------------- | -| [enabled?](./docs/fastify-metrics.iroutemetricsconfig.enabled.md) | boolean | `true` | +| [enabled?](./docs/fastify-metrics.iroutemetricsconfig.enabled.md) | boolean \| { histogram: boolean, summary: boolean } | `true` | +| [enableSummaries?](./docs/fastify-metrics.iroutemetricsconfig.enablesummaries.md) | boolean | `true` | | [groupStatusCodes?](./docs/fastify-metrics.iroutemetricsconfig.groupstatuscodes.md) | boolean | `false` | | [invalidRouteGroup?](./docs/fastify-metrics.iroutemetricsconfig.invalidroutegroup.md) | string | `'__unknown__'` | | [methodBlacklist?](./docs/fastify-metrics.iroutemetricsconfig.methodblacklist.md) | readonly string\[\] | `['HEAD','OPTIONS','TRACE','CONNECT',]` | @@ -149,6 +150,24 @@ See for details [docs](docs/api/fastify-metrics.imetricspluginoptions.md) | [customLabels?](./fastify-metrics.iroutemetricsconfig.customlabels.md) | Record<string, string \| ((request: FastifyRequest, reply: FastifyReply) => string)> | `undefined` | | [routeBlacklist?](./docs/fastify-metrics.iroutemetricsconfig.routeblacklist.md) | readonly string\[\] | `[]` | +#### Route metrics enabled + +The `enabled` configuration option can be either a boolean which enables/disables generation of both histograms and summaries, or it can be set to an object that allows you to pick individually whether you want histograms or summaries to be generated, for example: + +``` +{ + ... + routeMetrics: { + enabled: { + histogram: true, + summary: false + } + } +} +``` + +would result in the library only generating histograms. + ##### Route metrics overrides You may override default metrics settings. You may provide overrides for two metrics tracking http request durations: `histogram` and `summary`. @@ -205,7 +224,7 @@ await app.register(metricsPlugin, { ### HTTP routes metrics in Prometheus -The following table shows what metrics will be available in Prometheus. Note suffixes like `_bucket`, `_sum`, `_count` are added automatically. +The following table shows what metrics will be available in Prometheus (subject to the `enabled` configuration option). Note suffixes like `_bucket`, `_sum`, `_count` are added automatically. | metric | labels | description | | -------------------------------------- | -------------------------------- | ----------------------------- | diff --git a/src/__tests__/route-metrics.spec.ts b/src/__tests__/route-metrics.spec.ts index 73787f7..38b0508 100644 --- a/src/__tests__/route-metrics.spec.ts +++ b/src/__tests__/route-metrics.spec.ts @@ -626,4 +626,62 @@ describe('route metrics', () => { ); }); }); + + describe(`{ routeMetrics: { enable: { summary: false } } }`, () => { + let app = fastify(); + + afterEach(async () => { + await app.close(); + }); + + beforeEach(async () => { + app = fastify(); + + await app.register(fastifyPlugin, { + endpoint: '/metrics', + routeMetrics: { + enabled: { + summary: false, + }, + customLabels: { + url: (request: FastifyRequest) => request.url, + }, + }, + }); + app.get('*', async (_request, reply) => { + await reply.send('foo'); + }); + await app.ready(); + }); + + test('summaries are not collected', async () => { + await expect( + app.inject({ + method: 'GET', + url: '/test', + }) + ).resolves.toBeDefined(); + + const metrics = await app.inject({ + method: 'GET', + url: '/metrics', + }); + + expect(typeof metrics.payload).toBe('string'); + + const lines = metrics.payload.split('\n'); + + expect(lines).toEqual( + expect.arrayContaining([ + 'http_request_duration_seconds_count{method="GET",route="*",status_code="200",url="/test"} 1', + ]) + ); + + expect(lines).toEqual( + expect.not.arrayContaining([ + 'http_request_summary_seconds_count{method="GET",route="*",status_code="200",url="/test"} 1', + ]) + ); + }); + }); }); diff --git a/src/fastify-metrics.ts b/src/fastify-metrics.ts index b3d1dc2..51f0d73 100644 --- a/src/fastify-metrics.ts +++ b/src/fastify-metrics.ts @@ -352,8 +352,22 @@ export class FastifyMetrics implements IFastifyMetrics { [this.routeMetrics.labelNames.status]: statusCode, ...this.collectCustomLabels(request, reply), }; - metrics.sum(labels); - metrics.hist(labels); + + if (this.options.routeMetrics.enabled instanceof Object) { + if (!(this.options.routeMetrics.enabled.summary === false)) { + metrics.sum(labels); + } + if (!(this.options.routeMetrics.enabled.histogram === false)) { + metrics.hist(labels); + } + done(); + return; + } + + if (!(this.options.routeMetrics.enabled === false)) { + metrics.sum(labels); + metrics.hist(labels); + } done(); }); diff --git a/src/types.ts b/src/types.ts index 2a8fbf1..44f101b 100644 --- a/src/types.ts +++ b/src/types.ts @@ -155,12 +155,24 @@ export interface IRouteMetricsOverrides { * @public */ export interface IRouteMetricsConfig { - /** - * Enables collection of fastify routes metrics response time. - * - * @defaultValue `false` - */ - enabled?: boolean; + enabled?: + | boolean + | { + /** + * Enables collection of fastify routes metrics response time via + * histogram. + * + * @defaultValue `true` + */ + histogram?: boolean; + /** + * Enables collection of fastify routes metrics response time via + * summary. + * + * @defaultValue `true` + */ + summary?: boolean; + }; /** * Collect metrics only for registered routes. If `false`, then metrics for