1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-09-10 17:53:36 +02:00

Remove jitter and migrate tasks to execute immediately

This commit is contained in:
Gastón Fournier 2024-10-15 13:15:51 +02:00
parent e2cd347e8e
commit 73f355984d
No known key found for this signature in database
GPG Key ID: AF45428626E17A8E
2 changed files with 40 additions and 19 deletions

View File

@ -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);

View File

@ -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(