abxbus 2.4.23 → 2.4.26

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.
@@ -1,4 +1,4 @@
1
- import { trace, type Span, type SpanAttributes, type SpanContext, type Tracer } from '@opentelemetry/api';
1
+ import { trace, type Span, type SpanAttributes, type SpanContext, type TimeInput, type Tracer } from '@opentelemetry/api';
2
2
  import type { BaseEvent } from './base_event.js';
3
3
  import type { EventBus } from './event_bus.js';
4
4
  import type { EventResult } from './event_result.js';
@@ -10,7 +10,7 @@ export type OtelTracingSpanFactoryInput = {
10
10
  span_context: SpanContext;
11
11
  parent_span_context?: SpanContext;
12
12
  attributes: SpanAttributes;
13
- start_time?: Date;
13
+ start_time?: TimeInput;
14
14
  };
15
15
  export type OtelTracingSpanFactory = (input: OtelTracingSpanFactoryInput) => Span;
16
16
  export type OtelTracingSpanProvider = object;
@@ -22,7 +22,6 @@ export type OtelTracingMiddlewareOptions = {
22
22
  otlp_endpoint?: string;
23
23
  service_name?: string;
24
24
  instrumentation_name?: string;
25
- root_span_name?: string | ((eventbus: EventBus, event: BaseEvent) => string);
26
25
  root_span_attributes?: SpanAttributes | ((eventbus: EventBus, event: BaseEvent) => SpanAttributes);
27
26
  };
