diff --git a/README.md b/README.md index 356b836..b17d803 100644 --- a/README.md +++ b/README.md @@ -141,6 +141,7 @@ See for details [docs](docs/api/fastify-metrics.imetricspluginoptions.md) | Property | Type | Default Value | | ------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | --------------------------------------- | | [enabled?](./docs/fastify-metrics.iroutemetricsconfig.enabled.md) | 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',]` | @@ -205,7 +206,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. Note suffixes like `_bucket`, `_sum`, `_count` are added automatically and `summary` type metrics will only be available if `{ routeMetrics: { enableSummaries: true } }` | metric | labels | description | | -------------------------------------- | -------------------------------- | ----------------------------- | diff --git a/package.json b/package.json index 2cd5a51..d21b536 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "fastify-metrics", - "version": "10.3.3", + "version": "10.4.0", "description": "Prometheus metrics exporter for Fastify", "keywords": [ "fastify-plugin", diff --git a/src/__tests__/route-metrics.spec.ts b/src/__tests__/route-metrics.spec.ts index 73787f7..34fdc09 100644 --- a/src/__tests__/route-metrics.spec.ts +++ b/src/__tests__/route-metrics.spec.ts @@ -626,4 +626,61 @@ describe('route metrics', () => { ); }); }); + + describe(`{ routeMetrics: { enableSummaries: false } }`, () => { + let app = fastify(); + + afterEach(async () => { + await app.close(); + }); + + beforeEach(async () => { + app = fastify(); + + await app.register(fastifyPlugin, { + endpoint: '/metrics', + routeMetrics: { + enabled: true, + enableSummaries: 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..e36a5cb 100644 --- a/src/fastify-metrics.ts +++ b/src/fastify-metrics.ts @@ -42,6 +42,7 @@ export const DEFAULT_OPTIONS: IMetricsPluginOptions = { clearRegisterOnInit: false, routeMetrics: { enabled: true, + enableSummaries: true, }, defaultMetrics: { enabled: true, @@ -352,7 +353,9 @@ export class FastifyMetrics implements IFastifyMetrics { [this.routeMetrics.labelNames.status]: statusCode, ...this.collectCustomLabels(request, reply), }; - metrics.sum(labels); + if (!(this.options.routeMetrics.enableSummaries === false)) { + metrics.sum(labels); + } metrics.hist(labels); done(); diff --git a/src/types.ts b/src/types.ts index 2a8fbf1..e41d1b2 100644 --- a/src/types.ts +++ b/src/types.ts @@ -158,10 +158,17 @@ export interface IRouteMetricsConfig { /** * Enables collection of fastify routes metrics response time. * - * @defaultValue `false` + * @defaultValue `true` */ enabled?: boolean; + /** + * Enables computation of summaries for response times. + * + * @defaultValue 'true' + */ + enableSummaries?: boolean; + /** * Collect metrics only for registered routes. If `false`, then metrics for * unknown routes `/unknown-unregistered-route` will be collected as well.