@mastra/otel-exporter 0.0.0-fix-runtimeContext-passing-chatRoute-20251008220150 → 0.0.0-fix-core-reasoning-parts-20251015155834

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,13 +1,64 @@
1
1
  # @mastra/otel-exporter
2
2
 
3
- ## 0.0.0-fix-runtimeContext-passing-chatRoute-20251008220150
3
+ ## 0.0.0-fix-core-reasoning-parts-20251015155834
4
4
 
5
5
  ### Patch Changes
6
6
 
7
+ - Updated dependencies [[`3802c02`](https://github.com/mastra-ai/mastra/commit/3802c02d1eadde15aaf5d10a2a37cd40371fef89)]:
8
+ - @mastra/core@0.0.0-fix-core-reasoning-parts-20251015155834
9
+
10
+ ## 0.1.0
11
+
12
+ ### Minor Changes
13
+
14
+ - Update peer dependencies to match core package version bump (0.21.0) ([#8623](https://github.com/mastra-ai/mastra/pull/8623))
15
+
16
+ ### Patch Changes
17
+
18
+ - Update peer dependencies to match core package version bump (0.21.0) ([#8619](https://github.com/mastra-ai/mastra/pull/8619))
19
+
20
+ - Added tracing of input & output processors (this includes using structuredOutput) ([#8623](https://github.com/mastra-ai/mastra/pull/8623))
21
+
22
+ - Add `resourceAttributes` to `OtelExporterConfig` so that attributes like `deployment.environment` can be set in the new OpenTelemetry exporter. ([#8700](https://github.com/mastra-ai/mastra/pull/8700))
23
+
24
+ - Update peer dependencies to match core package version bump (0.21.0) ([#8557](https://github.com/mastra-ai/mastra/pull/8557))
25
+
26
+ - Update peer dependencies to match core package version bump (0.21.0) ([#8626](https://github.com/mastra-ai/mastra/pull/8626))
27
+
28
+ - Update peer dependencies to match core package version bump (0.21.0) ([#8686](https://github.com/mastra-ai/mastra/pull/8686))
29
+
30
+ - Updated dependencies [[`1ed9670`](https://github.com/mastra-ai/mastra/commit/1ed9670d3ca50cb60dc2e517738c5eef3968ed27), [`b5a66b7`](https://github.com/mastra-ai/mastra/commit/b5a66b748a14fc8b3f63b04642ddb9621fbcc9e0), [`f59fc1e`](https://github.com/mastra-ai/mastra/commit/f59fc1e406b8912e692f6bff6cfd4754cc8d165c), [`158381d`](https://github.com/mastra-ai/mastra/commit/158381d39335be934b81ef8a1947bccace492c25), [`a1799bc`](https://github.com/mastra-ai/mastra/commit/a1799bcc1b5a1cdc188f2ac0165f17a1c4ac6f7b), [`6ff6094`](https://github.com/mastra-ai/mastra/commit/6ff60946f4ecfebdeef6e21d2b230c2204f2c9b8), [`fb703b9`](https://github.com/mastra-ai/mastra/commit/fb703b9634eeaff1a6eb2b5531ce0f9e8fb04727), [`37a2314`](https://github.com/mastra-ai/mastra/commit/37a23148e0e5a3b40d4f9f098b194671a8a49faf), [`7b1ef57`](https://github.com/mastra-ai/mastra/commit/7b1ef57fc071c2aa2a2e32905b18cd88719c5a39), [`05a9dee`](https://github.com/mastra-ai/mastra/commit/05a9dee3d355694d28847bfffb6289657fcf7dfa), [`e3c1077`](https://github.com/mastra-ai/mastra/commit/e3c107763aedd1643d3def5df450c235da9ff76c), [`1908ca0`](https://github.com/mastra-ai/mastra/commit/1908ca0521f90e43779cc29ab590173ca560443c), [`1bccdb3`](https://github.com/mastra-ai/mastra/commit/1bccdb33eb90cbeba2dc5ece1c2561fb774b26b6), [`5ef944a`](https://github.com/mastra-ai/mastra/commit/5ef944a3721d93105675cac2b2311432ff8cc393), [`d6b186f`](https://github.com/mastra-ai/mastra/commit/d6b186fb08f1caf1b86f73d3a5ee88fb999ca3be), [`ee68e82`](https://github.com/mastra-ai/mastra/commit/ee68e8289ea4408d29849e899bc6e78b3bd4e843), [`228228b`](https://github.com/mastra-ai/mastra/commit/228228b0b1de9291cb8887587f5cea1a8757ebad), [`ea33930`](https://github.com/mastra-ai/mastra/commit/ea339301e82d6318257720d811b043014ee44064), [`65493b3`](https://github.com/mastra-ai/mastra/commit/65493b31c36f6fdb78f9679f7e1ecf0c250aa5ee), [`a998b8f`](https://github.com/mastra-ai/mastra/commit/a998b8f858091c2ec47683e60766cf12d03001e4), [`b5a66b7`](https://github.com/mastra-ai/mastra/commit/b5a66b748a14fc8b3f63b04642ddb9621fbcc9e0), [`8a37bdd`](https://github.com/mastra-ai/mastra/commit/8a37bddb6d8614a32c5b70303d583d80c620ea61), [`135d6f2`](https://github.com/mastra-ai/mastra/commit/135d6f22a326ed1dffff858700669dff09d2c9eb)]:
31
+ - @mastra/core@0.21.0
32
+
33
+ ## 0.1.0-alpha.1
34
+
35
+ ### Minor Changes
36
+
37
+ - Update peer dependencies to match core package version bump (0.21.0) ([#8623](https://github.com/mastra-ai/mastra/pull/8623))
38
+
39
+ ### Patch Changes
40
+
41
+ - Added tracing of input & output processors (this includes using structuredOutput) ([#8623](https://github.com/mastra-ai/mastra/pull/8623))
42
+
43
+ - Add `resourceAttributes` to `OtelExporterConfig` so that attributes like `deployment.environment` can be set in the new OpenTelemetry exporter. ([#8700](https://github.com/mastra-ai/mastra/pull/8700))
44
+
45
+ - Updated dependencies [[`1ed9670`](https://github.com/mastra-ai/mastra/commit/1ed9670d3ca50cb60dc2e517738c5eef3968ed27), [`158381d`](https://github.com/mastra-ai/mastra/commit/158381d39335be934b81ef8a1947bccace492c25), [`fb703b9`](https://github.com/mastra-ai/mastra/commit/fb703b9634eeaff1a6eb2b5531ce0f9e8fb04727), [`37a2314`](https://github.com/mastra-ai/mastra/commit/37a23148e0e5a3b40d4f9f098b194671a8a49faf), [`05a9dee`](https://github.com/mastra-ai/mastra/commit/05a9dee3d355694d28847bfffb6289657fcf7dfa), [`e3c1077`](https://github.com/mastra-ai/mastra/commit/e3c107763aedd1643d3def5df450c235da9ff76c), [`1bccdb3`](https://github.com/mastra-ai/mastra/commit/1bccdb33eb90cbeba2dc5ece1c2561fb774b26b6), [`5ef944a`](https://github.com/mastra-ai/mastra/commit/5ef944a3721d93105675cac2b2311432ff8cc393), [`d6b186f`](https://github.com/mastra-ai/mastra/commit/d6b186fb08f1caf1b86f73d3a5ee88fb999ca3be), [`65493b3`](https://github.com/mastra-ai/mastra/commit/65493b31c36f6fdb78f9679f7e1ecf0c250aa5ee), [`a998b8f`](https://github.com/mastra-ai/mastra/commit/a998b8f858091c2ec47683e60766cf12d03001e4), [`8a37bdd`](https://github.com/mastra-ai/mastra/commit/8a37bddb6d8614a32c5b70303d583d80c620ea61)]:
46
+ - @mastra/core@0.21.0-alpha.1
47
+
48
+ ## 0.0.4-alpha.0
49
+
50
+ ### Patch Changes
51
+
52
+ - Update peer dependencies to match core package version bump (0.21.0) ([#8619](https://github.com/mastra-ai/mastra/pull/8619))
53
+
54
+ - Update peer dependencies to match core package version bump (0.21.0) ([#8557](https://github.com/mastra-ai/mastra/pull/8557))
55
+
7
56
  - Update peer dependencies to match core package version bump (0.21.0) ([#8626](https://github.com/mastra-ai/mastra/pull/8626))
8
57
 
9
- - Updated dependencies [[`b5a66b7`](https://github.com/mastra-ai/mastra/commit/b5a66b748a14fc8b3f63b04642ddb9621fbcc9e0), [`b5a66b7`](https://github.com/mastra-ai/mastra/commit/b5a66b748a14fc8b3f63b04642ddb9621fbcc9e0)]:
10
- - @mastra/core@0.0.0-fix-runtimeContext-passing-chatRoute-20251008220150
58
+ - Update peer dependencies to match core package version bump (0.21.0) ([#8686](https://github.com/mastra-ai/mastra/pull/8686))
59
+
60
+ - Updated dependencies [[`b5a66b7`](https://github.com/mastra-ai/mastra/commit/b5a66b748a14fc8b3f63b04642ddb9621fbcc9e0), [`7b1ef57`](https://github.com/mastra-ai/mastra/commit/7b1ef57fc071c2aa2a2e32905b18cd88719c5a39), [`ee68e82`](https://github.com/mastra-ai/mastra/commit/ee68e8289ea4408d29849e899bc6e78b3bd4e843), [`228228b`](https://github.com/mastra-ai/mastra/commit/228228b0b1de9291cb8887587f5cea1a8757ebad), [`ea33930`](https://github.com/mastra-ai/mastra/commit/ea339301e82d6318257720d811b043014ee44064), [`b5a66b7`](https://github.com/mastra-ai/mastra/commit/b5a66b748a14fc8b3f63b04642ddb9621fbcc9e0), [`135d6f2`](https://github.com/mastra-ai/mastra/commit/135d6f22a326ed1dffff858700669dff09d2c9eb), [`59d036d`](https://github.com/mastra-ai/mastra/commit/59d036d4c2706b430b0e3f1f1e0ee853ce16ca04)]:
61
+ - @mastra/core@0.21.0-alpha.0
11
62
 
12
63
  ## 0.0.3
13
64
 
@@ -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;IAiHrB,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;YAgBzC,UAAU;IA8BlB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAMhC"}
1
+ {"version":3,"file":"ai-tracing.d.ts","sourceRoot":"","sources":["../src/ai-tracing.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAqB,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAiBnH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,qBAAa,YAAa,YAAW,iBAAiB;IACpD,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,SAAS,CAAC,CAAqB;IACvC,OAAO,CAAC,QAAQ,CAAC,CAAe;IAChC,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,MAAM,CAAgB;IAE9B,IAAI,SAAmB;gBAEX,MAAM,EAAE,kBAAkB;IAWtC;;OAEG;IACH,IAAI,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;YAInB,aAAa;IAwHrB,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
@@ -299,21 +299,11 @@ var SPAN_KIND_MAPPING = {
299
299
  // LLM operations are CLIENT spans (calling external AI services)
300
300
  [aiTracing.AISpanType.LLM_GENERATION]: api.SpanKind.CLIENT,
301
301
  [aiTracing.AISpanType.LLM_CHUNK]: api.SpanKind.CLIENT,
302
- // Tool calls can be CLIENT (external) or INTERNAL based on context
303
- [aiTracing.AISpanType.TOOL_CALL]: api.SpanKind.INTERNAL,
302
+ // MCP tool calls are CLIENT (external service calls)
304
303
  [aiTracing.AISpanType.MCP_TOOL_CALL]: api.SpanKind.CLIENT,
305
304
  // Root spans for agent/workflow are SERVER (entry points)
306
305
  [aiTracing.AISpanType.AGENT_RUN]: api.SpanKind.SERVER,
307
- [aiTracing.AISpanType.WORKFLOW_RUN]: api.SpanKind.SERVER,
308
- // Internal workflow operations
309
- [aiTracing.AISpanType.WORKFLOW_STEP]: api.SpanKind.INTERNAL,
310
- [aiTracing.AISpanType.WORKFLOW_LOOP]: api.SpanKind.INTERNAL,
311
- [aiTracing.AISpanType.WORKFLOW_PARALLEL]: api.SpanKind.INTERNAL,
312
- [aiTracing.AISpanType.WORKFLOW_CONDITIONAL]: api.SpanKind.INTERNAL,
313
- [aiTracing.AISpanType.WORKFLOW_CONDITIONAL_EVAL]: api.SpanKind.INTERNAL,
314
- [aiTracing.AISpanType.WORKFLOW_SLEEP]: api.SpanKind.INTERNAL,
315
- [aiTracing.AISpanType.WORKFLOW_WAIT_EVENT]: api.SpanKind.INTERNAL,
316
- [aiTracing.AISpanType.GENERIC]: api.SpanKind.INTERNAL
306
+ [aiTracing.AISpanType.WORKFLOW_RUN]: api.SpanKind.SERVER
317
307
  };
318
308
  var SpanConverter = class {
319
309
  resource;
@@ -688,7 +678,7 @@ var OtelExporter = class {
688
678
  this.isSetup = true;
689
679
  return;
690
680
  }
691
- const resource = resources.resourceFromAttributes({
681
+ let resource = resources.resourceFromAttributes({
692
682
  [semanticConventions.ATTR_SERVICE_NAME]: this.tracingConfig?.serviceName || "mastra-service",
693
683
  [semanticConventions.ATTR_SERVICE_VERSION]: "1.0.0",
694
684
  // Add telemetry SDK information
@@ -696,6 +686,12 @@ var OtelExporter = class {
696
686
  [semanticConventions.ATTR_TELEMETRY_SDK_VERSION]: "1.0.0",
697
687
  [semanticConventions.ATTR_TELEMETRY_SDK_LANGUAGE]: "nodejs"
698
688
  });
689
+ if (this.config.resourceAttributes) {
690
+ resource = resource.merge(
691
+ // Duplicate attributes from config will override defaults above
692
+ resources.resourceFromAttributes(this.config.resourceAttributes)
693
+ );
694
+ }
699
695
  this.spanConverter = new SpanConverter(resource);
700
696
  this.processor = new sdkTraceBase.BatchSpanProcessor(this.exporter, {
701
697
  maxExportBatchSize: this.config.batchSize || 512,
@@ -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\nconst SPAN_KIND_MAPPING: 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 // Tool calls can be CLIENT (external) or INTERNAL based on context\n [AISpanType.TOOL_CALL]: SpanKind.INTERNAL,\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 // Internal workflow operations\n [AISpanType.WORKFLOW_STEP]: SpanKind.INTERNAL,\n [AISpanType.WORKFLOW_LOOP]: SpanKind.INTERNAL,\n [AISpanType.WORKFLOW_PARALLEL]: SpanKind.INTERNAL,\n [AISpanType.WORKFLOW_CONDITIONAL]: SpanKind.INTERNAL,\n [AISpanType.WORKFLOW_CONDITIONAL_EVAL]: SpanKind.INTERNAL,\n [AISpanType.WORKFLOW_SLEEP]: SpanKind.INTERNAL,\n [AISpanType.WORKFLOW_WAIT_EVENT]: SpanKind.INTERNAL,\n [AISpanType.GENERIC]: SpanKind.INTERNAL,\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 const 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 // 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 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"]}
package/dist/index.js CHANGED
@@ -297,21 +297,11 @@ var SPAN_KIND_MAPPING = {
297
297
  // LLM operations are CLIENT spans (calling external AI services)
298
298
  [AISpanType.LLM_GENERATION]: SpanKind.CLIENT,
299
299
  [AISpanType.LLM_CHUNK]: SpanKind.CLIENT,
300
- // Tool calls can be CLIENT (external) or INTERNAL based on context
301
- [AISpanType.TOOL_CALL]: SpanKind.INTERNAL,
300
+ // MCP tool calls are CLIENT (external service calls)
302
301
  [AISpanType.MCP_TOOL_CALL]: SpanKind.CLIENT,
303
302
  // Root spans for agent/workflow are SERVER (entry points)
304
303
  [AISpanType.AGENT_RUN]: SpanKind.SERVER,
305
- [AISpanType.WORKFLOW_RUN]: SpanKind.SERVER,
306
- // Internal workflow operations
307
- [AISpanType.WORKFLOW_STEP]: SpanKind.INTERNAL,
308
- [AISpanType.WORKFLOW_LOOP]: SpanKind.INTERNAL,
309
- [AISpanType.WORKFLOW_PARALLEL]: SpanKind.INTERNAL,
310
- [AISpanType.WORKFLOW_CONDITIONAL]: SpanKind.INTERNAL,
311
- [AISpanType.WORKFLOW_CONDITIONAL_EVAL]: SpanKind.INTERNAL,
312
- [AISpanType.WORKFLOW_SLEEP]: SpanKind.INTERNAL,
313
- [AISpanType.WORKFLOW_WAIT_EVENT]: SpanKind.INTERNAL,
314
- [AISpanType.GENERIC]: SpanKind.INTERNAL
304
+ [AISpanType.WORKFLOW_RUN]: SpanKind.SERVER
315
305
  };
316
306
  var SpanConverter = class {
317
307
  resource;
@@ -686,7 +676,7 @@ var OtelExporter = class {
686
676
  this.isSetup = true;
687
677
  return;
688
678
  }
689
- const resource = resourceFromAttributes({
679
+ let resource = resourceFromAttributes({
690
680
  [ATTR_SERVICE_NAME]: this.tracingConfig?.serviceName || "mastra-service",
691
681
  [ATTR_SERVICE_VERSION]: "1.0.0",
692
682
  // Add telemetry SDK information
@@ -694,6 +684,12 @@ var OtelExporter = class {
694
684
  [ATTR_TELEMETRY_SDK_VERSION]: "1.0.0",
695
685
  [ATTR_TELEMETRY_SDK_LANGUAGE]: "nodejs"
696
686
  });
687
+ if (this.config.resourceAttributes) {
688
+ resource = resource.merge(
689
+ // Duplicate attributes from config will override defaults above
690
+ resourceFromAttributes(this.config.resourceAttributes)
691
+ );
692
+ }
697
693
  this.spanConverter = new SpanConverter(resource);
698
694
  this.processor = new BatchSpanProcessor(this.exporter, {
699
695
  maxExportBatchSize: this.config.batchSize || 512,
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\nconst SPAN_KIND_MAPPING: 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 // Tool calls can be CLIENT (external) or INTERNAL based on context\n [AISpanType.TOOL_CALL]: SpanKind.INTERNAL,\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 // Internal workflow operations\n [AISpanType.WORKFLOW_STEP]: SpanKind.INTERNAL,\n [AISpanType.WORKFLOW_LOOP]: SpanKind.INTERNAL,\n [AISpanType.WORKFLOW_PARALLEL]: SpanKind.INTERNAL,\n [AISpanType.WORKFLOW_CONDITIONAL]: SpanKind.INTERNAL,\n [AISpanType.WORKFLOW_CONDITIONAL_EVAL]: SpanKind.INTERNAL,\n [AISpanType.WORKFLOW_SLEEP]: SpanKind.INTERNAL,\n [AISpanType.WORKFLOW_WAIT_EVENT]: SpanKind.INTERNAL,\n [AISpanType.GENERIC]: SpanKind.INTERNAL,\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 const 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 // 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 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 +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;AA2BtD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,CAAW;IAC5B,OAAO,CAAC,sBAAsB,CAAuB;gBAEzC,QAAQ,CAAC,EAAE,QAAQ;IAQ/B;;;OAGG;IACH,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,kBAAkB;IAkB1D;;OAEG;IACH,OAAO,CAAC,WAAW;IAUnB;;OAEG;IACH,OAAO,CAAC,aAAa;IAsCrB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAuNvB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAkBxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAiB1B"}
1
+ {"version":3,"file":"span-converter.d.ts","sourceRoot":"","sources":["../src/span-converter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,iBAAiB,EAMlB,MAAM,yBAAyB,CAAC;AAKjC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAiBtD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,CAAW;IAC5B,OAAO,CAAC,sBAAsB,CAAuB;gBAEzC,QAAQ,CAAC,EAAE,QAAQ;IAQ/B;;;OAGG;IACH,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,kBAAkB;IAkB1D;;OAEG;IACH,OAAO,CAAC,WAAW;IAUnB;;OAEG;IACH,OAAO,CAAC,aAAa;IAsCrB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAuNvB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAkBxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAiB1B"}
package/dist/types.d.ts CHANGED
@@ -2,6 +2,7 @@
2
2
  * OtelExporter Types
3
3
  */
4
4
  import type { AnyExportedAISpan } from '@mastra/core/ai-tracing';
5
+ import type { DetectedResourceAttributes } from '@opentelemetry/resources';
5
6
  export type ExportProtocol = 'http/json' | 'http/protobuf' | 'grpc' | 'zipkin';
6
7
  export interface Dash0Config {
7
8
  apiKey?: string;
@@ -50,6 +51,7 @@ export interface OtelExporterConfig {
50
51
  timeout?: number;
51
52
  batchSize?: number;
52
53
  logLevel?: 'debug' | 'info' | 'warn' | 'error';
54
+ resourceAttributes?: DetectedResourceAttributes;
53
55
  }
54
56
  export interface SpanData {
55
57
  span: AnyExportedAISpan;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,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;CAChD;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,iBAAiB,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,OAAO,CAAC;CACzB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAE3E,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,eAAe,GAAG,MAAM,GAAG,QAAQ,CAAC;AAM/E,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAGD,MAAM,MAAM,cAAc,GACtB;IAAE,KAAK,EAAE,WAAW,CAAA;CAAE,GACtB;IAAE,MAAM,EAAE,YAAY,CAAA;CAAE,GACxB;IAAE,QAAQ,EAAE,cAAc,CAAA;CAAE,GAC5B;IAAE,SAAS,EAAE,eAAe,CAAA;CAAE,GAC9B;IAAE,OAAO,EAAE,aAAa,CAAA;CAAE,GAC1B;IAAE,MAAM,EAAE,YAAY,CAAA;CAAE,CAAC;AAE7B,MAAM,WAAW,kBAAkB;IAEjC,QAAQ,CAAC,EAAE,cAAc,CAAC;IAG1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IAGnB,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAG/C,kBAAkB,CAAC,EAAE,0BAA0B,CAAC;CACjD;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,iBAAiB,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,OAAO,CAAC;CACzB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mastra/otel-exporter",
3
- "version": "0.0.0-fix-runtimeContext-passing-chatRoute-20251008220150",
3
+ "version": "0.0.0-fix-core-reasoning-parts-20251015155834",
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-fix-runtimeContext-passing-chatRoute-20251008220150",
49
- "@internal/types-builder": "0.0.0-fix-runtimeContext-passing-chatRoute-20251008220150",
50
- "@mastra/core": "0.0.0-fix-runtimeContext-passing-chatRoute-20251008220150"
48
+ "@internal/lint": "0.0.0-fix-core-reasoning-parts-20251015155834",
49
+ "@mastra/core": "0.0.0-fix-core-reasoning-parts-20251015155834",
50
+ "@internal/types-builder": "0.0.0-fix-core-reasoning-parts-20251015155834"
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-fix-runtimeContext-passing-chatRoute-20251008220150"
58
+ "@mastra/core": "0.0.0-fix-core-reasoning-parts-20251015155834"
59
59
  },
60
60
  "peerDependenciesMeta": {
61
61
  "@grpc/grpc-js": {