1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-05-08 01:15:49 +02:00

refactor: move metrics service scheduling (#5129)

This commit is contained in:
Mateusz Kwasniewski 2023-10-23 16:28:19 +02:00 committed by GitHub
parent 8d8a975c6c
commit 8bc04c59f3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 21 additions and 40 deletions

View File

@ -51,8 +51,6 @@ export default class ClientInstanceStore implements IClientInstanceStore {
private metricTimer: Function; private metricTimer: Function;
private timer: Timeout;
constructor(db: Db, eventBus: EventEmitter, getLogger: LogProvider) { constructor(db: Db, eventBus: EventEmitter, getLogger: LogProvider) {
this.db = db; this.db = db;
this.eventBus = eventBus; this.eventBus = eventBus;
@ -197,7 +195,5 @@ export default class ClientInstanceStore implements IClientInstanceStore {
return this.db(TABLE).where('app_name', appName).del(); return this.db(TABLE).where('app_name', appName).del();
} }
destroy(): void { destroy(): void {}
clearInterval(this.timer);
}
} }

View File

@ -58,8 +58,6 @@ async function createApp(
} }
services.schedulerService.stop(); services.schedulerService.stop();
metricsMonitor.stopMonitoring(); metricsMonitor.stopMonitoring();
stores.clientInstanceStore.destroy();
services.clientMetricsServiceV2.destroy();
services.addonService.destroy(); services.addonService.destroy();
await db.destroy(); await db.destroy();
}; };

View File

@ -11,8 +11,6 @@ export type LastSeenInput = {
}; };
export class LastSeenService { export class LastSeenService {
private timers: NodeJS.Timeout[] = [];
private lastSeenToggles: Map<String, LastSeenInput> = new Map(); private lastSeenToggles: Map<String, LastSeenInput> = new Map();
private logger: Logger; private logger: Logger;
@ -79,8 +77,4 @@ export class LastSeenService {
async cleanLastSeen() { async cleanLastSeen() {
await this.lastSeenStore.cleanLastSeen(); await this.lastSeenStore.cleanLastSeen();
} }
destroy(): void {
this.timers.forEach(clearInterval);
}
} }

View File

@ -25,8 +25,6 @@ import { nameSchema } from '../../schema/feature-schema';
export default class ClientMetricsServiceV2 { export default class ClientMetricsServiceV2 {
private config: IUnleashConfig; private config: IUnleashConfig;
private timers: NodeJS.Timeout[] = [];
private unsavedMetrics: IClientMetricsEnv[] = []; private unsavedMetrics: IClientMetricsEnv[] = [];
private clientMetricsStoreV2: IClientMetricsStoreV2; private clientMetricsStoreV2: IClientMetricsStoreV2;
@ -41,7 +39,6 @@ export default class ClientMetricsServiceV2 {
{ clientMetricsStoreV2 }: Pick<IUnleashStores, 'clientMetricsStoreV2'>, { clientMetricsStoreV2 }: Pick<IUnleashStores, 'clientMetricsStoreV2'>,
config: IUnleashConfig, config: IUnleashConfig,
lastSeenService: LastSeenService, lastSeenService: LastSeenService,
bulkInterval = secondsToMilliseconds(5),
) { ) {
this.clientMetricsStoreV2 = clientMetricsStoreV2; this.clientMetricsStoreV2 = clientMetricsStoreV2;
this.lastSeenService = lastSeenService; this.lastSeenService = lastSeenService;
@ -50,18 +47,10 @@ export default class ClientMetricsServiceV2 {
'/services/client-metrics/client-metrics-service-v2.ts', '/services/client-metrics/client-metrics-service-v2.ts',
); );
this.flagResolver = config.flagResolver; this.flagResolver = config.flagResolver;
}
this.timers.push( async clearMetrics(hoursAgo: number) {
setInterval(() => { return this.clientMetricsStoreV2.clearMetrics(hoursAgo);
this.bulkAdd().catch(console.error);
}, bulkInterval).unref(),
);
this.timers.push(
setInterval(() => {
this.clientMetricsStoreV2.clearMetrics(48).catch(console.error);
}, hoursToMilliseconds(12)).unref(),
);
} }
async filterValidToggleNames(toggleNames: string[]): Promise<string[]> { async filterValidToggleNames(toggleNames: string[]): Promise<string[]> {
@ -245,9 +234,4 @@ export default class ClientMetricsServiceV2 {
} }
return 'default'; return 'default';
} }
destroy(): void {
this.timers.forEach(clearInterval);
this.lastSeenService.destroy();
}
} }

View File

@ -119,6 +119,7 @@ export const scheduleServices = async (
versionService, versionService,
lastSeenService, lastSeenService,
proxyService, proxyService,
clientMetricsServiceV2,
} = services; } = services;
if (await maintenanceService.isMaintenanceMode()) { if (await maintenanceService.isMaintenanceMode()) {
@ -224,6 +225,22 @@ export const scheduleServices = async (
minutesToMilliseconds(2), minutesToMilliseconds(2),
'fetchFrontendSettings', 'fetchFrontendSettings',
); );
schedulerService.schedule(
() => {
clientMetricsServiceV2.bulkAdd().catch(console.error);
},
secondsToMilliseconds(5),
'bulkAddMetrics',
);
schedulerService.schedule(
() => {
clientMetricsServiceV2.clearMetrics(48).catch(console.error);
},
hoursToMilliseconds(12),
'clearMetrics',
);
}; };
export const createServices = ( export const createServices = (

View File

@ -117,9 +117,7 @@ export default async function init(
await setupDatabase(stores); await setupDatabase(stores);
}, },
destroy: async () => { destroy: async () => {
const { clientInstanceStore } = stores;
return new Promise<void>((resolve, reject) => { return new Promise<void>((resolve, reject) => {
clientInstanceStore.destroy();
testDb.destroy((error) => (error ? reject(error) : resolve())); testDb.destroy((error) => (error ? reject(error) : resolve()));
}); });
}, },

View File

@ -56,8 +56,6 @@ test('Should update last seen for known toggles', async () => {
const t1 = await stores.featureToggleStore.get('ta1'); const t1 = await stores.featureToggleStore.get('ta1');
expect(t1.lastSeenAt.getTime()).toBeGreaterThan(time); expect(t1.lastSeenAt.getTime()).toBeGreaterThan(time);
service.destroy();
}); });
test('Should not update last seen toggles with 0 metrics', async () => { test('Should not update last seen toggles with 0 metrics', async () => {
@ -102,8 +100,6 @@ test('Should not update last seen toggles with 0 metrics', async () => {
expect(t2.lastSeenAt).toBeNull(); expect(t2.lastSeenAt).toBeNull();
expect(t1.lastSeenAt.getTime()).toBeGreaterThanOrEqual(time); expect(t1.lastSeenAt.getTime()).toBeGreaterThanOrEqual(time);
service.destroy();
}); });
test('Should not update anything for 0 toggles', async () => { test('Should not update anything for 0 toggles', async () => {
@ -144,6 +140,4 @@ test('Should not update anything for 0 toggles', async () => {
const count = await service.store(); const count = await service.store();
expect(count).toBe(0); expect(count).toBe(0);
service.destroy();
}); });