From 02876a1c0881113cce43f9168d7055f377ae5bdd Mon Sep 17 00:00:00 2001 From: Mateusz Kwasniewski Date: Tue, 17 Jun 2025 14:17:46 +0200 Subject: [PATCH] feat: expose impact metrics (#10151) --- src/lib/features/metrics/impact/impact-register.ts | 5 +++++ src/lib/routes/backstage.ts | 11 +++++++++++ src/lib/types/experimental.ts | 1 + 3 files changed, 17 insertions(+) create mode 100644 src/lib/features/metrics/impact/impact-register.ts diff --git a/src/lib/features/metrics/impact/impact-register.ts b/src/lib/features/metrics/impact/impact-register.ts new file mode 100644 index 0000000000..50a97d9174 --- /dev/null +++ b/src/lib/features/metrics/impact/impact-register.ts @@ -0,0 +1,5 @@ +import { Registry } from 'prom-client'; + +// Deliberately keep it separate from the global instance metrics register +// It is a singleton that everyone participating in the impact metrics can import +export const impactRegister = new Registry(); diff --git a/src/lib/routes/backstage.ts b/src/lib/routes/backstage.ts index 8ab045879e..ec6260f436 100644 --- a/src/lib/routes/backstage.ts +++ b/src/lib/routes/backstage.ts @@ -2,6 +2,7 @@ import { writeHeapSnapshot } from 'v8'; import { tmpdir } from 'os'; import { join } from 'path'; import { register as prometheusRegister } from 'prom-client'; +import { impactRegister } from '../features/metrics/impact/impact-register.js'; import Controller from './controller.js'; import type { IUnleashConfig } from '../types/option.js'; import type { IFlagResolver } from '../types/index.js'; @@ -41,6 +42,16 @@ class BackstageController extends Controller { res.end(metricsOutput); }); + + if (this.flagResolver.isEnabled('impactMetrics')) { + this.get('/impact/metrics', async (req, res) => { + res.set('Content-Type', impactRegister.contentType); + + const metricsOutput = await impactRegister.metrics(); + + res.end(metricsOutput); + }); + } } if (config.server.enableHeapSnapshotEnpoint) { diff --git a/src/lib/types/experimental.ts b/src/lib/types/experimental.ts index 9c5f89a0eb..41111f6c4a 100644 --- a/src/lib/types/experimental.ts +++ b/src/lib/types/experimental.ts @@ -60,6 +60,7 @@ export type IFlagKey = | 'lastSeenBulkQuery' | 'lifecycleMetrics' | 'customMetrics' + | 'impactMetrics' | 'createFlagDialogCache' | 'improvedJsonDiff' | 'changeRequestApproverEmails';