@pristine-ts/telemetry 1.0.440 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/cjs/enums/console-tracer-output-mode.enum.js +16 -0
- package/dist/lib/cjs/enums/console-tracer-output-mode.enum.js.map +1 -0
- package/dist/lib/cjs/enums/enums.js +1 -0
- package/dist/lib/cjs/enums/enums.js.map +1 -1
- package/dist/lib/cjs/managers/tracing.manager.js +41 -41
- package/dist/lib/cjs/managers/tracing.manager.js.map +1 -1
- package/dist/lib/cjs/telemetry.configuration-keys.js +26 -0
- package/dist/lib/cjs/telemetry.configuration-keys.js.map +1 -0
- package/dist/lib/cjs/telemetry.module.js +90 -0
- package/dist/lib/cjs/telemetry.module.js.map +1 -1
- package/dist/lib/cjs/tracers/console.tracer.js +106 -0
- package/dist/lib/cjs/tracers/console.tracer.js.map +1 -0
- package/dist/lib/cjs/tracers/file.tracer.js +161 -0
- package/dist/lib/cjs/tracers/file.tracer.js.map +1 -0
- package/dist/lib/cjs/tracers/tracers.js +2 -1
- package/dist/lib/cjs/tracers/tracers.js.map +1 -1
- package/dist/lib/cjs/tsconfig.cjs.tsbuildinfo +1 -0
- package/dist/lib/cjs/utils/span-runner.js +81 -0
- package/dist/lib/cjs/utils/span-runner.js.map +1 -0
- package/dist/lib/cjs/utils/trace-renderer.js +128 -0
- package/dist/lib/cjs/utils/trace-renderer.js.map +1 -0
- package/dist/lib/cjs/utils/utils.js +19 -0
- package/dist/lib/cjs/utils/utils.js.map +1 -0
- package/dist/lib/esm/enums/console-tracer-output-mode.enum.js +13 -0
- package/dist/lib/esm/enums/console-tracer-output-mode.enum.js.map +1 -0
- package/dist/lib/esm/enums/enums.js +1 -0
- package/dist/lib/esm/enums/enums.js.map +1 -1
- package/dist/lib/esm/managers/tracing.manager.js +42 -42
- package/dist/lib/esm/managers/tracing.manager.js.map +1 -1
- package/dist/lib/esm/telemetry.configuration-keys.js +23 -0
- package/dist/lib/esm/telemetry.configuration-keys.js.map +1 -0
- package/dist/lib/esm/telemetry.module.js +91 -1
- package/dist/lib/esm/telemetry.module.js.map +1 -1
- package/dist/lib/esm/tracers/console.tracer.js +103 -0
- package/dist/lib/esm/tracers/console.tracer.js.map +1 -0
- package/dist/lib/esm/tracers/file.tracer.js +125 -0
- package/dist/lib/esm/tracers/file.tracer.js.map +1 -0
- package/dist/lib/esm/tracers/tracers.js +2 -1
- package/dist/lib/esm/tracers/tracers.js.map +1 -1
- package/dist/lib/esm/tsconfig.tsbuildinfo +1 -0
- package/dist/lib/esm/utils/span-runner.js +77 -0
- package/dist/lib/esm/utils/span-runner.js.map +1 -0
- package/dist/lib/esm/utils/trace-renderer.js +124 -0
- package/dist/lib/esm/utils/trace-renderer.js.map +1 -0
- package/dist/lib/esm/utils/utils.js +3 -0
- package/dist/lib/esm/utils/utils.js.map +1 -0
- package/dist/types/enums/console-tracer-output-mode.enum.d.ts +11 -0
- package/dist/types/enums/enums.d.ts +1 -0
- package/dist/types/managers/tracing.manager.d.ts +3 -1
- package/dist/types/telemetry.configuration-keys.d.ts +48 -0
- package/dist/types/telemetry.module.d.ts +2 -0
- package/dist/types/tracers/console.tracer.d.ts +28 -0
- package/dist/types/tracers/file.tracer.d.ts +34 -0
- package/dist/types/tracers/tracers.d.ts +2 -1
- package/dist/types/utils/span-runner.d.ts +59 -0
- package/dist/types/utils/trace-renderer.d.ts +41 -0
- package/dist/types/utils/utils.d.ts +2 -0
- package/package.json +4 -4
- package/dist/lib/cjs/tracers/basic.tracer.js +0 -50
- package/dist/lib/cjs/tracers/basic.tracer.js.map +0 -1
- package/dist/lib/esm/tracers/basic.tracer.js +0 -47
- package/dist/lib/esm/tracers/basic.tracer.js.map +0 -1
- package/dist/types/tracers/basic.tracer.d.ts +0 -12
|
@@ -11,9 +11,10 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
11
11
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
12
|
};
|
|
13
13
|
import { inject, injectable, injectAll, singleton } from "tsyringe";
|
|
14
|
+
import { TelemetryConfigurationKeys } from "../telemetry.configuration-keys";
|
|
14
15
|
import { Trace } from "../models/trace.model";
|
|
15
16
|
import { Span } from "../models/span.model";
|
|
16
|
-
import { moduleScoped, ServiceDefinitionTagEnum, tag, TracingContext } from "@pristine-ts/common";
|
|
17
|
+
import { injectConfig, moduleScoped, ServiceDefinitionTagEnum, tag, TracingContext } from "@pristine-ts/common";
|
|
17
18
|
import { SpanKeynameEnum } from "../enums/span-keyname.enum";
|
|
18
19
|
import { TelemetryModuleKeyname } from "../telemetry.module.keyname";
|
|
19
20
|
/**
|
|
@@ -89,43 +90,55 @@ let TracingManager = class TracingManager {
|
|
|
89
90
|
*/
|
|
90
91
|
startSpan(keyname, parentKeyname, parentId, context) {
|
|
91
92
|
var _a;
|
|
92
|
-
//
|
|
93
|
+
// Make sure a trace exists. `startTracing` is the canonical entry point, but a direct
|
|
94
|
+
// `startSpan` call (e.g. from project code) should auto-start a trace rather than fail.
|
|
93
95
|
if (this.trace === undefined) {
|
|
94
96
|
this.startTracing(SpanKeynameEnum.RootExecution, undefined, context);
|
|
95
97
|
}
|
|
96
|
-
//
|
|
97
|
-
|
|
98
|
+
// Construct the span. NOTE the third constructor argument: `Span(keyname, id?, context?)`.
|
|
99
|
+
// A previous version of this code passed `context` in the `id` slot, which corrupted span
|
|
100
|
+
// identities and broke parent-by-id lookup at line 133 silently. Always pass `undefined`
|
|
101
|
+
// for the id so a fresh UUID is generated, and put context in the third slot.
|
|
102
|
+
const span = new Span(keyname, undefined, context);
|
|
103
|
+
// Defensive: tracing must never throw. If the trace is somehow still undefined here
|
|
104
|
+
// (an exception inside `startTracing` that we swallowed and logged), return the bare
|
|
105
|
+
// span so the caller can still call `.end()` on it without exploding.
|
|
98
106
|
if (this.trace === undefined) {
|
|
99
|
-
this.loghandler.error("
|
|
100
|
-
return span;
|
|
107
|
+
this.loghandler.error("Trace is undefined after startTracing; returning unattached span.", { span });
|
|
108
|
+
return span;
|
|
101
109
|
}
|
|
102
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
103
110
|
span.trace = this.trace;
|
|
104
|
-
//
|
|
105
|
-
//
|
|
111
|
+
// Resolve the parent span. The default parent is the trace's rootSpan, but we may not
|
|
112
|
+
// have one if the trace was started via a path that didn't set it (programming error
|
|
113
|
+
// upstream, but we tolerate it). When no rootSpan exists, attach the new span as a
|
|
114
|
+
// top-level orphan and warn-log once instead of crashing.
|
|
106
115
|
let parentSpan = this.trace.rootSpan;
|
|
107
|
-
// Check to find the parentKeyname in our internal map of spans. If n ot, the rootSpan will be the parent since every span
|
|
108
|
-
// needs at least one parent.
|
|
109
116
|
if (parentKeyname) {
|
|
110
117
|
const parentSpans = this.spans[parentKeyname];
|
|
111
|
-
// If multiple spans have the same keyname we need an id to find the parent
|
|
112
118
|
if (parentSpans) {
|
|
113
119
|
if (parentSpans.length > 1) {
|
|
114
|
-
if (
|
|
115
|
-
//this.loghandler.error("Error finding the parent span, there are multiple spans with that keyname and no id is provided.", {parentKeyname});
|
|
116
|
-
}
|
|
117
|
-
else {
|
|
120
|
+
if (parentId) {
|
|
118
121
|
parentSpan = (_a = parentSpans.find(span => span.id === parentId)) !== null && _a !== void 0 ? _a : parentSpan;
|
|
119
122
|
}
|
|
123
|
+
// If multiple parents exist with the same keyname and no id was provided, fall back
|
|
124
|
+
// to the existing default (rootSpan or whatever parentSpan was) — silent rather
|
|
125
|
+
// than noisy because this is recoverable.
|
|
120
126
|
}
|
|
121
127
|
else if (parentSpans.length === 1) {
|
|
122
|
-
// If only one span has the keyname we can use it
|
|
123
128
|
parentSpan = parentSpans[0];
|
|
124
129
|
}
|
|
125
130
|
}
|
|
126
131
|
}
|
|
127
|
-
|
|
128
|
-
|
|
132
|
+
if (parentSpan === undefined) {
|
|
133
|
+
this.loghandler.warning("startSpan: no parent span available (rootSpan is undefined). Attaching as orphan.", {
|
|
134
|
+
keyname,
|
|
135
|
+
parentKeyname,
|
|
136
|
+
traceId: this.trace.id,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
parentSpan.addChild(span);
|
|
141
|
+
}
|
|
129
142
|
this.addSpan(span);
|
|
130
143
|
return span;
|
|
131
144
|
}
|
|
@@ -134,18 +147,14 @@ let TracingManager = class TracingManager {
|
|
|
134
147
|
* @param span The span to add.
|
|
135
148
|
*/
|
|
136
149
|
addSpan(span) {
|
|
137
|
-
//
|
|
150
|
+
// Tracing must never throw. If there's no active trace, log and return the span
|
|
151
|
+
// unchanged — caller can still call `.end()` on it because Span.end uses optional
|
|
152
|
+
// chaining on tracingManager.
|
|
138
153
|
if (this.trace === undefined) {
|
|
139
154
|
this.loghandler.error("You cannot call 'addSpan' without having an existing Trace.", { span });
|
|
140
155
|
return span;
|
|
141
156
|
}
|
|
142
|
-
// Assign the tracing manager and the current trace to the span.
|
|
143
157
|
span.tracingManager = this;
|
|
144
|
-
if (this.trace === undefined) {
|
|
145
|
-
this.loghandler.error("The trace should not be undefined at this point.");
|
|
146
|
-
return span; // Return because tracing should not throw.
|
|
147
|
-
}
|
|
148
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
149
158
|
span.trace = this.trace;
|
|
150
159
|
// Add it to the map of spans
|
|
151
160
|
if (!this.spans[span.keyname]) {
|
|
@@ -240,23 +249,14 @@ let TracingManager = class TracingManager {
|
|
|
240
249
|
if (this.isActive === false) {
|
|
241
250
|
return;
|
|
242
251
|
}
|
|
243
|
-
// Notify
|
|
252
|
+
// Notify every registered tracer that the trace ended. The tracers handle their own
|
|
253
|
+
// formatting + transport (console pretty-print, file dump, X-Ray export, etc.). The
|
|
254
|
+
// manager itself no longer logs a summary here — `ConsoleTracer` produces a richer
|
|
255
|
+
// tree-formatted output when the user opts into it.
|
|
244
256
|
this.tracers.forEach((tracer) => {
|
|
245
257
|
var _a;
|
|
246
258
|
(_a = tracer.traceEndedStream) === null || _a === void 0 ? void 0 : _a.push(this.trace);
|
|
247
259
|
});
|
|
248
|
-
// Trace time
|
|
249
|
-
// Top 5 longest spans
|
|
250
|
-
const longestSpans = Object.values(this.spans).flat(2).sort((a, b) => b.getDuration() - a.getDuration());
|
|
251
|
-
longestSpans.splice(5);
|
|
252
|
-
this.loghandler.debug("Ending the trace. \n" +
|
|
253
|
-
"Trace duration: " + this.trace.getDuration() + " ms \n" +
|
|
254
|
-
"Top 5 longest spans: \n" + longestSpans.map(span => "\t" + span.getDuration() + " ms - " + span.keyname).join("\n"), {
|
|
255
|
-
extra: {
|
|
256
|
-
trace: this.trace,
|
|
257
|
-
},
|
|
258
|
-
eventId: this.trace.id,
|
|
259
|
-
});
|
|
260
260
|
}
|
|
261
261
|
};
|
|
262
262
|
TracingManager = __decorate([
|
|
@@ -264,10 +264,10 @@ TracingManager = __decorate([
|
|
|
264
264
|
tag("TracingManagerInterface"),
|
|
265
265
|
singleton(),
|
|
266
266
|
injectable(),
|
|
267
|
-
__param(0, injectAll(ServiceDefinitionTagEnum.Tracer)),
|
|
267
|
+
__param(0, injectAll(ServiceDefinitionTagEnum.Tracer, { isOptional: true })),
|
|
268
268
|
__param(1, inject("LogHandlerInterface")),
|
|
269
|
-
__param(2,
|
|
270
|
-
__param(3,
|
|
269
|
+
__param(2, injectConfig(TelemetryConfigurationKeys.Active)),
|
|
270
|
+
__param(3, injectConfig(TelemetryConfigurationKeys.Debug)),
|
|
271
271
|
__metadata("design:paramtypes", [Array, Object, Boolean, Boolean, TracingContext])
|
|
272
272
|
], TracingManager);
|
|
273
273
|
export { TracingManager };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracing.manager.js","sourceRoot":"","sources":["../../../../src/managers/tracing.manager.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAC,MAAM,UAAU,CAAC;AAClE,OAAO,EAAC,KAAK,EAAC,MAAM,uBAAuB,CAAC;AAC5C,OAAO,EAAC,IAAI,EAAC,MAAM,sBAAsB,CAAC;AAE1C,OAAO,EAAC,YAAY,EAAE,wBAAwB,EAAE,GAAG,EAAE,cAAc,EAAC,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"tracing.manager.js","sourceRoot":"","sources":["../../../../src/managers/tracing.manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed configuration keys for `@pristine-ts/telemetry`. Use these constants with `@injectConfig`
|
|
3
|
+
* for autocomplete + rename safety, instead of typing the parameter name as a string.
|
|
4
|
+
*
|
|
5
|
+
* ```ts
|
|
6
|
+
* import {injectConfig} from "@pristine-ts/common";
|
|
7
|
+
* import {TelemetryConfigurationKeys} from "@pristine-ts/telemetry";
|
|
8
|
+
*
|
|
9
|
+
* constructor(@injectConfig(TelemetryConfigurationKeys.Active) value: ...) {}
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
export const TelemetryConfigurationKeys = {
|
|
13
|
+
Active: "pristine.telemetry.active",
|
|
14
|
+
Debug: "pristine.telemetry.debug",
|
|
15
|
+
ConsoleTracerActivated: "pristine.telemetry.console-tracer.activated",
|
|
16
|
+
ConsoleTracerOutputMode: "pristine.telemetry.console-tracer.output-mode",
|
|
17
|
+
ConsoleTracerMinimumDurationMs: "pristine.telemetry.console-tracer.minimum-duration-ms",
|
|
18
|
+
FileTracerActivated: "pristine.telemetry.file-tracer.activated",
|
|
19
|
+
FileTracerOutputMode: "pristine.telemetry.file-tracer.output-mode",
|
|
20
|
+
FileTracerDirectory: "pristine.telemetry.file-tracer.directory",
|
|
21
|
+
FileTracerFilenamePattern: "pristine.telemetry.file-tracer.filename-pattern",
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=telemetry.configuration-keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.configuration-keys.js","sourceRoot":"","sources":["../../../src/telemetry.configuration-keys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,MAAM,EAAE,2BAA2B;IACnC,KAAK,EAAE,0BAA0B;IACjC,sBAAsB,EAAE,6CAA6C;IACrE,uBAAuB,EAAE,+CAA+C;IACxE,8BAA8B,EAAE,uDAAuD;IACvF,mBAAmB,EAAE,0CAA0C;IAC/D,oBAAoB,EAAE,4CAA4C;IAClE,mBAAmB,EAAE,0CAA0C;IAC/D,yBAAyB,EAAE,iDAAiD;CACpE,CAAC"}
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import { CommonModule } from "@pristine-ts/common";
|
|
2
2
|
import { TelemetryModuleKeyname } from "./telemetry.module.keyname";
|
|
3
3
|
import { LoggingModule } from "@pristine-ts/logging";
|
|
4
|
-
import { BooleanResolver, EnvironmentVariableResolver } from "@pristine-ts/configuration";
|
|
4
|
+
import { BooleanResolver, EnumResolver, EnvironmentVariableResolver, NumberResolver } from "@pristine-ts/configuration";
|
|
5
|
+
import { ConsoleTracerOutputModeEnum } from "./enums/console-tracer-output-mode.enum";
|
|
5
6
|
export * from "./enums/enums";
|
|
6
7
|
export * from "./interfaces/interfaces";
|
|
7
8
|
export * from "./managers/managers";
|
|
8
9
|
export * from "./models/models";
|
|
9
10
|
export * from "./tracers/tracers";
|
|
11
|
+
export * from "./utils/utils";
|
|
12
|
+
export * from "./telemetry.configuration-keys";
|
|
10
13
|
export const TelemetryModule = {
|
|
11
14
|
keyname: TelemetryModuleKeyname,
|
|
12
15
|
importModules: [
|
|
@@ -37,6 +40,93 @@ export const TelemetryModule = {
|
|
|
37
40
|
defaultResolvers: [
|
|
38
41
|
new BooleanResolver(new EnvironmentVariableResolver("PRISTINE_TRACING_DEBUG")),
|
|
39
42
|
]
|
|
43
|
+
},
|
|
44
|
+
/**
|
|
45
|
+
* Whether `ConsoleTracer` should print completed traces to stdout. Off by default —
|
|
46
|
+
* when on, every trace whose duration exceeds `console-tracer.minimum-duration-ms`
|
|
47
|
+
* is rendered. Best for local development; in production prefer a real backend.
|
|
48
|
+
*/
|
|
49
|
+
{
|
|
50
|
+
parameterName: TelemetryModuleKeyname + ".console-tracer.activated",
|
|
51
|
+
defaultValue: false,
|
|
52
|
+
isRequired: false,
|
|
53
|
+
defaultResolvers: [
|
|
54
|
+
new BooleanResolver(new EnvironmentVariableResolver("PRISTINE_TELEMETRY_CONSOLE_TRACER_ACTIVATED")),
|
|
55
|
+
]
|
|
56
|
+
},
|
|
57
|
+
/**
|
|
58
|
+
* Output format for `ConsoleTracer`. See `ConsoleTracerOutputModeEnum`.
|
|
59
|
+
*/
|
|
60
|
+
{
|
|
61
|
+
parameterName: TelemetryModuleKeyname + ".console-tracer.output-mode",
|
|
62
|
+
defaultValue: ConsoleTracerOutputModeEnum.Tree,
|
|
63
|
+
isRequired: false,
|
|
64
|
+
defaultResolvers: [
|
|
65
|
+
new EnumResolver(new EnvironmentVariableResolver("PRISTINE_TELEMETRY_CONSOLE_TRACER_OUTPUT_MODE"), ConsoleTracerOutputModeEnum),
|
|
66
|
+
]
|
|
67
|
+
},
|
|
68
|
+
/**
|
|
69
|
+
* Skip rendering traces shorter than this many milliseconds. Useful when most requests
|
|
70
|
+
* are fast and you only want to see the slow outliers. `0` means render everything.
|
|
71
|
+
*/
|
|
72
|
+
{
|
|
73
|
+
parameterName: TelemetryModuleKeyname + ".console-tracer.minimum-duration-ms",
|
|
74
|
+
defaultValue: 0,
|
|
75
|
+
isRequired: false,
|
|
76
|
+
defaultResolvers: [
|
|
77
|
+
new NumberResolver(new EnvironmentVariableResolver("PRISTINE_TELEMETRY_CONSOLE_TRACER_MINIMUM_DURATION_MS")),
|
|
78
|
+
]
|
|
79
|
+
},
|
|
80
|
+
/**
|
|
81
|
+
* Whether `FileTracer` should write completed traces to disk. Off by default. When on,
|
|
82
|
+
* one file per trace is written to `directory` using `filename-pattern`.
|
|
83
|
+
*/
|
|
84
|
+
{
|
|
85
|
+
parameterName: TelemetryModuleKeyname + ".file-tracer.activated",
|
|
86
|
+
defaultValue: false,
|
|
87
|
+
isRequired: false,
|
|
88
|
+
defaultResolvers: [
|
|
89
|
+
new BooleanResolver(new EnvironmentVariableResolver("PRISTINE_TELEMETRY_FILE_TRACER_ACTIVATED")),
|
|
90
|
+
]
|
|
91
|
+
},
|
|
92
|
+
/**
|
|
93
|
+
* Output format for `FileTracer`. Reuses the same enum as `ConsoleTracer` — `json`
|
|
94
|
+
* is the practical default for files since it's machine-readable.
|
|
95
|
+
*/
|
|
96
|
+
{
|
|
97
|
+
parameterName: TelemetryModuleKeyname + ".file-tracer.output-mode",
|
|
98
|
+
defaultValue: ConsoleTracerOutputModeEnum.Json,
|
|
99
|
+
isRequired: false,
|
|
100
|
+
defaultResolvers: [
|
|
101
|
+
new EnumResolver(new EnvironmentVariableResolver("PRISTINE_TELEMETRY_FILE_TRACER_OUTPUT_MODE"), ConsoleTracerOutputModeEnum),
|
|
102
|
+
]
|
|
103
|
+
},
|
|
104
|
+
/**
|
|
105
|
+
* Directory where `FileTracer` writes trace files. Resolved relative to `process.cwd()`
|
|
106
|
+
* if not absolute. The directory is created on demand if it doesn't exist.
|
|
107
|
+
*/
|
|
108
|
+
{
|
|
109
|
+
parameterName: TelemetryModuleKeyname + ".file-tracer.directory",
|
|
110
|
+
defaultValue: "./traces",
|
|
111
|
+
isRequired: false,
|
|
112
|
+
defaultResolvers: [
|
|
113
|
+
new EnvironmentVariableResolver("PRISTINE_TELEMETRY_FILE_TRACER_DIRECTORY"),
|
|
114
|
+
]
|
|
115
|
+
},
|
|
116
|
+
/**
|
|
117
|
+
* Filename pattern for `FileTracer`. Supports the placeholders:
|
|
118
|
+
* - `<traceId>` — the trace's UUID (also used as the eventId throughout Pristine)
|
|
119
|
+
* - `<date>` — UTC date as `YYYY-MM-DD`
|
|
120
|
+
* - `<timestamp>` — milliseconds since epoch at the moment the trace ended
|
|
121
|
+
* Default: `<traceId>.json` (or `.txt` if you change the output mode away from json).
|
|
122
|
+
*/
|
|
123
|
+
{
|
|
124
|
+
parameterName: TelemetryModuleKeyname + ".file-tracer.filename-pattern",
|
|
125
|
+
defaultValue: "<traceId>.json",
|
|
126
|
+
isRequired: false,
|
|
127
|
+
defaultResolvers: [
|
|
128
|
+
new EnvironmentVariableResolver("PRISTINE_TELEMETRY_FILE_TRACER_FILENAME_PATTERN"),
|
|
129
|
+
]
|
|
40
130
|
}
|
|
41
131
|
]
|
|
42
132
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.module.js","sourceRoot":"","sources":["../../../src/telemetry.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAkB,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAC,sBAAsB,EAAC,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAC,aAAa,EAAC,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAC,eAAe,EAAE,2BAA2B,EAAC,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"telemetry.module.js","sourceRoot":"","sources":["../../../src/telemetry.module.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
+
};
|
|
13
|
+
import { inject, injectable, singleton } from "tsyringe";
|
|
14
|
+
import { Readable } from "stream";
|
|
15
|
+
import { injectConfig, moduleScoped, ServiceDefinitionTagEnum, tag } from "@pristine-ts/common";
|
|
16
|
+
import { ConsoleTracerOutputModeEnum } from "../enums/console-tracer-output-mode.enum";
|
|
17
|
+
import { TelemetryConfigurationKeys } from "../telemetry.configuration-keys";
|
|
18
|
+
import { TelemetryModuleKeyname } from "../telemetry.module.keyname";
|
|
19
|
+
import { traceRenderer } from "../utils/trace-renderer";
|
|
20
|
+
/**
|
|
21
|
+
* `ConsoleTracer` prints a completed trace to stdout when the trace ends. Its main purpose
|
|
22
|
+
* is **developer-readable feedback during local development**: see what spans ran, in what
|
|
23
|
+
* order, and which one was the bottleneck — without wiring up an external tracing backend.
|
|
24
|
+
*
|
|
25
|
+
* Off by default. Enable via `pristine.telemetry.console-tracer.activated = true` (or
|
|
26
|
+
* `PRISTINE_TELEMETRY_CONSOLE_TRACER_ACTIVATED=true`). Three output modes:
|
|
27
|
+
* - `tree` (default): indented ASCII tree, durations right-aligned, slowest leaf flagged.
|
|
28
|
+
* - `json`: pretty-printed JSON dump.
|
|
29
|
+
* - `flat`: one line per span, no indentation, start-time-sorted.
|
|
30
|
+
*
|
|
31
|
+
* Crash-isolated: a throw inside the formatting code becomes a stderr line, never an
|
|
32
|
+
* unhandled error or process crash.
|
|
33
|
+
*/
|
|
34
|
+
let ConsoleTracer = class ConsoleTracer {
|
|
35
|
+
constructor(activated, outputMode, minimumDurationMs, logHandler) {
|
|
36
|
+
this.activated = activated;
|
|
37
|
+
this.outputMode = outputMode;
|
|
38
|
+
this.minimumDurationMs = minimumDurationMs;
|
|
39
|
+
this.logHandler = logHandler;
|
|
40
|
+
this.traceEndedStream = new Readable({
|
|
41
|
+
objectMode: true,
|
|
42
|
+
read(_size) { return true; },
|
|
43
|
+
});
|
|
44
|
+
this.traceEndedStream.on("data", (trace) => {
|
|
45
|
+
try {
|
|
46
|
+
this.handleTraceEnded(trace);
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
this.reportFailure(error);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
this.traceEndedStream.on("error", (error) => {
|
|
53
|
+
this.reportFailure(error);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
handleTraceEnded(trace) {
|
|
57
|
+
if (this.activated === false) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
if (trace.getDuration() < this.minimumDurationMs) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
let output;
|
|
64
|
+
switch (this.outputMode) {
|
|
65
|
+
case ConsoleTracerOutputModeEnum.Json:
|
|
66
|
+
output = traceRenderer.renderJson(trace);
|
|
67
|
+
break;
|
|
68
|
+
case ConsoleTracerOutputModeEnum.Flat:
|
|
69
|
+
output = traceRenderer.renderFlat(trace);
|
|
70
|
+
break;
|
|
71
|
+
case ConsoleTracerOutputModeEnum.Tree:
|
|
72
|
+
default:
|
|
73
|
+
output = traceRenderer.renderTree(trace);
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
// Write directly to stdout. Going through the LogHandler would (a) tag every trace
|
|
77
|
+
// line with severity headers the reader doesn't want, and (b) require the user's log
|
|
78
|
+
// level to be Debug to see anything — defeating the point of opting in.
|
|
79
|
+
process.stdout.write(output + "\n");
|
|
80
|
+
}
|
|
81
|
+
reportFailure(error) {
|
|
82
|
+
const message = error instanceof Error ? `${error.name}: ${error.message}` : String(error);
|
|
83
|
+
try {
|
|
84
|
+
process.stderr.write(`[pristine][tracer:ConsoleTracer] ${message}\n`);
|
|
85
|
+
}
|
|
86
|
+
catch (_a) {
|
|
87
|
+
// If stderr is unwritable too, there's nothing useful left to do.
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
ConsoleTracer = __decorate([
|
|
92
|
+
moduleScoped(TelemetryModuleKeyname),
|
|
93
|
+
singleton(),
|
|
94
|
+
tag(ServiceDefinitionTagEnum.Tracer),
|
|
95
|
+
injectable(),
|
|
96
|
+
__param(0, injectConfig(TelemetryConfigurationKeys.ConsoleTracerActivated)),
|
|
97
|
+
__param(1, injectConfig(TelemetryConfigurationKeys.ConsoleTracerOutputMode)),
|
|
98
|
+
__param(2, injectConfig(TelemetryConfigurationKeys.ConsoleTracerMinimumDurationMs)),
|
|
99
|
+
__param(3, inject("LogHandlerInterface")),
|
|
100
|
+
__metadata("design:paramtypes", [Boolean, String, Number, Object])
|
|
101
|
+
], ConsoleTracer);
|
|
102
|
+
export { ConsoleTracer };
|
|
103
|
+
//# sourceMappingURL=console.tracer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console.tracer.js","sourceRoot":"","sources":["../../../../src/tracers/console.tracer.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAC,MAAM,UAAU,CAAC;AACvD,OAAO,EAAC,QAAQ,EAAC,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAC,YAAY,EAAE,YAAY,EAAE,wBAAwB,EAAE,GAAG,EAAC,MAAM,qBAAqB,CAAC;AAI9F,OAAO,EAAC,2BAA2B,EAAC,MAAM,0CAA0C,CAAC;AACrF,OAAO,EAAC,0BAA0B,EAAC,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAC,sBAAsB,EAAC,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAC,aAAa,EAAC,MAAM,yBAAyB,CAAC;AAEtD;;;;;;;;;;;;;GAaG;AAKI,IAAM,aAAa,GAAnB,MAAM,aAAa;IAGxB,YACoF,SAAkB,EACjB,UAAuC,EAChC,iBAAyB,EACnE,UAA+B;QAHG,cAAS,GAAT,SAAS,CAAS;QACjB,eAAU,GAAV,UAAU,CAA6B;QAChC,sBAAiB,GAAjB,iBAAiB,CAAQ;QACnE,eAAU,GAAV,UAAU,CAAqB;QAE/E,IAAI,CAAC,gBAAgB,GAAG,IAAI,QAAQ,CAAC;YACnC,UAAU,EAAE,IAAI;YAChB,IAAI,CAAC,KAAa,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC;SACrC,CAAC,CAAC;QAEH,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAY,EAAE,EAAE;YAChD,IAAI,CAAC;gBACH,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;YAC/B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1C,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,gBAAgB,CAAC,KAAY;QACnC,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;YAC7B,OAAO;QACT,CAAC;QACD,IAAI,KAAK,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACjD,OAAO;QACT,CAAC;QAED,IAAI,MAAc,CAAC;QACnB,QAAQ,IAAI,CAAC,UAAU,EAAE,CAAC;YACxB,KAAK,2BAA2B,CAAC,IAAI;gBACnC,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBACzC,MAAM;YACR,KAAK,2BAA2B,CAAC,IAAI;gBACnC,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBACzC,MAAM;YACR,KAAK,2BAA2B,CAAC,IAAI,CAAC;YACtC;gBACE,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBACzC,MAAM;QACV,CAAC;QAED,mFAAmF;QACnF,qFAAqF;QACrF,wEAAwE;QACxE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACtC,CAAC;IAEO,aAAa,CAAC,KAAc;QAClC,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3F,IAAI,CAAC;YACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,OAAO,IAAI,CAAC,CAAC;QACxE,CAAC;QAAC,WAAM,CAAC;YACP,kEAAkE;QACpE,CAAC;IACH,CAAC;CACF,CAAA;AA/DY,aAAa;IAJzB,YAAY,CAAC,sBAAsB,CAAC;IACpC,SAAS,EAAE;IACX,GAAG,CAAC,wBAAwB,CAAC,MAAM,CAAC;IACpC,UAAU,EAAE;IAKR,WAAA,YAAY,CAAC,0BAA0B,CAAC,sBAAsB,CAAC,CAAA;IAC/D,WAAA,YAAY,CAAC,0BAA0B,CAAC,uBAAuB,CAAC,CAAA;IAChE,WAAA,YAAY,CAAC,0BAA0B,CAAC,8BAA8B,CAAC,CAAA;IACvE,WAAA,MAAM,CAAC,qBAAqB,CAAC,CAAA;;GAPrB,aAAa,CA+DzB"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
+
};
|
|
13
|
+
import * as fs from "fs";
|
|
14
|
+
import * as path from "path";
|
|
15
|
+
import { Readable } from "stream";
|
|
16
|
+
import { inject, injectable, singleton } from "tsyringe";
|
|
17
|
+
import { injectConfig, moduleScoped, ServiceDefinitionTagEnum, tag } from "@pristine-ts/common";
|
|
18
|
+
import { ConsoleTracerOutputModeEnum } from "../enums/console-tracer-output-mode.enum";
|
|
19
|
+
import { TelemetryConfigurationKeys } from "../telemetry.configuration-keys";
|
|
20
|
+
import { TelemetryModuleKeyname } from "../telemetry.module.keyname";
|
|
21
|
+
import { traceRenderer } from "../utils/trace-renderer";
|
|
22
|
+
/**
|
|
23
|
+
* `FileTracer` writes one file per completed trace to a configured directory. Files are
|
|
24
|
+
* named after the trace's id (= eventId throughout Pristine), so locating a request's
|
|
25
|
+
* trace is `cat traces/<eventId>.json`.
|
|
26
|
+
*
|
|
27
|
+
* Off by default. Enable via `pristine.telemetry.file-tracer.activated = true`.
|
|
28
|
+
*
|
|
29
|
+
* Configuration:
|
|
30
|
+
* - `file-tracer.directory` — defaults to `./traces`
|
|
31
|
+
* - `file-tracer.filename-pattern` — defaults to `<traceId>.json`. Placeholders:
|
|
32
|
+
* `<traceId>`, `<date>` (UTC YYYY-MM-DD), `<timestamp>` (ms epoch).
|
|
33
|
+
* - `file-tracer.output-mode` — `json` (default), `tree`, or `flat`.
|
|
34
|
+
*
|
|
35
|
+
* Crash-isolated: a write failure (read-only fs, missing permissions, etc.) becomes a
|
|
36
|
+
* stderr line, never an unhandled error. The framework continues and the next trace is
|
|
37
|
+
* attempted independently.
|
|
38
|
+
*/
|
|
39
|
+
let FileTracer = class FileTracer {
|
|
40
|
+
constructor(activated, outputMode, directory, filenamePattern, logHandler) {
|
|
41
|
+
this.activated = activated;
|
|
42
|
+
this.outputMode = outputMode;
|
|
43
|
+
this.directory = directory;
|
|
44
|
+
this.filenamePattern = filenamePattern;
|
|
45
|
+
this.logHandler = logHandler;
|
|
46
|
+
this.traceEndedStream = new Readable({
|
|
47
|
+
objectMode: true,
|
|
48
|
+
read(_size) { return true; },
|
|
49
|
+
});
|
|
50
|
+
this.traceEndedStream.on("data", (trace) => {
|
|
51
|
+
try {
|
|
52
|
+
this.handleTraceEnded(trace);
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
this.reportFailure(error);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
this.traceEndedStream.on("error", (error) => {
|
|
59
|
+
this.reportFailure(error);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
handleTraceEnded(trace) {
|
|
63
|
+
if (this.activated === false) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const content = this.renderTrace(trace);
|
|
67
|
+
const filename = this.expandFilenamePattern(trace);
|
|
68
|
+
const absoluteDir = path.resolve(process.cwd(), this.directory);
|
|
69
|
+
const absoluteFile = path.join(absoluteDir, filename);
|
|
70
|
+
// Make sure the file's parent directory exists. We mkdir on the file's parent rather
|
|
71
|
+
// than just `absoluteDir` because filename-pattern can introduce subdirectories
|
|
72
|
+
// (e.g. `<date>/<traceId>.json` partitions traces into per-day folders). `recursive:
|
|
73
|
+
// true` is a no-op if the path already exists.
|
|
74
|
+
fs.mkdirSync(path.dirname(absoluteFile), { recursive: true });
|
|
75
|
+
// Write the file. We use `writeFileSync` rather than the async equivalent because the
|
|
76
|
+
// tracer pipeline is synchronous (the framework `.push()`es into the stream and moves
|
|
77
|
+
// on), and a write that returns a Promise would silently leak rejections. The write
|
|
78
|
+
// is small (one trace's worth of JSON, typically <50KB), so the sync cost is bounded.
|
|
79
|
+
fs.writeFileSync(absoluteFile, content);
|
|
80
|
+
}
|
|
81
|
+
renderTrace(trace) {
|
|
82
|
+
switch (this.outputMode) {
|
|
83
|
+
case ConsoleTracerOutputModeEnum.Tree:
|
|
84
|
+
return traceRenderer.renderTree(trace);
|
|
85
|
+
case ConsoleTracerOutputModeEnum.Flat:
|
|
86
|
+
return traceRenderer.renderFlat(trace);
|
|
87
|
+
case ConsoleTracerOutputModeEnum.Json:
|
|
88
|
+
default:
|
|
89
|
+
return traceRenderer.renderJson(trace);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
expandFilenamePattern(trace) {
|
|
93
|
+
var _a, _b;
|
|
94
|
+
const date = new Date((_a = trace.endDate) !== null && _a !== void 0 ? _a : Date.now());
|
|
95
|
+
const isoDate = date.toISOString().slice(0, 10); // YYYY-MM-DD
|
|
96
|
+
const timestamp = String((_b = trace.endDate) !== null && _b !== void 0 ? _b : Date.now());
|
|
97
|
+
return this.filenamePattern
|
|
98
|
+
.replace(/<traceId>/g, trace.id)
|
|
99
|
+
.replace(/<date>/g, isoDate)
|
|
100
|
+
.replace(/<timestamp>/g, timestamp);
|
|
101
|
+
}
|
|
102
|
+
reportFailure(error) {
|
|
103
|
+
const message = error instanceof Error ? `${error.name}: ${error.message}` : String(error);
|
|
104
|
+
try {
|
|
105
|
+
process.stderr.write(`[pristine][tracer:FileTracer] ${message}\n`);
|
|
106
|
+
}
|
|
107
|
+
catch (_a) {
|
|
108
|
+
// If stderr is unwritable too, there's nothing useful left to do.
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
FileTracer = __decorate([
|
|
113
|
+
moduleScoped(TelemetryModuleKeyname),
|
|
114
|
+
singleton(),
|
|
115
|
+
tag(ServiceDefinitionTagEnum.Tracer),
|
|
116
|
+
injectable(),
|
|
117
|
+
__param(0, injectConfig(TelemetryConfigurationKeys.FileTracerActivated)),
|
|
118
|
+
__param(1, injectConfig(TelemetryConfigurationKeys.FileTracerOutputMode)),
|
|
119
|
+
__param(2, injectConfig(TelemetryConfigurationKeys.FileTracerDirectory)),
|
|
120
|
+
__param(3, injectConfig(TelemetryConfigurationKeys.FileTracerFilenamePattern)),
|
|
121
|
+
__param(4, inject("LogHandlerInterface")),
|
|
122
|
+
__metadata("design:paramtypes", [Boolean, String, String, String, Object])
|
|
123
|
+
], FileTracer);
|
|
124
|
+
export { FileTracer };
|
|
125
|
+
//# sourceMappingURL=file.tracer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file.tracer.js","sourceRoot":"","sources":["../../../../src/tracers/file.tracer.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAC,QAAQ,EAAC,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAC,MAAM,UAAU,CAAC;AACvD,OAAO,EAAC,YAAY,EAAE,YAAY,EAAE,wBAAwB,EAAE,GAAG,EAAC,MAAM,qBAAqB,CAAC;AAI9F,OAAO,EAAC,2BAA2B,EAAC,MAAM,0CAA0C,CAAC;AACrF,OAAO,EAAC,0BAA0B,EAAC,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAC,sBAAsB,EAAC,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAC,aAAa,EAAC,MAAM,yBAAyB,CAAC;AAEtD;;;;;;;;;;;;;;;;GAgBG;AAKI,IAAM,UAAU,GAAhB,MAAM,UAAU;IAGrB,YACiF,SAAkB,EACjB,UAAuC,EACxC,SAAiB,EACX,eAAuB,EAC5D,UAA+B;QAJA,cAAS,GAAT,SAAS,CAAS;QACjB,eAAU,GAAV,UAAU,CAA6B;QACxC,cAAS,GAAT,SAAS,CAAQ;QACX,oBAAe,GAAf,eAAe,CAAQ;QAC5D,eAAU,GAAV,UAAU,CAAqB;QAE/E,IAAI,CAAC,gBAAgB,GAAG,IAAI,QAAQ,CAAC;YACnC,UAAU,EAAE,IAAI;YAChB,IAAI,CAAC,KAAa,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC;SACrC,CAAC,CAAC;QAEH,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAY,EAAE,EAAE;YAChD,IAAI,CAAC;gBACH,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;YAC/B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1C,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,gBAAgB,CAAC,KAAY;QACnC,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;YAC7B,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;QACnD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAChE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAEtD,qFAAqF;QACrF,gFAAgF;QAChF,qFAAqF;QACrF,+CAA+C;QAC/C,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;QAE5D,sFAAsF;QACtF,sFAAsF;QACtF,oFAAoF;QACpF,sFAAsF;QACtF,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAEO,WAAW,CAAC,KAAY;QAC9B,QAAQ,IAAI,CAAC,UAAU,EAAE,CAAC;YACxB,KAAK,2BAA2B,CAAC,IAAI;gBACnC,OAAO,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACzC,KAAK,2BAA2B,CAAC,IAAI;gBACnC,OAAO,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACzC,KAAK,2BAA2B,CAAC,IAAI,CAAC;YACtC;gBACE,OAAO,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAEO,qBAAqB,CAAC,KAAY;;QACxC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,MAAA,KAAK,CAAC,OAAO,mCAAI,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAG,aAAa;QAChE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAA,KAAK,CAAC,OAAO,mCAAI,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAEtD,OAAO,IAAI,CAAC,eAAe;aACxB,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC;aAC/B,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC;aAC3B,OAAO,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;IACxC,CAAC;IAEO,aAAa,CAAC,KAAc;QAClC,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3F,IAAI,CAAC;YACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,OAAO,IAAI,CAAC,CAAC;QACrE,CAAC;QAAC,WAAM,CAAC;YACP,kEAAkE;QACpE,CAAC;IACH,CAAC;CACF,CAAA;AAlFY,UAAU;IAJtB,YAAY,CAAC,sBAAsB,CAAC;IACpC,SAAS,EAAE;IACX,GAAG,CAAC,wBAAwB,CAAC,MAAM,CAAC;IACpC,UAAU,EAAE;IAKR,WAAA,YAAY,CAAC,0BAA0B,CAAC,mBAAmB,CAAC,CAAA;IAC5D,WAAA,YAAY,CAAC,0BAA0B,CAAC,oBAAoB,CAAC,CAAA;IAC7D,WAAA,YAAY,CAAC,0BAA0B,CAAC,mBAAmB,CAAC,CAAA;IAC5D,WAAA,YAAY,CAAC,0BAA0B,CAAC,yBAAyB,CAAC,CAAA;IAClE,WAAA,MAAM,CAAC,qBAAqB,CAAC,CAAA;;GARrB,UAAU,CAkFtB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracers.js","sourceRoot":"","sources":["../../../../src/tracers/tracers.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"tracers.js","sourceRoot":"","sources":["../../../../src/tracers/tracers.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC"}
|