mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			133 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			133 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'use strict';
 | 
						|
 | 
						|
const Projection = require('./projection.js');
 | 
						|
const TTLList = require('./ttl-list.js');
 | 
						|
 | 
						|
module.exports = class UnleashClientMetrics {
 | 
						|
    constructor(clientMetricsStore) {
 | 
						|
        this.globalCount = 0;
 | 
						|
        this.apps = {};
 | 
						|
 | 
						|
        this.lastHourProjection = new Projection();
 | 
						|
        this.lastMinuteProjection = new Projection();
 | 
						|
 | 
						|
        this.lastHourList = new TTLList({
 | 
						|
            interval: 10000,
 | 
						|
        });
 | 
						|
 | 
						|
        this.lastMinuteList = new TTLList({
 | 
						|
            interval: 10000,
 | 
						|
            expireType: 'minutes',
 | 
						|
            expireAmount: 1,
 | 
						|
        });
 | 
						|
 | 
						|
        this.lastHourList.on('expire', toggles => {
 | 
						|
            Object.keys(toggles).forEach(toggleName => {
 | 
						|
                this.lastHourProjection.substract(
 | 
						|
                    toggleName,
 | 
						|
                    this.createCountObject(toggles[toggleName])
 | 
						|
                );
 | 
						|
            });
 | 
						|
        });
 | 
						|
        this.lastMinuteList.on('expire', toggles => {
 | 
						|
            Object.keys(toggles).forEach(toggleName => {
 | 
						|
                this.lastMinuteProjection.substract(
 | 
						|
                    toggleName,
 | 
						|
                    this.createCountObject(toggles[toggleName])
 | 
						|
                );
 | 
						|
            });
 | 
						|
        });
 | 
						|
        clientMetricsStore.on('metrics', m => this.addPayload(m));
 | 
						|
    }
 | 
						|
 | 
						|
    getAppsWithToggles() {
 | 
						|
        const apps = [];
 | 
						|
        Object.keys(this.apps).forEach(appName => {
 | 
						|
            const seenToggles = Object.keys(this.apps[appName].seenToggles);
 | 
						|
            const metricsCount = this.apps[appName].count;
 | 
						|
            apps.push({ appName, seenToggles, metricsCount });
 | 
						|
        });
 | 
						|
        return apps;
 | 
						|
    }
 | 
						|
    getSeenTogglesByAppName(appName) {
 | 
						|
        return this.apps[appName]
 | 
						|
            ? Object.keys(this.apps[appName].seenToggles)
 | 
						|
            : [];
 | 
						|
    }
 | 
						|
 | 
						|
    getSeenAppsPerToggle() {
 | 
						|
        const toggles = {};
 | 
						|
        Object.keys(this.apps).forEach(appName => {
 | 
						|
            Object.keys(this.apps[appName].seenToggles).forEach(
 | 
						|
                seenToggleName => {
 | 
						|
                    if (!toggles[seenToggleName]) {
 | 
						|
                        toggles[seenToggleName] = [];
 | 
						|
                    }
 | 
						|
                    toggles[seenToggleName].push({ appName });
 | 
						|
                }
 | 
						|
            );
 | 
						|
        });
 | 
						|
        return toggles;
 | 
						|
    }
 | 
						|
 | 
						|
    getTogglesMetrics() {
 | 
						|
        return {
 | 
						|
            lastHour: this.lastHourProjection.getProjection(),
 | 
						|
            lastMinute: this.lastMinuteProjection.getProjection(),
 | 
						|
        };
 | 
						|
    }
 | 
						|
 | 
						|
    addPayload(data) {
 | 
						|
        const { appName, bucket } = data;
 | 
						|
        const app = this.getApp(appName);
 | 
						|
        this.addBucket(app, bucket);
 | 
						|
    }
 | 
						|
 | 
						|
    getApp(appName) {
 | 
						|
        this.apps[appName] = this.apps[appName] || {
 | 
						|
            seenToggles: {},
 | 
						|
            count: 0,
 | 
						|
        };
 | 
						|
        return this.apps[appName];
 | 
						|
    }
 | 
						|
 | 
						|
    createCountObject(entry) {
 | 
						|
        const yes = typeof entry.yes == 'number' ? entry.yes : 0;
 | 
						|
        const no = typeof entry.no == 'number' ? entry.no : 0;
 | 
						|
        return { yes, no };
 | 
						|
    }
 | 
						|
 | 
						|
    addBucket(app, bucket) {
 | 
						|
        let count = 0;
 | 
						|
        // TODO stop should be createdAt
 | 
						|
        const { stop, toggles } = bucket;
 | 
						|
 | 
						|
        const toggleNames = Object.keys(toggles);
 | 
						|
 | 
						|
        toggleNames.forEach(n => {
 | 
						|
            const countObj = this.createCountObject(toggles[n]);
 | 
						|
            this.lastHourProjection.add(n, countObj);
 | 
						|
            this.lastMinuteProjection.add(n, countObj);
 | 
						|
            count += countObj.yes + countObj.no;
 | 
						|
        });
 | 
						|
 | 
						|
        this.lastHourList.add(toggles, stop);
 | 
						|
        this.lastMinuteList.add(toggles, stop);
 | 
						|
 | 
						|
        this.globalCount += count;
 | 
						|
        app.count += count;
 | 
						|
        this.addSeenToggles(app, toggleNames);
 | 
						|
    }
 | 
						|
 | 
						|
    addSeenToggles(app, toggleNames) {
 | 
						|
        toggleNames.forEach(t => {
 | 
						|
            app.seenToggles[t] = true;
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
    destroy() {
 | 
						|
        this.lastHourList.destroy();
 | 
						|
        this.lastMinuteList.destroy();
 | 
						|
    }
 | 
						|
};
 |