@mastra/otel-exporter 0.0.0-error-handler-fix-20251020202607 → 0.0.0-extract-tool-ui-inp-playground-ui-20251024041825

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,11 +1,87 @@
1
1
  # @mastra/otel-exporter
2
2
 
3
- ## 0.0.0-error-handler-fix-20251020202607
3
+ ## 0.0.0-extract-tool-ui-inp-playground-ui-20251024041825
4
+
5
+ ### Minor Changes
6
+
7
+ - Rename LLM span types and attributes to use Model prefix ([#9105](https://github.com/mastra-ai/mastra/pull/9105))
8
+
9
+ BREAKING CHANGE: This release renames AI tracing span types and attribute interfaces to use the "Model" prefix instead of "LLM":
10
+ - `AISpanType.LLM_GENERATION` → `AISpanType.MODEL_GENERATION`
11
+ - `AISpanType.LLM_STEP` → `AISpanType.MODEL_STEP`
12
+ - `AISpanType.LLM_CHUNK` → `AISpanType.MODEL_CHUNK`
13
+ - `LLMGenerationAttributes` → `ModelGenerationAttributes`
14
+ - `LLMStepAttributes` → `ModelStepAttributes`
15
+ - `LLMChunkAttributes` → `ModelChunkAttributes`
16
+ - `InternalSpans.LLM` → `InternalSpans.MODEL`
17
+
18
+ This change better reflects that these span types apply to all AI models, not just Large Language Models.
19
+
20
+ Migration guide:
21
+ - Update all imports: `import { ModelGenerationAttributes } from '@mastra/core/ai-tracing'`
22
+ - Update span type references: `AISpanType.MODEL_GENERATION`
23
+ - Update InternalSpans usage: `InternalSpans.MODEL`
24
+
25
+ ### Patch Changes
26
+
27
+ - Updated dependencies [[`f743dbb`](https://github.com/mastra-ai/mastra/commit/f743dbb8b40d1627b5c10c0e6fc154f4ebb6e394), [`6c049d9`](https://github.com/mastra-ai/mastra/commit/6c049d94063fdcbd5b81c4912a2bf82a92c9cc0b), [`5df9cce`](https://github.com/mastra-ai/mastra/commit/5df9cce1a753438413f64c11eeef8f845745c2a8), [`c576fc0`](https://github.com/mastra-ai/mastra/commit/c576fc0b100b2085afded91a37c97a0ea0ec09c7), [`d36cfbb`](https://github.com/mastra-ai/mastra/commit/d36cfbbb6565ba5f827883cc9bb648eb14befdc1), [`2c4438b`](https://github.com/mastra-ai/mastra/commit/2c4438b87817ab7eed818c7990fef010475af1a3)]:
28
+ - @mastra/core@0.0.0-extract-tool-ui-inp-playground-ui-20251024041825
29
+
30
+ ## 0.2.0
31
+
32
+ ### Minor Changes
33
+
34
+ - feat(otel-exporter): Add customizable 'exporter' constructor parameter ([#8827](https://github.com/mastra-ai/mastra/pull/8827))
35
+
36
+ You can now pass in an instantiated `TraceExporter` inheriting class into `OtelExporter`.
37
+ This will circumvent the default package detection, no longer instantiating a `TraceExporter`
38
+ automatically if one is instead passed in to the `OtelExporter` constructor.
39
+
40
+ feat(arize): Initial release of @mastra/arize observability package
41
+
42
+ The `@mastra/arize` package exports an `ArizeExporter` class that can be used to easily send AI
43
+ traces from Mastra to Arize AX, Arize Phoenix, or any OpenInference compatible collector.
44
+ It sends traces uses `BatchSpanProcessor` over OTLP connections.
45
+ It leverages the `@mastra/otel-exporter` package, reusing `OtelExporter` for transmission and
46
+ span management.
47
+ See the README in `observability/arize/README.md` for more details
4
48
 
5
49
  ### Patch Changes
6
50
 
7
- - Updated dependencies [[`c67ca32`](https://github.com/mastra-ai/mastra/commit/c67ca32e3c2cf69bfc146580770c720220ca44ac), [`efb5ed9`](https://github.com/mastra-ai/mastra/commit/efb5ed946ae7f410bc68c9430beb4b010afd25ec), [`dbc9e12`](https://github.com/mastra-ai/mastra/commit/dbc9e1216ba575ba59ead4afb727a01215f7de4f), [`99e41b9`](https://github.com/mastra-ai/mastra/commit/99e41b94957cdd25137d3ac12e94e8b21aa01b68), [`c28833c`](https://github.com/mastra-ai/mastra/commit/c28833c5b6d8e10eeffd7f7d39129d53b8bca240), [`f053e89`](https://github.com/mastra-ai/mastra/commit/f053e89160dbd0bd3333fc3492f68231b5c7c349), [`182f045`](https://github.com/mastra-ai/mastra/commit/182f0458f25bd70aa774e64fd923c8a483eddbf1), [`9a1a485`](https://github.com/mastra-ai/mastra/commit/9a1a4859b855e37239f652bf14b1ecd1029b8c4e), [`9257233`](https://github.com/mastra-ai/mastra/commit/9257233c4ffce09b2bedc2a9adbd70d7a83fa8e2), [`b2365f0`](https://github.com/mastra-ai/mastra/commit/b2365f038dd4c5f06400428b224af963f399ad50), [`0f1a4c9`](https://github.com/mastra-ai/mastra/commit/0f1a4c984fb4b104b2f0b63ba18c9fa77f567700), [`e473bfe`](https://github.com/mastra-ai/mastra/commit/e473bfe416c0b8e876973c2b6a6f13c394b7a93f), [`2db6160`](https://github.com/mastra-ai/mastra/commit/2db6160e2022ff8827c15d30157e684683b934b5), [`8aeea37`](https://github.com/mastra-ai/mastra/commit/8aeea37efdde347c635a67fed56794943b7f74ec), [`02fe153`](https://github.com/mastra-ai/mastra/commit/02fe15351d6021d214da48ec982a0e9e4150bcee), [`74567b3`](https://github.com/mastra-ai/mastra/commit/74567b3d237ae3915cd0bca3cf55fa0a64e4e4a4), [`15a1733`](https://github.com/mastra-ai/mastra/commit/15a1733074cee8bd37370e1af34cd818e89fa7ac), [`fc2a774`](https://github.com/mastra-ai/mastra/commit/fc2a77468981aaddc3e77f83f0c4ad4a4af140da), [`4e08933`](https://github.com/mastra-ai/mastra/commit/4e08933625464dfde178347af5b6278fcf34188e)]:
8
- - @mastra/core@0.0.0-error-handler-fix-20251020202607
51
+ - fix(observability): Add ParentSpanContext to MastraSpan's with parentage ([#9085](https://github.com/mastra-ai/mastra/pull/9085))
52
+
53
+ - Update peerdeps to 0.23.0-0 ([#9043](https://github.com/mastra-ai/mastra/pull/9043))
54
+
55
+ - Updated dependencies [[`c67ca32`](https://github.com/mastra-ai/mastra/commit/c67ca32e3c2cf69bfc146580770c720220ca44ac), [`efb5ed9`](https://github.com/mastra-ai/mastra/commit/efb5ed946ae7f410bc68c9430beb4b010afd25ec), [`dbc9e12`](https://github.com/mastra-ai/mastra/commit/dbc9e1216ba575ba59ead4afb727a01215f7de4f), [`99e41b9`](https://github.com/mastra-ai/mastra/commit/99e41b94957cdd25137d3ac12e94e8b21aa01b68), [`c28833c`](https://github.com/mastra-ai/mastra/commit/c28833c5b6d8e10eeffd7f7d39129d53b8bca240), [`8ea07b4`](https://github.com/mastra-ai/mastra/commit/8ea07b4bdc73e4218437dbb6dcb0f4b23e745a44), [`ba201b8`](https://github.com/mastra-ai/mastra/commit/ba201b8f8feac4c72350f2dbd52c13c7297ba7b0), [`f053e89`](https://github.com/mastra-ai/mastra/commit/f053e89160dbd0bd3333fc3492f68231b5c7c349), [`4fc4136`](https://github.com/mastra-ai/mastra/commit/4fc413652866a8d2240694fddb2562e9edbb70df), [`b78e04d`](https://github.com/mastra-ai/mastra/commit/b78e04d935a16ecb1e59c5c96e564903527edddd), [`d10baf5`](https://github.com/mastra-ai/mastra/commit/d10baf5a3c924f2a6654e23a3e318ed03f189b76), [`038c55a`](https://github.com/mastra-ai/mastra/commit/038c55a7090fc1b1513a966386d3072617f836ac), [`182f045`](https://github.com/mastra-ai/mastra/commit/182f0458f25bd70aa774e64fd923c8a483eddbf1), [`9a1a485`](https://github.com/mastra-ai/mastra/commit/9a1a4859b855e37239f652bf14b1ecd1029b8c4e), [`9257233`](https://github.com/mastra-ai/mastra/commit/9257233c4ffce09b2bedc2a9adbd70d7a83fa8e2), [`7620d2b`](https://github.com/mastra-ai/mastra/commit/7620d2bddeb4fae4c3c0a0b4e672969795fca11a), [`b2365f0`](https://github.com/mastra-ai/mastra/commit/b2365f038dd4c5f06400428b224af963f399ad50), [`0f1a4c9`](https://github.com/mastra-ai/mastra/commit/0f1a4c984fb4b104b2f0b63ba18c9fa77f567700), [`9029ba3`](https://github.com/mastra-ai/mastra/commit/9029ba34459c8859fed4c6b73efd8e2d0021e7ba), [`426cc56`](https://github.com/mastra-ai/mastra/commit/426cc561c85ae76a112ded2385532a91f9f9f074), [`00931fb`](https://github.com/mastra-ai/mastra/commit/00931fb1a21aa42c4fbc20c2c40dd62466b8fc8f), [`e473bfe`](https://github.com/mastra-ai/mastra/commit/e473bfe416c0b8e876973c2b6a6f13c394b7a93f), [`b78e04d`](https://github.com/mastra-ai/mastra/commit/b78e04d935a16ecb1e59c5c96e564903527edddd), [`2db6160`](https://github.com/mastra-ai/mastra/commit/2db6160e2022ff8827c15d30157e684683b934b5), [`8aeea37`](https://github.com/mastra-ai/mastra/commit/8aeea37efdde347c635a67fed56794943b7f74ec), [`02fe153`](https://github.com/mastra-ai/mastra/commit/02fe15351d6021d214da48ec982a0e9e4150bcee), [`648e2ca`](https://github.com/mastra-ai/mastra/commit/648e2ca42da54838c6ccbdaadc6fadd808fa6b86), [`74567b3`](https://github.com/mastra-ai/mastra/commit/74567b3d237ae3915cd0bca3cf55fa0a64e4e4a4), [`b65c5e0`](https://github.com/mastra-ai/mastra/commit/b65c5e0fe6f3c390a9a8bbcf69304d972c3a4afb), [`15a1733`](https://github.com/mastra-ai/mastra/commit/15a1733074cee8bd37370e1af34cd818e89fa7ac), [`fc2a774`](https://github.com/mastra-ai/mastra/commit/fc2a77468981aaddc3e77f83f0c4ad4a4af140da), [`4e08933`](https://github.com/mastra-ai/mastra/commit/4e08933625464dfde178347af5b6278fcf34188e)]:
56
+ - @mastra/core@0.22.0
57
+
58
+ ## 0.2.0-alpha.0
59
+
60
+ ### Minor Changes
61
+
62
+ - feat(otel-exporter): Add customizable 'exporter' constructor parameter ([#8827](https://github.com/mastra-ai/mastra/pull/8827))
63
+
64
+ You can now pass in an instantiated `TraceExporter` inheriting class into `OtelExporter`.
65
+ This will circumvent the default package detection, no longer instantiating a `TraceExporter`
66
+ automatically if one is instead passed in to the `OtelExporter` constructor.
67
+
68
+ feat(arize): Initial release of @mastra/arize observability package
69
+
70
+ The `@mastra/arize` package exports an `ArizeExporter` class that can be used to easily send AI
71
+ traces from Mastra to Arize AX, Arize Phoenix, or any OpenInference compatible collector.
72
+ It sends traces uses `BatchSpanProcessor` over OTLP connections.
73
+ It leverages the `@mastra/otel-exporter` package, reusing `OtelExporter` for transmission and
74
+ span management.
75
+ See the README in `observability/arize/README.md` for more details
76
+
77
+ ### Patch Changes
78
+
79
+ - fix(observability): Add ParentSpanContext to MastraSpan's with parentage ([#9085](https://github.com/mastra-ai/mastra/pull/9085))
80
+
81
+ - Update peerdeps to 0.23.0-0 ([#9043](https://github.com/mastra-ai/mastra/pull/9043))
82
+
83
+ - Updated dependencies [[`efb5ed9`](https://github.com/mastra-ai/mastra/commit/efb5ed946ae7f410bc68c9430beb4b010afd25ec), [`8ea07b4`](https://github.com/mastra-ai/mastra/commit/8ea07b4bdc73e4218437dbb6dcb0f4b23e745a44), [`ba201b8`](https://github.com/mastra-ai/mastra/commit/ba201b8f8feac4c72350f2dbd52c13c7297ba7b0), [`4fc4136`](https://github.com/mastra-ai/mastra/commit/4fc413652866a8d2240694fddb2562e9edbb70df), [`b78e04d`](https://github.com/mastra-ai/mastra/commit/b78e04d935a16ecb1e59c5c96e564903527edddd), [`d10baf5`](https://github.com/mastra-ai/mastra/commit/d10baf5a3c924f2a6654e23a3e318ed03f189b76), [`038c55a`](https://github.com/mastra-ai/mastra/commit/038c55a7090fc1b1513a966386d3072617f836ac), [`182f045`](https://github.com/mastra-ai/mastra/commit/182f0458f25bd70aa774e64fd923c8a483eddbf1), [`7620d2b`](https://github.com/mastra-ai/mastra/commit/7620d2bddeb4fae4c3c0a0b4e672969795fca11a), [`b2365f0`](https://github.com/mastra-ai/mastra/commit/b2365f038dd4c5f06400428b224af963f399ad50), [`9029ba3`](https://github.com/mastra-ai/mastra/commit/9029ba34459c8859fed4c6b73efd8e2d0021e7ba), [`426cc56`](https://github.com/mastra-ai/mastra/commit/426cc561c85ae76a112ded2385532a91f9f9f074), [`00931fb`](https://github.com/mastra-ai/mastra/commit/00931fb1a21aa42c4fbc20c2c40dd62466b8fc8f), [`e473bfe`](https://github.com/mastra-ai/mastra/commit/e473bfe416c0b8e876973c2b6a6f13c394b7a93f), [`b78e04d`](https://github.com/mastra-ai/mastra/commit/b78e04d935a16ecb1e59c5c96e564903527edddd), [`648e2ca`](https://github.com/mastra-ai/mastra/commit/648e2ca42da54838c6ccbdaadc6fadd808fa6b86), [`b65c5e0`](https://github.com/mastra-ai/mastra/commit/b65c5e0fe6f3c390a9a8bbcf69304d972c3a4afb)]:
84
+ - @mastra/core@0.22.0-alpha.1
9
85
 
10
86
  ## 0.1.0
11
87
 
package/README.md CHANGED
@@ -382,8 +382,8 @@ The exporter maps Mastra's AI tracing data to OTEL-compliant attributes:
382
382
  - `gen_ai.request.top_p` - Top-p sampling parameter
383
383
  - `gen_ai.request.top_k` - Top-k sampling parameter
384
384
  - `gen_ai.response.finish_reasons` - Reason for completion
385
- - `gen_ai.prompt` - Input prompt (for LLM spans)
386
- - `gen_ai.completion` - Model output (for LLM spans)
385
+ - `gen_ai.prompt` - Input prompt (for Model spans)
386
+ - `gen_ai.completion` - Model output (for Model spans)
387
387
 
388
388
  #### Tool Attributes
389
389
 
@@ -19,6 +19,8 @@ export declare class OtelExporter implements AITracingExporter {
19
19
  */
20
20
  init(config: TracingConfig): void;
21
21
  private setupExporter;
22
+ private setupProcessor;
23
+ private setup;
22
24
  exportEvent(event: AITracingEvent): Promise<void>;
23
25
  private exportSpan;
24
26
  shutdown(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"ai-tracing.d.ts","sourceRoot":"","sources":["../src/ai-tracing.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAqB,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAiBnH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,qBAAa,YAAa,YAAW,iBAAiB;IACpD,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,SAAS,CAAC,CAAqB;IACvC,OAAO,CAAC,QAAQ,CAAC,CAAe;IAChC,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,MAAM,CAAgB;IAE9B,IAAI,SAAmB;gBAEX,MAAM,EAAE,kBAAkB;IAWtC;;OAEG;IACH,IAAI,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;YAInB,aAAa;IAwHrB,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;YAgBzC,UAAU;IA8BlB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAMhC"}
1
+ {"version":3,"file":"ai-tracing.d.ts","sourceRoot":"","sources":["../src/ai-tracing.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAqB,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAiBnH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,qBAAa,YAAa,YAAW,iBAAiB;IACpD,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,SAAS,CAAC,CAAqB;IACvC,OAAO,CAAC,QAAQ,CAAC,CAAe;IAChC,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,MAAM,CAAgB;IAE9B,IAAI,SAAmB;gBAEX,MAAM,EAAE,kBAAkB;IAWtC;;OAEG;IACH,IAAI,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;YAInB,aAAa;YA6Fb,cAAc;YAqCd,KAAK;IAOb,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;YAgBzC,UAAU;IA8BlB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAMhC"}
package/dist/index.cjs CHANGED
@@ -209,6 +209,7 @@ var MastraReadableSpan = class {
209
209
  name;
210
210
  kind;
211
211
  spanContext;
212
+ parentSpanContext;
212
213
  parentSpanId;
213
214
  startTime;
214
215
  endTime;
@@ -276,6 +277,14 @@ var MastraReadableSpan = class {
276
277
  traceFlags: api.TraceFlags.SAMPLED,
277
278
  isRemote: false
278
279
  });
280
+ if (parentSpanId) {
281
+ this.parentSpanContext = {
282
+ traceId: aiSpan.traceId,
283
+ spanId: parentSpanId,
284
+ traceFlags: api.TraceFlags.SAMPLED,
285
+ isRemote: false
286
+ };
287
+ }
279
288
  this.resource = resource || {};
280
289
  this.instrumentationLibrary = instrumentationLibrary || {
281
290
  name: "@mastra/otel",
@@ -296,9 +305,9 @@ var MastraReadableSpan = class {
296
305
 
297
306
  // src/span-converter.ts
298
307
  var SPAN_KIND_MAPPING = {
299
- // LLM operations are CLIENT spans (calling external AI services)
300
- [aiTracing.AISpanType.LLM_GENERATION]: api.SpanKind.CLIENT,
301
- [aiTracing.AISpanType.LLM_CHUNK]: api.SpanKind.CLIENT,
308
+ // Model operations are CLIENT spans (calling external AI services)
309
+ [aiTracing.AISpanType.MODEL_GENERATION]: api.SpanKind.CLIENT,
310
+ [aiTracing.AISpanType.MODEL_CHUNK]: api.SpanKind.CLIENT,
302
311
  // MCP tool calls are CLIENT (external service calls)
303
312
  [aiTracing.AISpanType.MCP_TOOL_CALL]: api.SpanKind.CLIENT,
304
313
  // Root spans for agent/workflow are SERVER (entry points)
@@ -350,7 +359,7 @@ var SpanConverter = class {
350
359
  */
351
360
  buildSpanName(aiSpan) {
352
361
  switch (aiSpan.type) {
353
- case aiTracing.AISpanType.LLM_GENERATION: {
362
+ case aiTracing.AISpanType.MODEL_GENERATION: {
354
363
  const attrs = aiSpan.attributes;
355
364
  const operation = attrs?.resultType === "tool_selection" ? "tool_selection" : "chat";
356
365
  const model = attrs?.model || "unknown";
@@ -395,7 +404,7 @@ var SpanConverter = class {
395
404
  if (aiSpan.input !== void 0) {
396
405
  const inputStr = typeof aiSpan.input === "string" ? aiSpan.input : JSON.stringify(aiSpan.input);
397
406
  attributes["input"] = inputStr;
398
- if (aiSpan.type === aiTracing.AISpanType.LLM_GENERATION) {
407
+ if (aiSpan.type === aiTracing.AISpanType.MODEL_GENERATION) {
399
408
  attributes["gen_ai.prompt"] = inputStr;
400
409
  } else if (aiSpan.type === aiTracing.AISpanType.TOOL_CALL || aiSpan.type === aiTracing.AISpanType.MCP_TOOL_CALL) {
401
410
  attributes["gen_ai.tool.input"] = inputStr;
@@ -404,64 +413,64 @@ var SpanConverter = class {
404
413
  if (aiSpan.output !== void 0) {
405
414
  const outputStr = typeof aiSpan.output === "string" ? aiSpan.output : JSON.stringify(aiSpan.output);
406
415
  attributes["output"] = outputStr;
407
- if (aiSpan.type === aiTracing.AISpanType.LLM_GENERATION) {
416
+ if (aiSpan.type === aiTracing.AISpanType.MODEL_GENERATION) {
408
417
  attributes["gen_ai.completion"] = outputStr;
409
418
  } else if (aiSpan.type === aiTracing.AISpanType.TOOL_CALL || aiSpan.type === aiTracing.AISpanType.MCP_TOOL_CALL) {
410
419
  attributes["gen_ai.tool.output"] = outputStr;
411
420
  }
412
421
  }
413
- if (aiSpan.type === aiTracing.AISpanType.LLM_GENERATION && aiSpan.attributes) {
414
- const llmAttrs = aiSpan.attributes;
415
- if (llmAttrs.model) {
416
- attributes["gen_ai.request.model"] = llmAttrs.model;
422
+ if (aiSpan.type === aiTracing.AISpanType.MODEL_GENERATION && aiSpan.attributes) {
423
+ const modelAttrs = aiSpan.attributes;
424
+ if (modelAttrs.model) {
425
+ attributes["gen_ai.request.model"] = modelAttrs.model;
417
426
  }
418
- if (llmAttrs.provider) {
419
- attributes["gen_ai.system"] = llmAttrs.provider;
427
+ if (modelAttrs.provider) {
428
+ attributes["gen_ai.system"] = modelAttrs.provider;
420
429
  }
421
- if (llmAttrs.usage) {
422
- const inputTokens = llmAttrs.usage.inputTokens ?? llmAttrs.usage.promptTokens;
423
- const outputTokens = llmAttrs.usage.outputTokens ?? llmAttrs.usage.completionTokens;
430
+ if (modelAttrs.usage) {
431
+ const inputTokens = modelAttrs.usage.inputTokens ?? modelAttrs.usage.promptTokens;
432
+ const outputTokens = modelAttrs.usage.outputTokens ?? modelAttrs.usage.completionTokens;
424
433
  if (inputTokens !== void 0) {
425
434
  attributes["gen_ai.usage.input_tokens"] = inputTokens;
426
435
  }
427
436
  if (outputTokens !== void 0) {
428
437
  attributes["gen_ai.usage.output_tokens"] = outputTokens;
429
438
  }
430
- if (llmAttrs.usage.totalTokens !== void 0) {
431
- attributes["gen_ai.usage.total_tokens"] = llmAttrs.usage.totalTokens;
439
+ if (modelAttrs.usage.totalTokens !== void 0) {
440
+ attributes["gen_ai.usage.total_tokens"] = modelAttrs.usage.totalTokens;
432
441
  }
433
- if (llmAttrs.usage.reasoningTokens !== void 0) {
434
- attributes["gen_ai.usage.reasoning_tokens"] = llmAttrs.usage.reasoningTokens;
442
+ if (modelAttrs.usage.reasoningTokens !== void 0) {
443
+ attributes["gen_ai.usage.reasoning_tokens"] = modelAttrs.usage.reasoningTokens;
435
444
  }
436
- if (llmAttrs.usage.cachedInputTokens !== void 0) {
437
- attributes["gen_ai.usage.cached_input_tokens"] = llmAttrs.usage.cachedInputTokens;
445
+ if (modelAttrs.usage.cachedInputTokens !== void 0) {
446
+ attributes["gen_ai.usage.cached_input_tokens"] = modelAttrs.usage.cachedInputTokens;
438
447
  }
439
448
  }
440
- if (llmAttrs.parameters) {
441
- if (llmAttrs.parameters.temperature !== void 0) {
442
- attributes["gen_ai.request.temperature"] = llmAttrs.parameters.temperature;
449
+ if (modelAttrs.parameters) {
450
+ if (modelAttrs.parameters.temperature !== void 0) {
451
+ attributes["gen_ai.request.temperature"] = modelAttrs.parameters.temperature;
443
452
  }
444
- if (llmAttrs.parameters.maxOutputTokens !== void 0) {
445
- attributes["gen_ai.request.max_tokens"] = llmAttrs.parameters.maxOutputTokens;
453
+ if (modelAttrs.parameters.maxOutputTokens !== void 0) {
454
+ attributes["gen_ai.request.max_tokens"] = modelAttrs.parameters.maxOutputTokens;
446
455
  }
447
- if (llmAttrs.parameters.topP !== void 0) {
448
- attributes["gen_ai.request.top_p"] = llmAttrs.parameters.topP;
456
+ if (modelAttrs.parameters.topP !== void 0) {
457
+ attributes["gen_ai.request.top_p"] = modelAttrs.parameters.topP;
449
458
  }
450
- if (llmAttrs.parameters.topK !== void 0) {
451
- attributes["gen_ai.request.top_k"] = llmAttrs.parameters.topK;
459
+ if (modelAttrs.parameters.topK !== void 0) {
460
+ attributes["gen_ai.request.top_k"] = modelAttrs.parameters.topK;
452
461
  }
453
- if (llmAttrs.parameters.presencePenalty !== void 0) {
454
- attributes["gen_ai.request.presence_penalty"] = llmAttrs.parameters.presencePenalty;
462
+ if (modelAttrs.parameters.presencePenalty !== void 0) {
463
+ attributes["gen_ai.request.presence_penalty"] = modelAttrs.parameters.presencePenalty;
455
464
  }
456
- if (llmAttrs.parameters.frequencyPenalty !== void 0) {
457
- attributes["gen_ai.request.frequency_penalty"] = llmAttrs.parameters.frequencyPenalty;
465
+ if (modelAttrs.parameters.frequencyPenalty !== void 0) {
466
+ attributes["gen_ai.request.frequency_penalty"] = modelAttrs.parameters.frequencyPenalty;
458
467
  }
459
- if (llmAttrs.parameters.stopSequences) {
460
- attributes["gen_ai.request.stop_sequences"] = JSON.stringify(llmAttrs.parameters.stopSequences);
468
+ if (modelAttrs.parameters.stopSequences) {
469
+ attributes["gen_ai.request.stop_sequences"] = JSON.stringify(modelAttrs.parameters.stopSequences);
461
470
  }
462
471
  }
463
- if (llmAttrs.finishReason) {
464
- attributes["gen_ai.response.finish_reasons"] = llmAttrs.finishReason;
472
+ if (modelAttrs.finishReason) {
473
+ attributes["gen_ai.response.finish_reasons"] = modelAttrs.finishReason;
465
474
  }
466
475
  }
467
476
  if ((aiSpan.type === aiTracing.AISpanType.TOOL_CALL || aiSpan.type === aiTracing.AISpanType.MCP_TOOL_CALL) && aiSpan.attributes) {
@@ -490,6 +499,7 @@ var SpanConverter = class {
490
499
  const agentAttrs = aiSpan.attributes;
491
500
  if (agentAttrs.agentId) {
492
501
  attributes["agent.id"] = agentAttrs.agentId;
502
+ attributes["gen_ai.agent.id"] = agentAttrs.agentId;
493
503
  }
494
504
  if (agentAttrs.maxSteps) {
495
505
  attributes["agent.max_steps"] = agentAttrs.maxSteps;
@@ -547,7 +557,7 @@ var SpanConverter = class {
547
557
  */
548
558
  getOperationName(aiSpan) {
549
559
  switch (aiSpan.type) {
550
- case aiTracing.AISpanType.LLM_GENERATION: {
560
+ case aiTracing.AISpanType.MODEL_GENERATION: {
551
561
  const attrs = aiSpan.attributes;
552
562
  return attrs?.resultType === "tool_selection" ? "tool_selection" : "chat";
553
563
  }
@@ -610,7 +620,7 @@ var OtelExporter = class {
610
620
  this.tracingConfig = config;
611
621
  }
612
622
  async setupExporter() {
613
- if (this.isSetup) return;
623
+ if (this.isSetup || this.exporter) return;
614
624
  if (!this.config.provider) {
615
625
  this.logger.error(
616
626
  '[OtelExporter] Provider configuration is required. Use the "custom" provider for generic endpoints.'
@@ -625,6 +635,10 @@ var OtelExporter = class {
625
635
  this.isSetup = true;
626
636
  return;
627
637
  }
638
+ if (this.config.exporter) {
639
+ this.exporter = this.config.exporter;
640
+ return;
641
+ }
628
642
  const endpoint = resolved.endpoint;
629
643
  const headers = resolved.headers;
630
644
  const protocol = resolved.protocol;
@@ -678,6 +692,9 @@ var OtelExporter = class {
678
692
  this.isSetup = true;
679
693
  return;
680
694
  }
695
+ }
696
+ async setupProcessor() {
697
+ if (this.processor || this.isSetup) return;
681
698
  let resource = resources.resourceFromAttributes({
682
699
  [semanticConventions.ATTR_SERVICE_NAME]: this.tracingConfig?.serviceName || "mastra-service",
683
700
  [semanticConventions.ATTR_SERVICE_VERSION]: "1.0.0",
@@ -706,6 +723,11 @@ var OtelExporter = class {
706
723
  this.logger.debug(
707
724
  `[OtelExporter] Using BatchSpanProcessor (batch size: ${this.config.batchSize || 512}, delay: 5s)`
708
725
  );
726
+ }
727
+ async setup() {
728
+ if (this.isSetup) return;
729
+ await this.setupExporter();
730
+ await this.setupProcessor();
709
731
  this.isSetup = true;
710
732
  }
711
733
  async exportEvent(event) {
@@ -720,7 +742,7 @@ var OtelExporter = class {
720
742
  }
721
743
  async exportSpan(span) {
722
744
  if (!this.isSetup) {
723
- await this.setupExporter();
745
+ await this.setup();
724
746
  }
725
747
  if (this.isDisabled || !this.processor) {
726
748
  return;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/loadExporter.ts","../src/provider-configs.ts","../src/mastra-span.ts","../src/span-converter.ts","../src/ai-tracing.ts"],"names":["SpanStatusCode","TraceFlags","AISpanType","SpanKind","ConsoleLogger","diag","DiagConsoleLogger","DiagLogLevel","resourceFromAttributes","ATTR_SERVICE_NAME","ATTR_SERVICE_VERSION","ATTR_TELEMETRY_SDK_NAME","ATTR_TELEMETRY_SDK_VERSION","ATTR_TELEMETRY_SDK_LANGUAGE","BatchSpanProcessor","AITracingEventType"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Dynamic loader for optional OtelExporters\n */\n\nimport type { ExportProtocol } from './types.js';\n\n// Dynamic imports for optional dependencies\nlet OTLPHttpExporter: any;\nlet OTLPGrpcExporter: any;\nlet OTLPProtoExporter: any;\nlet ZipkinExporter: any;\n\nexport async function loadExporter(protocol: ExportProtocol, provider?: string): Promise<any> {\n switch (protocol) {\n case 'zipkin':\n if (!ZipkinExporter) {\n try {\n const module = await import('@opentelemetry/exporter-zipkin');\n ZipkinExporter = module.ZipkinExporter;\n } catch {\n console.error(\n `[OtelExporter] Zipkin exporter is not installed.\\n` +\n `To use Zipkin export, install the required package:\\n` +\n ` npm install @opentelemetry/exporter-zipkin`,\n );\n return null;\n }\n }\n return ZipkinExporter;\n\n case 'grpc':\n if (!OTLPGrpcExporter) {\n try {\n const module = await import('@opentelemetry/exporter-trace-otlp-grpc');\n OTLPGrpcExporter = module.OTLPTraceExporter;\n } catch {\n const providerInfo = provider ? ` (required for ${provider})` : '';\n console.error(\n `[OtelExporter] gRPC exporter is not installed${providerInfo}.\\n` +\n `To use gRPC export, install the required packages:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-grpc @grpc/grpc-js`,\n );\n return null;\n }\n }\n return OTLPGrpcExporter;\n\n case 'http/protobuf':\n if (!OTLPProtoExporter) {\n try {\n const module = await import('@opentelemetry/exporter-trace-otlp-proto');\n OTLPProtoExporter = module.OTLPTraceExporter;\n } catch {\n const providerInfo = provider ? ` (required for ${provider})` : '';\n console.error(\n `[OtelExporter] HTTP/Protobuf exporter is not installed${providerInfo}.\\n` +\n `To use HTTP/Protobuf export, install the required package:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-proto`,\n );\n return null;\n }\n }\n return OTLPProtoExporter;\n\n case 'http/json':\n default:\n if (!OTLPHttpExporter) {\n try {\n const module = await import('@opentelemetry/exporter-trace-otlp-http');\n OTLPHttpExporter = module.OTLPTraceExporter;\n } catch {\n const providerInfo = provider ? ` (required for ${provider})` : '';\n console.error(\n `[OtelExporter] HTTP/JSON exporter is not installed${providerInfo}.\\n` +\n `To use HTTP/JSON export, install the required package:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-http`,\n );\n return null;\n }\n }\n return OTLPHttpExporter;\n }\n}\n","/**\n * Provider-specific configurations for OtelExporters\n */\n\nimport type {\n ProviderConfig,\n ExportProtocol,\n Dash0Config,\n SignozConfig,\n NewRelicConfig,\n TraceloopConfig,\n LaminarConfig,\n CustomConfig,\n} from './types.js';\n\nexport interface ResolvedProviderConfig {\n endpoint: string;\n headers: Record<string, string>;\n protocol: ExportProtocol;\n}\n\nexport function resolveProviderConfig(config: ProviderConfig): ResolvedProviderConfig | null {\n if ('dash0' in config) {\n return resolveDash0Config(config.dash0);\n } else if ('signoz' in config) {\n return resolveSignozConfig(config.signoz);\n } else if ('newrelic' in config) {\n return resolveNewRelicConfig(config.newrelic);\n } else if ('traceloop' in config) {\n return resolveTraceloopConfig(config.traceloop);\n } else if ('laminar' in config) {\n return resolveLaminarConfig(config.laminar);\n } else if ('custom' in config) {\n return resolveCustomConfig(config.custom);\n } else {\n // TypeScript exhaustiveness check\n const _exhaustive: never = config;\n return _exhaustive;\n }\n}\n\nfunction resolveDash0Config(config: Dash0Config): ResolvedProviderConfig | null {\n if (!config.apiKey) {\n console.error('[OtelExporter] Dash0 configuration requires apiKey. Tracing will be disabled.');\n return null;\n }\n\n if (!config.endpoint) {\n console.error('[OtelExporter] Dash0 configuration requires endpoint. Tracing will be disabled.');\n return null;\n }\n\n // Dash0 uses gRPC by default\n // Endpoint should be like: ingress.us-west-2.aws.dash0.com:4317\n // gRPC endpoints also need /v1/traces suffix\n // Requires: npm install @opentelemetry/exporter-trace-otlp-grpc @grpc/grpc-js\n let endpoint = config.endpoint;\n if (!endpoint.includes('/v1/traces')) {\n endpoint = `${endpoint}/v1/traces`;\n }\n\n const headers: Record<string, string> = {\n authorization: `Bearer ${config.apiKey}`, // lowercase for gRPC metadata\n };\n\n if (config.dataset) {\n headers['dash0-dataset'] = config.dataset; // lowercase for gRPC metadata\n }\n\n return {\n endpoint,\n headers,\n protocol: 'grpc', // Use gRPC for Dash0\n };\n}\n\nfunction resolveSignozConfig(config: SignozConfig): ResolvedProviderConfig | null {\n if (!config.apiKey) {\n console.error('[OtelExporter] SigNoz configuration requires apiKey. Tracing will be disabled.');\n return null;\n }\n\n // SigNoz uses OTLP endpoint with /v1/traces suffix\n const endpoint = config.endpoint || `https://ingest.${config.region || 'us'}.signoz.cloud:443/v1/traces`;\n\n return {\n endpoint,\n headers: {\n 'signoz-ingestion-key': config.apiKey,\n },\n protocol: 'http/protobuf',\n };\n}\n\nfunction resolveNewRelicConfig(config: NewRelicConfig): ResolvedProviderConfig | null {\n if (!config.apiKey) {\n console.error('[OtelExporter] New Relic configuration requires apiKey (license key). Tracing will be disabled.');\n return null;\n }\n\n // New Relic recommends HTTP/protobuf over gRPC\n // New Relic uses OTLP endpoint with /v1/traces suffix\n const endpoint = config.endpoint || 'https://otlp.nr-data.net:443/v1/traces';\n\n return {\n endpoint,\n headers: {\n 'api-key': config.apiKey,\n },\n protocol: 'http/protobuf',\n };\n}\n\nfunction resolveTraceloopConfig(config: TraceloopConfig): ResolvedProviderConfig | null {\n if (!config.apiKey) {\n console.error('[OtelExporter] Traceloop configuration requires apiKey. Tracing will be disabled.');\n return null;\n }\n\n // Traceloop uses OTLP endpoint with /v1/traces suffix\n const endpoint = config.endpoint || 'https://api.traceloop.com/v1/traces';\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${config.apiKey}`,\n };\n\n if (config.destinationId) {\n headers['x-traceloop-destination-id'] = config.destinationId;\n }\n\n return {\n endpoint,\n headers,\n protocol: 'http/json',\n };\n}\n\nfunction resolveLaminarConfig(config: LaminarConfig): ResolvedProviderConfig | null {\n if (!config.apiKey) {\n console.error('[OtelExporter] Laminar configuration requires apiKey. Tracing will be disabled.');\n return null;\n }\n\n // Laminar uses OTLP endpoint with /v1/traces suffix for HTTP\n // They support both gRPC and HTTP, but we'll use HTTP for consistency\n const endpoint = config.endpoint || 'https://api.lmnr.ai/v1/traces';\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${config.apiKey}`,\n };\n\n // Only add team ID header if provided (for backwards compatibility)\n if (config.teamId) {\n headers['x-laminar-team-id'] = config.teamId;\n }\n\n return {\n endpoint,\n headers,\n protocol: 'http/protobuf', // Use HTTP/protobuf instead of gRPC for better compatibility\n };\n}\n\nfunction resolveCustomConfig(config: CustomConfig): ResolvedProviderConfig | null {\n if (!config.endpoint) {\n console.error('[OtelExporter] Custom configuration requires endpoint. Tracing will be disabled.');\n return null;\n }\n\n return {\n endpoint: config.endpoint,\n headers: config.headers || {},\n protocol: config.protocol || 'http/json',\n };\n}\n","/**\n * Custom OpenTelemetry span that preserves Mastra's trace and span IDs\n */\n\nimport type { AnyExportedAISpan } from '@mastra/core/ai-tracing';\nimport { SpanStatusCode, TraceFlags } from '@opentelemetry/api';\nimport type { SpanKind, SpanContext, SpanStatus, Attributes, Link } from '@opentelemetry/api';\nimport type { InstrumentationScope } from '@opentelemetry/core';\nimport type { Resource } from '@opentelemetry/resources';\nimport type { ReadableSpan, TimedEvent } from '@opentelemetry/sdk-trace-base';\n\n/**\n * A custom ReadableSpan implementation that preserves Mastra's IDs\n */\nexport class MastraReadableSpan implements ReadableSpan {\n readonly name: string;\n readonly kind: SpanKind;\n readonly spanContext: () => SpanContext;\n readonly parentSpanId?: string;\n readonly startTime: [number, number];\n readonly endTime: [number, number];\n readonly status: SpanStatus;\n readonly attributes: Attributes;\n readonly links: Link[];\n readonly events: TimedEvent[];\n readonly duration: [number, number];\n readonly ended: boolean;\n readonly resource: Resource;\n readonly instrumentationLibrary: InstrumentationScope;\n readonly instrumentationScope: InstrumentationScope;\n readonly droppedAttributesCount: number = 0;\n readonly droppedEventsCount: number = 0;\n readonly droppedLinksCount: number = 0;\n\n constructor(\n aiSpan: AnyExportedAISpan,\n attributes: Attributes,\n kind: SpanKind,\n parentSpanId?: string,\n resource?: Resource,\n instrumentationLibrary?: InstrumentationScope,\n ) {\n this.name = aiSpan.name;\n this.kind = kind;\n this.attributes = attributes;\n this.parentSpanId = parentSpanId;\n this.links = [];\n this.events = [];\n\n // Convert JavaScript Date to hrtime format [seconds, nanoseconds]\n this.startTime = this.dateToHrTime(aiSpan.startTime);\n this.endTime = aiSpan.endTime ? this.dateToHrTime(aiSpan.endTime) : this.startTime;\n this.ended = !!aiSpan.endTime;\n\n // Calculate duration\n if (aiSpan.endTime) {\n const durationMs = aiSpan.endTime.getTime() - aiSpan.startTime.getTime();\n this.duration = [Math.floor(durationMs / 1000), (durationMs % 1000) * 1000000];\n } else {\n this.duration = [0, 0];\n }\n\n // Set status based on error info\n if (aiSpan.errorInfo) {\n this.status = {\n code: SpanStatusCode.ERROR,\n message: aiSpan.errorInfo.message,\n };\n\n // Add error as event\n this.events.push({\n name: 'exception',\n attributes: {\n 'exception.message': aiSpan.errorInfo.message,\n 'exception.type': 'Error',\n ...(aiSpan.errorInfo.details?.stack && {\n 'exception.stacktrace': aiSpan.errorInfo.details.stack as string,\n }),\n },\n time: this.startTime,\n droppedAttributesCount: 0,\n });\n } else if (aiSpan.endTime) {\n this.status = { code: SpanStatusCode.OK };\n } else {\n this.status = { code: SpanStatusCode.UNSET };\n }\n\n // Add instant event if needed\n if (aiSpan.isEvent) {\n this.events.push({\n name: 'instant_event',\n attributes: {},\n time: this.startTime,\n droppedAttributesCount: 0,\n });\n }\n\n // Create span context with Mastra's IDs\n this.spanContext = () => ({\n traceId: aiSpan.traceId,\n spanId: aiSpan.id,\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n });\n\n // Set resource and instrumentation library\n this.resource = resource || ({} as Resource);\n this.instrumentationLibrary = instrumentationLibrary || {\n name: '@mastra/otel',\n version: '1.0.0',\n };\n // instrumentationScope is the same as instrumentationLibrary\n this.instrumentationScope = this.instrumentationLibrary;\n }\n\n /**\n * Convert JavaScript Date to hrtime format\n */\n private dateToHrTime(date: Date): [number, number] {\n const ms = date.getTime();\n const seconds = Math.floor(ms / 1000);\n const nanoseconds = (ms % 1000) * 1000000;\n return [seconds, nanoseconds];\n }\n}\n","/**\n * Convert Mastra AI spans to OpenTelemetry spans\n */\n\nimport type {\n AnyExportedAISpan,\n LLMGenerationAttributes,\n AgentRunAttributes,\n ToolCallAttributes,\n MCPToolCallAttributes,\n WorkflowRunAttributes,\n} from '@mastra/core/ai-tracing';\nimport { AISpanType } from '@mastra/core/ai-tracing';\nimport { SpanKind } from '@opentelemetry/api';\nimport type { Attributes } from '@opentelemetry/api';\nimport type { InstrumentationScope } from '@opentelemetry/core';\nimport type { Resource } from '@opentelemetry/resources';\nimport { MastraReadableSpan } from './mastra-span.js';\n\n// Map Mastra span types to OpenTelemetry span kinds following OTEL conventions\n// Only non-INTERNAL mappings are specified - all others default to SpanKind.INTERNAL\nconst SPAN_KIND_MAPPING: Partial<Record<AISpanType, SpanKind>> = {\n // LLM operations are CLIENT spans (calling external AI services)\n [AISpanType.LLM_GENERATION]: SpanKind.CLIENT,\n [AISpanType.LLM_CHUNK]: SpanKind.CLIENT,\n\n // MCP tool calls are CLIENT (external service calls)\n [AISpanType.MCP_TOOL_CALL]: SpanKind.CLIENT,\n\n // Root spans for agent/workflow are SERVER (entry points)\n [AISpanType.AGENT_RUN]: SpanKind.SERVER,\n [AISpanType.WORKFLOW_RUN]: SpanKind.SERVER,\n};\n\nexport class SpanConverter {\n private resource?: Resource;\n private instrumentationLibrary: InstrumentationScope;\n\n constructor(resource?: Resource) {\n this.resource = resource;\n this.instrumentationLibrary = {\n name: '@mastra/otel',\n version: '1.0.0',\n };\n }\n\n /**\n * Convert a Mastra AI span to an OpenTelemetry ReadableSpan\n * This preserves Mastra's trace and span IDs\n */\n convertSpan(aiSpan: AnyExportedAISpan): MastraReadableSpan {\n const spanKind = this.getSpanKind(aiSpan);\n const attributes = this.buildAttributes(aiSpan);\n const spanName = this.buildSpanName(aiSpan);\n\n // Create a new span with OTEL-compliant naming\n const otelSpan = { ...aiSpan, name: spanName };\n\n return new MastraReadableSpan(\n otelSpan,\n attributes,\n spanKind,\n aiSpan.parentSpanId, // Use the parentSpanId from the Mastra span directly\n this.resource,\n this.instrumentationLibrary,\n );\n }\n\n /**\n * Get the appropriate SpanKind based on span type and context\n */\n private getSpanKind(aiSpan: AnyExportedAISpan): SpanKind {\n // Root spans should be SERVER\n if (aiSpan.isRootSpan) {\n if (aiSpan.type === AISpanType.AGENT_RUN || aiSpan.type === AISpanType.WORKFLOW_RUN) {\n return SpanKind.SERVER;\n }\n }\n return SPAN_KIND_MAPPING[aiSpan.type] || SpanKind.INTERNAL;\n }\n\n /**\n * Build OTEL-compliant span name based on span type and attributes\n */\n private buildSpanName(aiSpan: AnyExportedAISpan): string {\n switch (aiSpan.type) {\n case AISpanType.LLM_GENERATION: {\n const attrs = aiSpan.attributes as LLMGenerationAttributes;\n const operation = attrs?.resultType === 'tool_selection' ? 'tool_selection' : 'chat';\n const model = attrs?.model || 'unknown';\n return `${operation} ${model}`;\n }\n\n case AISpanType.TOOL_CALL:\n case AISpanType.MCP_TOOL_CALL: {\n const toolAttrs = aiSpan.attributes as ToolCallAttributes | MCPToolCallAttributes;\n const toolName = toolAttrs?.toolId || 'unknown';\n return `tool.execute ${toolName}`;\n }\n\n case AISpanType.AGENT_RUN: {\n const agentAttrs = aiSpan.attributes as AgentRunAttributes;\n const agentId = agentAttrs?.agentId || 'unknown';\n return `agent.${agentId}`;\n }\n\n case AISpanType.WORKFLOW_RUN: {\n const workflowAttrs = aiSpan.attributes as WorkflowRunAttributes;\n const workflowId = workflowAttrs?.workflowId || 'unknown';\n return `workflow.${workflowId}`;\n }\n\n case AISpanType.WORKFLOW_STEP:\n // Keep the original name as it's likely descriptive\n return aiSpan.name;\n\n default:\n // For other types, use a simplified version of the original name\n return aiSpan.name;\n }\n }\n\n /**\n * Build OpenTelemetry attributes from Mastra AI span\n * Following OTEL Semantic Conventions for GenAI\n */\n private buildAttributes(aiSpan: AnyExportedAISpan): Attributes {\n const attributes: Attributes = {};\n\n // Add gen_ai.operation.name based on span type\n attributes['gen_ai.operation.name'] = this.getOperationName(aiSpan);\n\n // Add span kind semantic attribute\n attributes['span.kind'] = this.getSpanKindString(aiSpan);\n\n // Add span type for better visibility\n attributes['mastra.span.type'] = aiSpan.type;\n\n // Add trace and span IDs for debugging\n attributes['mastra.trace_id'] = aiSpan.traceId;\n attributes['mastra.span_id'] = aiSpan.id;\n if (aiSpan.parentSpanId) {\n attributes['mastra.parent_span_id'] = aiSpan.parentSpanId;\n }\n\n // Handle input/output based on span type\n // Always add input/output for Laminar compatibility\n if (aiSpan.input !== undefined) {\n const inputStr = typeof aiSpan.input === 'string' ? aiSpan.input : JSON.stringify(aiSpan.input);\n // Add generic input for all providers\n attributes['input'] = inputStr;\n\n // Add specific attributes based on span type\n if (aiSpan.type === AISpanType.LLM_GENERATION) {\n attributes['gen_ai.prompt'] = inputStr;\n } else if (aiSpan.type === AISpanType.TOOL_CALL || aiSpan.type === AISpanType.MCP_TOOL_CALL) {\n attributes['gen_ai.tool.input'] = inputStr;\n }\n }\n\n if (aiSpan.output !== undefined) {\n const outputStr = typeof aiSpan.output === 'string' ? aiSpan.output : JSON.stringify(aiSpan.output);\n // Add generic output for all providers\n attributes['output'] = outputStr;\n\n // Add specific attributes based on span type\n if (aiSpan.type === AISpanType.LLM_GENERATION) {\n attributes['gen_ai.completion'] = outputStr;\n } else if (aiSpan.type === AISpanType.TOOL_CALL || aiSpan.type === AISpanType.MCP_TOOL_CALL) {\n attributes['gen_ai.tool.output'] = outputStr;\n }\n }\n\n // Add LLM-specific attributes using OTEL semantic conventions\n if (aiSpan.type === AISpanType.LLM_GENERATION && aiSpan.attributes) {\n const llmAttrs = aiSpan.attributes as LLMGenerationAttributes;\n\n // Model and provider\n if (llmAttrs.model) {\n attributes['gen_ai.request.model'] = llmAttrs.model;\n }\n\n if (llmAttrs.provider) {\n attributes['gen_ai.system'] = llmAttrs.provider;\n }\n\n // Token usage - use OTEL standard naming\n if (llmAttrs.usage) {\n // Handle both v5 format (inputTokens/outputTokens) and legacy format (promptTokens/completionTokens)\n const inputTokens = llmAttrs.usage.inputTokens ?? llmAttrs.usage.promptTokens;\n const outputTokens = llmAttrs.usage.outputTokens ?? llmAttrs.usage.completionTokens;\n\n if (inputTokens !== undefined) {\n attributes['gen_ai.usage.input_tokens'] = inputTokens;\n }\n if (outputTokens !== undefined) {\n attributes['gen_ai.usage.output_tokens'] = outputTokens;\n }\n if (llmAttrs.usage.totalTokens !== undefined) {\n attributes['gen_ai.usage.total_tokens'] = llmAttrs.usage.totalTokens;\n }\n\n // Add other token metrics if present\n if (llmAttrs.usage.reasoningTokens !== undefined) {\n attributes['gen_ai.usage.reasoning_tokens'] = llmAttrs.usage.reasoningTokens;\n }\n if (llmAttrs.usage.cachedInputTokens !== undefined) {\n attributes['gen_ai.usage.cached_input_tokens'] = llmAttrs.usage.cachedInputTokens;\n }\n }\n\n // Parameters using OTEL conventions\n if (llmAttrs.parameters) {\n if (llmAttrs.parameters.temperature !== undefined) {\n attributes['gen_ai.request.temperature'] = llmAttrs.parameters.temperature;\n }\n if (llmAttrs.parameters.maxOutputTokens !== undefined) {\n attributes['gen_ai.request.max_tokens'] = llmAttrs.parameters.maxOutputTokens;\n }\n if (llmAttrs.parameters.topP !== undefined) {\n attributes['gen_ai.request.top_p'] = llmAttrs.parameters.topP;\n }\n if (llmAttrs.parameters.topK !== undefined) {\n attributes['gen_ai.request.top_k'] = llmAttrs.parameters.topK;\n }\n if (llmAttrs.parameters.presencePenalty !== undefined) {\n attributes['gen_ai.request.presence_penalty'] = llmAttrs.parameters.presencePenalty;\n }\n if (llmAttrs.parameters.frequencyPenalty !== undefined) {\n attributes['gen_ai.request.frequency_penalty'] = llmAttrs.parameters.frequencyPenalty;\n }\n if (llmAttrs.parameters.stopSequences) {\n attributes['gen_ai.request.stop_sequences'] = JSON.stringify(llmAttrs.parameters.stopSequences);\n }\n }\n\n // Response attributes\n if (llmAttrs.finishReason) {\n attributes['gen_ai.response.finish_reasons'] = llmAttrs.finishReason;\n }\n }\n\n // Add tool-specific attributes using OTEL conventions\n if ((aiSpan.type === AISpanType.TOOL_CALL || aiSpan.type === AISpanType.MCP_TOOL_CALL) && aiSpan.attributes) {\n const toolAttrs = aiSpan.attributes as ToolCallAttributes | MCPToolCallAttributes;\n\n // Tool identification\n if (toolAttrs.toolId) {\n attributes['gen_ai.tool.name'] = toolAttrs.toolId;\n }\n\n // MCP-specific attributes\n if (aiSpan.type === AISpanType.MCP_TOOL_CALL) {\n const mcpAttrs = toolAttrs as MCPToolCallAttributes;\n if (mcpAttrs.mcpServer) {\n attributes['mcp.server'] = mcpAttrs.mcpServer;\n }\n if (mcpAttrs.serverVersion) {\n attributes['mcp.server.version'] = mcpAttrs.serverVersion;\n }\n } else {\n if ((toolAttrs as ToolCallAttributes).toolDescription) {\n attributes['gen_ai.tool.description'] = (toolAttrs as ToolCallAttributes).toolDescription;\n }\n }\n\n // Tool execution result\n if (toolAttrs.success !== undefined) {\n attributes['gen_ai.tool.success'] = toolAttrs.success;\n }\n }\n\n // Add agent-specific attributes\n if (aiSpan.type === AISpanType.AGENT_RUN && aiSpan.attributes) {\n const agentAttrs = aiSpan.attributes as AgentRunAttributes;\n if (agentAttrs.agentId) {\n attributes['agent.id'] = agentAttrs.agentId;\n }\n if (agentAttrs.maxSteps) {\n attributes['agent.max_steps'] = agentAttrs.maxSteps;\n }\n if (agentAttrs.availableTools) {\n attributes['agent.available_tools'] = JSON.stringify(agentAttrs.availableTools);\n }\n }\n\n // Add workflow-specific attributes\n if (aiSpan.type === AISpanType.WORKFLOW_RUN && aiSpan.attributes) {\n const workflowAttrs = aiSpan.attributes as WorkflowRunAttributes;\n if (workflowAttrs.workflowId) {\n attributes['workflow.id'] = workflowAttrs.workflowId;\n }\n if (workflowAttrs.status) {\n attributes['workflow.status'] = workflowAttrs.status;\n }\n }\n\n // Add error information if present\n if (aiSpan.errorInfo) {\n attributes['error'] = true;\n attributes['error.type'] = aiSpan.errorInfo.id || 'unknown';\n attributes['error.message'] = aiSpan.errorInfo.message;\n if (aiSpan.errorInfo.domain) {\n attributes['error.domain'] = aiSpan.errorInfo.domain;\n }\n if (aiSpan.errorInfo.category) {\n attributes['error.category'] = aiSpan.errorInfo.category;\n }\n }\n\n // Add metadata as custom attributes with proper typing\n if (aiSpan.metadata) {\n Object.entries(aiSpan.metadata).forEach(([key, value]) => {\n // Skip if attribute already exists\n if (!attributes[key]) {\n // Ensure value is a valid OTEL attribute type\n if (value === null || value === undefined) {\n return;\n }\n if (typeof value === 'object') {\n attributes[key] = JSON.stringify(value);\n } else {\n attributes[key] = value;\n }\n }\n });\n }\n\n // Add timing information\n if (aiSpan.startTime) {\n attributes['mastra.start_time'] = aiSpan.startTime.toISOString();\n }\n if (aiSpan.endTime) {\n attributes['mastra.end_time'] = aiSpan.endTime.toISOString();\n const duration = aiSpan.endTime.getTime() - aiSpan.startTime.getTime();\n attributes['mastra.duration_ms'] = duration;\n }\n\n return attributes;\n }\n\n /**\n * Get the operation name based on span type for gen_ai.operation.name\n */\n private getOperationName(aiSpan: AnyExportedAISpan): string {\n switch (aiSpan.type) {\n case AISpanType.LLM_GENERATION: {\n const attrs = aiSpan.attributes as LLMGenerationAttributes;\n return attrs?.resultType === 'tool_selection' ? 'tool_selection' : 'chat';\n }\n case AISpanType.TOOL_CALL:\n case AISpanType.MCP_TOOL_CALL:\n return 'tool.execute';\n case AISpanType.AGENT_RUN:\n return 'agent.run';\n case AISpanType.WORKFLOW_RUN:\n return 'workflow.run';\n default:\n return aiSpan.type.replace(/_/g, '.');\n }\n }\n\n /**\n * Get span kind as string for attribute\n */\n private getSpanKindString(aiSpan: AnyExportedAISpan): string {\n const kind = this.getSpanKind(aiSpan);\n switch (kind) {\n case SpanKind.SERVER:\n return 'server';\n case SpanKind.CLIENT:\n return 'client';\n case SpanKind.INTERNAL:\n return 'internal';\n case SpanKind.PRODUCER:\n return 'producer';\n case SpanKind.CONSUMER:\n return 'consumer';\n default:\n return 'internal';\n }\n }\n}\n","/**\n * OpenTelemetry AI Tracing Exporter for Mastra\n */\n\nimport { AITracingEventType } from '@mastra/core/ai-tracing';\nimport type { AITracingExporter, AITracingEvent, AnyExportedAISpan, TracingConfig } from '@mastra/core/ai-tracing';\nimport { ConsoleLogger } from '@mastra/core/logger';\nimport { diag, DiagConsoleLogger, DiagLogLevel } from '@opentelemetry/api';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport type { SpanExporter } from '@opentelemetry/sdk-trace-base';\nimport {\n ATTR_SERVICE_NAME,\n ATTR_SERVICE_VERSION,\n ATTR_TELEMETRY_SDK_LANGUAGE,\n ATTR_TELEMETRY_SDK_NAME,\n ATTR_TELEMETRY_SDK_VERSION,\n} from '@opentelemetry/semantic-conventions';\n\nimport { loadExporter } from './loadExporter.js';\nimport { resolveProviderConfig } from './provider-configs.js';\nimport { SpanConverter } from './span-converter.js';\nimport type { OtelExporterConfig } from './types.js';\n\nexport class OtelExporter implements AITracingExporter {\n private config: OtelExporterConfig;\n private tracingConfig?: TracingConfig;\n private spanConverter: SpanConverter;\n private processor?: BatchSpanProcessor;\n private exporter?: SpanExporter;\n private isSetup: boolean = false;\n private isDisabled: boolean = false;\n private logger: ConsoleLogger;\n\n name = 'opentelemetry';\n\n constructor(config: OtelExporterConfig) {\n this.config = config;\n this.spanConverter = new SpanConverter();\n this.logger = new ConsoleLogger({ level: config.logLevel ?? 'warn' });\n\n // Set up OpenTelemetry diagnostics if debug mode\n if (config.logLevel === 'debug') {\n diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.DEBUG);\n }\n }\n\n /**\n * Initialize with tracing configuration\n */\n init(config: TracingConfig): void {\n this.tracingConfig = config;\n }\n\n private async setupExporter() {\n if (this.isSetup) return;\n\n // Provider configuration is required\n if (!this.config.provider) {\n this.logger.error(\n '[OtelExporter] Provider configuration is required. Use the \"custom\" provider for generic endpoints.',\n );\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n // Resolve provider configuration\n const resolved = resolveProviderConfig(this.config.provider);\n if (!resolved) {\n // Configuration validation failed, disable tracing\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n const endpoint = resolved.endpoint;\n const headers = resolved.headers;\n const protocol = resolved.protocol;\n\n // Load and create the appropriate exporter based on protocol\n const providerName = Object.keys(this.config.provider)[0];\n const ExporterClass = await loadExporter(protocol, providerName);\n\n if (!ExporterClass) {\n // Exporter not available, disable tracing\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n try {\n if (protocol === 'zipkin') {\n this.exporter = new ExporterClass({\n url: endpoint,\n headers,\n });\n } else if (protocol === 'grpc') {\n // gRPC uses Metadata object instead of headers\n // Dynamically import @grpc/grpc-js to create metadata\n let metadata: any;\n try {\n // @ts-ignore - Dynamic import for optional dependency\n const grpcModule = await import('@grpc/grpc-js');\n metadata = new grpcModule.Metadata();\n Object.entries(headers).forEach(([key, value]) => {\n metadata.set(key, value);\n });\n } catch (grpcError) {\n this.logger.error(\n `[OtelExporter] Failed to load gRPC metadata. Install required packages:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-grpc @grpc/grpc-js\\n`,\n grpcError,\n );\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n this.exporter = new ExporterClass({\n url: endpoint,\n metadata,\n timeoutMillis: this.config.timeout,\n });\n } else {\n // HTTP/JSON and HTTP/Protobuf use headers\n this.exporter = new ExporterClass({\n url: endpoint,\n headers,\n timeoutMillis: this.config.timeout,\n });\n }\n } catch (error) {\n this.logger.error(`[OtelExporter] Failed to create exporter:`, error);\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n // Create resource with service name from TracingConfig\n let resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: this.tracingConfig?.serviceName || 'mastra-service',\n [ATTR_SERVICE_VERSION]: '1.0.0',\n // Add telemetry SDK information\n [ATTR_TELEMETRY_SDK_NAME]: '@mastra/otel-exporter',\n [ATTR_TELEMETRY_SDK_VERSION]: '1.0.0',\n [ATTR_TELEMETRY_SDK_LANGUAGE]: 'nodejs',\n });\n\n if (this.config.resourceAttributes) {\n resource = resource.merge(\n // Duplicate attributes from config will override defaults above\n resourceFromAttributes(this.config.resourceAttributes),\n );\n }\n\n // Store the resource for the span converter\n this.spanConverter = new SpanConverter(resource);\n\n // Always use BatchSpanProcessor for production\n // It queues spans and exports them in batches for better performance\n this.processor = new BatchSpanProcessor(this.exporter!, {\n maxExportBatchSize: this.config.batchSize || 512, // Default batch size\n maxQueueSize: 2048, // Maximum spans to queue\n scheduledDelayMillis: 5000, // Export every 5 seconds\n exportTimeoutMillis: this.config.timeout || 30000, // Export timeout\n });\n\n this.logger.debug(\n `[OtelExporter] Using BatchSpanProcessor (batch size: ${this.config.batchSize || 512}, delay: 5s)`,\n );\n this.isSetup = true;\n }\n\n async exportEvent(event: AITracingEvent): Promise<void> {\n // Skip if disabled due to configuration errors\n if (this.isDisabled) {\n return;\n }\n\n // Only process SPAN_ENDED events for OTEL\n // OTEL expects complete spans with start and end times\n if (event.type !== AITracingEventType.SPAN_ENDED) {\n return;\n }\n\n const span = event.exportedSpan;\n await this.exportSpan(span);\n }\n\n private async exportSpan(span: AnyExportedAISpan): Promise<void> {\n // Ensure exporter is set up\n if (!this.isSetup) {\n await this.setupExporter();\n }\n\n // Skip if disabled\n if (this.isDisabled || !this.processor) {\n return;\n }\n\n try {\n // Convert the span to OTEL format\n const readableSpan = this.spanConverter.convertSpan(span);\n\n // Export the span immediately through the processor\n // The processor will handle batching if configured\n await new Promise<void>(resolve => {\n this.processor!.onEnd(readableSpan);\n resolve();\n });\n\n this.logger.debug(\n `[OtelExporter] Exported span ${span.id} (trace: ${span.traceId}, parent: ${span.parentSpanId || 'none'}, type: ${span.type})`,\n );\n } catch (error) {\n this.logger.error(`[OtelExporter] Failed to export span ${span.id}:`, error);\n }\n }\n\n async shutdown(): Promise<void> {\n // Shutdown the processor to flush any remaining spans\n if (this.processor) {\n await this.processor.shutdown();\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/loadExporter.ts","../src/provider-configs.ts","../src/mastra-span.ts","../src/span-converter.ts","../src/ai-tracing.ts"],"names":["SpanStatusCode","TraceFlags","AISpanType","SpanKind","ConsoleLogger","diag","DiagConsoleLogger","DiagLogLevel","resourceFromAttributes","ATTR_SERVICE_NAME","ATTR_SERVICE_VERSION","ATTR_TELEMETRY_SDK_NAME","ATTR_TELEMETRY_SDK_VERSION","ATTR_TELEMETRY_SDK_LANGUAGE","BatchSpanProcessor","AITracingEventType"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Dynamic loader for optional OtelExporters\n */\n\nimport type { ExportProtocol } from './types.js';\n\n// Dynamic imports for optional dependencies\nlet OTLPHttpExporter: any;\nlet OTLPGrpcExporter: any;\nlet OTLPProtoExporter: any;\nlet ZipkinExporter: any;\n\nexport async function loadExporter(protocol: ExportProtocol, provider?: string): Promise<any> {\n switch (protocol) {\n case 'zipkin':\n if (!ZipkinExporter) {\n try {\n const module = await import('@opentelemetry/exporter-zipkin');\n ZipkinExporter = module.ZipkinExporter;\n } catch {\n console.error(\n `[OtelExporter] Zipkin exporter is not installed.\\n` +\n `To use Zipkin export, install the required package:\\n` +\n ` npm install @opentelemetry/exporter-zipkin`,\n );\n return null;\n }\n }\n return ZipkinExporter;\n\n case 'grpc':\n if (!OTLPGrpcExporter) {\n try {\n const module = await import('@opentelemetry/exporter-trace-otlp-grpc');\n OTLPGrpcExporter = module.OTLPTraceExporter;\n } catch {\n const providerInfo = provider ? ` (required for ${provider})` : '';\n console.error(\n `[OtelExporter] gRPC exporter is not installed${providerInfo}.\\n` +\n `To use gRPC export, install the required packages:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-grpc @grpc/grpc-js`,\n );\n return null;\n }\n }\n return OTLPGrpcExporter;\n\n case 'http/protobuf':\n if (!OTLPProtoExporter) {\n try {\n const module = await import('@opentelemetry/exporter-trace-otlp-proto');\n OTLPProtoExporter = module.OTLPTraceExporter;\n } catch {\n const providerInfo = provider ? ` (required for ${provider})` : '';\n console.error(\n `[OtelExporter] HTTP/Protobuf exporter is not installed${providerInfo}.\\n` +\n `To use HTTP/Protobuf export, install the required package:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-proto`,\n );\n return null;\n }\n }\n return OTLPProtoExporter;\n\n case 'http/json':\n default:\n if (!OTLPHttpExporter) {\n try {\n const module = await import('@opentelemetry/exporter-trace-otlp-http');\n OTLPHttpExporter = module.OTLPTraceExporter;\n } catch {\n const providerInfo = provider ? ` (required for ${provider})` : '';\n console.error(\n `[OtelExporter] HTTP/JSON exporter is not installed${providerInfo}.\\n` +\n `To use HTTP/JSON export, install the required package:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-http`,\n );\n return null;\n }\n }\n return OTLPHttpExporter;\n }\n}\n","/**\n * Provider-specific configurations for OtelExporters\n */\n\nimport type {\n ProviderConfig,\n ExportProtocol,\n Dash0Config,\n SignozConfig,\n NewRelicConfig,\n TraceloopConfig,\n LaminarConfig,\n CustomConfig,\n} from './types.js';\n\nexport interface ResolvedProviderConfig {\n endpoint: string;\n headers: Record<string, string>;\n protocol: ExportProtocol;\n}\n\nexport function resolveProviderConfig(config: ProviderConfig): ResolvedProviderConfig | null {\n if ('dash0' in config) {\n return resolveDash0Config(config.dash0);\n } else if ('signoz' in config) {\n return resolveSignozConfig(config.signoz);\n } else if ('newrelic' in config) {\n return resolveNewRelicConfig(config.newrelic);\n } else if ('traceloop' in config) {\n return resolveTraceloopConfig(config.traceloop);\n } else if ('laminar' in config) {\n return resolveLaminarConfig(config.laminar);\n } else if ('custom' in config) {\n return resolveCustomConfig(config.custom);\n } else {\n // TypeScript exhaustiveness check\n const _exhaustive: never = config;\n return _exhaustive;\n }\n}\n\nfunction resolveDash0Config(config: Dash0Config): ResolvedProviderConfig | null {\n if (!config.apiKey) {\n console.error('[OtelExporter] Dash0 configuration requires apiKey. Tracing will be disabled.');\n return null;\n }\n\n if (!config.endpoint) {\n console.error('[OtelExporter] Dash0 configuration requires endpoint. Tracing will be disabled.');\n return null;\n }\n\n // Dash0 uses gRPC by default\n // Endpoint should be like: ingress.us-west-2.aws.dash0.com:4317\n // gRPC endpoints also need /v1/traces suffix\n // Requires: npm install @opentelemetry/exporter-trace-otlp-grpc @grpc/grpc-js\n let endpoint = config.endpoint;\n if (!endpoint.includes('/v1/traces')) {\n endpoint = `${endpoint}/v1/traces`;\n }\n\n const headers: Record<string, string> = {\n authorization: `Bearer ${config.apiKey}`, // lowercase for gRPC metadata\n };\n\n if (config.dataset) {\n headers['dash0-dataset'] = config.dataset; // lowercase for gRPC metadata\n }\n\n return {\n endpoint,\n headers,\n protocol: 'grpc', // Use gRPC for Dash0\n };\n}\n\nfunction resolveSignozConfig(config: SignozConfig): ResolvedProviderConfig | null {\n if (!config.apiKey) {\n console.error('[OtelExporter] SigNoz configuration requires apiKey. Tracing will be disabled.');\n return null;\n }\n\n // SigNoz uses OTLP endpoint with /v1/traces suffix\n const endpoint = config.endpoint || `https://ingest.${config.region || 'us'}.signoz.cloud:443/v1/traces`;\n\n return {\n endpoint,\n headers: {\n 'signoz-ingestion-key': config.apiKey,\n },\n protocol: 'http/protobuf',\n };\n}\n\nfunction resolveNewRelicConfig(config: NewRelicConfig): ResolvedProviderConfig | null {\n if (!config.apiKey) {\n console.error('[OtelExporter] New Relic configuration requires apiKey (license key). Tracing will be disabled.');\n return null;\n }\n\n // New Relic recommends HTTP/protobuf over gRPC\n // New Relic uses OTLP endpoint with /v1/traces suffix\n const endpoint = config.endpoint || 'https://otlp.nr-data.net:443/v1/traces';\n\n return {\n endpoint,\n headers: {\n 'api-key': config.apiKey,\n },\n protocol: 'http/protobuf',\n };\n}\n\nfunction resolveTraceloopConfig(config: TraceloopConfig): ResolvedProviderConfig | null {\n if (!config.apiKey) {\n console.error('[OtelExporter] Traceloop configuration requires apiKey. Tracing will be disabled.');\n return null;\n }\n\n // Traceloop uses OTLP endpoint with /v1/traces suffix\n const endpoint = config.endpoint || 'https://api.traceloop.com/v1/traces';\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${config.apiKey}`,\n };\n\n if (config.destinationId) {\n headers['x-traceloop-destination-id'] = config.destinationId;\n }\n\n return {\n endpoint,\n headers,\n protocol: 'http/json',\n };\n}\n\nfunction resolveLaminarConfig(config: LaminarConfig): ResolvedProviderConfig | null {\n if (!config.apiKey) {\n console.error('[OtelExporter] Laminar configuration requires apiKey. Tracing will be disabled.');\n return null;\n }\n\n // Laminar uses OTLP endpoint with /v1/traces suffix for HTTP\n // They support both gRPC and HTTP, but we'll use HTTP for consistency\n const endpoint = config.endpoint || 'https://api.lmnr.ai/v1/traces';\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${config.apiKey}`,\n };\n\n // Only add team ID header if provided (for backwards compatibility)\n if (config.teamId) {\n headers['x-laminar-team-id'] = config.teamId;\n }\n\n return {\n endpoint,\n headers,\n protocol: 'http/protobuf', // Use HTTP/protobuf instead of gRPC for better compatibility\n };\n}\n\nfunction resolveCustomConfig(config: CustomConfig): ResolvedProviderConfig | null {\n if (!config.endpoint) {\n console.error('[OtelExporter] Custom configuration requires endpoint. Tracing will be disabled.');\n return null;\n }\n\n return {\n endpoint: config.endpoint,\n headers: config.headers || {},\n protocol: config.protocol || 'http/json',\n };\n}\n","/**\n * Custom OpenTelemetry span that preserves Mastra's trace and span IDs\n */\n\nimport type { AnyExportedAISpan } from '@mastra/core/ai-tracing';\nimport { SpanStatusCode, TraceFlags } from '@opentelemetry/api';\nimport type { SpanKind, SpanContext, SpanStatus, Attributes, Link } from '@opentelemetry/api';\nimport type { InstrumentationScope } from '@opentelemetry/core';\nimport type { Resource } from '@opentelemetry/resources';\nimport type { ReadableSpan, TimedEvent } from '@opentelemetry/sdk-trace-base';\n\n/**\n * A custom ReadableSpan implementation that preserves Mastra's IDs\n */\nexport class MastraReadableSpan implements ReadableSpan {\n readonly name: string;\n readonly kind: SpanKind;\n readonly spanContext: () => SpanContext;\n readonly parentSpanContext?: SpanContext;\n readonly parentSpanId?: string;\n readonly startTime: [number, number];\n readonly endTime: [number, number];\n readonly status: SpanStatus;\n readonly attributes: Attributes;\n readonly links: Link[];\n readonly events: TimedEvent[];\n readonly duration: [number, number];\n readonly ended: boolean;\n readonly resource: Resource;\n readonly instrumentationLibrary: InstrumentationScope;\n readonly instrumentationScope: InstrumentationScope;\n readonly droppedAttributesCount: number = 0;\n readonly droppedEventsCount: number = 0;\n readonly droppedLinksCount: number = 0;\n\n constructor(\n aiSpan: AnyExportedAISpan,\n attributes: Attributes,\n kind: SpanKind,\n parentSpanId?: string,\n resource?: Resource,\n instrumentationLibrary?: InstrumentationScope,\n ) {\n this.name = aiSpan.name;\n this.kind = kind;\n this.attributes = attributes;\n this.parentSpanId = parentSpanId;\n this.links = [];\n this.events = [];\n\n // Convert JavaScript Date to hrtime format [seconds, nanoseconds]\n this.startTime = this.dateToHrTime(aiSpan.startTime);\n this.endTime = aiSpan.endTime ? this.dateToHrTime(aiSpan.endTime) : this.startTime;\n this.ended = !!aiSpan.endTime;\n\n // Calculate duration\n if (aiSpan.endTime) {\n const durationMs = aiSpan.endTime.getTime() - aiSpan.startTime.getTime();\n this.duration = [Math.floor(durationMs / 1000), (durationMs % 1000) * 1000000];\n } else {\n this.duration = [0, 0];\n }\n\n // Set status based on error info\n if (aiSpan.errorInfo) {\n this.status = {\n code: SpanStatusCode.ERROR,\n message: aiSpan.errorInfo.message,\n };\n\n // Add error as event\n this.events.push({\n name: 'exception',\n attributes: {\n 'exception.message': aiSpan.errorInfo.message,\n 'exception.type': 'Error',\n ...(aiSpan.errorInfo.details?.stack && {\n 'exception.stacktrace': aiSpan.errorInfo.details.stack as string,\n }),\n },\n time: this.startTime,\n droppedAttributesCount: 0,\n });\n } else if (aiSpan.endTime) {\n this.status = { code: SpanStatusCode.OK };\n } else {\n this.status = { code: SpanStatusCode.UNSET };\n }\n\n // Add instant event if needed\n if (aiSpan.isEvent) {\n this.events.push({\n name: 'instant_event',\n attributes: {},\n time: this.startTime,\n droppedAttributesCount: 0,\n });\n }\n\n // Create span context with Mastra's IDs\n this.spanContext = () => ({\n traceId: aiSpan.traceId,\n spanId: aiSpan.id,\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n });\n\n // Set parent span context if parent span ID is provided\n if (parentSpanId) {\n this.parentSpanContext = {\n traceId: aiSpan.traceId,\n spanId: parentSpanId,\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n };\n }\n\n // Set resource and instrumentation library\n this.resource = resource || ({} as Resource);\n this.instrumentationLibrary = instrumentationLibrary || {\n name: '@mastra/otel',\n version: '1.0.0',\n };\n // instrumentationScope is the same as instrumentationLibrary\n this.instrumentationScope = this.instrumentationLibrary;\n }\n\n /**\n * Convert JavaScript Date to hrtime format\n */\n private dateToHrTime(date: Date): [number, number] {\n const ms = date.getTime();\n const seconds = Math.floor(ms / 1000);\n const nanoseconds = (ms % 1000) * 1000000;\n return [seconds, nanoseconds];\n }\n}\n","/**\n * Convert Mastra AI spans to OpenTelemetry spans\n */\n\nimport type {\n AnyExportedAISpan,\n ModelGenerationAttributes,\n AgentRunAttributes,\n ToolCallAttributes,\n MCPToolCallAttributes,\n WorkflowRunAttributes,\n} from '@mastra/core/ai-tracing';\nimport { AISpanType } from '@mastra/core/ai-tracing';\nimport { SpanKind } from '@opentelemetry/api';\nimport type { Attributes } from '@opentelemetry/api';\nimport type { InstrumentationScope } from '@opentelemetry/core';\nimport type { Resource } from '@opentelemetry/resources';\nimport { MastraReadableSpan } from './mastra-span.js';\n\n// Map Mastra span types to OpenTelemetry span kinds following OTEL conventions\n// Only non-INTERNAL mappings are specified - all others default to SpanKind.INTERNAL\nconst SPAN_KIND_MAPPING: Partial<Record<AISpanType, SpanKind>> = {\n // Model operations are CLIENT spans (calling external AI services)\n [AISpanType.MODEL_GENERATION]: SpanKind.CLIENT,\n [AISpanType.MODEL_CHUNK]: SpanKind.CLIENT,\n\n // MCP tool calls are CLIENT (external service calls)\n [AISpanType.MCP_TOOL_CALL]: SpanKind.CLIENT,\n\n // Root spans for agent/workflow are SERVER (entry points)\n [AISpanType.AGENT_RUN]: SpanKind.SERVER,\n [AISpanType.WORKFLOW_RUN]: SpanKind.SERVER,\n};\n\nexport class SpanConverter {\n private resource?: Resource;\n private instrumentationLibrary: InstrumentationScope;\n\n constructor(resource?: Resource) {\n this.resource = resource;\n this.instrumentationLibrary = {\n name: '@mastra/otel',\n version: '1.0.0',\n };\n }\n\n /**\n * Convert a Mastra AI span to an OpenTelemetry ReadableSpan\n * This preserves Mastra's trace and span IDs\n */\n convertSpan(aiSpan: AnyExportedAISpan): MastraReadableSpan {\n const spanKind = this.getSpanKind(aiSpan);\n const attributes = this.buildAttributes(aiSpan);\n const spanName = this.buildSpanName(aiSpan);\n\n // Create a new span with OTEL-compliant naming\n const otelSpan = { ...aiSpan, name: spanName };\n\n return new MastraReadableSpan(\n otelSpan,\n attributes,\n spanKind,\n aiSpan.parentSpanId, // Use the parentSpanId from the Mastra span directly\n this.resource,\n this.instrumentationLibrary,\n );\n }\n\n /**\n * Get the appropriate SpanKind based on span type and context\n */\n private getSpanKind(aiSpan: AnyExportedAISpan): SpanKind {\n // Root spans should be SERVER\n if (aiSpan.isRootSpan) {\n if (aiSpan.type === AISpanType.AGENT_RUN || aiSpan.type === AISpanType.WORKFLOW_RUN) {\n return SpanKind.SERVER;\n }\n }\n return SPAN_KIND_MAPPING[aiSpan.type] || SpanKind.INTERNAL;\n }\n\n /**\n * Build OTEL-compliant span name based on span type and attributes\n */\n private buildSpanName(aiSpan: AnyExportedAISpan): string {\n switch (aiSpan.type) {\n case AISpanType.MODEL_GENERATION: {\n const attrs = aiSpan.attributes as ModelGenerationAttributes;\n const operation = attrs?.resultType === 'tool_selection' ? 'tool_selection' : 'chat';\n const model = attrs?.model || 'unknown';\n return `${operation} ${model}`;\n }\n\n case AISpanType.TOOL_CALL:\n case AISpanType.MCP_TOOL_CALL: {\n const toolAttrs = aiSpan.attributes as ToolCallAttributes | MCPToolCallAttributes;\n const toolName = toolAttrs?.toolId || 'unknown';\n return `tool.execute ${toolName}`;\n }\n\n case AISpanType.AGENT_RUN: {\n const agentAttrs = aiSpan.attributes as AgentRunAttributes;\n const agentId = agentAttrs?.agentId || 'unknown';\n return `agent.${agentId}`;\n }\n\n case AISpanType.WORKFLOW_RUN: {\n const workflowAttrs = aiSpan.attributes as WorkflowRunAttributes;\n const workflowId = workflowAttrs?.workflowId || 'unknown';\n return `workflow.${workflowId}`;\n }\n\n case AISpanType.WORKFLOW_STEP:\n // Keep the original name as it's likely descriptive\n return aiSpan.name;\n\n default:\n // For other types, use a simplified version of the original name\n return aiSpan.name;\n }\n }\n\n /**\n * Build OpenTelemetry attributes from Mastra AI span\n * Following OTEL Semantic Conventions for GenAI\n */\n private buildAttributes(aiSpan: AnyExportedAISpan): Attributes {\n const attributes: Attributes = {};\n\n // Add gen_ai.operation.name based on span type\n attributes['gen_ai.operation.name'] = this.getOperationName(aiSpan);\n\n // Add span kind semantic attribute\n attributes['span.kind'] = this.getSpanKindString(aiSpan);\n\n // Add span type for better visibility\n attributes['mastra.span.type'] = aiSpan.type;\n\n // Add trace and span IDs for debugging\n attributes['mastra.trace_id'] = aiSpan.traceId;\n attributes['mastra.span_id'] = aiSpan.id;\n if (aiSpan.parentSpanId) {\n attributes['mastra.parent_span_id'] = aiSpan.parentSpanId;\n }\n\n // Handle input/output based on span type\n // Always add input/output for Laminar compatibility\n if (aiSpan.input !== undefined) {\n const inputStr = typeof aiSpan.input === 'string' ? aiSpan.input : JSON.stringify(aiSpan.input);\n // Add generic input for all providers\n attributes['input'] = inputStr;\n\n // Add specific attributes based on span type\n if (aiSpan.type === AISpanType.MODEL_GENERATION) {\n attributes['gen_ai.prompt'] = inputStr;\n } else if (aiSpan.type === AISpanType.TOOL_CALL || aiSpan.type === AISpanType.MCP_TOOL_CALL) {\n attributes['gen_ai.tool.input'] = inputStr;\n }\n }\n\n if (aiSpan.output !== undefined) {\n const outputStr = typeof aiSpan.output === 'string' ? aiSpan.output : JSON.stringify(aiSpan.output);\n // Add generic output for all providers\n attributes['output'] = outputStr;\n\n // Add specific attributes based on span type\n if (aiSpan.type === AISpanType.MODEL_GENERATION) {\n attributes['gen_ai.completion'] = outputStr;\n } else if (aiSpan.type === AISpanType.TOOL_CALL || aiSpan.type === AISpanType.MCP_TOOL_CALL) {\n attributes['gen_ai.tool.output'] = outputStr;\n }\n }\n\n // Add model-specific attributes using OTEL semantic conventions\n if (aiSpan.type === AISpanType.MODEL_GENERATION && aiSpan.attributes) {\n const modelAttrs = aiSpan.attributes as ModelGenerationAttributes;\n\n // Model and provider\n if (modelAttrs.model) {\n attributes['gen_ai.request.model'] = modelAttrs.model;\n }\n\n if (modelAttrs.provider) {\n attributes['gen_ai.system'] = modelAttrs.provider;\n }\n\n // Token usage - use OTEL standard naming\n if (modelAttrs.usage) {\n // Handle both v5 format (inputTokens/outputTokens) and legacy format (promptTokens/completionTokens)\n const inputTokens = modelAttrs.usage.inputTokens ?? modelAttrs.usage.promptTokens;\n const outputTokens = modelAttrs.usage.outputTokens ?? modelAttrs.usage.completionTokens;\n\n if (inputTokens !== undefined) {\n attributes['gen_ai.usage.input_tokens'] = inputTokens;\n }\n if (outputTokens !== undefined) {\n attributes['gen_ai.usage.output_tokens'] = outputTokens;\n }\n if (modelAttrs.usage.totalTokens !== undefined) {\n attributes['gen_ai.usage.total_tokens'] = modelAttrs.usage.totalTokens;\n }\n\n // Add other token metrics if present\n if (modelAttrs.usage.reasoningTokens !== undefined) {\n attributes['gen_ai.usage.reasoning_tokens'] = modelAttrs.usage.reasoningTokens;\n }\n if (modelAttrs.usage.cachedInputTokens !== undefined) {\n attributes['gen_ai.usage.cached_input_tokens'] = modelAttrs.usage.cachedInputTokens;\n }\n }\n\n // Parameters using OTEL conventions\n if (modelAttrs.parameters) {\n if (modelAttrs.parameters.temperature !== undefined) {\n attributes['gen_ai.request.temperature'] = modelAttrs.parameters.temperature;\n }\n if (modelAttrs.parameters.maxOutputTokens !== undefined) {\n attributes['gen_ai.request.max_tokens'] = modelAttrs.parameters.maxOutputTokens;\n }\n if (modelAttrs.parameters.topP !== undefined) {\n attributes['gen_ai.request.top_p'] = modelAttrs.parameters.topP;\n }\n if (modelAttrs.parameters.topK !== undefined) {\n attributes['gen_ai.request.top_k'] = modelAttrs.parameters.topK;\n }\n if (modelAttrs.parameters.presencePenalty !== undefined) {\n attributes['gen_ai.request.presence_penalty'] = modelAttrs.parameters.presencePenalty;\n }\n if (modelAttrs.parameters.frequencyPenalty !== undefined) {\n attributes['gen_ai.request.frequency_penalty'] = modelAttrs.parameters.frequencyPenalty;\n }\n if (modelAttrs.parameters.stopSequences) {\n attributes['gen_ai.request.stop_sequences'] = JSON.stringify(modelAttrs.parameters.stopSequences);\n }\n }\n\n // Response attributes\n if (modelAttrs.finishReason) {\n attributes['gen_ai.response.finish_reasons'] = modelAttrs.finishReason;\n }\n }\n\n // Add tool-specific attributes using OTEL conventions\n if ((aiSpan.type === AISpanType.TOOL_CALL || aiSpan.type === AISpanType.MCP_TOOL_CALL) && aiSpan.attributes) {\n const toolAttrs = aiSpan.attributes as ToolCallAttributes | MCPToolCallAttributes;\n\n // Tool identification\n if (toolAttrs.toolId) {\n attributes['gen_ai.tool.name'] = toolAttrs.toolId;\n }\n\n // MCP-specific attributes\n if (aiSpan.type === AISpanType.MCP_TOOL_CALL) {\n const mcpAttrs = toolAttrs as MCPToolCallAttributes;\n if (mcpAttrs.mcpServer) {\n attributes['mcp.server'] = mcpAttrs.mcpServer;\n }\n if (mcpAttrs.serverVersion) {\n attributes['mcp.server.version'] = mcpAttrs.serverVersion;\n }\n } else {\n if ((toolAttrs as ToolCallAttributes).toolDescription) {\n attributes['gen_ai.tool.description'] = (toolAttrs as ToolCallAttributes).toolDescription;\n }\n }\n\n // Tool execution result\n if (toolAttrs.success !== undefined) {\n attributes['gen_ai.tool.success'] = toolAttrs.success;\n }\n }\n\n // Add agent-specific attributes\n if (aiSpan.type === AISpanType.AGENT_RUN && aiSpan.attributes) {\n const agentAttrs = aiSpan.attributes as AgentRunAttributes;\n if (agentAttrs.agentId) {\n attributes['agent.id'] = agentAttrs.agentId;\n attributes['gen_ai.agent.id'] = agentAttrs.agentId;\n }\n if (agentAttrs.maxSteps) {\n attributes['agent.max_steps'] = agentAttrs.maxSteps;\n }\n if (agentAttrs.availableTools) {\n attributes['agent.available_tools'] = JSON.stringify(agentAttrs.availableTools);\n }\n }\n\n // Add workflow-specific attributes\n if (aiSpan.type === AISpanType.WORKFLOW_RUN && aiSpan.attributes) {\n const workflowAttrs = aiSpan.attributes as WorkflowRunAttributes;\n if (workflowAttrs.workflowId) {\n attributes['workflow.id'] = workflowAttrs.workflowId;\n }\n if (workflowAttrs.status) {\n attributes['workflow.status'] = workflowAttrs.status;\n }\n }\n\n // Add error information if present\n if (aiSpan.errorInfo) {\n attributes['error'] = true;\n attributes['error.type'] = aiSpan.errorInfo.id || 'unknown';\n attributes['error.message'] = aiSpan.errorInfo.message;\n if (aiSpan.errorInfo.domain) {\n attributes['error.domain'] = aiSpan.errorInfo.domain;\n }\n if (aiSpan.errorInfo.category) {\n attributes['error.category'] = aiSpan.errorInfo.category;\n }\n }\n\n // Add metadata as custom attributes with proper typing\n if (aiSpan.metadata) {\n Object.entries(aiSpan.metadata).forEach(([key, value]) => {\n // Skip if attribute already exists\n if (!attributes[key]) {\n // Ensure value is a valid OTEL attribute type\n if (value === null || value === undefined) {\n return;\n }\n if (typeof value === 'object') {\n attributes[key] = JSON.stringify(value);\n } else {\n attributes[key] = value;\n }\n }\n });\n }\n\n // Add timing information\n if (aiSpan.startTime) {\n attributes['mastra.start_time'] = aiSpan.startTime.toISOString();\n }\n if (aiSpan.endTime) {\n attributes['mastra.end_time'] = aiSpan.endTime.toISOString();\n const duration = aiSpan.endTime.getTime() - aiSpan.startTime.getTime();\n attributes['mastra.duration_ms'] = duration;\n }\n\n return attributes;\n }\n\n /**\n * Get the operation name based on span type for gen_ai.operation.name\n */\n private getOperationName(aiSpan: AnyExportedAISpan): string {\n switch (aiSpan.type) {\n case AISpanType.MODEL_GENERATION: {\n const attrs = aiSpan.attributes as ModelGenerationAttributes;\n return attrs?.resultType === 'tool_selection' ? 'tool_selection' : 'chat';\n }\n case AISpanType.TOOL_CALL:\n case AISpanType.MCP_TOOL_CALL:\n return 'tool.execute';\n case AISpanType.AGENT_RUN:\n return 'agent.run';\n case AISpanType.WORKFLOW_RUN:\n return 'workflow.run';\n default:\n return aiSpan.type.replace(/_/g, '.');\n }\n }\n\n /**\n * Get span kind as string for attribute\n */\n private getSpanKindString(aiSpan: AnyExportedAISpan): string {\n const kind = this.getSpanKind(aiSpan);\n switch (kind) {\n case SpanKind.SERVER:\n return 'server';\n case SpanKind.CLIENT:\n return 'client';\n case SpanKind.INTERNAL:\n return 'internal';\n case SpanKind.PRODUCER:\n return 'producer';\n case SpanKind.CONSUMER:\n return 'consumer';\n default:\n return 'internal';\n }\n }\n}\n","/**\n * OpenTelemetry AI Tracing Exporter for Mastra\n */\n\nimport { AITracingEventType } from '@mastra/core/ai-tracing';\nimport type { AITracingExporter, AITracingEvent, AnyExportedAISpan, TracingConfig } from '@mastra/core/ai-tracing';\nimport { ConsoleLogger } from '@mastra/core/logger';\nimport { diag, DiagConsoleLogger, DiagLogLevel } from '@opentelemetry/api';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport type { SpanExporter } from '@opentelemetry/sdk-trace-base';\nimport {\n ATTR_SERVICE_NAME,\n ATTR_SERVICE_VERSION,\n ATTR_TELEMETRY_SDK_LANGUAGE,\n ATTR_TELEMETRY_SDK_NAME,\n ATTR_TELEMETRY_SDK_VERSION,\n} from '@opentelemetry/semantic-conventions';\n\nimport { loadExporter } from './loadExporter.js';\nimport { resolveProviderConfig } from './provider-configs.js';\nimport { SpanConverter } from './span-converter.js';\nimport type { OtelExporterConfig } from './types.js';\n\nexport class OtelExporter implements AITracingExporter {\n private config: OtelExporterConfig;\n private tracingConfig?: TracingConfig;\n private spanConverter: SpanConverter;\n private processor?: BatchSpanProcessor;\n private exporter?: SpanExporter;\n private isSetup: boolean = false;\n private isDisabled: boolean = false;\n private logger: ConsoleLogger;\n\n name = 'opentelemetry';\n\n constructor(config: OtelExporterConfig) {\n this.config = config;\n this.spanConverter = new SpanConverter();\n this.logger = new ConsoleLogger({ level: config.logLevel ?? 'warn' });\n\n // Set up OpenTelemetry diagnostics if debug mode\n if (config.logLevel === 'debug') {\n diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.DEBUG);\n }\n }\n\n /**\n * Initialize with tracing configuration\n */\n init(config: TracingConfig): void {\n this.tracingConfig = config;\n }\n\n private async setupExporter() {\n // already setup or exporter already set\n if (this.isSetup || this.exporter) return;\n\n // Provider configuration is required\n if (!this.config.provider) {\n this.logger.error(\n '[OtelExporter] Provider configuration is required. Use the \"custom\" provider for generic endpoints.',\n );\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n // Resolve provider configuration\n const resolved = resolveProviderConfig(this.config.provider);\n if (!resolved) {\n // Configuration validation failed, disable tracing\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n // user provided an instantiated SpanExporter, use it\n if (this.config.exporter) {\n this.exporter = this.config.exporter;\n return;\n }\n\n const endpoint = resolved.endpoint;\n const headers = resolved.headers;\n const protocol = resolved.protocol;\n\n // Load and create the appropriate exporter based on protocol\n const providerName = Object.keys(this.config.provider)[0];\n const ExporterClass = await loadExporter(protocol, providerName);\n\n if (!ExporterClass) {\n // Exporter not available, disable tracing\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n try {\n if (protocol === 'zipkin') {\n this.exporter = new ExporterClass({\n url: endpoint,\n headers,\n });\n } else if (protocol === 'grpc') {\n // gRPC uses Metadata object instead of headers\n // Dynamically import @grpc/grpc-js to create metadata\n let metadata: any;\n try {\n // @ts-ignore - Dynamic import for optional dependency\n const grpcModule = await import('@grpc/grpc-js');\n metadata = new grpcModule.Metadata();\n Object.entries(headers).forEach(([key, value]) => {\n metadata.set(key, value);\n });\n } catch (grpcError) {\n this.logger.error(\n `[OtelExporter] Failed to load gRPC metadata. Install required packages:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-grpc @grpc/grpc-js\\n`,\n grpcError,\n );\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n this.exporter = new ExporterClass({\n url: endpoint,\n metadata,\n timeoutMillis: this.config.timeout,\n });\n } else {\n // HTTP/JSON and HTTP/Protobuf use headers\n this.exporter = new ExporterClass({\n url: endpoint,\n headers,\n timeoutMillis: this.config.timeout,\n });\n }\n } catch (error) {\n this.logger.error(`[OtelExporter] Failed to create exporter:`, error);\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n }\n\n private async setupProcessor() {\n if (this.processor || this.isSetup) return;\n\n // Create resource with service name from TracingConfig\n let resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: this.tracingConfig?.serviceName || 'mastra-service',\n [ATTR_SERVICE_VERSION]: '1.0.0',\n // Add telemetry SDK information\n [ATTR_TELEMETRY_SDK_NAME]: '@mastra/otel-exporter',\n [ATTR_TELEMETRY_SDK_VERSION]: '1.0.0',\n [ATTR_TELEMETRY_SDK_LANGUAGE]: 'nodejs',\n });\n\n if (this.config.resourceAttributes) {\n resource = resource.merge(\n // Duplicate attributes from config will override defaults above\n resourceFromAttributes(this.config.resourceAttributes),\n );\n }\n\n // Store the resource in the genai span converter\n this.spanConverter = new SpanConverter(resource);\n\n // Always use BatchSpanProcessor for production\n // It queues spans and exports them in batches for better performance\n this.processor = new BatchSpanProcessor(this.exporter!, {\n maxExportBatchSize: this.config.batchSize || 512, // Default batch size\n maxQueueSize: 2048, // Maximum spans to queue\n scheduledDelayMillis: 5000, // Export every 5 seconds\n exportTimeoutMillis: this.config.timeout || 30000, // Export timeout\n });\n\n this.logger.debug(\n `[OtelExporter] Using BatchSpanProcessor (batch size: ${this.config.batchSize || 512}, delay: 5s)`,\n );\n }\n\n private async setup() {\n if (this.isSetup) return;\n await this.setupExporter();\n await this.setupProcessor();\n this.isSetup = true;\n }\n\n async exportEvent(event: AITracingEvent): Promise<void> {\n // Skip if disabled due to configuration errors\n if (this.isDisabled) {\n return;\n }\n\n // Only process SPAN_ENDED events for OTEL\n // OTEL expects complete spans with start and end times\n if (event.type !== AITracingEventType.SPAN_ENDED) {\n return;\n }\n\n const span = event.exportedSpan;\n await this.exportSpan(span);\n }\n\n private async exportSpan(span: AnyExportedAISpan): Promise<void> {\n // Ensure exporter is set up\n if (!this.isSetup) {\n await this.setup();\n }\n\n // Skip if disabled\n if (this.isDisabled || !this.processor) {\n return;\n }\n\n try {\n // Convert the span to OTEL format\n const readableSpan = this.spanConverter.convertSpan(span);\n\n // Export the span immediately through the processor\n // The processor will handle batching if configured\n await new Promise<void>(resolve => {\n this.processor!.onEnd(readableSpan);\n resolve();\n });\n\n this.logger.debug(\n `[OtelExporter] Exported span ${span.id} (trace: ${span.traceId}, parent: ${span.parentSpanId || 'none'}, type: ${span.type})`,\n );\n } catch (error) {\n this.logger.error(`[OtelExporter] Failed to export span ${span.id}:`, error);\n }\n }\n\n async shutdown(): Promise<void> {\n // Shutdown the processor to flush any remaining spans\n if (this.processor) {\n await this.processor.shutdown();\n }\n }\n}\n"]}
package/dist/index.js CHANGED
@@ -207,6 +207,7 @@ var MastraReadableSpan = class {
207
207
  name;
208
208
  kind;
209
209
  spanContext;
210
+ parentSpanContext;
210
211
  parentSpanId;
211
212
  startTime;
212
213
  endTime;
@@ -274,6 +275,14 @@ var MastraReadableSpan = class {
274
275
  traceFlags: TraceFlags.SAMPLED,
275
276
  isRemote: false
276
277
  });
278
+ if (parentSpanId) {
279
+ this.parentSpanContext = {
280
+ traceId: aiSpan.traceId,
281
+ spanId: parentSpanId,
282
+ traceFlags: TraceFlags.SAMPLED,
283
+ isRemote: false
284
+ };
285
+ }
277
286
  this.resource = resource || {};
278
287
  this.instrumentationLibrary = instrumentationLibrary || {
279
288
  name: "@mastra/otel",
@@ -294,9 +303,9 @@ var MastraReadableSpan = class {
294
303
 
295
304
  // src/span-converter.ts
296
305
  var SPAN_KIND_MAPPING = {
297
- // LLM operations are CLIENT spans (calling external AI services)
298
- [AISpanType.LLM_GENERATION]: SpanKind.CLIENT,
299
- [AISpanType.LLM_CHUNK]: SpanKind.CLIENT,
306
+ // Model operations are CLIENT spans (calling external AI services)
307
+ [AISpanType.MODEL_GENERATION]: SpanKind.CLIENT,
308
+ [AISpanType.MODEL_CHUNK]: SpanKind.CLIENT,
300
309
  // MCP tool calls are CLIENT (external service calls)
301
310
  [AISpanType.MCP_TOOL_CALL]: SpanKind.CLIENT,
302
311
  // Root spans for agent/workflow are SERVER (entry points)
@@ -348,7 +357,7 @@ var SpanConverter = class {
348
357
  */
349
358
  buildSpanName(aiSpan) {
350
359
  switch (aiSpan.type) {
351
- case AISpanType.LLM_GENERATION: {
360
+ case AISpanType.MODEL_GENERATION: {
352
361
  const attrs = aiSpan.attributes;
353
362
  const operation = attrs?.resultType === "tool_selection" ? "tool_selection" : "chat";
354
363
  const model = attrs?.model || "unknown";
@@ -393,7 +402,7 @@ var SpanConverter = class {
393
402
  if (aiSpan.input !== void 0) {
394
403
  const inputStr = typeof aiSpan.input === "string" ? aiSpan.input : JSON.stringify(aiSpan.input);
395
404
  attributes["input"] = inputStr;
396
- if (aiSpan.type === AISpanType.LLM_GENERATION) {
405
+ if (aiSpan.type === AISpanType.MODEL_GENERATION) {
397
406
  attributes["gen_ai.prompt"] = inputStr;
398
407
  } else if (aiSpan.type === AISpanType.TOOL_CALL || aiSpan.type === AISpanType.MCP_TOOL_CALL) {
399
408
  attributes["gen_ai.tool.input"] = inputStr;
@@ -402,64 +411,64 @@ var SpanConverter = class {
402
411
  if (aiSpan.output !== void 0) {
403
412
  const outputStr = typeof aiSpan.output === "string" ? aiSpan.output : JSON.stringify(aiSpan.output);
404
413
  attributes["output"] = outputStr;
405
- if (aiSpan.type === AISpanType.LLM_GENERATION) {
414
+ if (aiSpan.type === AISpanType.MODEL_GENERATION) {
406
415
  attributes["gen_ai.completion"] = outputStr;
407
416
  } else if (aiSpan.type === AISpanType.TOOL_CALL || aiSpan.type === AISpanType.MCP_TOOL_CALL) {
408
417
  attributes["gen_ai.tool.output"] = outputStr;
409
418
  }
410
419
  }
411
- if (aiSpan.type === AISpanType.LLM_GENERATION && aiSpan.attributes) {
412
- const llmAttrs = aiSpan.attributes;
413
- if (llmAttrs.model) {
414
- attributes["gen_ai.request.model"] = llmAttrs.model;
420
+ if (aiSpan.type === AISpanType.MODEL_GENERATION && aiSpan.attributes) {
421
+ const modelAttrs = aiSpan.attributes;
422
+ if (modelAttrs.model) {
423
+ attributes["gen_ai.request.model"] = modelAttrs.model;
415
424
  }
416
- if (llmAttrs.provider) {
417
- attributes["gen_ai.system"] = llmAttrs.provider;
425
+ if (modelAttrs.provider) {
426
+ attributes["gen_ai.system"] = modelAttrs.provider;
418
427
  }
419
- if (llmAttrs.usage) {
420
- const inputTokens = llmAttrs.usage.inputTokens ?? llmAttrs.usage.promptTokens;
421
- const outputTokens = llmAttrs.usage.outputTokens ?? llmAttrs.usage.completionTokens;
428
+ if (modelAttrs.usage) {
429
+ const inputTokens = modelAttrs.usage.inputTokens ?? modelAttrs.usage.promptTokens;
430
+ const outputTokens = modelAttrs.usage.outputTokens ?? modelAttrs.usage.completionTokens;
422
431
  if (inputTokens !== void 0) {
423
432
  attributes["gen_ai.usage.input_tokens"] = inputTokens;
424
433
  }
425
434
  if (outputTokens !== void 0) {
426
435
  attributes["gen_ai.usage.output_tokens"] = outputTokens;
427
436
  }
428
- if (llmAttrs.usage.totalTokens !== void 0) {
429
- attributes["gen_ai.usage.total_tokens"] = llmAttrs.usage.totalTokens;
437
+ if (modelAttrs.usage.totalTokens !== void 0) {
438
+ attributes["gen_ai.usage.total_tokens"] = modelAttrs.usage.totalTokens;
430
439
  }
431
- if (llmAttrs.usage.reasoningTokens !== void 0) {
432
- attributes["gen_ai.usage.reasoning_tokens"] = llmAttrs.usage.reasoningTokens;
440
+ if (modelAttrs.usage.reasoningTokens !== void 0) {
441
+ attributes["gen_ai.usage.reasoning_tokens"] = modelAttrs.usage.reasoningTokens;
433
442
  }
434
- if (llmAttrs.usage.cachedInputTokens !== void 0) {
435
- attributes["gen_ai.usage.cached_input_tokens"] = llmAttrs.usage.cachedInputTokens;
443
+ if (modelAttrs.usage.cachedInputTokens !== void 0) {
444
+ attributes["gen_ai.usage.cached_input_tokens"] = modelAttrs.usage.cachedInputTokens;
436
445
  }
437
446
  }
438
- if (llmAttrs.parameters) {
439
- if (llmAttrs.parameters.temperature !== void 0) {
440
- attributes["gen_ai.request.temperature"] = llmAttrs.parameters.temperature;
447
+ if (modelAttrs.parameters) {
448
+ if (modelAttrs.parameters.temperature !== void 0) {
449
+ attributes["gen_ai.request.temperature"] = modelAttrs.parameters.temperature;
441
450
  }
442
- if (llmAttrs.parameters.maxOutputTokens !== void 0) {
443
- attributes["gen_ai.request.max_tokens"] = llmAttrs.parameters.maxOutputTokens;
451
+ if (modelAttrs.parameters.maxOutputTokens !== void 0) {
452
+ attributes["gen_ai.request.max_tokens"] = modelAttrs.parameters.maxOutputTokens;
444
453
  }
445
- if (llmAttrs.parameters.topP !== void 0) {
446
- attributes["gen_ai.request.top_p"] = llmAttrs.parameters.topP;
454
+ if (modelAttrs.parameters.topP !== void 0) {
455
+ attributes["gen_ai.request.top_p"] = modelAttrs.parameters.topP;
447
456
  }
448
- if (llmAttrs.parameters.topK !== void 0) {
449
- attributes["gen_ai.request.top_k"] = llmAttrs.parameters.topK;
457
+ if (modelAttrs.parameters.topK !== void 0) {
458
+ attributes["gen_ai.request.top_k"] = modelAttrs.parameters.topK;
450
459
  }
451
- if (llmAttrs.parameters.presencePenalty !== void 0) {
452
- attributes["gen_ai.request.presence_penalty"] = llmAttrs.parameters.presencePenalty;
460
+ if (modelAttrs.parameters.presencePenalty !== void 0) {
461
+ attributes["gen_ai.request.presence_penalty"] = modelAttrs.parameters.presencePenalty;
453
462
  }
454
- if (llmAttrs.parameters.frequencyPenalty !== void 0) {
455
- attributes["gen_ai.request.frequency_penalty"] = llmAttrs.parameters.frequencyPenalty;
463
+ if (modelAttrs.parameters.frequencyPenalty !== void 0) {
464
+ attributes["gen_ai.request.frequency_penalty"] = modelAttrs.parameters.frequencyPenalty;
456
465
  }
457
- if (llmAttrs.parameters.stopSequences) {
458
- attributes["gen_ai.request.stop_sequences"] = JSON.stringify(llmAttrs.parameters.stopSequences);
466
+ if (modelAttrs.parameters.stopSequences) {
467
+ attributes["gen_ai.request.stop_sequences"] = JSON.stringify(modelAttrs.parameters.stopSequences);
459
468
  }
460
469
  }
461
- if (llmAttrs.finishReason) {
462
- attributes["gen_ai.response.finish_reasons"] = llmAttrs.finishReason;
470
+ if (modelAttrs.finishReason) {
471
+ attributes["gen_ai.response.finish_reasons"] = modelAttrs.finishReason;
463
472
  }
464
473
  }
465
474
  if ((aiSpan.type === AISpanType.TOOL_CALL || aiSpan.type === AISpanType.MCP_TOOL_CALL) && aiSpan.attributes) {
@@ -488,6 +497,7 @@ var SpanConverter = class {
488
497
  const agentAttrs = aiSpan.attributes;
489
498
  if (agentAttrs.agentId) {
490
499
  attributes["agent.id"] = agentAttrs.agentId;
500
+ attributes["gen_ai.agent.id"] = agentAttrs.agentId;
491
501
  }
492
502
  if (agentAttrs.maxSteps) {
493
503
  attributes["agent.max_steps"] = agentAttrs.maxSteps;
@@ -545,7 +555,7 @@ var SpanConverter = class {
545
555
  */
546
556
  getOperationName(aiSpan) {
547
557
  switch (aiSpan.type) {
548
- case AISpanType.LLM_GENERATION: {
558
+ case AISpanType.MODEL_GENERATION: {
549
559
  const attrs = aiSpan.attributes;
550
560
  return attrs?.resultType === "tool_selection" ? "tool_selection" : "chat";
551
561
  }
@@ -608,7 +618,7 @@ var OtelExporter = class {
608
618
  this.tracingConfig = config;
609
619
  }
610
620
  async setupExporter() {
611
- if (this.isSetup) return;
621
+ if (this.isSetup || this.exporter) return;
612
622
  if (!this.config.provider) {
613
623
  this.logger.error(
614
624
  '[OtelExporter] Provider configuration is required. Use the "custom" provider for generic endpoints.'
@@ -623,6 +633,10 @@ var OtelExporter = class {
623
633
  this.isSetup = true;
624
634
  return;
625
635
  }
636
+ if (this.config.exporter) {
637
+ this.exporter = this.config.exporter;
638
+ return;
639
+ }
626
640
  const endpoint = resolved.endpoint;
627
641
  const headers = resolved.headers;
628
642
  const protocol = resolved.protocol;
@@ -676,6 +690,9 @@ var OtelExporter = class {
676
690
  this.isSetup = true;
677
691
  return;
678
692
  }
693
+ }
694
+ async setupProcessor() {
695
+ if (this.processor || this.isSetup) return;
679
696
  let resource = resourceFromAttributes({
680
697
  [ATTR_SERVICE_NAME]: this.tracingConfig?.serviceName || "mastra-service",
681
698
  [ATTR_SERVICE_VERSION]: "1.0.0",
@@ -704,6 +721,11 @@ var OtelExporter = class {
704
721
  this.logger.debug(
705
722
  `[OtelExporter] Using BatchSpanProcessor (batch size: ${this.config.batchSize || 512}, delay: 5s)`
706
723
  );
724
+ }
725
+ async setup() {
726
+ if (this.isSetup) return;
727
+ await this.setupExporter();
728
+ await this.setupProcessor();
707
729
  this.isSetup = true;
708
730
  }
709
731
  async exportEvent(event) {
@@ -718,7 +740,7 @@ var OtelExporter = class {
718
740
  }
719
741
  async exportSpan(span) {
720
742
  if (!this.isSetup) {
721
- await this.setupExporter();
743
+ await this.setup();
722
744
  }
723
745
  if (this.isDisabled || !this.processor) {
724
746
  return;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/loadExporter.ts","../src/provider-configs.ts","../src/mastra-span.ts","../src/span-converter.ts","../src/ai-tracing.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Dynamic loader for optional OtelExporters\n */\n\nimport type { ExportProtocol } from './types.js';\n\n// Dynamic imports for optional dependencies\nlet OTLPHttpExporter: any;\nlet OTLPGrpcExporter: any;\nlet OTLPProtoExporter: any;\nlet ZipkinExporter: any;\n\nexport async function loadExporter(protocol: ExportProtocol, provider?: string): Promise<any> {\n switch (protocol) {\n case 'zipkin':\n if (!ZipkinExporter) {\n try {\n const module = await import('@opentelemetry/exporter-zipkin');\n ZipkinExporter = module.ZipkinExporter;\n } catch {\n console.error(\n `[OtelExporter] Zipkin exporter is not installed.\\n` +\n `To use Zipkin export, install the required package:\\n` +\n ` npm install @opentelemetry/exporter-zipkin`,\n );\n return null;\n }\n }\n return ZipkinExporter;\n\n case 'grpc':\n if (!OTLPGrpcExporter) {\n try {\n const module = await import('@opentelemetry/exporter-trace-otlp-grpc');\n OTLPGrpcExporter = module.OTLPTraceExporter;\n } catch {\n const providerInfo = provider ? ` (required for ${provider})` : '';\n console.error(\n `[OtelExporter] gRPC exporter is not installed${providerInfo}.\\n` +\n `To use gRPC export, install the required packages:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-grpc @grpc/grpc-js`,\n );\n return null;\n }\n }\n return OTLPGrpcExporter;\n\n case 'http/protobuf':\n if (!OTLPProtoExporter) {\n try {\n const module = await import('@opentelemetry/exporter-trace-otlp-proto');\n OTLPProtoExporter = module.OTLPTraceExporter;\n } catch {\n const providerInfo = provider ? ` (required for ${provider})` : '';\n console.error(\n `[OtelExporter] HTTP/Protobuf exporter is not installed${providerInfo}.\\n` +\n `To use HTTP/Protobuf export, install the required package:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-proto`,\n );\n return null;\n }\n }\n return OTLPProtoExporter;\n\n case 'http/json':\n default:\n if (!OTLPHttpExporter) {\n try {\n const module = await import('@opentelemetry/exporter-trace-otlp-http');\n OTLPHttpExporter = module.OTLPTraceExporter;\n } catch {\n const providerInfo = provider ? ` (required for ${provider})` : '';\n console.error(\n `[OtelExporter] HTTP/JSON exporter is not installed${providerInfo}.\\n` +\n `To use HTTP/JSON export, install the required package:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-http`,\n );\n return null;\n }\n }\n return OTLPHttpExporter;\n }\n}\n","/**\n * Provider-specific configurations for OtelExporters\n */\n\nimport type {\n ProviderConfig,\n ExportProtocol,\n Dash0Config,\n SignozConfig,\n NewRelicConfig,\n TraceloopConfig,\n LaminarConfig,\n CustomConfig,\n} from './types.js';\n\nexport interface ResolvedProviderConfig {\n endpoint: string;\n headers: Record<string, string>;\n protocol: ExportProtocol;\n}\n\nexport function resolveProviderConfig(config: ProviderConfig): ResolvedProviderConfig | null {\n if ('dash0' in config) {\n return resolveDash0Config(config.dash0);\n } else if ('signoz' in config) {\n return resolveSignozConfig(config.signoz);\n } else if ('newrelic' in config) {\n return resolveNewRelicConfig(config.newrelic);\n } else if ('traceloop' in config) {\n return resolveTraceloopConfig(config.traceloop);\n } else if ('laminar' in config) {\n return resolveLaminarConfig(config.laminar);\n } else if ('custom' in config) {\n return resolveCustomConfig(config.custom);\n } else {\n // TypeScript exhaustiveness check\n const _exhaustive: never = config;\n return _exhaustive;\n }\n}\n\nfunction resolveDash0Config(config: Dash0Config): ResolvedProviderConfig | null {\n if (!config.apiKey) {\n console.error('[OtelExporter] Dash0 configuration requires apiKey. Tracing will be disabled.');\n return null;\n }\n\n if (!config.endpoint) {\n console.error('[OtelExporter] Dash0 configuration requires endpoint. Tracing will be disabled.');\n return null;\n }\n\n // Dash0 uses gRPC by default\n // Endpoint should be like: ingress.us-west-2.aws.dash0.com:4317\n // gRPC endpoints also need /v1/traces suffix\n // Requires: npm install @opentelemetry/exporter-trace-otlp-grpc @grpc/grpc-js\n let endpoint = config.endpoint;\n if (!endpoint.includes('/v1/traces')) {\n endpoint = `${endpoint}/v1/traces`;\n }\n\n const headers: Record<string, string> = {\n authorization: `Bearer ${config.apiKey}`, // lowercase for gRPC metadata\n };\n\n if (config.dataset) {\n headers['dash0-dataset'] = config.dataset; // lowercase for gRPC metadata\n }\n\n return {\n endpoint,\n headers,\n protocol: 'grpc', // Use gRPC for Dash0\n };\n}\n\nfunction resolveSignozConfig(config: SignozConfig): ResolvedProviderConfig | null {\n if (!config.apiKey) {\n console.error('[OtelExporter] SigNoz configuration requires apiKey. Tracing will be disabled.');\n return null;\n }\n\n // SigNoz uses OTLP endpoint with /v1/traces suffix\n const endpoint = config.endpoint || `https://ingest.${config.region || 'us'}.signoz.cloud:443/v1/traces`;\n\n return {\n endpoint,\n headers: {\n 'signoz-ingestion-key': config.apiKey,\n },\n protocol: 'http/protobuf',\n };\n}\n\nfunction resolveNewRelicConfig(config: NewRelicConfig): ResolvedProviderConfig | null {\n if (!config.apiKey) {\n console.error('[OtelExporter] New Relic configuration requires apiKey (license key). Tracing will be disabled.');\n return null;\n }\n\n // New Relic recommends HTTP/protobuf over gRPC\n // New Relic uses OTLP endpoint with /v1/traces suffix\n const endpoint = config.endpoint || 'https://otlp.nr-data.net:443/v1/traces';\n\n return {\n endpoint,\n headers: {\n 'api-key': config.apiKey,\n },\n protocol: 'http/protobuf',\n };\n}\n\nfunction resolveTraceloopConfig(config: TraceloopConfig): ResolvedProviderConfig | null {\n if (!config.apiKey) {\n console.error('[OtelExporter] Traceloop configuration requires apiKey. Tracing will be disabled.');\n return null;\n }\n\n // Traceloop uses OTLP endpoint with /v1/traces suffix\n const endpoint = config.endpoint || 'https://api.traceloop.com/v1/traces';\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${config.apiKey}`,\n };\n\n if (config.destinationId) {\n headers['x-traceloop-destination-id'] = config.destinationId;\n }\n\n return {\n endpoint,\n headers,\n protocol: 'http/json',\n };\n}\n\nfunction resolveLaminarConfig(config: LaminarConfig): ResolvedProviderConfig | null {\n if (!config.apiKey) {\n console.error('[OtelExporter] Laminar configuration requires apiKey. Tracing will be disabled.');\n return null;\n }\n\n // Laminar uses OTLP endpoint with /v1/traces suffix for HTTP\n // They support both gRPC and HTTP, but we'll use HTTP for consistency\n const endpoint = config.endpoint || 'https://api.lmnr.ai/v1/traces';\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${config.apiKey}`,\n };\n\n // Only add team ID header if provided (for backwards compatibility)\n if (config.teamId) {\n headers['x-laminar-team-id'] = config.teamId;\n }\n\n return {\n endpoint,\n headers,\n protocol: 'http/protobuf', // Use HTTP/protobuf instead of gRPC for better compatibility\n };\n}\n\nfunction resolveCustomConfig(config: CustomConfig): ResolvedProviderConfig | null {\n if (!config.endpoint) {\n console.error('[OtelExporter] Custom configuration requires endpoint. Tracing will be disabled.');\n return null;\n }\n\n return {\n endpoint: config.endpoint,\n headers: config.headers || {},\n protocol: config.protocol || 'http/json',\n };\n}\n","/**\n * Custom OpenTelemetry span that preserves Mastra's trace and span IDs\n */\n\nimport type { AnyExportedAISpan } from '@mastra/core/ai-tracing';\nimport { SpanStatusCode, TraceFlags } from '@opentelemetry/api';\nimport type { SpanKind, SpanContext, SpanStatus, Attributes, Link } from '@opentelemetry/api';\nimport type { InstrumentationScope } from '@opentelemetry/core';\nimport type { Resource } from '@opentelemetry/resources';\nimport type { ReadableSpan, TimedEvent } from '@opentelemetry/sdk-trace-base';\n\n/**\n * A custom ReadableSpan implementation that preserves Mastra's IDs\n */\nexport class MastraReadableSpan implements ReadableSpan {\n readonly name: string;\n readonly kind: SpanKind;\n readonly spanContext: () => SpanContext;\n readonly parentSpanId?: string;\n readonly startTime: [number, number];\n readonly endTime: [number, number];\n readonly status: SpanStatus;\n readonly attributes: Attributes;\n readonly links: Link[];\n readonly events: TimedEvent[];\n readonly duration: [number, number];\n readonly ended: boolean;\n readonly resource: Resource;\n readonly instrumentationLibrary: InstrumentationScope;\n readonly instrumentationScope: InstrumentationScope;\n readonly droppedAttributesCount: number = 0;\n readonly droppedEventsCount: number = 0;\n readonly droppedLinksCount: number = 0;\n\n constructor(\n aiSpan: AnyExportedAISpan,\n attributes: Attributes,\n kind: SpanKind,\n parentSpanId?: string,\n resource?: Resource,\n instrumentationLibrary?: InstrumentationScope,\n ) {\n this.name = aiSpan.name;\n this.kind = kind;\n this.attributes = attributes;\n this.parentSpanId = parentSpanId;\n this.links = [];\n this.events = [];\n\n // Convert JavaScript Date to hrtime format [seconds, nanoseconds]\n this.startTime = this.dateToHrTime(aiSpan.startTime);\n this.endTime = aiSpan.endTime ? this.dateToHrTime(aiSpan.endTime) : this.startTime;\n this.ended = !!aiSpan.endTime;\n\n // Calculate duration\n if (aiSpan.endTime) {\n const durationMs = aiSpan.endTime.getTime() - aiSpan.startTime.getTime();\n this.duration = [Math.floor(durationMs / 1000), (durationMs % 1000) * 1000000];\n } else {\n this.duration = [0, 0];\n }\n\n // Set status based on error info\n if (aiSpan.errorInfo) {\n this.status = {\n code: SpanStatusCode.ERROR,\n message: aiSpan.errorInfo.message,\n };\n\n // Add error as event\n this.events.push({\n name: 'exception',\n attributes: {\n 'exception.message': aiSpan.errorInfo.message,\n 'exception.type': 'Error',\n ...(aiSpan.errorInfo.details?.stack && {\n 'exception.stacktrace': aiSpan.errorInfo.details.stack as string,\n }),\n },\n time: this.startTime,\n droppedAttributesCount: 0,\n });\n } else if (aiSpan.endTime) {\n this.status = { code: SpanStatusCode.OK };\n } else {\n this.status = { code: SpanStatusCode.UNSET };\n }\n\n // Add instant event if needed\n if (aiSpan.isEvent) {\n this.events.push({\n name: 'instant_event',\n attributes: {},\n time: this.startTime,\n droppedAttributesCount: 0,\n });\n }\n\n // Create span context with Mastra's IDs\n this.spanContext = () => ({\n traceId: aiSpan.traceId,\n spanId: aiSpan.id,\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n });\n\n // Set resource and instrumentation library\n this.resource = resource || ({} as Resource);\n this.instrumentationLibrary = instrumentationLibrary || {\n name: '@mastra/otel',\n version: '1.0.0',\n };\n // instrumentationScope is the same as instrumentationLibrary\n this.instrumentationScope = this.instrumentationLibrary;\n }\n\n /**\n * Convert JavaScript Date to hrtime format\n */\n private dateToHrTime(date: Date): [number, number] {\n const ms = date.getTime();\n const seconds = Math.floor(ms / 1000);\n const nanoseconds = (ms % 1000) * 1000000;\n return [seconds, nanoseconds];\n }\n}\n","/**\n * Convert Mastra AI spans to OpenTelemetry spans\n */\n\nimport type {\n AnyExportedAISpan,\n LLMGenerationAttributes,\n AgentRunAttributes,\n ToolCallAttributes,\n MCPToolCallAttributes,\n WorkflowRunAttributes,\n} from '@mastra/core/ai-tracing';\nimport { AISpanType } from '@mastra/core/ai-tracing';\nimport { SpanKind } from '@opentelemetry/api';\nimport type { Attributes } from '@opentelemetry/api';\nimport type { InstrumentationScope } from '@opentelemetry/core';\nimport type { Resource } from '@opentelemetry/resources';\nimport { MastraReadableSpan } from './mastra-span.js';\n\n// Map Mastra span types to OpenTelemetry span kinds following OTEL conventions\n// Only non-INTERNAL mappings are specified - all others default to SpanKind.INTERNAL\nconst SPAN_KIND_MAPPING: Partial<Record<AISpanType, SpanKind>> = {\n // LLM operations are CLIENT spans (calling external AI services)\n [AISpanType.LLM_GENERATION]: SpanKind.CLIENT,\n [AISpanType.LLM_CHUNK]: SpanKind.CLIENT,\n\n // MCP tool calls are CLIENT (external service calls)\n [AISpanType.MCP_TOOL_CALL]: SpanKind.CLIENT,\n\n // Root spans for agent/workflow are SERVER (entry points)\n [AISpanType.AGENT_RUN]: SpanKind.SERVER,\n [AISpanType.WORKFLOW_RUN]: SpanKind.SERVER,\n};\n\nexport class SpanConverter {\n private resource?: Resource;\n private instrumentationLibrary: InstrumentationScope;\n\n constructor(resource?: Resource) {\n this.resource = resource;\n this.instrumentationLibrary = {\n name: '@mastra/otel',\n version: '1.0.0',\n };\n }\n\n /**\n * Convert a Mastra AI span to an OpenTelemetry ReadableSpan\n * This preserves Mastra's trace and span IDs\n */\n convertSpan(aiSpan: AnyExportedAISpan): MastraReadableSpan {\n const spanKind = this.getSpanKind(aiSpan);\n const attributes = this.buildAttributes(aiSpan);\n const spanName = this.buildSpanName(aiSpan);\n\n // Create a new span with OTEL-compliant naming\n const otelSpan = { ...aiSpan, name: spanName };\n\n return new MastraReadableSpan(\n otelSpan,\n attributes,\n spanKind,\n aiSpan.parentSpanId, // Use the parentSpanId from the Mastra span directly\n this.resource,\n this.instrumentationLibrary,\n );\n }\n\n /**\n * Get the appropriate SpanKind based on span type and context\n */\n private getSpanKind(aiSpan: AnyExportedAISpan): SpanKind {\n // Root spans should be SERVER\n if (aiSpan.isRootSpan) {\n if (aiSpan.type === AISpanType.AGENT_RUN || aiSpan.type === AISpanType.WORKFLOW_RUN) {\n return SpanKind.SERVER;\n }\n }\n return SPAN_KIND_MAPPING[aiSpan.type] || SpanKind.INTERNAL;\n }\n\n /**\n * Build OTEL-compliant span name based on span type and attributes\n */\n private buildSpanName(aiSpan: AnyExportedAISpan): string {\n switch (aiSpan.type) {\n case AISpanType.LLM_GENERATION: {\n const attrs = aiSpan.attributes as LLMGenerationAttributes;\n const operation = attrs?.resultType === 'tool_selection' ? 'tool_selection' : 'chat';\n const model = attrs?.model || 'unknown';\n return `${operation} ${model}`;\n }\n\n case AISpanType.TOOL_CALL:\n case AISpanType.MCP_TOOL_CALL: {\n const toolAttrs = aiSpan.attributes as ToolCallAttributes | MCPToolCallAttributes;\n const toolName = toolAttrs?.toolId || 'unknown';\n return `tool.execute ${toolName}`;\n }\n\n case AISpanType.AGENT_RUN: {\n const agentAttrs = aiSpan.attributes as AgentRunAttributes;\n const agentId = agentAttrs?.agentId || 'unknown';\n return `agent.${agentId}`;\n }\n\n case AISpanType.WORKFLOW_RUN: {\n const workflowAttrs = aiSpan.attributes as WorkflowRunAttributes;\n const workflowId = workflowAttrs?.workflowId || 'unknown';\n return `workflow.${workflowId}`;\n }\n\n case AISpanType.WORKFLOW_STEP:\n // Keep the original name as it's likely descriptive\n return aiSpan.name;\n\n default:\n // For other types, use a simplified version of the original name\n return aiSpan.name;\n }\n }\n\n /**\n * Build OpenTelemetry attributes from Mastra AI span\n * Following OTEL Semantic Conventions for GenAI\n */\n private buildAttributes(aiSpan: AnyExportedAISpan): Attributes {\n const attributes: Attributes = {};\n\n // Add gen_ai.operation.name based on span type\n attributes['gen_ai.operation.name'] = this.getOperationName(aiSpan);\n\n // Add span kind semantic attribute\n attributes['span.kind'] = this.getSpanKindString(aiSpan);\n\n // Add span type for better visibility\n attributes['mastra.span.type'] = aiSpan.type;\n\n // Add trace and span IDs for debugging\n attributes['mastra.trace_id'] = aiSpan.traceId;\n attributes['mastra.span_id'] = aiSpan.id;\n if (aiSpan.parentSpanId) {\n attributes['mastra.parent_span_id'] = aiSpan.parentSpanId;\n }\n\n // Handle input/output based on span type\n // Always add input/output for Laminar compatibility\n if (aiSpan.input !== undefined) {\n const inputStr = typeof aiSpan.input === 'string' ? aiSpan.input : JSON.stringify(aiSpan.input);\n // Add generic input for all providers\n attributes['input'] = inputStr;\n\n // Add specific attributes based on span type\n if (aiSpan.type === AISpanType.LLM_GENERATION) {\n attributes['gen_ai.prompt'] = inputStr;\n } else if (aiSpan.type === AISpanType.TOOL_CALL || aiSpan.type === AISpanType.MCP_TOOL_CALL) {\n attributes['gen_ai.tool.input'] = inputStr;\n }\n }\n\n if (aiSpan.output !== undefined) {\n const outputStr = typeof aiSpan.output === 'string' ? aiSpan.output : JSON.stringify(aiSpan.output);\n // Add generic output for all providers\n attributes['output'] = outputStr;\n\n // Add specific attributes based on span type\n if (aiSpan.type === AISpanType.LLM_GENERATION) {\n attributes['gen_ai.completion'] = outputStr;\n } else if (aiSpan.type === AISpanType.TOOL_CALL || aiSpan.type === AISpanType.MCP_TOOL_CALL) {\n attributes['gen_ai.tool.output'] = outputStr;\n }\n }\n\n // Add LLM-specific attributes using OTEL semantic conventions\n if (aiSpan.type === AISpanType.LLM_GENERATION && aiSpan.attributes) {\n const llmAttrs = aiSpan.attributes as LLMGenerationAttributes;\n\n // Model and provider\n if (llmAttrs.model) {\n attributes['gen_ai.request.model'] = llmAttrs.model;\n }\n\n if (llmAttrs.provider) {\n attributes['gen_ai.system'] = llmAttrs.provider;\n }\n\n // Token usage - use OTEL standard naming\n if (llmAttrs.usage) {\n // Handle both v5 format (inputTokens/outputTokens) and legacy format (promptTokens/completionTokens)\n const inputTokens = llmAttrs.usage.inputTokens ?? llmAttrs.usage.promptTokens;\n const outputTokens = llmAttrs.usage.outputTokens ?? llmAttrs.usage.completionTokens;\n\n if (inputTokens !== undefined) {\n attributes['gen_ai.usage.input_tokens'] = inputTokens;\n }\n if (outputTokens !== undefined) {\n attributes['gen_ai.usage.output_tokens'] = outputTokens;\n }\n if (llmAttrs.usage.totalTokens !== undefined) {\n attributes['gen_ai.usage.total_tokens'] = llmAttrs.usage.totalTokens;\n }\n\n // Add other token metrics if present\n if (llmAttrs.usage.reasoningTokens !== undefined) {\n attributes['gen_ai.usage.reasoning_tokens'] = llmAttrs.usage.reasoningTokens;\n }\n if (llmAttrs.usage.cachedInputTokens !== undefined) {\n attributes['gen_ai.usage.cached_input_tokens'] = llmAttrs.usage.cachedInputTokens;\n }\n }\n\n // Parameters using OTEL conventions\n if (llmAttrs.parameters) {\n if (llmAttrs.parameters.temperature !== undefined) {\n attributes['gen_ai.request.temperature'] = llmAttrs.parameters.temperature;\n }\n if (llmAttrs.parameters.maxOutputTokens !== undefined) {\n attributes['gen_ai.request.max_tokens'] = llmAttrs.parameters.maxOutputTokens;\n }\n if (llmAttrs.parameters.topP !== undefined) {\n attributes['gen_ai.request.top_p'] = llmAttrs.parameters.topP;\n }\n if (llmAttrs.parameters.topK !== undefined) {\n attributes['gen_ai.request.top_k'] = llmAttrs.parameters.topK;\n }\n if (llmAttrs.parameters.presencePenalty !== undefined) {\n attributes['gen_ai.request.presence_penalty'] = llmAttrs.parameters.presencePenalty;\n }\n if (llmAttrs.parameters.frequencyPenalty !== undefined) {\n attributes['gen_ai.request.frequency_penalty'] = llmAttrs.parameters.frequencyPenalty;\n }\n if (llmAttrs.parameters.stopSequences) {\n attributes['gen_ai.request.stop_sequences'] = JSON.stringify(llmAttrs.parameters.stopSequences);\n }\n }\n\n // Response attributes\n if (llmAttrs.finishReason) {\n attributes['gen_ai.response.finish_reasons'] = llmAttrs.finishReason;\n }\n }\n\n // Add tool-specific attributes using OTEL conventions\n if ((aiSpan.type === AISpanType.TOOL_CALL || aiSpan.type === AISpanType.MCP_TOOL_CALL) && aiSpan.attributes) {\n const toolAttrs = aiSpan.attributes as ToolCallAttributes | MCPToolCallAttributes;\n\n // Tool identification\n if (toolAttrs.toolId) {\n attributes['gen_ai.tool.name'] = toolAttrs.toolId;\n }\n\n // MCP-specific attributes\n if (aiSpan.type === AISpanType.MCP_TOOL_CALL) {\n const mcpAttrs = toolAttrs as MCPToolCallAttributes;\n if (mcpAttrs.mcpServer) {\n attributes['mcp.server'] = mcpAttrs.mcpServer;\n }\n if (mcpAttrs.serverVersion) {\n attributes['mcp.server.version'] = mcpAttrs.serverVersion;\n }\n } else {\n if ((toolAttrs as ToolCallAttributes).toolDescription) {\n attributes['gen_ai.tool.description'] = (toolAttrs as ToolCallAttributes).toolDescription;\n }\n }\n\n // Tool execution result\n if (toolAttrs.success !== undefined) {\n attributes['gen_ai.tool.success'] = toolAttrs.success;\n }\n }\n\n // Add agent-specific attributes\n if (aiSpan.type === AISpanType.AGENT_RUN && aiSpan.attributes) {\n const agentAttrs = aiSpan.attributes as AgentRunAttributes;\n if (agentAttrs.agentId) {\n attributes['agent.id'] = agentAttrs.agentId;\n }\n if (agentAttrs.maxSteps) {\n attributes['agent.max_steps'] = agentAttrs.maxSteps;\n }\n if (agentAttrs.availableTools) {\n attributes['agent.available_tools'] = JSON.stringify(agentAttrs.availableTools);\n }\n }\n\n // Add workflow-specific attributes\n if (aiSpan.type === AISpanType.WORKFLOW_RUN && aiSpan.attributes) {\n const workflowAttrs = aiSpan.attributes as WorkflowRunAttributes;\n if (workflowAttrs.workflowId) {\n attributes['workflow.id'] = workflowAttrs.workflowId;\n }\n if (workflowAttrs.status) {\n attributes['workflow.status'] = workflowAttrs.status;\n }\n }\n\n // Add error information if present\n if (aiSpan.errorInfo) {\n attributes['error'] = true;\n attributes['error.type'] = aiSpan.errorInfo.id || 'unknown';\n attributes['error.message'] = aiSpan.errorInfo.message;\n if (aiSpan.errorInfo.domain) {\n attributes['error.domain'] = aiSpan.errorInfo.domain;\n }\n if (aiSpan.errorInfo.category) {\n attributes['error.category'] = aiSpan.errorInfo.category;\n }\n }\n\n // Add metadata as custom attributes with proper typing\n if (aiSpan.metadata) {\n Object.entries(aiSpan.metadata).forEach(([key, value]) => {\n // Skip if attribute already exists\n if (!attributes[key]) {\n // Ensure value is a valid OTEL attribute type\n if (value === null || value === undefined) {\n return;\n }\n if (typeof value === 'object') {\n attributes[key] = JSON.stringify(value);\n } else {\n attributes[key] = value;\n }\n }\n });\n }\n\n // Add timing information\n if (aiSpan.startTime) {\n attributes['mastra.start_time'] = aiSpan.startTime.toISOString();\n }\n if (aiSpan.endTime) {\n attributes['mastra.end_time'] = aiSpan.endTime.toISOString();\n const duration = aiSpan.endTime.getTime() - aiSpan.startTime.getTime();\n attributes['mastra.duration_ms'] = duration;\n }\n\n return attributes;\n }\n\n /**\n * Get the operation name based on span type for gen_ai.operation.name\n */\n private getOperationName(aiSpan: AnyExportedAISpan): string {\n switch (aiSpan.type) {\n case AISpanType.LLM_GENERATION: {\n const attrs = aiSpan.attributes as LLMGenerationAttributes;\n return attrs?.resultType === 'tool_selection' ? 'tool_selection' : 'chat';\n }\n case AISpanType.TOOL_CALL:\n case AISpanType.MCP_TOOL_CALL:\n return 'tool.execute';\n case AISpanType.AGENT_RUN:\n return 'agent.run';\n case AISpanType.WORKFLOW_RUN:\n return 'workflow.run';\n default:\n return aiSpan.type.replace(/_/g, '.');\n }\n }\n\n /**\n * Get span kind as string for attribute\n */\n private getSpanKindString(aiSpan: AnyExportedAISpan): string {\n const kind = this.getSpanKind(aiSpan);\n switch (kind) {\n case SpanKind.SERVER:\n return 'server';\n case SpanKind.CLIENT:\n return 'client';\n case SpanKind.INTERNAL:\n return 'internal';\n case SpanKind.PRODUCER:\n return 'producer';\n case SpanKind.CONSUMER:\n return 'consumer';\n default:\n return 'internal';\n }\n }\n}\n","/**\n * OpenTelemetry AI Tracing Exporter for Mastra\n */\n\nimport { AITracingEventType } from '@mastra/core/ai-tracing';\nimport type { AITracingExporter, AITracingEvent, AnyExportedAISpan, TracingConfig } from '@mastra/core/ai-tracing';\nimport { ConsoleLogger } from '@mastra/core/logger';\nimport { diag, DiagConsoleLogger, DiagLogLevel } from '@opentelemetry/api';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport type { SpanExporter } from '@opentelemetry/sdk-trace-base';\nimport {\n ATTR_SERVICE_NAME,\n ATTR_SERVICE_VERSION,\n ATTR_TELEMETRY_SDK_LANGUAGE,\n ATTR_TELEMETRY_SDK_NAME,\n ATTR_TELEMETRY_SDK_VERSION,\n} from '@opentelemetry/semantic-conventions';\n\nimport { loadExporter } from './loadExporter.js';\nimport { resolveProviderConfig } from './provider-configs.js';\nimport { SpanConverter } from './span-converter.js';\nimport type { OtelExporterConfig } from './types.js';\n\nexport class OtelExporter implements AITracingExporter {\n private config: OtelExporterConfig;\n private tracingConfig?: TracingConfig;\n private spanConverter: SpanConverter;\n private processor?: BatchSpanProcessor;\n private exporter?: SpanExporter;\n private isSetup: boolean = false;\n private isDisabled: boolean = false;\n private logger: ConsoleLogger;\n\n name = 'opentelemetry';\n\n constructor(config: OtelExporterConfig) {\n this.config = config;\n this.spanConverter = new SpanConverter();\n this.logger = new ConsoleLogger({ level: config.logLevel ?? 'warn' });\n\n // Set up OpenTelemetry diagnostics if debug mode\n if (config.logLevel === 'debug') {\n diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.DEBUG);\n }\n }\n\n /**\n * Initialize with tracing configuration\n */\n init(config: TracingConfig): void {\n this.tracingConfig = config;\n }\n\n private async setupExporter() {\n if (this.isSetup) return;\n\n // Provider configuration is required\n if (!this.config.provider) {\n this.logger.error(\n '[OtelExporter] Provider configuration is required. Use the \"custom\" provider for generic endpoints.',\n );\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n // Resolve provider configuration\n const resolved = resolveProviderConfig(this.config.provider);\n if (!resolved) {\n // Configuration validation failed, disable tracing\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n const endpoint = resolved.endpoint;\n const headers = resolved.headers;\n const protocol = resolved.protocol;\n\n // Load and create the appropriate exporter based on protocol\n const providerName = Object.keys(this.config.provider)[0];\n const ExporterClass = await loadExporter(protocol, providerName);\n\n if (!ExporterClass) {\n // Exporter not available, disable tracing\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n try {\n if (protocol === 'zipkin') {\n this.exporter = new ExporterClass({\n url: endpoint,\n headers,\n });\n } else if (protocol === 'grpc') {\n // gRPC uses Metadata object instead of headers\n // Dynamically import @grpc/grpc-js to create metadata\n let metadata: any;\n try {\n // @ts-ignore - Dynamic import for optional dependency\n const grpcModule = await import('@grpc/grpc-js');\n metadata = new grpcModule.Metadata();\n Object.entries(headers).forEach(([key, value]) => {\n metadata.set(key, value);\n });\n } catch (grpcError) {\n this.logger.error(\n `[OtelExporter] Failed to load gRPC metadata. Install required packages:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-grpc @grpc/grpc-js\\n`,\n grpcError,\n );\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n this.exporter = new ExporterClass({\n url: endpoint,\n metadata,\n timeoutMillis: this.config.timeout,\n });\n } else {\n // HTTP/JSON and HTTP/Protobuf use headers\n this.exporter = new ExporterClass({\n url: endpoint,\n headers,\n timeoutMillis: this.config.timeout,\n });\n }\n } catch (error) {\n this.logger.error(`[OtelExporter] Failed to create exporter:`, error);\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n // Create resource with service name from TracingConfig\n let resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: this.tracingConfig?.serviceName || 'mastra-service',\n [ATTR_SERVICE_VERSION]: '1.0.0',\n // Add telemetry SDK information\n [ATTR_TELEMETRY_SDK_NAME]: '@mastra/otel-exporter',\n [ATTR_TELEMETRY_SDK_VERSION]: '1.0.0',\n [ATTR_TELEMETRY_SDK_LANGUAGE]: 'nodejs',\n });\n\n if (this.config.resourceAttributes) {\n resource = resource.merge(\n // Duplicate attributes from config will override defaults above\n resourceFromAttributes(this.config.resourceAttributes),\n );\n }\n\n // Store the resource for the span converter\n this.spanConverter = new SpanConverter(resource);\n\n // Always use BatchSpanProcessor for production\n // It queues spans and exports them in batches for better performance\n this.processor = new BatchSpanProcessor(this.exporter!, {\n maxExportBatchSize: this.config.batchSize || 512, // Default batch size\n maxQueueSize: 2048, // Maximum spans to queue\n scheduledDelayMillis: 5000, // Export every 5 seconds\n exportTimeoutMillis: this.config.timeout || 30000, // Export timeout\n });\n\n this.logger.debug(\n `[OtelExporter] Using BatchSpanProcessor (batch size: ${this.config.batchSize || 512}, delay: 5s)`,\n );\n this.isSetup = true;\n }\n\n async exportEvent(event: AITracingEvent): Promise<void> {\n // Skip if disabled due to configuration errors\n if (this.isDisabled) {\n return;\n }\n\n // Only process SPAN_ENDED events for OTEL\n // OTEL expects complete spans with start and end times\n if (event.type !== AITracingEventType.SPAN_ENDED) {\n return;\n }\n\n const span = event.exportedSpan;\n await this.exportSpan(span);\n }\n\n private async exportSpan(span: AnyExportedAISpan): Promise<void> {\n // Ensure exporter is set up\n if (!this.isSetup) {\n await this.setupExporter();\n }\n\n // Skip if disabled\n if (this.isDisabled || !this.processor) {\n return;\n }\n\n try {\n // Convert the span to OTEL format\n const readableSpan = this.spanConverter.convertSpan(span);\n\n // Export the span immediately through the processor\n // The processor will handle batching if configured\n await new Promise<void>(resolve => {\n this.processor!.onEnd(readableSpan);\n resolve();\n });\n\n this.logger.debug(\n `[OtelExporter] Exported span ${span.id} (trace: ${span.traceId}, parent: ${span.parentSpanId || 'none'}, type: ${span.type})`,\n );\n } catch (error) {\n this.logger.error(`[OtelExporter] Failed to export span ${span.id}:`, error);\n }\n }\n\n async shutdown(): Promise<void> {\n // Shutdown the processor to flush any remaining spans\n if (this.processor) {\n await this.processor.shutdown();\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/loadExporter.ts","../src/provider-configs.ts","../src/mastra-span.ts","../src/span-converter.ts","../src/ai-tracing.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Dynamic loader for optional OtelExporters\n */\n\nimport type { ExportProtocol } from './types.js';\n\n// Dynamic imports for optional dependencies\nlet OTLPHttpExporter: any;\nlet OTLPGrpcExporter: any;\nlet OTLPProtoExporter: any;\nlet ZipkinExporter: any;\n\nexport async function loadExporter(protocol: ExportProtocol, provider?: string): Promise<any> {\n switch (protocol) {\n case 'zipkin':\n if (!ZipkinExporter) {\n try {\n const module = await import('@opentelemetry/exporter-zipkin');\n ZipkinExporter = module.ZipkinExporter;\n } catch {\n console.error(\n `[OtelExporter] Zipkin exporter is not installed.\\n` +\n `To use Zipkin export, install the required package:\\n` +\n ` npm install @opentelemetry/exporter-zipkin`,\n );\n return null;\n }\n }\n return ZipkinExporter;\n\n case 'grpc':\n if (!OTLPGrpcExporter) {\n try {\n const module = await import('@opentelemetry/exporter-trace-otlp-grpc');\n OTLPGrpcExporter = module.OTLPTraceExporter;\n } catch {\n const providerInfo = provider ? ` (required for ${provider})` : '';\n console.error(\n `[OtelExporter] gRPC exporter is not installed${providerInfo}.\\n` +\n `To use gRPC export, install the required packages:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-grpc @grpc/grpc-js`,\n );\n return null;\n }\n }\n return OTLPGrpcExporter;\n\n case 'http/protobuf':\n if (!OTLPProtoExporter) {\n try {\n const module = await import('@opentelemetry/exporter-trace-otlp-proto');\n OTLPProtoExporter = module.OTLPTraceExporter;\n } catch {\n const providerInfo = provider ? ` (required for ${provider})` : '';\n console.error(\n `[OtelExporter] HTTP/Protobuf exporter is not installed${providerInfo}.\\n` +\n `To use HTTP/Protobuf export, install the required package:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-proto`,\n );\n return null;\n }\n }\n return OTLPProtoExporter;\n\n case 'http/json':\n default:\n if (!OTLPHttpExporter) {\n try {\n const module = await import('@opentelemetry/exporter-trace-otlp-http');\n OTLPHttpExporter = module.OTLPTraceExporter;\n } catch {\n const providerInfo = provider ? ` (required for ${provider})` : '';\n console.error(\n `[OtelExporter] HTTP/JSON exporter is not installed${providerInfo}.\\n` +\n `To use HTTP/JSON export, install the required package:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-http`,\n );\n return null;\n }\n }\n return OTLPHttpExporter;\n }\n}\n","/**\n * Provider-specific configurations for OtelExporters\n */\n\nimport type {\n ProviderConfig,\n ExportProtocol,\n Dash0Config,\n SignozConfig,\n NewRelicConfig,\n TraceloopConfig,\n LaminarConfig,\n CustomConfig,\n} from './types.js';\n\nexport interface ResolvedProviderConfig {\n endpoint: string;\n headers: Record<string, string>;\n protocol: ExportProtocol;\n}\n\nexport function resolveProviderConfig(config: ProviderConfig): ResolvedProviderConfig | null {\n if ('dash0' in config) {\n return resolveDash0Config(config.dash0);\n } else if ('signoz' in config) {\n return resolveSignozConfig(config.signoz);\n } else if ('newrelic' in config) {\n return resolveNewRelicConfig(config.newrelic);\n } else if ('traceloop' in config) {\n return resolveTraceloopConfig(config.traceloop);\n } else if ('laminar' in config) {\n return resolveLaminarConfig(config.laminar);\n } else if ('custom' in config) {\n return resolveCustomConfig(config.custom);\n } else {\n // TypeScript exhaustiveness check\n const _exhaustive: never = config;\n return _exhaustive;\n }\n}\n\nfunction resolveDash0Config(config: Dash0Config): ResolvedProviderConfig | null {\n if (!config.apiKey) {\n console.error('[OtelExporter] Dash0 configuration requires apiKey. Tracing will be disabled.');\n return null;\n }\n\n if (!config.endpoint) {\n console.error('[OtelExporter] Dash0 configuration requires endpoint. Tracing will be disabled.');\n return null;\n }\n\n // Dash0 uses gRPC by default\n // Endpoint should be like: ingress.us-west-2.aws.dash0.com:4317\n // gRPC endpoints also need /v1/traces suffix\n // Requires: npm install @opentelemetry/exporter-trace-otlp-grpc @grpc/grpc-js\n let endpoint = config.endpoint;\n if (!endpoint.includes('/v1/traces')) {\n endpoint = `${endpoint}/v1/traces`;\n }\n\n const headers: Record<string, string> = {\n authorization: `Bearer ${config.apiKey}`, // lowercase for gRPC metadata\n };\n\n if (config.dataset) {\n headers['dash0-dataset'] = config.dataset; // lowercase for gRPC metadata\n }\n\n return {\n endpoint,\n headers,\n protocol: 'grpc', // Use gRPC for Dash0\n };\n}\n\nfunction resolveSignozConfig(config: SignozConfig): ResolvedProviderConfig | null {\n if (!config.apiKey) {\n console.error('[OtelExporter] SigNoz configuration requires apiKey. Tracing will be disabled.');\n return null;\n }\n\n // SigNoz uses OTLP endpoint with /v1/traces suffix\n const endpoint = config.endpoint || `https://ingest.${config.region || 'us'}.signoz.cloud:443/v1/traces`;\n\n return {\n endpoint,\n headers: {\n 'signoz-ingestion-key': config.apiKey,\n },\n protocol: 'http/protobuf',\n };\n}\n\nfunction resolveNewRelicConfig(config: NewRelicConfig): ResolvedProviderConfig | null {\n if (!config.apiKey) {\n console.error('[OtelExporter] New Relic configuration requires apiKey (license key). Tracing will be disabled.');\n return null;\n }\n\n // New Relic recommends HTTP/protobuf over gRPC\n // New Relic uses OTLP endpoint with /v1/traces suffix\n const endpoint = config.endpoint || 'https://otlp.nr-data.net:443/v1/traces';\n\n return {\n endpoint,\n headers: {\n 'api-key': config.apiKey,\n },\n protocol: 'http/protobuf',\n };\n}\n\nfunction resolveTraceloopConfig(config: TraceloopConfig): ResolvedProviderConfig | null {\n if (!config.apiKey) {\n console.error('[OtelExporter] Traceloop configuration requires apiKey. Tracing will be disabled.');\n return null;\n }\n\n // Traceloop uses OTLP endpoint with /v1/traces suffix\n const endpoint = config.endpoint || 'https://api.traceloop.com/v1/traces';\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${config.apiKey}`,\n };\n\n if (config.destinationId) {\n headers['x-traceloop-destination-id'] = config.destinationId;\n }\n\n return {\n endpoint,\n headers,\n protocol: 'http/json',\n };\n}\n\nfunction resolveLaminarConfig(config: LaminarConfig): ResolvedProviderConfig | null {\n if (!config.apiKey) {\n console.error('[OtelExporter] Laminar configuration requires apiKey. Tracing will be disabled.');\n return null;\n }\n\n // Laminar uses OTLP endpoint with /v1/traces suffix for HTTP\n // They support both gRPC and HTTP, but we'll use HTTP for consistency\n const endpoint = config.endpoint || 'https://api.lmnr.ai/v1/traces';\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${config.apiKey}`,\n };\n\n // Only add team ID header if provided (for backwards compatibility)\n if (config.teamId) {\n headers['x-laminar-team-id'] = config.teamId;\n }\n\n return {\n endpoint,\n headers,\n protocol: 'http/protobuf', // Use HTTP/protobuf instead of gRPC for better compatibility\n };\n}\n\nfunction resolveCustomConfig(config: CustomConfig): ResolvedProviderConfig | null {\n if (!config.endpoint) {\n console.error('[OtelExporter] Custom configuration requires endpoint. Tracing will be disabled.');\n return null;\n }\n\n return {\n endpoint: config.endpoint,\n headers: config.headers || {},\n protocol: config.protocol || 'http/json',\n };\n}\n","/**\n * Custom OpenTelemetry span that preserves Mastra's trace and span IDs\n */\n\nimport type { AnyExportedAISpan } from '@mastra/core/ai-tracing';\nimport { SpanStatusCode, TraceFlags } from '@opentelemetry/api';\nimport type { SpanKind, SpanContext, SpanStatus, Attributes, Link } from '@opentelemetry/api';\nimport type { InstrumentationScope } from '@opentelemetry/core';\nimport type { Resource } from '@opentelemetry/resources';\nimport type { ReadableSpan, TimedEvent } from '@opentelemetry/sdk-trace-base';\n\n/**\n * A custom ReadableSpan implementation that preserves Mastra's IDs\n */\nexport class MastraReadableSpan implements ReadableSpan {\n readonly name: string;\n readonly kind: SpanKind;\n readonly spanContext: () => SpanContext;\n readonly parentSpanContext?: SpanContext;\n readonly parentSpanId?: string;\n readonly startTime: [number, number];\n readonly endTime: [number, number];\n readonly status: SpanStatus;\n readonly attributes: Attributes;\n readonly links: Link[];\n readonly events: TimedEvent[];\n readonly duration: [number, number];\n readonly ended: boolean;\n readonly resource: Resource;\n readonly instrumentationLibrary: InstrumentationScope;\n readonly instrumentationScope: InstrumentationScope;\n readonly droppedAttributesCount: number = 0;\n readonly droppedEventsCount: number = 0;\n readonly droppedLinksCount: number = 0;\n\n constructor(\n aiSpan: AnyExportedAISpan,\n attributes: Attributes,\n kind: SpanKind,\n parentSpanId?: string,\n resource?: Resource,\n instrumentationLibrary?: InstrumentationScope,\n ) {\n this.name = aiSpan.name;\n this.kind = kind;\n this.attributes = attributes;\n this.parentSpanId = parentSpanId;\n this.links = [];\n this.events = [];\n\n // Convert JavaScript Date to hrtime format [seconds, nanoseconds]\n this.startTime = this.dateToHrTime(aiSpan.startTime);\n this.endTime = aiSpan.endTime ? this.dateToHrTime(aiSpan.endTime) : this.startTime;\n this.ended = !!aiSpan.endTime;\n\n // Calculate duration\n if (aiSpan.endTime) {\n const durationMs = aiSpan.endTime.getTime() - aiSpan.startTime.getTime();\n this.duration = [Math.floor(durationMs / 1000), (durationMs % 1000) * 1000000];\n } else {\n this.duration = [0, 0];\n }\n\n // Set status based on error info\n if (aiSpan.errorInfo) {\n this.status = {\n code: SpanStatusCode.ERROR,\n message: aiSpan.errorInfo.message,\n };\n\n // Add error as event\n this.events.push({\n name: 'exception',\n attributes: {\n 'exception.message': aiSpan.errorInfo.message,\n 'exception.type': 'Error',\n ...(aiSpan.errorInfo.details?.stack && {\n 'exception.stacktrace': aiSpan.errorInfo.details.stack as string,\n }),\n },\n time: this.startTime,\n droppedAttributesCount: 0,\n });\n } else if (aiSpan.endTime) {\n this.status = { code: SpanStatusCode.OK };\n } else {\n this.status = { code: SpanStatusCode.UNSET };\n }\n\n // Add instant event if needed\n if (aiSpan.isEvent) {\n this.events.push({\n name: 'instant_event',\n attributes: {},\n time: this.startTime,\n droppedAttributesCount: 0,\n });\n }\n\n // Create span context with Mastra's IDs\n this.spanContext = () => ({\n traceId: aiSpan.traceId,\n spanId: aiSpan.id,\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n });\n\n // Set parent span context if parent span ID is provided\n if (parentSpanId) {\n this.parentSpanContext = {\n traceId: aiSpan.traceId,\n spanId: parentSpanId,\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n };\n }\n\n // Set resource and instrumentation library\n this.resource = resource || ({} as Resource);\n this.instrumentationLibrary = instrumentationLibrary || {\n name: '@mastra/otel',\n version: '1.0.0',\n };\n // instrumentationScope is the same as instrumentationLibrary\n this.instrumentationScope = this.instrumentationLibrary;\n }\n\n /**\n * Convert JavaScript Date to hrtime format\n */\n private dateToHrTime(date: Date): [number, number] {\n const ms = date.getTime();\n const seconds = Math.floor(ms / 1000);\n const nanoseconds = (ms % 1000) * 1000000;\n return [seconds, nanoseconds];\n }\n}\n","/**\n * Convert Mastra AI spans to OpenTelemetry spans\n */\n\nimport type {\n AnyExportedAISpan,\n ModelGenerationAttributes,\n AgentRunAttributes,\n ToolCallAttributes,\n MCPToolCallAttributes,\n WorkflowRunAttributes,\n} from '@mastra/core/ai-tracing';\nimport { AISpanType } from '@mastra/core/ai-tracing';\nimport { SpanKind } from '@opentelemetry/api';\nimport type { Attributes } from '@opentelemetry/api';\nimport type { InstrumentationScope } from '@opentelemetry/core';\nimport type { Resource } from '@opentelemetry/resources';\nimport { MastraReadableSpan } from './mastra-span.js';\n\n// Map Mastra span types to OpenTelemetry span kinds following OTEL conventions\n// Only non-INTERNAL mappings are specified - all others default to SpanKind.INTERNAL\nconst SPAN_KIND_MAPPING: Partial<Record<AISpanType, SpanKind>> = {\n // Model operations are CLIENT spans (calling external AI services)\n [AISpanType.MODEL_GENERATION]: SpanKind.CLIENT,\n [AISpanType.MODEL_CHUNK]: SpanKind.CLIENT,\n\n // MCP tool calls are CLIENT (external service calls)\n [AISpanType.MCP_TOOL_CALL]: SpanKind.CLIENT,\n\n // Root spans for agent/workflow are SERVER (entry points)\n [AISpanType.AGENT_RUN]: SpanKind.SERVER,\n [AISpanType.WORKFLOW_RUN]: SpanKind.SERVER,\n};\n\nexport class SpanConverter {\n private resource?: Resource;\n private instrumentationLibrary: InstrumentationScope;\n\n constructor(resource?: Resource) {\n this.resource = resource;\n this.instrumentationLibrary = {\n name: '@mastra/otel',\n version: '1.0.0',\n };\n }\n\n /**\n * Convert a Mastra AI span to an OpenTelemetry ReadableSpan\n * This preserves Mastra's trace and span IDs\n */\n convertSpan(aiSpan: AnyExportedAISpan): MastraReadableSpan {\n const spanKind = this.getSpanKind(aiSpan);\n const attributes = this.buildAttributes(aiSpan);\n const spanName = this.buildSpanName(aiSpan);\n\n // Create a new span with OTEL-compliant naming\n const otelSpan = { ...aiSpan, name: spanName };\n\n return new MastraReadableSpan(\n otelSpan,\n attributes,\n spanKind,\n aiSpan.parentSpanId, // Use the parentSpanId from the Mastra span directly\n this.resource,\n this.instrumentationLibrary,\n );\n }\n\n /**\n * Get the appropriate SpanKind based on span type and context\n */\n private getSpanKind(aiSpan: AnyExportedAISpan): SpanKind {\n // Root spans should be SERVER\n if (aiSpan.isRootSpan) {\n if (aiSpan.type === AISpanType.AGENT_RUN || aiSpan.type === AISpanType.WORKFLOW_RUN) {\n return SpanKind.SERVER;\n }\n }\n return SPAN_KIND_MAPPING[aiSpan.type] || SpanKind.INTERNAL;\n }\n\n /**\n * Build OTEL-compliant span name based on span type and attributes\n */\n private buildSpanName(aiSpan: AnyExportedAISpan): string {\n switch (aiSpan.type) {\n case AISpanType.MODEL_GENERATION: {\n const attrs = aiSpan.attributes as ModelGenerationAttributes;\n const operation = attrs?.resultType === 'tool_selection' ? 'tool_selection' : 'chat';\n const model = attrs?.model || 'unknown';\n return `${operation} ${model}`;\n }\n\n case AISpanType.TOOL_CALL:\n case AISpanType.MCP_TOOL_CALL: {\n const toolAttrs = aiSpan.attributes as ToolCallAttributes | MCPToolCallAttributes;\n const toolName = toolAttrs?.toolId || 'unknown';\n return `tool.execute ${toolName}`;\n }\n\n case AISpanType.AGENT_RUN: {\n const agentAttrs = aiSpan.attributes as AgentRunAttributes;\n const agentId = agentAttrs?.agentId || 'unknown';\n return `agent.${agentId}`;\n }\n\n case AISpanType.WORKFLOW_RUN: {\n const workflowAttrs = aiSpan.attributes as WorkflowRunAttributes;\n const workflowId = workflowAttrs?.workflowId || 'unknown';\n return `workflow.${workflowId}`;\n }\n\n case AISpanType.WORKFLOW_STEP:\n // Keep the original name as it's likely descriptive\n return aiSpan.name;\n\n default:\n // For other types, use a simplified version of the original name\n return aiSpan.name;\n }\n }\n\n /**\n * Build OpenTelemetry attributes from Mastra AI span\n * Following OTEL Semantic Conventions for GenAI\n */\n private buildAttributes(aiSpan: AnyExportedAISpan): Attributes {\n const attributes: Attributes = {};\n\n // Add gen_ai.operation.name based on span type\n attributes['gen_ai.operation.name'] = this.getOperationName(aiSpan);\n\n // Add span kind semantic attribute\n attributes['span.kind'] = this.getSpanKindString(aiSpan);\n\n // Add span type for better visibility\n attributes['mastra.span.type'] = aiSpan.type;\n\n // Add trace and span IDs for debugging\n attributes['mastra.trace_id'] = aiSpan.traceId;\n attributes['mastra.span_id'] = aiSpan.id;\n if (aiSpan.parentSpanId) {\n attributes['mastra.parent_span_id'] = aiSpan.parentSpanId;\n }\n\n // Handle input/output based on span type\n // Always add input/output for Laminar compatibility\n if (aiSpan.input !== undefined) {\n const inputStr = typeof aiSpan.input === 'string' ? aiSpan.input : JSON.stringify(aiSpan.input);\n // Add generic input for all providers\n attributes['input'] = inputStr;\n\n // Add specific attributes based on span type\n if (aiSpan.type === AISpanType.MODEL_GENERATION) {\n attributes['gen_ai.prompt'] = inputStr;\n } else if (aiSpan.type === AISpanType.TOOL_CALL || aiSpan.type === AISpanType.MCP_TOOL_CALL) {\n attributes['gen_ai.tool.input'] = inputStr;\n }\n }\n\n if (aiSpan.output !== undefined) {\n const outputStr = typeof aiSpan.output === 'string' ? aiSpan.output : JSON.stringify(aiSpan.output);\n // Add generic output for all providers\n attributes['output'] = outputStr;\n\n // Add specific attributes based on span type\n if (aiSpan.type === AISpanType.MODEL_GENERATION) {\n attributes['gen_ai.completion'] = outputStr;\n } else if (aiSpan.type === AISpanType.TOOL_CALL || aiSpan.type === AISpanType.MCP_TOOL_CALL) {\n attributes['gen_ai.tool.output'] = outputStr;\n }\n }\n\n // Add model-specific attributes using OTEL semantic conventions\n if (aiSpan.type === AISpanType.MODEL_GENERATION && aiSpan.attributes) {\n const modelAttrs = aiSpan.attributes as ModelGenerationAttributes;\n\n // Model and provider\n if (modelAttrs.model) {\n attributes['gen_ai.request.model'] = modelAttrs.model;\n }\n\n if (modelAttrs.provider) {\n attributes['gen_ai.system'] = modelAttrs.provider;\n }\n\n // Token usage - use OTEL standard naming\n if (modelAttrs.usage) {\n // Handle both v5 format (inputTokens/outputTokens) and legacy format (promptTokens/completionTokens)\n const inputTokens = modelAttrs.usage.inputTokens ?? modelAttrs.usage.promptTokens;\n const outputTokens = modelAttrs.usage.outputTokens ?? modelAttrs.usage.completionTokens;\n\n if (inputTokens !== undefined) {\n attributes['gen_ai.usage.input_tokens'] = inputTokens;\n }\n if (outputTokens !== undefined) {\n attributes['gen_ai.usage.output_tokens'] = outputTokens;\n }\n if (modelAttrs.usage.totalTokens !== undefined) {\n attributes['gen_ai.usage.total_tokens'] = modelAttrs.usage.totalTokens;\n }\n\n // Add other token metrics if present\n if (modelAttrs.usage.reasoningTokens !== undefined) {\n attributes['gen_ai.usage.reasoning_tokens'] = modelAttrs.usage.reasoningTokens;\n }\n if (modelAttrs.usage.cachedInputTokens !== undefined) {\n attributes['gen_ai.usage.cached_input_tokens'] = modelAttrs.usage.cachedInputTokens;\n }\n }\n\n // Parameters using OTEL conventions\n if (modelAttrs.parameters) {\n if (modelAttrs.parameters.temperature !== undefined) {\n attributes['gen_ai.request.temperature'] = modelAttrs.parameters.temperature;\n }\n if (modelAttrs.parameters.maxOutputTokens !== undefined) {\n attributes['gen_ai.request.max_tokens'] = modelAttrs.parameters.maxOutputTokens;\n }\n if (modelAttrs.parameters.topP !== undefined) {\n attributes['gen_ai.request.top_p'] = modelAttrs.parameters.topP;\n }\n if (modelAttrs.parameters.topK !== undefined) {\n attributes['gen_ai.request.top_k'] = modelAttrs.parameters.topK;\n }\n if (modelAttrs.parameters.presencePenalty !== undefined) {\n attributes['gen_ai.request.presence_penalty'] = modelAttrs.parameters.presencePenalty;\n }\n if (modelAttrs.parameters.frequencyPenalty !== undefined) {\n attributes['gen_ai.request.frequency_penalty'] = modelAttrs.parameters.frequencyPenalty;\n }\n if (modelAttrs.parameters.stopSequences) {\n attributes['gen_ai.request.stop_sequences'] = JSON.stringify(modelAttrs.parameters.stopSequences);\n }\n }\n\n // Response attributes\n if (modelAttrs.finishReason) {\n attributes['gen_ai.response.finish_reasons'] = modelAttrs.finishReason;\n }\n }\n\n // Add tool-specific attributes using OTEL conventions\n if ((aiSpan.type === AISpanType.TOOL_CALL || aiSpan.type === AISpanType.MCP_TOOL_CALL) && aiSpan.attributes) {\n const toolAttrs = aiSpan.attributes as ToolCallAttributes | MCPToolCallAttributes;\n\n // Tool identification\n if (toolAttrs.toolId) {\n attributes['gen_ai.tool.name'] = toolAttrs.toolId;\n }\n\n // MCP-specific attributes\n if (aiSpan.type === AISpanType.MCP_TOOL_CALL) {\n const mcpAttrs = toolAttrs as MCPToolCallAttributes;\n if (mcpAttrs.mcpServer) {\n attributes['mcp.server'] = mcpAttrs.mcpServer;\n }\n if (mcpAttrs.serverVersion) {\n attributes['mcp.server.version'] = mcpAttrs.serverVersion;\n }\n } else {\n if ((toolAttrs as ToolCallAttributes).toolDescription) {\n attributes['gen_ai.tool.description'] = (toolAttrs as ToolCallAttributes).toolDescription;\n }\n }\n\n // Tool execution result\n if (toolAttrs.success !== undefined) {\n attributes['gen_ai.tool.success'] = toolAttrs.success;\n }\n }\n\n // Add agent-specific attributes\n if (aiSpan.type === AISpanType.AGENT_RUN && aiSpan.attributes) {\n const agentAttrs = aiSpan.attributes as AgentRunAttributes;\n if (agentAttrs.agentId) {\n attributes['agent.id'] = agentAttrs.agentId;\n attributes['gen_ai.agent.id'] = agentAttrs.agentId;\n }\n if (agentAttrs.maxSteps) {\n attributes['agent.max_steps'] = agentAttrs.maxSteps;\n }\n if (agentAttrs.availableTools) {\n attributes['agent.available_tools'] = JSON.stringify(agentAttrs.availableTools);\n }\n }\n\n // Add workflow-specific attributes\n if (aiSpan.type === AISpanType.WORKFLOW_RUN && aiSpan.attributes) {\n const workflowAttrs = aiSpan.attributes as WorkflowRunAttributes;\n if (workflowAttrs.workflowId) {\n attributes['workflow.id'] = workflowAttrs.workflowId;\n }\n if (workflowAttrs.status) {\n attributes['workflow.status'] = workflowAttrs.status;\n }\n }\n\n // Add error information if present\n if (aiSpan.errorInfo) {\n attributes['error'] = true;\n attributes['error.type'] = aiSpan.errorInfo.id || 'unknown';\n attributes['error.message'] = aiSpan.errorInfo.message;\n if (aiSpan.errorInfo.domain) {\n attributes['error.domain'] = aiSpan.errorInfo.domain;\n }\n if (aiSpan.errorInfo.category) {\n attributes['error.category'] = aiSpan.errorInfo.category;\n }\n }\n\n // Add metadata as custom attributes with proper typing\n if (aiSpan.metadata) {\n Object.entries(aiSpan.metadata).forEach(([key, value]) => {\n // Skip if attribute already exists\n if (!attributes[key]) {\n // Ensure value is a valid OTEL attribute type\n if (value === null || value === undefined) {\n return;\n }\n if (typeof value === 'object') {\n attributes[key] = JSON.stringify(value);\n } else {\n attributes[key] = value;\n }\n }\n });\n }\n\n // Add timing information\n if (aiSpan.startTime) {\n attributes['mastra.start_time'] = aiSpan.startTime.toISOString();\n }\n if (aiSpan.endTime) {\n attributes['mastra.end_time'] = aiSpan.endTime.toISOString();\n const duration = aiSpan.endTime.getTime() - aiSpan.startTime.getTime();\n attributes['mastra.duration_ms'] = duration;\n }\n\n return attributes;\n }\n\n /**\n * Get the operation name based on span type for gen_ai.operation.name\n */\n private getOperationName(aiSpan: AnyExportedAISpan): string {\n switch (aiSpan.type) {\n case AISpanType.MODEL_GENERATION: {\n const attrs = aiSpan.attributes as ModelGenerationAttributes;\n return attrs?.resultType === 'tool_selection' ? 'tool_selection' : 'chat';\n }\n case AISpanType.TOOL_CALL:\n case AISpanType.MCP_TOOL_CALL:\n return 'tool.execute';\n case AISpanType.AGENT_RUN:\n return 'agent.run';\n case AISpanType.WORKFLOW_RUN:\n return 'workflow.run';\n default:\n return aiSpan.type.replace(/_/g, '.');\n }\n }\n\n /**\n * Get span kind as string for attribute\n */\n private getSpanKindString(aiSpan: AnyExportedAISpan): string {\n const kind = this.getSpanKind(aiSpan);\n switch (kind) {\n case SpanKind.SERVER:\n return 'server';\n case SpanKind.CLIENT:\n return 'client';\n case SpanKind.INTERNAL:\n return 'internal';\n case SpanKind.PRODUCER:\n return 'producer';\n case SpanKind.CONSUMER:\n return 'consumer';\n default:\n return 'internal';\n }\n }\n}\n","/**\n * OpenTelemetry AI Tracing Exporter for Mastra\n */\n\nimport { AITracingEventType } from '@mastra/core/ai-tracing';\nimport type { AITracingExporter, AITracingEvent, AnyExportedAISpan, TracingConfig } from '@mastra/core/ai-tracing';\nimport { ConsoleLogger } from '@mastra/core/logger';\nimport { diag, DiagConsoleLogger, DiagLogLevel } from '@opentelemetry/api';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport type { SpanExporter } from '@opentelemetry/sdk-trace-base';\nimport {\n ATTR_SERVICE_NAME,\n ATTR_SERVICE_VERSION,\n ATTR_TELEMETRY_SDK_LANGUAGE,\n ATTR_TELEMETRY_SDK_NAME,\n ATTR_TELEMETRY_SDK_VERSION,\n} from '@opentelemetry/semantic-conventions';\n\nimport { loadExporter } from './loadExporter.js';\nimport { resolveProviderConfig } from './provider-configs.js';\nimport { SpanConverter } from './span-converter.js';\nimport type { OtelExporterConfig } from './types.js';\n\nexport class OtelExporter implements AITracingExporter {\n private config: OtelExporterConfig;\n private tracingConfig?: TracingConfig;\n private spanConverter: SpanConverter;\n private processor?: BatchSpanProcessor;\n private exporter?: SpanExporter;\n private isSetup: boolean = false;\n private isDisabled: boolean = false;\n private logger: ConsoleLogger;\n\n name = 'opentelemetry';\n\n constructor(config: OtelExporterConfig) {\n this.config = config;\n this.spanConverter = new SpanConverter();\n this.logger = new ConsoleLogger({ level: config.logLevel ?? 'warn' });\n\n // Set up OpenTelemetry diagnostics if debug mode\n if (config.logLevel === 'debug') {\n diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.DEBUG);\n }\n }\n\n /**\n * Initialize with tracing configuration\n */\n init(config: TracingConfig): void {\n this.tracingConfig = config;\n }\n\n private async setupExporter() {\n // already setup or exporter already set\n if (this.isSetup || this.exporter) return;\n\n // Provider configuration is required\n if (!this.config.provider) {\n this.logger.error(\n '[OtelExporter] Provider configuration is required. Use the \"custom\" provider for generic endpoints.',\n );\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n // Resolve provider configuration\n const resolved = resolveProviderConfig(this.config.provider);\n if (!resolved) {\n // Configuration validation failed, disable tracing\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n // user provided an instantiated SpanExporter, use it\n if (this.config.exporter) {\n this.exporter = this.config.exporter;\n return;\n }\n\n const endpoint = resolved.endpoint;\n const headers = resolved.headers;\n const protocol = resolved.protocol;\n\n // Load and create the appropriate exporter based on protocol\n const providerName = Object.keys(this.config.provider)[0];\n const ExporterClass = await loadExporter(protocol, providerName);\n\n if (!ExporterClass) {\n // Exporter not available, disable tracing\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n try {\n if (protocol === 'zipkin') {\n this.exporter = new ExporterClass({\n url: endpoint,\n headers,\n });\n } else if (protocol === 'grpc') {\n // gRPC uses Metadata object instead of headers\n // Dynamically import @grpc/grpc-js to create metadata\n let metadata: any;\n try {\n // @ts-ignore - Dynamic import for optional dependency\n const grpcModule = await import('@grpc/grpc-js');\n metadata = new grpcModule.Metadata();\n Object.entries(headers).forEach(([key, value]) => {\n metadata.set(key, value);\n });\n } catch (grpcError) {\n this.logger.error(\n `[OtelExporter] Failed to load gRPC metadata. Install required packages:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-grpc @grpc/grpc-js\\n`,\n grpcError,\n );\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n this.exporter = new ExporterClass({\n url: endpoint,\n metadata,\n timeoutMillis: this.config.timeout,\n });\n } else {\n // HTTP/JSON and HTTP/Protobuf use headers\n this.exporter = new ExporterClass({\n url: endpoint,\n headers,\n timeoutMillis: this.config.timeout,\n });\n }\n } catch (error) {\n this.logger.error(`[OtelExporter] Failed to create exporter:`, error);\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n }\n\n private async setupProcessor() {\n if (this.processor || this.isSetup) return;\n\n // Create resource with service name from TracingConfig\n let resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: this.tracingConfig?.serviceName || 'mastra-service',\n [ATTR_SERVICE_VERSION]: '1.0.0',\n // Add telemetry SDK information\n [ATTR_TELEMETRY_SDK_NAME]: '@mastra/otel-exporter',\n [ATTR_TELEMETRY_SDK_VERSION]: '1.0.0',\n [ATTR_TELEMETRY_SDK_LANGUAGE]: 'nodejs',\n });\n\n if (this.config.resourceAttributes) {\n resource = resource.merge(\n // Duplicate attributes from config will override defaults above\n resourceFromAttributes(this.config.resourceAttributes),\n );\n }\n\n // Store the resource in the genai span converter\n this.spanConverter = new SpanConverter(resource);\n\n // Always use BatchSpanProcessor for production\n // It queues spans and exports them in batches for better performance\n this.processor = new BatchSpanProcessor(this.exporter!, {\n maxExportBatchSize: this.config.batchSize || 512, // Default batch size\n maxQueueSize: 2048, // Maximum spans to queue\n scheduledDelayMillis: 5000, // Export every 5 seconds\n exportTimeoutMillis: this.config.timeout || 30000, // Export timeout\n });\n\n this.logger.debug(\n `[OtelExporter] Using BatchSpanProcessor (batch size: ${this.config.batchSize || 512}, delay: 5s)`,\n );\n }\n\n private async setup() {\n if (this.isSetup) return;\n await this.setupExporter();\n await this.setupProcessor();\n this.isSetup = true;\n }\n\n async exportEvent(event: AITracingEvent): Promise<void> {\n // Skip if disabled due to configuration errors\n if (this.isDisabled) {\n return;\n }\n\n // Only process SPAN_ENDED events for OTEL\n // OTEL expects complete spans with start and end times\n if (event.type !== AITracingEventType.SPAN_ENDED) {\n return;\n }\n\n const span = event.exportedSpan;\n await this.exportSpan(span);\n }\n\n private async exportSpan(span: AnyExportedAISpan): Promise<void> {\n // Ensure exporter is set up\n if (!this.isSetup) {\n await this.setup();\n }\n\n // Skip if disabled\n if (this.isDisabled || !this.processor) {\n return;\n }\n\n try {\n // Convert the span to OTEL format\n const readableSpan = this.spanConverter.convertSpan(span);\n\n // Export the span immediately through the processor\n // The processor will handle batching if configured\n await new Promise<void>(resolve => {\n this.processor!.onEnd(readableSpan);\n resolve();\n });\n\n this.logger.debug(\n `[OtelExporter] Exported span ${span.id} (trace: ${span.traceId}, parent: ${span.parentSpanId || 'none'}, type: ${span.type})`,\n );\n } catch (error) {\n this.logger.error(`[OtelExporter] Failed to export span ${span.id}:`, error);\n }\n }\n\n async shutdown(): Promise<void> {\n // Shutdown the processor to flush any remaining spans\n if (this.processor) {\n await this.processor.shutdown();\n }\n }\n}\n"]}
@@ -13,6 +13,7 @@ export declare class MastraReadableSpan implements ReadableSpan {
13
13
  readonly name: string;
14
14
  readonly kind: SpanKind;
15
15
  readonly spanContext: () => SpanContext;
16
+ readonly parentSpanContext?: SpanContext;
16
17
  readonly parentSpanId?: string;
17
18
  readonly startTime: [number, number];
18
19
  readonly endTime: [number, number];
@@ -1 +1 @@
1
- {"version":3,"file":"mastra-span.d.ts","sourceRoot":"","sources":["../src/mastra-span.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC9F,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE9E;;GAEG;AACH,qBAAa,kBAAmB,YAAW,YAAY;IACrD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,WAAW,CAAC;IACxC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,sBAAsB,EAAE,oBAAoB,CAAC;IACtD,QAAQ,CAAC,oBAAoB,EAAE,oBAAoB,CAAC;IACpD,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAK;IAC5C,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAK;IACxC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAK;gBAGrC,MAAM,EAAE,iBAAiB,EACzB,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,QAAQ,EACd,YAAY,CAAC,EAAE,MAAM,EACrB,QAAQ,CAAC,EAAE,QAAQ,EACnB,sBAAsB,CAAC,EAAE,oBAAoB;IA4E/C;;OAEG;IACH,OAAO,CAAC,YAAY;CAMrB"}
1
+ {"version":3,"file":"mastra-span.d.ts","sourceRoot":"","sources":["../src/mastra-span.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC9F,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE9E;;GAEG;AACH,qBAAa,kBAAmB,YAAW,YAAY;IACrD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,WAAW,CAAC;IACxC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,WAAW,CAAC;IACzC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,sBAAsB,EAAE,oBAAoB,CAAC;IACtD,QAAQ,CAAC,oBAAoB,EAAE,oBAAoB,CAAC;IACpD,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAK;IAC5C,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAK;IACxC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAK;gBAGrC,MAAM,EAAE,iBAAiB,EACzB,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,QAAQ,EACd,YAAY,CAAC,EAAE,MAAM,EACrB,QAAQ,CAAC,EAAE,QAAQ,EACnB,sBAAsB,CAAC,EAAE,oBAAoB;IAsF/C;;OAEG;IACH,OAAO,CAAC,YAAY;CAMrB"}
@@ -1 +1 @@
1
- {"version":3,"file":"span-converter.d.ts","sourceRoot":"","sources":["../src/span-converter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,iBAAiB,EAMlB,MAAM,yBAAyB,CAAC;AAKjC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAiBtD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,CAAW;IAC5B,OAAO,CAAC,sBAAsB,CAAuB;gBAEzC,QAAQ,CAAC,EAAE,QAAQ;IAQ/B;;;OAGG;IACH,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,kBAAkB;IAkB1D;;OAEG;IACH,OAAO,CAAC,WAAW;IAUnB;;OAEG;IACH,OAAO,CAAC,aAAa;IAsCrB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAuNvB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAkBxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAiB1B"}
1
+ {"version":3,"file":"span-converter.d.ts","sourceRoot":"","sources":["../src/span-converter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,iBAAiB,EAMlB,MAAM,yBAAyB,CAAC;AAKjC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAiBtD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,CAAW;IAC5B,OAAO,CAAC,sBAAsB,CAAuB;gBAEzC,QAAQ,CAAC,EAAE,QAAQ;IAQ/B;;;OAGG;IACH,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,kBAAkB;IAkB1D;;OAEG;IACH,OAAO,CAAC,WAAW;IAUnB;;OAEG;IACH,OAAO,CAAC,aAAa;IAsCrB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAwNvB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAkBxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAiB1B"}
package/dist/types.d.ts CHANGED
@@ -3,6 +3,7 @@
3
3
  */
4
4
  import type { AnyExportedAISpan } from '@mastra/core/ai-tracing';
5
5
  import type { DetectedResourceAttributes } from '@opentelemetry/resources';
6
+ import type { SpanExporter } from '@opentelemetry/sdk-trace-base';
6
7
  export type ExportProtocol = 'http/json' | 'http/protobuf' | 'grpc' | 'zipkin';
7
8
  export interface Dash0Config {
8
9
  apiKey?: string;
@@ -52,6 +53,7 @@ export interface OtelExporterConfig {
52
53
  batchSize?: number;
53
54
  logLevel?: 'debug' | 'info' | 'warn' | 'error';
54
55
  resourceAttributes?: DetectedResourceAttributes;
56
+ exporter?: SpanExporter;
55
57
  }
56
58
  export interface SpanData {
57
59
  span: AnyExportedAISpan;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAE3E,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,eAAe,GAAG,MAAM,GAAG,QAAQ,CAAC;AAM/E,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAGD,MAAM,MAAM,cAAc,GACtB;IAAE,KAAK,EAAE,WAAW,CAAA;CAAE,GACtB;IAAE,MAAM,EAAE,YAAY,CAAA;CAAE,GACxB;IAAE,QAAQ,EAAE,cAAc,CAAA;CAAE,GAC5B;IAAE,SAAS,EAAE,eAAe,CAAA;CAAE,GAC9B;IAAE,OAAO,EAAE,aAAa,CAAA;CAAE,GAC1B;IAAE,MAAM,EAAE,YAAY,CAAA;CAAE,CAAC;AAE7B,MAAM,WAAW,kBAAkB;IAEjC,QAAQ,CAAC,EAAE,cAAc,CAAC;IAG1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IAGnB,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAG/C,kBAAkB,CAAC,EAAE,0BAA0B,CAAC;CACjD;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,iBAAiB,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,OAAO,CAAC;CACzB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAElE,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,eAAe,GAAG,MAAM,GAAG,QAAQ,CAAC;AAM/E,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAGD,MAAM,MAAM,cAAc,GACtB;IAAE,KAAK,EAAE,WAAW,CAAA;CAAE,GACtB;IAAE,MAAM,EAAE,YAAY,CAAA;CAAE,GACxB;IAAE,QAAQ,EAAE,cAAc,CAAA;CAAE,GAC5B;IAAE,SAAS,EAAE,eAAe,CAAA;CAAE,GAC9B;IAAE,OAAO,EAAE,aAAa,CAAA;CAAE,GAC1B;IAAE,MAAM,EAAE,YAAY,CAAA;CAAE,CAAC;AAE7B,MAAM,WAAW,kBAAkB;IAEjC,QAAQ,CAAC,EAAE,cAAc,CAAC;IAG1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IAGnB,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAG/C,kBAAkB,CAAC,EAAE,0BAA0B,CAAC;IAGhD,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,iBAAiB,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,OAAO,CAAC;CACzB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mastra/otel-exporter",
3
- "version": "0.0.0-error-handler-fix-20251020202607",
3
+ "version": "0.0.0-extract-tool-ui-inp-playground-ui-20251024041825",
4
4
  "description": "OpenTelemetry observability exporter for Mastra - supports OTLP, Zipkin, and multiple cloud providers",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -45,9 +45,9 @@
45
45
  "tsup": "^8.5.0",
46
46
  "typescript": "^5.8.3",
47
47
  "vitest": "^3.2.4",
48
- "@internal/lint": "0.0.0-error-handler-fix-20251020202607",
49
- "@mastra/core": "0.0.0-error-handler-fix-20251020202607",
50
- "@internal/types-builder": "0.0.0-error-handler-fix-20251020202607"
48
+ "@internal/lint": "0.0.0-extract-tool-ui-inp-playground-ui-20251024041825",
49
+ "@internal/types-builder": "0.0.0-extract-tool-ui-inp-playground-ui-20251024041825",
50
+ "@mastra/core": "0.0.0-extract-tool-ui-inp-playground-ui-20251024041825"
51
51
  },
52
52
  "peerDependencies": {
53
53
  "@grpc/grpc-js": "^1.13.4",
@@ -55,7 +55,7 @@
55
55
  "@opentelemetry/exporter-trace-otlp-grpc": "^0.205.0",
56
56
  "@opentelemetry/exporter-trace-otlp-proto": "^0.205.0",
57
57
  "@opentelemetry/exporter-zipkin": "^2.1.0",
58
- "@mastra/core": "0.0.0-error-handler-fix-20251020202607"
58
+ "@mastra/core": "0.0.0-extract-tool-ui-inp-playground-ui-20251024041825"
59
59
  },
60
60
  "peerDependenciesMeta": {
61
61
  "@grpc/grpc-js": {