From 6ea33e3efacff1195d5c66c002d8bbc91f5e73c4 Mon Sep 17 00:00:00 2001 From: Alex Date: Sun, 20 Jun 2021 14:40:09 +0300 Subject: [PATCH] Configurable request and resolver duration histogram metrics (#335) --- services/src/modules/apollo-server-plugins/metrics.ts | 10 +++++++--- services/src/modules/config.ts | 10 ++++++++++ .../tests/e2e/basic/__snapshots__/metrics.spec.ts.snap | 3 --- services/tests/e2e/basic/metrics.spec.ts | 2 ++ services/tests/e2e/docker-compose.yml | 4 ++++ 5 files changed, 23 insertions(+), 6 deletions(-) diff --git a/services/src/modules/apollo-server-plugins/metrics.ts b/services/src/modules/apollo-server-plugins/metrics.ts index be256333..e07f8605 100644 --- a/services/src/modules/apollo-server-plugins/metrics.ts +++ b/services/src/modules/apollo-server-plugins/metrics.ts @@ -6,7 +6,11 @@ import { GraphQLRequestListenerValidationDidEnd, } from 'apollo-server-plugin-base'; import * as promClient from 'prom-client'; -import { knownApolloDirectives } from '../config'; +import { + knownApolloDirectives, + requestDurationPromHistogramBuckets, + resolverDurationPromHistogramBuckets, +} from '../config'; let requestDurationHistogram: promClient.Histogram | undefined; let resolverDurationHistogram: promClient.Histogram | undefined; @@ -18,14 +22,14 @@ export function initializeMetrics(pClient: typeof promClient) { name: 'graphql_request_duration_seconds', help: 'request duration in seconds', labelNames: ['status', 'operationName'], - buckets: [0.02, 0.1, 0.5, 2, 10], + buckets: requestDurationPromHistogramBuckets, }); resolverDurationHistogram = new pClient.Histogram({ name: 'graphql_resolver_duration_seconds', help: 'resolver duration in seconds', labelNames: ['parentType', 'fieldName', 'status'], - buckets: [0.02, 0.1, 0.5, 2, 10], + buckets: resolverDurationPromHistogramBuckets, }); requestParsingErrorCounter = new pClient.Counter({ diff --git a/services/src/modules/config.ts b/services/src/modules/config.ts index a9100bfa..36b79a2a 100644 --- a/services/src/modules/config.ts +++ b/services/src/modules/config.ts @@ -69,3 +69,13 @@ export const knownApolloDirectives = envVarExt .asSet(); export const corsConfiguration = envVar.get('CORS_CONFIGURATION').default({}).asJsonObject() as CorsConfiguration; + +export const requestDurationPromHistogramBuckets: number[] = envVarExt + .get('REQUEST_DURATION_PROM_HISTOGRAM_BUCKETS') + .default('[0.02, 0.1, 0.5, 2, 10]') + .asJsonArray(); + +export const resolverDurationPromHistogramBuckets: number[] = envVarExt + .get('RESOLVER_DURATION_PROM_HISTOGRAM_BUCKETS') + .default('[0.02, 0.1, 0.5, 2, 10]') + .asJsonArray(); diff --git a/services/tests/e2e/basic/__snapshots__/metrics.spec.ts.snap b/services/tests/e2e/basic/__snapshots__/metrics.spec.ts.snap index 94db5dea..742d684f 100644 --- a/services/tests/e2e/basic/__snapshots__/metrics.spec.ts.snap +++ b/services/tests/e2e/basic/__snapshots__/metrics.spec.ts.snap @@ -15,7 +15,6 @@ Array [ "0.1", "0.5", "2", - "10", "+Inf", ] `; @@ -25,8 +24,6 @@ Array [ "0.02", "0.1", "0.5", - "2", - "10", "+Inf", ] `; diff --git a/services/tests/e2e/basic/metrics.spec.ts b/services/tests/e2e/basic/metrics.spec.ts index 59611a8f..1036bed1 100644 --- a/services/tests/e2e/basic/metrics.spec.ts +++ b/services/tests/e2e/basic/metrics.spec.ts @@ -107,6 +107,7 @@ describe('Metrics', () => { ); const bucketRegex = /le="(.+)",parentType=/; const buckets = bucketMetrics.map(m => m.match(bucketRegex)?.[1]); + expect(buckets).toHaveLength(4); expect(buckets).toMatchSnapshot(); }); @@ -117,6 +118,7 @@ describe('Metrics', () => { ); const bucketRegex = /le="(.+)",operationName=/; const buckets = bucketMetrics.map(m => m.match(bucketRegex)?.[1]); + expect(buckets).toHaveLength(5); expect(buckets).toMatchSnapshot(); }); diff --git a/services/tests/e2e/docker-compose.yml b/services/tests/e2e/docker-compose.yml index 7b8001c6..28b67d3e 100644 --- a/services/tests/e2e/docker-compose.yml +++ b/services/tests/e2e/docker-compose.yml @@ -65,6 +65,10 @@ services: "publicPaths": ["/metrics", "/.well-known/apollo/server-health", "/graphql"] } } + REQUEST_DURATION_PROM_HISTOGRAM_BUCKETS: > + [0.02, 0.1, 0.5, 2] + RESOLVER_DURATION_PROM_HISTOGRAM_BUCKETS: > + [0.02, 0.1, 0.5] volumes: - ./config/plugins:/plugins:ro - ./config/scripts:/scripts:ro