1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-10-27 11:02:16 +01:00
unleash.unleash/src/lib/metrics-gauge.ts
Gastón Fournier 05762e9b59
Use map method
2024-10-15 10:54:10 +02:00

52 lines
1.5 KiB
TypeScript

import { createGauge, type Gauge } from './util/metrics';
type RestrictedRecord<T extends readonly string[]> = Record<T[number], string>;
type Query<R> = () => Promise<R | undefined | null>;
type MapResult<R> = (result: R) => {
count: number;
labels: RestrictedRecord<GaugeDefinition<R>['labelNames']>;
};
type GaugeDefinition<T> = {
name: string;
help: string;
labelNames: string[];
query: Query<T>;
map: MapResult<T>;
};
type Task = () => Promise<void>;
export class DbMetricsMonitor {
private tasks: Set<Task> = new Set();
private gauges: Map<string, Gauge<string>> = new Map();
constructor() {}
registerGaugeDbMetric<T>(definition: GaugeDefinition<T>) {
const gauge = createGauge(definition);
this.gauges.set(definition.name, gauge);
this.tasks.add(async () => {
const result = await definition.query();
if (result) {
const { count, labels } = definition.map(result);
gauge.reset();
gauge.labels(labels).set(count);
}
});
}
refreshDbMetrics = async () => {
for (const task of this.tasks) {
await task();
}
};
async getLastValue(name: string): Promise<number | undefined> {
const gauge = await this.gauges.get(name)?.gauge?.get();
if (gauge && gauge.values.length > 0) {
return gauge.values[0].value;
}
return undefined;
}
}