1
0
mirror of https://github.com/Unleash/unleash.git synced 2024-11-01 19:07:38 +01:00
unleash.unleash/src/lib/services/scheduler-service.ts
Gastón Fournier ce815e5f29
feat: report app names only if below a threshold (#2737)
## About the changes
Introduce a snapshot version of instanceStats inside
instance-stats-service to provide a cached state of the statistics
without compromising the DB.

### Important notes
Some rule-of-thumb applied in the PR that can be changed:
1. The snapshot refresh time
2. The threshold to report appName with the metrics

## Discussion points
1. The snapshot could be limited to just the information needed (things
like `hasOIDC` don't change until there's a restart), to optimize the memory usage
3. metrics.ts (used to expose Prometheus metrics) has a [refresh
interval of
2hs](2d16730cc2/src/lib/metrics.ts (L189-L195)),
but with this implementation, we could remove that background task and
rely on the snapshot
4. We could additionally update the snapshot every time someone queries
the DB to fetch stats (`getStats()` method), but it may increase
complexity without a significant benefit

Co-authored-by: Mateusz Kwasniewski <kwasniewski.mateusz@gmail.com>
Co-authored-by: Simon Hornby <liquidwicked64@gmail.com>
2023-01-12 11:26:59 +01:00

36 lines
909 B
TypeScript

import { Logger, LogProvider } from '../logger';
export default class SchedulerService {
private intervalIds: NodeJS.Timer[] = [];
private logger: Logger;
constructor(getLogger: LogProvider) {
this.logger = getLogger('/services/scheduler-service.ts');
}
async schedule(
scheduledFunction: () => void,
timeMs: number,
): Promise<void> {
this.intervalIds.push(
setInterval(async () => {
try {
await scheduledFunction();
} catch (e) {
this.logger.error('scheduled job failed', e);
}
}, timeMs).unref(),
);
try {
await scheduledFunction();
} catch (e) {
this.logger.error('scheduled job failed', e);
}
}
stop(): void {
this.intervalIds.forEach(clearInterval);
}
}