@pristine-ts/telemetry 2.0.1 → 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 +38 -39
- package/dist/lib/cjs/managers/tracing.manager.js.map +1 -1
- package/dist/lib/cjs/telemetry.configuration-keys.js +7 -0
- package/dist/lib/cjs/telemetry.configuration-keys.js.map +1 -1
- package/dist/lib/cjs/telemetry.module.js +89 -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 -1
- 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 +38 -39
- package/dist/lib/esm/managers/tracing.manager.js.map +1 -1
- package/dist/lib/esm/telemetry.configuration-keys.js +7 -0
- package/dist/lib/esm/telemetry.configuration-keys.js.map +1 -1
- package/dist/lib/esm/telemetry.module.js +90 -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 -1
- 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 +15 -0
- package/dist/types/telemetry.module.d.ts +1 -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
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.traceRenderer = exports.TraceRenderer = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Pure-function renderers for `Trace` objects. Used by both `ConsoleTracer` (writes to
|
|
6
|
+
* stdout) and `FileTracer` (writes to disk) so the visual output is identical regardless
|
|
7
|
+
* of destination. All methods are stateless — instantiate once and reuse, or use the
|
|
8
|
+
* exported singleton `traceRenderer` if you don't care.
|
|
9
|
+
*/
|
|
10
|
+
class TraceRenderer {
|
|
11
|
+
/**
|
|
12
|
+
* Indented ASCII tree mirroring the span hierarchy. Right-aligned durations, slowest
|
|
13
|
+
* leaf span flagged as `← bottleneck`. Best for human readers.
|
|
14
|
+
*
|
|
15
|
+
* Internal/parent spans are skipped for bottleneck detection on purpose: a parent's
|
|
16
|
+
* duration is the sum of its children's work, so it would always dwarf any single
|
|
17
|
+
* leaf and the flag would never highlight where the actual time was spent.
|
|
18
|
+
*/
|
|
19
|
+
renderTree(trace) {
|
|
20
|
+
const lines = [];
|
|
21
|
+
lines.push(`Trace ${trace.id} — ${trace.getDuration()}ms`);
|
|
22
|
+
if (trace.rootSpan === undefined) {
|
|
23
|
+
lines.push(" (no rootSpan)");
|
|
24
|
+
return lines.join("\n");
|
|
25
|
+
}
|
|
26
|
+
// Pre-walk to find the slowest leaf for the bottleneck flag.
|
|
27
|
+
let slowestSpan;
|
|
28
|
+
let slowestDuration = -1;
|
|
29
|
+
this.walkSpans(trace.rootSpan, (s) => {
|
|
30
|
+
if (s.children.length > 0)
|
|
31
|
+
return;
|
|
32
|
+
const d = s.getDuration();
|
|
33
|
+
if (d > slowestDuration) {
|
|
34
|
+
slowestDuration = d;
|
|
35
|
+
slowestSpan = s;
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
const rows = [];
|
|
39
|
+
const renderNode = (span, ancestorIsLast) => {
|
|
40
|
+
const prefix = ancestorIsLast.length === 0
|
|
41
|
+
? ""
|
|
42
|
+
: ancestorIsLast.slice(0, -1).map(isLast => isLast ? " " : "│ ").join("")
|
|
43
|
+
+ (ancestorIsLast[ancestorIsLast.length - 1] ? "└── " : "├── ");
|
|
44
|
+
rows.push({
|
|
45
|
+
prefix,
|
|
46
|
+
name: span.keyname,
|
|
47
|
+
duration: span.getDuration(),
|
|
48
|
+
isBottleneck: span === slowestSpan && slowestDuration > 0,
|
|
49
|
+
});
|
|
50
|
+
span.children.forEach((child, idx) => {
|
|
51
|
+
const isLast = idx === span.children.length - 1;
|
|
52
|
+
renderNode(child, [...ancestorIsLast, isLast]);
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
|
+
renderNode(trace.rootSpan, []);
|
|
56
|
+
// Pad name column so durations line up.
|
|
57
|
+
const nameColumnWidth = Math.max(...rows.map(r => r.prefix.length + r.name.length));
|
|
58
|
+
for (const row of rows) {
|
|
59
|
+
const padding = " ".repeat(Math.max(1, nameColumnWidth - row.prefix.length - row.name.length + 2));
|
|
60
|
+
const durationCell = `${row.duration}ms`.padStart(8);
|
|
61
|
+
const marker = row.isBottleneck ? " ← bottleneck" : "";
|
|
62
|
+
lines.push(`${row.prefix}${row.name}${padding}${durationCell}${marker}`);
|
|
63
|
+
}
|
|
64
|
+
return lines.join("\n");
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* One line per span sorted by start time, no indentation. Best for grep / log
|
|
68
|
+
* aggregation.
|
|
69
|
+
*/
|
|
70
|
+
renderFlat(trace) {
|
|
71
|
+
const lines = [`Trace ${trace.id} — ${trace.getDuration()}ms`];
|
|
72
|
+
const all = [];
|
|
73
|
+
if (trace.rootSpan !== undefined) {
|
|
74
|
+
this.walkSpans(trace.rootSpan, (s) => all.push(s));
|
|
75
|
+
}
|
|
76
|
+
all.sort((a, b) => a.startDate - b.startDate);
|
|
77
|
+
for (const span of all) {
|
|
78
|
+
lines.push(` ${span.keyname.padEnd(48)} ${`${span.getDuration()}ms`.padStart(8)}`);
|
|
79
|
+
}
|
|
80
|
+
return lines.join("\n");
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Pretty-printed JSON dump of the trace + every span. Best for piping into a downstream
|
|
84
|
+
* tool that wants structured access.
|
|
85
|
+
*/
|
|
86
|
+
renderJson(trace) {
|
|
87
|
+
return JSON.stringify(this.serialize(trace), null, 2);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Serializes a trace to a plain JSON-friendly object. Exposed for callers that want to
|
|
91
|
+
* embed the structured form in a larger payload (e.g. a NDJSON line).
|
|
92
|
+
*/
|
|
93
|
+
serialize(trace) {
|
|
94
|
+
return {
|
|
95
|
+
id: trace.id,
|
|
96
|
+
startDate: trace.startDate,
|
|
97
|
+
endDate: trace.endDate,
|
|
98
|
+
duration: trace.getDuration(),
|
|
99
|
+
context: trace.context,
|
|
100
|
+
rootSpan: trace.rootSpan ? this.serializeSpan(trace.rootSpan) : undefined,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
serializeSpan(span) {
|
|
104
|
+
return {
|
|
105
|
+
id: span.id,
|
|
106
|
+
keyname: span.keyname,
|
|
107
|
+
startDate: span.startDate,
|
|
108
|
+
endDate: span.endDate,
|
|
109
|
+
duration: span.getDuration(),
|
|
110
|
+
context: span.context,
|
|
111
|
+
children: span.children.map(s => this.serializeSpan(s)),
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/** Depth-first traversal helper. Visits the root and every descendant once. */
|
|
115
|
+
walkSpans(span, visit) {
|
|
116
|
+
visit(span);
|
|
117
|
+
for (const child of span.children) {
|
|
118
|
+
this.walkSpans(child, visit);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
exports.TraceRenderer = TraceRenderer;
|
|
123
|
+
/**
|
|
124
|
+
* Default singleton. Use this from any caller that doesn't care to construct its own —
|
|
125
|
+
* the class is stateless so sharing is safe.
|
|
126
|
+
*/
|
|
127
|
+
exports.traceRenderer = new TraceRenderer();
|
|
128
|
+
//# sourceMappingURL=trace-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-renderer.js","sourceRoot":"","sources":["../../../../src/utils/trace-renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./span-runner"), exports);
|
|
18
|
+
__exportStar(require("./trace-renderer"), exports);
|
|
19
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/utils/utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,gDAA8B;AAC9B,mDAAiC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How `ConsoleTracer` renders a completed trace.
|
|
3
|
+
*/
|
|
4
|
+
export var ConsoleTracerOutputModeEnum;
|
|
5
|
+
(function (ConsoleTracerOutputModeEnum) {
|
|
6
|
+
/** Indented ASCII tree mirroring the span hierarchy. Best for human readers. */
|
|
7
|
+
ConsoleTracerOutputModeEnum["Tree"] = "tree";
|
|
8
|
+
/** Pretty-printed JSON dump of the trace + every span. Best for piping into a tool. */
|
|
9
|
+
ConsoleTracerOutputModeEnum["Json"] = "json";
|
|
10
|
+
/** One span per line, no indentation, sorted by start time. Best for grep. */
|
|
11
|
+
ConsoleTracerOutputModeEnum["Flat"] = "flat";
|
|
12
|
+
})(ConsoleTracerOutputModeEnum || (ConsoleTracerOutputModeEnum = {}));
|
|
13
|
+
//# sourceMappingURL=console-tracer-output-mode.enum.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console-tracer-output-mode.enum.js","sourceRoot":"","sources":["../../../../src/enums/console-tracer-output-mode.enum.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAN,IAAY,2BAOX;AAPD,WAAY,2BAA2B;IACrC,gFAAgF;IAChF,4CAAa,CAAA;IACb,uFAAuF;IACvF,4CAAa,CAAA;IACb,8EAA8E;IAC9E,4CAAa,CAAA;AACf,CAAC,EAPW,2BAA2B,KAA3B,2BAA2B,QAOtC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enums.js","sourceRoot":"","sources":["../../../../src/enums/enums.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"enums.js","sourceRoot":"","sources":["../../../../src/enums/enums.ts"],"names":[],"mappings":"AAAA,cAAc,mCAAmC,CAAC;AAClD,cAAc,qBAAqB,CAAC"}
|
|
@@ -90,43 +90,55 @@ let TracingManager = class TracingManager {
|
|
|
90
90
|
*/
|
|
91
91
|
startSpan(keyname, parentKeyname, parentId, context) {
|
|
92
92
|
var _a;
|
|
93
|
-
//
|
|
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.
|
|
94
95
|
if (this.trace === undefined) {
|
|
95
96
|
this.startTracing(SpanKeynameEnum.RootExecution, undefined, context);
|
|
96
97
|
}
|
|
97
|
-
//
|
|
98
|
-
|
|
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.
|
|
99
106
|
if (this.trace === undefined) {
|
|
100
|
-
this.loghandler.error("
|
|
101
|
-
return span;
|
|
107
|
+
this.loghandler.error("Trace is undefined after startTracing; returning unattached span.", { span });
|
|
108
|
+
return span;
|
|
102
109
|
}
|
|
103
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
104
110
|
span.trace = this.trace;
|
|
105
|
-
//
|
|
106
|
-
//
|
|
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.
|
|
107
115
|
let parentSpan = this.trace.rootSpan;
|
|
108
|
-
// Check to find the parentKeyname in our internal map of spans. If n ot, the rootSpan will be the parent since every span
|
|
109
|
-
// needs at least one parent.
|
|
110
116
|
if (parentKeyname) {
|
|
111
117
|
const parentSpans = this.spans[parentKeyname];
|
|
112
|
-
// If multiple spans have the same keyname we need an id to find the parent
|
|
113
118
|
if (parentSpans) {
|
|
114
119
|
if (parentSpans.length > 1) {
|
|
115
|
-
if (
|
|
116
|
-
//this.loghandler.error("Error finding the parent span, there are multiple spans with that keyname and no id is provided.", {parentKeyname});
|
|
117
|
-
}
|
|
118
|
-
else {
|
|
120
|
+
if (parentId) {
|
|
119
121
|
parentSpan = (_a = parentSpans.find(span => span.id === parentId)) !== null && _a !== void 0 ? _a : parentSpan;
|
|
120
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.
|
|
121
126
|
}
|
|
122
127
|
else if (parentSpans.length === 1) {
|
|
123
|
-
// If only one span has the keyname we can use it
|
|
124
128
|
parentSpan = parentSpans[0];
|
|
125
129
|
}
|
|
126
130
|
}
|
|
127
131
|
}
|
|
128
|
-
|
|
129
|
-
|
|
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
|
+
}
|
|
130
142
|
this.addSpan(span);
|
|
131
143
|
return span;
|
|
132
144
|
}
|
|
@@ -135,18 +147,14 @@ let TracingManager = class TracingManager {
|
|
|
135
147
|
* @param span The span to add.
|
|
136
148
|
*/
|
|
137
149
|
addSpan(span) {
|
|
138
|
-
//
|
|
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.
|
|
139
153
|
if (this.trace === undefined) {
|
|
140
154
|
this.loghandler.error("You cannot call 'addSpan' without having an existing Trace.", { span });
|
|
141
155
|
return span;
|
|
142
156
|
}
|
|
143
|
-
// Assign the tracing manager and the current trace to the span.
|
|
144
157
|
span.tracingManager = this;
|
|
145
|
-
if (this.trace === undefined) {
|
|
146
|
-
this.loghandler.error("The trace should not be undefined at this point.");
|
|
147
|
-
return span; // Return because tracing should not throw.
|
|
148
|
-
}
|
|
149
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
150
158
|
span.trace = this.trace;
|
|
151
159
|
// Add it to the map of spans
|
|
152
160
|
if (!this.spans[span.keyname]) {
|
|
@@ -241,23 +249,14 @@ let TracingManager = class TracingManager {
|
|
|
241
249
|
if (this.isActive === false) {
|
|
242
250
|
return;
|
|
243
251
|
}
|
|
244
|
-
// 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.
|
|
245
256
|
this.tracers.forEach((tracer) => {
|
|
246
257
|
var _a;
|
|
247
258
|
(_a = tracer.traceEndedStream) === null || _a === void 0 ? void 0 : _a.push(this.trace);
|
|
248
259
|
});
|
|
249
|
-
// Trace time
|
|
250
|
-
// Top 5 longest spans
|
|
251
|
-
const longestSpans = Object.values(this.spans).flat(2).sort((a, b) => b.getDuration() - a.getDuration());
|
|
252
|
-
longestSpans.splice(5);
|
|
253
|
-
this.loghandler.debug("Ending the trace. \n" +
|
|
254
|
-
"Trace duration: " + this.trace.getDuration() + " ms \n" +
|
|
255
|
-
"Top 5 longest spans: \n" + longestSpans.map(span => "\t" + span.getDuration() + " ms - " + span.keyname).join("\n"), {
|
|
256
|
-
extra: {
|
|
257
|
-
trace: this.trace,
|
|
258
|
-
},
|
|
259
|
-
eventId: this.trace.id,
|
|
260
|
-
});
|
|
261
260
|
}
|
|
262
261
|
};
|
|
263
262
|
TracingManager = __decorate([
|
|
@@ -265,7 +264,7 @@ TracingManager = __decorate([
|
|
|
265
264
|
tag("TracingManagerInterface"),
|
|
266
265
|
singleton(),
|
|
267
266
|
injectable(),
|
|
268
|
-
__param(0, injectAll(ServiceDefinitionTagEnum.Tracer)),
|
|
267
|
+
__param(0, injectAll(ServiceDefinitionTagEnum.Tracer, { isOptional: true })),
|
|
269
268
|
__param(1, inject("LogHandlerInterface")),
|
|
270
269
|
__param(2, injectConfig(TelemetryConfigurationKeys.Active)),
|
|
271
270
|
__param(3, injectConfig(TelemetryConfigurationKeys.Debug)),
|
|
@@ -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,0BAA0B,EAAC,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAC,KAAK,EAAC,MAAM,uBAAuB,CAAC;AAC5C,OAAO,EAAC,IAAI,EAAC,MAAM,sBAAsB,CAAC;AAE1C,OAAO,EAAC,YAAY,EAAE,YAAY,EAAE,wBAAwB,EAAE,GAAG,EAAE,cAAc,EAAC,MAAM,qBAAqB,CAAC;AAC9G,OAAO,EAAC,eAAe,EAAC,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAC,sBAAsB,EAAC,MAAM,6BAA6B,CAAC;AAInE;;;;GAIG;AAKI,IAAM,cAAc,GAApB,MAAM,cAAc;IAWzB;;;;;;;;;;OAUG;IACH,
|
|
1
|
+
{"version":3,"file":"tracing.manager.js","sourceRoot":"","sources":["../../../../src/managers/tracing.manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,5 +12,12 @@
|
|
|
12
12
|
export const TelemetryConfigurationKeys = {
|
|
13
13
|
Active: "pristine.telemetry.active",
|
|
14
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",
|
|
15
22
|
};
|
|
16
23
|
//# sourceMappingURL=telemetry.configuration-keys.js.map
|
|
@@ -1 +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;
|
|
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,14 @@
|
|
|
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";
|
|
10
12
|
export * from "./telemetry.configuration-keys";
|
|
11
13
|
export const TelemetryModule = {
|
|
12
14
|
keyname: TelemetryModuleKeyname,
|
|
@@ -38,6 +40,93 @@ export const TelemetryModule = {
|
|
|
38
40
|
defaultResolvers: [
|
|
39
41
|
new BooleanResolver(new EnvironmentVariableResolver("PRISTINE_TRACING_DEBUG")),
|
|
40
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
|
+
]
|
|
41
130
|
}
|
|
42
131
|
]
|
|
43
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":"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"}
|