mirror of
https://github.com/Unleash/unleash.git
synced 2024-11-01 19:07:38 +01:00
ce815e5f29
## 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>
36 lines
909 B
TypeScript
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);
|
|
}
|
|
}
|