@mastra/otel-exporter 1.0.0-beta.12 → 1.0.0-beta.13

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,5 +1,39 @@
1
1
  # @mastra/otel-exporter
2
2
 
3
+ ## 1.0.0-beta.13
4
+
5
+ ### Minor Changes
6
+
7
+ - Added `TrackingExporter` base class with improved handling for: ([#11870](https://github.com/mastra-ai/mastra/pull/11870))
8
+ - **Out-of-order span processing**: Spans that arrive before their parents are now queued and processed once dependencies are available
9
+ - **Delayed cleanup**: Trace data is retained briefly after spans end to handle late-arriving updates
10
+ - **Memory management**: Configurable limits on pending and total traces to prevent memory leaks
11
+
12
+ New configuration options on `TrackingExporterConfig`:
13
+ - `earlyQueueMaxAttempts` - Max retry attempts for queued events (default: 5)
14
+ - `earlyQueueTTLMs` - TTL for queued events in ms (default: 30000)
15
+ - `traceCleanupDelayMs` - Delay before cleaning up completed traces (default: 30000)
16
+ - `maxPendingCleanupTraces` - Soft cap on traces awaiting cleanup (default: 100)
17
+ - `maxTotalTraces` - Hard cap on total traces (default: 500)
18
+
19
+ Updated @mastra/braintrust, @mastra/langfuse, @mastra/langsmith, @mastra/posthog to use the new TrackingExporter
20
+
21
+ - Export getAttributes and getSpanName GenAI semantic convention helpers ([#11890](https://github.com/mastra-ai/mastra/pull/11890))
22
+
23
+ These functions were previously internal but are now exported to support:
24
+ - The new @mastra/sentry exporter which uses them for consistent attribute formatting
25
+ - Custom exporter implementations that want to follow GenAI semantic conventions
26
+
27
+ ### Patch Changes
28
+
29
+ - Fixed formatting of model_step, model_chunk, and tool_call spans in Arize Exporter. ([#11922](https://github.com/mastra-ai/mastra/pull/11922))
30
+
31
+ Also removed `tools` output from `model_step` spans for all exporters.
32
+
33
+ - Updated dependencies [[`ebae12a`](https://github.com/mastra-ai/mastra/commit/ebae12a2dd0212e75478981053b148a2c246962d), [`c61a0a5`](https://github.com/mastra-ai/mastra/commit/c61a0a5de4904c88fd8b3718bc26d1be1c2ec6e7), [`69136e7`](https://github.com/mastra-ai/mastra/commit/69136e748e32f57297728a4e0f9a75988462f1a7), [`449aed2`](https://github.com/mastra-ai/mastra/commit/449aed2ba9d507b75bf93d427646ea94f734dfd1), [`eb648a2`](https://github.com/mastra-ai/mastra/commit/eb648a2cc1728f7678768dd70cd77619b448dab9), [`0131105`](https://github.com/mastra-ai/mastra/commit/0131105532e83bdcbb73352fc7d0879eebf140dc), [`9d5059e`](https://github.com/mastra-ai/mastra/commit/9d5059eae810829935fb08e81a9bb7ecd5b144a7), [`ef756c6`](https://github.com/mastra-ai/mastra/commit/ef756c65f82d16531c43f49a27290a416611e526), [`b00ccd3`](https://github.com/mastra-ai/mastra/commit/b00ccd325ebd5d9e37e34dd0a105caae67eb568f), [`3bdfa75`](https://github.com/mastra-ai/mastra/commit/3bdfa7507a91db66f176ba8221aa28dd546e464a), [`e770de9`](https://github.com/mastra-ai/mastra/commit/e770de941a287a49b1964d44db5a5763d19890a6), [`52e2716`](https://github.com/mastra-ai/mastra/commit/52e2716b42df6eff443de72360ae83e86ec23993), [`27b4040`](https://github.com/mastra-ai/mastra/commit/27b4040bfa1a95d92546f420a02a626b1419a1d6), [`610a70b`](https://github.com/mastra-ai/mastra/commit/610a70bdad282079f0c630e0d7bb284578f20151), [`8dc7f55`](https://github.com/mastra-ai/mastra/commit/8dc7f55900395771da851dc7d78d53ae84fe34ec), [`8379099`](https://github.com/mastra-ai/mastra/commit/8379099fc467af6bef54dd7f80c9bd75bf8bbddf), [`b06be72`](https://github.com/mastra-ai/mastra/commit/b06be7223d5ef23edc98c01a67ef713c6cc039f9), [`8c0ec25`](https://github.com/mastra-ai/mastra/commit/8c0ec25646c8a7df253ed1e5ff4863a0d3f1316c), [`ff4d9a6`](https://github.com/mastra-ai/mastra/commit/ff4d9a6704fc87b31a380a76ed22736fdedbba5a), [`69821ef`](https://github.com/mastra-ai/mastra/commit/69821ef806482e2c44e2197ac0b050c3fe3a5285), [`1ed5716`](https://github.com/mastra-ai/mastra/commit/1ed5716830867b3774c4a1b43cc0d82935f32b96), [`4186bdd`](https://github.com/mastra-ai/mastra/commit/4186bdd00731305726fa06adba0b076a1d50b49f), [`7aaf973`](https://github.com/mastra-ai/mastra/commit/7aaf973f83fbbe9521f1f9e7a4fd99b8de464617)]:
34
+ - @mastra/core@1.0.0-beta.22
35
+ - @mastra/observability@1.0.0-beta.11
36
+
3
37
  ## 1.0.0-beta.12
4
38
 
5
39
  ### Minor Changes
@@ -16,7 +50,7 @@
16
50
  - SigNoz: `SIGNOZ_API_KEY`, `SIGNOZ_REGION`, `SIGNOZ_ENDPOINT`
17
51
  - New Relic: `NEW_RELIC_LICENSE_KEY`, `NEW_RELIC_ENDPOINT`
18
52
  - Traceloop: `TRACELOOP_API_KEY`, `TRACELOOP_DESTINATION_ID`, `TRACELOOP_ENDPOINT`
19
- - Laminar: `LMNR_PROJECT_API_KEY`, `LAMINAR_ENDPOINT`, `LAMINAR_TEAM_ID`
53
+ - Laminar: `LMNR_PROJECT_API_KEY`, `LAMINAR_ENDPOINT`
20
54
 
21
55
  Example usage:
22
56
 
package/README.md CHANGED
@@ -14,7 +14,7 @@ All providers support zero-config setup via environment variables. Set the appro
14
14
  | SigNoz | `SIGNOZ_API_KEY` (required), `SIGNOZ_REGION` (optional), `SIGNOZ_ENDPOINT` (optional) |
15
15
  | New Relic | `NEW_RELIC_LICENSE_KEY` (required), `NEW_RELIC_ENDPOINT` (optional) |
16
16
  | Traceloop | `TRACELOOP_API_KEY` (required), `TRACELOOP_DESTINATION_ID`, `TRACELOOP_ENDPOINT` (optional) |
17
- | Laminar | `LMNR_PROJECT_API_KEY` (required), `LAMINAR_ENDPOINT`, `LAMINAR_TEAM_ID` (optional) |
17
+ | Laminar | `LMNR_PROJECT_API_KEY` (required), `LAMINAR_ENDPOINT` (optional) |
18
18
 
19
19
  ## Supported Providers
20
20
 
@@ -236,7 +236,6 @@ LMNR_PROJECT_API_KEY=your-api-key
236
236
 
237
237
  # Optional
238
238
  LAMINAR_ENDPOINT=https://api.lmnr.ai/v1/traces
239
- LAMINAR_TEAM_ID=your-team-id # For backwards compatibility
240
239
  ```
241
240
 
242
241
  ```typescript
@@ -263,15 +262,12 @@ new OtelExporter({
263
262
  provider: {
264
263
  laminar: {
265
264
  apiKey: 'your-api-key',
266
- teamId: 'your-team-id', // Optional, for backwards compatibility
267
265
  endpoint: 'https://api.lmnr.ai/v1/traces', // Optional
268
266
  },
269
267
  },
270
268
  });
271
269
  ```
272
270
 
273
- **Note:** Laminar now only requires the `LMNR_PROJECT_API_KEY`. The `teamId` is optional.
274
-
275
271
  ### Zipkin
276
272
 
277
273
  #### Installation
package/dist/index.cjs CHANGED
@@ -201,7 +201,6 @@ function resolveTraceloopConfig(config) {
201
201
  }
202
202
  function resolveLaminarConfig(config) {
203
203
  const apiKey = config.apiKey ?? process.env.LMNR_PROJECT_API_KEY;
204
- const teamId = config.teamId ?? process.env.LAMINAR_TEAM_ID;
205
204
  const configEndpoint = config.endpoint ?? process.env.LAMINAR_ENDPOINT;
206
205
  if (!apiKey) {
207
206
  console.error(
@@ -213,9 +212,6 @@ function resolveLaminarConfig(config) {
213
212
  const headers = {
214
213
  Authorization: `Bearer ${apiKey}`
215
214
  };
216
- if (teamId) {
217
- headers["x-laminar-team-id"] = teamId;
218
- }
219
215
  return {
220
216
  endpoint,
221
217
  headers,
@@ -360,10 +356,10 @@ function getSpanIdentifier(span) {
360
356
  switch (span.type) {
361
357
  case observability.SpanType.MODEL_GENERATION: {
362
358
  const attrs = span.attributes;
363
- return attrs?.model ?? "unknown";
359
+ return attrs?.model;
364
360
  }
365
361
  default:
366
- return span.entityName ?? span.entityId ?? "unknown";
362
+ return span.entityName ?? span.entityId;
367
363
  }
368
364
  }
369
365
  function getSpanName(span) {
@@ -727,16 +723,15 @@ var OtelExporter = class extends observability$1.BaseExporter {
727
723
  async setupExporter() {
728
724
  if (this.isSetup || this.exporter) return;
729
725
  if (!this.config.provider) {
730
- this.logger.error(
726
+ this.setDisabled(
731
727
  '[OtelExporter] Provider configuration is required. Use the "custom" provider for generic endpoints.'
732
728
  );
733
- this.isDisabled = true;
734
729
  this.isSetup = true;
735
730
  return;
736
731
  }
737
732
  const resolved = resolveProviderConfig(this.config.provider);
738
733
  if (!resolved) {
739
- this.isDisabled = true;
734
+ this.setDisabled("[OtelExporter] Provider configuration validation failed.");
740
735
  this.isSetup = true;
741
736
  return;
742
737
  }
@@ -750,7 +745,7 @@ var OtelExporter = class extends observability$1.BaseExporter {
750
745
  const providerName = Object.keys(this.config.provider)[0];
751
746
  const ExporterClass = await loadExporter(protocol, providerName);
752
747
  if (!ExporterClass) {
753
- this.isDisabled = true;
748
+ this.setDisabled(`[OtelExporter] Exporter not available for protocol: ${protocol}`);
754
749
  this.isSetup = true;
755
750
  return;
756
751
  }
@@ -769,13 +764,11 @@ var OtelExporter = class extends observability$1.BaseExporter {
769
764
  metadata.set(key, value);
770
765
  });
771
766
  } catch (grpcError) {
772
- this.logger.error(
767
+ this.setDisabled(
773
768
  `[OtelExporter] Failed to load gRPC metadata. Install required packages:
774
- npm install @opentelemetry/exporter-trace-otlp-grpc @grpc/grpc-js
775
- `,
776
- grpcError
769
+ npm install @opentelemetry/exporter-trace-otlp-grpc @grpc/grpc-js`
777
770
  );
778
- this.isDisabled = true;
771
+ this.logger.error("[OtelExporter] gRPC error details:", grpcError);
779
772
  this.isSetup = true;
780
773
  return;
781
774
  }
@@ -792,8 +785,8 @@ var OtelExporter = class extends observability$1.BaseExporter {
792
785
  });
793
786
  }
794
787
  } catch (error) {
795
- this.logger.error(`[OtelExporter] Failed to create exporter:`, error);
796
- this.isDisabled = true;
788
+ this.setDisabled("[OtelExporter] Failed to create exporter.");
789
+ this.logger.error("[OtelExporter] Exporter creation error details:", error);
797
790
  this.isSetup = true;
798
791
  return;
799
792
  }
@@ -862,6 +855,8 @@ var OtelExporter = class extends observability$1.BaseExporter {
862
855
 
863
856
  exports.OtelExporter = OtelExporter;
864
857
  exports.SpanConverter = SpanConverter;
858
+ exports.getAttributes = getAttributes;
865
859
  exports.getSpanKind = getSpanKind;
860
+ exports.getSpanName = getSpanName;
866
861
  //# sourceMappingURL=index.cjs.map
867
862
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/loadExporter.ts","../src/provider-configs.ts","../src/gen-ai-messages.ts","../src/gen-ai-semantics.ts","../src/span-converter.ts","../src/tracing.ts"],"names":["ATTR_GEN_AI_USAGE_INPUT_TOKENS","ATTR_GEN_AI_USAGE_OUTPUT_TOKENS","SpanType","ATTR_GEN_AI_OPERATION_NAME","ATTR_GEN_AI_INPUT_MESSAGES","ATTR_GEN_AI_OUTPUT_MESSAGES","ATTR_GEN_AI_REQUEST_MODEL","ATTR_GEN_AI_PROVIDER_NAME","ATTR_GEN_AI_AGENT_ID","ATTR_GEN_AI_AGENT_NAME","ATTR_GEN_AI_REQUEST_TEMPERATURE","ATTR_GEN_AI_REQUEST_MAX_TOKENS","ATTR_GEN_AI_REQUEST_TOP_P","ATTR_GEN_AI_REQUEST_TOP_K","ATTR_GEN_AI_REQUEST_PRESENCE_PENALTY","ATTR_GEN_AI_REQUEST_FREQUENCY_PENALTY","ATTR_GEN_AI_REQUEST_STOP_SEQUENCES","ATTR_GEN_AI_REQUEST_SEED","ATTR_GEN_AI_RESPONSE_FINISH_REASONS","ATTR_GEN_AI_RESPONSE_MODEL","ATTR_GEN_AI_RESPONSE_ID","ATTR_SERVER_ADDRESS","ATTR_SERVER_PORT","ATTR_GEN_AI_TOOL_NAME","ATTR_GEN_AI_TOOL_DESCRIPTION","ATTR_GEN_AI_CONVERSATION_ID","ATTR_GEN_AI_SYSTEM_INSTRUCTIONS","ATTR_ERROR_TYPE","ATTR_ERROR_MESSAGE","resourceFromAttributes","ATTR_SERVICE_NAME","ATTR_SERVICE_VERSION","ATTR_TELEMETRY_SDK_NAME","ATTR_TELEMETRY_SDK_VERSION","ATTR_TELEMETRY_SDK_LANGUAGE","TraceFlags","fileURLToPath","readFileSync","SpanKind","SpanStatusCode","BaseExporter","diag","DiagConsoleLogger","DiagLogLevel","BatchSpanProcessor","TracingEventType"],"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 // Read from config or environment variables\n const apiKey = config.apiKey ?? process.env.DASH0_API_KEY;\n const configEndpoint = config.endpoint ?? process.env.DASH0_ENDPOINT;\n const dataset = config.dataset ?? process.env.DASH0_DATASET;\n\n if (!apiKey) {\n console.error(\n '[OtelExporter] Dash0 configuration requires apiKey. ' +\n 'Set DASH0_API_KEY environment variable or pass it in config. Tracing will be disabled.',\n );\n return null;\n }\n\n if (!configEndpoint) {\n console.error(\n '[OtelExporter] Dash0 configuration requires endpoint. ' +\n 'Set DASH0_ENDPOINT environment variable or pass it in config. Tracing will be disabled.',\n );\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 = configEndpoint;\n if (!endpoint.includes('/v1/traces')) {\n endpoint = `${endpoint}/v1/traces`;\n }\n\n const headers: Record<string, string> = {\n authorization: `Bearer ${apiKey}`, // lowercase for gRPC metadata\n };\n\n if (dataset) {\n headers['dash0-dataset'] = 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 // Read from config or environment variables\n const apiKey = config.apiKey ?? process.env.SIGNOZ_API_KEY;\n const region = config.region ?? (process.env.SIGNOZ_REGION as 'us' | 'eu' | 'in' | undefined);\n const configEndpoint = config.endpoint ?? process.env.SIGNOZ_ENDPOINT;\n\n if (!apiKey) {\n console.error(\n '[OtelExporter] SigNoz configuration requires apiKey. ' +\n 'Set SIGNOZ_API_KEY environment variable or pass it in config. Tracing will be disabled.',\n );\n return null;\n }\n\n // SigNoz uses OTLP endpoint with /v1/traces suffix\n const endpoint = configEndpoint || `https://ingest.${region || 'us'}.signoz.cloud:443/v1/traces`;\n\n return {\n endpoint,\n headers: {\n 'signoz-ingestion-key': apiKey,\n },\n protocol: 'http/protobuf',\n };\n}\n\nfunction resolveNewRelicConfig(config: NewRelicConfig): ResolvedProviderConfig | null {\n // Read from config or environment variables\n const apiKey = config.apiKey ?? process.env.NEW_RELIC_LICENSE_KEY;\n const configEndpoint = config.endpoint ?? process.env.NEW_RELIC_ENDPOINT;\n\n if (!apiKey) {\n console.error(\n '[OtelExporter] New Relic configuration requires apiKey (license key). ' +\n 'Set NEW_RELIC_LICENSE_KEY environment variable or pass it in config. Tracing will be disabled.',\n );\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 = configEndpoint || 'https://otlp.nr-data.net:443/v1/traces';\n\n return {\n endpoint,\n headers: {\n 'api-key': apiKey,\n },\n protocol: 'http/protobuf',\n };\n}\n\nfunction resolveTraceloopConfig(config: TraceloopConfig): ResolvedProviderConfig | null {\n // Read from config or environment variables\n const apiKey = config.apiKey ?? process.env.TRACELOOP_API_KEY;\n const destinationId = config.destinationId ?? process.env.TRACELOOP_DESTINATION_ID;\n const configEndpoint = config.endpoint ?? process.env.TRACELOOP_ENDPOINT;\n\n if (!apiKey) {\n console.error(\n '[OtelExporter] Traceloop configuration requires apiKey. ' +\n 'Set TRACELOOP_API_KEY environment variable or pass it in config. Tracing will be disabled.',\n );\n return null;\n }\n\n // Traceloop uses OTLP endpoint with /v1/traces suffix\n const endpoint = configEndpoint || 'https://api.traceloop.com/v1/traces';\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${apiKey}`,\n };\n\n if (destinationId) {\n headers['x-traceloop-destination-id'] = destinationId;\n }\n\n return {\n endpoint,\n headers,\n protocol: 'http/json',\n };\n}\n\nfunction resolveLaminarConfig(config: LaminarConfig): ResolvedProviderConfig | null {\n // Read from config or environment variables\n // LMNR_PROJECT_API_KEY is the standard Laminar environment variable\n const apiKey = config.apiKey ?? process.env.LMNR_PROJECT_API_KEY;\n const teamId = config.teamId ?? process.env.LAMINAR_TEAM_ID;\n const configEndpoint = config.endpoint ?? process.env.LAMINAR_ENDPOINT;\n\n if (!apiKey) {\n console.error(\n '[OtelExporter] Laminar configuration requires apiKey. ' +\n 'Set LMNR_PROJECT_API_KEY environment variable or pass it in config. Tracing will be disabled.',\n );\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 = configEndpoint || 'https://api.lmnr.ai/v1/traces';\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${apiKey}`,\n };\n\n // Only add team ID header if provided (for backwards compatibility)\n if (teamId) {\n headers['x-laminar-team-id'] = 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 * Utilities for converting Mastra messages to OpenTelemetry gen_ai message format\n * Based on OpenTelemetry GenAI semantic conventions\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/#gen-ai-input-messages\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-input-messages.json\n */\n\n/**\n * Type representation of a gen_ai chat message part\n */\ntype GenAIMessagePart =\n | {\n type: 'text';\n content: string;\n }\n | {\n type: 'tool_call';\n id: string;\n name: string;\n arguments: string;\n }\n | {\n type: 'tool_call_response';\n id: string;\n name: string;\n response: string;\n };\n\n/**\n * Type representation of a gen_ai chat message\n */\ntype GenAIMessage = {\n role: string;\n parts: GenAIMessagePart[];\n};\n\n/**\n * Assumed type representation of a Mastra message content type\n */\ntype MastraMessagePart =\n | {\n type: 'text';\n text: string;\n }\n | { type: 'tool-call'; toolCallId: string; toolName: string; input: unknown }\n | { type: 'tool-result'; toolCallId: string; toolName: string; output: { value: unknown } };\n\n/**\n * Assumed type representation of a Mastra message\n */\ntype MastraMessage = {\n role: string;\n content: MastraMessagePart[] | string;\n};\n\nconst isMastraMessagePart = (p: unknown): p is MastraMessagePart => {\n return (\n typeof p === 'object' &&\n p != null &&\n 'type' in p &&\n (p.type === 'text' || p.type === 'tool-call' || p.type === 'tool-result') &&\n ((p.type === 'text' && 'text' in p) ||\n (p.type === 'tool-call' && 'toolCallId' in p && 'toolName' in p && 'input' in p) ||\n (p.type === 'tool-result' && 'toolCallId' in p && 'toolName' in p && 'output' in p))\n );\n};\n\nconst isMastraMessage = (m: unknown): m is MastraMessage => {\n return (\n typeof m === 'object' &&\n m != null &&\n 'role' in m &&\n 'content' in m &&\n (typeof m.content === 'string' || (Array.isArray(m.content) && m.content.every(isMastraMessagePart)))\n );\n};\n\n/**\n * Convert an Input/Output string from a MastraSpan into a jsonified string that adheres to\n * OpenTelemetry gen_ai.input.messages and gen_ai.output.messages schema.\n * If parsing fails at any step, the original inputOutputString is returned unmodified.\n *\n * This conversion is best effort; It assumes a consistent shape for mastra messages, and converts\n * into the gen_ai input and output schemas as of October 20th, 2025.\n *\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/#gen-ai-input-messages\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-input-messages.json\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/#gen-ai-output-messages\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-output-messages.json\n *\n * @param inputOutputString a jsonified string that contains messages adhering to what appears to be\n * Mastra's message shape.\n * @returns a jsonified string that contains messages adhering to the OpenTelemetry gen_ai.input.messages and gen_ai.output.messages schema.\n * If parsing fails at any step, the original inputOutputString is returned unmodified.\n */\nexport const convertMastraMessagesToGenAIMessages = (inputOutputString: string): string => {\n try {\n const parsedIO = JSON.parse(inputOutputString) as unknown;\n if (typeof parsedIO !== 'object' || parsedIO == null || (!('messages' in parsedIO) && !('text' in parsedIO))) {\n // inputOutputString fails initial type guard, just return it\n return inputOutputString;\n }\n // if the IO simply contains a text string, return a single text message\n // formatted as a gen_ai assistant message, assuming its an assistant response\n if ('text' in parsedIO) {\n return JSON.stringify([\n {\n role: 'assistant',\n parts: [{ type: 'text', content: parsedIO.text as string }],\n } satisfies GenAIMessage,\n ]);\n }\n // if the IO contains messages, convert them to gen_ai messages\n if (Array.isArray(parsedIO.messages)) {\n return JSON.stringify(\n (parsedIO.messages as unknown[]).map(m => {\n if (!isMastraMessage(m)) {\n return m;\n }\n const role = m.role;\n let parts: GenAIMessagePart[] = [];\n if (Array.isArray(m.content)) {\n parts = m.content.map(c => {\n switch (c.type) {\n case 'text':\n return {\n type: 'text',\n content: c.text,\n };\n case 'tool-call':\n return {\n type: 'tool_call',\n id: c.toolCallId,\n name: c.toolName,\n arguments: JSON.stringify(c.input),\n };\n case 'tool-result':\n return {\n type: 'tool_call_response',\n id: c.toolCallId,\n name: c.toolName,\n response: JSON.stringify(c.output.value),\n };\n default:\n return c;\n }\n });\n } else {\n parts = [\n {\n type: 'text',\n content: m.content,\n },\n ];\n }\n return {\n role,\n parts,\n } satisfies GenAIMessage;\n }),\n );\n }\n // we've failed type-guards, just return original I/O string\n return inputOutputString;\n } catch {\n // silently fallback to original I/O string\n return inputOutputString;\n }\n};\n","/**\n * Utilities for converting Mastra Spans to OTel Spans\n * with Semantic conventions for generative AI systems\n * @see https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/gen-ai/README.md\n * @see https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/gen-ai/gen-ai-events.md\n * @see https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/gen-ai/gen-ai-spans.md\n * @see https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/gen-ai/gen-ai-agent-spans.md\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/non-normative/examples-llm-calls/\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/\n */\n\nimport { SpanType } from '@mastra/core/observability';\nimport type {\n AgentRunAttributes,\n AnyExportedSpan,\n MCPToolCallAttributes,\n ModelGenerationAttributes,\n ToolCallAttributes,\n UsageStats,\n} from '@mastra/core/observability';\nimport type { Attributes } from '@opentelemetry/api';\nimport {\n ATTR_ERROR_MESSAGE,\n ATTR_ERROR_TYPE,\n ATTR_GEN_AI_PROVIDER_NAME,\n ATTR_GEN_AI_REQUEST_MODEL,\n ATTR_GEN_AI_RESPONSE_MODEL,\n ATTR_GEN_AI_REQUEST_MAX_TOKENS,\n ATTR_GEN_AI_REQUEST_TEMPERATURE,\n ATTR_GEN_AI_REQUEST_TOP_P,\n ATTR_GEN_AI_REQUEST_TOP_K,\n ATTR_GEN_AI_REQUEST_PRESENCE_PENALTY,\n ATTR_GEN_AI_REQUEST_FREQUENCY_PENALTY,\n ATTR_GEN_AI_REQUEST_STOP_SEQUENCES,\n ATTR_GEN_AI_REQUEST_SEED,\n ATTR_GEN_AI_INPUT_MESSAGES,\n ATTR_GEN_AI_OUTPUT_MESSAGES,\n ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n ATTR_GEN_AI_AGENT_ID,\n ATTR_GEN_AI_AGENT_NAME,\n ATTR_GEN_AI_TOOL_DESCRIPTION,\n ATTR_GEN_AI_OPERATION_NAME,\n ATTR_GEN_AI_RESPONSE_FINISH_REASONS,\n ATTR_GEN_AI_RESPONSE_ID,\n ATTR_GEN_AI_CONVERSATION_ID,\n ATTR_GEN_AI_SYSTEM_INSTRUCTIONS,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n ATTR_GEN_AI_TOOL_NAME,\n} from '@opentelemetry/semantic-conventions/incubating';\nimport { convertMastraMessagesToGenAIMessages } from './gen-ai-messages';\n\n/**\n * Token usage attributes following OTel GenAI semantic conventions.\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-spans/\n */\nexport interface OtelUsageMetrics {\n [ATTR_GEN_AI_USAGE_INPUT_TOKENS]?: number;\n [ATTR_GEN_AI_USAGE_OUTPUT_TOKENS]?: number;\n 'gen_ai.usage.reasoning_tokens'?: number;\n 'gen_ai.usage.cached_input_tokens'?: number;\n 'gen_ai.usage.cache_write_tokens'?: number;\n 'gen_ai.usage.audio_input_tokens'?: number;\n 'gen_ai.usage.audio_output_tokens'?: number;\n}\n\n/**\n * Formats UsageStats to OTel GenAI semantic convention attributes.\n */\nexport function formatUsageMetrics(usage?: UsageStats): OtelUsageMetrics {\n if (!usage) return {};\n\n const metrics: OtelUsageMetrics = {};\n\n if (usage.inputTokens !== undefined) {\n metrics[ATTR_GEN_AI_USAGE_INPUT_TOKENS] = usage.inputTokens;\n }\n\n if (usage.outputTokens !== undefined) {\n metrics[ATTR_GEN_AI_USAGE_OUTPUT_TOKENS] = usage.outputTokens;\n }\n\n // Reasoning tokens from outputDetails\n if (usage.outputDetails?.reasoning !== undefined) {\n metrics['gen_ai.usage.reasoning_tokens'] = usage.outputDetails.reasoning;\n }\n\n // Cache read tokens from inputDetails\n if (usage.inputDetails?.cacheRead !== undefined) {\n metrics['gen_ai.usage.cached_input_tokens'] = usage.inputDetails.cacheRead;\n }\n\n // Cache write tokens from inputDetails\n if (usage.inputDetails?.cacheWrite !== undefined) {\n metrics['gen_ai.usage.cache_write_tokens'] = usage.inputDetails.cacheWrite;\n }\n\n // Audio tokens from inputDetails/outputDetails\n if (usage.inputDetails?.audio !== undefined) {\n metrics['gen_ai.usage.audio_input_tokens'] = usage.inputDetails.audio;\n }\n if (usage.outputDetails?.audio !== undefined) {\n metrics['gen_ai.usage.audio_output_tokens'] = usage.outputDetails.audio;\n }\n\n return metrics;\n}\n\n/**\n * Get the operation name based on span type for gen_ai.operation.name\n */\nfunction getOperationName(span: AnyExportedSpan): string {\n switch (span.type) {\n case SpanType.MODEL_GENERATION:\n return 'chat';\n case SpanType.TOOL_CALL:\n case SpanType.MCP_TOOL_CALL:\n return 'execute_tool';\n case SpanType.AGENT_RUN:\n return 'invoke_agent';\n case SpanType.WORKFLOW_RUN:\n return 'invoke_workflow';\n default:\n return span.type.toLowerCase();\n }\n}\n/**\n * Keep only unicode letters, numbers, dot, underscore, space, dash.\n */\nfunction sanitizeSpanName(name: string): string {\n return name.replace(/[^\\p{L}\\p{N}._ -]/gu, '');\n}\n\nfunction getSpanIdentifier(span: AnyExportedSpan): string | null {\n switch (span.type) {\n case SpanType.MODEL_GENERATION: {\n const attrs = span.attributes as ModelGenerationAttributes;\n return attrs?.model ?? 'unknown';\n }\n\n default:\n return span.entityName ?? span.entityId ?? 'unknown';\n }\n}\n\n/**\n * Get an OTEL-compliant span name based on span type and attributes\n */\nexport function getSpanName(span: AnyExportedSpan): string {\n const identifier = getSpanIdentifier(span);\n\n if (identifier) {\n const operation = getOperationName(span);\n return `${operation} ${identifier}`;\n }\n\n // For other types, use a simplified version of the original name\n return sanitizeSpanName(span.name);\n}\n\n/**\n * Gets OpenTelemetry attributes from Mastra Span\n * Following OTEL Semantic Conventions for GenAI\n */\nexport function getAttributes(span: AnyExportedSpan): Attributes {\n const attributes: Attributes = {};\n const spanType = span.type.toLowerCase();\n\n // Add gen_ai.operation.name based on span type\n attributes[ATTR_GEN_AI_OPERATION_NAME] = getOperationName(span);\n\n // Add span type for better visibility\n attributes['mastra.span.type'] = span.type;\n\n // Handle input/output based on span type\n // Always add input/output for Laminar compatibility\n if (span.input !== undefined) {\n const inputStr = typeof span.input === 'string' ? span.input : JSON.stringify(span.input);\n // Add specific attributes based on span type\n if (span.type === SpanType.MODEL_GENERATION) {\n attributes[ATTR_GEN_AI_INPUT_MESSAGES] = convertMastraMessagesToGenAIMessages(inputStr);\n } else if (span.type === SpanType.TOOL_CALL || span.type === SpanType.MCP_TOOL_CALL) {\n attributes['gen_ai.tool.call.arguments'] = inputStr;\n } else {\n attributes[`mastra.${spanType}.input`] = inputStr;\n }\n }\n\n if (span.output !== undefined) {\n const outputStr = typeof span.output === 'string' ? span.output : JSON.stringify(span.output);\n // Add specific attributes based on span type\n if (span.type === SpanType.MODEL_GENERATION) {\n attributes[ATTR_GEN_AI_OUTPUT_MESSAGES] = convertMastraMessagesToGenAIMessages(outputStr);\n // TODO\n // attributes['gen_ai.output.type'] = image/json/speech/text/<other>\n } else if (span.type === SpanType.TOOL_CALL || span.type === SpanType.MCP_TOOL_CALL) {\n attributes['gen_ai.tool.call.result'] = outputStr;\n } else {\n attributes[`mastra.${spanType}.output`] = outputStr;\n }\n }\n\n // Add model-specific attributes using OTEL semantic conventions\n if (span.type === SpanType.MODEL_GENERATION && span.attributes) {\n const modelAttrs = span.attributes as ModelGenerationAttributes;\n\n // Model and provider\n if (modelAttrs.model) {\n attributes[ATTR_GEN_AI_REQUEST_MODEL] = modelAttrs.model;\n }\n\n if (modelAttrs.provider) {\n attributes[ATTR_GEN_AI_PROVIDER_NAME] = normalizeProvider(modelAttrs.provider);\n }\n\n // Agent context - allows correlating model generation with the agent that invoked it\n if (span.entityId) {\n attributes[ATTR_GEN_AI_AGENT_ID] = span.entityId;\n }\n\n if (span.entityName) {\n attributes[ATTR_GEN_AI_AGENT_NAME] = span.entityName;\n }\n\n // Token usage - use OTEL standard naming + OpenInference conventions\n Object.assign(attributes, formatUsageMetrics(modelAttrs.usage));\n\n // Parameters using OTEL conventions\n if (modelAttrs.parameters) {\n if (modelAttrs.parameters.temperature !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_TEMPERATURE] = modelAttrs.parameters.temperature;\n }\n if (modelAttrs.parameters.maxOutputTokens !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_MAX_TOKENS] = modelAttrs.parameters.maxOutputTokens;\n }\n if (modelAttrs.parameters.topP !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_TOP_P] = modelAttrs.parameters.topP;\n }\n if (modelAttrs.parameters.topK !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_TOP_K] = modelAttrs.parameters.topK;\n }\n if (modelAttrs.parameters.presencePenalty !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_PRESENCE_PENALTY] = modelAttrs.parameters.presencePenalty;\n }\n if (modelAttrs.parameters.frequencyPenalty !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_FREQUENCY_PENALTY] = modelAttrs.parameters.frequencyPenalty;\n }\n if (modelAttrs.parameters.stopSequences) {\n attributes[ATTR_GEN_AI_REQUEST_STOP_SEQUENCES] = JSON.stringify(modelAttrs.parameters.stopSequences);\n }\n if (modelAttrs.parameters.seed) {\n attributes[ATTR_GEN_AI_REQUEST_SEED] = modelAttrs.parameters.seed;\n }\n }\n\n // Response attributes\n if (modelAttrs.finishReason) {\n attributes[ATTR_GEN_AI_RESPONSE_FINISH_REASONS] = JSON.stringify([modelAttrs.finishReason]);\n }\n if (modelAttrs.responseModel) {\n attributes[ATTR_GEN_AI_RESPONSE_MODEL] = modelAttrs.responseModel;\n }\n if (modelAttrs.responseId) {\n attributes[ATTR_GEN_AI_RESPONSE_ID] = modelAttrs.responseId;\n }\n\n // Server attributes\n if (modelAttrs.serverAddress) {\n attributes[ATTR_SERVER_ADDRESS] = modelAttrs.serverAddress;\n }\n if (modelAttrs.serverPort !== undefined) {\n attributes[ATTR_SERVER_PORT] = modelAttrs.serverPort;\n }\n }\n\n // Add tool-specific attributes using OTEL conventions\n if ((span.type === SpanType.TOOL_CALL || span.type === SpanType.MCP_TOOL_CALL) && span.attributes) {\n // Tool identification\n attributes[ATTR_GEN_AI_TOOL_NAME] = span.entityName ?? span.entityId;\n\n //TODO:\n // attributes['gen_ai.tool.call.id'] = call_mszuSIzqtI65i1wAUOE8w5H4\n\n // MCP-specific attributes\n if (span.type === SpanType.MCP_TOOL_CALL) {\n const mcpAttrs = span.attributes as MCPToolCallAttributes;\n if (mcpAttrs.mcpServer) {\n attributes[ATTR_SERVER_ADDRESS] = mcpAttrs.mcpServer;\n }\n } else {\n const toolAttrs = span.attributes as ToolCallAttributes;\n if (toolAttrs.toolDescription) {\n attributes[ATTR_GEN_AI_TOOL_DESCRIPTION] = toolAttrs.toolDescription;\n }\n if (toolAttrs.toolType) {\n attributes['gen_ai.tool.type'] = toolAttrs.toolType;\n }\n }\n }\n\n // Add agent-specific attributes\n if (span.type === SpanType.AGENT_RUN && span.attributes) {\n const agentAttrs = span.attributes as AgentRunAttributes;\n if (span.entityId) {\n attributes[ATTR_GEN_AI_AGENT_ID] = span.entityId;\n }\n if (span.entityName) {\n attributes[ATTR_GEN_AI_AGENT_NAME] = span.entityName;\n }\n if (agentAttrs.conversationId) {\n attributes[ATTR_GEN_AI_CONVERSATION_ID] = agentAttrs.conversationId;\n }\n if (agentAttrs.maxSteps) {\n attributes[`mastra.${spanType}.max_steps`] = agentAttrs.maxSteps;\n }\n if (agentAttrs.availableTools) {\n attributes[`gen_ai.tool.definitions`] = JSON.stringify(agentAttrs.availableTools);\n }\n\n //TODO:\n // attributes[ATTR_GEN_AI_AGENT_DESCRIPTION] = agentAttrs.description;\n // attributes[ATTR_GEN_AI_REQUEST_MODEL] = agentAttrs.model.name;\n\n attributes[ATTR_GEN_AI_SYSTEM_INSTRUCTIONS] = agentAttrs.instructions;\n }\n\n // Add error information if present\n if (span.errorInfo) {\n attributes[ATTR_ERROR_TYPE] = span.errorInfo.id || 'unknown';\n attributes[ATTR_ERROR_MESSAGE] = span.errorInfo.message;\n if (span.errorInfo.domain) {\n attributes['error.domain'] = span.errorInfo.domain;\n }\n if (span.errorInfo.category) {\n attributes['error.category'] = span.errorInfo.category;\n }\n }\n\n return attributes;\n}\n\n/**\n * Canonical OTel provider keys mapped to a list of possible fuzzy aliases.\n */\nconst PROVIDER_ALIASES: Record<string, string[]> = {\n anthropic: ['anthropic', 'claude'],\n 'aws.bedrock': ['awsbedrock', 'bedrock', 'amazonbedrock'],\n 'azure.ai.inference': ['azureaiinference', 'azureinference'],\n 'azure.ai.openai': ['azureaiopenai', 'azureopenai', 'msopenai', 'microsoftopenai'],\n cohere: ['cohere'],\n deepseek: ['deepseek'],\n 'gcp.gemini': ['gcpgemini', 'gemini'],\n 'gcp.gen_ai': ['gcpgenai', 'googlegenai', 'googleai'],\n 'gcp.vertex_ai': ['gcpvertexai', 'vertexai'],\n groq: ['groq'],\n 'ibm.watsonx.ai': ['ibmwatsonxai', 'watsonx', 'watsonxai'],\n mistral_ai: ['mistral', 'mistralai'],\n openai: ['openai', 'oai'],\n perplexity: ['perplexity', 'pplx'],\n x_ai: ['xai', 'x-ai', 'x_ai', 'x.com ai'],\n};\n\n/**\n * Normalize a provider input string into a matchable token.\n * Keep only alphanumerics and lowercase the result.\n */\nfunction normalizeProviderString(input: string): string {\n return input.toLowerCase().replace(/[^a-z0-9]/g, '');\n}\n\n/**\n * Attempts to map a providerName to one of the canonical OTel provider names.\n * If no match is found, returns the original providerName unchanged.\n */\nfunction normalizeProvider(providerName: string): string {\n const normalized = normalizeProviderString(providerName);\n\n for (const [canonical, aliases] of Object.entries(PROVIDER_ALIASES)) {\n for (const alias of aliases) {\n if (normalized === alias) {\n return canonical;\n }\n }\n }\n\n // No match → return the raw input in lowercase\n return providerName.toLowerCase();\n}\n","/**\n * Convert Mastra Spans to OpenTelemetry spans\n */\nimport { readFileSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport { SpanType } from '@mastra/core/observability';\nimport type { AnyExportedSpan } from '@mastra/core/observability';\nimport { SpanKind, SpanStatusCode, TraceFlags } from '@opentelemetry/api';\nimport type { HrTime, Link, SpanContext, SpanStatus } from '@opentelemetry/api';\nimport type { InstrumentationScope } from '@opentelemetry/core';\nimport type { Resource } from '@opentelemetry/resources';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\n\nimport type { ReadableSpan, TimedEvent } 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 { getAttributes, getSpanName } from './gen-ai-semantics.js';\nimport type { OtelExporterConfig } from './types.js';\n\nexport type SpanFormat = 'GenAI_v1_38_0';\n\n// If more formats come later:\n// export type SpanFormat =\n// | \"GenAI_v1_38_0\"\n// | \"GenAI_v1_38_0\"\n// | \"Custom_v2\";\n\nexport class SpanConverter {\n private resource?: Resource;\n private scope?: InstrumentationScope;\n private initPromise?: Promise<void>;\n private format: SpanFormat;\n\n constructor(\n private readonly params: {\n format: SpanFormat;\n packageName: string;\n serviceName?: string;\n config?: OtelExporterConfig;\n },\n ) {\n this.format = params.format;\n }\n\n /**\n * Lazily initialize resource & scope on first use.\n * Subsequent calls reuse the same promise (no races).\n */\n private async initIfNeeded(): Promise<void> {\n if (this.initPromise) {\n return this.initPromise;\n }\n\n this.initPromise = (async () => {\n const packageVersion = (await getPackageVersion(this.params.packageName)) ?? 'unknown';\n\n const serviceVersion = (await getPackageVersion('@mastra/core')) ?? 'unknown';\n\n let resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: this.params.serviceName || 'mastra-service',\n [ATTR_SERVICE_VERSION]: serviceVersion,\n [ATTR_TELEMETRY_SDK_NAME]: this.params.packageName,\n [ATTR_TELEMETRY_SDK_VERSION]: packageVersion,\n [ATTR_TELEMETRY_SDK_LANGUAGE]: 'nodejs',\n });\n\n if (this.params.config?.resourceAttributes) {\n resource = resource.merge(\n // Duplicate attributes from config will override defaults above\n resourceFromAttributes(this.params.config.resourceAttributes),\n );\n }\n\n this.resource = resource;\n this.scope = {\n name: this.params.packageName,\n version: packageVersion,\n };\n })();\n\n return this.initPromise;\n }\n\n /**\n * Convert a Mastra Span to an OpenTelemetry ReadableSpan\n */\n async convertSpan(span: AnyExportedSpan): Promise<ReadableSpan> {\n await this.initIfNeeded();\n\n if (!this.resource || !this.scope) {\n throw new Error('SpanConverter not initialized correctly');\n }\n\n // --- Core fields derived from Mastra span ---\n const name = getSpanName(span);\n const kind = getSpanKind(span.type);\n const attributes = getAttributes(span);\n\n // Add metadata as custom attributes (not gen_ai specific)\n if (span.metadata) {\n for (const [k, v] of Object.entries(span.metadata)) {\n if (v === null || v === undefined) {\n continue;\n }\n attributes[`mastra.metadata.${k}`] = typeof v === 'object' ? JSON.stringify(v) : v;\n }\n }\n\n // Add tags for root spans (only root spans can have tags)\n // Tags are JSON-stringified for maximum backend compatibility\n // While OTEL spec supports arrays, many backends (Jaeger, Zipkin, Tempo) don't fully support them\n if (span.isRootSpan && span.tags?.length) {\n attributes['mastra.tags'] = JSON.stringify(span.tags);\n }\n\n const startTime = dateToHrTime(span.startTime);\n const endTime = span.endTime ? dateToHrTime(span.endTime) : startTime;\n const duration = computeDuration(span.startTime, span.endTime);\n\n const { status, events } = buildStatusAndEvents(span, startTime);\n\n const spanContext: SpanContext = {\n traceId: span.traceId,\n spanId: span.id,\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n };\n\n const parentSpanContext = span.parentSpanId\n ? {\n traceId: span.traceId,\n spanId: span.parentSpanId,\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n }\n : undefined;\n\n const links: Link[] = []; // fill if you add link support later\n\n const readable: ReadableSpan = {\n name,\n kind,\n spanContext: () => spanContext,\n parentSpanContext,\n startTime,\n endTime,\n status,\n attributes,\n links,\n events,\n duration,\n ended: !!span.endTime,\n resource: this.resource,\n instrumentationScope: this.scope,\n droppedAttributesCount: 0,\n droppedEventsCount: 0,\n droppedLinksCount: 0,\n };\n\n return readable;\n }\n}\n\nasync function getPackageVersion(pkgName: string): Promise<string | undefined> {\n try {\n // Resolve `package.json` for the given package\n const manifestUrl = new URL(await import.meta.resolve(`${pkgName}/package.json`));\n\n const path = fileURLToPath(manifestUrl);\n const pkgJson = JSON.parse(readFileSync(path, 'utf8'));\n return pkgJson.version;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Get the appropriate Otel SpanKind based on Mastra SpanType.\n *\n * @param type - The Mastra span type\n * @returns The appropriate OTEL SpanKind\n */\nexport function getSpanKind(type: SpanType): SpanKind {\n switch (type) {\n case SpanType.MODEL_GENERATION:\n case SpanType.MCP_TOOL_CALL:\n return SpanKind.CLIENT;\n default:\n return SpanKind.INTERNAL;\n }\n}\n\n/**\n * Convert JavaScript Date to hrtime format\n */\nfunction dateToHrTime(date: Date): HrTime {\n const ms = date.getTime();\n const seconds = Math.floor(ms / 1000);\n const nanoseconds = (ms % 1000) * 1000000;\n return [seconds, nanoseconds];\n}\n\nfunction computeDuration(start: Date, end?: Date): HrTime {\n if (!end) return [0, 0];\n const diffMs = end.getTime() - start.getTime();\n return [Math.floor(diffMs / 1000), (diffMs % 1000) * 1_000_000];\n}\n\n/**\n * Build status + events from span.errorInfo (if present)\n */\nfunction buildStatusAndEvents(\n span: AnyExportedSpan,\n defaultTime: HrTime,\n): { status: SpanStatus; events: TimedEvent[] } {\n const events: TimedEvent[] = [];\n\n if (span.errorInfo) {\n const status: SpanStatus = {\n code: SpanStatusCode.ERROR,\n message: span.errorInfo.message,\n };\n\n events.push({\n name: 'exception',\n attributes: {\n 'exception.message': span.errorInfo.message,\n 'exception.type': 'Error',\n ...(span.errorInfo.details?.stack && {\n 'exception.stacktrace': span.errorInfo.details.stack as string,\n }),\n },\n time: defaultTime,\n droppedAttributesCount: 0,\n });\n\n return { status, events };\n }\n\n if (span.endTime) {\n return {\n status: { code: SpanStatusCode.OK },\n events,\n };\n }\n\n return {\n status: { code: SpanStatusCode.UNSET },\n events,\n };\n}\n","/**\n * OpenTelemetry Tracing Exporter for Mastra\n */\n\nimport type {\n TracingEvent,\n AnyExportedSpan,\n InitExporterOptions,\n ObservabilityInstanceConfig,\n} from '@mastra/core/observability';\nimport { TracingEventType } from '@mastra/core/observability';\nimport { BaseExporter } from '@mastra/observability';\nimport { diag, DiagConsoleLogger, DiagLogLevel } from '@opentelemetry/api';\n\nimport { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport type { SpanExporter } from '@opentelemetry/sdk-trace-base';\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 extends BaseExporter {\n private config: OtelExporterConfig;\n private observabilityConfig?: ObservabilityInstanceConfig;\n private spanConverter?: SpanConverter;\n private processor?: BatchSpanProcessor;\n private exporter?: SpanExporter;\n private isSetup: boolean = false;\n\n name = 'opentelemetry';\n\n constructor(config: OtelExporterConfig) {\n super(config);\n\n this.config = config;\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(options: InitExporterOptions) {\n this.observabilityConfig = options.config;\n }\n\n private async setupExporter() {\n // already setup or exporter already set\n if (this.isSetup || this.exporter) return;\n\n // Provider configuration is required\n if (!this.config.provider) {\n this.logger.error(\n '[OtelExporter] Provider configuration is required. Use the \"custom\" provider for generic endpoints.',\n );\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n // Resolve provider configuration\n const resolved = resolveProviderConfig(this.config.provider);\n if (!resolved) {\n // Configuration validation failed, disable tracing\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n // user provided an instantiated SpanExporter, use it\n if (this.config.exporter) {\n this.exporter = this.config.exporter;\n return;\n }\n\n const endpoint = resolved.endpoint;\n const headers = resolved.headers;\n const protocol = resolved.protocol;\n\n // Load and create the appropriate exporter based on protocol\n const providerName = Object.keys(this.config.provider)[0];\n const ExporterClass = await loadExporter(protocol, providerName);\n\n if (!ExporterClass) {\n // Exporter not available, disable tracing\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n try {\n if (protocol === 'zipkin') {\n this.exporter = new ExporterClass({\n url: endpoint,\n headers,\n });\n } else if (protocol === 'grpc') {\n // gRPC uses Metadata object instead of headers\n // Dynamically import @grpc/grpc-js to create metadata\n let metadata: any;\n try {\n // @ts-ignore - Dynamic import for optional dependency\n const grpcModule = await import('@grpc/grpc-js');\n metadata = new grpcModule.Metadata();\n Object.entries(headers).forEach(([key, value]) => {\n metadata.set(key, value);\n });\n } catch (grpcError) {\n this.logger.error(\n `[OtelExporter] Failed to load gRPC metadata. Install required packages:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-grpc @grpc/grpc-js\\n`,\n grpcError,\n );\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n this.exporter = new ExporterClass({\n url: endpoint,\n metadata,\n timeoutMillis: this.config.timeout,\n });\n } else {\n // HTTP/JSON and HTTP/Protobuf use headers\n this.exporter = new ExporterClass({\n url: endpoint,\n headers,\n timeoutMillis: this.config.timeout,\n });\n }\n } catch (error) {\n this.logger.error(`[OtelExporter] Failed to create exporter:`, error);\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n }\n\n private async setupProcessor() {\n if (this.processor || this.isSetup) return;\n\n this.spanConverter = new SpanConverter({\n packageName: '@mastra/otel-exporter',\n serviceName: this.observabilityConfig?.serviceName,\n config: this.config,\n format: 'GenAI_v1_38_0',\n });\n\n // Always use BatchSpanProcessor for production\n // It queues spans and exports them in batches for better performance\n this.processor = new BatchSpanProcessor(this.exporter!, {\n maxExportBatchSize: this.config.batchSize || 512, // Default batch size\n maxQueueSize: 2048, // Maximum spans to queue\n scheduledDelayMillis: 5000, // Export every 5 seconds\n exportTimeoutMillis: this.config.timeout || 30000, // Export timeout\n });\n\n this.logger.debug(\n `[OtelExporter] Using BatchSpanProcessor (batch size: ${this.config.batchSize || 512}, delay: 5s)`,\n );\n }\n\n private async setup() {\n if (this.isSetup) return;\n await this.setupExporter();\n await this.setupProcessor();\n this.isSetup = true;\n }\n\n protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n // Only process SPAN_ENDED events for OTEL\n // OTEL expects complete spans with start and end times\n if (event.type !== TracingEventType.SPAN_ENDED) {\n return;\n }\n\n const span = event.exportedSpan;\n await this.exportSpan(span);\n }\n\n private async exportSpan(span: AnyExportedSpan): Promise<void> {\n // Ensure exporter is set up\n if (!this.isSetup) {\n await this.setup();\n }\n\n // Skip if disabled\n if (this.isDisabled || !this.processor) {\n return;\n }\n\n try {\n // Convert the span to OTEL format\n const otelSpan = await 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(otelSpan);\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/gen-ai-messages.ts","../src/gen-ai-semantics.ts","../src/span-converter.ts","../src/tracing.ts"],"names":["ATTR_GEN_AI_USAGE_INPUT_TOKENS","ATTR_GEN_AI_USAGE_OUTPUT_TOKENS","SpanType","ATTR_GEN_AI_OPERATION_NAME","ATTR_GEN_AI_INPUT_MESSAGES","ATTR_GEN_AI_OUTPUT_MESSAGES","ATTR_GEN_AI_REQUEST_MODEL","ATTR_GEN_AI_PROVIDER_NAME","ATTR_GEN_AI_AGENT_ID","ATTR_GEN_AI_AGENT_NAME","ATTR_GEN_AI_REQUEST_TEMPERATURE","ATTR_GEN_AI_REQUEST_MAX_TOKENS","ATTR_GEN_AI_REQUEST_TOP_P","ATTR_GEN_AI_REQUEST_TOP_K","ATTR_GEN_AI_REQUEST_PRESENCE_PENALTY","ATTR_GEN_AI_REQUEST_FREQUENCY_PENALTY","ATTR_GEN_AI_REQUEST_STOP_SEQUENCES","ATTR_GEN_AI_REQUEST_SEED","ATTR_GEN_AI_RESPONSE_FINISH_REASONS","ATTR_GEN_AI_RESPONSE_MODEL","ATTR_GEN_AI_RESPONSE_ID","ATTR_SERVER_ADDRESS","ATTR_SERVER_PORT","ATTR_GEN_AI_TOOL_NAME","ATTR_GEN_AI_TOOL_DESCRIPTION","ATTR_GEN_AI_CONVERSATION_ID","ATTR_GEN_AI_SYSTEM_INSTRUCTIONS","ATTR_ERROR_TYPE","ATTR_ERROR_MESSAGE","resourceFromAttributes","ATTR_SERVICE_NAME","ATTR_SERVICE_VERSION","ATTR_TELEMETRY_SDK_NAME","ATTR_TELEMETRY_SDK_VERSION","ATTR_TELEMETRY_SDK_LANGUAGE","TraceFlags","fileURLToPath","readFileSync","SpanKind","SpanStatusCode","BaseExporter","diag","DiagConsoleLogger","DiagLogLevel","BatchSpanProcessor","TracingEventType"],"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 // Read from config or environment variables\n const apiKey = config.apiKey ?? process.env.DASH0_API_KEY;\n const configEndpoint = config.endpoint ?? process.env.DASH0_ENDPOINT;\n const dataset = config.dataset ?? process.env.DASH0_DATASET;\n\n if (!apiKey) {\n console.error(\n '[OtelExporter] Dash0 configuration requires apiKey. ' +\n 'Set DASH0_API_KEY environment variable or pass it in config. Tracing will be disabled.',\n );\n return null;\n }\n\n if (!configEndpoint) {\n console.error(\n '[OtelExporter] Dash0 configuration requires endpoint. ' +\n 'Set DASH0_ENDPOINT environment variable or pass it in config. Tracing will be disabled.',\n );\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 = configEndpoint;\n if (!endpoint.includes('/v1/traces')) {\n endpoint = `${endpoint}/v1/traces`;\n }\n\n const headers: Record<string, string> = {\n authorization: `Bearer ${apiKey}`, // lowercase for gRPC metadata\n };\n\n if (dataset) {\n headers['dash0-dataset'] = 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 // Read from config or environment variables\n const apiKey = config.apiKey ?? process.env.SIGNOZ_API_KEY;\n const region = config.region ?? (process.env.SIGNOZ_REGION as 'us' | 'eu' | 'in' | undefined);\n const configEndpoint = config.endpoint ?? process.env.SIGNOZ_ENDPOINT;\n\n if (!apiKey) {\n console.error(\n '[OtelExporter] SigNoz configuration requires apiKey. ' +\n 'Set SIGNOZ_API_KEY environment variable or pass it in config. Tracing will be disabled.',\n );\n return null;\n }\n\n // SigNoz uses OTLP endpoint with /v1/traces suffix\n const endpoint = configEndpoint || `https://ingest.${region || 'us'}.signoz.cloud:443/v1/traces`;\n\n return {\n endpoint,\n headers: {\n 'signoz-ingestion-key': apiKey,\n },\n protocol: 'http/protobuf',\n };\n}\n\nfunction resolveNewRelicConfig(config: NewRelicConfig): ResolvedProviderConfig | null {\n // Read from config or environment variables\n const apiKey = config.apiKey ?? process.env.NEW_RELIC_LICENSE_KEY;\n const configEndpoint = config.endpoint ?? process.env.NEW_RELIC_ENDPOINT;\n\n if (!apiKey) {\n console.error(\n '[OtelExporter] New Relic configuration requires apiKey (license key). ' +\n 'Set NEW_RELIC_LICENSE_KEY environment variable or pass it in config. Tracing will be disabled.',\n );\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 = configEndpoint || 'https://otlp.nr-data.net:443/v1/traces';\n\n return {\n endpoint,\n headers: {\n 'api-key': apiKey,\n },\n protocol: 'http/protobuf',\n };\n}\n\nfunction resolveTraceloopConfig(config: TraceloopConfig): ResolvedProviderConfig | null {\n // Read from config or environment variables\n const apiKey = config.apiKey ?? process.env.TRACELOOP_API_KEY;\n const destinationId = config.destinationId ?? process.env.TRACELOOP_DESTINATION_ID;\n const configEndpoint = config.endpoint ?? process.env.TRACELOOP_ENDPOINT;\n\n if (!apiKey) {\n console.error(\n '[OtelExporter] Traceloop configuration requires apiKey. ' +\n 'Set TRACELOOP_API_KEY environment variable or pass it in config. Tracing will be disabled.',\n );\n return null;\n }\n\n // Traceloop uses OTLP endpoint with /v1/traces suffix\n const endpoint = configEndpoint || 'https://api.traceloop.com/v1/traces';\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${apiKey}`,\n };\n\n if (destinationId) {\n headers['x-traceloop-destination-id'] = destinationId;\n }\n\n return {\n endpoint,\n headers,\n protocol: 'http/json',\n };\n}\n\nfunction resolveLaminarConfig(config: LaminarConfig): ResolvedProviderConfig | null {\n // Read from config or environment variables\n // LMNR_PROJECT_API_KEY is the standard Laminar environment variable\n const apiKey = config.apiKey ?? process.env.LMNR_PROJECT_API_KEY;\n const configEndpoint = config.endpoint ?? process.env.LAMINAR_ENDPOINT;\n\n if (!apiKey) {\n console.error(\n '[OtelExporter] Laminar configuration requires apiKey. ' +\n 'Set LMNR_PROJECT_API_KEY environment variable or pass it in config. Tracing will be disabled.',\n );\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 = configEndpoint || 'https://api.lmnr.ai/v1/traces';\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${apiKey}`,\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 * Utilities for converting Mastra messages to OpenTelemetry gen_ai message format\n * Based on OpenTelemetry GenAI semantic conventions\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/#gen-ai-input-messages\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-input-messages.json\n */\n\n/**\n * Type representation of a gen_ai chat message part\n */\ntype GenAIMessagePart =\n | {\n type: 'text';\n content: string;\n }\n | {\n type: 'tool_call';\n id: string;\n name: string;\n arguments: string;\n }\n | {\n type: 'tool_call_response';\n id: string;\n name: string;\n response: string;\n };\n\n/**\n * Type representation of a gen_ai chat message\n */\ntype GenAIMessage = {\n role: string;\n parts: GenAIMessagePart[];\n};\n\n/**\n * Assumed type representation of a Mastra message content type\n */\ntype MastraMessagePart =\n | {\n type: 'text';\n text: string;\n }\n | { type: 'tool-call'; toolCallId: string; toolName: string; input: unknown }\n | { type: 'tool-result'; toolCallId: string; toolName: string; output: { value: unknown } };\n\n/**\n * Assumed type representation of a Mastra message\n */\ntype MastraMessage = {\n role: string;\n content: MastraMessagePart[] | string;\n};\n\nconst isMastraMessagePart = (p: unknown): p is MastraMessagePart => {\n return (\n typeof p === 'object' &&\n p != null &&\n 'type' in p &&\n (p.type === 'text' || p.type === 'tool-call' || p.type === 'tool-result') &&\n ((p.type === 'text' && 'text' in p) ||\n (p.type === 'tool-call' && 'toolCallId' in p && 'toolName' in p && 'input' in p) ||\n (p.type === 'tool-result' && 'toolCallId' in p && 'toolName' in p && 'output' in p))\n );\n};\n\nconst isMastraMessage = (m: unknown): m is MastraMessage => {\n return (\n typeof m === 'object' &&\n m != null &&\n 'role' in m &&\n 'content' in m &&\n (typeof m.content === 'string' || (Array.isArray(m.content) && m.content.every(isMastraMessagePart)))\n );\n};\n\n/**\n * Convert an Input/Output string from a MastraSpan into a jsonified string that adheres to\n * OpenTelemetry gen_ai.input.messages and gen_ai.output.messages schema.\n * If parsing fails at any step, the original inputOutputString is returned unmodified.\n *\n * This conversion is best effort; It assumes a consistent shape for mastra messages, and converts\n * into the gen_ai input and output schemas as of October 20th, 2025.\n *\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/#gen-ai-input-messages\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-input-messages.json\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/#gen-ai-output-messages\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-output-messages.json\n *\n * @param inputOutputString a jsonified string that contains messages adhering to what appears to be\n * Mastra's message shape.\n * @returns a jsonified string that contains messages adhering to the OpenTelemetry gen_ai.input.messages and gen_ai.output.messages schema.\n * If parsing fails at any step, the original inputOutputString is returned unmodified.\n */\nexport const convertMastraMessagesToGenAIMessages = (inputOutputString: string): string => {\n try {\n const parsedIO = JSON.parse(inputOutputString) as unknown;\n if (typeof parsedIO !== 'object' || parsedIO == null || (!('messages' in parsedIO) && !('text' in parsedIO))) {\n // inputOutputString fails initial type guard, just return it\n return inputOutputString;\n }\n // if the IO simply contains a text string, return a single text message\n // formatted as a gen_ai assistant message, assuming its an assistant response\n if ('text' in parsedIO) {\n return JSON.stringify([\n {\n role: 'assistant',\n parts: [{ type: 'text', content: parsedIO.text as string }],\n } satisfies GenAIMessage,\n ]);\n }\n // if the IO contains messages, convert them to gen_ai messages\n if (Array.isArray(parsedIO.messages)) {\n return JSON.stringify(\n (parsedIO.messages as unknown[]).map(m => {\n if (!isMastraMessage(m)) {\n return m;\n }\n const role = m.role;\n let parts: GenAIMessagePart[] = [];\n if (Array.isArray(m.content)) {\n parts = m.content.map(c => {\n switch (c.type) {\n case 'text':\n return {\n type: 'text',\n content: c.text,\n };\n case 'tool-call':\n return {\n type: 'tool_call',\n id: c.toolCallId,\n name: c.toolName,\n arguments: JSON.stringify(c.input),\n };\n case 'tool-result':\n return {\n type: 'tool_call_response',\n id: c.toolCallId,\n name: c.toolName,\n response: JSON.stringify(c.output.value),\n };\n default:\n return c;\n }\n });\n } else {\n parts = [\n {\n type: 'text',\n content: m.content,\n },\n ];\n }\n return {\n role,\n parts,\n } satisfies GenAIMessage;\n }),\n );\n }\n // we've failed type-guards, just return original I/O string\n return inputOutputString;\n } catch {\n // silently fallback to original I/O string\n return inputOutputString;\n }\n};\n","/**\n * Utilities for converting Mastra Spans to OTel Spans\n * with Semantic conventions for generative AI systems\n * @see https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/gen-ai/README.md\n * @see https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/gen-ai/gen-ai-events.md\n * @see https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/gen-ai/gen-ai-spans.md\n * @see https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/gen-ai/gen-ai-agent-spans.md\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/non-normative/examples-llm-calls/\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/\n */\n\nimport { SpanType } from '@mastra/core/observability';\nimport type {\n AgentRunAttributes,\n AnyExportedSpan,\n MCPToolCallAttributes,\n ModelGenerationAttributes,\n ToolCallAttributes,\n UsageStats,\n} from '@mastra/core/observability';\nimport type { Attributes } from '@opentelemetry/api';\nimport {\n ATTR_ERROR_MESSAGE,\n ATTR_ERROR_TYPE,\n ATTR_GEN_AI_PROVIDER_NAME,\n ATTR_GEN_AI_REQUEST_MODEL,\n ATTR_GEN_AI_RESPONSE_MODEL,\n ATTR_GEN_AI_REQUEST_MAX_TOKENS,\n ATTR_GEN_AI_REQUEST_TEMPERATURE,\n ATTR_GEN_AI_REQUEST_TOP_P,\n ATTR_GEN_AI_REQUEST_TOP_K,\n ATTR_GEN_AI_REQUEST_PRESENCE_PENALTY,\n ATTR_GEN_AI_REQUEST_FREQUENCY_PENALTY,\n ATTR_GEN_AI_REQUEST_STOP_SEQUENCES,\n ATTR_GEN_AI_REQUEST_SEED,\n ATTR_GEN_AI_INPUT_MESSAGES,\n ATTR_GEN_AI_OUTPUT_MESSAGES,\n ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n ATTR_GEN_AI_AGENT_ID,\n ATTR_GEN_AI_AGENT_NAME,\n ATTR_GEN_AI_TOOL_DESCRIPTION,\n ATTR_GEN_AI_OPERATION_NAME,\n ATTR_GEN_AI_RESPONSE_FINISH_REASONS,\n ATTR_GEN_AI_RESPONSE_ID,\n ATTR_GEN_AI_CONVERSATION_ID,\n ATTR_GEN_AI_SYSTEM_INSTRUCTIONS,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n ATTR_GEN_AI_TOOL_NAME,\n} from '@opentelemetry/semantic-conventions/incubating';\nimport { convertMastraMessagesToGenAIMessages } from './gen-ai-messages';\n\n/**\n * Token usage attributes following OTel GenAI semantic conventions.\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-spans/\n */\nexport interface OtelUsageMetrics {\n [ATTR_GEN_AI_USAGE_INPUT_TOKENS]?: number;\n [ATTR_GEN_AI_USAGE_OUTPUT_TOKENS]?: number;\n 'gen_ai.usage.reasoning_tokens'?: number;\n 'gen_ai.usage.cached_input_tokens'?: number;\n 'gen_ai.usage.cache_write_tokens'?: number;\n 'gen_ai.usage.audio_input_tokens'?: number;\n 'gen_ai.usage.audio_output_tokens'?: number;\n}\n\n/**\n * Formats UsageStats to OTel GenAI semantic convention attributes.\n */\nexport function formatUsageMetrics(usage?: UsageStats): OtelUsageMetrics {\n if (!usage) return {};\n\n const metrics: OtelUsageMetrics = {};\n\n if (usage.inputTokens !== undefined) {\n metrics[ATTR_GEN_AI_USAGE_INPUT_TOKENS] = usage.inputTokens;\n }\n\n if (usage.outputTokens !== undefined) {\n metrics[ATTR_GEN_AI_USAGE_OUTPUT_TOKENS] = usage.outputTokens;\n }\n\n // Reasoning tokens from outputDetails\n if (usage.outputDetails?.reasoning !== undefined) {\n metrics['gen_ai.usage.reasoning_tokens'] = usage.outputDetails.reasoning;\n }\n\n // Cache read tokens from inputDetails\n if (usage.inputDetails?.cacheRead !== undefined) {\n metrics['gen_ai.usage.cached_input_tokens'] = usage.inputDetails.cacheRead;\n }\n\n // Cache write tokens from inputDetails\n if (usage.inputDetails?.cacheWrite !== undefined) {\n metrics['gen_ai.usage.cache_write_tokens'] = usage.inputDetails.cacheWrite;\n }\n\n // Audio tokens from inputDetails/outputDetails\n if (usage.inputDetails?.audio !== undefined) {\n metrics['gen_ai.usage.audio_input_tokens'] = usage.inputDetails.audio;\n }\n if (usage.outputDetails?.audio !== undefined) {\n metrics['gen_ai.usage.audio_output_tokens'] = usage.outputDetails.audio;\n }\n\n return metrics;\n}\n\n/**\n * Get the operation name based on span type for gen_ai.operation.name\n */\nfunction getOperationName(span: AnyExportedSpan): string {\n switch (span.type) {\n case SpanType.MODEL_GENERATION:\n return 'chat';\n case SpanType.TOOL_CALL:\n case SpanType.MCP_TOOL_CALL:\n return 'execute_tool';\n case SpanType.AGENT_RUN:\n return 'invoke_agent';\n case SpanType.WORKFLOW_RUN:\n return 'invoke_workflow';\n default:\n return span.type.toLowerCase();\n }\n}\n/**\n * Keep only unicode letters, numbers, dot, underscore, space, dash.\n */\nfunction sanitizeSpanName(name: string): string {\n return name.replace(/[^\\p{L}\\p{N}._ -]/gu, '');\n}\n\nfunction getSpanIdentifier(span: AnyExportedSpan): string | undefined {\n switch (span.type) {\n case SpanType.MODEL_GENERATION: {\n const attrs = span.attributes as ModelGenerationAttributes;\n return attrs?.model;\n }\n\n default:\n return span.entityName ?? span.entityId;\n }\n}\n\n/**\n * Get an OTEL-compliant span name based on span type and attributes\n */\nexport function getSpanName(span: AnyExportedSpan): string {\n const identifier = getSpanIdentifier(span);\n\n if (identifier) {\n const operation = getOperationName(span);\n return `${operation} ${identifier}`;\n }\n\n // For other types, use a simplified version of the original name\n return sanitizeSpanName(span.name);\n}\n\n/**\n * Gets OpenTelemetry attributes from Mastra Span\n * Following OTEL Semantic Conventions for GenAI\n */\nexport function getAttributes(span: AnyExportedSpan): Attributes {\n const attributes: Attributes = {};\n const spanType = span.type.toLowerCase();\n\n // Add gen_ai.operation.name based on span type\n attributes[ATTR_GEN_AI_OPERATION_NAME] = getOperationName(span);\n\n // Add span type for better visibility\n attributes['mastra.span.type'] = span.type;\n\n // Handle input/output based on span type\n // Always add input/output for Laminar compatibility\n if (span.input !== undefined) {\n const inputStr = typeof span.input === 'string' ? span.input : JSON.stringify(span.input);\n // Add specific attributes based on span type\n if (span.type === SpanType.MODEL_GENERATION) {\n attributes[ATTR_GEN_AI_INPUT_MESSAGES] = convertMastraMessagesToGenAIMessages(inputStr);\n } else if (span.type === SpanType.TOOL_CALL || span.type === SpanType.MCP_TOOL_CALL) {\n attributes['gen_ai.tool.call.arguments'] = inputStr;\n } else {\n attributes[`mastra.${spanType}.input`] = inputStr;\n }\n }\n\n if (span.output !== undefined) {\n const outputStr = typeof span.output === 'string' ? span.output : JSON.stringify(span.output);\n // Add specific attributes based on span type\n if (span.type === SpanType.MODEL_GENERATION) {\n attributes[ATTR_GEN_AI_OUTPUT_MESSAGES] = convertMastraMessagesToGenAIMessages(outputStr);\n // TODO\n // attributes['gen_ai.output.type'] = image/json/speech/text/<other>\n } else if (span.type === SpanType.TOOL_CALL || span.type === SpanType.MCP_TOOL_CALL) {\n attributes['gen_ai.tool.call.result'] = outputStr;\n } else {\n attributes[`mastra.${spanType}.output`] = outputStr;\n }\n }\n\n // Add model-specific attributes using OTEL semantic conventions\n if (span.type === SpanType.MODEL_GENERATION && span.attributes) {\n const modelAttrs = span.attributes as ModelGenerationAttributes;\n\n // Model and provider\n if (modelAttrs.model) {\n attributes[ATTR_GEN_AI_REQUEST_MODEL] = modelAttrs.model;\n }\n\n if (modelAttrs.provider) {\n attributes[ATTR_GEN_AI_PROVIDER_NAME] = normalizeProvider(modelAttrs.provider);\n }\n\n // Agent context - allows correlating model generation with the agent that invoked it\n if (span.entityId) {\n attributes[ATTR_GEN_AI_AGENT_ID] = span.entityId;\n }\n\n if (span.entityName) {\n attributes[ATTR_GEN_AI_AGENT_NAME] = span.entityName;\n }\n\n // Token usage - use OTEL standard naming + OpenInference conventions\n Object.assign(attributes, formatUsageMetrics(modelAttrs.usage));\n\n // Parameters using OTEL conventions\n if (modelAttrs.parameters) {\n if (modelAttrs.parameters.temperature !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_TEMPERATURE] = modelAttrs.parameters.temperature;\n }\n if (modelAttrs.parameters.maxOutputTokens !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_MAX_TOKENS] = modelAttrs.parameters.maxOutputTokens;\n }\n if (modelAttrs.parameters.topP !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_TOP_P] = modelAttrs.parameters.topP;\n }\n if (modelAttrs.parameters.topK !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_TOP_K] = modelAttrs.parameters.topK;\n }\n if (modelAttrs.parameters.presencePenalty !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_PRESENCE_PENALTY] = modelAttrs.parameters.presencePenalty;\n }\n if (modelAttrs.parameters.frequencyPenalty !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_FREQUENCY_PENALTY] = modelAttrs.parameters.frequencyPenalty;\n }\n if (modelAttrs.parameters.stopSequences) {\n attributes[ATTR_GEN_AI_REQUEST_STOP_SEQUENCES] = JSON.stringify(modelAttrs.parameters.stopSequences);\n }\n if (modelAttrs.parameters.seed) {\n attributes[ATTR_GEN_AI_REQUEST_SEED] = modelAttrs.parameters.seed;\n }\n }\n\n // Response attributes\n if (modelAttrs.finishReason) {\n attributes[ATTR_GEN_AI_RESPONSE_FINISH_REASONS] = JSON.stringify([modelAttrs.finishReason]);\n }\n if (modelAttrs.responseModel) {\n attributes[ATTR_GEN_AI_RESPONSE_MODEL] = modelAttrs.responseModel;\n }\n if (modelAttrs.responseId) {\n attributes[ATTR_GEN_AI_RESPONSE_ID] = modelAttrs.responseId;\n }\n\n // Server attributes\n if (modelAttrs.serverAddress) {\n attributes[ATTR_SERVER_ADDRESS] = modelAttrs.serverAddress;\n }\n if (modelAttrs.serverPort !== undefined) {\n attributes[ATTR_SERVER_PORT] = modelAttrs.serverPort;\n }\n }\n\n // Add tool-specific attributes using OTEL conventions\n if ((span.type === SpanType.TOOL_CALL || span.type === SpanType.MCP_TOOL_CALL) && span.attributes) {\n // Tool identification\n attributes[ATTR_GEN_AI_TOOL_NAME] = span.entityName ?? span.entityId;\n\n //TODO:\n // attributes['gen_ai.tool.call.id'] = call_mszuSIzqtI65i1wAUOE8w5H4\n\n // MCP-specific attributes\n if (span.type === SpanType.MCP_TOOL_CALL) {\n const mcpAttrs = span.attributes as MCPToolCallAttributes;\n if (mcpAttrs.mcpServer) {\n attributes[ATTR_SERVER_ADDRESS] = mcpAttrs.mcpServer;\n }\n } else {\n const toolAttrs = span.attributes as ToolCallAttributes;\n if (toolAttrs.toolDescription) {\n attributes[ATTR_GEN_AI_TOOL_DESCRIPTION] = toolAttrs.toolDescription;\n }\n if (toolAttrs.toolType) {\n attributes['gen_ai.tool.type'] = toolAttrs.toolType;\n }\n }\n }\n\n // Add agent-specific attributes\n if (span.type === SpanType.AGENT_RUN && span.attributes) {\n const agentAttrs = span.attributes as AgentRunAttributes;\n if (span.entityId) {\n attributes[ATTR_GEN_AI_AGENT_ID] = span.entityId;\n }\n if (span.entityName) {\n attributes[ATTR_GEN_AI_AGENT_NAME] = span.entityName;\n }\n if (agentAttrs.conversationId) {\n attributes[ATTR_GEN_AI_CONVERSATION_ID] = agentAttrs.conversationId;\n }\n if (agentAttrs.maxSteps) {\n attributes[`mastra.${spanType}.max_steps`] = agentAttrs.maxSteps;\n }\n if (agentAttrs.availableTools) {\n attributes[`gen_ai.tool.definitions`] = JSON.stringify(agentAttrs.availableTools);\n }\n\n //TODO:\n // attributes[ATTR_GEN_AI_AGENT_DESCRIPTION] = agentAttrs.description;\n // attributes[ATTR_GEN_AI_REQUEST_MODEL] = agentAttrs.model.name;\n\n attributes[ATTR_GEN_AI_SYSTEM_INSTRUCTIONS] = agentAttrs.instructions;\n }\n\n // Add error information if present\n if (span.errorInfo) {\n attributes[ATTR_ERROR_TYPE] = span.errorInfo.id || 'unknown';\n attributes[ATTR_ERROR_MESSAGE] = span.errorInfo.message;\n if (span.errorInfo.domain) {\n attributes['error.domain'] = span.errorInfo.domain;\n }\n if (span.errorInfo.category) {\n attributes['error.category'] = span.errorInfo.category;\n }\n }\n\n return attributes;\n}\n\n/**\n * Canonical OTel provider keys mapped to a list of possible fuzzy aliases.\n */\nconst PROVIDER_ALIASES: Record<string, string[]> = {\n anthropic: ['anthropic', 'claude'],\n 'aws.bedrock': ['awsbedrock', 'bedrock', 'amazonbedrock'],\n 'azure.ai.inference': ['azureaiinference', 'azureinference'],\n 'azure.ai.openai': ['azureaiopenai', 'azureopenai', 'msopenai', 'microsoftopenai'],\n cohere: ['cohere'],\n deepseek: ['deepseek'],\n 'gcp.gemini': ['gcpgemini', 'gemini'],\n 'gcp.gen_ai': ['gcpgenai', 'googlegenai', 'googleai'],\n 'gcp.vertex_ai': ['gcpvertexai', 'vertexai'],\n groq: ['groq'],\n 'ibm.watsonx.ai': ['ibmwatsonxai', 'watsonx', 'watsonxai'],\n mistral_ai: ['mistral', 'mistralai'],\n openai: ['openai', 'oai'],\n perplexity: ['perplexity', 'pplx'],\n x_ai: ['xai', 'x-ai', 'x_ai', 'x.com ai'],\n};\n\n/**\n * Normalize a provider input string into a matchable token.\n * Keep only alphanumerics and lowercase the result.\n */\nfunction normalizeProviderString(input: string): string {\n return input.toLowerCase().replace(/[^a-z0-9]/g, '');\n}\n\n/**\n * Attempts to map a providerName to one of the canonical OTel provider names.\n * If no match is found, returns the original providerName unchanged.\n */\nfunction normalizeProvider(providerName: string): string {\n const normalized = normalizeProviderString(providerName);\n\n for (const [canonical, aliases] of Object.entries(PROVIDER_ALIASES)) {\n for (const alias of aliases) {\n if (normalized === alias) {\n return canonical;\n }\n }\n }\n\n // No match → return the raw input in lowercase\n return providerName.toLowerCase();\n}\n","/**\n * Convert Mastra Spans to OpenTelemetry spans\n */\nimport { readFileSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport { SpanType } from '@mastra/core/observability';\nimport type { AnyExportedSpan } from '@mastra/core/observability';\nimport { SpanKind, SpanStatusCode, TraceFlags } from '@opentelemetry/api';\nimport type { HrTime, Link, SpanContext, SpanStatus } from '@opentelemetry/api';\nimport type { InstrumentationScope } from '@opentelemetry/core';\nimport type { Resource } from '@opentelemetry/resources';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\n\nimport type { ReadableSpan, TimedEvent } 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 { getAttributes, getSpanName } from './gen-ai-semantics.js';\nimport type { OtelExporterConfig } from './types.js';\n\nexport type SpanFormat = 'GenAI_v1_38_0';\n\n// If more formats come later:\n// export type SpanFormat =\n// | \"GenAI_v1_38_0\"\n// | \"GenAI_v1_38_0\"\n// | \"Custom_v2\";\n\nexport class SpanConverter {\n private resource?: Resource;\n private scope?: InstrumentationScope;\n private initPromise?: Promise<void>;\n private format: SpanFormat;\n\n constructor(\n private readonly params: {\n format: SpanFormat;\n packageName: string;\n serviceName?: string;\n config?: OtelExporterConfig;\n },\n ) {\n this.format = params.format;\n }\n\n /**\n * Lazily initialize resource & scope on first use.\n * Subsequent calls reuse the same promise (no races).\n */\n private async initIfNeeded(): Promise<void> {\n if (this.initPromise) {\n return this.initPromise;\n }\n\n this.initPromise = (async () => {\n const packageVersion = (await getPackageVersion(this.params.packageName)) ?? 'unknown';\n\n const serviceVersion = (await getPackageVersion('@mastra/core')) ?? 'unknown';\n\n let resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: this.params.serviceName || 'mastra-service',\n [ATTR_SERVICE_VERSION]: serviceVersion,\n [ATTR_TELEMETRY_SDK_NAME]: this.params.packageName,\n [ATTR_TELEMETRY_SDK_VERSION]: packageVersion,\n [ATTR_TELEMETRY_SDK_LANGUAGE]: 'nodejs',\n });\n\n if (this.params.config?.resourceAttributes) {\n resource = resource.merge(\n // Duplicate attributes from config will override defaults above\n resourceFromAttributes(this.params.config.resourceAttributes),\n );\n }\n\n this.resource = resource;\n this.scope = {\n name: this.params.packageName,\n version: packageVersion,\n };\n })();\n\n return this.initPromise;\n }\n\n /**\n * Convert a Mastra Span to an OpenTelemetry ReadableSpan\n */\n async convertSpan(span: AnyExportedSpan): Promise<ReadableSpan> {\n await this.initIfNeeded();\n\n if (!this.resource || !this.scope) {\n throw new Error('SpanConverter not initialized correctly');\n }\n\n // --- Core fields derived from Mastra span ---\n const name = getSpanName(span);\n const kind = getSpanKind(span.type);\n const attributes = getAttributes(span);\n\n // Add metadata as custom attributes (not gen_ai specific)\n if (span.metadata) {\n for (const [k, v] of Object.entries(span.metadata)) {\n if (v === null || v === undefined) {\n continue;\n }\n attributes[`mastra.metadata.${k}`] = typeof v === 'object' ? JSON.stringify(v) : v;\n }\n }\n\n // Add tags for root spans (only root spans can have tags)\n // Tags are JSON-stringified for maximum backend compatibility\n // While OTEL spec supports arrays, many backends (Jaeger, Zipkin, Tempo) don't fully support them\n if (span.isRootSpan && span.tags?.length) {\n attributes['mastra.tags'] = JSON.stringify(span.tags);\n }\n\n const startTime = dateToHrTime(span.startTime);\n const endTime = span.endTime ? dateToHrTime(span.endTime) : startTime;\n const duration = computeDuration(span.startTime, span.endTime);\n\n const { status, events } = buildStatusAndEvents(span, startTime);\n\n const spanContext: SpanContext = {\n traceId: span.traceId,\n spanId: span.id,\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n };\n\n const parentSpanContext = span.parentSpanId\n ? {\n traceId: span.traceId,\n spanId: span.parentSpanId,\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n }\n : undefined;\n\n const links: Link[] = []; // fill if you add link support later\n\n const readable: ReadableSpan = {\n name,\n kind,\n spanContext: () => spanContext,\n parentSpanContext,\n startTime,\n endTime,\n status,\n attributes,\n links,\n events,\n duration,\n ended: !!span.endTime,\n resource: this.resource,\n instrumentationScope: this.scope,\n droppedAttributesCount: 0,\n droppedEventsCount: 0,\n droppedLinksCount: 0,\n };\n\n return readable;\n }\n}\n\nasync function getPackageVersion(pkgName: string): Promise<string | undefined> {\n try {\n // Resolve `package.json` for the given package\n const manifestUrl = new URL(await import.meta.resolve(`${pkgName}/package.json`));\n\n const path = fileURLToPath(manifestUrl);\n const pkgJson = JSON.parse(readFileSync(path, 'utf8'));\n return pkgJson.version;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Get the appropriate Otel SpanKind based on Mastra SpanType.\n *\n * @param type - The Mastra span type\n * @returns The appropriate OTEL SpanKind\n */\nexport function getSpanKind(type: SpanType): SpanKind {\n switch (type) {\n case SpanType.MODEL_GENERATION:\n case SpanType.MCP_TOOL_CALL:\n return SpanKind.CLIENT;\n default:\n return SpanKind.INTERNAL;\n }\n}\n\n/**\n * Convert JavaScript Date to hrtime format\n */\nfunction dateToHrTime(date: Date): HrTime {\n const ms = date.getTime();\n const seconds = Math.floor(ms / 1000);\n const nanoseconds = (ms % 1000) * 1000000;\n return [seconds, nanoseconds];\n}\n\nfunction computeDuration(start: Date, end?: Date): HrTime {\n if (!end) return [0, 0];\n const diffMs = end.getTime() - start.getTime();\n return [Math.floor(diffMs / 1000), (diffMs % 1000) * 1_000_000];\n}\n\n/**\n * Build status + events from span.errorInfo (if present)\n */\nfunction buildStatusAndEvents(\n span: AnyExportedSpan,\n defaultTime: HrTime,\n): { status: SpanStatus; events: TimedEvent[] } {\n const events: TimedEvent[] = [];\n\n if (span.errorInfo) {\n const status: SpanStatus = {\n code: SpanStatusCode.ERROR,\n message: span.errorInfo.message,\n };\n\n events.push({\n name: 'exception',\n attributes: {\n 'exception.message': span.errorInfo.message,\n 'exception.type': 'Error',\n ...(span.errorInfo.details?.stack && {\n 'exception.stacktrace': span.errorInfo.details.stack as string,\n }),\n },\n time: defaultTime,\n droppedAttributesCount: 0,\n });\n\n return { status, events };\n }\n\n if (span.endTime) {\n return {\n status: { code: SpanStatusCode.OK },\n events,\n };\n }\n\n return {\n status: { code: SpanStatusCode.UNSET },\n events,\n };\n}\n","/**\n * OpenTelemetry Tracing Exporter for Mastra\n */\n\nimport type {\n TracingEvent,\n AnyExportedSpan,\n InitExporterOptions,\n ObservabilityInstanceConfig,\n} from '@mastra/core/observability';\nimport { TracingEventType } from '@mastra/core/observability';\nimport { BaseExporter } from '@mastra/observability';\nimport { diag, DiagConsoleLogger, DiagLogLevel } from '@opentelemetry/api';\n\nimport { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport type { SpanExporter } from '@opentelemetry/sdk-trace-base';\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 extends BaseExporter {\n private config: OtelExporterConfig;\n private observabilityConfig?: ObservabilityInstanceConfig;\n private spanConverter?: SpanConverter;\n private processor?: BatchSpanProcessor;\n private exporter?: SpanExporter;\n private isSetup: boolean = false;\n\n name = 'opentelemetry';\n\n constructor(config: OtelExporterConfig) {\n super(config);\n\n this.config = config;\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(options: InitExporterOptions) {\n this.observabilityConfig = options.config;\n }\n\n private async setupExporter() {\n // already setup or exporter already set\n if (this.isSetup || this.exporter) return;\n\n // Provider configuration is required\n if (!this.config.provider) {\n this.setDisabled(\n '[OtelExporter] Provider configuration is required. Use the \"custom\" provider for generic endpoints.',\n );\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.setDisabled('[OtelExporter] Provider configuration validation failed.');\n this.isSetup = true;\n return;\n }\n\n // user provided an instantiated SpanExporter, use it\n if (this.config.exporter) {\n this.exporter = this.config.exporter;\n return;\n }\n\n const endpoint = resolved.endpoint;\n const headers = resolved.headers;\n const protocol = resolved.protocol;\n\n // Load and create the appropriate exporter based on protocol\n const providerName = Object.keys(this.config.provider)[0];\n const ExporterClass = await loadExporter(protocol, providerName);\n\n if (!ExporterClass) {\n // Exporter not available, disable tracing\n this.setDisabled(`[OtelExporter] Exporter not available for protocol: ${protocol}`);\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.setDisabled(\n `[OtelExporter] Failed to load gRPC metadata. Install required packages:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-grpc @grpc/grpc-js`,\n );\n this.logger.error('[OtelExporter] gRPC error details:', grpcError);\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.setDisabled('[OtelExporter] Failed to create exporter.');\n this.logger.error('[OtelExporter] Exporter creation error details:', error);\n this.isSetup = true;\n return;\n }\n }\n\n private async setupProcessor() {\n if (this.processor || this.isSetup) return;\n\n this.spanConverter = new SpanConverter({\n packageName: '@mastra/otel-exporter',\n serviceName: this.observabilityConfig?.serviceName,\n config: this.config,\n format: 'GenAI_v1_38_0',\n });\n\n // Always use BatchSpanProcessor for production\n // It queues spans and exports them in batches for better performance\n this.processor = new BatchSpanProcessor(this.exporter!, {\n maxExportBatchSize: this.config.batchSize || 512, // Default batch size\n maxQueueSize: 2048, // Maximum spans to queue\n scheduledDelayMillis: 5000, // Export every 5 seconds\n exportTimeoutMillis: this.config.timeout || 30000, // Export timeout\n });\n\n this.logger.debug(\n `[OtelExporter] Using BatchSpanProcessor (batch size: ${this.config.batchSize || 512}, delay: 5s)`,\n );\n }\n\n private async setup() {\n if (this.isSetup) return;\n await this.setupExporter();\n await this.setupProcessor();\n this.isSetup = true;\n }\n\n protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n // Only process SPAN_ENDED events for OTEL\n // OTEL expects complete spans with start and end times\n if (event.type !== TracingEventType.SPAN_ENDED) {\n return;\n }\n\n const span = event.exportedSpan;\n await this.exportSpan(span);\n }\n\n private async exportSpan(span: AnyExportedSpan): Promise<void> {\n // Ensure exporter is set up\n if (!this.isSetup) {\n await this.setup();\n }\n\n // Skip if disabled\n if (this.isDisabled || !this.processor) {\n return;\n }\n\n try {\n // Convert the span to OTEL format\n const otelSpan = await 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(otelSpan);\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.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export { OtelExporter } from './tracing.js';
2
2
  export { SpanConverter, getSpanKind } from './span-converter.js';
3
+ export { getAttributes, getSpanName } from './gen-ai-semantics.js';
3
4
  export type { OtelExporterConfig, ProviderConfig, Dash0Config, SignozConfig, NewRelicConfig, TraceloopConfig, LaminarConfig, CustomConfig, ExportProtocol, } from './types.js';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACjE,YAAY,EACV,kBAAkB,EAClB,cAAc,EACd,WAAW,EACX,YAAY,EACZ,cAAc,EACd,eAAe,EACf,aAAa,EACb,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACnE,YAAY,EACV,kBAAkB,EAClB,cAAc,EACd,WAAW,EACX,YAAY,EACZ,cAAc,EACd,eAAe,EACf,aAAa,EACb,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -199,7 +199,6 @@ function resolveTraceloopConfig(config) {
199
199
  }
200
200
  function resolveLaminarConfig(config) {
201
201
  const apiKey = config.apiKey ?? process.env.LMNR_PROJECT_API_KEY;
202
- const teamId = config.teamId ?? process.env.LAMINAR_TEAM_ID;
203
202
  const configEndpoint = config.endpoint ?? process.env.LAMINAR_ENDPOINT;
204
203
  if (!apiKey) {
205
204
  console.error(
@@ -211,9 +210,6 @@ function resolveLaminarConfig(config) {
211
210
  const headers = {
212
211
  Authorization: `Bearer ${apiKey}`
213
212
  };
214
- if (teamId) {
215
- headers["x-laminar-team-id"] = teamId;
216
- }
217
213
  return {
218
214
  endpoint,
219
215
  headers,
@@ -358,10 +354,10 @@ function getSpanIdentifier(span) {
358
354
  switch (span.type) {
359
355
  case SpanType.MODEL_GENERATION: {
360
356
  const attrs = span.attributes;
361
- return attrs?.model ?? "unknown";
357
+ return attrs?.model;
362
358
  }
363
359
  default:
364
- return span.entityName ?? span.entityId ?? "unknown";
360
+ return span.entityName ?? span.entityId;
365
361
  }
366
362
  }
367
363
  function getSpanName(span) {
@@ -725,16 +721,15 @@ var OtelExporter = class extends BaseExporter {
725
721
  async setupExporter() {
726
722
  if (this.isSetup || this.exporter) return;
727
723
  if (!this.config.provider) {
728
- this.logger.error(
724
+ this.setDisabled(
729
725
  '[OtelExporter] Provider configuration is required. Use the "custom" provider for generic endpoints.'
730
726
  );
731
- this.isDisabled = true;
732
727
  this.isSetup = true;
733
728
  return;
734
729
  }
735
730
  const resolved = resolveProviderConfig(this.config.provider);
736
731
  if (!resolved) {
737
- this.isDisabled = true;
732
+ this.setDisabled("[OtelExporter] Provider configuration validation failed.");
738
733
  this.isSetup = true;
739
734
  return;
740
735
  }
@@ -748,7 +743,7 @@ var OtelExporter = class extends BaseExporter {
748
743
  const providerName = Object.keys(this.config.provider)[0];
749
744
  const ExporterClass = await loadExporter(protocol, providerName);
750
745
  if (!ExporterClass) {
751
- this.isDisabled = true;
746
+ this.setDisabled(`[OtelExporter] Exporter not available for protocol: ${protocol}`);
752
747
  this.isSetup = true;
753
748
  return;
754
749
  }
@@ -767,13 +762,11 @@ var OtelExporter = class extends BaseExporter {
767
762
  metadata.set(key, value);
768
763
  });
769
764
  } catch (grpcError) {
770
- this.logger.error(
765
+ this.setDisabled(
771
766
  `[OtelExporter] Failed to load gRPC metadata. Install required packages:
772
- npm install @opentelemetry/exporter-trace-otlp-grpc @grpc/grpc-js
773
- `,
774
- grpcError
767
+ npm install @opentelemetry/exporter-trace-otlp-grpc @grpc/grpc-js`
775
768
  );
776
- this.isDisabled = true;
769
+ this.logger.error("[OtelExporter] gRPC error details:", grpcError);
777
770
  this.isSetup = true;
778
771
  return;
779
772
  }
@@ -790,8 +783,8 @@ var OtelExporter = class extends BaseExporter {
790
783
  });
791
784
  }
792
785
  } catch (error) {
793
- this.logger.error(`[OtelExporter] Failed to create exporter:`, error);
794
- this.isDisabled = true;
786
+ this.setDisabled("[OtelExporter] Failed to create exporter.");
787
+ this.logger.error("[OtelExporter] Exporter creation error details:", error);
795
788
  this.isSetup = true;
796
789
  return;
797
790
  }
@@ -858,6 +851,6 @@ var OtelExporter = class extends BaseExporter {
858
851
  }
859
852
  };
860
853
 
861
- export { OtelExporter, SpanConverter, getSpanKind };
854
+ export { OtelExporter, SpanConverter, getAttributes, getSpanKind, getSpanName };
862
855
  //# sourceMappingURL=index.js.map
863
856
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/loadExporter.ts","../src/provider-configs.ts","../src/gen-ai-messages.ts","../src/gen-ai-semantics.ts","../src/span-converter.ts","../src/tracing.ts"],"names":["SpanType"],"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 // Read from config or environment variables\n const apiKey = config.apiKey ?? process.env.DASH0_API_KEY;\n const configEndpoint = config.endpoint ?? process.env.DASH0_ENDPOINT;\n const dataset = config.dataset ?? process.env.DASH0_DATASET;\n\n if (!apiKey) {\n console.error(\n '[OtelExporter] Dash0 configuration requires apiKey. ' +\n 'Set DASH0_API_KEY environment variable or pass it in config. Tracing will be disabled.',\n );\n return null;\n }\n\n if (!configEndpoint) {\n console.error(\n '[OtelExporter] Dash0 configuration requires endpoint. ' +\n 'Set DASH0_ENDPOINT environment variable or pass it in config. Tracing will be disabled.',\n );\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 = configEndpoint;\n if (!endpoint.includes('/v1/traces')) {\n endpoint = `${endpoint}/v1/traces`;\n }\n\n const headers: Record<string, string> = {\n authorization: `Bearer ${apiKey}`, // lowercase for gRPC metadata\n };\n\n if (dataset) {\n headers['dash0-dataset'] = 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 // Read from config or environment variables\n const apiKey = config.apiKey ?? process.env.SIGNOZ_API_KEY;\n const region = config.region ?? (process.env.SIGNOZ_REGION as 'us' | 'eu' | 'in' | undefined);\n const configEndpoint = config.endpoint ?? process.env.SIGNOZ_ENDPOINT;\n\n if (!apiKey) {\n console.error(\n '[OtelExporter] SigNoz configuration requires apiKey. ' +\n 'Set SIGNOZ_API_KEY environment variable or pass it in config. Tracing will be disabled.',\n );\n return null;\n }\n\n // SigNoz uses OTLP endpoint with /v1/traces suffix\n const endpoint = configEndpoint || `https://ingest.${region || 'us'}.signoz.cloud:443/v1/traces`;\n\n return {\n endpoint,\n headers: {\n 'signoz-ingestion-key': apiKey,\n },\n protocol: 'http/protobuf',\n };\n}\n\nfunction resolveNewRelicConfig(config: NewRelicConfig): ResolvedProviderConfig | null {\n // Read from config or environment variables\n const apiKey = config.apiKey ?? process.env.NEW_RELIC_LICENSE_KEY;\n const configEndpoint = config.endpoint ?? process.env.NEW_RELIC_ENDPOINT;\n\n if (!apiKey) {\n console.error(\n '[OtelExporter] New Relic configuration requires apiKey (license key). ' +\n 'Set NEW_RELIC_LICENSE_KEY environment variable or pass it in config. Tracing will be disabled.',\n );\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 = configEndpoint || 'https://otlp.nr-data.net:443/v1/traces';\n\n return {\n endpoint,\n headers: {\n 'api-key': apiKey,\n },\n protocol: 'http/protobuf',\n };\n}\n\nfunction resolveTraceloopConfig(config: TraceloopConfig): ResolvedProviderConfig | null {\n // Read from config or environment variables\n const apiKey = config.apiKey ?? process.env.TRACELOOP_API_KEY;\n const destinationId = config.destinationId ?? process.env.TRACELOOP_DESTINATION_ID;\n const configEndpoint = config.endpoint ?? process.env.TRACELOOP_ENDPOINT;\n\n if (!apiKey) {\n console.error(\n '[OtelExporter] Traceloop configuration requires apiKey. ' +\n 'Set TRACELOOP_API_KEY environment variable or pass it in config. Tracing will be disabled.',\n );\n return null;\n }\n\n // Traceloop uses OTLP endpoint with /v1/traces suffix\n const endpoint = configEndpoint || 'https://api.traceloop.com/v1/traces';\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${apiKey}`,\n };\n\n if (destinationId) {\n headers['x-traceloop-destination-id'] = destinationId;\n }\n\n return {\n endpoint,\n headers,\n protocol: 'http/json',\n };\n}\n\nfunction resolveLaminarConfig(config: LaminarConfig): ResolvedProviderConfig | null {\n // Read from config or environment variables\n // LMNR_PROJECT_API_KEY is the standard Laminar environment variable\n const apiKey = config.apiKey ?? process.env.LMNR_PROJECT_API_KEY;\n const teamId = config.teamId ?? process.env.LAMINAR_TEAM_ID;\n const configEndpoint = config.endpoint ?? process.env.LAMINAR_ENDPOINT;\n\n if (!apiKey) {\n console.error(\n '[OtelExporter] Laminar configuration requires apiKey. ' +\n 'Set LMNR_PROJECT_API_KEY environment variable or pass it in config. Tracing will be disabled.',\n );\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 = configEndpoint || 'https://api.lmnr.ai/v1/traces';\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${apiKey}`,\n };\n\n // Only add team ID header if provided (for backwards compatibility)\n if (teamId) {\n headers['x-laminar-team-id'] = 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 * Utilities for converting Mastra messages to OpenTelemetry gen_ai message format\n * Based on OpenTelemetry GenAI semantic conventions\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/#gen-ai-input-messages\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-input-messages.json\n */\n\n/**\n * Type representation of a gen_ai chat message part\n */\ntype GenAIMessagePart =\n | {\n type: 'text';\n content: string;\n }\n | {\n type: 'tool_call';\n id: string;\n name: string;\n arguments: string;\n }\n | {\n type: 'tool_call_response';\n id: string;\n name: string;\n response: string;\n };\n\n/**\n * Type representation of a gen_ai chat message\n */\ntype GenAIMessage = {\n role: string;\n parts: GenAIMessagePart[];\n};\n\n/**\n * Assumed type representation of a Mastra message content type\n */\ntype MastraMessagePart =\n | {\n type: 'text';\n text: string;\n }\n | { type: 'tool-call'; toolCallId: string; toolName: string; input: unknown }\n | { type: 'tool-result'; toolCallId: string; toolName: string; output: { value: unknown } };\n\n/**\n * Assumed type representation of a Mastra message\n */\ntype MastraMessage = {\n role: string;\n content: MastraMessagePart[] | string;\n};\n\nconst isMastraMessagePart = (p: unknown): p is MastraMessagePart => {\n return (\n typeof p === 'object' &&\n p != null &&\n 'type' in p &&\n (p.type === 'text' || p.type === 'tool-call' || p.type === 'tool-result') &&\n ((p.type === 'text' && 'text' in p) ||\n (p.type === 'tool-call' && 'toolCallId' in p && 'toolName' in p && 'input' in p) ||\n (p.type === 'tool-result' && 'toolCallId' in p && 'toolName' in p && 'output' in p))\n );\n};\n\nconst isMastraMessage = (m: unknown): m is MastraMessage => {\n return (\n typeof m === 'object' &&\n m != null &&\n 'role' in m &&\n 'content' in m &&\n (typeof m.content === 'string' || (Array.isArray(m.content) && m.content.every(isMastraMessagePart)))\n );\n};\n\n/**\n * Convert an Input/Output string from a MastraSpan into a jsonified string that adheres to\n * OpenTelemetry gen_ai.input.messages and gen_ai.output.messages schema.\n * If parsing fails at any step, the original inputOutputString is returned unmodified.\n *\n * This conversion is best effort; It assumes a consistent shape for mastra messages, and converts\n * into the gen_ai input and output schemas as of October 20th, 2025.\n *\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/#gen-ai-input-messages\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-input-messages.json\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/#gen-ai-output-messages\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-output-messages.json\n *\n * @param inputOutputString a jsonified string that contains messages adhering to what appears to be\n * Mastra's message shape.\n * @returns a jsonified string that contains messages adhering to the OpenTelemetry gen_ai.input.messages and gen_ai.output.messages schema.\n * If parsing fails at any step, the original inputOutputString is returned unmodified.\n */\nexport const convertMastraMessagesToGenAIMessages = (inputOutputString: string): string => {\n try {\n const parsedIO = JSON.parse(inputOutputString) as unknown;\n if (typeof parsedIO !== 'object' || parsedIO == null || (!('messages' in parsedIO) && !('text' in parsedIO))) {\n // inputOutputString fails initial type guard, just return it\n return inputOutputString;\n }\n // if the IO simply contains a text string, return a single text message\n // formatted as a gen_ai assistant message, assuming its an assistant response\n if ('text' in parsedIO) {\n return JSON.stringify([\n {\n role: 'assistant',\n parts: [{ type: 'text', content: parsedIO.text as string }],\n } satisfies GenAIMessage,\n ]);\n }\n // if the IO contains messages, convert them to gen_ai messages\n if (Array.isArray(parsedIO.messages)) {\n return JSON.stringify(\n (parsedIO.messages as unknown[]).map(m => {\n if (!isMastraMessage(m)) {\n return m;\n }\n const role = m.role;\n let parts: GenAIMessagePart[] = [];\n if (Array.isArray(m.content)) {\n parts = m.content.map(c => {\n switch (c.type) {\n case 'text':\n return {\n type: 'text',\n content: c.text,\n };\n case 'tool-call':\n return {\n type: 'tool_call',\n id: c.toolCallId,\n name: c.toolName,\n arguments: JSON.stringify(c.input),\n };\n case 'tool-result':\n return {\n type: 'tool_call_response',\n id: c.toolCallId,\n name: c.toolName,\n response: JSON.stringify(c.output.value),\n };\n default:\n return c;\n }\n });\n } else {\n parts = [\n {\n type: 'text',\n content: m.content,\n },\n ];\n }\n return {\n role,\n parts,\n } satisfies GenAIMessage;\n }),\n );\n }\n // we've failed type-guards, just return original I/O string\n return inputOutputString;\n } catch {\n // silently fallback to original I/O string\n return inputOutputString;\n }\n};\n","/**\n * Utilities for converting Mastra Spans to OTel Spans\n * with Semantic conventions for generative AI systems\n * @see https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/gen-ai/README.md\n * @see https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/gen-ai/gen-ai-events.md\n * @see https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/gen-ai/gen-ai-spans.md\n * @see https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/gen-ai/gen-ai-agent-spans.md\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/non-normative/examples-llm-calls/\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/\n */\n\nimport { SpanType } from '@mastra/core/observability';\nimport type {\n AgentRunAttributes,\n AnyExportedSpan,\n MCPToolCallAttributes,\n ModelGenerationAttributes,\n ToolCallAttributes,\n UsageStats,\n} from '@mastra/core/observability';\nimport type { Attributes } from '@opentelemetry/api';\nimport {\n ATTR_ERROR_MESSAGE,\n ATTR_ERROR_TYPE,\n ATTR_GEN_AI_PROVIDER_NAME,\n ATTR_GEN_AI_REQUEST_MODEL,\n ATTR_GEN_AI_RESPONSE_MODEL,\n ATTR_GEN_AI_REQUEST_MAX_TOKENS,\n ATTR_GEN_AI_REQUEST_TEMPERATURE,\n ATTR_GEN_AI_REQUEST_TOP_P,\n ATTR_GEN_AI_REQUEST_TOP_K,\n ATTR_GEN_AI_REQUEST_PRESENCE_PENALTY,\n ATTR_GEN_AI_REQUEST_FREQUENCY_PENALTY,\n ATTR_GEN_AI_REQUEST_STOP_SEQUENCES,\n ATTR_GEN_AI_REQUEST_SEED,\n ATTR_GEN_AI_INPUT_MESSAGES,\n ATTR_GEN_AI_OUTPUT_MESSAGES,\n ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n ATTR_GEN_AI_AGENT_ID,\n ATTR_GEN_AI_AGENT_NAME,\n ATTR_GEN_AI_TOOL_DESCRIPTION,\n ATTR_GEN_AI_OPERATION_NAME,\n ATTR_GEN_AI_RESPONSE_FINISH_REASONS,\n ATTR_GEN_AI_RESPONSE_ID,\n ATTR_GEN_AI_CONVERSATION_ID,\n ATTR_GEN_AI_SYSTEM_INSTRUCTIONS,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n ATTR_GEN_AI_TOOL_NAME,\n} from '@opentelemetry/semantic-conventions/incubating';\nimport { convertMastraMessagesToGenAIMessages } from './gen-ai-messages';\n\n/**\n * Token usage attributes following OTel GenAI semantic conventions.\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-spans/\n */\nexport interface OtelUsageMetrics {\n [ATTR_GEN_AI_USAGE_INPUT_TOKENS]?: number;\n [ATTR_GEN_AI_USAGE_OUTPUT_TOKENS]?: number;\n 'gen_ai.usage.reasoning_tokens'?: number;\n 'gen_ai.usage.cached_input_tokens'?: number;\n 'gen_ai.usage.cache_write_tokens'?: number;\n 'gen_ai.usage.audio_input_tokens'?: number;\n 'gen_ai.usage.audio_output_tokens'?: number;\n}\n\n/**\n * Formats UsageStats to OTel GenAI semantic convention attributes.\n */\nexport function formatUsageMetrics(usage?: UsageStats): OtelUsageMetrics {\n if (!usage) return {};\n\n const metrics: OtelUsageMetrics = {};\n\n if (usage.inputTokens !== undefined) {\n metrics[ATTR_GEN_AI_USAGE_INPUT_TOKENS] = usage.inputTokens;\n }\n\n if (usage.outputTokens !== undefined) {\n metrics[ATTR_GEN_AI_USAGE_OUTPUT_TOKENS] = usage.outputTokens;\n }\n\n // Reasoning tokens from outputDetails\n if (usage.outputDetails?.reasoning !== undefined) {\n metrics['gen_ai.usage.reasoning_tokens'] = usage.outputDetails.reasoning;\n }\n\n // Cache read tokens from inputDetails\n if (usage.inputDetails?.cacheRead !== undefined) {\n metrics['gen_ai.usage.cached_input_tokens'] = usage.inputDetails.cacheRead;\n }\n\n // Cache write tokens from inputDetails\n if (usage.inputDetails?.cacheWrite !== undefined) {\n metrics['gen_ai.usage.cache_write_tokens'] = usage.inputDetails.cacheWrite;\n }\n\n // Audio tokens from inputDetails/outputDetails\n if (usage.inputDetails?.audio !== undefined) {\n metrics['gen_ai.usage.audio_input_tokens'] = usage.inputDetails.audio;\n }\n if (usage.outputDetails?.audio !== undefined) {\n metrics['gen_ai.usage.audio_output_tokens'] = usage.outputDetails.audio;\n }\n\n return metrics;\n}\n\n/**\n * Get the operation name based on span type for gen_ai.operation.name\n */\nfunction getOperationName(span: AnyExportedSpan): string {\n switch (span.type) {\n case SpanType.MODEL_GENERATION:\n return 'chat';\n case SpanType.TOOL_CALL:\n case SpanType.MCP_TOOL_CALL:\n return 'execute_tool';\n case SpanType.AGENT_RUN:\n return 'invoke_agent';\n case SpanType.WORKFLOW_RUN:\n return 'invoke_workflow';\n default:\n return span.type.toLowerCase();\n }\n}\n/**\n * Keep only unicode letters, numbers, dot, underscore, space, dash.\n */\nfunction sanitizeSpanName(name: string): string {\n return name.replace(/[^\\p{L}\\p{N}._ -]/gu, '');\n}\n\nfunction getSpanIdentifier(span: AnyExportedSpan): string | null {\n switch (span.type) {\n case SpanType.MODEL_GENERATION: {\n const attrs = span.attributes as ModelGenerationAttributes;\n return attrs?.model ?? 'unknown';\n }\n\n default:\n return span.entityName ?? span.entityId ?? 'unknown';\n }\n}\n\n/**\n * Get an OTEL-compliant span name based on span type and attributes\n */\nexport function getSpanName(span: AnyExportedSpan): string {\n const identifier = getSpanIdentifier(span);\n\n if (identifier) {\n const operation = getOperationName(span);\n return `${operation} ${identifier}`;\n }\n\n // For other types, use a simplified version of the original name\n return sanitizeSpanName(span.name);\n}\n\n/**\n * Gets OpenTelemetry attributes from Mastra Span\n * Following OTEL Semantic Conventions for GenAI\n */\nexport function getAttributes(span: AnyExportedSpan): Attributes {\n const attributes: Attributes = {};\n const spanType = span.type.toLowerCase();\n\n // Add gen_ai.operation.name based on span type\n attributes[ATTR_GEN_AI_OPERATION_NAME] = getOperationName(span);\n\n // Add span type for better visibility\n attributes['mastra.span.type'] = span.type;\n\n // Handle input/output based on span type\n // Always add input/output for Laminar compatibility\n if (span.input !== undefined) {\n const inputStr = typeof span.input === 'string' ? span.input : JSON.stringify(span.input);\n // Add specific attributes based on span type\n if (span.type === SpanType.MODEL_GENERATION) {\n attributes[ATTR_GEN_AI_INPUT_MESSAGES] = convertMastraMessagesToGenAIMessages(inputStr);\n } else if (span.type === SpanType.TOOL_CALL || span.type === SpanType.MCP_TOOL_CALL) {\n attributes['gen_ai.tool.call.arguments'] = inputStr;\n } else {\n attributes[`mastra.${spanType}.input`] = inputStr;\n }\n }\n\n if (span.output !== undefined) {\n const outputStr = typeof span.output === 'string' ? span.output : JSON.stringify(span.output);\n // Add specific attributes based on span type\n if (span.type === SpanType.MODEL_GENERATION) {\n attributes[ATTR_GEN_AI_OUTPUT_MESSAGES] = convertMastraMessagesToGenAIMessages(outputStr);\n // TODO\n // attributes['gen_ai.output.type'] = image/json/speech/text/<other>\n } else if (span.type === SpanType.TOOL_CALL || span.type === SpanType.MCP_TOOL_CALL) {\n attributes['gen_ai.tool.call.result'] = outputStr;\n } else {\n attributes[`mastra.${spanType}.output`] = outputStr;\n }\n }\n\n // Add model-specific attributes using OTEL semantic conventions\n if (span.type === SpanType.MODEL_GENERATION && span.attributes) {\n const modelAttrs = span.attributes as ModelGenerationAttributes;\n\n // Model and provider\n if (modelAttrs.model) {\n attributes[ATTR_GEN_AI_REQUEST_MODEL] = modelAttrs.model;\n }\n\n if (modelAttrs.provider) {\n attributes[ATTR_GEN_AI_PROVIDER_NAME] = normalizeProvider(modelAttrs.provider);\n }\n\n // Agent context - allows correlating model generation with the agent that invoked it\n if (span.entityId) {\n attributes[ATTR_GEN_AI_AGENT_ID] = span.entityId;\n }\n\n if (span.entityName) {\n attributes[ATTR_GEN_AI_AGENT_NAME] = span.entityName;\n }\n\n // Token usage - use OTEL standard naming + OpenInference conventions\n Object.assign(attributes, formatUsageMetrics(modelAttrs.usage));\n\n // Parameters using OTEL conventions\n if (modelAttrs.parameters) {\n if (modelAttrs.parameters.temperature !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_TEMPERATURE] = modelAttrs.parameters.temperature;\n }\n if (modelAttrs.parameters.maxOutputTokens !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_MAX_TOKENS] = modelAttrs.parameters.maxOutputTokens;\n }\n if (modelAttrs.parameters.topP !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_TOP_P] = modelAttrs.parameters.topP;\n }\n if (modelAttrs.parameters.topK !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_TOP_K] = modelAttrs.parameters.topK;\n }\n if (modelAttrs.parameters.presencePenalty !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_PRESENCE_PENALTY] = modelAttrs.parameters.presencePenalty;\n }\n if (modelAttrs.parameters.frequencyPenalty !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_FREQUENCY_PENALTY] = modelAttrs.parameters.frequencyPenalty;\n }\n if (modelAttrs.parameters.stopSequences) {\n attributes[ATTR_GEN_AI_REQUEST_STOP_SEQUENCES] = JSON.stringify(modelAttrs.parameters.stopSequences);\n }\n if (modelAttrs.parameters.seed) {\n attributes[ATTR_GEN_AI_REQUEST_SEED] = modelAttrs.parameters.seed;\n }\n }\n\n // Response attributes\n if (modelAttrs.finishReason) {\n attributes[ATTR_GEN_AI_RESPONSE_FINISH_REASONS] = JSON.stringify([modelAttrs.finishReason]);\n }\n if (modelAttrs.responseModel) {\n attributes[ATTR_GEN_AI_RESPONSE_MODEL] = modelAttrs.responseModel;\n }\n if (modelAttrs.responseId) {\n attributes[ATTR_GEN_AI_RESPONSE_ID] = modelAttrs.responseId;\n }\n\n // Server attributes\n if (modelAttrs.serverAddress) {\n attributes[ATTR_SERVER_ADDRESS] = modelAttrs.serverAddress;\n }\n if (modelAttrs.serverPort !== undefined) {\n attributes[ATTR_SERVER_PORT] = modelAttrs.serverPort;\n }\n }\n\n // Add tool-specific attributes using OTEL conventions\n if ((span.type === SpanType.TOOL_CALL || span.type === SpanType.MCP_TOOL_CALL) && span.attributes) {\n // Tool identification\n attributes[ATTR_GEN_AI_TOOL_NAME] = span.entityName ?? span.entityId;\n\n //TODO:\n // attributes['gen_ai.tool.call.id'] = call_mszuSIzqtI65i1wAUOE8w5H4\n\n // MCP-specific attributes\n if (span.type === SpanType.MCP_TOOL_CALL) {\n const mcpAttrs = span.attributes as MCPToolCallAttributes;\n if (mcpAttrs.mcpServer) {\n attributes[ATTR_SERVER_ADDRESS] = mcpAttrs.mcpServer;\n }\n } else {\n const toolAttrs = span.attributes as ToolCallAttributes;\n if (toolAttrs.toolDescription) {\n attributes[ATTR_GEN_AI_TOOL_DESCRIPTION] = toolAttrs.toolDescription;\n }\n if (toolAttrs.toolType) {\n attributes['gen_ai.tool.type'] = toolAttrs.toolType;\n }\n }\n }\n\n // Add agent-specific attributes\n if (span.type === SpanType.AGENT_RUN && span.attributes) {\n const agentAttrs = span.attributes as AgentRunAttributes;\n if (span.entityId) {\n attributes[ATTR_GEN_AI_AGENT_ID] = span.entityId;\n }\n if (span.entityName) {\n attributes[ATTR_GEN_AI_AGENT_NAME] = span.entityName;\n }\n if (agentAttrs.conversationId) {\n attributes[ATTR_GEN_AI_CONVERSATION_ID] = agentAttrs.conversationId;\n }\n if (agentAttrs.maxSteps) {\n attributes[`mastra.${spanType}.max_steps`] = agentAttrs.maxSteps;\n }\n if (agentAttrs.availableTools) {\n attributes[`gen_ai.tool.definitions`] = JSON.stringify(agentAttrs.availableTools);\n }\n\n //TODO:\n // attributes[ATTR_GEN_AI_AGENT_DESCRIPTION] = agentAttrs.description;\n // attributes[ATTR_GEN_AI_REQUEST_MODEL] = agentAttrs.model.name;\n\n attributes[ATTR_GEN_AI_SYSTEM_INSTRUCTIONS] = agentAttrs.instructions;\n }\n\n // Add error information if present\n if (span.errorInfo) {\n attributes[ATTR_ERROR_TYPE] = span.errorInfo.id || 'unknown';\n attributes[ATTR_ERROR_MESSAGE] = span.errorInfo.message;\n if (span.errorInfo.domain) {\n attributes['error.domain'] = span.errorInfo.domain;\n }\n if (span.errorInfo.category) {\n attributes['error.category'] = span.errorInfo.category;\n }\n }\n\n return attributes;\n}\n\n/**\n * Canonical OTel provider keys mapped to a list of possible fuzzy aliases.\n */\nconst PROVIDER_ALIASES: Record<string, string[]> = {\n anthropic: ['anthropic', 'claude'],\n 'aws.bedrock': ['awsbedrock', 'bedrock', 'amazonbedrock'],\n 'azure.ai.inference': ['azureaiinference', 'azureinference'],\n 'azure.ai.openai': ['azureaiopenai', 'azureopenai', 'msopenai', 'microsoftopenai'],\n cohere: ['cohere'],\n deepseek: ['deepseek'],\n 'gcp.gemini': ['gcpgemini', 'gemini'],\n 'gcp.gen_ai': ['gcpgenai', 'googlegenai', 'googleai'],\n 'gcp.vertex_ai': ['gcpvertexai', 'vertexai'],\n groq: ['groq'],\n 'ibm.watsonx.ai': ['ibmwatsonxai', 'watsonx', 'watsonxai'],\n mistral_ai: ['mistral', 'mistralai'],\n openai: ['openai', 'oai'],\n perplexity: ['perplexity', 'pplx'],\n x_ai: ['xai', 'x-ai', 'x_ai', 'x.com ai'],\n};\n\n/**\n * Normalize a provider input string into a matchable token.\n * Keep only alphanumerics and lowercase the result.\n */\nfunction normalizeProviderString(input: string): string {\n return input.toLowerCase().replace(/[^a-z0-9]/g, '');\n}\n\n/**\n * Attempts to map a providerName to one of the canonical OTel provider names.\n * If no match is found, returns the original providerName unchanged.\n */\nfunction normalizeProvider(providerName: string): string {\n const normalized = normalizeProviderString(providerName);\n\n for (const [canonical, aliases] of Object.entries(PROVIDER_ALIASES)) {\n for (const alias of aliases) {\n if (normalized === alias) {\n return canonical;\n }\n }\n }\n\n // No match → return the raw input in lowercase\n return providerName.toLowerCase();\n}\n","/**\n * Convert Mastra Spans to OpenTelemetry spans\n */\nimport { readFileSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport { SpanType } from '@mastra/core/observability';\nimport type { AnyExportedSpan } from '@mastra/core/observability';\nimport { SpanKind, SpanStatusCode, TraceFlags } from '@opentelemetry/api';\nimport type { HrTime, Link, SpanContext, SpanStatus } from '@opentelemetry/api';\nimport type { InstrumentationScope } from '@opentelemetry/core';\nimport type { Resource } from '@opentelemetry/resources';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\n\nimport type { ReadableSpan, TimedEvent } 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 { getAttributes, getSpanName } from './gen-ai-semantics.js';\nimport type { OtelExporterConfig } from './types.js';\n\nexport type SpanFormat = 'GenAI_v1_38_0';\n\n// If more formats come later:\n// export type SpanFormat =\n// | \"GenAI_v1_38_0\"\n// | \"GenAI_v1_38_0\"\n// | \"Custom_v2\";\n\nexport class SpanConverter {\n private resource?: Resource;\n private scope?: InstrumentationScope;\n private initPromise?: Promise<void>;\n private format: SpanFormat;\n\n constructor(\n private readonly params: {\n format: SpanFormat;\n packageName: string;\n serviceName?: string;\n config?: OtelExporterConfig;\n },\n ) {\n this.format = params.format;\n }\n\n /**\n * Lazily initialize resource & scope on first use.\n * Subsequent calls reuse the same promise (no races).\n */\n private async initIfNeeded(): Promise<void> {\n if (this.initPromise) {\n return this.initPromise;\n }\n\n this.initPromise = (async () => {\n const packageVersion = (await getPackageVersion(this.params.packageName)) ?? 'unknown';\n\n const serviceVersion = (await getPackageVersion('@mastra/core')) ?? 'unknown';\n\n let resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: this.params.serviceName || 'mastra-service',\n [ATTR_SERVICE_VERSION]: serviceVersion,\n [ATTR_TELEMETRY_SDK_NAME]: this.params.packageName,\n [ATTR_TELEMETRY_SDK_VERSION]: packageVersion,\n [ATTR_TELEMETRY_SDK_LANGUAGE]: 'nodejs',\n });\n\n if (this.params.config?.resourceAttributes) {\n resource = resource.merge(\n // Duplicate attributes from config will override defaults above\n resourceFromAttributes(this.params.config.resourceAttributes),\n );\n }\n\n this.resource = resource;\n this.scope = {\n name: this.params.packageName,\n version: packageVersion,\n };\n })();\n\n return this.initPromise;\n }\n\n /**\n * Convert a Mastra Span to an OpenTelemetry ReadableSpan\n */\n async convertSpan(span: AnyExportedSpan): Promise<ReadableSpan> {\n await this.initIfNeeded();\n\n if (!this.resource || !this.scope) {\n throw new Error('SpanConverter not initialized correctly');\n }\n\n // --- Core fields derived from Mastra span ---\n const name = getSpanName(span);\n const kind = getSpanKind(span.type);\n const attributes = getAttributes(span);\n\n // Add metadata as custom attributes (not gen_ai specific)\n if (span.metadata) {\n for (const [k, v] of Object.entries(span.metadata)) {\n if (v === null || v === undefined) {\n continue;\n }\n attributes[`mastra.metadata.${k}`] = typeof v === 'object' ? JSON.stringify(v) : v;\n }\n }\n\n // Add tags for root spans (only root spans can have tags)\n // Tags are JSON-stringified for maximum backend compatibility\n // While OTEL spec supports arrays, many backends (Jaeger, Zipkin, Tempo) don't fully support them\n if (span.isRootSpan && span.tags?.length) {\n attributes['mastra.tags'] = JSON.stringify(span.tags);\n }\n\n const startTime = dateToHrTime(span.startTime);\n const endTime = span.endTime ? dateToHrTime(span.endTime) : startTime;\n const duration = computeDuration(span.startTime, span.endTime);\n\n const { status, events } = buildStatusAndEvents(span, startTime);\n\n const spanContext: SpanContext = {\n traceId: span.traceId,\n spanId: span.id,\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n };\n\n const parentSpanContext = span.parentSpanId\n ? {\n traceId: span.traceId,\n spanId: span.parentSpanId,\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n }\n : undefined;\n\n const links: Link[] = []; // fill if you add link support later\n\n const readable: ReadableSpan = {\n name,\n kind,\n spanContext: () => spanContext,\n parentSpanContext,\n startTime,\n endTime,\n status,\n attributes,\n links,\n events,\n duration,\n ended: !!span.endTime,\n resource: this.resource,\n instrumentationScope: this.scope,\n droppedAttributesCount: 0,\n droppedEventsCount: 0,\n droppedLinksCount: 0,\n };\n\n return readable;\n }\n}\n\nasync function getPackageVersion(pkgName: string): Promise<string | undefined> {\n try {\n // Resolve `package.json` for the given package\n const manifestUrl = new URL(await import.meta.resolve(`${pkgName}/package.json`));\n\n const path = fileURLToPath(manifestUrl);\n const pkgJson = JSON.parse(readFileSync(path, 'utf8'));\n return pkgJson.version;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Get the appropriate Otel SpanKind based on Mastra SpanType.\n *\n * @param type - The Mastra span type\n * @returns The appropriate OTEL SpanKind\n */\nexport function getSpanKind(type: SpanType): SpanKind {\n switch (type) {\n case SpanType.MODEL_GENERATION:\n case SpanType.MCP_TOOL_CALL:\n return SpanKind.CLIENT;\n default:\n return SpanKind.INTERNAL;\n }\n}\n\n/**\n * Convert JavaScript Date to hrtime format\n */\nfunction dateToHrTime(date: Date): HrTime {\n const ms = date.getTime();\n const seconds = Math.floor(ms / 1000);\n const nanoseconds = (ms % 1000) * 1000000;\n return [seconds, nanoseconds];\n}\n\nfunction computeDuration(start: Date, end?: Date): HrTime {\n if (!end) return [0, 0];\n const diffMs = end.getTime() - start.getTime();\n return [Math.floor(diffMs / 1000), (diffMs % 1000) * 1_000_000];\n}\n\n/**\n * Build status + events from span.errorInfo (if present)\n */\nfunction buildStatusAndEvents(\n span: AnyExportedSpan,\n defaultTime: HrTime,\n): { status: SpanStatus; events: TimedEvent[] } {\n const events: TimedEvent[] = [];\n\n if (span.errorInfo) {\n const status: SpanStatus = {\n code: SpanStatusCode.ERROR,\n message: span.errorInfo.message,\n };\n\n events.push({\n name: 'exception',\n attributes: {\n 'exception.message': span.errorInfo.message,\n 'exception.type': 'Error',\n ...(span.errorInfo.details?.stack && {\n 'exception.stacktrace': span.errorInfo.details.stack as string,\n }),\n },\n time: defaultTime,\n droppedAttributesCount: 0,\n });\n\n return { status, events };\n }\n\n if (span.endTime) {\n return {\n status: { code: SpanStatusCode.OK },\n events,\n };\n }\n\n return {\n status: { code: SpanStatusCode.UNSET },\n events,\n };\n}\n","/**\n * OpenTelemetry Tracing Exporter for Mastra\n */\n\nimport type {\n TracingEvent,\n AnyExportedSpan,\n InitExporterOptions,\n ObservabilityInstanceConfig,\n} from '@mastra/core/observability';\nimport { TracingEventType } from '@mastra/core/observability';\nimport { BaseExporter } from '@mastra/observability';\nimport { diag, DiagConsoleLogger, DiagLogLevel } from '@opentelemetry/api';\n\nimport { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport type { SpanExporter } from '@opentelemetry/sdk-trace-base';\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 extends BaseExporter {\n private config: OtelExporterConfig;\n private observabilityConfig?: ObservabilityInstanceConfig;\n private spanConverter?: SpanConverter;\n private processor?: BatchSpanProcessor;\n private exporter?: SpanExporter;\n private isSetup: boolean = false;\n\n name = 'opentelemetry';\n\n constructor(config: OtelExporterConfig) {\n super(config);\n\n this.config = config;\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(options: InitExporterOptions) {\n this.observabilityConfig = options.config;\n }\n\n private async setupExporter() {\n // already setup or exporter already set\n if (this.isSetup || this.exporter) return;\n\n // Provider configuration is required\n if (!this.config.provider) {\n this.logger.error(\n '[OtelExporter] Provider configuration is required. Use the \"custom\" provider for generic endpoints.',\n );\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n // Resolve provider configuration\n const resolved = resolveProviderConfig(this.config.provider);\n if (!resolved) {\n // Configuration validation failed, disable tracing\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n // user provided an instantiated SpanExporter, use it\n if (this.config.exporter) {\n this.exporter = this.config.exporter;\n return;\n }\n\n const endpoint = resolved.endpoint;\n const headers = resolved.headers;\n const protocol = resolved.protocol;\n\n // Load and create the appropriate exporter based on protocol\n const providerName = Object.keys(this.config.provider)[0];\n const ExporterClass = await loadExporter(protocol, providerName);\n\n if (!ExporterClass) {\n // Exporter not available, disable tracing\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n try {\n if (protocol === 'zipkin') {\n this.exporter = new ExporterClass({\n url: endpoint,\n headers,\n });\n } else if (protocol === 'grpc') {\n // gRPC uses Metadata object instead of headers\n // Dynamically import @grpc/grpc-js to create metadata\n let metadata: any;\n try {\n // @ts-ignore - Dynamic import for optional dependency\n const grpcModule = await import('@grpc/grpc-js');\n metadata = new grpcModule.Metadata();\n Object.entries(headers).forEach(([key, value]) => {\n metadata.set(key, value);\n });\n } catch (grpcError) {\n this.logger.error(\n `[OtelExporter] Failed to load gRPC metadata. Install required packages:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-grpc @grpc/grpc-js\\n`,\n grpcError,\n );\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n this.exporter = new ExporterClass({\n url: endpoint,\n metadata,\n timeoutMillis: this.config.timeout,\n });\n } else {\n // HTTP/JSON and HTTP/Protobuf use headers\n this.exporter = new ExporterClass({\n url: endpoint,\n headers,\n timeoutMillis: this.config.timeout,\n });\n }\n } catch (error) {\n this.logger.error(`[OtelExporter] Failed to create exporter:`, error);\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n }\n\n private async setupProcessor() {\n if (this.processor || this.isSetup) return;\n\n this.spanConverter = new SpanConverter({\n packageName: '@mastra/otel-exporter',\n serviceName: this.observabilityConfig?.serviceName,\n config: this.config,\n format: 'GenAI_v1_38_0',\n });\n\n // Always use BatchSpanProcessor for production\n // It queues spans and exports them in batches for better performance\n this.processor = new BatchSpanProcessor(this.exporter!, {\n maxExportBatchSize: this.config.batchSize || 512, // Default batch size\n maxQueueSize: 2048, // Maximum spans to queue\n scheduledDelayMillis: 5000, // Export every 5 seconds\n exportTimeoutMillis: this.config.timeout || 30000, // Export timeout\n });\n\n this.logger.debug(\n `[OtelExporter] Using BatchSpanProcessor (batch size: ${this.config.batchSize || 512}, delay: 5s)`,\n );\n }\n\n private async setup() {\n if (this.isSetup) return;\n await this.setupExporter();\n await this.setupProcessor();\n this.isSetup = true;\n }\n\n protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n // Only process SPAN_ENDED events for OTEL\n // OTEL expects complete spans with start and end times\n if (event.type !== TracingEventType.SPAN_ENDED) {\n return;\n }\n\n const span = event.exportedSpan;\n await this.exportSpan(span);\n }\n\n private async exportSpan(span: AnyExportedSpan): Promise<void> {\n // Ensure exporter is set up\n if (!this.isSetup) {\n await this.setup();\n }\n\n // Skip if disabled\n if (this.isDisabled || !this.processor) {\n return;\n }\n\n try {\n // Convert the span to OTEL format\n const otelSpan = await 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(otelSpan);\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/gen-ai-messages.ts","../src/gen-ai-semantics.ts","../src/span-converter.ts","../src/tracing.ts"],"names":["SpanType"],"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 // Read from config or environment variables\n const apiKey = config.apiKey ?? process.env.DASH0_API_KEY;\n const configEndpoint = config.endpoint ?? process.env.DASH0_ENDPOINT;\n const dataset = config.dataset ?? process.env.DASH0_DATASET;\n\n if (!apiKey) {\n console.error(\n '[OtelExporter] Dash0 configuration requires apiKey. ' +\n 'Set DASH0_API_KEY environment variable or pass it in config. Tracing will be disabled.',\n );\n return null;\n }\n\n if (!configEndpoint) {\n console.error(\n '[OtelExporter] Dash0 configuration requires endpoint. ' +\n 'Set DASH0_ENDPOINT environment variable or pass it in config. Tracing will be disabled.',\n );\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 = configEndpoint;\n if (!endpoint.includes('/v1/traces')) {\n endpoint = `${endpoint}/v1/traces`;\n }\n\n const headers: Record<string, string> = {\n authorization: `Bearer ${apiKey}`, // lowercase for gRPC metadata\n };\n\n if (dataset) {\n headers['dash0-dataset'] = 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 // Read from config or environment variables\n const apiKey = config.apiKey ?? process.env.SIGNOZ_API_KEY;\n const region = config.region ?? (process.env.SIGNOZ_REGION as 'us' | 'eu' | 'in' | undefined);\n const configEndpoint = config.endpoint ?? process.env.SIGNOZ_ENDPOINT;\n\n if (!apiKey) {\n console.error(\n '[OtelExporter] SigNoz configuration requires apiKey. ' +\n 'Set SIGNOZ_API_KEY environment variable or pass it in config. Tracing will be disabled.',\n );\n return null;\n }\n\n // SigNoz uses OTLP endpoint with /v1/traces suffix\n const endpoint = configEndpoint || `https://ingest.${region || 'us'}.signoz.cloud:443/v1/traces`;\n\n return {\n endpoint,\n headers: {\n 'signoz-ingestion-key': apiKey,\n },\n protocol: 'http/protobuf',\n };\n}\n\nfunction resolveNewRelicConfig(config: NewRelicConfig): ResolvedProviderConfig | null {\n // Read from config or environment variables\n const apiKey = config.apiKey ?? process.env.NEW_RELIC_LICENSE_KEY;\n const configEndpoint = config.endpoint ?? process.env.NEW_RELIC_ENDPOINT;\n\n if (!apiKey) {\n console.error(\n '[OtelExporter] New Relic configuration requires apiKey (license key). ' +\n 'Set NEW_RELIC_LICENSE_KEY environment variable or pass it in config. Tracing will be disabled.',\n );\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 = configEndpoint || 'https://otlp.nr-data.net:443/v1/traces';\n\n return {\n endpoint,\n headers: {\n 'api-key': apiKey,\n },\n protocol: 'http/protobuf',\n };\n}\n\nfunction resolveTraceloopConfig(config: TraceloopConfig): ResolvedProviderConfig | null {\n // Read from config or environment variables\n const apiKey = config.apiKey ?? process.env.TRACELOOP_API_KEY;\n const destinationId = config.destinationId ?? process.env.TRACELOOP_DESTINATION_ID;\n const configEndpoint = config.endpoint ?? process.env.TRACELOOP_ENDPOINT;\n\n if (!apiKey) {\n console.error(\n '[OtelExporter] Traceloop configuration requires apiKey. ' +\n 'Set TRACELOOP_API_KEY environment variable or pass it in config. Tracing will be disabled.',\n );\n return null;\n }\n\n // Traceloop uses OTLP endpoint with /v1/traces suffix\n const endpoint = configEndpoint || 'https://api.traceloop.com/v1/traces';\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${apiKey}`,\n };\n\n if (destinationId) {\n headers['x-traceloop-destination-id'] = destinationId;\n }\n\n return {\n endpoint,\n headers,\n protocol: 'http/json',\n };\n}\n\nfunction resolveLaminarConfig(config: LaminarConfig): ResolvedProviderConfig | null {\n // Read from config or environment variables\n // LMNR_PROJECT_API_KEY is the standard Laminar environment variable\n const apiKey = config.apiKey ?? process.env.LMNR_PROJECT_API_KEY;\n const configEndpoint = config.endpoint ?? process.env.LAMINAR_ENDPOINT;\n\n if (!apiKey) {\n console.error(\n '[OtelExporter] Laminar configuration requires apiKey. ' +\n 'Set LMNR_PROJECT_API_KEY environment variable or pass it in config. Tracing will be disabled.',\n );\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 = configEndpoint || 'https://api.lmnr.ai/v1/traces';\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${apiKey}`,\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 * Utilities for converting Mastra messages to OpenTelemetry gen_ai message format\n * Based on OpenTelemetry GenAI semantic conventions\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/#gen-ai-input-messages\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-input-messages.json\n */\n\n/**\n * Type representation of a gen_ai chat message part\n */\ntype GenAIMessagePart =\n | {\n type: 'text';\n content: string;\n }\n | {\n type: 'tool_call';\n id: string;\n name: string;\n arguments: string;\n }\n | {\n type: 'tool_call_response';\n id: string;\n name: string;\n response: string;\n };\n\n/**\n * Type representation of a gen_ai chat message\n */\ntype GenAIMessage = {\n role: string;\n parts: GenAIMessagePart[];\n};\n\n/**\n * Assumed type representation of a Mastra message content type\n */\ntype MastraMessagePart =\n | {\n type: 'text';\n text: string;\n }\n | { type: 'tool-call'; toolCallId: string; toolName: string; input: unknown }\n | { type: 'tool-result'; toolCallId: string; toolName: string; output: { value: unknown } };\n\n/**\n * Assumed type representation of a Mastra message\n */\ntype MastraMessage = {\n role: string;\n content: MastraMessagePart[] | string;\n};\n\nconst isMastraMessagePart = (p: unknown): p is MastraMessagePart => {\n return (\n typeof p === 'object' &&\n p != null &&\n 'type' in p &&\n (p.type === 'text' || p.type === 'tool-call' || p.type === 'tool-result') &&\n ((p.type === 'text' && 'text' in p) ||\n (p.type === 'tool-call' && 'toolCallId' in p && 'toolName' in p && 'input' in p) ||\n (p.type === 'tool-result' && 'toolCallId' in p && 'toolName' in p && 'output' in p))\n );\n};\n\nconst isMastraMessage = (m: unknown): m is MastraMessage => {\n return (\n typeof m === 'object' &&\n m != null &&\n 'role' in m &&\n 'content' in m &&\n (typeof m.content === 'string' || (Array.isArray(m.content) && m.content.every(isMastraMessagePart)))\n );\n};\n\n/**\n * Convert an Input/Output string from a MastraSpan into a jsonified string that adheres to\n * OpenTelemetry gen_ai.input.messages and gen_ai.output.messages schema.\n * If parsing fails at any step, the original inputOutputString is returned unmodified.\n *\n * This conversion is best effort; It assumes a consistent shape for mastra messages, and converts\n * into the gen_ai input and output schemas as of October 20th, 2025.\n *\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/#gen-ai-input-messages\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-input-messages.json\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/#gen-ai-output-messages\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-output-messages.json\n *\n * @param inputOutputString a jsonified string that contains messages adhering to what appears to be\n * Mastra's message shape.\n * @returns a jsonified string that contains messages adhering to the OpenTelemetry gen_ai.input.messages and gen_ai.output.messages schema.\n * If parsing fails at any step, the original inputOutputString is returned unmodified.\n */\nexport const convertMastraMessagesToGenAIMessages = (inputOutputString: string): string => {\n try {\n const parsedIO = JSON.parse(inputOutputString) as unknown;\n if (typeof parsedIO !== 'object' || parsedIO == null || (!('messages' in parsedIO) && !('text' in parsedIO))) {\n // inputOutputString fails initial type guard, just return it\n return inputOutputString;\n }\n // if the IO simply contains a text string, return a single text message\n // formatted as a gen_ai assistant message, assuming its an assistant response\n if ('text' in parsedIO) {\n return JSON.stringify([\n {\n role: 'assistant',\n parts: [{ type: 'text', content: parsedIO.text as string }],\n } satisfies GenAIMessage,\n ]);\n }\n // if the IO contains messages, convert them to gen_ai messages\n if (Array.isArray(parsedIO.messages)) {\n return JSON.stringify(\n (parsedIO.messages as unknown[]).map(m => {\n if (!isMastraMessage(m)) {\n return m;\n }\n const role = m.role;\n let parts: GenAIMessagePart[] = [];\n if (Array.isArray(m.content)) {\n parts = m.content.map(c => {\n switch (c.type) {\n case 'text':\n return {\n type: 'text',\n content: c.text,\n };\n case 'tool-call':\n return {\n type: 'tool_call',\n id: c.toolCallId,\n name: c.toolName,\n arguments: JSON.stringify(c.input),\n };\n case 'tool-result':\n return {\n type: 'tool_call_response',\n id: c.toolCallId,\n name: c.toolName,\n response: JSON.stringify(c.output.value),\n };\n default:\n return c;\n }\n });\n } else {\n parts = [\n {\n type: 'text',\n content: m.content,\n },\n ];\n }\n return {\n role,\n parts,\n } satisfies GenAIMessage;\n }),\n );\n }\n // we've failed type-guards, just return original I/O string\n return inputOutputString;\n } catch {\n // silently fallback to original I/O string\n return inputOutputString;\n }\n};\n","/**\n * Utilities for converting Mastra Spans to OTel Spans\n * with Semantic conventions for generative AI systems\n * @see https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/gen-ai/README.md\n * @see https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/gen-ai/gen-ai-events.md\n * @see https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/gen-ai/gen-ai-spans.md\n * @see https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/gen-ai/gen-ai-agent-spans.md\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/non-normative/examples-llm-calls/\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/\n */\n\nimport { SpanType } from '@mastra/core/observability';\nimport type {\n AgentRunAttributes,\n AnyExportedSpan,\n MCPToolCallAttributes,\n ModelGenerationAttributes,\n ToolCallAttributes,\n UsageStats,\n} from '@mastra/core/observability';\nimport type { Attributes } from '@opentelemetry/api';\nimport {\n ATTR_ERROR_MESSAGE,\n ATTR_ERROR_TYPE,\n ATTR_GEN_AI_PROVIDER_NAME,\n ATTR_GEN_AI_REQUEST_MODEL,\n ATTR_GEN_AI_RESPONSE_MODEL,\n ATTR_GEN_AI_REQUEST_MAX_TOKENS,\n ATTR_GEN_AI_REQUEST_TEMPERATURE,\n ATTR_GEN_AI_REQUEST_TOP_P,\n ATTR_GEN_AI_REQUEST_TOP_K,\n ATTR_GEN_AI_REQUEST_PRESENCE_PENALTY,\n ATTR_GEN_AI_REQUEST_FREQUENCY_PENALTY,\n ATTR_GEN_AI_REQUEST_STOP_SEQUENCES,\n ATTR_GEN_AI_REQUEST_SEED,\n ATTR_GEN_AI_INPUT_MESSAGES,\n ATTR_GEN_AI_OUTPUT_MESSAGES,\n ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n ATTR_GEN_AI_AGENT_ID,\n ATTR_GEN_AI_AGENT_NAME,\n ATTR_GEN_AI_TOOL_DESCRIPTION,\n ATTR_GEN_AI_OPERATION_NAME,\n ATTR_GEN_AI_RESPONSE_FINISH_REASONS,\n ATTR_GEN_AI_RESPONSE_ID,\n ATTR_GEN_AI_CONVERSATION_ID,\n ATTR_GEN_AI_SYSTEM_INSTRUCTIONS,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n ATTR_GEN_AI_TOOL_NAME,\n} from '@opentelemetry/semantic-conventions/incubating';\nimport { convertMastraMessagesToGenAIMessages } from './gen-ai-messages';\n\n/**\n * Token usage attributes following OTel GenAI semantic conventions.\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-spans/\n */\nexport interface OtelUsageMetrics {\n [ATTR_GEN_AI_USAGE_INPUT_TOKENS]?: number;\n [ATTR_GEN_AI_USAGE_OUTPUT_TOKENS]?: number;\n 'gen_ai.usage.reasoning_tokens'?: number;\n 'gen_ai.usage.cached_input_tokens'?: number;\n 'gen_ai.usage.cache_write_tokens'?: number;\n 'gen_ai.usage.audio_input_tokens'?: number;\n 'gen_ai.usage.audio_output_tokens'?: number;\n}\n\n/**\n * Formats UsageStats to OTel GenAI semantic convention attributes.\n */\nexport function formatUsageMetrics(usage?: UsageStats): OtelUsageMetrics {\n if (!usage) return {};\n\n const metrics: OtelUsageMetrics = {};\n\n if (usage.inputTokens !== undefined) {\n metrics[ATTR_GEN_AI_USAGE_INPUT_TOKENS] = usage.inputTokens;\n }\n\n if (usage.outputTokens !== undefined) {\n metrics[ATTR_GEN_AI_USAGE_OUTPUT_TOKENS] = usage.outputTokens;\n }\n\n // Reasoning tokens from outputDetails\n if (usage.outputDetails?.reasoning !== undefined) {\n metrics['gen_ai.usage.reasoning_tokens'] = usage.outputDetails.reasoning;\n }\n\n // Cache read tokens from inputDetails\n if (usage.inputDetails?.cacheRead !== undefined) {\n metrics['gen_ai.usage.cached_input_tokens'] = usage.inputDetails.cacheRead;\n }\n\n // Cache write tokens from inputDetails\n if (usage.inputDetails?.cacheWrite !== undefined) {\n metrics['gen_ai.usage.cache_write_tokens'] = usage.inputDetails.cacheWrite;\n }\n\n // Audio tokens from inputDetails/outputDetails\n if (usage.inputDetails?.audio !== undefined) {\n metrics['gen_ai.usage.audio_input_tokens'] = usage.inputDetails.audio;\n }\n if (usage.outputDetails?.audio !== undefined) {\n metrics['gen_ai.usage.audio_output_tokens'] = usage.outputDetails.audio;\n }\n\n return metrics;\n}\n\n/**\n * Get the operation name based on span type for gen_ai.operation.name\n */\nfunction getOperationName(span: AnyExportedSpan): string {\n switch (span.type) {\n case SpanType.MODEL_GENERATION:\n return 'chat';\n case SpanType.TOOL_CALL:\n case SpanType.MCP_TOOL_CALL:\n return 'execute_tool';\n case SpanType.AGENT_RUN:\n return 'invoke_agent';\n case SpanType.WORKFLOW_RUN:\n return 'invoke_workflow';\n default:\n return span.type.toLowerCase();\n }\n}\n/**\n * Keep only unicode letters, numbers, dot, underscore, space, dash.\n */\nfunction sanitizeSpanName(name: string): string {\n return name.replace(/[^\\p{L}\\p{N}._ -]/gu, '');\n}\n\nfunction getSpanIdentifier(span: AnyExportedSpan): string | undefined {\n switch (span.type) {\n case SpanType.MODEL_GENERATION: {\n const attrs = span.attributes as ModelGenerationAttributes;\n return attrs?.model;\n }\n\n default:\n return span.entityName ?? span.entityId;\n }\n}\n\n/**\n * Get an OTEL-compliant span name based on span type and attributes\n */\nexport function getSpanName(span: AnyExportedSpan): string {\n const identifier = getSpanIdentifier(span);\n\n if (identifier) {\n const operation = getOperationName(span);\n return `${operation} ${identifier}`;\n }\n\n // For other types, use a simplified version of the original name\n return sanitizeSpanName(span.name);\n}\n\n/**\n * Gets OpenTelemetry attributes from Mastra Span\n * Following OTEL Semantic Conventions for GenAI\n */\nexport function getAttributes(span: AnyExportedSpan): Attributes {\n const attributes: Attributes = {};\n const spanType = span.type.toLowerCase();\n\n // Add gen_ai.operation.name based on span type\n attributes[ATTR_GEN_AI_OPERATION_NAME] = getOperationName(span);\n\n // Add span type for better visibility\n attributes['mastra.span.type'] = span.type;\n\n // Handle input/output based on span type\n // Always add input/output for Laminar compatibility\n if (span.input !== undefined) {\n const inputStr = typeof span.input === 'string' ? span.input : JSON.stringify(span.input);\n // Add specific attributes based on span type\n if (span.type === SpanType.MODEL_GENERATION) {\n attributes[ATTR_GEN_AI_INPUT_MESSAGES] = convertMastraMessagesToGenAIMessages(inputStr);\n } else if (span.type === SpanType.TOOL_CALL || span.type === SpanType.MCP_TOOL_CALL) {\n attributes['gen_ai.tool.call.arguments'] = inputStr;\n } else {\n attributes[`mastra.${spanType}.input`] = inputStr;\n }\n }\n\n if (span.output !== undefined) {\n const outputStr = typeof span.output === 'string' ? span.output : JSON.stringify(span.output);\n // Add specific attributes based on span type\n if (span.type === SpanType.MODEL_GENERATION) {\n attributes[ATTR_GEN_AI_OUTPUT_MESSAGES] = convertMastraMessagesToGenAIMessages(outputStr);\n // TODO\n // attributes['gen_ai.output.type'] = image/json/speech/text/<other>\n } else if (span.type === SpanType.TOOL_CALL || span.type === SpanType.MCP_TOOL_CALL) {\n attributes['gen_ai.tool.call.result'] = outputStr;\n } else {\n attributes[`mastra.${spanType}.output`] = outputStr;\n }\n }\n\n // Add model-specific attributes using OTEL semantic conventions\n if (span.type === SpanType.MODEL_GENERATION && span.attributes) {\n const modelAttrs = span.attributes as ModelGenerationAttributes;\n\n // Model and provider\n if (modelAttrs.model) {\n attributes[ATTR_GEN_AI_REQUEST_MODEL] = modelAttrs.model;\n }\n\n if (modelAttrs.provider) {\n attributes[ATTR_GEN_AI_PROVIDER_NAME] = normalizeProvider(modelAttrs.provider);\n }\n\n // Agent context - allows correlating model generation with the agent that invoked it\n if (span.entityId) {\n attributes[ATTR_GEN_AI_AGENT_ID] = span.entityId;\n }\n\n if (span.entityName) {\n attributes[ATTR_GEN_AI_AGENT_NAME] = span.entityName;\n }\n\n // Token usage - use OTEL standard naming + OpenInference conventions\n Object.assign(attributes, formatUsageMetrics(modelAttrs.usage));\n\n // Parameters using OTEL conventions\n if (modelAttrs.parameters) {\n if (modelAttrs.parameters.temperature !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_TEMPERATURE] = modelAttrs.parameters.temperature;\n }\n if (modelAttrs.parameters.maxOutputTokens !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_MAX_TOKENS] = modelAttrs.parameters.maxOutputTokens;\n }\n if (modelAttrs.parameters.topP !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_TOP_P] = modelAttrs.parameters.topP;\n }\n if (modelAttrs.parameters.topK !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_TOP_K] = modelAttrs.parameters.topK;\n }\n if (modelAttrs.parameters.presencePenalty !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_PRESENCE_PENALTY] = modelAttrs.parameters.presencePenalty;\n }\n if (modelAttrs.parameters.frequencyPenalty !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_FREQUENCY_PENALTY] = modelAttrs.parameters.frequencyPenalty;\n }\n if (modelAttrs.parameters.stopSequences) {\n attributes[ATTR_GEN_AI_REQUEST_STOP_SEQUENCES] = JSON.stringify(modelAttrs.parameters.stopSequences);\n }\n if (modelAttrs.parameters.seed) {\n attributes[ATTR_GEN_AI_REQUEST_SEED] = modelAttrs.parameters.seed;\n }\n }\n\n // Response attributes\n if (modelAttrs.finishReason) {\n attributes[ATTR_GEN_AI_RESPONSE_FINISH_REASONS] = JSON.stringify([modelAttrs.finishReason]);\n }\n if (modelAttrs.responseModel) {\n attributes[ATTR_GEN_AI_RESPONSE_MODEL] = modelAttrs.responseModel;\n }\n if (modelAttrs.responseId) {\n attributes[ATTR_GEN_AI_RESPONSE_ID] = modelAttrs.responseId;\n }\n\n // Server attributes\n if (modelAttrs.serverAddress) {\n attributes[ATTR_SERVER_ADDRESS] = modelAttrs.serverAddress;\n }\n if (modelAttrs.serverPort !== undefined) {\n attributes[ATTR_SERVER_PORT] = modelAttrs.serverPort;\n }\n }\n\n // Add tool-specific attributes using OTEL conventions\n if ((span.type === SpanType.TOOL_CALL || span.type === SpanType.MCP_TOOL_CALL) && span.attributes) {\n // Tool identification\n attributes[ATTR_GEN_AI_TOOL_NAME] = span.entityName ?? span.entityId;\n\n //TODO:\n // attributes['gen_ai.tool.call.id'] = call_mszuSIzqtI65i1wAUOE8w5H4\n\n // MCP-specific attributes\n if (span.type === SpanType.MCP_TOOL_CALL) {\n const mcpAttrs = span.attributes as MCPToolCallAttributes;\n if (mcpAttrs.mcpServer) {\n attributes[ATTR_SERVER_ADDRESS] = mcpAttrs.mcpServer;\n }\n } else {\n const toolAttrs = span.attributes as ToolCallAttributes;\n if (toolAttrs.toolDescription) {\n attributes[ATTR_GEN_AI_TOOL_DESCRIPTION] = toolAttrs.toolDescription;\n }\n if (toolAttrs.toolType) {\n attributes['gen_ai.tool.type'] = toolAttrs.toolType;\n }\n }\n }\n\n // Add agent-specific attributes\n if (span.type === SpanType.AGENT_RUN && span.attributes) {\n const agentAttrs = span.attributes as AgentRunAttributes;\n if (span.entityId) {\n attributes[ATTR_GEN_AI_AGENT_ID] = span.entityId;\n }\n if (span.entityName) {\n attributes[ATTR_GEN_AI_AGENT_NAME] = span.entityName;\n }\n if (agentAttrs.conversationId) {\n attributes[ATTR_GEN_AI_CONVERSATION_ID] = agentAttrs.conversationId;\n }\n if (agentAttrs.maxSteps) {\n attributes[`mastra.${spanType}.max_steps`] = agentAttrs.maxSteps;\n }\n if (agentAttrs.availableTools) {\n attributes[`gen_ai.tool.definitions`] = JSON.stringify(agentAttrs.availableTools);\n }\n\n //TODO:\n // attributes[ATTR_GEN_AI_AGENT_DESCRIPTION] = agentAttrs.description;\n // attributes[ATTR_GEN_AI_REQUEST_MODEL] = agentAttrs.model.name;\n\n attributes[ATTR_GEN_AI_SYSTEM_INSTRUCTIONS] = agentAttrs.instructions;\n }\n\n // Add error information if present\n if (span.errorInfo) {\n attributes[ATTR_ERROR_TYPE] = span.errorInfo.id || 'unknown';\n attributes[ATTR_ERROR_MESSAGE] = span.errorInfo.message;\n if (span.errorInfo.domain) {\n attributes['error.domain'] = span.errorInfo.domain;\n }\n if (span.errorInfo.category) {\n attributes['error.category'] = span.errorInfo.category;\n }\n }\n\n return attributes;\n}\n\n/**\n * Canonical OTel provider keys mapped to a list of possible fuzzy aliases.\n */\nconst PROVIDER_ALIASES: Record<string, string[]> = {\n anthropic: ['anthropic', 'claude'],\n 'aws.bedrock': ['awsbedrock', 'bedrock', 'amazonbedrock'],\n 'azure.ai.inference': ['azureaiinference', 'azureinference'],\n 'azure.ai.openai': ['azureaiopenai', 'azureopenai', 'msopenai', 'microsoftopenai'],\n cohere: ['cohere'],\n deepseek: ['deepseek'],\n 'gcp.gemini': ['gcpgemini', 'gemini'],\n 'gcp.gen_ai': ['gcpgenai', 'googlegenai', 'googleai'],\n 'gcp.vertex_ai': ['gcpvertexai', 'vertexai'],\n groq: ['groq'],\n 'ibm.watsonx.ai': ['ibmwatsonxai', 'watsonx', 'watsonxai'],\n mistral_ai: ['mistral', 'mistralai'],\n openai: ['openai', 'oai'],\n perplexity: ['perplexity', 'pplx'],\n x_ai: ['xai', 'x-ai', 'x_ai', 'x.com ai'],\n};\n\n/**\n * Normalize a provider input string into a matchable token.\n * Keep only alphanumerics and lowercase the result.\n */\nfunction normalizeProviderString(input: string): string {\n return input.toLowerCase().replace(/[^a-z0-9]/g, '');\n}\n\n/**\n * Attempts to map a providerName to one of the canonical OTel provider names.\n * If no match is found, returns the original providerName unchanged.\n */\nfunction normalizeProvider(providerName: string): string {\n const normalized = normalizeProviderString(providerName);\n\n for (const [canonical, aliases] of Object.entries(PROVIDER_ALIASES)) {\n for (const alias of aliases) {\n if (normalized === alias) {\n return canonical;\n }\n }\n }\n\n // No match → return the raw input in lowercase\n return providerName.toLowerCase();\n}\n","/**\n * Convert Mastra Spans to OpenTelemetry spans\n */\nimport { readFileSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport { SpanType } from '@mastra/core/observability';\nimport type { AnyExportedSpan } from '@mastra/core/observability';\nimport { SpanKind, SpanStatusCode, TraceFlags } from '@opentelemetry/api';\nimport type { HrTime, Link, SpanContext, SpanStatus } from '@opentelemetry/api';\nimport type { InstrumentationScope } from '@opentelemetry/core';\nimport type { Resource } from '@opentelemetry/resources';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\n\nimport type { ReadableSpan, TimedEvent } 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 { getAttributes, getSpanName } from './gen-ai-semantics.js';\nimport type { OtelExporterConfig } from './types.js';\n\nexport type SpanFormat = 'GenAI_v1_38_0';\n\n// If more formats come later:\n// export type SpanFormat =\n// | \"GenAI_v1_38_0\"\n// | \"GenAI_v1_38_0\"\n// | \"Custom_v2\";\n\nexport class SpanConverter {\n private resource?: Resource;\n private scope?: InstrumentationScope;\n private initPromise?: Promise<void>;\n private format: SpanFormat;\n\n constructor(\n private readonly params: {\n format: SpanFormat;\n packageName: string;\n serviceName?: string;\n config?: OtelExporterConfig;\n },\n ) {\n this.format = params.format;\n }\n\n /**\n * Lazily initialize resource & scope on first use.\n * Subsequent calls reuse the same promise (no races).\n */\n private async initIfNeeded(): Promise<void> {\n if (this.initPromise) {\n return this.initPromise;\n }\n\n this.initPromise = (async () => {\n const packageVersion = (await getPackageVersion(this.params.packageName)) ?? 'unknown';\n\n const serviceVersion = (await getPackageVersion('@mastra/core')) ?? 'unknown';\n\n let resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: this.params.serviceName || 'mastra-service',\n [ATTR_SERVICE_VERSION]: serviceVersion,\n [ATTR_TELEMETRY_SDK_NAME]: this.params.packageName,\n [ATTR_TELEMETRY_SDK_VERSION]: packageVersion,\n [ATTR_TELEMETRY_SDK_LANGUAGE]: 'nodejs',\n });\n\n if (this.params.config?.resourceAttributes) {\n resource = resource.merge(\n // Duplicate attributes from config will override defaults above\n resourceFromAttributes(this.params.config.resourceAttributes),\n );\n }\n\n this.resource = resource;\n this.scope = {\n name: this.params.packageName,\n version: packageVersion,\n };\n })();\n\n return this.initPromise;\n }\n\n /**\n * Convert a Mastra Span to an OpenTelemetry ReadableSpan\n */\n async convertSpan(span: AnyExportedSpan): Promise<ReadableSpan> {\n await this.initIfNeeded();\n\n if (!this.resource || !this.scope) {\n throw new Error('SpanConverter not initialized correctly');\n }\n\n // --- Core fields derived from Mastra span ---\n const name = getSpanName(span);\n const kind = getSpanKind(span.type);\n const attributes = getAttributes(span);\n\n // Add metadata as custom attributes (not gen_ai specific)\n if (span.metadata) {\n for (const [k, v] of Object.entries(span.metadata)) {\n if (v === null || v === undefined) {\n continue;\n }\n attributes[`mastra.metadata.${k}`] = typeof v === 'object' ? JSON.stringify(v) : v;\n }\n }\n\n // Add tags for root spans (only root spans can have tags)\n // Tags are JSON-stringified for maximum backend compatibility\n // While OTEL spec supports arrays, many backends (Jaeger, Zipkin, Tempo) don't fully support them\n if (span.isRootSpan && span.tags?.length) {\n attributes['mastra.tags'] = JSON.stringify(span.tags);\n }\n\n const startTime = dateToHrTime(span.startTime);\n const endTime = span.endTime ? dateToHrTime(span.endTime) : startTime;\n const duration = computeDuration(span.startTime, span.endTime);\n\n const { status, events } = buildStatusAndEvents(span, startTime);\n\n const spanContext: SpanContext = {\n traceId: span.traceId,\n spanId: span.id,\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n };\n\n const parentSpanContext = span.parentSpanId\n ? {\n traceId: span.traceId,\n spanId: span.parentSpanId,\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n }\n : undefined;\n\n const links: Link[] = []; // fill if you add link support later\n\n const readable: ReadableSpan = {\n name,\n kind,\n spanContext: () => spanContext,\n parentSpanContext,\n startTime,\n endTime,\n status,\n attributes,\n links,\n events,\n duration,\n ended: !!span.endTime,\n resource: this.resource,\n instrumentationScope: this.scope,\n droppedAttributesCount: 0,\n droppedEventsCount: 0,\n droppedLinksCount: 0,\n };\n\n return readable;\n }\n}\n\nasync function getPackageVersion(pkgName: string): Promise<string | undefined> {\n try {\n // Resolve `package.json` for the given package\n const manifestUrl = new URL(await import.meta.resolve(`${pkgName}/package.json`));\n\n const path = fileURLToPath(manifestUrl);\n const pkgJson = JSON.parse(readFileSync(path, 'utf8'));\n return pkgJson.version;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Get the appropriate Otel SpanKind based on Mastra SpanType.\n *\n * @param type - The Mastra span type\n * @returns The appropriate OTEL SpanKind\n */\nexport function getSpanKind(type: SpanType): SpanKind {\n switch (type) {\n case SpanType.MODEL_GENERATION:\n case SpanType.MCP_TOOL_CALL:\n return SpanKind.CLIENT;\n default:\n return SpanKind.INTERNAL;\n }\n}\n\n/**\n * Convert JavaScript Date to hrtime format\n */\nfunction dateToHrTime(date: Date): HrTime {\n const ms = date.getTime();\n const seconds = Math.floor(ms / 1000);\n const nanoseconds = (ms % 1000) * 1000000;\n return [seconds, nanoseconds];\n}\n\nfunction computeDuration(start: Date, end?: Date): HrTime {\n if (!end) return [0, 0];\n const diffMs = end.getTime() - start.getTime();\n return [Math.floor(diffMs / 1000), (diffMs % 1000) * 1_000_000];\n}\n\n/**\n * Build status + events from span.errorInfo (if present)\n */\nfunction buildStatusAndEvents(\n span: AnyExportedSpan,\n defaultTime: HrTime,\n): { status: SpanStatus; events: TimedEvent[] } {\n const events: TimedEvent[] = [];\n\n if (span.errorInfo) {\n const status: SpanStatus = {\n code: SpanStatusCode.ERROR,\n message: span.errorInfo.message,\n };\n\n events.push({\n name: 'exception',\n attributes: {\n 'exception.message': span.errorInfo.message,\n 'exception.type': 'Error',\n ...(span.errorInfo.details?.stack && {\n 'exception.stacktrace': span.errorInfo.details.stack as string,\n }),\n },\n time: defaultTime,\n droppedAttributesCount: 0,\n });\n\n return { status, events };\n }\n\n if (span.endTime) {\n return {\n status: { code: SpanStatusCode.OK },\n events,\n };\n }\n\n return {\n status: { code: SpanStatusCode.UNSET },\n events,\n };\n}\n","/**\n * OpenTelemetry Tracing Exporter for Mastra\n */\n\nimport type {\n TracingEvent,\n AnyExportedSpan,\n InitExporterOptions,\n ObservabilityInstanceConfig,\n} from '@mastra/core/observability';\nimport { TracingEventType } from '@mastra/core/observability';\nimport { BaseExporter } from '@mastra/observability';\nimport { diag, DiagConsoleLogger, DiagLogLevel } from '@opentelemetry/api';\n\nimport { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport type { SpanExporter } from '@opentelemetry/sdk-trace-base';\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 extends BaseExporter {\n private config: OtelExporterConfig;\n private observabilityConfig?: ObservabilityInstanceConfig;\n private spanConverter?: SpanConverter;\n private processor?: BatchSpanProcessor;\n private exporter?: SpanExporter;\n private isSetup: boolean = false;\n\n name = 'opentelemetry';\n\n constructor(config: OtelExporterConfig) {\n super(config);\n\n this.config = config;\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(options: InitExporterOptions) {\n this.observabilityConfig = options.config;\n }\n\n private async setupExporter() {\n // already setup or exporter already set\n if (this.isSetup || this.exporter) return;\n\n // Provider configuration is required\n if (!this.config.provider) {\n this.setDisabled(\n '[OtelExporter] Provider configuration is required. Use the \"custom\" provider for generic endpoints.',\n );\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.setDisabled('[OtelExporter] Provider configuration validation failed.');\n this.isSetup = true;\n return;\n }\n\n // user provided an instantiated SpanExporter, use it\n if (this.config.exporter) {\n this.exporter = this.config.exporter;\n return;\n }\n\n const endpoint = resolved.endpoint;\n const headers = resolved.headers;\n const protocol = resolved.protocol;\n\n // Load and create the appropriate exporter based on protocol\n const providerName = Object.keys(this.config.provider)[0];\n const ExporterClass = await loadExporter(protocol, providerName);\n\n if (!ExporterClass) {\n // Exporter not available, disable tracing\n this.setDisabled(`[OtelExporter] Exporter not available for protocol: ${protocol}`);\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.setDisabled(\n `[OtelExporter] Failed to load gRPC metadata. Install required packages:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-grpc @grpc/grpc-js`,\n );\n this.logger.error('[OtelExporter] gRPC error details:', grpcError);\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.setDisabled('[OtelExporter] Failed to create exporter.');\n this.logger.error('[OtelExporter] Exporter creation error details:', error);\n this.isSetup = true;\n return;\n }\n }\n\n private async setupProcessor() {\n if (this.processor || this.isSetup) return;\n\n this.spanConverter = new SpanConverter({\n packageName: '@mastra/otel-exporter',\n serviceName: this.observabilityConfig?.serviceName,\n config: this.config,\n format: 'GenAI_v1_38_0',\n });\n\n // Always use BatchSpanProcessor for production\n // It queues spans and exports them in batches for better performance\n this.processor = new BatchSpanProcessor(this.exporter!, {\n maxExportBatchSize: this.config.batchSize || 512, // Default batch size\n maxQueueSize: 2048, // Maximum spans to queue\n scheduledDelayMillis: 5000, // Export every 5 seconds\n exportTimeoutMillis: this.config.timeout || 30000, // Export timeout\n });\n\n this.logger.debug(\n `[OtelExporter] Using BatchSpanProcessor (batch size: ${this.config.batchSize || 512}, delay: 5s)`,\n );\n }\n\n private async setup() {\n if (this.isSetup) return;\n await this.setupExporter();\n await this.setupProcessor();\n this.isSetup = true;\n }\n\n protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n // Only process SPAN_ENDED events for OTEL\n // OTEL expects complete spans with start and end times\n if (event.type !== TracingEventType.SPAN_ENDED) {\n return;\n }\n\n const span = event.exportedSpan;\n await this.exportSpan(span);\n }\n\n private async exportSpan(span: AnyExportedSpan): Promise<void> {\n // Ensure exporter is set up\n if (!this.isSetup) {\n await this.setup();\n }\n\n // Skip if disabled\n if (this.isDisabled || !this.processor) {\n return;\n }\n\n try {\n // Convert the span to OTEL format\n const otelSpan = await 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(otelSpan);\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":"tracing.d.ts","sourceRoot":"","sources":["../src/tracing.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,YAAY,EAEZ,mBAAmB,EAEpB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AASrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,qBAAa,YAAa,SAAQ,YAAY;IAC5C,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,mBAAmB,CAAC,CAA8B;IAC1D,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC,OAAO,CAAC,SAAS,CAAC,CAAqB;IACvC,OAAO,CAAC,QAAQ,CAAC,CAAe;IAChC,OAAO,CAAC,OAAO,CAAkB;IAEjC,IAAI,SAAmB;gBAEX,MAAM,EAAE,kBAAkB;IAWtC;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,mBAAmB;YAInB,aAAa;YA6Fb,cAAc;YAwBd,KAAK;cAOH,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;YAWzD,UAAU;IA8BlB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAMhC"}
1
+ {"version":3,"file":"tracing.d.ts","sourceRoot":"","sources":["../src/tracing.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,YAAY,EAEZ,mBAAmB,EAEpB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AASrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,qBAAa,YAAa,SAAQ,YAAY;IAC5C,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,mBAAmB,CAAC,CAA8B;IAC1D,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC,OAAO,CAAC,SAAS,CAAC,CAAqB;IACvC,OAAO,CAAC,QAAQ,CAAC,CAAe;IAChC,OAAO,CAAC,OAAO,CAAkB;IAEjC,IAAI,SAAmB;gBAEX,MAAM,EAAE,kBAAkB;IAWtC;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,mBAAmB;YAInB,aAAa;YA2Fb,cAAc;YAwBd,KAAK;cAOH,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;YAWzD,UAAU;IA8BlB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAMhC"}
package/dist/types.d.ts CHANGED
@@ -27,7 +27,6 @@ export interface TraceloopConfig {
27
27
  }
28
28
  export interface LaminarConfig {
29
29
  apiKey?: string;
30
- teamId?: string;
31
30
  endpoint?: string;
32
31
  }
33
32
  export interface CustomConfig {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAElE,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,eAAe,GAAG,MAAM,GAAG,QAAQ,CAAC;AAM/E,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAGD,MAAM,MAAM,cAAc,GACtB;IAAE,KAAK,EAAE,WAAW,CAAA;CAAE,GACtB;IAAE,MAAM,EAAE,YAAY,CAAA;CAAE,GACxB;IAAE,QAAQ,EAAE,cAAc,CAAA;CAAE,GAC5B;IAAE,SAAS,EAAE,eAAe,CAAA;CAAE,GAC9B;IAAE,OAAO,EAAE,aAAa,CAAA;CAAE,GAC1B;IAAE,MAAM,EAAE,YAAY,CAAA;CAAE,CAAC;AAE7B,MAAM,WAAW,kBAAmB,SAAQ,kBAAkB;IAE5D,QAAQ,CAAC,EAAE,cAAc,CAAC;IAG1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IAGnB,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAG/C,kBAAkB,CAAC,EAAE,0BAA0B,CAAC;IAGhD,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,eAAe,CAAC;IACtB,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,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAElE,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,eAAe,GAAG,MAAM,GAAG,QAAQ,CAAC;AAM/E,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,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,kBAAmB,SAAQ,kBAAkB;IAE5D,QAAQ,CAAC,EAAE,cAAc,CAAC;IAG1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IAGnB,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAG/C,kBAAkB,CAAC,EAAE,0BAA0B,CAAC;IAGhD,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,eAAe,CAAC;IACtB,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": "1.0.0-beta.12",
3
+ "version": "1.0.0-beta.13",
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",
@@ -30,7 +30,7 @@
30
30
  "@opentelemetry/sdk-trace-base": "^2.1.0",
31
31
  "@opentelemetry/sdk-trace-node": "^2.1.0",
32
32
  "@opentelemetry/semantic-conventions": "1.38.0",
33
- "@mastra/observability": "1.0.0-beta.10"
33
+ "@mastra/observability": "1.0.0-beta.11"
34
34
  },
35
35
  "optionalDependencies": {
36
36
  "@grpc/grpc-js": "^1.14.1",
@@ -47,9 +47,9 @@
47
47
  "tsup": "^8.5.0",
48
48
  "typescript": "^5.9.3",
49
49
  "vitest": "4.0.16",
50
- "@internal/lint": "0.0.53",
51
50
  "@internal/types-builder": "0.0.28",
52
- "@mastra/core": "1.0.0-beta.21"
51
+ "@internal/lint": "0.0.53",
52
+ "@mastra/core": "1.0.0-beta.22"
53
53
  },
54
54
  "peerDependencies": {
55
55
  "@grpc/grpc-js": "^1.13.4",