mirror of
https://github.com/Unleash/unleash.git
synced 2024-10-23 20:07:40 +02:00
fc455811f8
Adds a new way of handling usage metrics where we push it directly to the database and performs aggregation on the fly. All metrics are aggregated in to buckets of hours. We will for now store metrics for the 48 hours with the following dimensions: - featureName - projectName - envrionment - yes (the actual count) - no (the actual count)
232 lines
6.3 KiB
TypeScript
232 lines
6.3 KiB
TypeScript
import dbInit, { ITestDb } from '../../helpers/database-init';
|
|
import { setupAppWithCustomConfig } from '../../helpers/test-helper';
|
|
import getLogger from '../../../fixtures/no-logger';
|
|
import { IClientMetricsEnv } from '../../../../lib/types/stores/client-metrics-store-v2';
|
|
|
|
let app;
|
|
let db: ITestDb;
|
|
|
|
beforeAll(async () => {
|
|
db = await dbInit('client_metrics_serial', getLogger);
|
|
app = await setupAppWithCustomConfig(db.stores, {
|
|
experimental: { metricsV2: { enabled: true } },
|
|
});
|
|
});
|
|
|
|
afterAll(async () => {
|
|
if (db) {
|
|
await db.destroy();
|
|
}
|
|
});
|
|
|
|
afterEach(async () => {
|
|
await db.reset();
|
|
await db.stores.clientMetricsStoreV2.deleteAll();
|
|
});
|
|
|
|
test('should return raw metrics, aggregated on key', async () => {
|
|
const date = new Date();
|
|
const metrics: IClientMetricsEnv[] = [
|
|
{
|
|
featureName: 'demo',
|
|
appName: 'web',
|
|
environment: 'default',
|
|
timestamp: date,
|
|
yes: 2,
|
|
no: 2,
|
|
},
|
|
{
|
|
featureName: 't2',
|
|
appName: 'web',
|
|
environment: 'default',
|
|
timestamp: date,
|
|
yes: 5,
|
|
no: 5,
|
|
},
|
|
{
|
|
featureName: 't2',
|
|
appName: 'web',
|
|
environment: 'default',
|
|
timestamp: date,
|
|
yes: 2,
|
|
no: 99,
|
|
},
|
|
{
|
|
featureName: 'demo',
|
|
appName: 'web',
|
|
environment: 'default',
|
|
timestamp: date,
|
|
yes: 3,
|
|
no: 2,
|
|
},
|
|
{
|
|
featureName: 'demo',
|
|
appName: 'web',
|
|
environment: 'test',
|
|
timestamp: date,
|
|
yes: 1,
|
|
no: 3,
|
|
},
|
|
];
|
|
|
|
await db.stores.clientMetricsStoreV2.batchInsertMetrics(metrics);
|
|
|
|
const { body: demo } = await app.request
|
|
.get('/api/admin/client-metrics/features/demo/raw')
|
|
.expect('Content-Type', /json/)
|
|
.expect(200);
|
|
const { body: t2 } = await app.request
|
|
.get('/api/admin/client-metrics/features/t2/raw')
|
|
.expect('Content-Type', /json/)
|
|
.expect(200);
|
|
|
|
expect(demo.data).toHaveLength(2);
|
|
expect(demo.data[0].environment).toBe('default');
|
|
expect(demo.data[0].yes).toBe(5);
|
|
expect(demo.data[0].no).toBe(4);
|
|
expect(demo.data[1].environment).toBe('test');
|
|
expect(demo.data[1].yes).toBe(1);
|
|
expect(demo.data[1].no).toBe(3);
|
|
|
|
expect(t2.data).toHaveLength(1);
|
|
expect(t2.data[0].environment).toBe('default');
|
|
expect(t2.data[0].yes).toBe(7);
|
|
expect(t2.data[0].no).toBe(104);
|
|
});
|
|
|
|
test('should return toggle summary', async () => {
|
|
const date = new Date();
|
|
const metrics: IClientMetricsEnv[] = [
|
|
{
|
|
featureName: 'demo',
|
|
appName: 'web',
|
|
environment: 'default',
|
|
timestamp: date,
|
|
yes: 2,
|
|
no: 2,
|
|
},
|
|
{
|
|
featureName: 't2',
|
|
appName: 'web',
|
|
environment: 'default',
|
|
timestamp: date,
|
|
yes: 5,
|
|
no: 5,
|
|
},
|
|
{
|
|
featureName: 't2',
|
|
appName: 'web',
|
|
environment: 'default',
|
|
timestamp: date,
|
|
yes: 2,
|
|
no: 99,
|
|
},
|
|
{
|
|
featureName: 'demo',
|
|
appName: 'web',
|
|
environment: 'default',
|
|
timestamp: date,
|
|
yes: 3,
|
|
no: 2,
|
|
},
|
|
{
|
|
featureName: 'demo',
|
|
appName: 'web',
|
|
environment: 'test',
|
|
timestamp: date,
|
|
yes: 1,
|
|
no: 3,
|
|
},
|
|
{
|
|
featureName: 'demo',
|
|
appName: 'backend-api',
|
|
environment: 'test',
|
|
timestamp: date,
|
|
yes: 1,
|
|
no: 3,
|
|
},
|
|
];
|
|
|
|
await db.stores.clientMetricsStoreV2.batchInsertMetrics(metrics);
|
|
|
|
const { body: demo } = await app.request
|
|
.get('/api/admin/client-metrics/features/demo')
|
|
.expect('Content-Type', /json/)
|
|
.expect(200);
|
|
|
|
expect(demo.featureName).toBe('demo');
|
|
expect(demo.lastHourUsage).toHaveLength(2);
|
|
expect(demo.lastHourUsage[0].environment).toBe('default');
|
|
expect(demo.lastHourUsage[0].yes).toBe(5);
|
|
expect(demo.lastHourUsage[0].no).toBe(4);
|
|
expect(demo.lastHourUsage[1].environment).toBe('test');
|
|
expect(demo.lastHourUsage[1].yes).toBe(2);
|
|
expect(demo.lastHourUsage[1].no).toBe(6);
|
|
expect(demo.seenApplications).toStrictEqual(['backend-api', 'web']);
|
|
});
|
|
|
|
test('should only include last hour of metrics return toggle summary', async () => {
|
|
const date = new Date();
|
|
const dateHoneHourAgo = new Date();
|
|
dateHoneHourAgo.setHours(-1);
|
|
const metrics: IClientMetricsEnv[] = [
|
|
{
|
|
featureName: 'demo',
|
|
appName: 'web',
|
|
environment: 'default',
|
|
timestamp: date,
|
|
yes: 2,
|
|
no: 2,
|
|
},
|
|
{
|
|
featureName: 'demo',
|
|
appName: 'web',
|
|
environment: 'default',
|
|
timestamp: date,
|
|
yes: 3,
|
|
no: 2,
|
|
},
|
|
{
|
|
featureName: 'demo',
|
|
appName: 'web',
|
|
environment: 'test',
|
|
timestamp: date,
|
|
yes: 1,
|
|
no: 3,
|
|
},
|
|
{
|
|
featureName: 'demo',
|
|
appName: 'backend-api',
|
|
environment: 'test',
|
|
timestamp: date,
|
|
yes: 1,
|
|
no: 3,
|
|
},
|
|
{
|
|
featureName: 'demo',
|
|
appName: 'backend-api',
|
|
environment: 'test',
|
|
timestamp: dateHoneHourAgo,
|
|
yes: 55,
|
|
no: 55,
|
|
},
|
|
];
|
|
|
|
await db.stores.clientMetricsStoreV2.batchInsertMetrics(metrics);
|
|
|
|
const { body: demo } = await app.request
|
|
.get('/api/admin/client-metrics/features/demo')
|
|
.expect('Content-Type', /json/)
|
|
.expect(200);
|
|
|
|
expect(demo.featureName).toBe('demo');
|
|
expect(demo.lastHourUsage).toHaveLength(2);
|
|
expect(demo.lastHourUsage[0].environment).toBe('default');
|
|
expect(demo.lastHourUsage[0].yes).toBe(5);
|
|
expect(demo.lastHourUsage[0].no).toBe(4);
|
|
expect(demo.lastHourUsage[1].environment).toBe('test');
|
|
expect(demo.lastHourUsage[1].yes).toBe(2);
|
|
expect(demo.lastHourUsage[1].no).toBe(6);
|
|
expect(demo.seenApplications).toStrictEqual(['backend-api', 'web']);
|
|
});
|