mirror of
https://github.com/Unleash/unleash.git
synced 2025-02-23 00:22:19 +01:00
parent
22014f3c62
commit
5bacc7ba36
@ -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/);
|
||||
});
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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 },
|
||||
);
|
||||
|
@ -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> {
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user