summaryrefslogtreecommitdiff
path: root/u/trace/metric/trace.ts
diff options
context:
space:
mode:
authorElizabeth Hunt <me@liz.coffee>2025-07-27 18:50:33 -0700
committerElizabeth Hunt <me@liz.coffee>2025-07-27 19:31:06 -0700
commit7aa11b7a8abacf81dec20fff21216df35d333756 (patch)
tree40f6a76c37412cf1c5a67f99a4ee30e3aae863c9 /u/trace/metric/trace.ts
parente4df72cd446270cf867ec308995a05e21b3aa601 (diff)
downloadci-7aa11b7a8abacf81dec20fff21216df35d333756.tar.gz
ci-7aa11b7a8abacf81dec20fff21216df35d333756.zip
Pulls in pengueno from npm
Diffstat (limited to 'u/trace/metric/trace.ts')
-rw-r--r--u/trace/metric/trace.ts59
1 files changed, 0 insertions, 59 deletions
diff --git a/u/trace/metric/trace.ts b/u/trace/metric/trace.ts
deleted file mode 100644
index 0c5fe37..0000000
--- a/u/trace/metric/trace.ts
+++ /dev/null
@@ -1,59 +0,0 @@
-import { IMetric, isIMetric, isMetricValue, ITrace, ITraceWith, MetricValue, SideEffect } from '@emprespresso/pengueno';
-
-export type MetricsTraceSupplier =
- | ITraceWith<IMetric | MetricValue | undefined>
- | Array<ITraceWith<IMetric | MetricValue | undefined>>;
-export const isMetricsTraceSupplier = (t: unknown): t is MetricsTraceSupplier =>
- isMetricValue(t) || isIMetric(t) || (Array.isArray(t) && t.every((_m) => isMetricValue(_m) || isIMetric(_m)));
-
-export class MetricsTrace implements ITrace<MetricsTraceSupplier> {
- constructor(
- private readonly metricConsumer: SideEffect<Array<MetricValue>>,
- private readonly activeTraces: ReadonlyMap<IMetric, number> = new Map(),
- private readonly completedTraces: ReadonlySet<IMetric> = new Set(),
- ) {}
-
- public traceScope(trace: MetricsTraceSupplier): MetricsTrace {
- const now = Date.now();
- const metricsToTrace = (Array.isArray(trace) ? trace : [trace]).filter(isIMetric);
-
- const initialTraces = new Map(metricsToTrace.map((metric) => [metric, now]));
-
- return new MetricsTrace(this.metricConsumer, initialTraces);
- }
-
- public trace(metrics: MetricsTraceSupplier): MetricsTrace {
- if (!metrics || typeof metrics === 'string') {
- return this;
- }
-
- const now = Date.now();
- const allMetrics = Array.isArray(metrics) ? metrics : [metrics];
-
- // partition the incoming metrics
- const valuesToEmit = allMetrics.filter(isMetricValue);
- const traceableMetrics = allMetrics.filter(isIMetric);
-
- const metricsToStart = traceableMetrics.filter((m) => !this.activeTraces.has(m));
- const metricsToEnd = traceableMetrics.filter((m) => this.activeTraces.has(m) && !this.completedTraces.has(m));
-
- // the new metrics to emit based on traces ending *now*
- const endedMetricValues = metricsToEnd.flatMap((metric) => [
- metric.count.withValue(1.0),
- metric.time.withValue(now - this.activeTraces.get(metric)!),
- ]);
-
- const allMetricsToEmit = [...valuesToEmit, ...endedMetricValues];
- if (allMetricsToEmit.length > 0) {
- this.metricConsumer(allMetricsToEmit);
- }
-
- // the next immutable state
- const nextActiveTraces = new Map([
- ...this.activeTraces,
- ...metricsToStart.map((m): [IMetric, number] => [m, now]),
- ]);
- const nextCompletedTraces = new Set([...this.completedTraces, ...metricsToEnd]);
- return new MetricsTrace(this.metricConsumer, nextActiveTraces, nextCompletedTraces);
- }
-}