1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-05-31 01:16:01 +02:00

fix: add a metric to track client registrations (#9314)

Adding a counter to track every time a client registers with Unleash.
This commit is contained in:
Ivar Conradi Østhus 2025-02-17 09:01:19 +01:00 committed by GitHub
parent edd03d02dd
commit 3f730bb7f3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 18 additions and 1 deletions

View File

@ -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<IUnleashConfig, 'getLogger' | 'flagResolver'>,
eventBus,
}: Pick<IUnleashConfig, 'getLogger' | 'flagResolver' | 'eventBus'>,
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(':');

View File

@ -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,

View File

@ -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,