From 3f730bb7f3acacf5f3f636944880ead94352fc00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivar=20Conradi=20=C3=98sthus?= Date: Mon, 17 Feb 2025 09:01:19 +0100 Subject: [PATCH] fix: add a metric to track client registrations (#9314) Adding a counter to track every time a client registers with Unleash. --- src/lib/features/metrics/instance/instance-service.ts | 9 ++++++++- src/lib/metric-events.ts | 2 ++ src/lib/metrics.ts | 8 ++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/lib/features/metrics/instance/instance-service.ts b/src/lib/features/metrics/instance/instance-service.ts index ace2adca8afe..c2ec17d3eac1 100644 --- a/src/lib/features/metrics/instance/instance-service.ts +++ b/src/lib/features/metrics/instance/instance-service.ts @@ -1,3 +1,4 @@ +import type EventEmitter from 'events'; import { APPLICATION_CREATED, CLIENT_REGISTER } from '../../../types/events'; import type { IApplication, IApplicationOverview } from './models'; import type { IUnleashStores } from '../../../types/stores'; @@ -24,6 +25,7 @@ import { ALL_PROJECTS, parseStrictSemVer } from '../../../util'; import type { Logger } from '../../../logger'; import { findOutdatedSDKs, isOutdatedSdk } from './findOutdatedSdks'; import type { OutdatedSdksSchema } from '../../../openapi/spec/outdated-sdks-schema'; +import { CLIENT_REGISTERED } from '../../../metric-events'; export default class ClientInstanceService { apps = {}; @@ -48,6 +50,8 @@ export default class ClientInstanceService { private flagResolver: IFlagResolver; + private eventBus: EventEmitter; + constructor( { clientMetricsStoreV2, @@ -68,7 +72,8 @@ export default class ClientInstanceService { { getLogger, flagResolver, - }: Pick, + eventBus, + }: Pick, privateProjectChecker: IPrivateProjectChecker, ) { this.clientMetricsStoreV2 = clientMetricsStoreV2; @@ -77,6 +82,7 @@ export default class ClientInstanceService { this.clientApplicationsStore = clientApplicationsStore; this.clientInstanceStore = clientInstanceStore; this.eventStore = eventStore; + this.eventBus = eventBus; this.privateProjectChecker = privateProjectChecker; this.flagResolver = flagResolver; this.logger = getLogger( @@ -105,6 +111,7 @@ export default class ClientInstanceService { value.clientIp = clientIp; value.createdBy = SYSTEM_USER.username!; this.seenClients[this.clientKey(value)] = value; + this.eventBus.emit(CLIENT_REGISTERED, value); if (value.sdkVersion && value.sdkVersion.indexOf(':') > -1) { const [sdkName, sdkVersion] = value.sdkVersion.split(':'); diff --git a/src/lib/metric-events.ts b/src/lib/metric-events.ts index 29557f9b84de..cdad1a8af44b 100644 --- a/src/lib/metric-events.ts +++ b/src/lib/metric-events.ts @@ -19,6 +19,7 @@ const CLIENT_METRICS_NAMEPREFIX = 'client-api-nameprefix'; const CLIENT_METRICS_TAGS = 'client-api-tags'; const CLIENT_FEATURES_MEMORY = 'client_features_memory'; const CLIENT_DELTA_MEMORY = 'client_delta_memory'; +const CLIENT_REGISTERED = 'client_registered'; type MetricEvent = | typeof REQUEST_TIME @@ -91,6 +92,7 @@ export { CLIENT_METRICS_TAGS, CLIENT_FEATURES_MEMORY, CLIENT_DELTA_MEMORY, + CLIENT_REGISTERED, type MetricEvent, type MetricEventPayload, emitMetricEvent, diff --git a/src/lib/metrics.ts b/src/lib/metrics.ts index 558a81a89fef..f636226c979a 100644 --- a/src/lib/metrics.ts +++ b/src/lib/metrics.ts @@ -169,6 +169,11 @@ export function registerPrometheusMetrics( help: 'Number of times a feature flag has been used', labelNames: ['toggle', 'active', 'appName'], }); + const clientRegistrationTotal = createCounter({ + name: 'client_registration_total', + help: 'Number of times a an application have registered', + labelNames: ['appName', 'environment'], + }); dbMetrics.registerGaugeDbMetric({ name: 'feature_toggles_total', @@ -807,6 +812,9 @@ export function registerPrometheusMetrics( clientDeltaMemory.reset(); clientDeltaMemory.set(event.memory); }); + eventBus.on(events.CLIENT_REGISTERED, ({ appName, environment }) => { + clientRegistrationTotal.labels({ appName, environment }).inc(); + }); events.onMetricEvent( eventBus,