mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	Remove jitter and migrate tasks to execute immediately
This commit is contained in:
		
							parent
							
								
									e2cd347e8e
								
							
						
					
					
						commit
						73f355984d
					
				@ -1,11 +1,18 @@
 | 
				
			|||||||
 | 
					import type { Logger } from './logger';
 | 
				
			||||||
 | 
					import type { IUnleashConfig } from './types';
 | 
				
			||||||
import { createGauge, type Gauge } from './util/metrics';
 | 
					import { createGauge, type Gauge } from './util/metrics';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type RestrictedRecord<T extends readonly string[]> = Record<T[number], string>;
 | 
					type RestrictedRecord<T extends readonly string[]> = Record<T[number], string>;
 | 
				
			||||||
type Query<R> = () => Promise<R | undefined | null>;
 | 
					type Query<R> = () => Promise<R | undefined | null>;
 | 
				
			||||||
type MapResult<R> = (result: R) => {
 | 
					type MapResult<R> = (result: R) =>
 | 
				
			||||||
    count: number;
 | 
					    | {
 | 
				
			||||||
    labels: RestrictedRecord<GaugeDefinition<R>['labelNames']>;
 | 
					          count: number;
 | 
				
			||||||
};
 | 
					          labels: RestrictedRecord<GaugeDefinition<R>['labelNames']>;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    | {
 | 
				
			||||||
 | 
					          count: number;
 | 
				
			||||||
 | 
					          labels: RestrictedRecord<GaugeDefinition<R>['labelNames']>;
 | 
				
			||||||
 | 
					      }[];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type GaugeDefinition<T> = {
 | 
					type GaugeDefinition<T> = {
 | 
				
			||||||
    name: string;
 | 
					    name: string;
 | 
				
			||||||
@ -19,18 +26,31 @@ type Task = () => Promise<void>;
 | 
				
			|||||||
export class DbMetricsMonitor {
 | 
					export class DbMetricsMonitor {
 | 
				
			||||||
    private tasks: Set<Task> = new Set();
 | 
					    private tasks: Set<Task> = new Set();
 | 
				
			||||||
    private gauges: Map<string, Gauge<string>> = new Map();
 | 
					    private gauges: Map<string, Gauge<string>> = new Map();
 | 
				
			||||||
 | 
					    private logger: Logger;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    constructor() {}
 | 
					    constructor(config: IUnleashConfig) {
 | 
				
			||||||
 | 
					        this.logger = config.getLogger('gauge-metrics');
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private asArray<T>(value: T | T[]): T[] {
 | 
				
			||||||
 | 
					        return Array.isArray(value) ? value : [value];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    registerGaugeDbMetric<T>(definition: GaugeDefinition<T>): Task {
 | 
					    registerGaugeDbMetric<T>(definition: GaugeDefinition<T>): Task {
 | 
				
			||||||
        const gauge = createGauge(definition);
 | 
					        const gauge = createGauge(definition);
 | 
				
			||||||
        this.gauges.set(definition.name, gauge);
 | 
					        this.gauges.set(definition.name, gauge);
 | 
				
			||||||
        const task = async () => {
 | 
					        const task = async () => {
 | 
				
			||||||
            const result = await definition.query();
 | 
					            try {
 | 
				
			||||||
            if (result !== null && result !== undefined) {
 | 
					                const result = await definition.query();
 | 
				
			||||||
                const { count, labels } = definition.map(result);
 | 
					                if (result !== null && result !== undefined) {
 | 
				
			||||||
                gauge.reset();
 | 
					                    const results = this.asArray(definition.map(result));
 | 
				
			||||||
                gauge.labels(labels).set(count);
 | 
					                    gauge.reset();
 | 
				
			||||||
 | 
					                    for (const r of results) {
 | 
				
			||||||
 | 
					                        gauge.labels(r.labels).set(r.count);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            } catch (e) {
 | 
				
			||||||
 | 
					                this.logger.warn(`Failed to refresh ${definition.name}`, e);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
        this.tasks.add(task);
 | 
					        this.tasks.add(task);
 | 
				
			||||||
 | 
				
			|||||||
@ -57,7 +57,7 @@ export default class MetricsMonitor {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        const { eventStore, environmentStore } = stores;
 | 
					        const { eventStore, environmentStore } = stores;
 | 
				
			||||||
        const { flagResolver } = config;
 | 
					        const { flagResolver } = config;
 | 
				
			||||||
        const dbMetrics = new DbMetricsMonitor();
 | 
					        const dbMetrics = new DbMetricsMonitor(config);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        const cachedEnvironments: () => Promise<IEnvironment[]> = memoizee(
 | 
					        const cachedEnvironments: () => Promise<IEnvironment[]> = memoizee(
 | 
				
			||||||
            async () => environmentStore.getAll(),
 | 
					            async () => environmentStore.getAll(),
 | 
				
			||||||
@ -260,11 +260,18 @@ export default class MetricsMonitor {
 | 
				
			|||||||
            help: 'Number of strategies',
 | 
					            help: 'Number of strategies',
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        const clientAppsTotal = createGauge({
 | 
					        // execute immediately to get initial values
 | 
				
			||||||
 | 
					        await dbMetrics.registerGaugeDbMetric({
 | 
				
			||||||
            name: 'client_apps_total',
 | 
					            name: 'client_apps_total',
 | 
				
			||||||
            help: 'Number of registered client apps aggregated by range by last seen',
 | 
					            help: 'Number of registered client apps aggregated by range by last seen',
 | 
				
			||||||
            labelNames: ['range'],
 | 
					            labelNames: ['range'],
 | 
				
			||||||
        });
 | 
					            query: () => instanceStatsService.getLabeledAppCounts(),
 | 
				
			||||||
 | 
					            map: (result) =>
 | 
				
			||||||
 | 
					                Object.entries(result).map(([range, count]) => ({
 | 
				
			||||||
 | 
					                    count,
 | 
				
			||||||
 | 
					                    labels: { range },
 | 
				
			||||||
 | 
					                })),
 | 
				
			||||||
 | 
					        })();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        const samlEnabled = createGauge({
 | 
					        const samlEnabled = createGauge({
 | 
				
			||||||
            name: 'saml_enabled',
 | 
					            name: 'saml_enabled',
 | 
				
			||||||
@ -628,11 +635,6 @@ export default class MetricsMonitor {
 | 
				
			|||||||
                oidcEnabled.reset();
 | 
					                oidcEnabled.reset();
 | 
				
			||||||
                oidcEnabled.set(stats.OIDCenabled ? 1 : 0);
 | 
					                oidcEnabled.set(stats.OIDCenabled ? 1 : 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                clientAppsTotal.reset();
 | 
					 | 
				
			||||||
                stats.clientApps.forEach(({ range, count }) =>
 | 
					 | 
				
			||||||
                    clientAppsTotal.labels({ range }).set(count),
 | 
					 | 
				
			||||||
                );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                rateLimits.reset();
 | 
					                rateLimits.reset();
 | 
				
			||||||
                rateLimits
 | 
					                rateLimits
 | 
				
			||||||
                    .labels({
 | 
					                    .labels({
 | 
				
			||||||
@ -695,7 +697,6 @@ export default class MetricsMonitor {
 | 
				
			|||||||
            collectStaticCounters.bind(this),
 | 
					            collectStaticCounters.bind(this),
 | 
				
			||||||
            hoursToMilliseconds(2),
 | 
					            hoursToMilliseconds(2),
 | 
				
			||||||
            'collectStaticCounters',
 | 
					            'collectStaticCounters',
 | 
				
			||||||
            0, // no jitter
 | 
					 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        eventBus.on(
 | 
					        eventBus.on(
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user