diff options
author | Elizabeth Alexander Hunt <me@liz.coffee> | 2025-05-18 12:24:09 -0700 |
---|---|---|
committer | Elizabeth Alexander Hunt <me@liz.coffee> | 2025-05-18 12:24:09 -0700 |
commit | 9cf3fc0259730b7dcf47b3ab4a04369e39fb4614 (patch) | |
tree | a96d39b4f28d38e327376cbef7ba60dbaa95e111 /u/trace/trace.ts | |
parent | ef51b25e4388cbdf3a27e23d9f1fa381ae20a5ad (diff) | |
download | ci-9cf3fc0259730b7dcf47b3ab4a04369e39fb4614.tar.gz ci-9cf3fc0259730b7dcf47b3ab4a04369e39fb4614.zip |
finish up pengueno
Diffstat (limited to 'u/trace/trace.ts')
-rw-r--r-- | u/trace/trace.ts | 94 |
1 files changed, 65 insertions, 29 deletions
diff --git a/u/trace/trace.ts b/u/trace/trace.ts index 1d3d2d8..72d4eef 100644 --- a/u/trace/trace.ts +++ b/u/trace/trace.ts @@ -1,46 +1,82 @@ import { - type Callable, - type ITraceableMapper, - type ITraceableTuple, - LoggerImpl, + isMetricsTraceSupplier, + type ITrace, + type ITraceWith, LogTrace, type LogTraceSupplier, + MetricsTrace, + type MetricsTraceSupplier, + type MetricValue, TraceableImpl, } from "@emprespresso/pengueno"; export class LogTraceable<T> extends TraceableImpl<T, LogTraceSupplier> { + public static LogTrace = new LogTrace(); static from<T>(t: T) { - return new LogTraceable(t, LogTrace(LoggerImpl)); + return new LogTraceable(t, LogTraceable.LogTrace); } } -export class TraceUtil { - static withFunctionTrace<F extends Callable, T, Trace>( - f: F, - ): ITraceableMapper< - T, - ITraceableTuple<T, Trace>, - Trace - > { - return (t) => [t.item, `[${f.name}]`]; +const getEmbeddedMetricConsumer = + (logTrace: LogTrace) => (metrics: Array<MetricValue>) => + logTrace.addTrace("<metrics>").trace( + JSON.stringify(metrics, null, 2) + "</metrics>", + ); +export class EmbeddedMetricsTraceable<T> + extends TraceableImpl<T, MetricsTraceSupplier> { + public static MetricsTrace = new MetricsTrace( + getEmbeddedMetricConsumer(LogTraceable.LogTrace), + ); + + static from<T>(t: T) { + return new EmbeddedMetricsTraceable( + t, + EmbeddedMetricsTraceable.MetricsTrace, + ); } +} - static withClassTrace<C extends object, T, Trace>( - c: C, - ): ITraceableMapper< - T, - ITraceableTuple<T, Trace>, - Trace - > { - return (t) => [t.item, `[${c.constructor.name}]`]; +export type LogMetricTraceSupplier = ITraceWith< + LogTraceSupplier | MetricsTraceSupplier +>; +export class LogMetricTrace implements ITrace<LogMetricTraceSupplier> { + constructor( + private readonly logTrace: ITrace<LogTraceSupplier>, + private readonly metricsTrace: ITrace<MetricsTraceSupplier>, + ) {} + + public addTrace( + trace: LogTraceSupplier | MetricsTraceSupplier, + ): LogMetricTrace { + if (isMetricsTraceSupplier(trace)) { + this.metricsTrace.addTrace(trace); + return this; + } + this.logTrace.addTrace(trace); + return this; } - static promiseify<T, U, Trace>( - mapper: ITraceableMapper<T, U, Trace>, - ): ITraceableMapper<Promise<T>, Promise<U>, Trace> { - return (traceablePromise) => - traceablePromise.flatMapAsync(async (t) => - t.move(await t.item).map(mapper) - ).item; + public trace(trace: LogTraceSupplier | MetricsTraceSupplier) { + if (isMetricsTraceSupplier(trace)) { + this.metricsTrace.trace(trace); + return this; + } + this.logTrace.trace(trace); + return this; + } +} + +export class LogMetricTraceable<T> + extends TraceableImpl<T, MetricsTraceSupplier | LogTraceSupplier> { + public static LogMetricTrace = new LogMetricTrace( + LogTraceable.LogTrace, + EmbeddedMetricsTraceable.MetricsTrace, + ); + + static from<T>(t: T) { + return new LogMetricTraceable( + t, + LogMetricTraceable.LogMetricTrace, + ); } } |