1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-02-23 00:22:19 +01:00

task: add sdk version metric (#1828)

* task: add sdk version metric
This commit is contained in:
Christopher Kolstad 2022-07-22 11:00:22 +02:00 committed by GitHub
parent 22014f3c62
commit 5bacc7ba36
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 60 additions and 7 deletions

View File

@ -2,7 +2,11 @@ import { register } from 'prom-client';
import EventEmitter from 'events';
import { createTestConfig } from '../test/config/test-config';
import { REQUEST_TIME, DB_TIME } from './metric-events';
import { CLIENT_METRICS, FEATURE_UPDATED } from './types/events';
import {
CLIENT_METRICS,
CLIENT_REGISTER,
FEATURE_UPDATED,
} from './types/events';
import { createMetricsMonitor } from './metrics';
import createStores from '../test/fixtures/store';
@ -32,7 +36,6 @@ beforeAll(() => {
// @ts-ignore - We don't want a full knex implementation for our tests, it's enough that it actually yields the numbers we want.
monitor.startMonitoring(config, stores, '4.0.0', eventBus, db);
});
afterAll(() => {
monitor.stopMonitoring();
});
@ -108,3 +111,37 @@ test('Should collect metrics for database', async () => {
expect(metrics).toMatch(/db_pool_pending_creates/);
expect(metrics).toMatch(/db_pool_pending_acquires/);
});
test('Should collect metrics for client sdk versions', async () => {
eventBus.emit(CLIENT_REGISTER, { sdkVersion: 'unleash-client-node:3.2.5' });
eventBus.emit(CLIENT_REGISTER, { sdkVersion: 'unleash-client-node:3.2.5' });
eventBus.emit(CLIENT_REGISTER, { sdkVersion: 'unleash-client-node:3.2.5' });
eventBus.emit(CLIENT_REGISTER, { sdkVersion: 'unleash-client-java:5.0.0' });
eventBus.emit(CLIENT_REGISTER, { sdkVersion: 'unleash-client-java:5.0.0' });
eventBus.emit(CLIENT_REGISTER, { sdkVersion: 'unleash-client-java:5.0.0' });
const metrics = await prometheusRegister.getSingleMetricAsString(
'client_sdk_versions',
);
expect(metrics).toMatch(
/client_sdk_versions\{sdk_name="unleash-client-node",sdk_version="3\.2\.5"} 3/,
);
expect(metrics).toMatch(
/client_sdk_versions\{sdk_name="unleash-client-java",sdk_version="5\.0\.0"} 3/,
);
eventBus.emit(CLIENT_REGISTER, { sdkVersion: 'unleash-client-node:3.2.5' });
const newmetrics = await prometheusRegister.getSingleMetricAsString(
'client_sdk_versions',
);
expect(newmetrics).toMatch(
/client_sdk_versions\{sdk_name="unleash-client-node",sdk_version="3\.2\.5"} 4/,
);
});
test('Should not collect client sdk version if sdkVersion is of wrong format or non-existent', async () => {
eventBus.emit(CLIENT_REGISTER, { sdkVersion: 'unleash-client-rust' });
eventBus.emit(CLIENT_REGISTER, {});
const metrics = await prometheusRegister.getSingleMetricAsString(
'client_sdk_versions',
);
expect(metrics).not.toMatch(/unleash-client-rust/);
});

View File

@ -12,6 +12,7 @@ import {
FEATURE_STRATEGY_UPDATE,
FEATURE_UPDATED,
CLIENT_METRICS,
CLIENT_REGISTER,
} from './types/events';
import { IUnleashConfig } from './types/option';
import { IUnleashStores } from './types/stores';
@ -80,6 +81,12 @@ export default class MetricsMonitor {
help: 'Number of projects',
});
const clientSdkVersionUsage = new client.Counter({
name: 'client_sdk_versions',
help: 'Which sdk versions are being used',
labelNames: ['sdk_name', 'sdk_version'],
});
async function collectStaticCounters() {
let togglesCount: number = 0;
let usersCount: number;
@ -157,6 +164,12 @@ export default class MetricsMonitor {
.inc(entry[1].no);
}
});
eventBus.on(CLIENT_REGISTER, (m) => {
if (m.sdkVersion && m.sdkVersion.indexOf(':') > -1) {
const [sdkName, sdkVersion] = m.sdkVersion.split(':');
clientSdkVersionUsage.labels(sdkName, sdkVersion).inc();
}
});
this.configureDbMetrics(db, eventBus);
}

View File

@ -2,6 +2,7 @@ import ClientInstanceService from './instance-service';
import getLogger from '../../../test/fixtures/no-logger';
import { IClientApp } from '../../types/model';
import { secondsToMilliseconds } from 'date-fns';
import FakeEventStore from '../../../test/fixtures/fake-event-store';
/**
* A utility to wait for any pending promises in the test subject code.
@ -54,7 +55,7 @@ test('Multiple registrations of same appname and instanceid within same time per
featureToggleStore: null,
clientApplicationsStore,
clientInstanceStore,
eventStore: null,
eventStore: new FakeEventStore(),
},
{ getLogger },
);
@ -104,7 +105,7 @@ test('Multiple unique clients causes multiple registrations', async () => {
featureToggleStore: null,
clientApplicationsStore,
clientInstanceStore,
eventStore: null,
eventStore: new FakeEventStore(),
},
{ getLogger },
);
@ -157,7 +158,7 @@ test('Same client registered outside of dedup interval will be registered twice'
featureToggleStore: null,
clientApplicationsStore,
clientInstanceStore,
eventStore: null,
eventStore: new FakeEventStore(),
},
{ getLogger },
bulkInterval,
@ -210,7 +211,7 @@ test('No registrations during a time period will not call stores', async () => {
featureToggleStore: null,
clientApplicationsStore,
clientInstanceStore,
eventStore: null,
eventStore: new FakeEventStore(),
},
{ getLogger },
);

View File

@ -1,5 +1,5 @@
import { applicationSchema } from './schema';
import { APPLICATION_CREATED } from '../../types/events';
import { APPLICATION_CREATED, CLIENT_REGISTER } from '../../types/events';
import { IApplication } from './models';
import { IUnleashStores } from '../../types/stores';
import { IUnleashConfig } from '../../types/option';
@ -111,6 +111,7 @@ export default class ClientInstanceService {
value.clientIp = clientIp;
value.createdBy = clientIp;
this.seenClients[this.clientKey(value)] = value;
this.eventStore.emit(CLIENT_REGISTER, value);
}
async announceUnannounced(): Promise<void> {

View File

@ -74,6 +74,7 @@ export const SETTING_UPDATED = 'setting-updated';
export const SETTING_DELETED = 'setting-deleted';
export const CLIENT_METRICS = 'client-metrics';
export const CLIENT_REGISTER = 'client-register';
export interface IBaseEvent {
type: string;