1
0
mirror of https://github.com/Unleash/unleash.git synced 2024-12-28 00:06:53 +01:00
unleash.unleash/lib/db/client-metrics-db.js
Ivar eb346756d2 Clean up intervals.
We use intervals in three places and we could probably organise them
better in the future. As long as they all do unref they do not form
any issues for us and I will just let them be as is for now.

This closes #186
2020-02-20 08:33:46 +01:00

62 lines
1.6 KiB
JavaScript

'use strict';
const logger = require('../logger')('client-metrics-db.js');
const METRICS_COLUMNS = ['id', 'created_at', 'metrics'];
const TABLE = 'client_metrics';
const ONE_MINUTE = 60 * 1000;
const mapRow = row => ({
id: row.id,
createdAt: row.created_at,
metrics: row.metrics,
});
class ClientMetricsDb {
constructor(db) {
this.db = db;
// Clear old metrics regulary
const clearer = () => this.removeMetricsOlderThanOneHour();
setTimeout(clearer, 10).unref();
setInterval(clearer, ONE_MINUTE).unref();
}
removeMetricsOlderThanOneHour() {
this.db(TABLE)
.whereRaw("created_at < now() - interval '1 hour'")
.del()
.then(res => res > 0 && logger.info(`Deleted ${res} metrics`));
}
// Insert new client metrics
insert(metrics) {
return this.db(TABLE).insert({ metrics });
}
// Used at startup to load all metrics last week into memory!
getMetricsLastHour() {
return this.db
.select(METRICS_COLUMNS)
.from(TABLE)
.limit(2000)
.whereRaw("created_at > now() - interval '1 hour'")
.orderBy('created_at', 'asc')
.map(mapRow);
}
// Used to poll for new metrics
getNewMetrics(lastKnownId) {
return this.db
.select(METRICS_COLUMNS)
.from(TABLE)
.limit(1000)
.where('id', '>', lastKnownId)
.orderBy('created_at', 'asc')
.map(mapRow);
}
}
module.exports = ClientMetricsDb;