28
27
  export declare class OtelTracingMiddleware implements EventBusMiddleware {
@@ -30,10 +29,7 @@ export declare class OtelTracingMiddleware implements EventBusMiddleware {
30
29
  private readonly trace_api;
31
30
  private readonly span_factory?;
32
31
  private readonly span_provider?;
33
- private readonly root_span_name;
34
32
  private readonly root_span_attributes;
35
- private readonly root_spans;
36
- private readonly root_contexts;
37
33
  private readonly event_spans;
38
34
  private readonly event_contexts;
39
35
  private readonly handler_spans;
@@ -45,10 +41,9 @@ export declare class OtelTracingMiddleware implements EventBusMiddleware {
45
41
  private completeEventSpan;
46
42
  private startHandlerSpan;
47
43
  private completeHandlerSpan;
48
- private startRootSpan;
49
- private completeRootSpan;
50
44
  private parentContextForEvent;
51
45
  private completeEventSpanWithFactory;
52
- private completeHandlerSpanWithFactory;
46
+ private exportEventTreeWithFactory;
47
+ private exportHandlerSpanWithFactory;
53
48
  }
54
49
  export {};
@@ -31,10 +31,7 @@ class OtelTracingMiddleware {
31
31
  trace_api;
32
32
  span_factory;
33
33
  span_provider;
34
- root_span_name;
35
34
  root_span_attributes;
36
- root_spans = /* @__PURE__ */ new Map();
37
- root_contexts = /* @__PURE__ */ new Map();
38
35
  event_spans = /* @__PURE__ */ new Map();
39
36
  event_contexts = /* @__PURE__ */ new Map();
40
37
  handler_spans = /* @__PURE__ */ new Map();
@@ -44,7 +41,6 @@ class OtelTracingMiddleware {
44
41
  this.tracer = options.tracer ?? this.trace_api.getTracer("abxbus");
45
42
  this.span_provider = options.span_provider ?? (options.otlp_endpoint ? createOtlpSpanProvider(options) : void 0);
46
43
  this.span_factory = options.span_factory ?? (this.span_provider ? createProviderSpanFactory(this.trace_api, this.span_provider, options.instrumentation_name ?? "abxbus") : void 0);
47
- this.root_span_name = options.root_span_name;
48
44
  this.root_span_attributes = options.root_span_attributes;
49
45
  }
50
46
  onEventChange(eventbus, event, status) {
@@ -76,22 +72,12 @@ class OtelTracingMiddleware {
76
72
  if (existing) {
77
73
  return existing;
78
74
  }
79
- const parent_context = this.parentContextForEvent(event) ?? this.startRootSpan(eventbus, event);
80
- const start_time = dateFromIso(event.event_started_at);
75
+ const parent_context = this.parentContextForEvent(event) ?? import_api.ROOT_CONTEXT;
76
+ const start_time = timeInputFromIso(event.event_started_at);
81
77
  const span = this.tracer.startSpan(
82
78
  eventSpanName(eventbus, event),
83
79
  {
84
- attributes: compactAttributes({
85
- "abxbus.bus.id": eventbus.id,
86
- "abxbus.bus.name": eventbus.name,
87
- "abxbus.event.id": event.event_id,
88
- "abxbus.event.type": event.event_type,
89
- "abxbus.event.version": event.event_version,
90
- "abxbus.event.session_id": stringValue(event.session_id),
91
- "abxbus.event.parent_id": event.event_parent_id,
92
- "abxbus.event.emitted_by_handler_id": event.event_emitted_by_handler_id,
93
- "abxbus.event.path": event.event_path.join(" ")
94
- }),
80
+ attributes: event.event_parent_id ? eventStartedSpanAttributes(eventbus, event) : topLevelEventStartedSpanAttributes(this.root_span_attributes, eventbus, event),
95
81
  startTime: start_time
96
82
  },
97
83
  parent_context
@@ -113,19 +99,13 @@ class OtelTracingMiddleware {
113
99
  span.setStatus({ code: import_api.SpanStatusCode.OK });
114
100
  }
115
101
  span.setAttributes(
116
- compactAttributes({
117
- "abxbus.event.status": event.event_status,
118
- "abxbus.event.result_count": event.event_results.size,
119
- "abxbus.event.error_count": event.event_errors.length,
120
- "abxbus.event.child_count": event.event_children.length
121
- })
102
+ event.event_parent_id ? eventSpanAttributes(eventbus, event) : topLevelEventSpanAttributes(this.root_span_attributes, eventbus, event)
122
103
  );
123
- const start_time = dateFromIso(event.event_started_at);
124
- const end_time = endTimeAfterStart(start_time, dateFromIso(event.event_completed_at));
104
+ const start_time = epochNsFromIso(event.event_started_at);
105
+ const end_time = endTimeAfterStart(start_time, epochNsFromIso(event.event_completed_at));
125
106
  span.end(end_time);
126
107
  this.event_spans.delete(event.event_id);
127
108
  this.event_contexts.delete(event.event_id);
128
- this.completeRootSpan(event.event_id, start_time, end_time);
129
109
  }
130
110
  startHandlerSpan(eventbus, event, event_result) {
131
111
  const existing = this.handler_spans.get(event_result.id);
@@ -136,18 +116,8 @@ class OtelTracingMiddleware {
136
116
  const span = this.tracer.startSpan(
137
117
  handlerSpanName(event, event_result),
138
118
  {
139
- attributes: compactAttributes({
140
- "abxbus.bus.id": eventbus.id,
141
- "abxbus.bus.name": eventbus.name,
142
- "abxbus.event.id": event.event_id,
143
- "abxbus.event.type": event.event_type,
144
- "abxbus.handler.id": event_result.handler_id,
145
- "abxbus.handler.name": event_result.handler_name,
146
- "abxbus.handler.file_path": event_result.handler_file_path,
147
- "abxbus.handler.event_pattern": event_result.handler.event_pattern,
148
- "abxbus.event_result.id": event_result.id
149
- }),
150
- startTime: dateFromIso(event_result.started_at)
119
+ attributes: handlerSpanAttributes(eventbus, event, event_result),
120
+ startTime: timeInputFromIso(event_result.started_at)
151
121
  },
152
122
  parent_context
153
123
  );
@@ -158,7 +128,6 @@ class OtelTracingMiddleware {
158
128
  }
159
129
  completeHandlerSpan(eventbus, event, event_result) {
160
130
  if (this.span_factory) {
161
- this.completeHandlerSpanWithFactory(eventbus, event, event_result);
162
131
  return;
163
132
  }
164
133
  const span = this.handler_spans.get(event_result.id);
@@ -170,54 +139,11 @@ class OtelTracingMiddleware {
170
139
  } else {
171
140
  span.setStatus({ code: import_api.SpanStatusCode.OK });
172
141
  }
173
- span.setAttributes(
174
- compactAttributes({
175
- "abxbus.event_result.status": event_result.status,
176
- "abxbus.handler.child_count": event_result.event_children.length
177
- })
178
- );
179
- span.end(endTimeAfterStart(dateFromIso(event_result.started_at), dateFromIso(event_result.completed_at)));
142
+ span.setAttributes(handlerSpanAttributes(eventbus, event, event_result));
143
+ span.end(endTimeAfterStart(epochNsFromIso(event_result.started_at), epochNsFromIso(event_result.completed_at)));
180
144
  this.handler_spans.delete(event_result.id);
181
145
  this.handler_contexts.delete(handlerSpanKey(event_result.event_id, event_result.handler_id));
182
146
  }
183
- startRootSpan(eventbus, event) {
184
- const existing = this.root_contexts.get(event.event_id);
185
- if (existing) {
186
- return existing;
187
- }
188
- const session_id = stringValue(event.session_id);
189
- const root_attributes = resolveAttributes(this.root_span_attributes, eventbus, event);
190
- const root_span = this.tracer.startSpan(
191
- resolveRootSpanName(this.root_span_name, eventbus, event),
192
- {
193
- attributes: compactAttributes({
194
- ...root_attributes,
195
- "abxbus.trace.root": true,
196
- "abxbus.bus.id": eventbus.id,
197
- "abxbus.bus.name": eventbus.name,
198
- "abxbus.root_event.id": event.event_id,
199
- "abxbus.root_event.type": event.event_type,
200
- "abxbus.root_event.session_id": session_id
201
- }),
202
- startTime: dateFromIso(event.event_started_at)
203
- },
204
- import_api.ROOT_CONTEXT
205
- );
206
- const root_context = this.trace_api.setSpan(import_api.ROOT_CONTEXT, root_span);
207
- this.root_spans.set(event.event_id, root_span);
208
- this.root_contexts.set(event.event_id, root_context);
209
- return root_context;
210
- }
211
- completeRootSpan(event_id, start_time, end_time) {
212
- const root_span = this.root_spans.get(event_id);
213
- if (!root_span) {
214
- return;
215
- }
216
- root_span.setStatus({ code: import_api.SpanStatusCode.OK });
217
- root_span.end(endTimeAfterStart(start_time, end_time));
218
- this.root_spans.delete(event_id);
219
- this.root_contexts.delete(event_id);
220
- }
221
147
  parentContextForEvent(event) {
222
148
  if (event.event_parent_id && event.event_emitted_by_handler_id) {
223
149
  const handler_context = this.handler_contexts.get(handlerSpanKey(event.event_parent_id, event.event_emitted_by_handler_id));
@@ -228,52 +154,58 @@ class OtelTracingMiddleware {
228
154
  return event.event_parent_id ? this.event_contexts.get(event.event_parent_id) : void 0;
229
155
  }
230
156
  completeEventSpanWithFactory(eventbus, event) {
231
- const root_event = rootEventForEvent(eventbus, event);
232
- const trace_id = traceIdForRootEvent(root_event.event_id);
233
- const event_context = eventSpanContext(trace_id, event.event_id);
234
- const start_time = dateFromIso(event.event_started_at);
235
- const end_time = endTimeAfterStart(start_time, dateFromIso(event.event_completed_at));
236
- if (!event.event_parent_id) {
237
- const root_span = this.span_factory({
238
- name: resolveRootSpanName(this.root_span_name, eventbus, event),
239
- span_context: rootSpanContext(trace_id, event.event_id),
240
- attributes: rootSpanAttributes(this.root_span_attributes, eventbus, event),
241
- start_time
242
- });
243
- root_span.setStatus({ code: import_api.SpanStatusCode.OK });
244
- root_span.end(end_time);
157
+ if (event.event_parent_id) {
158
+ return;
159
+ }
160
+ const top_level_event = event._event_original ?? event;
161
+ const trace_id = traceIdForRootEvent(top_level_event.event_id);
162
+ this.exportEventTreeWithFactory(eventbus, top_level_event, trace_id, void 0, /* @__PURE__ */ new Set());
163
+ }
164
+ exportEventTreeWithFactory(eventbus, event, trace_id, parent_span_context, visited_event_ids) {
165
+ const original_event = event._event_original ?? event;
166
+ if (visited_event_ids.has(original_event.event_id)) {
167
+ return;
245
168
  }
169
+ visited_event_ids.add(original_event.event_id);
170
+ const start_time = epochNsFromIso(original_event.event_started_at);
171
+ const span_context = eventSpanContext(trace_id, original_event.event_id);
246
172
  const span = this.span_factory({
247
- name: eventSpanName(eventbus, event),
248
- span_context: event_context,
249
- parent_span_context: parentSpanContextForEvent(event, trace_id),
250
- attributes: eventSpanAttributes(eventbus, event),
251
- start_time
173
+ name: eventSpanName(eventbus, original_event),
174
+ span_context,
175
+ parent_span_context,
176
+ attributes: original_event.event_parent_id ? eventSpanAttributes(eventbus, original_event) : topLevelEventSpanAttributes(this.root_span_attributes, eventbus, original_event),
177
+ start_time: timeInputFromEpochNs(start_time)
252
178
  });
253
- if (event.event_errors.length > 0) {
254
- recordSpanError(span, event.event_errors[0]);
179
+ if (original_event.event_errors.length > 0) {
180
+ recordSpanError(span, original_event.event_errors[0]);
255
181
  } else {
256
182
  span.setStatus({ code: import_api.SpanStatusCode.OK });
257
183
  }
258
- span.end(end_time);
184
+ span.end(endTimeAfterStart(start_time, epochNsFromIso(original_event.event_completed_at)));
185
+ for (const event_result of original_event.event_results.values()) {
186
+ const handler_context = this.exportHandlerSpanWithFactory(eventbus, original_event, event_result, trace_id, span_context);
187
+ for (const child of event_result.event_children) {
188
+ this.exportEventTreeWithFactory(eventbus, child, trace_id, handler_context, visited_event_ids);
189
+ }
190
+ }
259
191
  }
260
- completeHandlerSpanWithFactory(eventbus, event, event_result) {
261
- const root_event = rootEventForEvent(eventbus, event);
262
- const trace_id = traceIdForRootEvent(root_event.event_id);
263
- const start_time = dateFromIso(event_result.started_at);
192
+ exportHandlerSpanWithFactory(eventbus, event, event_result, trace_id, parent_span_context) {
193
+ const start_time = epochNsFromIso(event_result.started_at);
194
+ const span_context = handlerSpanContext(trace_id, event_result.event_id, event_result.handler_id);
264
195
  const span = this.span_factory({
265
196
  name: handlerSpanName(event, event_result),
266
- span_context: handlerSpanContext(trace_id, event_result.event_id, event_result.handler_id),
267
- parent_span_context: eventSpanContext(trace_id, event.event_id),
197
+ span_context,
198
+ parent_span_context,
268
199
  attributes: handlerSpanAttributes(eventbus, event, event_result),
269
- start_time
200
+ start_time: timeInputFromEpochNs(start_time)
270
201
  });
271
202
  if (event_result.error !== void 0) {
272
203
  recordSpanError(span, event_result.error);
273
204
  } else {
274
205
  span.setStatus({ code: import_api.SpanStatusCode.OK });
275
206
  }
276
- span.end(endTimeAfterStart(start_time, dateFromIso(event_result.completed_at)));
207
+ span.end(endTimeAfterStart(start_time, epochNsFromIso(event_result.completed_at)));
208
+ return span_context;
277
209
  }
278
210
  }
279
211
  function handlerSpanKey(event_id, handler_id) {
@@ -291,10 +223,13 @@ function createOtlpSpanProvider(options) {
291
223
  "service.name": options.service_name ?? "abxbus"
292
224
  }),
293
225
  spanProcessors: [
294
- new import_sdk_trace_base.SimpleSpanProcessor(
226
+ new import_sdk_trace_base.BatchSpanProcessor(
295
227
  new import_exporter_trace_otlp_http.OTLPTraceExporter({
296
228
  url: normalizeOtlpTracesEndpoint(options.otlp_endpoint)
297
- })
229
+ }),
230
+ {
231
+ scheduledDelayMillis: 100
232
+ }
298
233
  )
299
234
  ]
300
235
  });
@@ -328,81 +263,52 @@ function normalizeOtlpTracesEndpoint(endpoint) {
328
263
  const trimmed = endpoint.replace(/\/+$/, "");
329
264
  return trimmed.endsWith("/v1/traces") ? trimmed : `${trimmed}/v1/traces`;
330
265
  }
266
+ function eventStartedSpanAttributes(eventbus, event) {
267
+ return compactAttributes({
268
+ "abxbus.event_bus.id": eventbus.id,
269
+ "abxbus.event_bus.name": eventbus.name,
270
+ "abxbus.event_id": event.event_id,
271
+ "abxbus.event_type": event.event_type,
272
+ "abxbus.event_version": event.event_version,
273
+ "abxbus.session_id": stringValue(event.session_id),
274
+ "abxbus.event_parent_id": event.event_parent_id,
275
+ "abxbus.event_emitted_by_handler_id": event.event_emitted_by_handler_id,
276
+ "abxbus.event_path": event.event_path.join(" ")
277
+ });
278
+ }
331
279
  function eventSpanAttributes(eventbus, event) {
332
280
  return compactAttributes({
333
- "abxbus.bus.id": eventbus.id,
334
- "abxbus.bus.name": eventbus.name,
335
- "abxbus.event.id": event.event_id,
336
- "abxbus.event.type": event.event_type,
337
- "abxbus.event.version": event.event_version,
338
- "abxbus.event.session_id": stringValue(event.session_id),
339
- "abxbus.event.parent_id": event.event_parent_id,
340
- "abxbus.event.emitted_by_handler_id": event.event_emitted_by_handler_id,
341
- "abxbus.event.path": event.event_path.join(" "),
342
- "abxbus.event.status": event.event_status,
343
- "abxbus.event.result_count": event.event_results.size,
344
- "abxbus.event.error_count": event.event_errors.length,
345
- "abxbus.event.child_count": event.event_children.length
281
+ ...eventStartedSpanAttributes(eventbus, event),
282
+ "abxbus.event_status": event.event_status
346
283
  });
347
284
  }
348
285
  function handlerSpanAttributes(eventbus, event, event_result) {
349
286
  return compactAttributes({
350
- "abxbus.bus.id": eventbus.id,
351
- "abxbus.bus.name": eventbus.name,
352
- "abxbus.event.id": event.event_id,
353
- "abxbus.event.type": event.event_type,
354
- "abxbus.handler.id": event_result.handler_id,
355
- "abxbus.handler.name": event_result.handler_name,
356
- "abxbus.handler.file_path": event_result.handler_file_path,
357
- "abxbus.handler.event_pattern": event_result.handler.event_pattern,
358
- "abxbus.event_result.id": event_result.id,
359
- "abxbus.event_result.status": event_result.status,
360
- "abxbus.handler.child_count": event_result.event_children.length
287
+ "abxbus.event_bus.id": eventbus.id,
288
+ "abxbus.event_bus.name": eventbus.name,
289
+ "abxbus.event_id": event.event_id,
290
+ "abxbus.event_type": event.event_type,
291
+ "abxbus.handler_id": event_result.handler_id,
292
+ "abxbus.handler_name": event_result.handler_name,
293
+ "abxbus.handler_file_path": event_result.handler_file_path,
294
+ "abxbus.handler_event_pattern": event_result.handler.event_pattern,
295
+ "abxbus.event_result_id": event_result.id,
296
+ "abxbus.event_result_status": event_result.status
361
297
  });
362
298
  }
363
- function rootSpanAttributes(root_span_attributes, eventbus, event) {
364
- const session_id = stringValue(event.session_id);
299
+ function topLevelEventStartedSpanAttributes(root_span_attributes, eventbus, event) {
365
300
  return compactAttributes({
301
+ ...eventStartedSpanAttributes(eventbus, event),
366
302
  ...resolveAttributes(root_span_attributes, eventbus, event),
367
- "abxbus.trace.root": true,
368
- "abxbus.bus.id": eventbus.id,
369
- "abxbus.bus.name": eventbus.name,
370
- "abxbus.root_event.id": event.event_id,
371
- "abxbus.root_event.type": event.event_type,
372
- "abxbus.root_event.session_id": session_id,
373
- "abxbus.root_event.status": event.event_status,
374
- "abxbus.root_event.error_count": event.event_errors.length,
375
- "abxbus.root_event.child_count": event.event_children.length
303
+ "abxbus.trace.root": true
376
304
  });
377
305
  }
378
- function rootEventForEvent(eventbus, event) {
379
- let current = event._event_original ?? event;
380
- const seen = /* @__PURE__ */ new Set();
381
- while (current.event_parent_id && !seen.has(current.event_id)) {
382
- seen.add(current.event_id);
383
- const parent = eventbus.findEventById(current.event_parent_id);
384
- if (!parent) {
385
- break;
386
- }
387
- current = parent._event_original ?? parent;
388
- }
389
- return current;
390
- }
391
- function parentSpanContextForEvent(event, trace_id) {
392
- if (!event.event_parent_id) {
393
- return rootSpanContext(trace_id, event.event_id);
394
- }
395
- if (event.event_emitted_by_handler_id) {
396
- return handlerSpanContext(trace_id, event.event_parent_id, event.event_emitted_by_handler_id);
397
- }
398
- return eventSpanContext(trace_id, event.event_parent_id);
399
- }
400
- function rootSpanContext(trace_id, event_id) {
401
- return {
402
- traceId: trace_id,
403
- spanId: deterministicSpanId(`abxbus.root:${event_id}`),
404
- traceFlags: 1
405
- };
306
+ function topLevelEventSpanAttributes(root_span_attributes, eventbus, event) {
307
+ return compactAttributes({
308
+ ...eventSpanAttributes(eventbus, event),
309
+ ...resolveAttributes(root_span_attributes, eventbus, event),
310
+ "abxbus.trace.root": true
311
+ });
406
312
  }
407
313
  function eventSpanContext(trace_id, event_id) {
408
314
  return {
@@ -437,24 +343,40 @@ function fnv1a64Hex(input) {
437
343
  }
438
344
  return hash.toString(16).padStart(16, "0");
439
345
  }
440
- function dateFromIso(value) {
346
+ const ISO_EPOCH_NS_REGEX = /^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2})(?:\.(\d{1,9}))?(Z|[+-]\d{2}:\d{2})$/;
347
+ const NS_PER_SECOND = 1000000000n;
348
+ const NS_PER_MS = 1000000n;
349
+ function epochNsFromIso(value) {
441
350
  if (value == null) {
442
351
  return void 0;
443
352
  }
444
- const date = new Date(value);
445
- return Number.isNaN(date.getTime()) ? void 0 : date;
353
+ const match = ISO_EPOCH_NS_REGEX.exec(value);
354
+ if (!match) {
355
+ return void 0;
356
+ }
357
+ const [, base, fraction = "", timezone] = match;
358
+ const base_ms = Date.parse(`${base}.000${timezone}`);
359
+ if (Number.isNaN(base_ms)) {
360
+ return void 0;
361
+ }
362
+ return BigInt(base_ms) * NS_PER_MS + BigInt(fraction.padEnd(9, "0"));
446
363
  }
447
- function endTimeAfterStart(start_time, end_time) {
448
- if (!start_time || !end_time) {
449
- return end_time;
364
+ function timeInputFromIso(value) {
365
+ return timeInputFromEpochNs(epochNsFromIso(value));
366
+ }
367
+ function timeInputFromEpochNs(epoch_ns) {
368
+ if (epoch_ns === void 0) {
369
+ return void 0;
450
370
  }
451
- return end_time.getTime() > start_time.getTime() ? end_time : new Date(start_time.getTime() + 1);
371
+ const seconds = epoch_ns / NS_PER_SECOND;
372
+ const nanos = epoch_ns % NS_PER_SECOND;
373
+ return [Number(seconds), Number(nanos)];
452
374
  }
453
- function resolveRootSpanName(root_span_name, eventbus, event) {
454
- if (typeof root_span_name === "function") {
455
- return root_span_name(eventbus, event);
375
+ function endTimeAfterStart(start_time, end_time) {
376
+ if (start_time === void 0 || end_time === void 0) {
377
+ return timeInputFromEpochNs(end_time);
456
378
  }
457
- return root_span_name ?? `abxbus.trace ${eventbus.name}`;
379
+ return timeInputFromEpochNs(end_time > start_time ? end_time : start_time + 1n);
458
380
  }
459
381
  function resolveAttributes(attributes, eventbus, event) {
460
382
  return typeof attributes === "function" ? attributes(eventbus, event) : attributes ?? {};
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/middleware_otel_tracing.ts"],
4
- "sourcesContent": ["import {\n ROOT_CONTEXT,\n SpanKind,\n SpanStatusCode,\n trace,\n type Context,\n type Span,\n type SpanAttributeValue,\n type SpanAttributes,\n type SpanContext,\n type Tracer,\n} from '@opentelemetry/api'\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'\nimport { resourceFromAttributes } from '@opentelemetry/resources'\nimport { BasicTracerProvider, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base'\nimport type { SpanLimits, SpanProcessor } from '@opentelemetry/sdk-trace-base'\nimport { SpanImpl } from '@opentelemetry/sdk-trace-base/build/src/Span.js'\n\nimport type { BaseEvent } from './base_event.js'\nimport type { EventBus } from './event_bus.js'\nimport type { EventResult } from './event_result.js'\nimport type { EventBusMiddleware } from './middlewares.js'\nimport type { EventStatus } from './types.js'\n\ntype OpenTelemetryTraceApi = Pick<typeof trace, 'getTracer' | 'setSpan'> & Partial<Pick<typeof trace, 'setSpanContext'>>\n\nexport type OtelTracingSpanFactoryInput = {\n name: string\n span_context: SpanContext\n parent_span_context?: SpanContext\n attributes: SpanAttributes\n start_time?: Date\n}\n\nexport type OtelTracingSpanFactory = (input: OtelTracingSpanFactoryInput) => Span\n\ntype OtelTracingSpanProviderInternals = {\n _activeSpanProcessor?: SpanProcessor\n _config?: {\n resource?: unknown\n spanLimits?: SpanLimits\n }\n _resource?: unknown\n}\n\nexport type OtelTracingSpanProvider = object\n\nexport type OtelTracingMiddlewareOptions = {\n tracer?: Tracer\n trace_api?: OpenTelemetryTraceApi\n span_provider?: OtelTracingSpanProvider\n span_factory?: OtelTracingSpanFactory\n otlp_endpoint?: string\n service_name?: string\n instrumentation_name?: string\n root_span_name?: string | ((eventbus: EventBus, event: BaseEvent) => string)\n root_span_attributes?: SpanAttributes | ((eventbus: EventBus, event: BaseEvent) => SpanAttributes)\n}\n\nexport class OtelTracingMiddleware implements EventBusMiddleware {\n private readonly tracer: Tracer\n private readonly trace_api: OpenTelemetryTraceApi\n private readonly span_factory?: OtelTracingSpanFactory\n private readonly span_provider?: OtelTracingSpanProvider\n private readonly root_span_name: OtelTracingMiddlewareOptions['root_span_name']\n private readonly root_span_attributes: OtelTracingMiddlewareOptions['root_span_attributes']\n private readonly root_spans = new Map<string, Span>()\n private readonly root_contexts = new Map<string, Context>()\n private readonly event_spans = new Map<string, Span>()\n private readonly event_contexts = new Map<string, Context>()\n private readonly handler_spans = new Map<string, Span>()\n private readonly handler_contexts = new Map<string, Context>()\n\n constructor(options: OtelTracingMiddlewareOptions = {}) {\n this.trace_api = options.trace_api ?? trace\n this.tracer = options.tracer ?? this.trace_api.getTracer('abxbus')\n this.span_provider = options.span_provider ?? (options.otlp_endpoint ? createOtlpSpanProvider(options) : undefined)\n this.span_factory =\n options.span_factory ??\n (this.span_provider\n ? createProviderSpanFactory(this.trace_api, this.span_provider, options.instrumentation_name ?? 'abxbus')\n : undefined)\n this.root_span_name = options.root_span_name\n this.root_span_attributes = options.root_span_attributes\n }\n\n onEventChange(eventbus: EventBus, event: BaseEvent, status: EventStatus): void {\n if (status === 'started') {\n if (this.span_factory) {\n return\n }\n this.startEventSpan(eventbus, event)\n return\n }\n\n if (status === 'completed') {\n this.completeEventSpan(eventbus, event)\n }\n }\n\n onEventResultChange(eventbus: EventBus, event: BaseEvent, event_result: EventResult, status: EventStatus): void {\n if (status === 'started') {\n if (this.span_factory) {\n return\n }\n this.startHandlerSpan(eventbus, event, event_result)\n return\n }\n\n if (status === 'completed') {\n this.completeHandlerSpan(eventbus, event, event_result)\n }\n }\n\n private startEventSpan(eventbus: EventBus, event: BaseEvent): Span {\n const existing = this.event_spans.get(event.event_id)\n if (existing) {\n return existing\n }\n\n const parent_context = this.parentContextForEvent(event) ?? this.startRootSpan(eventbus, event)\n const start_time = dateFromIso(event.event_started_at)\n const span = this.tracer.startSpan(\n eventSpanName(eventbus, event),\n {\n attributes: compactAttributes({\n 'abxbus.bus.id': eventbus.id,\n 'abxbus.bus.name': eventbus.name,\n 'abxbus.event.id': event.event_id,\n 'abxbus.event.type': event.event_type,\n 'abxbus.event.version': event.event_version,\n 'abxbus.event.session_id': stringValue((event as { session_id?: unknown }).session_id),\n 'abxbus.event.parent_id': event.event_parent_id,\n 'abxbus.event.emitted_by_handler_id': event.event_emitted_by_handler_id,\n 'abxbus.event.path': event.event_path.join(' '),\n }),\n startTime: start_time,\n },\n parent_context\n )\n const span_context = this.trace_api.setSpan(parent_context, span)\n this.event_spans.set(event.event_id, span)\n this.event_contexts.set(event.event_id, span_context)\n return span\n }\n\n private completeEventSpan(eventbus: EventBus, event: BaseEvent): void {\n if (this.span_factory) {\n this.completeEventSpanWithFactory(eventbus, event)\n return\n }\n\n const span = this.event_spans.get(event.event_id) ?? this.startEventSpan(eventbus, event)\n if (event.event_errors.length > 0) {\n recordSpanError(span, event.event_errors[0])\n } else {\n span.setStatus({ code: SpanStatusCode.OK })\n }\n span.setAttributes(\n compactAttributes({\n 'abxbus.event.status': event.event_status,\n 'abxbus.event.result_count': event.event_results.size,\n 'abxbus.event.error_count': event.event_errors.length,\n 'abxbus.event.child_count': event.event_children.length,\n })\n )\n const start_time = dateFromIso(event.event_started_at)\n const end_time = endTimeAfterStart(start_time, dateFromIso(event.event_completed_at))\n span.end(end_time)\n this.event_spans.delete(event.event_id)\n this.event_contexts.delete(event.event_id)\n this.completeRootSpan(event.event_id, start_time, end_time)\n }\n\n private startHandlerSpan(eventbus: EventBus, event: BaseEvent, event_result: EventResult): Span {\n const existing = this.handler_spans.get(event_result.id)\n if (existing) {\n return existing\n }\n\n const parent_context =\n this.event_contexts.get(event.event_id) ?? this.trace_api.setSpan(ROOT_CONTEXT, this.startEventSpan(eventbus, event))\n const span = this.tracer.startSpan(\n handlerSpanName(event, event_result),\n {\n attributes: compactAttributes({\n 'abxbus.bus.id': eventbus.id,\n 'abxbus.bus.name': eventbus.name,\n 'abxbus.event.id': event.event_id,\n 'abxbus.event.type': event.event_type,\n 'abxbus.handler.id': event_result.handler_id,\n 'abxbus.handler.name': event_result.handler_name,\n 'abxbus.handler.file_path': event_result.handler_file_path,\n 'abxbus.handler.event_pattern': event_result.handler.event_pattern,\n 'abxbus.event_result.id': event_result.id,\n }),\n startTime: dateFromIso(event_result.started_at),\n },\n parent_context\n )\n const span_context = this.trace_api.setSpan(parent_context, span)\n this.handler_spans.set(event_result.id, span)\n this.handler_contexts.set(handlerSpanKey(event_result.event_id, event_result.handler_id), span_context)\n return span\n }\n\n private completeHandlerSpan(eventbus: EventBus, event: BaseEvent, event_result: EventResult): void {\n if (this.span_factory) {\n this.completeHandlerSpanWithFactory(eventbus, event, event_result)\n return\n }\n\n const span = this.handler_spans.get(event_result.id)\n if (!span) {\n return\n }\n\n if (event_result.error !== undefined) {\n recordSpanError(span, event_result.error)\n } else {\n span.setStatus({ code: SpanStatusCode.OK })\n }\n span.setAttributes(\n compactAttributes({\n 'abxbus.event_result.status': event_result.status,\n 'abxbus.handler.child_count': event_result.event_children.length,\n })\n )\n span.end(endTimeAfterStart(dateFromIso(event_result.started_at), dateFromIso(event_result.completed_at)))\n this.handler_spans.delete(event_result.id)\n this.handler_contexts.delete(handlerSpanKey(event_result.event_id, event_result.handler_id))\n }\n\n private startRootSpan(eventbus: EventBus, event: BaseEvent): Context {\n const existing = this.root_contexts.get(event.event_id)\n if (existing) {\n return existing\n }\n\n const session_id = stringValue((event as { session_id?: unknown }).session_id)\n const root_attributes = resolveAttributes(this.root_span_attributes, eventbus, event)\n const root_span = this.tracer.startSpan(\n resolveRootSpanName(this.root_span_name, eventbus, event),\n {\n attributes: compactAttributes({\n ...root_attributes,\n 'abxbus.trace.root': true,\n 'abxbus.bus.id': eventbus.id,\n 'abxbus.bus.name': eventbus.name,\n 'abxbus.root_event.id': event.event_id,\n 'abxbus.root_event.type': event.event_type,\n 'abxbus.root_event.session_id': session_id,\n }),\n startTime: dateFromIso(event.event_started_at),\n },\n ROOT_CONTEXT\n )\n const root_context = this.trace_api.setSpan(ROOT_CONTEXT, root_span)\n this.root_spans.set(event.event_id, root_span)\n this.root_contexts.set(event.event_id, root_context)\n return root_context\n }\n\n private completeRootSpan(event_id: string, start_time: Date | undefined, end_time: Date | undefined): void {\n const root_span = this.root_spans.get(event_id)\n if (!root_span) {\n return\n }\n\n root_span.setStatus({ code: SpanStatusCode.OK })\n root_span.end(endTimeAfterStart(start_time, end_time))\n this.root_spans.delete(event_id)\n this.root_contexts.delete(event_id)\n }\n\n private parentContextForEvent(event: BaseEvent): Context | undefined {\n if (event.event_parent_id && event.event_emitted_by_handler_id) {\n const handler_context = this.handler_contexts.get(handlerSpanKey(event.event_parent_id, event.event_emitted_by_handler_id))\n if (handler_context) {\n return handler_context\n }\n }\n\n return event.event_parent_id ? this.event_contexts.get(event.event_parent_id) : undefined\n }\n\n private completeEventSpanWithFactory(eventbus: EventBus, event: BaseEvent): void {\n const root_event = rootEventForEvent(eventbus, event)\n const trace_id = traceIdForRootEvent(root_event.event_id)\n const event_context = eventSpanContext(trace_id, event.event_id)\n const start_time = dateFromIso(event.event_started_at)\n const end_time = endTimeAfterStart(start_time, dateFromIso(event.event_completed_at))\n\n if (!event.event_parent_id) {\n const root_span = this.span_factory!({\n name: resolveRootSpanName(this.root_span_name, eventbus, event),\n span_context: rootSpanContext(trace_id, event.event_id),\n attributes: rootSpanAttributes(this.root_span_attributes, eventbus, event),\n start_time,\n })\n root_span.setStatus({ code: SpanStatusCode.OK })\n root_span.end(end_time)\n }\n\n const span = this.span_factory!({\n name: eventSpanName(eventbus, event),\n span_context: event_context,\n parent_span_context: parentSpanContextForEvent(event, trace_id),\n attributes: eventSpanAttributes(eventbus, event),\n start_time,\n })\n if (event.event_errors.length > 0) {\n recordSpanError(span, event.event_errors[0])\n } else {\n span.setStatus({ code: SpanStatusCode.OK })\n }\n span.end(end_time)\n }\n\n private completeHandlerSpanWithFactory(eventbus: EventBus, event: BaseEvent, event_result: EventResult): void {\n const root_event = rootEventForEvent(eventbus, event)\n const trace_id = traceIdForRootEvent(root_event.event_id)\n const start_time = dateFromIso(event_result.started_at)\n const span = this.span_factory!({\n name: handlerSpanName(event, event_result),\n span_context: handlerSpanContext(trace_id, event_result.event_id, event_result.handler_id),\n parent_span_context: eventSpanContext(trace_id, event.event_id),\n attributes: handlerSpanAttributes(eventbus, event, event_result),\n start_time,\n })\n\n if (event_result.error !== undefined) {\n recordSpanError(span, event_result.error)\n } else {\n span.setStatus({ code: SpanStatusCode.OK })\n }\n span.end(endTimeAfterStart(start_time, dateFromIso(event_result.completed_at)))\n }\n}\n\nfunction handlerSpanKey(event_id: string, handler_id: string): string {\n return `${event_id}:${handler_id}`\n}\n\nfunction eventSpanName(eventbus: EventBus, event: BaseEvent): string {\n return `${eventbus.name}.emit(${event.event_type})`\n}\n\nfunction handlerSpanName(event: BaseEvent, event_result: EventResult): string {\n return `${event_result.handler_name}(${event.event_type})`\n}\n\nfunction createOtlpSpanProvider(options: OtelTracingMiddlewareOptions): OtelTracingSpanProvider {\n return new BasicTracerProvider({\n resource: resourceFromAttributes({\n 'service.name': options.service_name ?? 'abxbus',\n }),\n spanProcessors: [\n new SimpleSpanProcessor(\n new OTLPTraceExporter({\n url: normalizeOtlpTracesEndpoint(options.otlp_endpoint!),\n })\n ),\n ],\n })\n}\n\nfunction createProviderSpanFactory(\n trace_api: OpenTelemetryTraceApi,\n provider: OtelTracingSpanProvider,\n instrumentation_name: string\n): OtelTracingSpanFactory {\n const provider_internals = provider as OtelTracingSpanProviderInternals\n return (input: OtelTracingSpanFactoryInput): Span => {\n const span_processor = provider_internals._activeSpanProcessor\n const span_limits = provider_internals._config?.spanLimits\n const resource = provider_internals._resource ?? provider_internals._config?.resource\n if (!span_processor || !span_limits || !resource) {\n throw new Error('OtelTracingMiddleware span_provider must be an OpenTelemetry SDK trace provider with active span internals')\n }\n\n const parent_context = input.parent_span_context\n ? (trace_api.setSpanContext ?? trace.setSpanContext)(ROOT_CONTEXT, input.parent_span_context)\n : ROOT_CONTEXT\n return new SpanImpl({\n resource,\n scope: { name: instrumentation_name },\n context: parent_context,\n spanContext: input.span_context,\n parentSpanContext: input.parent_span_context,\n name: input.name,\n kind: SpanKind.INTERNAL,\n attributes: input.attributes,\n startTime: input.start_time,\n spanProcessor: span_processor,\n spanLimits: span_limits,\n } as ConstructorParameters<typeof SpanImpl>[0])\n }\n}\n\nfunction normalizeOtlpTracesEndpoint(endpoint: string): string {\n const trimmed = endpoint.replace(/\\/+$/, '')\n return trimmed.endsWith('/v1/traces') ? trimmed : `${trimmed}/v1/traces`\n}\n\nfunction eventSpanAttributes(eventbus: EventBus, event: BaseEvent): SpanAttributes {\n return compactAttributes({\n 'abxbus.bus.id': eventbus.id,\n 'abxbus.bus.name': eventbus.name,\n 'abxbus.event.id': event.event_id,\n 'abxbus.event.type': event.event_type,\n 'abxbus.event.version': event.event_version,\n 'abxbus.event.session_id': stringValue((event as { session_id?: unknown }).session_id),\n 'abxbus.event.parent_id': event.event_parent_id,\n 'abxbus.event.emitted_by_handler_id': event.event_emitted_by_handler_id,\n 'abxbus.event.path': event.event_path.join(' '),\n 'abxbus.event.status': event.event_status,\n 'abxbus.event.result_count': event.event_results.size,\n 'abxbus.event.error_count': event.event_errors.length,\n 'abxbus.event.child_count': event.event_children.length,\n })\n}\n\nfunction handlerSpanAttributes(eventbus: EventBus, event: BaseEvent, event_result: EventResult): SpanAttributes {\n return compactAttributes({\n 'abxbus.bus.id': eventbus.id,\n 'abxbus.bus.name': eventbus.name,\n 'abxbus.event.id': event.event_id,\n 'abxbus.event.type': event.event_type,\n 'abxbus.handler.id': event_result.handler_id,\n 'abxbus.handler.name': event_result.handler_name,\n 'abxbus.handler.file_path': event_result.handler_file_path,\n 'abxbus.handler.event_pattern': event_result.handler.event_pattern,\n 'abxbus.event_result.id': event_result.id,\n 'abxbus.event_result.status': event_result.status,\n 'abxbus.handler.child_count': event_result.event_children.length,\n })\n}\n\nfunction rootSpanAttributes(\n root_span_attributes: OtelTracingMiddlewareOptions['root_span_attributes'],\n eventbus: EventBus,\n event: BaseEvent\n): SpanAttributes {\n const session_id = stringValue((event as { session_id?: unknown }).session_id)\n return compactAttributes({\n ...resolveAttributes(root_span_attributes, eventbus, event),\n 'abxbus.trace.root': true,\n 'abxbus.bus.id': eventbus.id,\n 'abxbus.bus.name': eventbus.name,\n 'abxbus.root_event.id': event.event_id,\n 'abxbus.root_event.type': event.event_type,\n 'abxbus.root_event.session_id': session_id,\n 'abxbus.root_event.status': event.event_status,\n 'abxbus.root_event.error_count': event.event_errors.length,\n 'abxbus.root_event.child_count': event.event_children.length,\n })\n}\n\nfunction rootEventForEvent(eventbus: EventBus, event: BaseEvent): BaseEvent {\n let current = event._event_original ?? event\n const seen = new Set<string>()\n while (current.event_parent_id && !seen.has(current.event_id)) {\n seen.add(current.event_id)\n const parent = eventbus.findEventById(current.event_parent_id)\n if (!parent) {\n break\n }\n current = parent._event_original ?? parent\n }\n return current\n}\n\nfunction parentSpanContextForEvent(event: BaseEvent, trace_id: string): SpanContext {\n if (!event.event_parent_id) {\n return rootSpanContext(trace_id, event.event_id)\n }\n\n if (event.event_emitted_by_handler_id) {\n return handlerSpanContext(trace_id, event.event_parent_id, event.event_emitted_by_handler_id)\n }\n\n return eventSpanContext(trace_id, event.event_parent_id)\n}\n\nfunction rootSpanContext(trace_id: string, event_id: string): SpanContext {\n return {\n traceId: trace_id,\n spanId: deterministicSpanId(`abxbus.root:${event_id}`),\n traceFlags: 1,\n }\n}\n\nfunction eventSpanContext(trace_id: string, event_id: string): SpanContext {\n return {\n traceId: trace_id,\n spanId: deterministicSpanId(`abxbus.event:${event_id}`),\n traceFlags: 1,\n }\n}\n\nfunction handlerSpanContext(trace_id: string, event_id: string, handler_id: string): SpanContext {\n return {\n traceId: trace_id,\n spanId: deterministicSpanId(`abxbus.handler:${event_id}:${handler_id}`),\n traceFlags: 1,\n }\n}\n\nfunction traceIdForRootEvent(event_id: string): string {\n return `${fnv1a64Hex(`abxbus.trace.a:${event_id}`)}${fnv1a64Hex(`abxbus.trace.b:${event_id}`)}`\n}\n\nfunction deterministicSpanId(input: string): string {\n return fnv1a64Hex(input)\n}\n\nfunction fnv1a64Hex(input: string): string {\n let hash = 0xcbf29ce484222325n\n const prime = 0x100000001b3n\n const mask = 0xffffffffffffffffn\n for (let index = 0; index < input.length; index += 1) {\n hash ^= BigInt(input.charCodeAt(index))\n hash = (hash * prime) & mask\n }\n if (hash === 0n) {\n hash = 1n\n }\n return hash.toString(16).padStart(16, '0')\n}\n\nfunction dateFromIso(value: string | null | undefined): Date | undefined {\n if (value == null) {\n return undefined\n }\n const date = new Date(value)\n return Number.isNaN(date.getTime()) ? undefined : date\n}\n\nfunction endTimeAfterStart(start_time: Date | undefined, end_time: Date | undefined): Date | undefined {\n if (!start_time || !end_time) {\n return end_time\n }\n\n return end_time.getTime() > start_time.getTime() ? end_time : new Date(start_time.getTime() + 1)\n}\n\nfunction resolveRootSpanName(root_span_name: OtelTracingMiddlewareOptions['root_span_name'], eventbus: EventBus, event: BaseEvent): string {\n if (typeof root_span_name === 'function') {\n return root_span_name(eventbus, event)\n }\n return root_span_name ?? `abxbus.trace ${eventbus.name}`\n}\n\nfunction resolveAttributes(\n attributes: OtelTracingMiddlewareOptions['root_span_attributes'],\n eventbus: EventBus,\n event: BaseEvent\n): SpanAttributes {\n return typeof attributes === 'function' ? attributes(eventbus, event) : (attributes ?? {})\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined\n}\n\nfunction compactAttributes(attributes: Record<string, SpanAttributeValue | null | undefined>): SpanAttributes {\n const compacted: SpanAttributes = {}\n for (const [key, value] of Object.entries(attributes)) {\n if (value !== null && value !== undefined) {\n compacted[key] = value\n }\n }\n return compacted\n}\n\nfunction recordSpanError(span: Span, error: unknown): void {\n if (error instanceof Error) {\n span.recordException(error)\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message })\n return\n }\n\n const message = typeof error === 'string' ? error : 'Unknown abxbus handler error'\n span.recordException(message)\n span.setStatus({ code: SpanStatusCode.ERROR, message })\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAWO;AACP,sCAAkC;AAClC,uBAAuC;AACvC,4BAAyD;AAEzD,kBAAyB;AA2ClB,MAAM,sBAAoD;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa,oBAAI,IAAkB;AAAA,EACnC,gBAAgB,oBAAI,IAAqB;AAAA,EACzC,cAAc,oBAAI,IAAkB;AAAA,EACpC,iBAAiB,oBAAI,IAAqB;AAAA,EAC1C,gBAAgB,oBAAI,IAAkB;AAAA,EACtC,mBAAmB,oBAAI,IAAqB;AAAA,EAE7D,YAAY,UAAwC,CAAC,GAAG;AACtD,SAAK,YAAY,QAAQ,aAAa;AACtC,SAAK,SAAS,QAAQ,UAAU,KAAK,UAAU,UAAU,QAAQ;AACjE,SAAK,gBAAgB,QAAQ,kBAAkB,QAAQ,gBAAgB,uBAAuB,OAAO,IAAI;AACzG,SAAK,eACH,QAAQ,iBACP,KAAK,gBACF,0BAA0B,KAAK,WAAW,KAAK,eAAe,QAAQ,wBAAwB,QAAQ,IACtG;AACN,SAAK,iBAAiB,QAAQ;AAC9B,SAAK,uBAAuB,QAAQ;AAAA,EACtC;AAAA,EAEA,cAAc,UAAoB,OAAkB,QAA2B;AAC7E,QAAI,WAAW,WAAW;AACxB,UAAI,KAAK,cAAc;AACrB;AAAA,MACF;AACA,WAAK,eAAe,UAAU,KAAK;AACnC;AAAA,IACF;AAEA,QAAI,WAAW,aAAa;AAC1B,WAAK,kBAAkB,UAAU,KAAK;AAAA,IACxC;AAAA,EACF;AAAA,EAEA,oBAAoB,UAAoB,OAAkB,cAA2B,QAA2B;AAC9G,QAAI,WAAW,WAAW;AACxB,UAAI,KAAK,cAAc;AACrB;AAAA,MACF;AACA,WAAK,iBAAiB,UAAU,OAAO,YAAY;AACnD;AAAA,IACF;AAEA,QAAI,WAAW,aAAa;AAC1B,WAAK,oBAAoB,UAAU,OAAO,YAAY;AAAA,IACxD;AAAA,EACF;AAAA,EAEQ,eAAe,UAAoB,OAAwB;AACjE,UAAM,WAAW,KAAK,YAAY,IAAI,MAAM,QAAQ;AACpD,QAAI,UAAU;AACZ,aAAO;AAAA,IACT;AAEA,UAAM,iBAAiB,KAAK,sBAAsB,KAAK,KAAK,KAAK,cAAc,UAAU,KAAK;AAC9F,UAAM,aAAa,YAAY,MAAM,gBAAgB;AACrD,UAAM,OAAO,KAAK,OAAO;AAAA,MACvB,cAAc,UAAU,KAAK;AAAA,MAC7B;AAAA,QACE,YAAY,kBAAkB;AAAA,UAC5B,iBAAiB,SAAS;AAAA,UAC1B,mBAAmB,SAAS;AAAA,UAC5B,mBAAmB,MAAM;AAAA,UACzB,qBAAqB,MAAM;AAAA,UAC3B,wBAAwB,MAAM;AAAA,UAC9B,2BAA2B,YAAa,MAAmC,UAAU;AAAA,UACrF,0BAA0B,MAAM;AAAA,UAChC,sCAAsC,MAAM;AAAA,UAC5C,qBAAqB,MAAM,WAAW,KAAK,GAAG;AAAA,QAChD,CAAC;AAAA,QACD,WAAW;AAAA,MACb;AAAA,MACA;AAAA,IACF;AACA,UAAM,eAAe,KAAK,UAAU,QAAQ,gBAAgB,IAAI;AAChE,SAAK,YAAY,IAAI,MAAM,UAAU,IAAI;AACzC,SAAK,eAAe,IAAI,MAAM,UAAU,YAAY;AACpD,WAAO;AAAA,EACT;AAAA,EAEQ,kBAAkB,UAAoB,OAAwB;AACpE,QAAI,KAAK,cAAc;AACrB,WAAK,6BAA6B,UAAU,KAAK;AACjD;AAAA,IACF;AAEA,UAAM,OAAO,KAAK,YAAY,IAAI,MAAM,QAAQ,KAAK,KAAK,eAAe,UAAU,KAAK;AACxF,QAAI,MAAM,aAAa,SAAS,GAAG;AACjC,sBAAgB,MAAM,MAAM,aAAa,CAAC,CAAC;AAAA,IAC7C,OAAO;AACL,WAAK,UAAU,EAAE,MAAM,0BAAe,GAAG,CAAC;AAAA,IAC5C;AACA,SAAK;AAAA,MACH,kBAAkB;AAAA,QAChB,uBAAuB,MAAM;AAAA,QAC7B,6BAA6B,MAAM,cAAc;AAAA,QACjD,4BAA4B,MAAM,aAAa;AAAA,QAC/C,4BAA4B,MAAM,eAAe;AAAA,MACnD,CAAC;AAAA,IACH;AACA,UAAM,aAAa,YAAY,MAAM,gBAAgB;AACrD,UAAM,WAAW,kBAAkB,YAAY,YAAY,MAAM,kBAAkB,CAAC;AACpF,SAAK,IAAI,QAAQ;AACjB,SAAK,YAAY,OAAO,MAAM,QAAQ;AACtC,SAAK,eAAe,OAAO,MAAM,QAAQ;AACzC,SAAK,iBAAiB,MAAM,UAAU,YAAY,QAAQ;AAAA,EAC5D;AAAA,EAEQ,iBAAiB,UAAoB,OAAkB,cAAiC;AAC9F,UAAM,WAAW,KAAK,cAAc,IAAI,aAAa,EAAE;AACvD,QAAI,UAAU;AACZ,aAAO;AAAA,IACT;AAEA,UAAM,iBACJ,KAAK,eAAe,IAAI,MAAM,QAAQ,KAAK,KAAK,UAAU,QAAQ,yBAAc,KAAK,eAAe,UAAU,KAAK,CAAC;AACtH,UAAM,OAAO,KAAK,OAAO;AAAA,MACvB,gBAAgB,OAAO,YAAY;AAAA,MACnC;AAAA,QACE,YAAY,kBAAkB;AAAA,UAC5B,iBAAiB,SAAS;AAAA,UAC1B,mBAAmB,SAAS;AAAA,UAC5B,mBAAmB,MAAM;AAAA,UACzB,qBAAqB,MAAM;AAAA,UAC3B,qBAAqB,aAAa;AAAA,UAClC,uBAAuB,aAAa;AAAA,UACpC,4BAA4B,aAAa;AAAA,UACzC,gCAAgC,aAAa,QAAQ;AAAA,UACrD,0BAA0B,aAAa;AAAA,QACzC,CAAC;AAAA,QACD,WAAW,YAAY,aAAa,UAAU;AAAA,MAChD;AAAA,MACA;AAAA,IACF;AACA,UAAM,eAAe,KAAK,UAAU,QAAQ,gBAAgB,IAAI;AAChE,SAAK,cAAc,IAAI,aAAa,IAAI,IAAI;AAC5C,SAAK,iBAAiB,IAAI,eAAe,aAAa,UAAU,aAAa,UAAU,GAAG,YAAY;AACtG,WAAO;AAAA,EACT;AAAA,EAEQ,oBAAoB,UAAoB,OAAkB,cAAiC;AACjG,QAAI,KAAK,cAAc;AACrB,WAAK,+BAA+B,UAAU,OAAO,YAAY;AACjE;AAAA,IACF;AAEA,UAAM,OAAO,KAAK,cAAc,IAAI,aAAa,EAAE;AACnD,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AAEA,QAAI,aAAa,UAAU,QAAW;AACpC,sBAAgB,MAAM,aAAa,KAAK;AAAA,IAC1C,OAAO;AACL,WAAK,UAAU,EAAE,MAAM,0BAAe,GAAG,CAAC;AAAA,IAC5C;AACA,SAAK;AAAA,MACH,kBAAkB;AAAA,QAChB,8BAA8B,aAAa;AAAA,QAC3C,8BAA8B,aAAa,eAAe;AAAA,MAC5D,CAAC;AAAA,IACH;AACA,SAAK,IAAI,kBAAkB,YAAY,aAAa,UAAU,GAAG,YAAY,aAAa,YAAY,CAAC,CAAC;AACxG,SAAK,cAAc,OAAO,aAAa,EAAE;AACzC,SAAK,iBAAiB,OAAO,eAAe,aAAa,UAAU,aAAa,UAAU,CAAC;AAAA,EAC7F;AAAA,EAEQ,cAAc,UAAoB,OAA2B;AACnE,UAAM,WAAW,KAAK,cAAc,IAAI,MAAM,QAAQ;AACtD,QAAI,UAAU;AACZ,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,YAAa,MAAmC,UAAU;AAC7E,UAAM,kBAAkB,kBAAkB,KAAK,sBAAsB,UAAU,KAAK;AACpF,UAAM,YAAY,KAAK,OAAO;AAAA,MAC5B,oBAAoB,KAAK,gBAAgB,UAAU,KAAK;AAAA,MACxD;AAAA,QACE,YAAY,kBAAkB;AAAA,UAC5B,GAAG;AAAA,UACH,qBAAqB;AAAA,UACrB,iBAAiB,SAAS;AAAA,UAC1B,mBAAmB,SAAS;AAAA,UAC5B,wBAAwB,MAAM;AAAA,UAC9B,0BAA0B,MAAM;AAAA,UAChC,gCAAgC;AAAA,QAClC,CAAC;AAAA,QACD,WAAW,YAAY,MAAM,gBAAgB;AAAA,MAC/C;AAAA,MACA;AAAA,IACF;AACA,UAAM,eAAe,KAAK,UAAU,QAAQ,yBAAc,SAAS;AACnE,SAAK,WAAW,IAAI,MAAM,UAAU,SAAS;AAC7C,SAAK,cAAc,IAAI,MAAM,UAAU,YAAY;AACnD,WAAO;AAAA,EACT;AAAA,EAEQ,iBAAiB,UAAkB,YAA8B,UAAkC;AACzG,UAAM,YAAY,KAAK,WAAW,IAAI,QAAQ;AAC9C,QAAI,CAAC,WAAW;AACd;AAAA,IACF;AAEA,cAAU,UAAU,EAAE,MAAM,0BAAe,GAAG,CAAC;AAC/C,cAAU,IAAI,kBAAkB,YAAY,QAAQ,CAAC;AACrD,SAAK,WAAW,OAAO,QAAQ;AAC/B,SAAK,cAAc,OAAO,QAAQ;AAAA,EACpC;AAAA,EAEQ,sBAAsB,OAAuC;AACnE,QAAI,MAAM,mBAAmB,MAAM,6BAA6B;AAC9D,YAAM,kBAAkB,KAAK,iBAAiB,IAAI,eAAe,MAAM,iBAAiB,MAAM,2BAA2B,CAAC;AAC1H,UAAI,iBAAiB;AACnB,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO,MAAM,kBAAkB,KAAK,eAAe,IAAI,MAAM,eAAe,IAAI;AAAA,EAClF;AAAA,EAEQ,6BAA6B,UAAoB,OAAwB;AAC/E,UAAM,aAAa,kBAAkB,UAAU,KAAK;AACpD,UAAM,WAAW,oBAAoB,WAAW,QAAQ;AACxD,UAAM,gBAAgB,iBAAiB,UAAU,MAAM,QAAQ;AAC/D,UAAM,aAAa,YAAY,MAAM,gBAAgB;AACrD,UAAM,WAAW,kBAAkB,YAAY,YAAY,MAAM,kBAAkB,CAAC;AAEpF,QAAI,CAAC,MAAM,iBAAiB;AAC1B,YAAM,YAAY,KAAK,aAAc;AAAA,QACnC,MAAM,oBAAoB,KAAK,gBAAgB,UAAU,KAAK;AAAA,QAC9D,cAAc,gBAAgB,UAAU,MAAM,QAAQ;AAAA,QACtD,YAAY,mBAAmB,KAAK,sBAAsB,UAAU,KAAK;AAAA,QACzE;AAAA,MACF,CAAC;AACD,gBAAU,UAAU,EAAE,MAAM,0BAAe,GAAG,CAAC;AAC/C,gBAAU,IAAI,QAAQ;AAAA,IACxB;AAEA,UAAM,OAAO,KAAK,aAAc;AAAA,MAC9B,MAAM,cAAc,UAAU,KAAK;AAAA,MACnC,cAAc;AAAA,MACd,qBAAqB,0BAA0B,OAAO,QAAQ;AAAA,MAC9D,YAAY,oBAAoB,UAAU,KAAK;AAAA,MAC/C;AAAA,IACF,CAAC;AACD,QAAI,MAAM,aAAa,SAAS,GAAG;AACjC,sBAAgB,MAAM,MAAM,aAAa,CAAC,CAAC;AAAA,IAC7C,OAAO;AACL,WAAK,UAAU,EAAE,MAAM,0BAAe,GAAG,CAAC;AAAA,IAC5C;AACA,SAAK,IAAI,QAAQ;AAAA,EACnB;AAAA,EAEQ,+BAA+B,UAAoB,OAAkB,cAAiC;AAC5G,UAAM,aAAa,kBAAkB,UAAU,KAAK;AACpD,UAAM,WAAW,oBAAoB,WAAW,QAAQ;AACxD,UAAM,aAAa,YAAY,aAAa,UAAU;AACtD,UAAM,OAAO,KAAK,aAAc;AAAA,MAC9B,MAAM,gBAAgB,OAAO,YAAY;AAAA,MACzC,cAAc,mBAAmB,UAAU,aAAa,UAAU,aAAa,UAAU;AAAA,MACzF,qBAAqB,iBAAiB,UAAU,MAAM,QAAQ;AAAA,MAC9D,YAAY,sBAAsB,UAAU,OAAO,YAAY;AAAA,MAC/D;AAAA,IACF,CAAC;AAED,QAAI,aAAa,UAAU,QAAW;AACpC,sBAAgB,MAAM,aAAa,KAAK;AAAA,IAC1C,OAAO;AACL,WAAK,UAAU,EAAE,MAAM,0BAAe,GAAG,CAAC;AAAA,IAC5C;AACA,SAAK,IAAI,kBAAkB,YAAY,YAAY,aAAa,YAAY,CAAC,CAAC;AAAA,EAChF;AACF;AAEA,SAAS,eAAe,UAAkB,YAA4B;AACpE,SAAO,GAAG,QAAQ,IAAI,UAAU;AAClC;AAEA,SAAS,cAAc,UAAoB,OAA0B;AACnE,SAAO,GAAG,SAAS,IAAI,SAAS,MAAM,UAAU;AAClD;AAEA,SAAS,gBAAgB,OAAkB,cAAmC;AAC5E,SAAO,GAAG,aAAa,YAAY,IAAI,MAAM,UAAU;AACzD;AAEA,SAAS,uBAAuB,SAAgE;AAC9F,SAAO,IAAI,0CAAoB;AAAA,IAC7B,cAAU,yCAAuB;AAAA,MAC/B,gBAAgB,QAAQ,gBAAgB;AAAA,IAC1C,CAAC;AAAA,IACD,gBAAgB;AAAA,MACd,IAAI;AAAA,QACF,IAAI,kDAAkB;AAAA,UACpB,KAAK,4BAA4B,QAAQ,aAAc;AAAA,QACzD,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,0BACP,WACA,UACA,sBACwB;AACxB,QAAM,qBAAqB;AAC3B,SAAO,CAAC,UAA6C;AACnD,UAAM,iBAAiB,mBAAmB;AAC1C,UAAM,cAAc,mBAAmB,SAAS;AAChD,UAAM,WAAW,mBAAmB,aAAa,mBAAmB,SAAS;AAC7E,QAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,UAAU;AAChD,YAAM,IAAI,MAAM,4GAA4G;AAAA,IAC9H;AAEA,UAAM,iBAAiB,MAAM,uBACxB,UAAU,kBAAkB,iBAAM,gBAAgB,yBAAc,MAAM,mBAAmB,IAC1F;AACJ,WAAO,IAAI,qBAAS;AAAA,MAClB;AAAA,MACA,OAAO,EAAE,MAAM,qBAAqB;AAAA,MACpC,SAAS;AAAA,MACT,aAAa,MAAM;AAAA,MACnB,mBAAmB,MAAM;AAAA,MACzB,MAAM,MAAM;AAAA,MACZ,MAAM,oBAAS;AAAA,MACf,YAAY,MAAM;AAAA,MAClB,WAAW,MAAM;AAAA,MACjB,eAAe;AAAA,MACf,YAAY;AAAA,IACd,CAA8C;AAAA,EAChD;AACF;AAEA,SAAS,4BAA4B,UAA0B;AAC7D,QAAM,UAAU,SAAS,QAAQ,QAAQ,EAAE;AAC3C,SAAO,QAAQ,SAAS,YAAY,IAAI,UAAU,GAAG,OAAO;AAC9D;AAEA,SAAS,oBAAoB,UAAoB,OAAkC;AACjF,SAAO,kBAAkB;AAAA,IACvB,iBAAiB,SAAS;AAAA,IAC1B,mBAAmB,SAAS;AAAA,IAC5B,mBAAmB,MAAM;AAAA,IACzB,qBAAqB,MAAM;AAAA,IAC3B,wBAAwB,MAAM;AAAA,IAC9B,2BAA2B,YAAa,MAAmC,UAAU;AAAA,IACrF,0BAA0B,MAAM;AAAA,IAChC,sCAAsC,MAAM;AAAA,IAC5C,qBAAqB,MAAM,WAAW,KAAK,GAAG;AAAA,IAC9C,uBAAuB,MAAM;AAAA,IAC7B,6BAA6B,MAAM,cAAc;AAAA,IACjD,4BAA4B,MAAM,aAAa;AAAA,IAC/C,4BAA4B,MAAM,eAAe;AAAA,EACnD,CAAC;AACH;AAEA,SAAS,sBAAsB,UAAoB,OAAkB,cAA2C;AAC9G,SAAO,kBAAkB;AAAA,IACvB,iBAAiB,SAAS;AAAA,IAC1B,mBAAmB,SAAS;AAAA,IAC5B,mBAAmB,MAAM;AAAA,IACzB,qBAAqB,MAAM;AAAA,IAC3B,qBAAqB,aAAa;AAAA,IAClC,uBAAuB,aAAa;AAAA,IACpC,4BAA4B,aAAa;AAAA,IACzC,gCAAgC,aAAa,QAAQ;AAAA,IACrD,0BAA0B,aAAa;AAAA,IACvC,8BAA8B,aAAa;AAAA,IAC3C,8BAA8B,aAAa,eAAe;AAAA,EAC5D,CAAC;AACH;AAEA,SAAS,mBACP,sBACA,UACA,OACgB;AAChB,QAAM,aAAa,YAAa,MAAmC,UAAU;AAC7E,SAAO,kBAAkB;AAAA,IACvB,GAAG,kBAAkB,sBAAsB,UAAU,KAAK;AAAA,IAC1D,qBAAqB;AAAA,IACrB,iBAAiB,SAAS;AAAA,IAC1B,mBAAmB,SAAS;AAAA,IAC5B,wBAAwB,MAAM;AAAA,IAC9B,0BAA0B,MAAM;AAAA,IAChC,gCAAgC;AAAA,IAChC,4BAA4B,MAAM;AAAA,IAClC,iCAAiC,MAAM,aAAa;AAAA,IACpD,iCAAiC,MAAM,eAAe;AAAA,EACxD,CAAC;AACH;AAEA,SAAS,kBAAkB,UAAoB,OAA6B;AAC1E,MAAI,UAAU,MAAM,mBAAmB;AACvC,QAAM,OAAO,oBAAI,IAAY;AAC7B,SAAO,QAAQ,mBAAmB,CAAC,KAAK,IAAI,QAAQ,QAAQ,GAAG;AAC7D,SAAK,IAAI,QAAQ,QAAQ;AACzB,UAAM,SAAS,SAAS,cAAc,QAAQ,eAAe;AAC7D,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AACA,cAAU,OAAO,mBAAmB;AAAA,EACtC;AACA,SAAO;AACT;AAEA,SAAS,0BAA0B,OAAkB,UAA+B;AAClF,MAAI,CAAC,MAAM,iBAAiB;AAC1B,WAAO,gBAAgB,UAAU,MAAM,QAAQ;AAAA,EACjD;AAEA,MAAI,MAAM,6BAA6B;AACrC,WAAO,mBAAmB,UAAU,MAAM,iBAAiB,MAAM,2BAA2B;AAAA,EAC9F;AAEA,SAAO,iBAAiB,UAAU,MAAM,eAAe;AACzD;AAEA,SAAS,gBAAgB,UAAkB,UAA+B;AACxE,SAAO;AAAA,IACL,SAAS;AAAA,IACT,QAAQ,oBAAoB,eAAe,QAAQ,EAAE;AAAA,IACrD,YAAY;AAAA,EACd;AACF;AAEA,SAAS,iBAAiB,UAAkB,UAA+B;AACzE,SAAO;AAAA,IACL,SAAS;AAAA,IACT,QAAQ,oBAAoB,gBAAgB,QAAQ,EAAE;AAAA,IACtD,YAAY;AAAA,EACd;AACF;AAEA,SAAS,mBAAmB,UAAkB,UAAkB,YAAiC;AAC/F,SAAO;AAAA,IACL,SAAS;AAAA,IACT,QAAQ,oBAAoB,kBAAkB,QAAQ,IAAI,UAAU,EAAE;AAAA,IACtE,YAAY;AAAA,EACd;AACF;AAEA,SAAS,oBAAoB,UAA0B;AACrD,SAAO,GAAG,WAAW,kBAAkB,QAAQ,EAAE,CAAC,GAAG,WAAW,kBAAkB,QAAQ,EAAE,CAAC;AAC/F;AAEA,SAAS,oBAAoB,OAAuB;AAClD,SAAO,WAAW,KAAK;AACzB;AAEA,SAAS,WAAW,OAAuB;AACzC,MAAI,OAAO;AACX,QAAM,QAAQ;AACd,QAAM,OAAO;AACb,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACpD,YAAQ,OAAO,MAAM,WAAW,KAAK,CAAC;AACtC,WAAQ,OAAO,QAAS;AAAA,EAC1B;AACA,MAAI,SAAS,IAAI;AACf,WAAO;AAAA,EACT;AACA,SAAO,KAAK,SAAS,EAAE,EAAE,SAAS,IAAI,GAAG;AAC3C;AAEA,SAAS,YAAY,OAAoD;AACvE,MAAI,SAAS,MAAM;AACjB,WAAO;AAAA,EACT;AACA,QAAM,OAAO,IAAI,KAAK,KAAK;AAC3B,SAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,IAAI,SAAY;AACpD;AAEA,SAAS,kBAAkB,YAA8B,UAA8C;AACrG,MAAI,CAAC,cAAc,CAAC,UAAU;AAC5B,WAAO;AAAA,EACT;AAEA,SAAO,SAAS,QAAQ,IAAI,WAAW,QAAQ,IAAI,WAAW,IAAI,KAAK,WAAW,QAAQ,IAAI,CAAC;AACjG;AAEA,SAAS,oBAAoB,gBAAgE,UAAoB,OAA0B;AACzI,MAAI,OAAO,mBAAmB,YAAY;AACxC,WAAO,eAAe,UAAU,KAAK;AAAA,EACvC;AACA,SAAO,kBAAkB,gBAAgB,SAAS,IAAI;AACxD;AAEA,SAAS,kBACP,YACA,UACA,OACgB;AAChB,SAAO,OAAO,eAAe,aAAa,WAAW,UAAU,KAAK,IAAK,cAAc,CAAC;AAC1F;AAEA,SAAS,YAAY,OAAoC;AACvD,SAAO,OAAO,UAAU,YAAY,MAAM,SAAS,IAAI,QAAQ;AACjE;AAEA,SAAS,kBAAkB,YAAmF;AAC5G,QAAM,YAA4B,CAAC;AACnC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,UAAU,GAAG;AACrD,QAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,gBAAU,GAAG,IAAI;AAAA,IACnB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,MAAY,OAAsB;AACzD,MAAI,iBAAiB,OAAO;AAC1B,SAAK,gBAAgB,KAAK;AAC1B,SAAK,UAAU,EAAE,MAAM,0BAAe,OAAO,SAAS,MAAM,QAAQ,CAAC;AACrE;AAAA,EACF;AAEA,QAAM,UAAU,OAAO,UAAU,WAAW,QAAQ;AACpD,OAAK,gBAAgB,OAAO;AAC5B,OAAK,UAAU,EAAE,MAAM,0BAAe,OAAO,QAAQ,CAAC;AACxD;",
4
+ "sourcesContent": ["import {\n ROOT_CONTEXT,\n SpanKind,\n SpanStatusCode,\n trace,\n type Context,\n type Span,\n type SpanAttributeValue,\n type SpanAttributes,\n type SpanContext,\n type TimeInput,\n type Tracer,\n} from '@opentelemetry/api'\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'\nimport { resourceFromAttributes } from '@opentelemetry/resources'\nimport { BasicTracerProvider, BatchSpanProcessor } from '@opentelemetry/sdk-trace-base'\nimport type { SpanLimits, SpanProcessor } from '@opentelemetry/sdk-trace-base'\nimport { SpanImpl } from '@opentelemetry/sdk-trace-base/build/src/Span.js'\n\nimport type { BaseEvent } from './base_event.js'\nimport type { EventBus } from './event_bus.js'\nimport type { EventResult } from './event_result.js'\nimport type { EventBusMiddleware } from './middlewares.js'\nimport type { EventStatus } from './types.js'\n\ntype OpenTelemetryTraceApi = Pick<typeof trace, 'getTracer' | 'setSpan'> & Partial<Pick<typeof trace, 'setSpanContext'>>\n\nexport type OtelTracingSpanFactoryInput = {\n name: string\n span_context: SpanContext\n parent_span_context?: SpanContext\n attributes: SpanAttributes\n start_time?: TimeInput\n}\n\nexport type OtelTracingSpanFactory = (input: OtelTracingSpanFactoryInput) => Span\n\ntype OtelTracingSpanProviderInternals = {\n _activeSpanProcessor?: SpanProcessor\n _config?: {\n resource?: unknown\n spanLimits?: SpanLimits\n }\n _resource?: unknown\n}\n\nexport type OtelTracingSpanProvider = object\n\nexport type OtelTracingMiddlewareOptions = {\n tracer?: Tracer\n trace_api?: OpenTelemetryTraceApi\n span_provider?: OtelTracingSpanProvider\n span_factory?: OtelTracingSpanFactory\n otlp_endpoint?: string\n service_name?: string\n instrumentation_name?: string\n root_span_attributes?: SpanAttributes | ((eventbus: EventBus, event: BaseEvent) => SpanAttributes)\n}\n\nexport class OtelTracingMiddleware implements EventBusMiddleware {\n private readonly tracer: Tracer\n private readonly trace_api: OpenTelemetryTraceApi\n private readonly span_factory?: OtelTracingSpanFactory\n private readonly span_provider?: OtelTracingSpanProvider\n private readonly root_span_attributes: OtelTracingMiddlewareOptions['root_span_attributes']\n private readonly event_spans = new Map<string, Span>()\n private readonly event_contexts = new Map<string, Context>()\n private readonly handler_spans = new Map<string, Span>()\n private readonly handler_contexts = new Map<string, Context>()\n\n constructor(options: OtelTracingMiddlewareOptions = {}) {\n this.trace_api = options.trace_api ?? trace\n this.tracer = options.tracer ?? this.trace_api.getTracer('abxbus')\n this.span_provider = options.span_provider ?? (options.otlp_endpoint ? createOtlpSpanProvider(options) : undefined)\n this.span_factory =\n options.span_factory ??\n (this.span_provider\n ? createProviderSpanFactory(this.trace_api, this.span_provider, options.instrumentation_name ?? 'abxbus')\n : undefined)\n this.root_span_attributes = options.root_span_attributes\n }\n\n onEventChange(eventbus: EventBus, event: BaseEvent, status: EventStatus): void {\n if (status === 'started') {\n if (this.span_factory) {\n return\n }\n this.startEventSpan(eventbus, event)\n return\n }\n\n if (status === 'completed') {\n this.completeEventSpan(eventbus, event)\n }\n }\n\n onEventResultChange(eventbus: EventBus, event: BaseEvent, event_result: EventResult, status: EventStatus): void {\n if (status === 'started') {\n if (this.span_factory) {\n return\n }\n this.startHandlerSpan(eventbus, event, event_result)\n return\n }\n\n if (status === 'completed') {\n this.completeHandlerSpan(eventbus, event, event_result)\n }\n }\n\n private startEventSpan(eventbus: EventBus, event: BaseEvent): Span {\n const existing = this.event_spans.get(event.event_id)\n if (existing) {\n return existing\n }\n\n const parent_context = this.parentContextForEvent(event) ?? ROOT_CONTEXT\n const start_time = timeInputFromIso(event.event_started_at)\n const span = this.tracer.startSpan(\n eventSpanName(eventbus, event),\n {\n attributes: event.event_parent_id\n ? eventStartedSpanAttributes(eventbus, event)\n : topLevelEventStartedSpanAttributes(this.root_span_attributes, eventbus, event),\n startTime: start_time,\n },\n parent_context\n )\n const span_context = this.trace_api.setSpan(parent_context, span)\n this.event_spans.set(event.event_id, span)\n this.event_contexts.set(event.event_id, span_context)\n return span\n }\n\n private completeEventSpan(eventbus: EventBus, event: BaseEvent): void {\n if (this.span_factory) {\n this.completeEventSpanWithFactory(eventbus, event)\n return\n }\n\n const span = this.event_spans.get(event.event_id) ?? this.startEventSpan(eventbus, event)\n if (event.event_errors.length > 0) {\n recordSpanError(span, event.event_errors[0])\n } else {\n span.setStatus({ code: SpanStatusCode.OK })\n }\n span.setAttributes(\n event.event_parent_id ? eventSpanAttributes(eventbus, event) : topLevelEventSpanAttributes(this.root_span_attributes, eventbus, event)\n )\n const start_time = epochNsFromIso(event.event_started_at)\n const end_time = endTimeAfterStart(start_time, epochNsFromIso(event.event_completed_at))\n span.end(end_time)\n this.event_spans.delete(event.event_id)\n this.event_contexts.delete(event.event_id)\n }\n\n private startHandlerSpan(eventbus: EventBus, event: BaseEvent, event_result: EventResult): Span {\n const existing = this.handler_spans.get(event_result.id)\n if (existing) {\n return existing\n }\n\n const parent_context =\n this.event_contexts.get(event.event_id) ?? this.trace_api.setSpan(ROOT_CONTEXT, this.startEventSpan(eventbus, event))\n const span = this.tracer.startSpan(\n handlerSpanName(event, event_result),\n {\n attributes: handlerSpanAttributes(eventbus, event, event_result),\n startTime: timeInputFromIso(event_result.started_at),\n },\n parent_context\n )\n const span_context = this.trace_api.setSpan(parent_context, span)\n this.handler_spans.set(event_result.id, span)\n this.handler_contexts.set(handlerSpanKey(event_result.event_id, event_result.handler_id), span_context)\n return span\n }\n\n private completeHandlerSpan(eventbus: EventBus, event: BaseEvent, event_result: EventResult): void {\n if (this.span_factory) {\n return\n }\n\n const span = this.handler_spans.get(event_result.id)\n if (!span) {\n return\n }\n\n if (event_result.error !== undefined) {\n recordSpanError(span, event_result.error)\n } else {\n span.setStatus({ code: SpanStatusCode.OK })\n }\n span.setAttributes(handlerSpanAttributes(eventbus, event, event_result))\n span.end(endTimeAfterStart(epochNsFromIso(event_result.started_at), epochNsFromIso(event_result.completed_at)))\n this.handler_spans.delete(event_result.id)\n this.handler_contexts.delete(handlerSpanKey(event_result.event_id, event_result.handler_id))\n }\n\n private parentContextForEvent(event: BaseEvent): Context | undefined {\n if (event.event_parent_id && event.event_emitted_by_handler_id) {\n const handler_context = this.handler_contexts.get(handlerSpanKey(event.event_parent_id, event.event_emitted_by_handler_id))\n if (handler_context) {\n return handler_context\n }\n }\n\n return event.event_parent_id ? this.event_contexts.get(event.event_parent_id) : undefined\n }\n\n private completeEventSpanWithFactory(eventbus: EventBus, event: BaseEvent): void {\n if (event.event_parent_id) {\n return\n }\n\n const top_level_event = event._event_original ?? event\n const trace_id = traceIdForRootEvent(top_level_event.event_id)\n this.exportEventTreeWithFactory(eventbus, top_level_event, trace_id, undefined, new Set<string>())\n }\n\n private exportEventTreeWithFactory(\n eventbus: EventBus,\n event: BaseEvent,\n trace_id: string,\n parent_span_context: SpanContext | undefined,\n visited_event_ids: Set<string>\n ): void {\n const original_event = event._event_original ?? event\n if (visited_event_ids.has(original_event.event_id)) {\n return\n }\n visited_event_ids.add(original_event.event_id)\n\n const start_time = epochNsFromIso(original_event.event_started_at)\n const span_context = eventSpanContext(trace_id, original_event.event_id)\n const span = this.span_factory!({\n name: eventSpanName(eventbus, original_event),\n span_context,\n parent_span_context,\n attributes: original_event.event_parent_id\n ? eventSpanAttributes(eventbus, original_event)\n : topLevelEventSpanAttributes(this.root_span_attributes, eventbus, original_event),\n start_time: timeInputFromEpochNs(start_time),\n })\n if (original_event.event_errors.length > 0) {\n recordSpanError(span, original_event.event_errors[0])\n } else {\n span.setStatus({ code: SpanStatusCode.OK })\n }\n span.end(endTimeAfterStart(start_time, epochNsFromIso(original_event.event_completed_at)))\n\n for (const event_result of original_event.event_results.values()) {\n const handler_context = this.exportHandlerSpanWithFactory(eventbus, original_event, event_result, trace_id, span_context)\n for (const child of event_result.event_children) {\n this.exportEventTreeWithFactory(eventbus, child, trace_id, handler_context, visited_event_ids)\n }\n }\n }\n\n private exportHandlerSpanWithFactory(\n eventbus: EventBus,\n event: BaseEvent,\n event_result: EventResult,\n trace_id: string,\n parent_span_context: SpanContext\n ): SpanContext {\n const start_time = epochNsFromIso(event_result.started_at)\n const span_context = handlerSpanContext(trace_id, event_result.event_id, event_result.handler_id)\n const span = this.span_factory!({\n name: handlerSpanName(event, event_result),\n span_context,\n parent_span_context,\n attributes: handlerSpanAttributes(eventbus, event, event_result),\n start_time: timeInputFromEpochNs(start_time),\n })\n if (event_result.error !== undefined) {\n recordSpanError(span, event_result.error)\n } else {\n span.setStatus({ code: SpanStatusCode.OK })\n }\n span.end(endTimeAfterStart(start_time, epochNsFromIso(event_result.completed_at)))\n return span_context\n }\n}\n\nfunction handlerSpanKey(event_id: string, handler_id: string): string {\n return `${event_id}:${handler_id}`\n}\n\nfunction eventSpanName(eventbus: EventBus, event: BaseEvent): string {\n return `${eventbus.name}.emit(${event.event_type})`\n}\n\nfunction handlerSpanName(event: BaseEvent, event_result: EventResult): string {\n return `${event_result.handler_name}(${event.event_type})`\n}\n\nfunction createOtlpSpanProvider(options: OtelTracingMiddlewareOptions): OtelTracingSpanProvider {\n return new BasicTracerProvider({\n resource: resourceFromAttributes({\n 'service.name': options.service_name ?? 'abxbus',\n }),\n spanProcessors: [\n new BatchSpanProcessor(\n new OTLPTraceExporter({\n url: normalizeOtlpTracesEndpoint(options.otlp_endpoint!),\n }),\n {\n scheduledDelayMillis: 100,\n }\n ),\n ],\n })\n}\n\nfunction createProviderSpanFactory(\n trace_api: OpenTelemetryTraceApi,\n provider: OtelTracingSpanProvider,\n instrumentation_name: string\n): OtelTracingSpanFactory {\n const provider_internals = provider as OtelTracingSpanProviderInternals\n return (input: OtelTracingSpanFactoryInput): Span => {\n const span_processor = provider_internals._activeSpanProcessor\n const span_limits = provider_internals._config?.spanLimits\n const resource = provider_internals._resource ?? provider_internals._config?.resource\n if (!span_processor || !span_limits || !resource) {\n throw new Error('OtelTracingMiddleware span_provider must be an OpenTelemetry SDK trace provider with active span internals')\n }\n\n const parent_context = input.parent_span_context\n ? (trace_api.setSpanContext ?? trace.setSpanContext)(ROOT_CONTEXT, input.parent_span_context)\n : ROOT_CONTEXT\n return new SpanImpl({\n resource,\n scope: { name: instrumentation_name },\n context: parent_context,\n spanContext: input.span_context,\n parentSpanContext: input.parent_span_context,\n name: input.name,\n kind: SpanKind.INTERNAL,\n attributes: input.attributes,\n startTime: input.start_time,\n spanProcessor: span_processor,\n spanLimits: span_limits,\n } as ConstructorParameters<typeof SpanImpl>[0])\n }\n}\n\nfunction normalizeOtlpTracesEndpoint(endpoint: string): string {\n const trimmed = endpoint.replace(/\\/+$/, '')\n return trimmed.endsWith('/v1/traces') ? trimmed : `${trimmed}/v1/traces`\n}\n\nfunction eventStartedSpanAttributes(eventbus: EventBus, event: BaseEvent): SpanAttributes {\n return compactAttributes({\n 'abxbus.event_bus.id': eventbus.id,\n 'abxbus.event_bus.name': eventbus.name,\n 'abxbus.event_id': event.event_id,\n 'abxbus.event_type': event.event_type,\n 'abxbus.event_version': event.event_version,\n 'abxbus.session_id': stringValue((event as { session_id?: unknown }).session_id),\n 'abxbus.event_parent_id': event.event_parent_id,\n 'abxbus.event_emitted_by_handler_id': event.event_emitted_by_handler_id,\n 'abxbus.event_path': event.event_path.join(' '),\n })\n}\n\nfunction eventSpanAttributes(eventbus: EventBus, event: BaseEvent): SpanAttributes {\n return compactAttributes({\n ...eventStartedSpanAttributes(eventbus, event),\n 'abxbus.event_status': event.event_status,\n })\n}\n\nfunction handlerSpanAttributes(eventbus: EventBus, event: BaseEvent, event_result: EventResult): SpanAttributes {\n return compactAttributes({\n 'abxbus.event_bus.id': eventbus.id,\n 'abxbus.event_bus.name': eventbus.name,\n 'abxbus.event_id': event.event_id,\n 'abxbus.event_type': event.event_type,\n 'abxbus.handler_id': event_result.handler_id,\n 'abxbus.handler_name': event_result.handler_name,\n 'abxbus.handler_file_path': event_result.handler_file_path,\n 'abxbus.handler_event_pattern': event_result.handler.event_pattern,\n 'abxbus.event_result_id': event_result.id,\n 'abxbus.event_result_status': event_result.status,\n })\n}\n\nfunction topLevelEventStartedSpanAttributes(\n root_span_attributes: OtelTracingMiddlewareOptions['root_span_attributes'],\n eventbus: EventBus,\n event: BaseEvent\n): SpanAttributes {\n return compactAttributes({\n ...eventStartedSpanAttributes(eventbus, event),\n ...resolveAttributes(root_span_attributes, eventbus, event),\n 'abxbus.trace.root': true,\n })\n}\n\nfunction topLevelEventSpanAttributes(\n root_span_attributes: OtelTracingMiddlewareOptions['root_span_attributes'],\n eventbus: EventBus,\n event: BaseEvent\n): SpanAttributes {\n return compactAttributes({\n ...eventSpanAttributes(eventbus, event),\n ...resolveAttributes(root_span_attributes, eventbus, event),\n 'abxbus.trace.root': true,\n })\n}\n\nfunction eventSpanContext(trace_id: string, event_id: string): SpanContext {\n return {\n traceId: trace_id,\n spanId: deterministicSpanId(`abxbus.event:${event_id}`),\n traceFlags: 1,\n }\n}\n\nfunction handlerSpanContext(trace_id: string, event_id: string, handler_id: string): SpanContext {\n return {\n traceId: trace_id,\n spanId: deterministicSpanId(`abxbus.handler:${event_id}:${handler_id}`),\n traceFlags: 1,\n }\n}\n\nfunction traceIdForRootEvent(event_id: string): string {\n return `${fnv1a64Hex(`abxbus.trace.a:${event_id}`)}${fnv1a64Hex(`abxbus.trace.b:${event_id}`)}`\n}\n\nfunction deterministicSpanId(input: string): string {\n return fnv1a64Hex(input)\n}\n\nfunction fnv1a64Hex(input: string): string {\n let hash = 0xcbf29ce484222325n\n const prime = 0x100000001b3n\n const mask = 0xffffffffffffffffn\n for (let index = 0; index < input.length; index += 1) {\n hash ^= BigInt(input.charCodeAt(index))\n hash = (hash * prime) & mask\n }\n if (hash === 0n) {\n hash = 1n\n }\n return hash.toString(16).padStart(16, '0')\n}\n\nconst ISO_EPOCH_NS_REGEX = /^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2})(?:\\.(\\d{1,9}))?(Z|[+-]\\d{2}:\\d{2})$/\nconst NS_PER_SECOND = 1_000_000_000n\nconst NS_PER_MS = 1_000_000n\n\nfunction epochNsFromIso(value: string | null | undefined): bigint | undefined {\n if (value == null) {\n return undefined\n }\n const match = ISO_EPOCH_NS_REGEX.exec(value)\n if (!match) {\n return undefined\n }\n const [, base, fraction = '', timezone] = match\n const base_ms = Date.parse(`${base}.000${timezone}`)\n if (Number.isNaN(base_ms)) {\n return undefined\n }\n return BigInt(base_ms) * NS_PER_MS + BigInt(fraction.padEnd(9, '0'))\n}\n\nfunction timeInputFromIso(value: string | null | undefined): TimeInput | undefined {\n return timeInputFromEpochNs(epochNsFromIso(value))\n}\n\nfunction timeInputFromEpochNs(epoch_ns: bigint | undefined): TimeInput | undefined {\n if (epoch_ns === undefined) {\n return undefined\n }\n const seconds = epoch_ns / NS_PER_SECOND\n const nanos = epoch_ns % NS_PER_SECOND\n return [Number(seconds), Number(nanos)]\n}\n\nfunction endTimeAfterStart(start_time: bigint | undefined, end_time: bigint | undefined): TimeInput | undefined {\n if (start_time === undefined || end_time === undefined) {\n return timeInputFromEpochNs(end_time)\n }\n\n return timeInputFromEpochNs(end_time > start_time ? end_time : start_time + 1n)\n}\n\nfunction resolveAttributes(\n attributes: OtelTracingMiddlewareOptions['root_span_attributes'],\n eventbus: EventBus,\n event: BaseEvent\n): SpanAttributes {\n return typeof attributes === 'function' ? attributes(eventbus, event) : (attributes ?? {})\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined\n}\n\nfunction compactAttributes(attributes: Record<string, SpanAttributeValue | null | undefined>): SpanAttributes {\n const compacted: SpanAttributes = {}\n for (const [key, value] of Object.entries(attributes)) {\n if (value !== null && value !== undefined) {\n compacted[key] = value\n }\n }\n return compacted\n}\n\nfunction recordSpanError(span: Span, error: unknown): void {\n if (error instanceof Error) {\n span.recordException(error)\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message })\n return\n }\n\n const message = typeof error === 'string' ? error : 'Unknown abxbus handler error'\n span.recordException(message)\n span.setStatus({ code: SpanStatusCode.ERROR, message })\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }