summaryrefslogtreecommitdiff
path: root/u/trace/metrics.ts
diff options
context:
space:
mode:
Diffstat (limited to 'u/trace/metrics.ts')
-rw-r--r--u/trace/metrics.ts24
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),