1
0
mirror of https://github.com/Unleash/unleash.git synced 2024-10-18 20:09:08 +02:00
unleash.unleash/lib/client-metrics/index.js

114 lines
3.3 KiB
JavaScript
Raw Normal View History

'use strict';
2016-11-04 16:16:55 +01:00
const Projection = require('./projection.js');
const TTLList = require('./ttl-list.js');
module.exports = class UnleashClientMetrics {
constructor (clientMetricsStore) {
this.globalCount = 0;
2016-11-04 16:16:55 +01:00
this.apps = {};
2016-11-07 09:13:19 +01:00
this.lastHourProjection = new Projection();
this.lastMinuteProjection = new Projection();
this.lastHourList = new TTLList({
interval: 10000,
});
2016-11-07 09:13:19 +01:00
this.lastMinuteList = new TTLList({
interval: 10000,
expireType: 'minutes',
expireAmount: 1,
});
this.lastHourList.on('expire', (toggles) => {
2016-11-04 16:16:55 +01:00
Object.keys(toggles).forEach(toggleName => {
2016-11-07 09:13:19 +01:00
this.lastHourProjection.substract(toggleName, toggles[toggleName]);
});
});
this.lastMinuteList.on('expire', (toggles) => {
Object.keys(toggles).forEach(toggleName => {
this.lastMinuteProjection.substract(toggleName, toggles[toggleName]);
2016-11-04 16:16:55 +01:00
});
});
clientMetricsStore.on('metrics', (m) => this.addPayload(m));
}
2016-12-05 13:26:53 +01:00
getAppsWithToggles () {
const apps = [];
Object.keys(this.apps).forEach(appName => {
const seenToggles = Object.keys(this.apps[appName].seenToggles);
const metricsCount = this.apps[appName].count;
2016-12-04 14:09:37 +01:00
apps.push({ appName, seenToggles, metricsCount });
});
return apps;
}
2016-12-04 14:09:37 +01:00
getSeenTogglesByAppName (appName) {
return this.apps[appName] ? Object.keys(this.apps[appName].seenToggles) : [];
}
2016-12-05 13:53:53 +01:00
getSeenAppsPerToggle () {
const toggles = {};
2016-12-05 13:27:08 +01:00
Object.keys(this.apps).forEach(appName => {
2016-12-05 13:53:53 +01:00
Object.keys(this.apps[appName].seenToggles).forEach((seenToggleName) => {
if (!toggles[seenToggleName]) {
toggles[seenToggleName] = [];
}
2016-12-06 09:19:15 +01:00
toggles[seenToggleName].push({ appName });
2016-12-05 13:53:53 +01:00
});
2016-12-05 13:27:08 +01:00
});
2016-12-05 13:53:53 +01:00
return toggles;
2016-12-05 13:27:08 +01:00
}
2016-11-04 16:16:55 +01:00
getTogglesMetrics () {
2016-11-07 09:13:19 +01:00
return {
lastHour: this.lastHourProjection.getProjection(),
lastMinute: this.lastMinuteProjection.getProjection(),
};
2016-11-04 16:16:55 +01:00
}
2016-11-02 12:49:25 +01:00
addPayload (data) {
const { appName, bucket } = data;
2016-12-04 14:09:37 +01:00
const app = this.getApp(appName);
this.addBucket(app, bucket);
}
2016-12-04 14:09:37 +01:00
getApp (appName) {
this.apps[appName] = this.apps[appName] || { seenToggles: {}, count: 0 };
return this.apps[appName];
}
addBucket (app, bucket) {
let count = 0;
2016-11-04 16:16:55 +01:00
// TODO stop should be createdAt
const { stop, toggles } = bucket;
2016-10-27 15:16:27 +02:00
const toggleNames = Object.keys(toggles);
toggleNames.forEach((n) => {
2016-11-04 16:16:55 +01:00
const entry = toggles[n];
2016-11-07 09:13:19 +01:00
this.lastHourProjection.add(n, entry);
this.lastMinuteProjection.add(n, entry);
2016-11-04 16:16:55 +01:00
count += (entry.yes + entry.no);
});
2016-11-04 16:16:55 +01:00
2016-11-07 09:13:19 +01:00
this.lastHourList.add(toggles, stop);
this.lastMinuteList.add(toggles, stop);
2016-11-04 16:16:55 +01:00
this.globalCount += count;
app.count += count;
this.addSeenToggles(app, toggleNames);
}
addSeenToggles (app, toggleNames) {
2016-12-04 14:09:37 +01:00
toggleNames.forEach(t => {
app.seenToggles[t] = true;
});
}
2016-11-13 18:14:29 +01:00
destroy () {
this.lastHourList.destroy();
this.lastMinuteList.destroy();
}
};