summaryrefslogtreecommitdiff
path: root/u/trace
diff options
context:
space:
mode:
Diffstat (limited to 'u/trace')
-rw-r--r--u/trace/metrics.ts24
-rw-r--r--u/trace/trace.ts8
-rw-r--r--u/trace/util.ts14
3 files changed, 33 insertions, 13 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),
diff --git a/u/trace/trace.ts b/u/trace/trace.ts
index 72d4eef..e942066 100644
--- a/u/trace/trace.ts
+++ b/u/trace/trace.ts
@@ -41,18 +41,18 @@ export type LogMetricTraceSupplier = ITraceWith<
>;
export class LogMetricTrace implements ITrace<LogMetricTraceSupplier> {
constructor(
- private readonly logTrace: ITrace<LogTraceSupplier>,
- private readonly metricsTrace: ITrace<MetricsTraceSupplier>,
+ private logTrace: ITrace<LogTraceSupplier>,
+ private metricsTrace: ITrace<MetricsTraceSupplier>,
) {}
public addTrace(
trace: LogTraceSupplier | MetricsTraceSupplier,
): LogMetricTrace {
if (isMetricsTraceSupplier(trace)) {
- this.metricsTrace.addTrace(trace);
+ this.metricsTrace = this.metricsTrace.addTrace(trace);
return this;
}
- this.logTrace.addTrace(trace);
+ this.logTrace = this.logTrace.addTrace(trace);
return this;
}
diff --git a/u/trace/util.ts b/u/trace/util.ts
index dd8fb0d..302c8e4 100644
--- a/u/trace/util.ts
+++ b/u/trace/util.ts
@@ -7,6 +7,16 @@ import type {
} from "@emprespresso/pengueno";
export class TraceUtil {
+ static withTrace<T, Trace>(
+ trace: string,
+ ): ITraceableMapper<
+ T,
+ ITraceableTuple<T, Trace | Array<Trace>>,
+ Trace
+ > {
+ return (t) => [t.get(), `[${trace}]`];
+ }
+
static withMetricTrace<T, Trace extends MetricsTraceSupplier>(
metric: IMetric,
): ITraceableMapper<
@@ -24,7 +34,7 @@ export class TraceUtil {
ITraceableTuple<T, Trace | Array<Trace>>,
Trace
> {
- return (t) => [t.get(), `[${f.name}]`];
+ return TraceUtil.withTrace(f.name);
}
static withClassTrace<C extends object, T, Trace>(
@@ -34,7 +44,7 @@ export class TraceUtil {
ITraceableTuple<T, Trace | Array<Trace>>,
Trace
> {
- return (t) => [t.get(), `[${c.constructor.name}]`];
+ return TraceUtil.withTrace(c.constructor.name);
}
static promiseify<T, U, Trace>(