mirror of
https://github.com/Unleash/unleash.git
synced 2025-09-10 17:53:36 +02:00
chore: add a class to handle aggreggation queries
This commit is contained in:
parent
5d61b3903b
commit
3cbbefff1d
50
src/lib/metrics-gauge.ts
Normal file
50
src/lib/metrics-gauge.ts
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
import { createGauge, type Gauge } from './util/metrics';
|
||||||
|
|
||||||
|
type RestrictedRecord<T extends 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>;
|
||||||
|
};
|
||||||
|
|
||||||
|
export class DbMetricsMonitor {
|
||||||
|
private tasks: (() => Promise<void>)[] = [];
|
||||||
|
private gauges: Record<string, Gauge<string>> = {};
|
||||||
|
|
||||||
|
constructor() {}
|
||||||
|
|
||||||
|
registerGaugeDbMetric<T>(definition: GaugeDefinition<T>) {
|
||||||
|
const gauge = createGauge(definition);
|
||||||
|
this.gauges[definition.name] = gauge;
|
||||||
|
this.tasks.push(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> {
|
||||||
|
try {
|
||||||
|
return (await this.gauges[name].gauge.get()).values[0].value;
|
||||||
|
} catch (e) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -37,6 +37,7 @@ import {
|
|||||||
} from './util/metrics';
|
} from './util/metrics';
|
||||||
import type { SchedulerService } from './services';
|
import type { SchedulerService } from './services';
|
||||||
import type { IClientMetricsEnv } from './features/metrics/client-metrics/client-metrics-store-v2-type';
|
import type { IClientMetricsEnv } from './features/metrics/client-metrics/client-metrics-store-v2-type';
|
||||||
|
import { DbMetricsMonitor } from './metrics-gauge';
|
||||||
|
|
||||||
export default class MetricsMonitor {
|
export default class MetricsMonitor {
|
||||||
constructor() {}
|
constructor() {}
|
||||||
@ -56,6 +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 cachedEnvironments: () => Promise<IEnvironment[]> = memoizee(
|
const cachedEnvironments: () => Promise<IEnvironment[]> = memoizee(
|
||||||
async () => environmentStore.getAll(),
|
async () => environmentStore.getAll(),
|
||||||
@ -125,11 +127,19 @@ export default class MetricsMonitor {
|
|||||||
help: 'Maximum number of environment strategies in one feature',
|
help: 'Maximum number of environment strategies in one feature',
|
||||||
labelNames: ['feature', 'environment'],
|
labelNames: ['feature', 'environment'],
|
||||||
});
|
});
|
||||||
const maxFeatureStrategies = createGauge({
|
|
||||||
|
dbMetrics.registerGaugeDbMetric({
|
||||||
name: 'max_feature_strategies',
|
name: 'max_feature_strategies',
|
||||||
help: 'Maximum number of strategies in one feature',
|
help: 'Maximum number of strategies in one feature',
|
||||||
labelNames: ['feature'],
|
labelNames: ['feature'],
|
||||||
|
query: () =>
|
||||||
|
stores.featureStrategiesReadModel.getMaxFeatureStrategies(),
|
||||||
|
map: (result) => ({
|
||||||
|
count: result.count,
|
||||||
|
labels: { feature: result.feature },
|
||||||
|
}),
|
||||||
});
|
});
|
||||||
|
|
||||||
const maxConstraintValues = createGauge({
|
const maxConstraintValues = createGauge({
|
||||||
name: 'max_constraint_values',
|
name: 'max_constraint_values',
|
||||||
help: 'Maximum number of constraint values used in a single constraint',
|
help: 'Maximum number of constraint values used in a single constraint',
|
||||||
@ -394,9 +404,10 @@ export default class MetricsMonitor {
|
|||||||
|
|
||||||
async function collectStaticCounters() {
|
async function collectStaticCounters() {
|
||||||
try {
|
try {
|
||||||
|
dbMetrics.refreshDbMetrics();
|
||||||
|
|
||||||
const stats = await instanceStatsService.getStats();
|
const stats = await instanceStatsService.getStats();
|
||||||
const [
|
const [
|
||||||
maxStrategies,
|
|
||||||
maxEnvironmentStrategies,
|
maxEnvironmentStrategies,
|
||||||
maxConstraintValuesResult,
|
maxConstraintValuesResult,
|
||||||
maxConstraintsPerStrategyResult,
|
maxConstraintsPerStrategyResult,
|
||||||
@ -408,7 +419,6 @@ export default class MetricsMonitor {
|
|||||||
instanceOnboardingMetrics,
|
instanceOnboardingMetrics,
|
||||||
projectsOnboardingMetrics,
|
projectsOnboardingMetrics,
|
||||||
] = await Promise.all([
|
] = await Promise.all([
|
||||||
stores.featureStrategiesReadModel.getMaxFeatureStrategies(),
|
|
||||||
stores.featureStrategiesReadModel.getMaxFeatureEnvironmentStrategies(),
|
stores.featureStrategiesReadModel.getMaxFeatureEnvironmentStrategies(),
|
||||||
stores.featureStrategiesReadModel.getMaxConstraintValues(),
|
stores.featureStrategiesReadModel.getMaxConstraintValues(),
|
||||||
stores.featureStrategiesReadModel.getMaxConstraintsPerStrategy(),
|
stores.featureStrategiesReadModel.getMaxConstraintsPerStrategy(),
|
||||||
@ -511,12 +521,7 @@ export default class MetricsMonitor {
|
|||||||
})
|
})
|
||||||
.set(maxEnvironmentStrategies.count);
|
.set(maxEnvironmentStrategies.count);
|
||||||
}
|
}
|
||||||
if (maxStrategies) {
|
|
||||||
maxFeatureStrategies.reset();
|
|
||||||
maxFeatureStrategies
|
|
||||||
.labels({ feature: maxStrategies.feature })
|
|
||||||
.set(maxStrategies.count);
|
|
||||||
}
|
|
||||||
if (maxConstraintValuesResult) {
|
if (maxConstraintValuesResult) {
|
||||||
maxConstraintValues.reset();
|
maxConstraintValues.reset();
|
||||||
maxConstraintValues
|
maxConstraintValues
|
||||||
|
Loading…
Reference in New Issue
Block a user