2021-06-24 19:22:12 +02:00
|
|
|
import EventEmitter from 'events';
|
|
|
|
import { Logger, LogProvider } from '../logger';
|
|
|
|
import metricsHelper from '../util/metrics-helper';
|
|
|
|
import { DB_TIME } from '../metric-events';
|
2021-08-12 15:04:37 +02:00
|
|
|
import { ClientMetricsDb } from './client-metrics-db';
|
|
|
|
import { IClientMetric } from '../types/stores/client-metrics-db';
|
|
|
|
import { IClientMetricsStore } from '../types/stores/client-metrics-store';
|
2016-11-05 13:36:44 +01:00
|
|
|
|
2016-11-28 17:11:11 +01:00
|
|
|
const TEN_SECONDS = 10 * 1000;
|
2016-11-05 13:36:44 +01:00
|
|
|
|
2021-08-12 15:04:37 +02:00
|
|
|
export class ClientMetricsStore
|
|
|
|
extends EventEmitter
|
|
|
|
implements IClientMetricsStore
|
|
|
|
{
|
2021-06-24 19:22:12 +02:00
|
|
|
private logger: Logger;
|
|
|
|
|
|
|
|
highestIdSeen = 0;
|
|
|
|
|
|
|
|
private startTimer: Function;
|
|
|
|
|
|
|
|
private timer: NodeJS.Timeout;
|
|
|
|
|
|
|
|
constructor(
|
|
|
|
private metricsDb: ClientMetricsDb,
|
|
|
|
eventBus: EventEmitter,
|
|
|
|
getLogger: LogProvider,
|
|
|
|
pollInterval = TEN_SECONDS,
|
|
|
|
) {
|
2016-11-28 17:11:11 +01:00
|
|
|
super();
|
2021-08-12 15:04:37 +02:00
|
|
|
this.logger = getLogger('client-metrics-store.ts.js');
|
2016-11-28 17:11:11 +01:00
|
|
|
this.metricsDb = metricsDb;
|
|
|
|
this.highestIdSeen = 0;
|
|
|
|
|
2021-08-12 15:04:37 +02:00
|
|
|
this.startTimer = (action) =>
|
2020-09-18 09:05:09 +02:00
|
|
|
metricsHelper.wrapTimer(eventBus, DB_TIME, {
|
|
|
|
store: 'metrics',
|
|
|
|
action,
|
|
|
|
});
|
|
|
|
|
2021-05-28 11:10:24 +02:00
|
|
|
process.nextTick(async () => {
|
|
|
|
await this._init(pollInterval);
|
|
|
|
});
|
2019-03-07 21:31:15 +01:00
|
|
|
}
|
|
|
|
|
2021-06-24 19:22:12 +02:00
|
|
|
async _init(pollInterval: number): Promise<void> {
|
2019-03-07 21:31:15 +01:00
|
|
|
try {
|
|
|
|
const metrics = await this.metricsDb.getMetricsLastHour();
|
|
|
|
this._emitMetrics(metrics);
|
|
|
|
} catch (err) {
|
2019-04-30 21:14:23 +02:00
|
|
|
this.logger.error('Error fetching metrics last hour', err);
|
2019-03-07 21:31:15 +01:00
|
|
|
}
|
|
|
|
this._startPoller(pollInterval);
|
|
|
|
this.emit('ready');
|
2016-11-05 13:36:44 +01:00
|
|
|
}
|
|
|
|
|
2021-06-24 19:22:12 +02:00
|
|
|
_startPoller(pollInterval: number): void {
|
2016-11-28 17:11:11 +01:00
|
|
|
this.timer = setInterval(() => this._fetchNewAndEmit(), pollInterval);
|
|
|
|
this.timer.unref();
|
2016-11-05 13:36:44 +01:00
|
|
|
}
|
|
|
|
|
2021-06-24 19:22:12 +02:00
|
|
|
_fetchNewAndEmit(): void {
|
2017-06-28 10:17:14 +02:00
|
|
|
this.metricsDb
|
|
|
|
.getNewMetrics(this.highestIdSeen)
|
2021-08-12 15:04:37 +02:00
|
|
|
.then((metrics) => this._emitMetrics(metrics));
|
2016-11-05 13:36:44 +01:00
|
|
|
}
|
|
|
|
|
2021-06-24 19:22:12 +02:00
|
|
|
_emitMetrics(metrics: IClientMetric[]): void {
|
2016-11-28 17:11:11 +01:00
|
|
|
if (metrics && metrics.length > 0) {
|
|
|
|
this.highestIdSeen = metrics[metrics.length - 1].id;
|
2021-08-12 15:04:37 +02:00
|
|
|
metrics.forEach((m) => this.emit('metrics', m.metrics));
|
2016-11-28 17:11:11 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Insert new client metrics
|
2021-06-24 19:22:12 +02:00
|
|
|
async insert(metrics: IClientMetric): Promise<void> {
|
2020-09-18 09:05:09 +02:00
|
|
|
const stopTimer = this.startTimer('insert');
|
|
|
|
|
|
|
|
await this.metricsDb.insert(metrics);
|
|
|
|
|
|
|
|
stopTimer();
|
2016-11-05 13:36:44 +01:00
|
|
|
}
|
|
|
|
|
2021-06-24 19:22:12 +02:00
|
|
|
destroy(): void {
|
2020-12-16 14:49:11 +01:00
|
|
|
clearInterval(this.timer);
|
|
|
|
this.metricsDb.destroy();
|
2016-11-05 13:36:44 +01:00
|
|
|
}
|
2021-08-12 15:04:37 +02:00
|
|
|
|
|
|
|
async delete(key: number): Promise<void> {
|
|
|
|
await this.metricsDb.delete(key);
|
|
|
|
}
|
|
|
|
|
|
|
|
async deleteAll(): Promise<void> {
|
|
|
|
await this.metricsDb.deleteAll();
|
|
|
|
}
|
|
|
|
|
|
|
|
async exists(key: number): Promise<boolean> {
|
|
|
|
return this.metricsDb.exists(key);
|
|
|
|
}
|
|
|
|
|
|
|
|
async get(key: number): Promise<IClientMetric> {
|
|
|
|
return this.metricsDb.get(key);
|
|
|
|
}
|
|
|
|
|
|
|
|
async getAll(): Promise<IClientMetric[]> {
|
|
|
|
return this.metricsDb.getMetricsLastHour();
|
|
|
|
}
|
2017-06-28 10:17:14 +02:00
|
|
|
}
|