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.
Files changed (110) hide show
  1. package/README.md +112 -6
  2. package/dist/auto.cjs +3 -3
  3. package/dist/auto.js +2 -2
  4. package/dist/{chunk-EWH2542B.js → chunk-3AMR5XLZ.js} +3 -3
  5. package/dist/{chunk-EWH2542B.js.map → chunk-3AMR5XLZ.js.map} +1 -1
  6. package/dist/chunk-3QXBFGKP.js +344 -0
  7. package/dist/chunk-3QXBFGKP.js.map +1 -0
  8. package/dist/{chunk-VQFF2WMP.cjs → chunk-3ZFDJJWZ.cjs} +37 -29
  9. package/dist/chunk-3ZFDJJWZ.cjs.map +1 -0
  10. package/dist/{chunk-CQC6RVLR.cjs → chunk-4RZ4JUBY.cjs} +5 -5
  11. package/dist/{chunk-CQC6RVLR.cjs.map → chunk-4RZ4JUBY.cjs.map} +1 -1
  12. package/dist/{chunk-PAVYKPCQ.js → chunk-5XUEHX7J.js} +3 -3
  13. package/dist/{chunk-PAVYKPCQ.js.map → chunk-5XUEHX7J.js.map} +1 -1
  14. package/dist/chunk-6S5RUKU3.cjs +347 -0
  15. package/dist/chunk-6S5RUKU3.cjs.map +1 -0
  16. package/dist/{chunk-BS757SL2.js → chunk-724XLWR3.js} +9 -4
  17. package/dist/chunk-724XLWR3.js.map +1 -0
  18. package/dist/chunk-7EQ4G4SI.cjs +146 -0
  19. package/dist/chunk-7EQ4G4SI.cjs.map +1 -0
  20. package/dist/{chunk-CQP5SQT4.cjs → chunk-AXFWWJF3.cjs} +7 -7
  21. package/dist/{chunk-CQP5SQT4.cjs.map → chunk-AXFWWJF3.cjs.map} +1 -1
  22. package/dist/{chunk-7NH625MS.cjs → chunk-BSZP4URK.cjs} +5 -5
  23. package/dist/{chunk-7NH625MS.cjs.map → chunk-BSZP4URK.cjs.map} +1 -1
  24. package/dist/{chunk-GZFH6P5U.js → chunk-GY4CRZSV.js} +14 -6
  25. package/dist/chunk-GY4CRZSV.js.map +1 -0
  26. package/dist/{chunk-QKUGUDXJ.cjs → chunk-HSEIUH7F.cjs} +10 -5
  27. package/dist/chunk-HSEIUH7F.cjs.map +1 -0
  28. package/dist/{chunk-DTW3WB7Z.js → chunk-IPKXURBW.js} +3 -3
  29. package/dist/{chunk-DTW3WB7Z.js.map → chunk-IPKXURBW.js.map} +1 -1
  30. package/dist/chunk-J7VGRIAJ.js +64 -0
  31. package/dist/chunk-J7VGRIAJ.js.map +1 -0
  32. package/dist/chunk-KFOHQK7X.js +144 -0
  33. package/dist/chunk-KFOHQK7X.js.map +1 -0
  34. package/dist/{chunk-4UYR46UP.cjs → chunk-MSUHW2I4.cjs} +13 -13
  35. package/dist/{chunk-4UYR46UP.cjs.map → chunk-MSUHW2I4.cjs.map} +1 -1
  36. package/dist/chunk-T4B5LB6E.cjs +66 -0
  37. package/dist/chunk-T4B5LB6E.cjs.map +1 -0
  38. package/dist/{chunk-QHT4MUED.js → chunk-WCIIFRGL.js} +3 -3
  39. package/dist/{chunk-QHT4MUED.js.map → chunk-WCIIFRGL.js.map} +1 -1
  40. package/dist/decorators.cjs +3 -3
  41. package/dist/decorators.js +3 -3
  42. package/dist/drain-pipeline.cjs +13 -0
  43. package/dist/drain-pipeline.cjs.map +1 -0
  44. package/dist/drain-pipeline.d.cts +37 -0
  45. package/dist/drain-pipeline.d.ts +37 -0
  46. package/dist/drain-pipeline.js +4 -0
  47. package/dist/drain-pipeline.js.map +1 -0
  48. package/dist/event.cjs +6 -6
  49. package/dist/event.js +3 -3
  50. package/dist/functional.cjs +10 -10
  51. package/dist/functional.js +3 -3
  52. package/dist/index.cjs +256 -41
  53. package/dist/index.cjs.map +1 -1
  54. package/dist/index.d.cts +72 -3
  55. package/dist/index.d.ts +72 -3
  56. package/dist/index.js +210 -11
  57. package/dist/index.js.map +1 -1
  58. package/dist/{init-BMiXSJNM.d.cts → init-BC5aN8bh.d.cts} +18 -0
  59. package/dist/{init-ByRbNTRo.d.ts → init-_FG4IbhF.d.ts} +18 -0
  60. package/dist/instrumentation.cjs +9 -9
  61. package/dist/instrumentation.js +2 -2
  62. package/dist/messaging.cjs +7 -7
  63. package/dist/messaging.js +4 -4
  64. package/dist/parse-error.cjs +13 -0
  65. package/dist/parse-error.cjs.map +1 -0
  66. package/dist/parse-error.d.cts +13 -0
  67. package/dist/parse-error.d.ts +13 -0
  68. package/dist/parse-error.js +4 -0
  69. package/dist/parse-error.js.map +1 -0
  70. package/dist/processors.cjs +2 -2
  71. package/dist/processors.d.cts +40 -4
  72. package/dist/processors.d.ts +40 -4
  73. package/dist/processors.js +1 -1
  74. package/dist/semantic-helpers.cjs +8 -8
  75. package/dist/semantic-helpers.js +4 -4
  76. package/dist/webhook.cjs +4 -4
  77. package/dist/webhook.js +3 -3
  78. package/dist/workflow-distributed.cjs +5 -5
  79. package/dist/workflow-distributed.js +3 -3
  80. package/dist/workflow.cjs +8 -8
  81. package/dist/workflow.js +4 -4
  82. package/dist/yaml-config.d.cts +2 -1
  83. package/dist/yaml-config.d.ts +2 -1
  84. package/package.json +11 -1
  85. package/src/drain-pipeline.test.ts +68 -0
  86. package/src/drain-pipeline.ts +199 -0
  87. package/src/flatten-attributes.test.ts +76 -0
  88. package/src/flatten-attributes.ts +80 -0
  89. package/src/functional.test.ts +63 -0
  90. package/src/functional.ts +11 -3
  91. package/src/index.ts +33 -0
  92. package/src/init.ts +22 -0
  93. package/src/parse-error.test.ts +73 -0
  94. package/src/parse-error.ts +112 -0
  95. package/src/pretty-log-formatter.test.ts +123 -0
  96. package/src/pretty-log-formatter.ts +210 -0
  97. package/src/processors/canonical-log-line-processor.test.ts +81 -25
  98. package/src/processors/canonical-log-line-processor.ts +130 -42
  99. package/src/request-logger.test.ts +124 -0
  100. package/src/request-logger.ts +140 -0
  101. package/src/structured-error.test.ts +76 -0
  102. package/src/structured-error.ts +86 -0
  103. package/dist/chunk-2RQDNGV3.js +0 -126
  104. package/dist/chunk-2RQDNGV3.js.map +0 -1
  105. package/dist/chunk-BS757SL2.js.map +0 -1
  106. package/dist/chunk-GZFH6P5U.js.map +0 -1
  107. package/dist/chunk-ONK2Y22L.cjs +0 -128
  108. package/dist/chunk-ONK2Y22L.cjs.map +0 -1
  109. package/dist/chunk-QKUGUDXJ.cjs.map +0 -1
  110. 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":"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","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![level](canonicalLogLine, message);\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 chunkQKUGUDXJ_cjs = require('./chunk-QKUGUDXJ.cjs');
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 = chunkQKUGUDXJ_cjs.getLogger();
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
- chunkQKUGUDXJ_cjs.getLogger().error(
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
- chunkQKUGUDXJ_cjs.getLogger().warn(
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
- chunkQKUGUDXJ_cjs.getLogger().error(
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 = chunkQKUGUDXJ_cjs.getEventsConfig();
548
- const config = chunkQKUGUDXJ_cjs.getConfig();
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 (!chunkQKUGUDXJ_cjs.isInitialized()) {
603
- chunkQKUGUDXJ_cjs.warnIfNotInitialized("track()");
602
+ if (!chunkHSEIUH7F_cjs.isInitialized()) {
603
+ chunkHSEIUH7F_cjs.warnIfNotInitialized("track()");
604
604
  return null;
605
605
  }
606
606
  if (!eventsQueue) {
607
- const config = chunkQKUGUDXJ_cjs.getConfig();
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 = chunkQKUGUDXJ_cjs.getValidationConfig();
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 ?? chunkQKUGUDXJ_cjs.getConfig()?.flushOnRootSpanEnd ?? true;
1030
- const shouldAutoFlushSpans = chunkQKUGUDXJ_cjs.getConfig()?.forceFlushOnShutdown ?? false;
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 = chunkQKUGUDXJ_cjs.getSdk();
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 = chunkQKUGUDXJ_cjs.getConfig();
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 ?? chunkQKUGUDXJ_cjs.getConfig()?.flushOnRootSpanEnd ?? true;
1219
- const shouldAutoFlushSpans = chunkQKUGUDXJ_cjs.getConfig()?.forceFlushOnShutdown ?? false;
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 = chunkQKUGUDXJ_cjs.getConfig();
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 = chunkQKUGUDXJ_cjs.getSdk();
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 = chunkQKUGUDXJ_cjs.getConfig();
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 ?? chunkQKUGUDXJ_cjs.getConfig()?.flushOnRootSpanEnd ?? true;
1390
- const shouldAutoFlushSpans = chunkQKUGUDXJ_cjs.getConfig()?.forceFlushOnShutdown ?? false;
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 = chunkQKUGUDXJ_cjs.getSdk();
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 = chunkQKUGUDXJ_cjs.getConfig();
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
- (err) => {
1779
+ (error) => {
1772
1780
  if (previousStored) {
1773
1781
  return ctxStorage.run(previousStored, () => {
1774
- throw err;
1782
+ throw error;
1775
1783
  });
1776
1784
  }
1777
- throw err;
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-VQFF2WMP.cjs.map
1795
- //# sourceMappingURL=chunk-VQFF2WMP.cjs.map
1802
+ //# sourceMappingURL=chunk-3ZFDJJWZ.cjs.map
1803
+ //# sourceMappingURL=chunk-3ZFDJJWZ.cjs.map