mirror of
https://github.com/Unleash/unleash.git
synced 2024-12-28 00:06:53 +01:00
eb346756d2
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
62 lines
1.6 KiB
JavaScript
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;
|