diff options
Diffstat (limited to 'u/trace/metrics.ts')
-rw-r--r-- | u/trace/metrics.ts | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/u/trace/metrics.ts b/u/trace/metrics.ts index a26ee5d..4ddde06 100644 --- a/u/trace/metrics.ts +++ b/u/trace/metrics.ts @@ -4,6 +4,7 @@ import { type ITraceWith, type Mapper, type SideEffect, + type Supplier, } from "@emprespresso/pengueno"; export enum Unit { @@ -16,10 +17,13 @@ export interface IMetric { readonly time: IEmittableMetric; readonly failure: IMetric; readonly success: IMetric; - readonly _isIMetric: true; + readonly warn: IMetric; + readonly children: Supplier<Array<IMetric>>; + + readonly _tag: "IMetric"; } export const isIMetric = (t: unknown): t is IMetric => - isObject(t) && "_isIMetric" in t; + isObject(t) && "_tag" in t && t._tag === "IMetric"; export interface IEmittableMetric { readonly name: string; @@ -35,9 +39,9 @@ export class EmittableMetric implements IEmittableMetric { return { name: this.name, unit: this.unit, - _isMetricValue: true as true, emissionTimestamp: Date.now(), value, + _tag: "MetricValue", }; } } @@ -48,15 +52,21 @@ export class Metric implements IMetric { public readonly time: IEmittableMetric, public readonly failure: Metric, public readonly success: Metric, - public readonly _isIMetric: true = true, + public readonly warn: Metric, + public readonly _tag: "IMetric" = "IMetric", ) {} + public children() { + return [this.failure, this.success, this.warn]; + } + static fromName(name: string): Metric { return new Metric( new EmittableMetric(`${name}.count`, Unit.COUNT), new EmittableMetric(`${name}.elapsed`, Unit.MILLISECONDS), Metric.fromName(`${name}.failure`), Metric.fromName(`${name}.success`), + Metric.fromName(`${name}.warn`), ); } } @@ -66,10 +76,10 @@ export interface MetricValue { readonly unit: Unit; readonly value: number; readonly emissionTimestamp: number; - readonly _isMetricValue: true; + readonly _tag: "MetricValue"; } export const isMetricValue = (t: unknown): t is MetricValue => - isObject(t) && "_isMetricValue" in t; + isObject(t) && "_tag" in t && t._tag === "MetricValue"; export const isMetricsTraceSupplier = (t: unknown): t is MetricsTraceSupplier => isMetricValue(t) || isIMetric(t); @@ -98,7 +108,7 @@ export class MetricsTrace implements ITrace<MetricsTraceSupplier> { const foundMetricValues = this.tracing.flatMap(( [tracing, startedTracing], ) => - [tracing, tracing.success, tracing.failure] + [tracing, ...tracing.children()] .filter((_tracing) => metric === _tracing) .flatMap((metric) => [ this.addMetric(metric, startedTracing), |