1
0
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:
Mateusz Kwasniewski 2024-01-10 08:52:40 +01:00 committed by GitHub
parent 920e80c17e
commit 2c0c4e70ea
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 72 additions and 0 deletions

View File

@ -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);
});

View File

@ -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 = `

View File

@ -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);

View File

@ -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();

View File

@ -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>;
} }

View File

@ -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();
} }