autotel 2.22.0 → 2.23.0
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/README.md +112 -6
- package/dist/auto.cjs +3 -3
- package/dist/auto.js +2 -2
- package/dist/{chunk-EWH2542B.js → chunk-3AMR5XLZ.js} +3 -3
- package/dist/{chunk-EWH2542B.js.map → chunk-3AMR5XLZ.js.map} +1 -1
- package/dist/chunk-3QXBFGKP.js +344 -0
- package/dist/chunk-3QXBFGKP.js.map +1 -0
- package/dist/{chunk-VQFF2WMP.cjs → chunk-3ZFDJJWZ.cjs} +37 -29
- package/dist/chunk-3ZFDJJWZ.cjs.map +1 -0
- package/dist/{chunk-CQC6RVLR.cjs → chunk-4RZ4JUBY.cjs} +5 -5
- package/dist/{chunk-CQC6RVLR.cjs.map → chunk-4RZ4JUBY.cjs.map} +1 -1
- package/dist/{chunk-PAVYKPCQ.js → chunk-5XUEHX7J.js} +3 -3
- package/dist/{chunk-PAVYKPCQ.js.map → chunk-5XUEHX7J.js.map} +1 -1
- package/dist/chunk-6S5RUKU3.cjs +347 -0
- package/dist/chunk-6S5RUKU3.cjs.map +1 -0
- package/dist/{chunk-BS757SL2.js → chunk-724XLWR3.js} +9 -4
- package/dist/chunk-724XLWR3.js.map +1 -0
- package/dist/chunk-7EQ4G4SI.cjs +146 -0
- package/dist/chunk-7EQ4G4SI.cjs.map +1 -0
- package/dist/{chunk-CQP5SQT4.cjs → chunk-AXFWWJF3.cjs} +7 -7
- package/dist/{chunk-CQP5SQT4.cjs.map → chunk-AXFWWJF3.cjs.map} +1 -1
- package/dist/{chunk-7NH625MS.cjs → chunk-BSZP4URK.cjs} +5 -5
- package/dist/{chunk-7NH625MS.cjs.map → chunk-BSZP4URK.cjs.map} +1 -1
- package/dist/{chunk-GZFH6P5U.js → chunk-GY4CRZSV.js} +14 -6
- package/dist/chunk-GY4CRZSV.js.map +1 -0
- package/dist/{chunk-QKUGUDXJ.cjs → chunk-HSEIUH7F.cjs} +10 -5
- package/dist/chunk-HSEIUH7F.cjs.map +1 -0
- package/dist/{chunk-DTW3WB7Z.js → chunk-IPKXURBW.js} +3 -3
- package/dist/{chunk-DTW3WB7Z.js.map → chunk-IPKXURBW.js.map} +1 -1
- package/dist/chunk-J7VGRIAJ.js +64 -0
- package/dist/chunk-J7VGRIAJ.js.map +1 -0
- package/dist/chunk-KFOHQK7X.js +144 -0
- package/dist/chunk-KFOHQK7X.js.map +1 -0
- package/dist/{chunk-4UYR46UP.cjs → chunk-MSUHW2I4.cjs} +13 -13
- package/dist/{chunk-4UYR46UP.cjs.map → chunk-MSUHW2I4.cjs.map} +1 -1
- package/dist/chunk-T4B5LB6E.cjs +66 -0
- package/dist/chunk-T4B5LB6E.cjs.map +1 -0
- package/dist/{chunk-QHT4MUED.js → chunk-WCIIFRGL.js} +3 -3
- package/dist/{chunk-QHT4MUED.js.map → chunk-WCIIFRGL.js.map} +1 -1
- package/dist/decorators.cjs +3 -3
- package/dist/decorators.js +3 -3
- package/dist/drain-pipeline.cjs +13 -0
- package/dist/drain-pipeline.cjs.map +1 -0
- package/dist/drain-pipeline.d.cts +37 -0
- package/dist/drain-pipeline.d.ts +37 -0
- package/dist/drain-pipeline.js +4 -0
- package/dist/drain-pipeline.js.map +1 -0
- package/dist/event.cjs +6 -6
- package/dist/event.js +3 -3
- package/dist/functional.cjs +10 -10
- package/dist/functional.js +3 -3
- package/dist/index.cjs +256 -41
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +72 -3
- package/dist/index.d.ts +72 -3
- package/dist/index.js +210 -11
- package/dist/index.js.map +1 -1
- package/dist/{init-BMiXSJNM.d.cts → init-BC5aN8bh.d.cts} +18 -0
- package/dist/{init-ByRbNTRo.d.ts → init-_FG4IbhF.d.ts} +18 -0
- package/dist/instrumentation.cjs +9 -9
- package/dist/instrumentation.js +2 -2
- package/dist/messaging.cjs +7 -7
- package/dist/messaging.js +4 -4
- package/dist/parse-error.cjs +13 -0
- package/dist/parse-error.cjs.map +1 -0
- package/dist/parse-error.d.cts +13 -0
- package/dist/parse-error.d.ts +13 -0
- package/dist/parse-error.js +4 -0
- package/dist/parse-error.js.map +1 -0
- package/dist/processors.cjs +2 -2
- package/dist/processors.d.cts +40 -4
- package/dist/processors.d.ts +40 -4
- package/dist/processors.js +1 -1
- package/dist/semantic-helpers.cjs +8 -8
- package/dist/semantic-helpers.js +4 -4
- package/dist/webhook.cjs +4 -4
- package/dist/webhook.js +3 -3
- package/dist/workflow-distributed.cjs +5 -5
- package/dist/workflow-distributed.js +3 -3
- package/dist/workflow.cjs +8 -8
- package/dist/workflow.js +4 -4
- package/dist/yaml-config.d.cts +2 -1
- package/dist/yaml-config.d.ts +2 -1
- package/package.json +11 -1
- package/src/drain-pipeline.test.ts +68 -0
- package/src/drain-pipeline.ts +199 -0
- package/src/flatten-attributes.test.ts +76 -0
- package/src/flatten-attributes.ts +80 -0
- package/src/functional.test.ts +63 -0
- package/src/functional.ts +11 -3
- package/src/index.ts +33 -0
- package/src/init.ts +22 -0
- package/src/parse-error.test.ts +73 -0
- package/src/parse-error.ts +112 -0
- package/src/pretty-log-formatter.test.ts +123 -0
- package/src/pretty-log-formatter.ts +210 -0
- package/src/processors/canonical-log-line-processor.test.ts +81 -25
- package/src/processors/canonical-log-line-processor.ts +130 -42
- package/src/request-logger.test.ts +124 -0
- package/src/request-logger.ts +140 -0
- package/src/structured-error.test.ts +76 -0
- package/src/structured-error.ts +86 -0
- package/dist/chunk-2RQDNGV3.js +0 -126
- package/dist/chunk-2RQDNGV3.js.map +0 -1
- package/dist/chunk-BS757SL2.js.map +0 -1
- package/dist/chunk-GZFH6P5U.js.map +0 -1
- package/dist/chunk-ONK2Y22L.cjs +0 -128
- package/dist/chunk-ONK2Y22L.cjs.map +0 -1
- package/dist/chunk-QKUGUDXJ.cjs.map +0 -1
- package/dist/chunk-VQFF2WMP.cjs.map +0 -1
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
import { logs, SeverityNumber } from '@opentelemetry/api-logs';
|
|
2
|
+
|
|
3
|
+
// src/pretty-log-formatter.ts
|
|
4
|
+
var RESET = "\x1B[0m";
|
|
5
|
+
var DIM = "\x1B[2m";
|
|
6
|
+
var BOLD = "\x1B[1m";
|
|
7
|
+
var RED = "\x1B[31m";
|
|
8
|
+
var YELLOW = "\x1B[33m";
|
|
9
|
+
var GREEN = "\x1B[32m";
|
|
10
|
+
var CYAN = "\x1B[36m";
|
|
11
|
+
var GRAY = "\x1B[90m";
|
|
12
|
+
var LEVEL_COLORS = {
|
|
13
|
+
debug: GRAY,
|
|
14
|
+
info: GREEN,
|
|
15
|
+
warn: YELLOW,
|
|
16
|
+
error: RED
|
|
17
|
+
};
|
|
18
|
+
var SKIP_PREFIXES = [
|
|
19
|
+
"telemetry.",
|
|
20
|
+
"otel.",
|
|
21
|
+
"process.",
|
|
22
|
+
"os.",
|
|
23
|
+
"host.",
|
|
24
|
+
"service.",
|
|
25
|
+
"autotel."
|
|
26
|
+
];
|
|
27
|
+
var SKIP_KEYS = /* @__PURE__ */ new Set([
|
|
28
|
+
"operation",
|
|
29
|
+
"traceId",
|
|
30
|
+
"spanId",
|
|
31
|
+
"correlationId",
|
|
32
|
+
"duration_ms",
|
|
33
|
+
"duration",
|
|
34
|
+
"status_code",
|
|
35
|
+
"status_message",
|
|
36
|
+
"timestamp",
|
|
37
|
+
"http.request.method",
|
|
38
|
+
"url.path",
|
|
39
|
+
"http.route",
|
|
40
|
+
"http.response.status_code"
|
|
41
|
+
]);
|
|
42
|
+
function useColor() {
|
|
43
|
+
if (typeof process !== "undefined") {
|
|
44
|
+
if (process.env.NO_COLOR) return false;
|
|
45
|
+
if (process.env.FORCE_COLOR) return true;
|
|
46
|
+
if (process.stdout?.isTTY) return true;
|
|
47
|
+
}
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
function c(color, text) {
|
|
51
|
+
return useColor() ? `${color}${text}${RESET}` : text;
|
|
52
|
+
}
|
|
53
|
+
function formatDuration(ms) {
|
|
54
|
+
if (ms < 1e3) return `${Math.round(ms)}ms`;
|
|
55
|
+
if (ms < 6e4) {
|
|
56
|
+
const seconds2 = ms / 1e3;
|
|
57
|
+
return seconds2 < 10 ? `${seconds2.toFixed(1)}s` : `${Math.round(seconds2)}s`;
|
|
58
|
+
}
|
|
59
|
+
const minutes = Math.floor(ms / 6e4);
|
|
60
|
+
const seconds = Math.round(ms % 6e4 / 1e3);
|
|
61
|
+
return seconds > 0 ? `${minutes}m ${seconds}s` : `${minutes}m`;
|
|
62
|
+
}
|
|
63
|
+
function formatTime(iso) {
|
|
64
|
+
try {
|
|
65
|
+
const d = new Date(iso);
|
|
66
|
+
return d.toLocaleTimeString("en-GB", { hour12: false });
|
|
67
|
+
} catch {
|
|
68
|
+
return iso.slice(11, 19);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function formatValue(value) {
|
|
72
|
+
if (typeof value === "string") return value;
|
|
73
|
+
if (typeof value === "number" || typeof value === "boolean")
|
|
74
|
+
return String(value);
|
|
75
|
+
if (value == null) return "";
|
|
76
|
+
try {
|
|
77
|
+
return JSON.stringify(value);
|
|
78
|
+
} catch {
|
|
79
|
+
return String(value);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function groupAttributes(event) {
|
|
83
|
+
const tree = {};
|
|
84
|
+
for (const [key, value] of Object.entries(event)) {
|
|
85
|
+
if (SKIP_KEYS.has(key)) continue;
|
|
86
|
+
if (SKIP_PREFIXES.some((p) => key.startsWith(p))) continue;
|
|
87
|
+
if (value == null || value === "") continue;
|
|
88
|
+
const parts = key.split(".");
|
|
89
|
+
if (parts.length === 1) {
|
|
90
|
+
tree[key] = value;
|
|
91
|
+
} else {
|
|
92
|
+
let current = tree;
|
|
93
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
94
|
+
const part = parts[i];
|
|
95
|
+
if (!(part in current) || typeof current[part] !== "object") {
|
|
96
|
+
current[part] = {};
|
|
97
|
+
}
|
|
98
|
+
current = current[part];
|
|
99
|
+
}
|
|
100
|
+
current[parts[parts.length - 1]] = value;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return tree;
|
|
104
|
+
}
|
|
105
|
+
function renderTree(obj, indent, isLast) {
|
|
106
|
+
const lines = [];
|
|
107
|
+
const entries = Object.entries(obj);
|
|
108
|
+
entries.forEach(([key, value], idx) => {
|
|
109
|
+
const last = idx === entries.length - 1;
|
|
110
|
+
const connector = last ? "\u2514\u2500" : "\u251C\u2500";
|
|
111
|
+
const prefix = indent + connector + " ";
|
|
112
|
+
if (value && typeof value === "object" && !Array.isArray(value)) {
|
|
113
|
+
const nested = value;
|
|
114
|
+
const flatValues = Object.entries(nested).filter(
|
|
115
|
+
([, v]) => typeof v !== "object" || v === null
|
|
116
|
+
);
|
|
117
|
+
const nestedObjs = Object.entries(nested).filter(
|
|
118
|
+
([, v]) => typeof v === "object" && v !== null && !Array.isArray(v)
|
|
119
|
+
);
|
|
120
|
+
if (nestedObjs.length === 0) {
|
|
121
|
+
const inline = flatValues.map(([k, v]) => `${c(CYAN, k)}=${formatValue(v)}`).join(" ");
|
|
122
|
+
lines.push(`${prefix}${c(BOLD, key)}: ${inline}`);
|
|
123
|
+
} else {
|
|
124
|
+
lines.push(`${prefix}${c(BOLD, key)}:`);
|
|
125
|
+
const nextIndent = indent + (last ? " " : "\u2502 ");
|
|
126
|
+
lines.push(...renderTree(nested, nextIndent, [...isLast, last]));
|
|
127
|
+
}
|
|
128
|
+
} else {
|
|
129
|
+
lines.push(`${prefix}${c(CYAN, key)}: ${c(DIM, formatValue(value))}`);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
return lines;
|
|
133
|
+
}
|
|
134
|
+
function formatPrettyLogLine(ctx) {
|
|
135
|
+
const { event, level, message } = ctx;
|
|
136
|
+
const timestamp = formatTime(String(event.timestamp ?? ""));
|
|
137
|
+
const service = event["service.name"] || event.service || "";
|
|
138
|
+
const method = event["http.request.method"] || "";
|
|
139
|
+
const path = event["http.route"] || event["url.path"] || "";
|
|
140
|
+
const status = event["http.response.status_code"] || event.status_code || "";
|
|
141
|
+
const durationMs = Number(event.duration_ms ?? 0);
|
|
142
|
+
const duration = formatDuration(durationMs);
|
|
143
|
+
const levelColor = LEVEL_COLORS[level] ?? "";
|
|
144
|
+
const levelStr = c(levelColor, level.toUpperCase().padEnd(5));
|
|
145
|
+
const parts = [c(DIM, timestamp), levelStr];
|
|
146
|
+
if (service) parts.push(c(DIM, `[${service}]`));
|
|
147
|
+
if (method) parts.push(c(BOLD, String(method)));
|
|
148
|
+
if (path) parts.push(String(path));
|
|
149
|
+
if (status) {
|
|
150
|
+
const statusNum = Number(status);
|
|
151
|
+
const statusColor = statusNum >= 500 ? RED : statusNum >= 400 ? YELLOW : GREEN;
|
|
152
|
+
parts.push(c(statusColor, String(status)));
|
|
153
|
+
}
|
|
154
|
+
parts.push(c(DIM, `in ${duration}`));
|
|
155
|
+
const header = parts.join(" ");
|
|
156
|
+
const tree = groupAttributes(event);
|
|
157
|
+
if (Object.keys(tree).length === 0) {
|
|
158
|
+
return header;
|
|
159
|
+
}
|
|
160
|
+
const treeLines = renderTree(tree, " ", []);
|
|
161
|
+
return [header, ...treeLines].join("\n");
|
|
162
|
+
}
|
|
163
|
+
var CanonicalLogLineProcessor = class {
|
|
164
|
+
logger;
|
|
165
|
+
rootSpansOnly;
|
|
166
|
+
minLevel;
|
|
167
|
+
messageFormat;
|
|
168
|
+
includeResourceAttributes;
|
|
169
|
+
attributeRedactor;
|
|
170
|
+
shouldEmit;
|
|
171
|
+
drain;
|
|
172
|
+
onDrainError;
|
|
173
|
+
pretty;
|
|
174
|
+
getOTelLogger = null;
|
|
175
|
+
constructor(options = {}) {
|
|
176
|
+
this.logger = options.logger;
|
|
177
|
+
this.rootSpansOnly = options.rootSpansOnly ?? false;
|
|
178
|
+
this.minLevel = options.minLevel ?? "info";
|
|
179
|
+
this.messageFormat = options.messageFormat ?? ((span) => `[${span.name}] Request completed`);
|
|
180
|
+
this.includeResourceAttributes = options.includeResourceAttributes ?? true;
|
|
181
|
+
this.attributeRedactor = options.attributeRedactor;
|
|
182
|
+
this.shouldEmit = options.shouldEmit ?? this.buildKeepPredicate(options.keep);
|
|
183
|
+
this.drain = options.drain;
|
|
184
|
+
this.onDrainError = options.onDrainError;
|
|
185
|
+
this.pretty = options.pretty ?? (typeof process !== "undefined" && process.env.NODE_ENV === "development");
|
|
186
|
+
if (!this.logger) {
|
|
187
|
+
this.getOTelLogger = () => logs.getLogger("autotel.canonical-log-line");
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
buildKeepPredicate(keep) {
|
|
191
|
+
if (!keep || keep.length === 0) return void 0;
|
|
192
|
+
return (ctx) => {
|
|
193
|
+
return keep.some((condition) => {
|
|
194
|
+
if (condition.status !== void 0) {
|
|
195
|
+
const httpStatus = Number(
|
|
196
|
+
ctx.event["http.response.status_code"] ?? 0
|
|
197
|
+
);
|
|
198
|
+
if (httpStatus >= condition.status) return true;
|
|
199
|
+
}
|
|
200
|
+
if (condition.durationMs !== void 0 && Number(ctx.event.duration_ms ?? 0) >= condition.durationMs) {
|
|
201
|
+
return true;
|
|
202
|
+
}
|
|
203
|
+
if (condition.path !== void 0) {
|
|
204
|
+
const route = String(
|
|
205
|
+
ctx.event["http.route"] ?? ctx.event["url.path"] ?? ""
|
|
206
|
+
);
|
|
207
|
+
if (route.startsWith(condition.path)) return true;
|
|
208
|
+
}
|
|
209
|
+
return false;
|
|
210
|
+
});
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
onStart() {
|
|
214
|
+
}
|
|
215
|
+
onEnd(span) {
|
|
216
|
+
if (this.rootSpansOnly && span.parentSpanContext?.spanId && !span.parentSpanContext.isRemote) {
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
const level = this.getLogLevel(span);
|
|
220
|
+
if (!this.shouldLog(level)) {
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
const canonicalLogLine = this.buildCanonicalLogLine(span);
|
|
224
|
+
const message = this.messageFormat(span);
|
|
225
|
+
const eventContext = {
|
|
226
|
+
span,
|
|
227
|
+
level,
|
|
228
|
+
message,
|
|
229
|
+
event: canonicalLogLine
|
|
230
|
+
};
|
|
231
|
+
if (this.shouldEmit && !this.shouldEmit(eventContext)) return;
|
|
232
|
+
if (this.pretty) {
|
|
233
|
+
console.log(formatPrettyLogLine(eventContext));
|
|
234
|
+
}
|
|
235
|
+
if (this.logger) {
|
|
236
|
+
this.emitViaLogger(level, message, canonicalLogLine);
|
|
237
|
+
} else if (this.getOTelLogger) {
|
|
238
|
+
const otelLogger = this.getOTelLogger();
|
|
239
|
+
this.emitViaOTel(level, message, canonicalLogLine, otelLogger);
|
|
240
|
+
}
|
|
241
|
+
if (this.drain) {
|
|
242
|
+
Promise.resolve(this.drain(eventContext)).catch((error) => {
|
|
243
|
+
if (this.onDrainError) {
|
|
244
|
+
this.onDrainError(error, eventContext);
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
this.reportInternalWarning("canonicalLogLines.drain failed", error);
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
buildCanonicalLogLine(span) {
|
|
252
|
+
const durationMs = span.duration[0] * 1e3 + span.duration[1] / 1e6;
|
|
253
|
+
const timestamp = new Date(
|
|
254
|
+
span.startTime[0] * 1e3 + span.startTime[1] / 1e6
|
|
255
|
+
).toISOString();
|
|
256
|
+
const canonicalLogLine = {};
|
|
257
|
+
const attributes = this.redactAttributes(span.attributes);
|
|
258
|
+
Object.assign(canonicalLogLine, attributes);
|
|
259
|
+
if (this.includeResourceAttributes) {
|
|
260
|
+
const resourceAttrs = this.redactAttributes(
|
|
261
|
+
span.resource.attributes
|
|
262
|
+
);
|
|
263
|
+
Object.assign(canonicalLogLine, resourceAttrs);
|
|
264
|
+
}
|
|
265
|
+
canonicalLogLine.operation = span.name;
|
|
266
|
+
canonicalLogLine.traceId = span.spanContext().traceId;
|
|
267
|
+
canonicalLogLine.spanId = span.spanContext().spanId;
|
|
268
|
+
canonicalLogLine.correlationId = span.spanContext().traceId.slice(0, 16);
|
|
269
|
+
canonicalLogLine.duration_ms = Math.round(durationMs * 100) / 100;
|
|
270
|
+
canonicalLogLine.duration = formatDuration(durationMs);
|
|
271
|
+
canonicalLogLine.status_code = span.status.code;
|
|
272
|
+
canonicalLogLine.status_message = span.status.message || void 0;
|
|
273
|
+
canonicalLogLine.timestamp = timestamp;
|
|
274
|
+
return canonicalLogLine;
|
|
275
|
+
}
|
|
276
|
+
redactAttributes(attributes) {
|
|
277
|
+
if (!this.attributeRedactor) {
|
|
278
|
+
return { ...attributes };
|
|
279
|
+
}
|
|
280
|
+
const redacted = {};
|
|
281
|
+
for (const [key, value] of Object.entries(attributes)) {
|
|
282
|
+
if (value !== void 0) {
|
|
283
|
+
redacted[key] = this.attributeRedactor(key, value);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
return redacted;
|
|
287
|
+
}
|
|
288
|
+
emitViaLogger(level, message, canonicalLogLine) {
|
|
289
|
+
this.logger[level](canonicalLogLine, message);
|
|
290
|
+
}
|
|
291
|
+
emitViaOTel(level, message, canonicalLogLine, otelLogger) {
|
|
292
|
+
const otelAttributes = {};
|
|
293
|
+
for (const [key, value] of Object.entries(canonicalLogLine)) {
|
|
294
|
+
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
|
|
295
|
+
otelAttributes[key] = value;
|
|
296
|
+
} else if (value !== null && value !== void 0) {
|
|
297
|
+
otelAttributes[key] = String(value);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
otelLogger.emit({
|
|
301
|
+
severityNumber: this.getSeverityNumber(level),
|
|
302
|
+
severityText: level.toUpperCase(),
|
|
303
|
+
body: message,
|
|
304
|
+
attributes: otelAttributes
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
getLogLevel(span) {
|
|
308
|
+
const explicitLevel = span.attributes["autotel.log.level"];
|
|
309
|
+
if (explicitLevel === "debug" || explicitLevel === "info" || explicitLevel === "warn" || explicitLevel === "error") {
|
|
310
|
+
return explicitLevel;
|
|
311
|
+
}
|
|
312
|
+
if (span.status.code === 2) return "error";
|
|
313
|
+
return "info";
|
|
314
|
+
}
|
|
315
|
+
shouldLog(level) {
|
|
316
|
+
const levels = ["debug", "info", "warn", "error"];
|
|
317
|
+
return levels.indexOf(level) >= levels.indexOf(this.minLevel);
|
|
318
|
+
}
|
|
319
|
+
getSeverityNumber(level) {
|
|
320
|
+
const mapping = {
|
|
321
|
+
debug: SeverityNumber.DEBUG,
|
|
322
|
+
info: SeverityNumber.INFO,
|
|
323
|
+
warn: SeverityNumber.WARN,
|
|
324
|
+
error: SeverityNumber.ERROR
|
|
325
|
+
};
|
|
326
|
+
return mapping[level] ?? SeverityNumber.INFO;
|
|
327
|
+
}
|
|
328
|
+
reportInternalWarning(message, error) {
|
|
329
|
+
const err = error instanceof Error ? error.message : String(error ?? "unknown error");
|
|
330
|
+
if (this.logger) {
|
|
331
|
+
this.logger.warn({ error: err }, `[autotel] ${message}`);
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
console.warn(`[autotel] ${message}: ${err}`);
|
|
335
|
+
}
|
|
336
|
+
async forceFlush() {
|
|
337
|
+
}
|
|
338
|
+
async shutdown() {
|
|
339
|
+
}
|
|
340
|
+
};
|
|
341
|
+
|
|
342
|
+
export { CanonicalLogLineProcessor, formatDuration };
|
|
343
|
+
//# sourceMappingURL=chunk-3QXBFGKP.js.map
|
|
344
|
+
//# sourceMappingURL=chunk-3QXBFGKP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/pretty-log-formatter.ts","../src/processors/canonical-log-line-processor.ts"],"names":["seconds"],"mappings":";;;AAEA,IAAM,KAAA,GAAQ,SAAA;AACd,IAAM,GAAA,GAAM,SAAA;AACZ,IAAM,IAAA,GAAO,SAAA;AACb,IAAM,GAAA,GAAM,UAAA;AACZ,IAAM,MAAA,GAAS,UAAA;AACf,IAAM,KAAA,GAAQ,UAAA;AACd,IAAM,IAAA,GAAO,UAAA;AACb,IAAM,IAAA,GAAO,UAAA;AAEb,IAAM,YAAA,GAAuC;AAAA,EAC3C,KAAA,EAAO,IAAA;AAAA,EACP,IAAA,EAAM,KAAA;AAAA,EACN,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO;AACT,CAAA;AAGA,IAAM,aAAA,GAAgB;AAAA,EACpB,YAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,SAAA,uBAAgB,GAAA,CAAI;AAAA,EACxB,WAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA,WAAA;AAAA,EACA,qBAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,SAAS,QAAA,GAAoB;AAC3B,EAAA,IAAI,OAAO,YAAY,WAAA,EAAa;AAClC,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,EAAU,OAAO,KAAA;AACjC,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,WAAA,EAAa,OAAO,IAAA;AACpC,IAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,KAAA,EAAO,OAAO,IAAA;AAAA,EACpC;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,CAAA,CAAE,OAAe,IAAA,EAAsB;AAC9C,EAAA,OAAO,QAAA,KAAa,CAAA,EAAG,KAAK,GAAG,IAAI,CAAA,EAAG,KAAK,CAAA,CAAA,GAAK,IAAA;AAClD;AAUO,SAAS,eAAe,EAAA,EAAoB;AACjD,EAAA,IAAI,KAAK,GAAA,EAAM,OAAO,GAAG,IAAA,CAAK,KAAA,CAAM,EAAE,CAAC,CAAA,EAAA,CAAA;AACvC,EAAA,IAAI,KAAK,GAAA,EAAQ;AACf,IAAA,MAAMA,WAAU,EAAA,GAAK,GAAA;AACrB,IAAA,OAAOA,QAAAA,GAAU,EAAA,GAAK,CAAA,EAAGA,QAAAA,CAAQ,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,GAAM,CAAA,EAAG,IAAA,CAAK,KAAA,CAAMA,QAAO,CAAC,CAAA,CAAA,CAAA;AAAA,EACzE;AACA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,GAAM,CAAA;AACtC,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAO,EAAA,GAAK,MAAU,GAAI,CAAA;AAC/C,EAAA,OAAO,OAAA,GAAU,IAAI,CAAA,EAAG,OAAO,KAAK,OAAO,CAAA,CAAA,CAAA,GAAM,GAAG,OAAO,CAAA,CAAA,CAAA;AAC7D;AAEA,SAAS,WAAW,GAAA,EAAqB;AACvC,EAAA,IAAI;AACF,IAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,GAAG,CAAA;AACtB,IAAA,OAAO,EAAE,kBAAA,CAAmB,OAAA,EAAS,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EACxD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAAA,EACzB;AACF;AAEA,SAAS,YAAY,KAAA,EAAwB;AAC3C,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,KAAA,KAAU,SAAA;AAChD,IAAA,OAAO,OAAO,KAAK,CAAA;AACrB,EAAA,IAAI,KAAA,IAAS,MAAM,OAAO,EAAA;AAC1B,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,EAC7B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,OAAO,KAAK,CAAA;AAAA,EACrB;AACF;AAMA,SAAS,gBACP,KAAA,EACyB;AACzB,EAAA,MAAM,OAAgC,EAAC;AAEvC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,IAAA,IAAI,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA,EAAG;AACxB,IAAA,IAAI,aAAA,CAAc,KAAK,CAAC,CAAA,KAAM,IAAI,UAAA,CAAW,CAAC,CAAC,CAAA,EAAG;AAClD,IAAA,IAAI,KAAA,IAAS,IAAA,IAAQ,KAAA,KAAU,EAAA,EAAI;AAEnC,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA;AAC3B,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,IAAA,CAAK,GAAG,CAAA,GAAI,KAAA;AAAA,IACd,CAAA,MAAO;AACL,MAAA,IAAI,OAAA,GAAU,IAAA;AACd,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AACzC,QAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,QAAA,IAAI,EAAE,IAAA,IAAQ,OAAA,CAAA,IAAY,OAAO,OAAA,CAAQ,IAAI,MAAM,QAAA,EAAU;AAC3D,UAAA,OAAA,CAAQ,IAAI,IAAI,EAAC;AAAA,QACnB;AACA,QAAA,OAAA,GAAU,QAAQ,IAAI,CAAA;AAAA,MACxB;AACA,MAAA,OAAA,CAAQ,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAE,CAAA,GAAI,KAAA;AAAA,IACtC;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,UAAA,CACP,GAAA,EACA,MAAA,EACA,MAAA,EACU;AACV,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA;AAElC,EAAA,OAAA,CAAQ,QAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,GAAG,GAAA,KAAQ;AACrC,IAAA,MAAM,IAAA,GAAO,GAAA,KAAQ,OAAA,CAAQ,MAAA,GAAS,CAAA;AACtC,IAAA,MAAM,SAAA,GAAY,OAAO,cAAA,GAAiB,cAAA;AAC1C,IAAA,MAAM,MAAA,GAAS,SAAS,SAAA,GAAY,GAAA;AAEpC,IAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC/D,MAAA,MAAM,MAAA,GAAS,KAAA;AACf,MAAA,MAAM,UAAA,GAAa,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAAE,MAAA;AAAA,QACxC,CAAC,GAAG,CAAC,MAAM,OAAO,CAAA,KAAM,YAAY,CAAA,KAAM;AAAA,OAC5C;AACA,MAAA,MAAM,UAAA,GAAa,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAAE,MAAA;AAAA,QACxC,CAAC,GAAG,CAAC,CAAA,KAAM,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,IAAA,IAAQ,CAAC,KAAA,CAAM,QAAQ,CAAC;AAAA,OACpE;AAEA,MAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,QAAA,MAAM,MAAA,GAAS,WACZ,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,MAAM,CAAA,EAAG,CAAA,CAAE,MAAM,CAAC,CAAC,IAAI,WAAA,CAAY,CAAC,CAAC,CAAA,CAAE,CAAA,CACjD,KAAK,GAAG,CAAA;AACX,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,EAAG,CAAA,CAAE,MAAM,GAAG,CAAC,CAAA,EAAA,EAAK,MAAM,CAAA,CAAE,CAAA;AAAA,MAClD,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,IAAA,CAAK,GAAG,MAAM,CAAA,EAAG,EAAE,IAAA,EAAM,GAAG,CAAC,CAAA,CAAA,CAAG,CAAA;AACtC,QAAA,MAAM,UAAA,GAAa,MAAA,IAAU,IAAA,GAAO,KAAA,GAAQ,UAAA,CAAA;AAC5C,QAAA,KAAA,CAAM,IAAA,CAAK,GAAG,UAAA,CAAW,MAAA,EAAQ,UAAA,EAAY,CAAC,GAAG,MAAA,EAAQ,IAAI,CAAC,CAAC,CAAA;AAAA,MACjE;AAAA,IACF,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,EAAG,EAAE,IAAA,EAAM,GAAG,CAAC,CAAA,EAAA,EAAK,EAAE,GAAA,EAAK,WAAA,CAAY,KAAK,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,IACtE;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,KAAA;AACT;AAKO,SAAS,oBAAoB,GAAA,EAAoC;AACtE,EAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAO,OAAA,EAAQ,GAAI,GAAA;AAElC,EAAA,MAAM,YAAY,UAAA,CAAW,MAAA,CAAO,KAAA,CAAM,SAAA,IAAa,EAAE,CAAC,CAAA;AAC1D,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,cAAc,CAAA,IAAK,MAAM,OAAA,IAAW,EAAA;AAC1D,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,qBAAqB,CAAA,IAAK,EAAA;AAC/C,EAAA,MAAM,OAAO,KAAA,CAAM,YAAY,CAAA,IAAK,KAAA,CAAM,UAAU,CAAA,IAAK,EAAA;AACzD,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,2BAA2B,CAAA,IAAK,MAAM,WAAA,IAAe,EAAA;AAC1E,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,KAAA,CAAM,WAAA,IAAe,CAAC,CAAA;AAChD,EAAA,MAAM,QAAA,GAAW,eAAe,UAAU,CAAA;AAE1C,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,KAAK,CAAA,IAAK,EAAA;AAC1C,EAAA,MAAM,QAAA,GAAW,EAAE,UAAA,EAAY,KAAA,CAAM,aAAY,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA;AAE5D,EAAA,MAAM,QAAQ,CAAC,CAAA,CAAE,GAAA,EAAK,SAAS,GAAG,QAAQ,CAAA;AAC1C,EAAA,IAAI,OAAA,QAAe,IAAA,CAAK,CAAA,CAAE,KAAK,CAAA,CAAA,EAAI,OAAO,GAAG,CAAC,CAAA;AAC9C,EAAA,IAAI,MAAA,QAAc,IAAA,CAAK,CAAA,CAAE,MAAM,MAAA,CAAO,MAAM,CAAC,CAAC,CAAA;AAC9C,EAAA,IAAI,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,IAAI,CAAC,CAAA;AACjC,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,SAAA,GAAY,OAAO,MAAM,CAAA;AAC/B,IAAA,MAAM,cACJ,SAAA,IAAa,GAAA,GAAM,GAAA,GAAM,SAAA,IAAa,MAAM,MAAA,GAAS,KAAA;AACvD,IAAA,KAAA,CAAM,KAAK,CAAA,CAAE,WAAA,EAAa,MAAA,CAAO,MAAM,CAAC,CAAC,CAAA;AAAA,EAC3C;AACA,EAAA,KAAA,CAAM,KAAK,CAAA,CAAE,GAAA,EAAK,CAAA,GAAA,EAAM,QAAQ,EAAE,CAAC,CAAA;AAEnC,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAE7B,EAAA,MAAM,IAAA,GAAO,gBAAgB,KAAK,CAAA;AAClC,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AAClC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAA,GAAY,UAAA,CAAW,IAAA,EAAM,IAAA,EAAM,EAAE,CAAA;AAC3C,EAAA,OAAO,CAAC,MAAA,EAAQ,GAAG,SAAS,CAAA,CAAE,KAAK,IAAI,CAAA;AACzC;ACzDO,IAAM,4BAAN,MAAyD;AAAA,EACtD,MAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,yBAAA;AAAA,EACA,iBAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA,GACN,IAAA;AAAA,EAEF,WAAA,CAAY,OAAA,GAAmC,EAAC,EAAG;AACjD,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,aAAA,GAAgB,QAAQ,aAAA,IAAiB,KAAA;AAC9C,IAAA,IAAA,CAAK,QAAA,GAAW,QAAQ,QAAA,IAAY,MAAA;AACpC,IAAA,IAAA,CAAK,gBACH,OAAA,CAAQ,aAAA,KAAkB,CAAC,IAAA,KAAS,CAAA,CAAA,EAAI,KAAK,IAAI,CAAA,mBAAA,CAAA,CAAA;AACnD,IAAA,IAAA,CAAK,yBAAA,GAA4B,QAAQ,yBAAA,IAA6B,IAAA;AACtE,IAAA,IAAA,CAAK,oBAAoB,OAAA,CAAQ,iBAAA;AACjC,IAAA,IAAA,CAAK,aACH,OAAA,CAAQ,UAAA,IAAc,IAAA,CAAK,kBAAA,CAAmB,QAAQ,IAAI,CAAA;AAC5D,IAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,KAAA;AACrB,IAAA,IAAA,CAAK,eAAe,OAAA,CAAQ,YAAA;AAC5B,IAAA,IAAA,CAAK,MAAA,GACH,QAAQ,MAAA,KACP,OAAO,YAAY,WAAA,IAClB,OAAA,CAAQ,IAAI,QAAA,KAAa,aAAA,CAAA;AAE7B,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,IAAA,CAAK,aAAA,GAAgB,MAAM,IAAA,CAAK,SAAA,CAAU,4BAA4B,CAAA;AAAA,IACxE;AAAA,EACF;AAAA,EAEQ,mBACN,IAAA,EACuD;AACvD,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,GAAG,OAAO,MAAA;AAEvC,IAAA,OAAO,CAAC,GAAA,KAA+B;AACrC,MAAA,OAAO,IAAA,CAAK,IAAA,CAAK,CAAC,SAAA,KAAc;AAC9B,QAAA,IAAI,SAAA,CAAU,WAAW,MAAA,EAAW;AAClC,UAAA,MAAM,UAAA,GAAa,MAAA;AAAA,YACjB,GAAA,CAAI,KAAA,CAAM,2BAA2B,CAAA,IAAK;AAAA,WAC5C;AACA,UAAA,IAAI,UAAA,IAAc,SAAA,CAAU,MAAA,EAAQ,OAAO,IAAA;AAAA,QAC7C;AACA,QAAA,IACE,SAAA,CAAU,UAAA,KAAe,MAAA,IACzB,MAAA,CAAO,GAAA,CAAI,MAAM,WAAA,IAAe,CAAC,CAAA,IAAK,SAAA,CAAU,UAAA,EAChD;AACA,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,IAAI,SAAA,CAAU,SAAS,MAAA,EAAW;AAChC,UAAA,MAAM,KAAA,GAAQ,MAAA;AAAA,YACZ,IAAI,KAAA,CAAM,YAAY,KAAK,GAAA,CAAI,KAAA,CAAM,UAAU,CAAA,IAAK;AAAA,WACtD;AACA,UAAA,IAAI,KAAA,CAAM,UAAA,CAAW,SAAA,CAAU,IAAI,GAAG,OAAO,IAAA;AAAA,QAC/C;AACA,QAAA,OAAO,KAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,EACF;AAAA,EAEA,OAAA,GAAgB;AAAA,EAEhB;AAAA,EAEA,MAAM,IAAA,EAA0B;AAC9B,IAAA,IACE,IAAA,CAAK,iBACL,IAAA,CAAK,iBAAA,EAAmB,UACxB,CAAC,IAAA,CAAK,kBAAkB,QAAA,EACxB;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AACnC,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,EAAG;AAC1B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,qBAAA,CAAsB,IAAI,CAAA;AACxD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA;AACvC,IAAA,MAAM,YAAA,GAAsC;AAAA,MAC1C,IAAA;AAAA,MACA,KAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA,EAAO;AAAA,KACT;AAEA,IAAA,IAAI,KAAK,UAAA,IAAc,CAAC,IAAA,CAAK,UAAA,CAAW,YAAY,CAAA,EAAG;AAEvD,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,OAAA,CAAQ,GAAA,CAAI,mBAAA,CAAoB,YAAY,CAAC,CAAA;AAAA,IAC/C;AAEA,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO,OAAA,EAAS,gBAAgB,CAAA;AAAA,IACrD,CAAA,MAAA,IAAW,KAAK,aAAA,EAAe;AAC7B,MAAA,MAAM,UAAA,GAAa,KAAK,aAAA,EAAc;AACtC,MAAA,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,OAAA,EAAS,gBAAA,EAAkB,UAAU,CAAA;AAAA,IAC/D;AAEA,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,OAAA,CAAQ,KAAK,KAAA,CAAM,YAAY,CAAC,CAAA,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AACzD,QAAA,IAAI,KAAK,YAAA,EAAc;AACrB,UAAA,IAAA,CAAK,YAAA,CAAa,OAAO,YAAY,CAAA;AACrC,UAAA;AAAA,QACF;AACA,QAAA,IAAA,CAAK,qBAAA,CAAsB,kCAAkC,KAAK,CAAA;AAAA,MACpE,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,sBAAsB,IAAA,EAA6C;AACzE,IAAA,MAAM,UAAA,GAAa,KAAK,QAAA,CAAS,CAAC,IAAI,GAAA,GAAO,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA,GAAI,GAAA;AAChE,IAAA,MAAM,YAAY,IAAI,IAAA;AAAA,MACpB,IAAA,CAAK,UAAU,CAAC,CAAA,GAAI,MAAO,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA,GAAI;AAAA,MAC/C,WAAA,EAAY;AAGd,IAAA,MAAM,mBAA4C,EAAC;AACnD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,UAAU,CAAA;AACxD,IAAA,MAAA,CAAO,MAAA,CAAO,kBAAkB,UAAU,CAAA;AAE1C,IAAA,IAAI,KAAK,yBAAA,EAA2B;AAClC,MAAA,MAAM,gBAAgB,IAAA,CAAK,gBAAA;AAAA,QACzB,KAAK,QAAA,CAAS;AAAA,OAChB;AACA,MAAA,MAAA,CAAO,MAAA,CAAO,kBAAkB,aAAa,CAAA;AAAA,IAC/C;AAEA,IAAA,gBAAA,CAAiB,YAAY,IAAA,CAAK,IAAA;AAClC,IAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA,CAAK,WAAA,EAAY,CAAE,OAAA;AAC9C,IAAA,gBAAA,CAAiB,MAAA,GAAS,IAAA,CAAK,WAAA,EAAY,CAAE,MAAA;AAC7C,IAAA,gBAAA,CAAiB,gBAAgB,IAAA,CAAK,WAAA,GAAc,OAAA,CAAQ,KAAA,CAAM,GAAG,EAAE,CAAA;AACvE,IAAA,gBAAA,CAAiB,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,UAAA,GAAa,GAAG,CAAA,GAAI,GAAA;AAC9D,IAAA,gBAAA,CAAiB,QAAA,GAAW,eAAe,UAAU,CAAA;AACrD,IAAA,gBAAA,CAAiB,WAAA,GAAc,KAAK,MAAA,CAAO,IAAA;AAC3C,IAAA,gBAAA,CAAiB,cAAA,GAAiB,IAAA,CAAK,MAAA,CAAO,OAAA,IAAW,MAAA;AACzD,IAAA,gBAAA,CAAiB,SAAA,GAAY,SAAA;AAE7B,IAAA,OAAO,gBAAA;AAAA,EACT;AAAA,EAEQ,iBAAiB,UAAA,EAAiD;AACxE,IAAA,IAAI,CAAC,KAAK,iBAAA,EAAmB;AAC3B,MAAA,OAAO,EAAE,GAAG,UAAA,EAAW;AAAA,IACzB;AAEA,IAAA,MAAM,WAAoC,EAAC;AAC3C,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AACrD,MAAA,IAAI,UAAU,MAAA,EAAW;AACvB,QAAA,QAAA,CAAS,GAAG,CAAA,GAAI,IAAA,CAAK,iBAAA,CAAkB,KAAK,KAAK,CAAA;AAAA,MACnD;AAAA,IACF;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,aAAA,CACN,KAAA,EACA,OAAA,EACA,gBAAA,EACM;AACN,IAAA,IAAA,CAAK,MAAA,CAAQ,KAAK,CAAA,CAAE,gBAAA,EAAkB,OAAO,CAAA;AAAA,EAC/C;AAAA,EAEQ,WAAA,CACN,KAAA,EACA,OAAA,EACA,gBAAA,EACA,UAAA,EACM;AACN,IAAA,MAAM,iBAA4D,EAAC;AACnE,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,gBAAgB,CAAA,EAAG;AAC3D,MAAA,IACE,OAAO,UAAU,QAAA,IACjB,OAAO,UAAU,QAAA,IACjB,OAAO,UAAU,SAAA,EACjB;AACA,QAAA,cAAA,CAAe,GAAG,CAAA,GAAI,KAAA;AAAA,MACxB,CAAA,MAAA,IAAW,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AAChD,QAAA,cAAA,CAAe,GAAG,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA;AAAA,MACpC;AAAA,IACF;AACA,IAAA,UAAA,CAAW,IAAA,CAAK;AAAA,MACd,cAAA,EAAgB,IAAA,CAAK,iBAAA,CAAkB,KAAK,CAAA;AAAA,MAC5C,YAAA,EAAc,MAAM,WAAA,EAAY;AAAA,MAChC,IAAA,EAAM,OAAA;AAAA,MACN,UAAA,EAAY;AAAA,KACb,CAAA;AAAA,EACH;AAAA,EAEQ,YAAY,IAAA,EAAyD;AAC3E,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,UAAA,CAAW,mBAAmB,CAAA;AACzD,IAAA,IACE,kBAAkB,OAAA,IAClB,aAAA,KAAkB,UAClB,aAAA,KAAkB,MAAA,IAClB,kBAAkB,OAAA,EAClB;AACA,MAAA,OAAO,aAAA;AAAA,IACT;AAEA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,KAAS,CAAA,EAAG,OAAO,OAAA;AACnC,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,UAAU,KAAA,EAAwB;AACxC,IAAA,MAAM,MAAA,GAAS,CAAC,OAAA,EAAS,MAAA,EAAQ,QAAQ,OAAO,CAAA;AAChD,IAAA,OAAO,OAAO,OAAA,CAAQ,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,QAAQ,CAAA;AAAA,EAC9D;AAAA,EAEQ,kBAAkB,KAAA,EAA+B;AACvD,IAAA,MAAM,OAAA,GAA0C;AAAA,MAC9C,OAAO,cAAA,CAAe,KAAA;AAAA,MACtB,MAAM,cAAA,CAAe,IAAA;AAAA,MACrB,MAAM,cAAA,CAAe,IAAA;AAAA,MACrB,OAAO,cAAA,CAAe;AAAA,KACxB;AACA,IAAA,OAAO,OAAA,CAAQ,KAAK,CAAA,IAAK,cAAA,CAAe,IAAA;AAAA,EAC1C;AAAA,EAEQ,qBAAA,CAAsB,SAAiB,KAAA,EAAsB;AACnE,IAAA,MAAM,MACJ,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,SAAS,eAAe,CAAA;AAC1E,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,EAAE,KAAA,EAAO,KAAI,EAAG,CAAA,UAAA,EAAa,OAAO,CAAA,CAAE,CAAA;AACvD,MAAA;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,UAAA,EAAa,OAAO,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AAAA,EAC7C;AAAA,EAEA,MAAM,UAAA,GAA4B;AAAA,EAElC;AAAA,EAEA,MAAM,QAAA,GAA0B;AAAA,EAEhC;AACF","file":"chunk-3QXBFGKP.js","sourcesContent":["import type { CanonicalLogLineEvent } from './processors/canonical-log-line-processor';\n\nconst RESET = '\\x1b[0m';\nconst DIM = '\\x1b[2m';\nconst BOLD = '\\x1b[1m';\nconst RED = '\\x1b[31m';\nconst YELLOW = '\\x1b[33m';\nconst GREEN = '\\x1b[32m';\nconst CYAN = '\\x1b[36m';\nconst GRAY = '\\x1b[90m';\n\nconst LEVEL_COLORS: Record<string, string> = {\n debug: GRAY,\n info: GREEN,\n warn: YELLOW,\n error: RED,\n};\n\n/** Internal OTel attributes to skip in pretty output. */\nconst SKIP_PREFIXES = [\n 'telemetry.',\n 'otel.',\n 'process.',\n 'os.',\n 'host.',\n 'service.',\n 'autotel.',\n];\n\nconst SKIP_KEYS = new Set([\n 'operation',\n 'traceId',\n 'spanId',\n 'correlationId',\n 'duration_ms',\n 'duration',\n 'status_code',\n 'status_message',\n 'timestamp',\n 'http.request.method',\n 'url.path',\n 'http.route',\n 'http.response.status_code',\n]);\n\nfunction useColor(): boolean {\n if (typeof process !== 'undefined') {\n if (process.env.NO_COLOR) return false;\n if (process.env.FORCE_COLOR) return true;\n if (process.stdout?.isTTY) return true;\n }\n return false;\n}\n\nfunction c(color: string, text: string): string {\n return useColor() ? `${color}${text}${RESET}` : text;\n}\n\n/**\n * Format milliseconds into a human-readable duration string.\n *\n * @example\n * formatDuration(45) // \"45ms\"\n * formatDuration(1234) // \"1.2s\"\n * formatDuration(65000) // \"1m 5s\"\n */\nexport function formatDuration(ms: number): string {\n if (ms < 1000) return `${Math.round(ms)}ms`;\n if (ms < 60_000) {\n const seconds = ms / 1000;\n return seconds < 10 ? `${seconds.toFixed(1)}s` : `${Math.round(seconds)}s`;\n }\n const minutes = Math.floor(ms / 60_000);\n const seconds = Math.round((ms % 60_000) / 1000);\n return seconds > 0 ? `${minutes}m ${seconds}s` : `${minutes}m`;\n}\n\nfunction formatTime(iso: string): string {\n try {\n const d = new Date(iso);\n return d.toLocaleTimeString('en-GB', { hour12: false });\n } catch {\n return iso.slice(11, 19);\n }\n}\n\nfunction formatValue(value: unknown): string {\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean')\n return String(value);\n if (value == null) return '';\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\n/**\n * Group flat dot-notation attributes into a nested tree for pretty display.\n * e.g. { 'user.id': '1', 'user.plan': 'pro' } → { user: { id: '1', plan: 'pro' } }\n */\nfunction groupAttributes(\n event: Record<string, unknown>,\n): Record<string, unknown> {\n const tree: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(event)) {\n if (SKIP_KEYS.has(key)) continue;\n if (SKIP_PREFIXES.some((p) => key.startsWith(p))) continue;\n if (value == null || value === '') continue;\n\n const parts = key.split('.');\n if (parts.length === 1) {\n tree[key] = value;\n } else {\n let current = tree;\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i]!;\n if (!(part in current) || typeof current[part] !== 'object') {\n current[part] = {};\n }\n current = current[part] as Record<string, unknown>;\n }\n current[parts[parts.length - 1]!] = value;\n }\n }\n\n return tree;\n}\n\nfunction renderTree(\n obj: Record<string, unknown>,\n indent: string,\n isLast: boolean[],\n): string[] {\n const lines: string[] = [];\n const entries = Object.entries(obj);\n\n entries.forEach(([key, value], idx) => {\n const last = idx === entries.length - 1;\n const connector = last ? '\\u2514\\u2500' : '\\u251c\\u2500';\n const prefix = indent + connector + ' ';\n\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const nested = value as Record<string, unknown>;\n const flatValues = Object.entries(nested).filter(\n ([, v]) => typeof v !== 'object' || v === null,\n );\n const nestedObjs = Object.entries(nested).filter(\n ([, v]) => typeof v === 'object' && v !== null && !Array.isArray(v),\n );\n\n if (nestedObjs.length === 0) {\n const inline = flatValues\n .map(([k, v]) => `${c(CYAN, k)}=${formatValue(v)}`)\n .join(' ');\n lines.push(`${prefix}${c(BOLD, key)}: ${inline}`);\n } else {\n lines.push(`${prefix}${c(BOLD, key)}:`);\n const nextIndent = indent + (last ? ' ' : '\\u2502 ');\n lines.push(...renderTree(nested, nextIndent, [...isLast, last]));\n }\n } else {\n lines.push(`${prefix}${c(CYAN, key)}: ${c(DIM, formatValue(value))}`);\n }\n });\n\n return lines;\n}\n\n/**\n * Format a canonical log line event as a pretty tree for development output.\n */\nexport function formatPrettyLogLine(ctx: CanonicalLogLineEvent): string {\n const { event, level, message } = ctx;\n\n const timestamp = formatTime(String(event.timestamp ?? ''));\n const service = event['service.name'] || event.service || '';\n const method = event['http.request.method'] || '';\n const path = event['http.route'] || event['url.path'] || '';\n const status = event['http.response.status_code'] || event.status_code || '';\n const durationMs = Number(event.duration_ms ?? 0);\n const duration = formatDuration(durationMs);\n\n const levelColor = LEVEL_COLORS[level] ?? '';\n const levelStr = c(levelColor, level.toUpperCase().padEnd(5));\n\n const parts = [c(DIM, timestamp), levelStr];\n if (service) parts.push(c(DIM, `[${service}]`));\n if (method) parts.push(c(BOLD, String(method)));\n if (path) parts.push(String(path));\n if (status) {\n const statusNum = Number(status);\n const statusColor =\n statusNum >= 500 ? RED : statusNum >= 400 ? YELLOW : GREEN;\n parts.push(c(statusColor, String(status)));\n }\n parts.push(c(DIM, `in ${duration}`));\n\n const header = parts.join(' ');\n\n const tree = groupAttributes(event);\n if (Object.keys(tree).length === 0) {\n return header;\n }\n\n const treeLines = renderTree(tree, ' ', []);\n return [header, ...treeLines].join('\\n');\n}\n","/**\n * Canonical Log Line Processor\n *\n * Automatically emits spans as canonical log lines (wide events) when they end.\n * Implements canonical log line\" pattern: one comprehensive\n * event per request with all context.\n *\n * When a span ends, this processor creates a log record with ALL span attributes,\n * making the span itself the canonical log line that can be queried like structured data.\n *\n * @example\n * ```typescript\n * import { init } from 'autotel';\n *\n * init({\n * service: 'my-app',\n * canonicalLogLines: {\n * enabled: true,\n * rootSpansOnly: true, // One canonical log line per request\n * },\n * });\n * ```\n */\n\nimport type {\n SpanProcessor,\n ReadableSpan,\n} from '@opentelemetry/sdk-trace-base';\nimport type { Attributes, AttributeValue } from '@opentelemetry/api';\nimport { logs, SeverityNumber } from '@opentelemetry/api-logs';\nimport type { Logger } from '../logger';\nimport { formatPrettyLogLine, formatDuration } from '../pretty-log-formatter';\n\n/**\n * Function to redact sensitive attribute values\n */\nexport type AttributeRedactorFn = (\n key: string,\n value: AttributeValue,\n) => AttributeValue;\n\nexport interface CanonicalLogLineEvent {\n span: ReadableSpan;\n level: 'debug' | 'info' | 'warn' | 'error';\n message: string;\n event: Record<string, unknown>;\n}\n\nexport interface KeepCondition {\n /** Keep events where HTTP status >= this value. */\n status?: number;\n /** Keep events where duration_ms >= this value. */\n durationMs?: number;\n /** Keep events matching this path pattern (simple prefix match). */\n path?: string;\n}\n\nexport interface CanonicalLogLineOptions {\n /** Logger to use for emitting canonical log lines (defaults to OTel Logs API) */\n logger?: Logger;\n /** Only emit canonical log lines for root spans (default: false) */\n rootSpansOnly?: boolean;\n /** Minimum log level for canonical log lines (default: 'info') */\n minLevel?: 'debug' | 'info' | 'warn' | 'error';\n /** Custom message format (default: uses span name) */\n messageFormat?: (span: ReadableSpan) => string;\n /** Whether to include resource attributes (default: true) */\n includeResourceAttributes?: boolean;\n /**\n * Attribute redactor function to apply before logging.\n * This ensures sensitive data is redacted in canonical log lines,\n * matching the behavior of attributeRedactor in init().\n */\n attributeRedactor?: AttributeRedactorFn;\n /** Predicate to decide whether to emit (runs after event is built). */\n shouldEmit?: (ctx: CanonicalLogLineEvent) => boolean;\n /**\n * Declarative tail sampling conditions (OR logic). If any condition matches,\n * the event is kept. Ignored when `shouldEmit` is provided.\n *\n * @example\n * keep: [{ status: 500 }, { durationMs: 1000 }]\n */\n keep?: KeepCondition[];\n /** Callback invoked after emit for custom fan-out. */\n drain?: (ctx: CanonicalLogLineEvent) => void | Promise<void>;\n /** Handler for drain failures. */\n onDrainError?: (error: unknown, ctx: CanonicalLogLineEvent) => void;\n /**\n * Pretty-print canonical log lines to console in a tree format.\n * Defaults to true when NODE_ENV is 'development'.\n */\n pretty?: boolean;\n}\n\n/**\n * Span processor that automatically emits spans as canonical log lines\n *\n * When a span ends, this processor creates a log record with ALL span attributes.\n * This implements the \"canonical log line\" pattern: one comprehensive event\n * per request with all context, queryable as structured data.\n *\n * **Key Benefits:**\n * - One log line per request with all context (wide event)\n * - High-cardinality, high-dimensionality data for powerful queries\n * - Automatic - no manual logging needed\n * - Works with any logger or OTel Logs API\n *\n * @example Basic usage\n * ```typescript\n * import { init } from 'autotel';\n *\n * init({\n * service: 'checkout-api',\n * canonicalLogLines: {\n * enabled: true,\n * rootSpansOnly: true, // One canonical log line per request\n * },\n * });\n * ```\n *\n * @example With custom logger\n * ```typescript\n * import pino from 'pino';\n * import { init } from 'autotel';\n *\n * const logger = pino();\n * init({\n * service: 'my-app',\n * logger,\n * canonicalLogLines: {\n * enabled: true,\n * logger, // Use Pino for canonical log lines\n * rootSpansOnly: true,\n * },\n * });\n * ```\n *\n * @example Custom message format\n * ```typescript\n * init({\n * service: 'my-app',\n * canonicalLogLines: {\n * enabled: true,\n * messageFormat: (span) => {\n * const status = span.status.code === 2 ? 'ERROR' : 'SUCCESS';\n * return `${span.name} [${status}]`;\n * },\n * },\n * });\n * ```\n */\nexport class CanonicalLogLineProcessor implements SpanProcessor {\n private logger?: Logger;\n private rootSpansOnly: boolean;\n private minLevel: 'debug' | 'info' | 'warn' | 'error';\n private messageFormat: (span: ReadableSpan) => string;\n private includeResourceAttributes: boolean;\n private attributeRedactor?: AttributeRedactorFn;\n private shouldEmit?: (ctx: CanonicalLogLineEvent) => boolean;\n private drain?: (ctx: CanonicalLogLineEvent) => void | Promise<void>;\n private onDrainError?: (error: unknown, ctx: CanonicalLogLineEvent) => void;\n private pretty: boolean;\n private getOTelLogger: (() => ReturnType<typeof logs.getLogger>) | null =\n null;\n\n constructor(options: CanonicalLogLineOptions = {}) {\n this.logger = options.logger;\n this.rootSpansOnly = options.rootSpansOnly ?? false;\n this.minLevel = options.minLevel ?? 'info';\n this.messageFormat =\n options.messageFormat ?? ((span) => `[${span.name}] Request completed`);\n this.includeResourceAttributes = options.includeResourceAttributes ?? true;\n this.attributeRedactor = options.attributeRedactor;\n this.shouldEmit =\n options.shouldEmit ?? this.buildKeepPredicate(options.keep);\n this.drain = options.drain;\n this.onDrainError = options.onDrainError;\n this.pretty =\n options.pretty ??\n (typeof process !== 'undefined' &&\n process.env.NODE_ENV === 'development');\n\n if (!this.logger) {\n this.getOTelLogger = () => logs.getLogger('autotel.canonical-log-line');\n }\n }\n\n private buildKeepPredicate(\n keep?: KeepCondition[],\n ): ((ctx: CanonicalLogLineEvent) => boolean) | undefined {\n if (!keep || keep.length === 0) return undefined;\n\n return (ctx: CanonicalLogLineEvent) => {\n return keep.some((condition) => {\n if (condition.status !== undefined) {\n const httpStatus = Number(\n ctx.event['http.response.status_code'] ?? 0,\n );\n if (httpStatus >= condition.status) return true;\n }\n if (\n condition.durationMs !== undefined &&\n Number(ctx.event.duration_ms ?? 0) >= condition.durationMs\n ) {\n return true;\n }\n if (condition.path !== undefined) {\n const route = String(\n ctx.event['http.route'] ?? ctx.event['url.path'] ?? '',\n );\n if (route.startsWith(condition.path)) return true;\n }\n return false;\n });\n };\n }\n\n onStart(): void {\n // No-op\n }\n\n onEnd(span: ReadableSpan): void {\n if (\n this.rootSpansOnly &&\n span.parentSpanContext?.spanId &&\n !span.parentSpanContext.isRemote\n ) {\n return;\n }\n\n const level = this.getLogLevel(span);\n if (!this.shouldLog(level)) {\n return;\n }\n\n const canonicalLogLine = this.buildCanonicalLogLine(span);\n const message = this.messageFormat(span);\n const eventContext: CanonicalLogLineEvent = {\n span,\n level,\n message,\n event: canonicalLogLine,\n };\n\n if (this.shouldEmit && !this.shouldEmit(eventContext)) return;\n\n if (this.pretty) {\n console.log(formatPrettyLogLine(eventContext));\n }\n\n if (this.logger) {\n this.emitViaLogger(level, message, canonicalLogLine);\n } else if (this.getOTelLogger) {\n const otelLogger = this.getOTelLogger();\n this.emitViaOTel(level, message, canonicalLogLine, otelLogger);\n }\n\n if (this.drain) {\n Promise.resolve(this.drain(eventContext)).catch((error) => {\n if (this.onDrainError) {\n this.onDrainError(error, eventContext);\n return;\n }\n this.reportInternalWarning('canonicalLogLines.drain failed', error);\n });\n }\n }\n\n private buildCanonicalLogLine(span: ReadableSpan): Record<string, unknown> {\n const durationMs = span.duration[0] * 1000 + span.duration[1] / 1_000_000;\n const timestamp = new Date(\n span.startTime[0] * 1000 + span.startTime[1] / 1_000_000,\n ).toISOString();\n\n // Span attributes first so core metadata fields below take precedence\n const canonicalLogLine: Record<string, unknown> = {};\n const attributes = this.redactAttributes(span.attributes);\n Object.assign(canonicalLogLine, attributes);\n\n if (this.includeResourceAttributes) {\n const resourceAttrs = this.redactAttributes(\n span.resource.attributes as Attributes,\n );\n Object.assign(canonicalLogLine, resourceAttrs);\n }\n\n canonicalLogLine.operation = span.name;\n canonicalLogLine.traceId = span.spanContext().traceId;\n canonicalLogLine.spanId = span.spanContext().spanId;\n canonicalLogLine.correlationId = span.spanContext().traceId.slice(0, 16);\n canonicalLogLine.duration_ms = Math.round(durationMs * 100) / 100;\n canonicalLogLine.duration = formatDuration(durationMs);\n canonicalLogLine.status_code = span.status.code;\n canonicalLogLine.status_message = span.status.message || undefined;\n canonicalLogLine.timestamp = timestamp;\n\n return canonicalLogLine;\n }\n\n private redactAttributes(attributes: Attributes): Record<string, unknown> {\n if (!this.attributeRedactor) {\n return { ...attributes };\n }\n\n const redacted: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(attributes)) {\n if (value !== undefined) {\n redacted[key] = this.attributeRedactor(key, value);\n }\n }\n return redacted;\n }\n\n private emitViaLogger(\n level: 'debug' | 'info' | 'warn' | 'error',\n message: string,\n canonicalLogLine: Record<string, unknown>,\n ): void {\n this.logger;\n }\n\n private emitViaOTel(\n level: 'debug' | 'info' | 'warn' | 'error',\n message: string,\n canonicalLogLine: Record<string, unknown>,\n otelLogger: ReturnType<typeof logs.getLogger>,\n ): void {\n const otelAttributes: Record<string, string | number | boolean> = {};\n for (const [key, value] of Object.entries(canonicalLogLine)) {\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n otelAttributes[key] = value;\n } else if (value !== null && value !== undefined) {\n otelAttributes[key] = String(value);\n }\n }\n otelLogger.emit({\n severityNumber: this.getSeverityNumber(level),\n severityText: level.toUpperCase(),\n body: message,\n attributes: otelAttributes,\n });\n }\n\n private getLogLevel(span: ReadableSpan): 'debug' | 'info' | 'warn' | 'error' {\n const explicitLevel = span.attributes['autotel.log.level'];\n if (\n explicitLevel === 'debug' ||\n explicitLevel === 'info' ||\n explicitLevel === 'warn' ||\n explicitLevel === 'error'\n ) {\n return explicitLevel;\n }\n\n if (span.status.code === 2) return 'error';\n return 'info';\n }\n\n private shouldLog(level: string): boolean {\n const levels = ['debug', 'info', 'warn', 'error'];\n return levels.indexOf(level) >= levels.indexOf(this.minLevel);\n }\n\n private getSeverityNumber(level: string): SeverityNumber {\n const mapping: Record<string, SeverityNumber> = {\n debug: SeverityNumber.DEBUG,\n info: SeverityNumber.INFO,\n warn: SeverityNumber.WARN,\n error: SeverityNumber.ERROR,\n };\n return mapping[level] ?? SeverityNumber.INFO;\n }\n\n private reportInternalWarning(message: string, error: unknown): void {\n const err =\n error instanceof Error ? error.message : String(error ?? 'unknown error');\n if (this.logger) {\n this.logger.warn({ error: err }, `[autotel] ${message}`);\n return;\n }\n console.warn(`[autotel] ${message}: ${err}`);\n }\n\n async forceFlush(): Promise<void> {\n // No-op\n }\n\n async shutdown(): Promise<void> {\n // No-op\n }\n}\n"]}
|
|
@@ -4,7 +4,7 @@ var chunkW4EUTSB2_cjs = require('./chunk-W4EUTSB2.cjs');
|
|
|
4
4
|
var chunkGML3FBOT_cjs = require('./chunk-GML3FBOT.cjs');
|
|
5
5
|
var chunkD5LMF53P_cjs = require('./chunk-D5LMF53P.cjs');
|
|
6
6
|
var chunkXRKAL7WJ_cjs = require('./chunk-XRKAL7WJ.cjs');
|
|
7
|
-
var
|
|
7
|
+
var chunkHSEIUH7F_cjs = require('./chunk-HSEIUH7F.cjs');
|
|
8
8
|
var chunkBGVKKL2N_cjs = require('./chunk-BGVKKL2N.cjs');
|
|
9
9
|
var chunkESLWRGAG_cjs = require('./chunk-ESLWRGAG.cjs');
|
|
10
10
|
var api = require('@opentelemetry/api');
|
|
@@ -222,7 +222,7 @@ var EventQueue = class {
|
|
|
222
222
|
}
|
|
223
223
|
this.metrics?.dropped.add(1, attrs);
|
|
224
224
|
const logLevel = reason === "payload_invalid" ? "error" : "warn";
|
|
225
|
-
const logger =
|
|
225
|
+
const logger = chunkHSEIUH7F_cjs.getLogger();
|
|
226
226
|
if (logLevel === "error") {
|
|
227
227
|
logger.error(
|
|
228
228
|
{
|
|
@@ -254,7 +254,7 @@ var EventQueue = class {
|
|
|
254
254
|
recordFailed(event, subscriberName, error) {
|
|
255
255
|
this.metrics?.failed.add(1, { subscriber: subscriberName });
|
|
256
256
|
this.subscriberHealthy.set(subscriberName, false);
|
|
257
|
-
|
|
257
|
+
chunkHSEIUH7F_cjs.getLogger().error(
|
|
258
258
|
{
|
|
259
259
|
eventName: event.name,
|
|
260
260
|
subscriber: subscriberName,
|
|
@@ -295,7 +295,7 @@ var EventQueue = class {
|
|
|
295
295
|
if (this.queue.length >= this.config.maxSize) {
|
|
296
296
|
const droppedEvent = this.queue.shift();
|
|
297
297
|
this.recordDropped("rate_limit", droppedEvent);
|
|
298
|
-
|
|
298
|
+
chunkHSEIUH7F_cjs.getLogger().warn(
|
|
299
299
|
{
|
|
300
300
|
droppedEvent: droppedEvent?.name
|
|
301
301
|
},
|
|
@@ -391,7 +391,7 @@ var EventQueue = class {
|
|
|
391
391
|
const failedSubscriberNames = [
|
|
392
392
|
...new Set(failedDeliveries.map((f) => f.subscriberName))
|
|
393
393
|
];
|
|
394
|
-
|
|
394
|
+
chunkHSEIUH7F_cjs.getLogger().error(
|
|
395
395
|
{
|
|
396
396
|
failedSubscribers: failedSubscriberNames,
|
|
397
397
|
retriesAttempted: this.config.maxRetries
|
|
@@ -544,8 +544,8 @@ var EventQueue = class {
|
|
|
544
544
|
// src/track.ts
|
|
545
545
|
var eventsQueue = null;
|
|
546
546
|
function buildAutotelContext(span2) {
|
|
547
|
-
const eventsConfig =
|
|
548
|
-
const config =
|
|
547
|
+
const eventsConfig = chunkHSEIUH7F_cjs.getEventsConfig();
|
|
548
|
+
const config = chunkHSEIUH7F_cjs.getConfig();
|
|
549
549
|
const correlationId = chunkXRKAL7WJ_cjs.getOrCreateCorrelationId();
|
|
550
550
|
if (!eventsConfig?.includeTraceContext) {
|
|
551
551
|
return {
|
|
@@ -599,12 +599,12 @@ function buildAutotelContext(span2) {
|
|
|
599
599
|
return autotelContext;
|
|
600
600
|
}
|
|
601
601
|
function getOrCreateQueue() {
|
|
602
|
-
if (!
|
|
603
|
-
|
|
602
|
+
if (!chunkHSEIUH7F_cjs.isInitialized()) {
|
|
603
|
+
chunkHSEIUH7F_cjs.warnIfNotInitialized("track()");
|
|
604
604
|
return null;
|
|
605
605
|
}
|
|
606
606
|
if (!eventsQueue) {
|
|
607
|
-
const config =
|
|
607
|
+
const config = chunkHSEIUH7F_cjs.getConfig();
|
|
608
608
|
if (!config?.subscribers || config.subscribers.length === 0) {
|
|
609
609
|
return null;
|
|
610
610
|
}
|
|
@@ -615,7 +615,7 @@ function getOrCreateQueue() {
|
|
|
615
615
|
function track(event, data) {
|
|
616
616
|
const queue = getOrCreateQueue();
|
|
617
617
|
if (!queue) return;
|
|
618
|
-
const validationConfig =
|
|
618
|
+
const validationConfig = chunkHSEIUH7F_cjs.getValidationConfig();
|
|
619
619
|
const validated = chunkD5LMF53P_cjs.validateEvent(event, data, validationConfig || void 0);
|
|
620
620
|
const span2 = api.trace.getActiveSpan();
|
|
621
621
|
const enrichedData = span2 ? {
|
|
@@ -796,6 +796,14 @@ function looksLikeTraceFactory(fn) {
|
|
|
796
796
|
return true;
|
|
797
797
|
}
|
|
798
798
|
if (fn.length === 0) {
|
|
799
|
+
if (!isAsyncFunction(fn)) {
|
|
800
|
+
try {
|
|
801
|
+
const result = fn();
|
|
802
|
+
return typeof result === "function";
|
|
803
|
+
} catch {
|
|
804
|
+
return false;
|
|
805
|
+
}
|
|
806
|
+
}
|
|
799
807
|
return false;
|
|
800
808
|
}
|
|
801
809
|
const firstParam = getFirstParameterToken(fn);
|
|
@@ -1026,8 +1034,8 @@ function wrapWithTracing(fnFactory, options, variableName) {
|
|
|
1026
1034
|
}
|
|
1027
1035
|
const startTime = performance.now();
|
|
1028
1036
|
const isRootSpan = options.startNewRoot || api.trace.getActiveSpan() === void 0;
|
|
1029
|
-
const shouldAutoFlush = options.flushOnRootSpanEnd ??
|
|
1030
|
-
const shouldAutoFlushSpans =
|
|
1037
|
+
const shouldAutoFlush = options.flushOnRootSpanEnd ?? chunkHSEIUH7F_cjs.getConfig()?.flushOnRootSpanEnd ?? true;
|
|
1038
|
+
const shouldAutoFlushSpans = chunkHSEIUH7F_cjs.getConfig()?.forceFlushOnShutdown ?? false;
|
|
1031
1039
|
const flushIfNeeded = async () => {
|
|
1032
1040
|
if (!shouldAutoFlush || !isRootSpan) return;
|
|
1033
1041
|
try {
|
|
@@ -1036,7 +1044,7 @@ function wrapWithTracing(fnFactory, options, variableName) {
|
|
|
1036
1044
|
await queue.flush();
|
|
1037
1045
|
}
|
|
1038
1046
|
if (shouldAutoFlushSpans) {
|
|
1039
|
-
const sdk =
|
|
1047
|
+
const sdk = chunkHSEIUH7F_cjs.getSdk();
|
|
1040
1048
|
if (sdk) {
|
|
1041
1049
|
try {
|
|
1042
1050
|
const sdkAny = sdk;
|
|
@@ -1051,7 +1059,7 @@ function wrapWithTracing(fnFactory, options, variableName) {
|
|
|
1051
1059
|
}
|
|
1052
1060
|
}
|
|
1053
1061
|
} catch (error) {
|
|
1054
|
-
const initConfig =
|
|
1062
|
+
const initConfig = chunkHSEIUH7F_cjs.getConfig();
|
|
1055
1063
|
const logger = initConfig?.logger;
|
|
1056
1064
|
if (logger?.error) {
|
|
1057
1065
|
logger.error(
|
|
@@ -1215,14 +1223,14 @@ function wrapWithTracingSync(fnFactory, options, variableName) {
|
|
|
1215
1223
|
}
|
|
1216
1224
|
const startTime = performance.now();
|
|
1217
1225
|
const isRootSpan = options.startNewRoot || api.trace.getActiveSpan() === void 0;
|
|
1218
|
-
const shouldAutoFlush = options.flushOnRootSpanEnd ??
|
|
1219
|
-
const shouldAutoFlushSpans =
|
|
1226
|
+
const shouldAutoFlush = options.flushOnRootSpanEnd ?? chunkHSEIUH7F_cjs.getConfig()?.flushOnRootSpanEnd ?? true;
|
|
1227
|
+
const shouldAutoFlushSpans = chunkHSEIUH7F_cjs.getConfig()?.forceFlushOnShutdown ?? false;
|
|
1220
1228
|
const flushIfNeeded = () => {
|
|
1221
1229
|
if (!shouldAutoFlush || !isRootSpan) return;
|
|
1222
1230
|
const queue = getEventQueue();
|
|
1223
1231
|
if (queue && queue.size() > 0) {
|
|
1224
1232
|
void queue.flush().catch((error) => {
|
|
1225
|
-
const initConfig =
|
|
1233
|
+
const initConfig = chunkHSEIUH7F_cjs.getConfig();
|
|
1226
1234
|
const logger = initConfig?.logger;
|
|
1227
1235
|
if (logger?.error) {
|
|
1228
1236
|
logger.error(
|
|
@@ -1235,7 +1243,7 @@ function wrapWithTracingSync(fnFactory, options, variableName) {
|
|
|
1235
1243
|
});
|
|
1236
1244
|
}
|
|
1237
1245
|
if (shouldAutoFlushSpans) {
|
|
1238
|
-
const sdk =
|
|
1246
|
+
const sdk = chunkHSEIUH7F_cjs.getSdk();
|
|
1239
1247
|
if (sdk) {
|
|
1240
1248
|
try {
|
|
1241
1249
|
const sdkAny = sdk;
|
|
@@ -1243,7 +1251,7 @@ function wrapWithTracingSync(fnFactory, options, variableName) {
|
|
|
1243
1251
|
const tracerProvider = sdkAny.getTracerProvider();
|
|
1244
1252
|
if (tracerProvider && typeof tracerProvider.forceFlush === "function") {
|
|
1245
1253
|
void tracerProvider.forceFlush().catch((error) => {
|
|
1246
|
-
const initConfig =
|
|
1254
|
+
const initConfig = chunkHSEIUH7F_cjs.getConfig();
|
|
1247
1255
|
const logger = initConfig?.logger;
|
|
1248
1256
|
if (logger?.error) {
|
|
1249
1257
|
logger.error(
|
|
@@ -1386,8 +1394,8 @@ function executeImmediately(fn, options) {
|
|
|
1386
1394
|
}
|
|
1387
1395
|
const startTime = performance.now();
|
|
1388
1396
|
const isRootSpan = options.startNewRoot || api.trace.getActiveSpan() === void 0;
|
|
1389
|
-
const shouldAutoFlush = options.flushOnRootSpanEnd ??
|
|
1390
|
-
const shouldAutoFlushSpans =
|
|
1397
|
+
const shouldAutoFlush = options.flushOnRootSpanEnd ?? chunkHSEIUH7F_cjs.getConfig()?.flushOnRootSpanEnd ?? true;
|
|
1398
|
+
const shouldAutoFlushSpans = chunkHSEIUH7F_cjs.getConfig()?.forceFlushOnShutdown ?? false;
|
|
1391
1399
|
const callCounter = options.withMetrics ? meter.createCounter(`${spanName}.calls`, {
|
|
1392
1400
|
description: `Call count for ${spanName}`,
|
|
1393
1401
|
unit: "1"
|
|
@@ -1404,7 +1412,7 @@ function executeImmediately(fn, options) {
|
|
|
1404
1412
|
await queue.flush();
|
|
1405
1413
|
}
|
|
1406
1414
|
if (shouldAutoFlushSpans) {
|
|
1407
|
-
const sdk =
|
|
1415
|
+
const sdk = chunkHSEIUH7F_cjs.getSdk();
|
|
1408
1416
|
if (sdk) {
|
|
1409
1417
|
try {
|
|
1410
1418
|
const sdkAny = sdk;
|
|
@@ -1419,7 +1427,7 @@ function executeImmediately(fn, options) {
|
|
|
1419
1427
|
}
|
|
1420
1428
|
}
|
|
1421
1429
|
} catch (error) {
|
|
1422
|
-
const initConfig =
|
|
1430
|
+
const initConfig = chunkHSEIUH7F_cjs.getConfig();
|
|
1423
1431
|
const logger = initConfig?.logger;
|
|
1424
1432
|
if (logger?.error) {
|
|
1425
1433
|
logger.error(
|
|
@@ -1768,13 +1776,13 @@ function withBaggage(options) {
|
|
|
1768
1776
|
}
|
|
1769
1777
|
return value;
|
|
1770
1778
|
},
|
|
1771
|
-
(
|
|
1779
|
+
(error) => {
|
|
1772
1780
|
if (previousStored) {
|
|
1773
1781
|
return ctxStorage.run(previousStored, () => {
|
|
1774
|
-
throw
|
|
1782
|
+
throw error;
|
|
1775
1783
|
});
|
|
1776
1784
|
}
|
|
1777
|
-
throw
|
|
1785
|
+
throw error;
|
|
1778
1786
|
}
|
|
1779
1787
|
);
|
|
1780
1788
|
}
|
|
@@ -1791,5 +1799,5 @@ exports.track = track;
|
|
|
1791
1799
|
exports.withBaggage = withBaggage;
|
|
1792
1800
|
exports.withNewContext = withNewContext;
|
|
1793
1801
|
exports.withTracing = withTracing;
|
|
1794
|
-
//# sourceMappingURL=chunk-
|
|
1795
|
-
//# sourceMappingURL=chunk-
|
|
1802
|
+
//# sourceMappingURL=chunk-3ZFDJJWZ.cjs.map
|
|
1803
|
+
//# sourceMappingURL=chunk-3ZFDJJWZ.cjs.map
|