1
0
mirror of https://github.com/Unleash/unleash.git synced 2024-10-18 20:09:08 +02:00
unleash.unleash/src/lib/db/client-metrics-store.ts
checketts 2f013bacbf
chore: Convert client metrics controller to typescript (#831)
Co-authored-by: Ivar Conradi Østhus <ivarconr@gmail.com>
2021-06-24 19:22:12 +02:00

85 lines
2.3 KiB
TypeScript

'use strict';
import EventEmitter from 'events';
import { ClientMetricsDb, IClientMetric } from './client-metrics-db';
import { Logger, LogProvider } from '../logger';
import metricsHelper from '../util/metrics-helper';
import { DB_TIME } from '../metric-events';
const TEN_SECONDS = 10 * 1000;
export class ClientMetricsStore extends EventEmitter {
private logger: Logger;
highestIdSeen = 0;
private startTimer: Function;
private timer: NodeJS.Timeout;
constructor(
private metricsDb: ClientMetricsDb,
eventBus: EventEmitter,
getLogger: LogProvider,
pollInterval = TEN_SECONDS,
) {
super();
this.logger = getLogger('client-metrics-store.js');
this.metricsDb = metricsDb;
this.highestIdSeen = 0;
this.startTimer = action =>
metricsHelper.wrapTimer(eventBus, DB_TIME, {
store: 'metrics',
action,
});
process.nextTick(async () => {
await this._init(pollInterval);
});
}
async _init(pollInterval: number): Promise<void> {
try {
const metrics = await this.metricsDb.getMetricsLastHour();
this._emitMetrics(metrics);
} catch (err) {
this.logger.error('Error fetching metrics last hour', err);
}
this._startPoller(pollInterval);
this.emit('ready');
}
_startPoller(pollInterval: number): void {
this.timer = setInterval(() => this._fetchNewAndEmit(), pollInterval);
this.timer.unref();
}
_fetchNewAndEmit(): void {
this.metricsDb
.getNewMetrics(this.highestIdSeen)
.then(metrics => this._emitMetrics(metrics));
}
_emitMetrics(metrics: IClientMetric[]): void {
if (metrics && metrics.length > 0) {
this.highestIdSeen = metrics[metrics.length - 1].id;
metrics.forEach(m => this.emit('metrics', m.metrics));
}
}
// Insert new client metrics
async insert(metrics: IClientMetric): Promise<void> {
const stopTimer = this.startTimer('insert');
await this.metricsDb.insert(metrics);
stopTimer();
}
destroy(): void {
clearInterval(this.timer);
this.metricsDb.destroy();
}
}