From b830ddb3bbbb8d444c1bc163d1711d2e2a6dda0a Mon Sep 17 00:00:00 2001 From: kwasniew Date: Mon, 27 Oct 2025 10:37:01 +0100 Subject: [PATCH] feat: fake impact metrics with histograms --- src/test/fixtures/fake-impact-metrics.ts | 86 +++++++++++++++++------- 1 file changed, 60 insertions(+), 26 deletions(-) diff --git a/src/test/fixtures/fake-impact-metrics.ts b/src/test/fixtures/fake-impact-metrics.ts index 440e79554d..96dace70df 100644 --- a/src/test/fixtures/fake-impact-metrics.ts +++ b/src/test/fixtures/fake-impact-metrics.ts @@ -1,34 +1,68 @@ -export const fakeImpactMetricsResolver = () => ({ - counters: new Map(), - gauges: new Map(), +import type { IImpactMetricsResolver } from '../../lib/types/index.js'; - defineCounter(name: string, help: string) { - this.counters.set(name, { value: 0, help }); - }, +export const fakeImpactMetricsResolver = () => { + const counters = new Map(); + const gauges = new Map(); + const histograms = new Map< + string, + { count: number; sum: number; help: string; buckets: number[] } + >(); - defineGauge(name: string, help: string) { - this.gauges.set(name, { value: 0, help }); - }, + const resolver: IImpactMetricsResolver = { + defineCounter(name: string, help: string) { + counters.set(name, { value: 0, help }); + }, - incrementCounter(name: string, value: number = 1) { - const counter = this.counters.get(name); + defineGauge(name: string, help: string) { + gauges.set(name, { value: 0, help }); + }, - if (!counter) { - return; - } + defineHistogram(name: string, help: string, buckets?: number[]) { + const defaultBuckets = buckets || [ + 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10, + ]; + histograms.set(name, { + count: 0, + sum: 0, + help, + buckets: defaultBuckets, + }); + }, - counter.value += value; - this.counters.set(name, counter); - }, + incrementCounter(name: string, value: number = 1) { + const counter = counters.get(name); - updateGauge(name: string, value: number) { - const gauge = this.gauges.get(name); + if (!counter) { + return; + } - if (!gauge) { - return; - } + counter.value += value; + counters.set(name, counter); + }, - gauge.value = value; - this.gauges.set(name, gauge); - }, -}); + updateGauge(name: string, value: number) { + const gauge = gauges.get(name); + + if (!gauge) { + return; + } + + gauge.value = value; + gauges.set(name, gauge); + }, + + observeHistogram(name: string, value: number) { + const histogram = histograms.get(name); + + if (!histogram) { + return; + } + + histogram.count++; + histogram.sum += value; + histograms.set(name, histogram); + }, + }; + + return { ...resolver, counters, gauges, histograms }; +};