Skip to content

Commit 3f730bb

Browse files
authored
fix: add a metric to track client registrations (#9314)
Adding a counter to track every time a client registers with Unleash.
1 parent edd03d0 commit 3f730bb

File tree

3 files changed

+18
-1
lines changed

3 files changed

+18
-1
lines changed

src/lib/features/metrics/instance/instance-service.ts

+8-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type EventEmitter from 'events';
12
import { APPLICATION_CREATED, CLIENT_REGISTER } from '../../../types/events';
23
import type { IApplication, IApplicationOverview } from './models';
34
import type { IUnleashStores } from '../../../types/stores';
@@ -24,6 +25,7 @@ import { ALL_PROJECTS, parseStrictSemVer } from '../../../util';
2425
import type { Logger } from '../../../logger';
2526
import { findOutdatedSDKs, isOutdatedSdk } from './findOutdatedSdks';
2627
import type { OutdatedSdksSchema } from '../../../openapi/spec/outdated-sdks-schema';
28+
import { CLIENT_REGISTERED } from '../../../metric-events';
2729

2830
export default class ClientInstanceService {
2931
apps = {};
@@ -48,6 +50,8 @@ export default class ClientInstanceService {
4850

4951
private flagResolver: IFlagResolver;
5052

53+
private eventBus: EventEmitter;
54+
5155
constructor(
5256
{
5357
clientMetricsStoreV2,
@@ -68,7 +72,8 @@ export default class ClientInstanceService {
6872
{
6973
getLogger,
7074
flagResolver,
71-
}: Pick<IUnleashConfig, 'getLogger' | 'flagResolver'>,
75+
eventBus,
76+
}: Pick<IUnleashConfig, 'getLogger' | 'flagResolver' | 'eventBus'>,
7277
privateProjectChecker: IPrivateProjectChecker,
7378
) {
7479
this.clientMetricsStoreV2 = clientMetricsStoreV2;
@@ -77,6 +82,7 @@ export default class ClientInstanceService {
7782
this.clientApplicationsStore = clientApplicationsStore;
7883
this.clientInstanceStore = clientInstanceStore;
7984
this.eventStore = eventStore;
85+
this.eventBus = eventBus;
8086
this.privateProjectChecker = privateProjectChecker;
8187
this.flagResolver = flagResolver;
8288
this.logger = getLogger(
@@ -105,6 +111,7 @@ export default class ClientInstanceService {
105111
value.clientIp = clientIp;
106112
value.createdBy = SYSTEM_USER.username!;
107113
this.seenClients[this.clientKey(value)] = value;
114+
this.eventBus.emit(CLIENT_REGISTERED, value);
108115

109116
if (value.sdkVersion && value.sdkVersion.indexOf(':') > -1) {
110117
const [sdkName, sdkVersion] = value.sdkVersion.split(':');

src/lib/metric-events.ts

+2
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ const CLIENT_METRICS_NAMEPREFIX = 'client-api-nameprefix';
1919
const CLIENT_METRICS_TAGS = 'client-api-tags';
2020
const CLIENT_FEATURES_MEMORY = 'client_features_memory';
2121
const CLIENT_DELTA_MEMORY = 'client_delta_memory';
22+
const CLIENT_REGISTERED = 'client_registered';
2223

2324
type MetricEvent =
2425
| typeof REQUEST_TIME
@@ -91,6 +92,7 @@ export {
9192
CLIENT_METRICS_TAGS,
9293
CLIENT_FEATURES_MEMORY,
9394
CLIENT_DELTA_MEMORY,
95+
CLIENT_REGISTERED,
9496
type MetricEvent,
9597
type MetricEventPayload,
9698
emitMetricEvent,

src/lib/metrics.ts

+8
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,11 @@ export function registerPrometheusMetrics(
169169
help: 'Number of times a feature flag has been used',
170170
labelNames: ['toggle', 'active', 'appName'],
171171
});
172+
const clientRegistrationTotal = createCounter({
173+
name: 'client_registration_total',
174+
help: 'Number of times a an application have registered',
175+
labelNames: ['appName', 'environment'],
176+
});
172177

173178
dbMetrics.registerGaugeDbMetric({
174179
name: 'feature_toggles_total',
@@ -807,6 +812,9 @@ export function registerPrometheusMetrics(
807812
clientDeltaMemory.reset();
808813
clientDeltaMemory.set(event.memory);
809814
});
815+
eventBus.on(events.CLIENT_REGISTERED, ({ appName, environment }) => {
816+
clientRegistrationTotal.labels({ appName, environment }).inc();
817+
});
810818

811819
events.onMetricEvent(
812820
eventBus,

0 commit comments

Comments
 (0)