@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 +79 -3
- package/README.md +2 -2
- package/dist/ai-tracing.d.ts +2 -0
- package/dist/ai-tracing.d.ts.map +1 -1
- package/dist/index.cjs +63 -41
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +63 -41
- package/dist/index.js.map +1 -1
- package/dist/mastra-span.d.ts +1 -0
- package/dist/mastra-span.d.ts.map +1 -1
- package/dist/span-converter.d.ts.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +5 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,11 +1,87 @@
|
|
|
1
1
|
# @mastra/otel-exporter
|
|
2
2
|
|
|
3
|
-
## 0.0.0-
|
|
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
|
-
-
|
|
8
|
-
|
|
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
|
|
386
|
-
- `gen_ai.completion` - Model output (for
|
|
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
|
|
package/dist/ai-tracing.d.ts
CHANGED
|
@@ -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>;
|
package/dist/ai-tracing.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
-
//
|
|
300
|
-
[aiTracing.AISpanType.
|
|
301
|
-
[aiTracing.AISpanType.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
414
|
-
const
|
|
415
|
-
if (
|
|
416
|
-
attributes["gen_ai.request.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 (
|
|
419
|
-
attributes["gen_ai.system"] =
|
|
427
|
+
if (modelAttrs.provider) {
|
|
428
|
+
attributes["gen_ai.system"] = modelAttrs.provider;
|
|
420
429
|
}
|
|
421
|
-
if (
|
|
422
|
-
const inputTokens =
|
|
423
|
-
const outputTokens =
|
|
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 (
|
|
431
|
-
attributes["gen_ai.usage.total_tokens"] =
|
|
439
|
+
if (modelAttrs.usage.totalTokens !== void 0) {
|
|
440
|
+
attributes["gen_ai.usage.total_tokens"] = modelAttrs.usage.totalTokens;
|
|
432
441
|
}
|
|
433
|
-
if (
|
|
434
|
-
attributes["gen_ai.usage.reasoning_tokens"] =
|
|
442
|
+
if (modelAttrs.usage.reasoningTokens !== void 0) {
|
|
443
|
+
attributes["gen_ai.usage.reasoning_tokens"] = modelAttrs.usage.reasoningTokens;
|
|
435
444
|
}
|
|
436
|
-
if (
|
|
437
|
-
attributes["gen_ai.usage.cached_input_tokens"] =
|
|
445
|
+
if (modelAttrs.usage.cachedInputTokens !== void 0) {
|
|
446
|
+
attributes["gen_ai.usage.cached_input_tokens"] = modelAttrs.usage.cachedInputTokens;
|
|
438
447
|
}
|
|
439
448
|
}
|
|
440
|
-
if (
|
|
441
|
-
if (
|
|
442
|
-
attributes["gen_ai.request.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 (
|
|
445
|
-
attributes["gen_ai.request.max_tokens"] =
|
|
453
|
+
if (modelAttrs.parameters.maxOutputTokens !== void 0) {
|
|
454
|
+
attributes["gen_ai.request.max_tokens"] = modelAttrs.parameters.maxOutputTokens;
|
|
446
455
|
}
|
|
447
|
-
if (
|
|
448
|
-
attributes["gen_ai.request.top_p"] =
|
|
456
|
+
if (modelAttrs.parameters.topP !== void 0) {
|
|
457
|
+
attributes["gen_ai.request.top_p"] = modelAttrs.parameters.topP;
|
|
449
458
|
}
|
|
450
|
-
if (
|
|
451
|
-
attributes["gen_ai.request.top_k"] =
|
|
459
|
+
if (modelAttrs.parameters.topK !== void 0) {
|
|
460
|
+
attributes["gen_ai.request.top_k"] = modelAttrs.parameters.topK;
|
|
452
461
|
}
|
|
453
|
-
if (
|
|
454
|
-
attributes["gen_ai.request.presence_penalty"] =
|
|
462
|
+
if (modelAttrs.parameters.presencePenalty !== void 0) {
|
|
463
|
+
attributes["gen_ai.request.presence_penalty"] = modelAttrs.parameters.presencePenalty;
|
|
455
464
|
}
|
|
456
|
-
if (
|
|
457
|
-
attributes["gen_ai.request.frequency_penalty"] =
|
|
465
|
+
if (modelAttrs.parameters.frequencyPenalty !== void 0) {
|
|
466
|
+
attributes["gen_ai.request.frequency_penalty"] = modelAttrs.parameters.frequencyPenalty;
|
|
458
467
|
}
|
|
459
|
-
if (
|
|
460
|
-
attributes["gen_ai.request.stop_sequences"] = JSON.stringify(
|
|
468
|
+
if (modelAttrs.parameters.stopSequences) {
|
|
469
|
+
attributes["gen_ai.request.stop_sequences"] = JSON.stringify(modelAttrs.parameters.stopSequences);
|
|
461
470
|
}
|
|
462
471
|
}
|
|
463
|
-
if (
|
|
464
|
-
attributes["gen_ai.response.finish_reasons"] =
|
|
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.
|
|
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.
|
|
745
|
+
await this.setup();
|
|
724
746
|
}
|
|
725
747
|
if (this.isDisabled || !this.processor) {
|
|
726
748
|
return;
|
package/dist/index.cjs.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":["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
|
-
//
|
|
298
|
-
[AISpanType.
|
|
299
|
-
[AISpanType.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
412
|
-
const
|
|
413
|
-
if (
|
|
414
|
-
attributes["gen_ai.request.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 (
|
|
417
|
-
attributes["gen_ai.system"] =
|
|
425
|
+
if (modelAttrs.provider) {
|
|
426
|
+
attributes["gen_ai.system"] = modelAttrs.provider;
|
|
418
427
|
}
|
|
419
|
-
if (
|
|
420
|
-
const inputTokens =
|
|
421
|
-
const outputTokens =
|
|
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 (
|
|
429
|
-
attributes["gen_ai.usage.total_tokens"] =
|
|
437
|
+
if (modelAttrs.usage.totalTokens !== void 0) {
|
|
438
|
+
attributes["gen_ai.usage.total_tokens"] = modelAttrs.usage.totalTokens;
|
|
430
439
|
}
|
|
431
|
-
if (
|
|
432
|
-
attributes["gen_ai.usage.reasoning_tokens"] =
|
|
440
|
+
if (modelAttrs.usage.reasoningTokens !== void 0) {
|
|
441
|
+
attributes["gen_ai.usage.reasoning_tokens"] = modelAttrs.usage.reasoningTokens;
|
|
433
442
|
}
|
|
434
|
-
if (
|
|
435
|
-
attributes["gen_ai.usage.cached_input_tokens"] =
|
|
443
|
+
if (modelAttrs.usage.cachedInputTokens !== void 0) {
|
|
444
|
+
attributes["gen_ai.usage.cached_input_tokens"] = modelAttrs.usage.cachedInputTokens;
|
|
436
445
|
}
|
|
437
446
|
}
|
|
438
|
-
if (
|
|
439
|
-
if (
|
|
440
|
-
attributes["gen_ai.request.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 (
|
|
443
|
-
attributes["gen_ai.request.max_tokens"] =
|
|
451
|
+
if (modelAttrs.parameters.maxOutputTokens !== void 0) {
|
|
452
|
+
attributes["gen_ai.request.max_tokens"] = modelAttrs.parameters.maxOutputTokens;
|
|
444
453
|
}
|
|
445
|
-
if (
|
|
446
|
-
attributes["gen_ai.request.top_p"] =
|
|
454
|
+
if (modelAttrs.parameters.topP !== void 0) {
|
|
455
|
+
attributes["gen_ai.request.top_p"] = modelAttrs.parameters.topP;
|
|
447
456
|
}
|
|
448
|
-
if (
|
|
449
|
-
attributes["gen_ai.request.top_k"] =
|
|
457
|
+
if (modelAttrs.parameters.topK !== void 0) {
|
|
458
|
+
attributes["gen_ai.request.top_k"] = modelAttrs.parameters.topK;
|
|
450
459
|
}
|
|
451
|
-
if (
|
|
452
|
-
attributes["gen_ai.request.presence_penalty"] =
|
|
460
|
+
if (modelAttrs.parameters.presencePenalty !== void 0) {
|
|
461
|
+
attributes["gen_ai.request.presence_penalty"] = modelAttrs.parameters.presencePenalty;
|
|
453
462
|
}
|
|
454
|
-
if (
|
|
455
|
-
attributes["gen_ai.request.frequency_penalty"] =
|
|
463
|
+
if (modelAttrs.parameters.frequencyPenalty !== void 0) {
|
|
464
|
+
attributes["gen_ai.request.frequency_penalty"] = modelAttrs.parameters.frequencyPenalty;
|
|
456
465
|
}
|
|
457
|
-
if (
|
|
458
|
-
attributes["gen_ai.request.stop_sequences"] = JSON.stringify(
|
|
466
|
+
if (modelAttrs.parameters.stopSequences) {
|
|
467
|
+
attributes["gen_ai.request.stop_sequences"] = JSON.stringify(modelAttrs.parameters.stopSequences);
|
|
459
468
|
}
|
|
460
469
|
}
|
|
461
|
-
if (
|
|
462
|
-
attributes["gen_ai.response.finish_reasons"] =
|
|
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.
|
|
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.
|
|
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"]}
|
package/dist/mastra-span.d.ts
CHANGED
|
@@ -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;
|
|
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;
|
|
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;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -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;
|
|
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-
|
|
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-
|
|
49
|
-
"@
|
|
50
|
-
"@
|
|
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-
|
|
58
|
+
"@mastra/core": "0.0.0-extract-tool-ui-inp-playground-ui-20251024041825"
|
|
59
59
|
},
|
|
60
60
|
"peerDependenciesMeta": {
|
|
61
61
|
"@grpc/grpc-js": {
|