mirror of
https://github.com/Unleash/unleash.git
synced 2025-03-04 00:18:40 +01:00
feat: Schedule daily metrics deletion (#5807)
This commit is contained in:
parent
920e80c17e
commit
2c0c4e70ea
@ -17,6 +17,11 @@ afterAll(async () => {
|
|||||||
await db.destroy();
|
await db.destroy();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
await clientMetricsStore.clearMetrics(0);
|
||||||
|
await clientMetricsStore.clearDailyMetrics(0);
|
||||||
|
});
|
||||||
|
|
||||||
test('aggregate daily metrics from previous day', async () => {
|
test('aggregate daily metrics from previous day', async () => {
|
||||||
const yesterday = subDays(new Date(), 1);
|
const yesterday = subDays(new Date(), 1);
|
||||||
await clientMetricsStore.batchInsertMetrics([
|
await clientMetricsStore.batchInsertMetrics([
|
||||||
@ -84,3 +89,46 @@ test('aggregate daily metrics from previous day', async () => {
|
|||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('clear daily metrics', async () => {
|
||||||
|
const yesterday = subDays(new Date(), 1);
|
||||||
|
const twoDaysAgo = subDays(new Date(), 2);
|
||||||
|
await clientMetricsStore.batchInsertMetrics([
|
||||||
|
{
|
||||||
|
appName: 'irrelevant',
|
||||||
|
featureName: 'irrelevant',
|
||||||
|
environment: 'irrelevant',
|
||||||
|
timestamp: yesterday,
|
||||||
|
no: 0,
|
||||||
|
yes: 1,
|
||||||
|
variants: {
|
||||||
|
a: 0,
|
||||||
|
b: 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
appName: 'irrelevant',
|
||||||
|
featureName: 'irrelevant',
|
||||||
|
environment: 'irrelevant',
|
||||||
|
timestamp: twoDaysAgo,
|
||||||
|
no: 0,
|
||||||
|
yes: 2,
|
||||||
|
variants: {
|
||||||
|
a: 1,
|
||||||
|
b: 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
await clientMetricsStore.aggregateDailyMetrics();
|
||||||
|
|
||||||
|
await clientMetricsStore.clearDailyMetrics(2);
|
||||||
|
|
||||||
|
const results = await db.rawDatabase
|
||||||
|
.table('client_metrics_env_daily')
|
||||||
|
.select('*');
|
||||||
|
expect(results.length).toBe(1);
|
||||||
|
const variantResults = await db.rawDatabase
|
||||||
|
.table('client_metrics_env_variants_daily')
|
||||||
|
.select('*');
|
||||||
|
expect(variantResults.length).toBe(2);
|
||||||
|
});
|
||||||
|
@ -256,6 +256,12 @@ export class ClientMetricsStoreV2 implements IClientMetricsStoreV2 {
|
|||||||
.del();
|
.del();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async clearDailyMetrics(daysAgo: number): Promise<void> {
|
||||||
|
return this.db(DAILY_TABLE)
|
||||||
|
.whereRaw(`date <= CURRENT_DATE - INTERVAL '${daysAgo} days'`)
|
||||||
|
.del();
|
||||||
|
}
|
||||||
|
|
||||||
// aggregates all hourly metrics from a previous day into daily metrics
|
// aggregates all hourly metrics from a previous day into daily metrics
|
||||||
async aggregateDailyMetrics(): Promise<void> {
|
async aggregateDailyMetrics(): Promise<void> {
|
||||||
const rawQuery: string = `
|
const rawQuery: string = `
|
||||||
|
@ -145,6 +145,14 @@ export const scheduleServices = async (
|
|||||||
'clearMetrics',
|
'clearMetrics',
|
||||||
);
|
);
|
||||||
|
|
||||||
|
schedulerService.schedule(
|
||||||
|
() => {
|
||||||
|
clientMetricsServiceV2.clearDailyMetrics(92).catch(console.error);
|
||||||
|
},
|
||||||
|
hoursToMilliseconds(24),
|
||||||
|
'clearDailyMetrics',
|
||||||
|
);
|
||||||
|
|
||||||
schedulerService.schedule(
|
schedulerService.schedule(
|
||||||
() => {
|
() => {
|
||||||
clientMetricsServiceV2.aggregateDailyMetrics().catch(console.error);
|
clientMetricsServiceV2.aggregateDailyMetrics().catch(console.error);
|
||||||
|
@ -49,6 +49,12 @@ export default class ClientMetricsServiceV2 {
|
|||||||
return this.clientMetricsStoreV2.clearMetrics(hoursAgo);
|
return this.clientMetricsStoreV2.clearMetrics(hoursAgo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async clearDailyMetrics(daysAgo: number) {
|
||||||
|
if (this.flagResolver.isEnabled('extendedUsageMetrics')) {
|
||||||
|
return this.clientMetricsStoreV2.clearDailyMetrics(daysAgo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async aggregateDailyMetrics() {
|
async aggregateDailyMetrics() {
|
||||||
if (this.flagResolver.isEnabled('extendedUsageMetrics')) {
|
if (this.flagResolver.isEnabled('extendedUsageMetrics')) {
|
||||||
await this.clientMetricsStoreV2.aggregateDailyMetrics();
|
await this.clientMetricsStoreV2.aggregateDailyMetrics();
|
||||||
|
@ -34,5 +34,6 @@ export interface IClientMetricsStoreV2
|
|||||||
hoursBack?: number,
|
hoursBack?: number,
|
||||||
): Promise<string[]>;
|
): Promise<string[]>;
|
||||||
clearMetrics(hoursAgo: number): Promise<void>;
|
clearMetrics(hoursAgo: number): Promise<void>;
|
||||||
|
clearDailyMetrics(daysAgo: number): Promise<void>;
|
||||||
aggregateDailyMetrics(): Promise<void>;
|
aggregateDailyMetrics(): Promise<void>;
|
||||||
}
|
}
|
||||||
|
@ -26,6 +26,9 @@ export default class FakeClientMetricsStoreV2
|
|||||||
clearMetrics(hoursBack: number): Promise<void> {
|
clearMetrics(hoursBack: number): Promise<void> {
|
||||||
return Promise.resolve();
|
return Promise.resolve();
|
||||||
}
|
}
|
||||||
|
clearDailyMetrics(daysBack: number): Promise<void> {
|
||||||
|
return Promise.resolve();
|
||||||
|
}
|
||||||
aggregateDailyMetrics(): Promise<void> {
|
aggregateDailyMetrics(): Promise<void> {
|
||||||
return Promise.resolve();
|
return Promise.resolve();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user