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:
parent
8d8a975c6c
commit
8bc04c59f3
@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
};
|
};
|
||||||
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -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 = (
|
||||||
|
@ -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()));
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
@ -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();
|
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user