@mastra/otel-exporter 1.1.0 → 1.1.1-alpha.1

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,21 @@
1
1
  # @mastra/otel-exporter
2
2
 
3
+ ## 1.1.1-alpha.1
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [[`5556cc1`](https://github.com/mastra-ai/mastra/commit/5556cc1befec71518d84f826b3bfe3a079a9daf7), [`5499303`](https://github.com/mastra-ai/mastra/commit/54993032c1ebc09642625b78d2014e0cf84a3cae), [`e47bca7`](https://github.com/mastra-ai/mastra/commit/e47bca7b72866d3abd173b9f530ac4318113a8ff), [`0031d0f`](https://github.com/mastra-ai/mastra/commit/0031d0f13831d7843ac5d498734a7d92862e2ce3), [`3498b49`](https://github.com/mastra-ai/mastra/commit/3498b4946be94f4313cd817733589680dcda5278), [`359439b`](https://github.com/mastra-ai/mastra/commit/359439bb8c635e048176306828195f8297f50021), [`3552b1c`](https://github.com/mastra-ai/mastra/commit/3552b1c872988885f1c33d97122323567e2aff8e)]:
8
+ - @mastra/core@1.36.0-alpha.3
9
+ - @mastra/observability@1.13.0-alpha.1
10
+
11
+ ## 1.1.1-alpha.0
12
+
13
+ ### Patch Changes
14
+
15
+ - Updated dependencies [[`8cdb86c`](https://github.com/mastra-ai/mastra/commit/8cdb86ceed1137bc2768e147dce85a0692b9fb26), [`eda90c5`](https://github.com/mastra-ai/mastra/commit/eda90c5bfd7de11805ecc9f4552716c895fbaf78), [`eda90c5`](https://github.com/mastra-ai/mastra/commit/eda90c5bfd7de11805ecc9f4552716c895fbaf78), [`afc004f`](https://github.com/mastra-ai/mastra/commit/afc004f5cc7e30697809e7021820b9f5881e6719), [`408be73`](https://github.com/mastra-ai/mastra/commit/408be73449dfab92b51eab8c6623b6c443debc25)]:
16
+ - @mastra/core@1.36.0-alpha.1
17
+ - @mastra/observability@1.13.0-alpha.0
18
+
3
19
  ## 1.1.0
4
20
 
5
21
  ### Minor Changes
package/dist/index.cjs CHANGED
@@ -615,6 +615,7 @@ var SpanConverter = class {
615
615
  this.params = params;
616
616
  this.format = params.format;
617
617
  }
618
+ params;
618
619
  resource;
619
620
  scope;
620
621
  initPromise;
@@ -781,6 +782,8 @@ var DebugSpanExporterWrapper = class {
781
782
  this.inner = inner;
782
783
  this.debugLog = debugLog;
783
784
  }
785
+ inner;
786
+ debugLog;
784
787
  export(spans, resultCallback) {
785
788
  const count = spans.length;
786
789
  this.inner.export(spans, (result) => {
@@ -804,6 +807,8 @@ var DebugLogExporterWrapper = class {
804
807
  this.inner = inner;
805
808
  this.debugLog = debugLog;
806
809
  }
810
+ inner;
811
+ debugLog;
807
812
  export(logs, resultCallback) {
808
813
  const count = logs.length;
809
814
  this.inner.export(logs, (result) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/loadExporter.ts","../src/log-converter.ts","../src/provider-configs.ts","../src/gen-ai-messages.ts","../src/gen-ai-semantics.ts","../src/span-converter.ts","../src/tracing.ts"],"names":["SeverityNumber","ATTR_GEN_AI_USAGE_INPUT_TOKENS","ATTR_GEN_AI_USAGE_OUTPUT_TOKENS","ATTR_GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS","ATTR_GEN_AI_USAGE_CACHE_CREATION_INPUT_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","dateToHrTime","TraceFlags","fileURLToPath","readFileSync","SpanKind","SpanStatusCode","ExportResultCode","BaseExporter","diag","DiagConsoleLogger","DiagLogLevel","BatchSpanProcessor","LoggerProvider","BatchLogRecordProcessor","TracingEventType","apiContext","trace"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Dynamic loader for optional OTel signal exporters.\n *\n * Each combination of signal (traces/logs) and protocol (http/json,\n * http/protobuf, grpc, zipkin) maps to a different npm package. We dynamically\n * import only the one the user's provider config requires, and cache the\n * constructor so subsequent calls are free.\n */\n\nimport type { ExportProtocol } from './types.js';\n\nexport type SignalType = 'traces' | 'logs';\n\n// ---------------------------------------------------------------------------\n// Package / export-name matrix\n// ---------------------------------------------------------------------------\n\ninterface ExporterSpec {\n /** npm package to dynamic-import */\n pkg: string;\n /** Named export to pull from the package */\n exportName: string;\n /** Extra packages to mention in the install hint (e.g. @grpc/grpc-js) */\n extras?: string[];\n}\n\ntype ProtocolKey = 'http/json' | 'http/protobuf' | 'grpc' | 'zipkin';\n\nconst EXPORTER_SPECS: Record<SignalType, Partial<Record<ProtocolKey, ExporterSpec>>> = {\n traces: {\n 'http/json': { pkg: '@opentelemetry/exporter-trace-otlp-http', exportName: 'OTLPTraceExporter' },\n 'http/protobuf': { pkg: '@opentelemetry/exporter-trace-otlp-proto', exportName: 'OTLPTraceExporter' },\n grpc: {\n pkg: '@opentelemetry/exporter-trace-otlp-grpc',\n exportName: 'OTLPTraceExporter',\n extras: ['@grpc/grpc-js'],\n },\n zipkin: { pkg: '@opentelemetry/exporter-zipkin', exportName: 'ZipkinExporter' },\n },\n logs: {\n 'http/json': { pkg: '@opentelemetry/exporter-logs-otlp-http', exportName: 'OTLPLogExporter' },\n 'http/protobuf': { pkg: '@opentelemetry/exporter-logs-otlp-proto', exportName: 'OTLPLogExporter' },\n grpc: {\n pkg: '@opentelemetry/exporter-logs-otlp-grpc',\n exportName: 'OTLPLogExporter',\n extras: ['@grpc/grpc-js'],\n },\n // zipkin: not supported\n },\n};\n\n// ---------------------------------------------------------------------------\n// Cache + loader\n// ---------------------------------------------------------------------------\n\n/** Cache keyed by \"signal:protocol\" */\nconst cache = new Map<string, any>();\n\n/**\n * Load a trace exporter for the given protocol.\n * Backward-compatible with existing usage in tracing.ts.\n */\nexport async function loadExporter(protocol: ExportProtocol, provider?: string): Promise<any> {\n return loadSignalExporter('traces', protocol, provider);\n}\n\n/**\n * Load a signal-specific exporter class for the given protocol.\n * Returns the constructor, or null if the package isn't installed.\n */\nexport async function loadSignalExporter(\n signal: SignalType,\n protocol: ExportProtocol,\n provider?: string,\n): Promise<any> {\n const spec = EXPORTER_SPECS[signal]?.[protocol];\n\n if (!spec) {\n if (protocol === 'zipkin') {\n console.warn(\n `[OtelExporter] Zipkin does not support OTLP ${signal}. ${capitalize(signal)} export will be disabled.`,\n );\n }\n return null;\n }\n\n const cacheKey = `${signal}:${protocol}`;\n if (cache.has(cacheKey)) {\n return cache.get(cacheKey);\n }\n\n try {\n const mod = await import(spec.pkg);\n const ExporterClass = mod[spec.exportName];\n if (typeof ExporterClass !== 'function') {\n console.error(\n `[OtelExporter] ${capitalize(signal)} ${protocol} exporter package \"${spec.pkg}\" did not expose a \"${spec.exportName}\" export. ` +\n `${capitalize(signal)} export will be disabled.`,\n );\n return null;\n }\n cache.set(cacheKey, ExporterClass);\n return ExporterClass;\n } catch {\n const providerInfo = provider ? ` (required for ${provider})` : '';\n const allPkgs = [spec.pkg, ...(spec.extras ?? [])].join(' ');\n console.error(\n `[OtelExporter] ${capitalize(signal)} ${protocol} exporter is not installed${providerInfo}.\\n` +\n ` Install the required package(s):\\n` +\n ` npm install ${allPkgs}`,\n );\n return null;\n }\n}\n\nfunction capitalize(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n","/**\n * Convert Mastra ExportedLog to OpenTelemetry LogRecord format\n */\n\nimport type { ExportedLog, LogLevel } from '@mastra/core/observability';\nimport type { HrTime } from '@opentelemetry/api';\nimport type { LogAttributes } from '@opentelemetry/api-logs';\nimport { SeverityNumber } from '@opentelemetry/api-logs';\n\n/**\n * Map Mastra LogLevel to OTEL SeverityNumber\n */\nexport function mapSeverity(level: LogLevel): SeverityNumber {\n switch (level) {\n case 'debug':\n return SeverityNumber.DEBUG;\n case 'info':\n return SeverityNumber.INFO;\n case 'warn':\n return SeverityNumber.WARN;\n case 'error':\n return SeverityNumber.ERROR;\n case 'fatal':\n return SeverityNumber.FATAL;\n default:\n return SeverityNumber.UNSPECIFIED;\n }\n}\n\n/**\n * Convert a Date to OTEL HrTime [seconds, nanoseconds]\n */\nfunction dateToHrTime(date: Date): HrTime {\n const ms = date.getTime();\n const seconds = Math.floor(ms / 1000);\n const nanoseconds = (ms % 1000) * 1_000_000;\n return [seconds, nanoseconds];\n}\n\n/**\n * Stringify a value for use as an OTEL log attribute. Falls back to a\n * placeholder rather than throwing if the value contains a circular\n * reference, throws from a custom toJSON, or otherwise cannot be serialized.\n */\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value);\n } catch {\n return '[unserializable]';\n }\n}\n\n/**\n * Build OTEL log attributes from ExportedLog fields.\n * Includes trace correlation and metadata.\n */\nexport function buildLogAttributes(log: ExportedLog): LogAttributes {\n const attributes: LogAttributes = {};\n\n // Add structured data fields as attributes\n if (log.data) {\n for (const [key, value] of Object.entries(log.data)) {\n if (value === null || value === undefined) continue;\n attributes[`mastra.log.${key}`] =\n typeof value === 'object' ? safeStringify(value) : (value as string | number | boolean);\n }\n }\n\n // Add metadata as attributes\n if (log.metadata) {\n for (const [key, value] of Object.entries(log.metadata)) {\n if (value === null || value === undefined) continue;\n attributes[`mastra.metadata.${key}`] =\n typeof value === 'object' ? safeStringify(value) : (value as string | number | boolean);\n }\n }\n\n // Add tags if present\n if (log.tags?.length) {\n attributes['mastra.tags'] = safeStringify(log.tags);\n }\n\n return attributes;\n}\n\n/**\n * Parameters for emitting an OTEL log record from a Mastra ExportedLog.\n */\nexport interface OtelLogEmitParams {\n timestamp: HrTime;\n severityNumber: SeverityNumber;\n severityText: string;\n body: string;\n attributes: LogAttributes;\n traceId?: string;\n spanId?: string;\n}\n\n/**\n * Convert an ExportedLog into parameters suitable for OTEL Logger.emit()\n */\nexport function convertLog(log: ExportedLog): OtelLogEmitParams {\n return {\n timestamp: dateToHrTime(log.timestamp),\n severityNumber: mapSeverity(log.level),\n severityText: log.level.toUpperCase(),\n body: log.message,\n attributes: buildLogAttributes(log),\n traceId: log.traceId,\n spanId: log.spanId,\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, debug?: boolean): ResolvedProviderConfig | null {\n const providerName = Object.keys(config)[0];\n\n if (debug) {\n console.info(`[OtelExporter:debug] Resolving provider config for: ${providerName}`);\n }\n\n let resolved: ResolvedProviderConfig | null;\n\n if ('dash0' in config) {\n resolved = resolveDash0Config(config.dash0);\n } else if ('signoz' in config) {\n resolved = resolveSignozConfig(config.signoz);\n } else if ('newrelic' in config) {\n resolved = resolveNewRelicConfig(config.newrelic);\n } else if ('traceloop' in config) {\n resolved = resolveTraceloopConfig(config.traceloop);\n } else if ('laminar' in config) {\n resolved = resolveLaminarConfig(config.laminar);\n } else if ('custom' in config) {\n resolved = resolveCustomConfig(config.custom);\n } else {\n // TypeScript exhaustiveness check\n const _exhaustive: never = config;\n return _exhaustive;\n }\n\n if (debug && resolved) {\n // Header values frequently carry credentials (Bearer tokens, API keys, Basic auth).\n // Don't log any portion of the value — even prefix/suffix slices can leak.\n const maskedHeaders: Record<string, string> = {};\n for (const [key, value] of Object.entries(resolved.headers)) {\n maskedHeaders[key] = value ? '[REDACTED]' : '[EMPTY]';\n }\n console.info(`[OtelExporter:debug] Provider \"${providerName}\" resolved:`, {\n endpoint: resolved.endpoint,\n protocol: resolved.protocol,\n headers: maskedHeaders,\n });\n } else if (debug && !resolved) {\n console.info(`[OtelExporter:debug] Provider \"${providerName}\" resolution returned null (disabled)`);\n }\n\n return resolved;\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_USAGE_CACHE_READ_INPUT_TOKENS,\n ATTR_GEN_AI_USAGE_CACHE_CREATION_INPUT_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 [ATTR_GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS]?: number;\n [ATTR_GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS]?: number;\n 'gen_ai.usage.reasoning_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 input tokens (subset of input_tokens)\n if (usage.inputDetails?.cacheRead !== undefined) {\n metrics[ATTR_GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS] = usage.inputDetails.cacheRead;\n }\n\n // Cache creation input tokens (subset of input_tokens)\n if (usage.inputDetails?.cacheWrite !== undefined) {\n metrics[ATTR_GEN_AI_USAGE_CACHE_CREATION_INPUT_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 // Completion start time (TTFT) - used by observability backends for time-to-first-token metrics\n if (modelAttrs.completionStartTime) {\n attributes['mastra.completion_start_time'] = modelAttrs.completionStartTime.toISOString();\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 Exporter for Mastra\n *\n * Exports traces and logs to any OTLP-compatible endpoint.\n */\n\nimport type {\n TracingEvent,\n LogEvent,\n InitExporterOptions,\n ObservabilityInstanceConfig,\n} from '@mastra/core/observability';\nimport { TracingEventType } from '@mastra/core/observability';\nimport { BaseExporter } from '@mastra/observability';\nimport { context as apiContext, diag, DiagConsoleLogger, DiagLogLevel, trace, TraceFlags } from '@opentelemetry/api';\nimport type { Logger } from '@opentelemetry/api-logs';\n\nimport type { ExportResult } from '@opentelemetry/core';\nimport { ExportResultCode } from '@opentelemetry/core';\n\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport { LoggerProvider, BatchLogRecordProcessor } from '@opentelemetry/sdk-logs';\nimport type { SpanExporter, ReadableSpan } from '@opentelemetry/sdk-trace-base';\nimport { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport { ATTR_SERVICE_NAME } from '@opentelemetry/semantic-conventions';\n\nimport { loadExporter, loadSignalExporter } from './loadExporter.js';\nimport { convertLog } from './log-converter.js';\nimport { resolveProviderConfig } from './provider-configs.js';\nimport type { ResolvedProviderConfig } from './provider-configs.js';\nimport { SpanConverter } from './span-converter.js';\nimport type { ExportProtocol, OtelExporterConfig } from './types.js';\n\n/**\n * Wrapper around a SpanExporter that logs export results when debug mode is enabled.\n * The OTel SDK intentionally does not log on success, making debugging difficult.\n * This wrapper adds visibility into each batch export's outcome.\n */\nclass DebugSpanExporterWrapper implements SpanExporter {\n constructor(\n private inner: SpanExporter,\n private debugLog: (msg: string) => void,\n ) {}\n\n export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void {\n const count = spans.length;\n this.inner.export(spans, (result: ExportResult) => {\n if (result.code === ExportResultCode.SUCCESS) {\n this.debugLog(`[OtelExporter] Export completed: ${count} spans sent successfully`);\n } else {\n this.debugLog(`[OtelExporter] Export FAILED: ${count} spans, error: ${result.error?.message ?? 'unknown'}`);\n }\n resultCallback(result);\n });\n }\n\n async shutdown(): Promise<void> {\n return this.inner.shutdown();\n }\n\n async forceFlush(): Promise<void> {\n return this.inner.forceFlush?.();\n }\n}\n\n/**\n * Wrapper around a LogRecordExporter that logs export results when debug mode is enabled.\n * Same pattern as DebugSpanExporterWrapper but for log records.\n */\nclass DebugLogExporterWrapper {\n constructor(\n private inner: any,\n private debugLog: (msg: string) => void,\n ) {}\n\n export(logs: any[], resultCallback: (result: ExportResult) => void): void {\n const count = logs.length;\n this.inner.export(logs, (result: ExportResult) => {\n if (result.code === ExportResultCode.SUCCESS) {\n this.debugLog(`[OtelExporter] Log export completed: ${count} logs sent successfully`);\n } else {\n this.debugLog(`[OtelExporter] Log export FAILED: ${count} logs, error: ${result.error?.message ?? 'unknown'}`);\n }\n resultCallback(result);\n });\n }\n\n async shutdown(): Promise<void> {\n return this.inner.shutdown();\n }\n\n async forceFlush(): Promise<void> {\n return this.inner.forceFlush?.();\n }\n}\n\nexport class OtelExporter extends BaseExporter {\n private config: OtelExporterConfig;\n private observabilityConfig?: ObservabilityInstanceConfig;\n\n // Trace signal\n private spanConverter?: SpanConverter;\n private processor?: BatchSpanProcessor;\n private exporter?: SpanExporter;\n\n // Log signal\n private loggerProvider?: LoggerProvider;\n private otelLogger?: Logger;\n\n // Provider config (resolved once, shared across signals)\n private resolvedConfig?: ResolvedProviderConfig | null;\n private providerName?: string;\n\n // Single setup promise — all signals initialize together at init() time.\n // Event handlers await this before processing. Never rejects.\n private setupPromise?: Promise<void>;\n\n name = 'opentelemetry';\n\n constructor(config: OtelExporterConfig) {\n super(config);\n\n this.config = config;\n\n // Set OTel SDK diagnostics to INFO level so we see warnings/errors from\n // the SDK internals. We intentionally do NOT use DEBUG here because:\n // 1. OTLPExportDelegate dumps enormous payloads at DEBUG level\n // 2. diag.setLogger() is global and can be overwritten by other code\n // Our DebugSpanExporterWrapper provides export-result logging instead.\n if (config.logLevel === 'debug') {\n diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.INFO);\n }\n }\n\n /**\n * Initialize with observability configuration and eagerly set up the trace\n * and log signal exporters in parallel.\n *\n * Called by Mastra during component registration. The async setup runs in the\n * background — event handlers await the resulting promise before processing.\n */\n init(options: InitExporterOptions) {\n this.observabilityConfig = options.config;\n this.setupPromise = this.setupAllSignals();\n }\n\n // ===========================================================================\n // Provider config resolution (shared across all signals)\n // ===========================================================================\n\n private get isDebug(): boolean {\n return this.config.logLevel === 'debug';\n }\n\n /**\n * Debug logging that bypasses the Mastra logger.\n *\n * The Mastra framework replaces our logger via __setLogger() with one at\n * INFO level, which silently swallows all this.logger.debug() calls.\n * For debug output we need to go through console.info directly.\n */\n\n private debugLog = (...args: unknown[]) => this.isDebug && console.info('[OtelExporter:debug]', ...args);\n\n private resolveProvider(): ResolvedProviderConfig | null {\n if (this.resolvedConfig !== undefined) {\n return this.resolvedConfig;\n }\n\n if (!this.config.provider) {\n this.setDisabled(\n '[OtelExporter] Provider configuration is required. Use the \"custom\" provider for generic endpoints.',\n );\n this.resolvedConfig = null;\n return null;\n }\n\n this.providerName = Object.keys(this.config.provider)[0];\n const resolved = resolveProviderConfig(this.config.provider, this.isDebug);\n if (!resolved) {\n this.setDisabled('[OtelExporter] Provider configuration validation failed.');\n this.resolvedConfig = null;\n return null;\n }\n\n this.resolvedConfig = resolved;\n return resolved;\n }\n\n /**\n * Derive the endpoint for a specific signal from the resolved provider config.\n * Strips trailing slashes and any existing signal-path suffix so we never\n * produce a doubled \"//v1/logs\" or leave a stale \"/v1/traces\" on a logs URL.\n */\n private getSignalEndpoint(resolved: ResolvedProviderConfig, signal: 'traces' | 'logs'): string {\n const signalPaths: Record<string, string> = {\n traces: '/v1/traces',\n logs: '/v1/logs',\n };\n\n // Drop trailing slashes first so the suffix check below also matches\n // endpoints written like \".../v1/traces/\". Bounded loop instead of\n // /\\/+$/ to avoid the polynomial-regex pattern CodeQL flags.\n let base = resolved.endpoint;\n while (base.endsWith('/')) {\n base = base.slice(0, -1);\n }\n\n // Strip any existing signal-path suffix (with or without leading slash variations)\n for (const path of Object.values(signalPaths)) {\n if (base.endsWith(path)) {\n base = base.slice(0, -path.length);\n break;\n }\n }\n\n return base + signalPaths[signal];\n }\n\n /**\n * Build exporter constructor options for the given signal endpoint.\n * For gRPC, converts headers to Metadata. For HTTP protocols, passes headers directly.\n */\n private async buildExporterOptions(\n protocol: ExportProtocol,\n url: string,\n headers: Record<string, string>,\n ): Promise<Record<string, unknown>> {\n if (protocol === 'grpc') {\n const grpcModule = await import('@grpc/grpc-js');\n const metadata = new grpcModule.Metadata();\n for (const [key, value] of Object.entries(headers)) {\n metadata.set(key, value);\n }\n return { url, metadata, timeoutMillis: this.config.timeout };\n }\n return { url, headers, timeoutMillis: this.config.timeout };\n }\n\n // ===========================================================================\n // Setup — eager, parallel initialization of all signals\n // ===========================================================================\n\n /**\n * Wait for setup to complete. If init() was called, this awaits the\n * already-in-flight setup promise. If init() was never called (standalone\n * usage without Mastra), this triggers setup on first use.\n */\n private ensureSetup(): Promise<void> {\n if (!this.setupPromise) {\n this.setupPromise = this.setupAllSignals();\n }\n return this.setupPromise;\n }\n\n /**\n * Resolve provider config once and set up all enabled signals in parallel.\n * Each signal setup catches its own errors — this method never rejects.\n */\n private async setupAllSignals(): Promise<void> {\n const resolved = this.resolveProvider();\n if (!resolved) {\n this.debugLog('Setup skipped: provider not resolved');\n return;\n }\n\n const protocol = resolved.protocol;\n const setupTasks: Promise<void>[] = [];\n\n if (this.config.signals?.traces !== false) {\n setupTasks.push(this.setupTraces(resolved, protocol));\n } else {\n this.debugLog('Trace export disabled via config');\n }\n\n if (this.config.signals?.logs !== false) {\n setupTasks.push(this.setupLogs(resolved, protocol));\n } else {\n this.debugLog('Log export disabled via config');\n }\n\n await Promise.all(setupTasks);\n\n this.debugLog(`Setup complete [traces=${!!this.processor}, logs=${!!this.otelLogger}]`);\n }\n\n // ---------------------------------------------------------------------------\n // Trace setup\n // ---------------------------------------------------------------------------\n\n private async setupTraces(resolved: ResolvedProviderConfig, protocol: ExportProtocol): Promise<void> {\n try {\n // Create or use the provided SpanExporter\n if (this.config.exporter) {\n this.exporter = this.config.exporter;\n } else {\n const headers = resolved.headers;\n // Zipkin doesn't follow OTLP signal-path conventions; pass its endpoint through unchanged.\n const endpoint = protocol === 'zipkin' ? resolved.endpoint : this.getSignalEndpoint(resolved, 'traces');\n\n this.debugLog(`Setting up trace exporter: protocol=${protocol}, endpoint=${endpoint}`);\n\n const ExporterClass = await loadExporter(protocol, this.providerName);\n if (!ExporterClass) {\n this.debugLog(`Trace exporter not available for protocol: ${protocol}`);\n return;\n }\n\n const exporterOptions =\n protocol === 'zipkin'\n ? { url: endpoint, headers }\n : await this.buildExporterOptions(protocol, endpoint, headers);\n this.exporter = new ExporterClass(exporterOptions);\n\n this.debugLog(`Trace exporter created: ${this.exporter?.constructor?.name ?? 'unknown'} -> ${endpoint}`);\n }\n\n // Create processor\n const serviceName = this.observabilityConfig?.serviceName || 'mastra-service';\n\n this.spanConverter = new SpanConverter({\n packageName: '@mastra/otel-exporter',\n serviceName,\n config: this.config,\n format: 'GenAI_v1_38_0',\n });\n\n const exporterForProcessor = this.isDebug\n ? new DebugSpanExporterWrapper(this.exporter!, msg => this.debugLog(msg))\n : this.exporter!;\n\n this.processor = new BatchSpanProcessor(exporterForProcessor, {\n maxExportBatchSize: this.config.batchSize || 512,\n maxQueueSize: 2048,\n scheduledDelayMillis: 5000,\n exportTimeoutMillis: this.config.timeout || 30000,\n });\n\n this.debugLog(\n `Trace export initialized (service.name: \"${serviceName}\", batch size: ${this.config.batchSize || 512}, delay: 5s)`,\n );\n } catch (error) {\n this.logger.warn('[OtelExporter] Failed to initialize trace export');\n this.debugLog('Trace setup error:', error);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Log setup\n // ---------------------------------------------------------------------------\n\n private async setupLogs(resolved: ResolvedProviderConfig, protocol: ExportProtocol): Promise<void> {\n try {\n const LogExporterClass = await loadSignalExporter('logs', protocol, this.providerName);\n if (!LogExporterClass) {\n this.debugLog(`Log exporter package not available for protocol \"${protocol}\". Log export disabled.`);\n return;\n }\n\n const logEndpoint = this.getSignalEndpoint(resolved, 'logs');\n const headers = resolved.headers;\n\n this.debugLog(`Setting up log exporter: protocol=${protocol}, endpoint=${logEndpoint}`);\n\n const logExporterOptions = await this.buildExporterOptions(protocol, logEndpoint, headers);\n const logExporter = new LogExporterClass(logExporterOptions);\n\n const exporterForProcessor = this.isDebug\n ? new DebugLogExporterWrapper(logExporter, msg => this.debugLog(msg))\n : logExporter;\n\n const resource = resourceFromAttributes({\n ...(this.config.resourceAttributes ?? {}),\n [ATTR_SERVICE_NAME]: this.observabilityConfig?.serviceName || 'mastra-service',\n });\n\n this.loggerProvider = new LoggerProvider({\n resource,\n processors: [\n new BatchLogRecordProcessor(exporterForProcessor, {\n maxExportBatchSize: this.config.batchSize || 512,\n maxQueueSize: 2048,\n scheduledDelayMillis: 5000,\n exportTimeoutMillis: this.config.timeout || 30000,\n }),\n ],\n });\n\n this.otelLogger = this.loggerProvider.getLogger('@mastra/otel-exporter');\n\n this.debugLog(`Log export initialized (endpoint: ${logEndpoint})`);\n } catch (error) {\n this.logger.warn('[OtelExporter] Failed to initialize log export');\n this.debugLog('Log setup error:', error);\n }\n }\n\n // ===========================================================================\n // Trace event handler\n // ===========================================================================\n\n protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n if (this.config.signals?.traces === false) return;\n if (event.type !== TracingEventType.SPAN_ENDED) return;\n\n await this.ensureSetup();\n\n if (this.isDisabled || !this.processor) return;\n\n const span = event.exportedSpan;\n\n try {\n const otelSpan = await this.spanConverter!.convertSpan(span);\n this.processor.onEnd(otelSpan);\n\n this.debugLog(\n `Queued 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 // ===========================================================================\n // Log event handler\n // ===========================================================================\n\n async onLogEvent(event: LogEvent): Promise<void> {\n this.debugLog(`onLogEvent received (level: ${event.log.level}, message: \"${event.log.message}\")`);\n\n await this.ensureSetup();\n\n if (this.isDisabled) {\n this.debugLog('Log event skipped: exporter is disabled');\n return;\n }\n\n if (!this.otelLogger) {\n this.debugLog('Log event skipped: log exporter not available');\n return;\n }\n\n try {\n const logParams = convertLog(event.log);\n\n // Mirror trace context into the OTEL log Context so backends (Grafana, Datadog,\n // Honeycomb, etc.) correlate logs with traces using the standard OTLP fields.\n // Also keep mastra.traceId / mastra.spanId attributes for backends that key\n // off attributes only.\n const attributes = { ...logParams.attributes };\n let logContext = apiContext.active();\n if (logParams.traceId && logParams.spanId) {\n attributes['mastra.traceId'] = logParams.traceId;\n attributes['mastra.spanId'] = logParams.spanId;\n logContext = trace.setSpanContext(logContext, {\n traceId: logParams.traceId,\n spanId: logParams.spanId,\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n });\n }\n\n this.otelLogger.emit({\n timestamp: logParams.timestamp,\n severityNumber: logParams.severityNumber,\n severityText: logParams.severityText,\n body: logParams.body,\n attributes,\n context: logContext,\n });\n\n this.debugLog(`Exported log (level: ${event.log.level}, trace: ${event.log.traceId || 'none'})`);\n } catch (error) {\n this.logger.error('[OtelExporter] Failed to export log:', error);\n }\n }\n\n // ===========================================================================\n // Lifecycle\n // ===========================================================================\n\n /**\n * Force flush any buffered data without shutting down the exporter.\n * Delegates to all active processors/providers.\n */\n async flush(): Promise<void> {\n // Wait for setup so we don't miss providers that are still being initialized.\n if (this.setupPromise) {\n await this.setupPromise;\n }\n\n const flushPromises: Promise<void>[] = [];\n const signals: string[] = [];\n\n if (this.processor) {\n flushPromises.push(this.processor.forceFlush());\n signals.push('traces');\n }\n if (this.loggerProvider) {\n flushPromises.push(this.loggerProvider.forceFlush());\n signals.push('logs');\n }\n\n if (flushPromises.length > 0) {\n this.debugLog(`Flushing signals: ${signals.join(', ')}...`);\n await Promise.all(flushPromises);\n this.debugLog('Flushed all pending data');\n } else {\n this.debugLog('Flush called but no active exporters');\n }\n }\n\n async shutdown(): Promise<void> {\n // Wait for setup so we don't shut down before providers finish initializing.\n if (this.setupPromise) {\n await this.setupPromise;\n }\n\n const shutdownPromises: Promise<void>[] = [];\n\n if (this.processor) {\n shutdownPromises.push(this.processor.shutdown());\n }\n if (this.loggerProvider) {\n shutdownPromises.push(this.loggerProvider.shutdown());\n }\n\n if (shutdownPromises.length > 0) {\n await Promise.all(shutdownPromises);\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/loadExporter.ts","../src/log-converter.ts","../src/provider-configs.ts","../src/gen-ai-messages.ts","../src/gen-ai-semantics.ts","../src/span-converter.ts","../src/tracing.ts"],"names":["SeverityNumber","ATTR_GEN_AI_USAGE_INPUT_TOKENS","ATTR_GEN_AI_USAGE_OUTPUT_TOKENS","ATTR_GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS","ATTR_GEN_AI_USAGE_CACHE_CREATION_INPUT_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","dateToHrTime","TraceFlags","fileURLToPath","readFileSync","SpanKind","SpanStatusCode","ExportResultCode","BaseExporter","diag","DiagConsoleLogger","DiagLogLevel","BatchSpanProcessor","LoggerProvider","BatchLogRecordProcessor","TracingEventType","apiContext","trace"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Dynamic loader for optional OTel signal exporters.\n *\n * Each combination of signal (traces/logs) and protocol (http/json,\n * http/protobuf, grpc, zipkin) maps to a different npm package. We dynamically\n * import only the one the user's provider config requires, and cache the\n * constructor so subsequent calls are free.\n */\n\nimport type { ExportProtocol } from './types.js';\n\nexport type SignalType = 'traces' | 'logs';\n\n// ---------------------------------------------------------------------------\n// Package / export-name matrix\n// ---------------------------------------------------------------------------\n\ninterface ExporterSpec {\n /** npm package to dynamic-import */\n pkg: string;\n /** Named export to pull from the package */\n exportName: string;\n /** Extra packages to mention in the install hint (e.g. @grpc/grpc-js) */\n extras?: string[];\n}\n\ntype ProtocolKey = 'http/json' | 'http/protobuf' | 'grpc' | 'zipkin';\n\nconst EXPORTER_SPECS: Record<SignalType, Partial<Record<ProtocolKey, ExporterSpec>>> = {\n traces: {\n 'http/json': { pkg: '@opentelemetry/exporter-trace-otlp-http', exportName: 'OTLPTraceExporter' },\n 'http/protobuf': { pkg: '@opentelemetry/exporter-trace-otlp-proto', exportName: 'OTLPTraceExporter' },\n grpc: {\n pkg: '@opentelemetry/exporter-trace-otlp-grpc',\n exportName: 'OTLPTraceExporter',\n extras: ['@grpc/grpc-js'],\n },\n zipkin: { pkg: '@opentelemetry/exporter-zipkin', exportName: 'ZipkinExporter' },\n },\n logs: {\n 'http/json': { pkg: '@opentelemetry/exporter-logs-otlp-http', exportName: 'OTLPLogExporter' },\n 'http/protobuf': { pkg: '@opentelemetry/exporter-logs-otlp-proto', exportName: 'OTLPLogExporter' },\n grpc: {\n pkg: '@opentelemetry/exporter-logs-otlp-grpc',\n exportName: 'OTLPLogExporter',\n extras: ['@grpc/grpc-js'],\n },\n // zipkin: not supported\n },\n};\n\n// ---------------------------------------------------------------------------\n// Cache + loader\n// ---------------------------------------------------------------------------\n\n/** Cache keyed by \"signal:protocol\" */\nconst cache = new Map<string, any>();\n\n/**\n * Load a trace exporter for the given protocol.\n * Backward-compatible with existing usage in tracing.ts.\n */\nexport async function loadExporter(protocol: ExportProtocol, provider?: string): Promise<any> {\n return loadSignalExporter('traces', protocol, provider);\n}\n\n/**\n * Load a signal-specific exporter class for the given protocol.\n * Returns the constructor, or null if the package isn't installed.\n */\nexport async function loadSignalExporter(\n signal: SignalType,\n protocol: ExportProtocol,\n provider?: string,\n): Promise<any> {\n const spec = EXPORTER_SPECS[signal]?.[protocol];\n\n if (!spec) {\n if (protocol === 'zipkin') {\n console.warn(\n `[OtelExporter] Zipkin does not support OTLP ${signal}. ${capitalize(signal)} export will be disabled.`,\n );\n }\n return null;\n }\n\n const cacheKey = `${signal}:${protocol}`;\n if (cache.has(cacheKey)) {\n return cache.get(cacheKey);\n }\n\n try {\n const mod = await import(spec.pkg);\n const ExporterClass = mod[spec.exportName];\n if (typeof ExporterClass !== 'function') {\n console.error(\n `[OtelExporter] ${capitalize(signal)} ${protocol} exporter package \"${spec.pkg}\" did not expose a \"${spec.exportName}\" export. ` +\n `${capitalize(signal)} export will be disabled.`,\n );\n return null;\n }\n cache.set(cacheKey, ExporterClass);\n return ExporterClass;\n } catch {\n const providerInfo = provider ? ` (required for ${provider})` : '';\n const allPkgs = [spec.pkg, ...(spec.extras ?? [])].join(' ');\n console.error(\n `[OtelExporter] ${capitalize(signal)} ${protocol} exporter is not installed${providerInfo}.\\n` +\n ` Install the required package(s):\\n` +\n ` npm install ${allPkgs}`,\n );\n return null;\n }\n}\n\nfunction capitalize(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n","/**\n * Convert Mastra ExportedLog to OpenTelemetry LogRecord format\n */\n\nimport type { ExportedLog, LogLevel } from '@mastra/core/observability';\nimport type { HrTime } from '@opentelemetry/api';\nimport type { LogAttributes } from '@opentelemetry/api-logs';\nimport { SeverityNumber } from '@opentelemetry/api-logs';\n\n/**\n * Map Mastra LogLevel to OTEL SeverityNumber\n */\nexport function mapSeverity(level: LogLevel): SeverityNumber {\n switch (level) {\n case 'debug':\n return SeverityNumber.DEBUG;\n case 'info':\n return SeverityNumber.INFO;\n case 'warn':\n return SeverityNumber.WARN;\n case 'error':\n return SeverityNumber.ERROR;\n case 'fatal':\n return SeverityNumber.FATAL;\n default:\n return SeverityNumber.UNSPECIFIED;\n }\n}\n\n/**\n * Convert a Date to OTEL HrTime [seconds, nanoseconds]\n */\nfunction dateToHrTime(date: Date): HrTime {\n const ms = date.getTime();\n const seconds = Math.floor(ms / 1000);\n const nanoseconds = (ms % 1000) * 1_000_000;\n return [seconds, nanoseconds];\n}\n\n/**\n * Stringify a value for use as an OTEL log attribute. Falls back to a\n * placeholder rather than throwing if the value contains a circular\n * reference, throws from a custom toJSON, or otherwise cannot be serialized.\n */\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value);\n } catch {\n return '[unserializable]';\n }\n}\n\n/**\n * Build OTEL log attributes from ExportedLog fields.\n * Includes trace correlation and metadata.\n */\nexport function buildLogAttributes(log: ExportedLog): LogAttributes {\n const attributes: LogAttributes = {};\n\n // Add structured data fields as attributes\n if (log.data) {\n for (const [key, value] of Object.entries(log.data)) {\n if (value === null || value === undefined) continue;\n attributes[`mastra.log.${key}`] =\n typeof value === 'object' ? safeStringify(value) : (value as string | number | boolean);\n }\n }\n\n // Add metadata as attributes\n if (log.metadata) {\n for (const [key, value] of Object.entries(log.metadata)) {\n if (value === null || value === undefined) continue;\n attributes[`mastra.metadata.${key}`] =\n typeof value === 'object' ? safeStringify(value) : (value as string | number | boolean);\n }\n }\n\n // Add tags if present\n if (log.tags?.length) {\n attributes['mastra.tags'] = safeStringify(log.tags);\n }\n\n return attributes;\n}\n\n/**\n * Parameters for emitting an OTEL log record from a Mastra ExportedLog.\n */\nexport interface OtelLogEmitParams {\n timestamp: HrTime;\n severityNumber: SeverityNumber;\n severityText: string;\n body: string;\n attributes: LogAttributes;\n traceId?: string;\n spanId?: string;\n}\n\n/**\n * Convert an ExportedLog into parameters suitable for OTEL Logger.emit()\n */\nexport function convertLog(log: ExportedLog): OtelLogEmitParams {\n return {\n timestamp: dateToHrTime(log.timestamp),\n severityNumber: mapSeverity(log.level),\n severityText: log.level.toUpperCase(),\n body: log.message,\n attributes: buildLogAttributes(log),\n traceId: log.traceId,\n spanId: log.spanId,\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, debug?: boolean): ResolvedProviderConfig | null {\n const providerName = Object.keys(config)[0];\n\n if (debug) {\n console.info(`[OtelExporter:debug] Resolving provider config for: ${providerName}`);\n }\n\n let resolved: ResolvedProviderConfig | null;\n\n if ('dash0' in config) {\n resolved = resolveDash0Config(config.dash0);\n } else if ('signoz' in config) {\n resolved = resolveSignozConfig(config.signoz);\n } else if ('newrelic' in config) {\n resolved = resolveNewRelicConfig(config.newrelic);\n } else if ('traceloop' in config) {\n resolved = resolveTraceloopConfig(config.traceloop);\n } else if ('laminar' in config) {\n resolved = resolveLaminarConfig(config.laminar);\n } else if ('custom' in config) {\n resolved = resolveCustomConfig(config.custom);\n } else {\n // TypeScript exhaustiveness check\n const _exhaustive: never = config;\n return _exhaustive;\n }\n\n if (debug && resolved) {\n // Header values frequently carry credentials (Bearer tokens, API keys, Basic auth).\n // Don't log any portion of the value — even prefix/suffix slices can leak.\n const maskedHeaders: Record<string, string> = {};\n for (const [key, value] of Object.entries(resolved.headers)) {\n maskedHeaders[key] = value ? '[REDACTED]' : '[EMPTY]';\n }\n console.info(`[OtelExporter:debug] Provider \"${providerName}\" resolved:`, {\n endpoint: resolved.endpoint,\n protocol: resolved.protocol,\n headers: maskedHeaders,\n });\n } else if (debug && !resolved) {\n console.info(`[OtelExporter:debug] Provider \"${providerName}\" resolution returned null (disabled)`);\n }\n\n return resolved;\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_USAGE_CACHE_READ_INPUT_TOKENS,\n ATTR_GEN_AI_USAGE_CACHE_CREATION_INPUT_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 [ATTR_GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS]?: number;\n [ATTR_GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS]?: number;\n 'gen_ai.usage.reasoning_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 input tokens (subset of input_tokens)\n if (usage.inputDetails?.cacheRead !== undefined) {\n metrics[ATTR_GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS] = usage.inputDetails.cacheRead;\n }\n\n // Cache creation input tokens (subset of input_tokens)\n if (usage.inputDetails?.cacheWrite !== undefined) {\n metrics[ATTR_GEN_AI_USAGE_CACHE_CREATION_INPUT_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 // Completion start time (TTFT) - used by observability backends for time-to-first-token metrics\n if (modelAttrs.completionStartTime) {\n attributes['mastra.completion_start_time'] = modelAttrs.completionStartTime.toISOString();\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 Exporter for Mastra\n *\n * Exports traces and logs to any OTLP-compatible endpoint.\n */\n\nimport type {\n TracingEvent,\n LogEvent,\n InitExporterOptions,\n ObservabilityInstanceConfig,\n} from '@mastra/core/observability';\nimport { TracingEventType } from '@mastra/core/observability';\nimport { BaseExporter } from '@mastra/observability';\nimport { context as apiContext, diag, DiagConsoleLogger, DiagLogLevel, trace, TraceFlags } from '@opentelemetry/api';\nimport type { Logger } from '@opentelemetry/api-logs';\n\nimport type { ExportResult } from '@opentelemetry/core';\nimport { ExportResultCode } from '@opentelemetry/core';\n\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport { LoggerProvider, BatchLogRecordProcessor } from '@opentelemetry/sdk-logs';\nimport type { SpanExporter, ReadableSpan } from '@opentelemetry/sdk-trace-base';\nimport { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport { ATTR_SERVICE_NAME } from '@opentelemetry/semantic-conventions';\n\nimport { loadExporter, loadSignalExporter } from './loadExporter.js';\nimport { convertLog } from './log-converter.js';\nimport { resolveProviderConfig } from './provider-configs.js';\nimport type { ResolvedProviderConfig } from './provider-configs.js';\nimport { SpanConverter } from './span-converter.js';\nimport type { ExportProtocol, OtelExporterConfig } from './types.js';\n\n/**\n * Wrapper around a SpanExporter that logs export results when debug mode is enabled.\n * The OTel SDK intentionally does not log on success, making debugging difficult.\n * This wrapper adds visibility into each batch export's outcome.\n */\nclass DebugSpanExporterWrapper implements SpanExporter {\n constructor(\n private inner: SpanExporter,\n private debugLog: (msg: string) => void,\n ) {}\n\n export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void {\n const count = spans.length;\n this.inner.export(spans, (result: ExportResult) => {\n if (result.code === ExportResultCode.SUCCESS) {\n this.debugLog(`[OtelExporter] Export completed: ${count} spans sent successfully`);\n } else {\n this.debugLog(`[OtelExporter] Export FAILED: ${count} spans, error: ${result.error?.message ?? 'unknown'}`);\n }\n resultCallback(result);\n });\n }\n\n async shutdown(): Promise<void> {\n return this.inner.shutdown();\n }\n\n async forceFlush(): Promise<void> {\n return this.inner.forceFlush?.();\n }\n}\n\n/**\n * Wrapper around a LogRecordExporter that logs export results when debug mode is enabled.\n * Same pattern as DebugSpanExporterWrapper but for log records.\n */\nclass DebugLogExporterWrapper {\n constructor(\n private inner: any,\n private debugLog: (msg: string) => void,\n ) {}\n\n export(logs: any[], resultCallback: (result: ExportResult) => void): void {\n const count = logs.length;\n this.inner.export(logs, (result: ExportResult) => {\n if (result.code === ExportResultCode.SUCCESS) {\n this.debugLog(`[OtelExporter] Log export completed: ${count} logs sent successfully`);\n } else {\n this.debugLog(`[OtelExporter] Log export FAILED: ${count} logs, error: ${result.error?.message ?? 'unknown'}`);\n }\n resultCallback(result);\n });\n }\n\n async shutdown(): Promise<void> {\n return this.inner.shutdown();\n }\n\n async forceFlush(): Promise<void> {\n return this.inner.forceFlush?.();\n }\n}\n\nexport class OtelExporter extends BaseExporter {\n private config: OtelExporterConfig;\n private observabilityConfig?: ObservabilityInstanceConfig;\n\n // Trace signal\n private spanConverter?: SpanConverter;\n private processor?: BatchSpanProcessor;\n private exporter?: SpanExporter;\n\n // Log signal\n private loggerProvider?: LoggerProvider;\n private otelLogger?: Logger;\n\n // Provider config (resolved once, shared across signals)\n private resolvedConfig?: ResolvedProviderConfig | null;\n private providerName?: string;\n\n // Single setup promise — all signals initialize together at init() time.\n // Event handlers await this before processing. Never rejects.\n private setupPromise?: Promise<void>;\n\n name = 'opentelemetry';\n\n constructor(config: OtelExporterConfig) {\n super(config);\n\n this.config = config;\n\n // Set OTel SDK diagnostics to INFO level so we see warnings/errors from\n // the SDK internals. We intentionally do NOT use DEBUG here because:\n // 1. OTLPExportDelegate dumps enormous payloads at DEBUG level\n // 2. diag.setLogger() is global and can be overwritten by other code\n // Our DebugSpanExporterWrapper provides export-result logging instead.\n if (config.logLevel === 'debug') {\n diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.INFO);\n }\n }\n\n /**\n * Initialize with observability configuration and eagerly set up the trace\n * and log signal exporters in parallel.\n *\n * Called by Mastra during component registration. The async setup runs in the\n * background — event handlers await the resulting promise before processing.\n */\n init(options: InitExporterOptions) {\n this.observabilityConfig = options.config;\n this.setupPromise = this.setupAllSignals();\n }\n\n // ===========================================================================\n // Provider config resolution (shared across all signals)\n // ===========================================================================\n\n private get isDebug(): boolean {\n return this.config.logLevel === 'debug';\n }\n\n /**\n * Debug logging that bypasses the Mastra logger.\n *\n * The Mastra framework replaces our logger via __setLogger() with one at\n * INFO level, which silently swallows all this.logger.debug() calls.\n * For debug output we need to go through console.info directly.\n */\n\n private debugLog = (...args: unknown[]) => this.isDebug && console.info('[OtelExporter:debug]', ...args);\n\n private resolveProvider(): ResolvedProviderConfig | null {\n if (this.resolvedConfig !== undefined) {\n return this.resolvedConfig;\n }\n\n if (!this.config.provider) {\n this.setDisabled(\n '[OtelExporter] Provider configuration is required. Use the \"custom\" provider for generic endpoints.',\n );\n this.resolvedConfig = null;\n return null;\n }\n\n this.providerName = Object.keys(this.config.provider)[0];\n const resolved = resolveProviderConfig(this.config.provider, this.isDebug);\n if (!resolved) {\n this.setDisabled('[OtelExporter] Provider configuration validation failed.');\n this.resolvedConfig = null;\n return null;\n }\n\n this.resolvedConfig = resolved;\n return resolved;\n }\n\n /**\n * Derive the endpoint for a specific signal from the resolved provider config.\n * Strips trailing slashes and any existing signal-path suffix so we never\n * produce a doubled \"//v1/logs\" or leave a stale \"/v1/traces\" on a logs URL.\n */\n private getSignalEndpoint(resolved: ResolvedProviderConfig, signal: 'traces' | 'logs'): string {\n const signalPaths: Record<string, string> = {\n traces: '/v1/traces',\n logs: '/v1/logs',\n };\n\n // Drop trailing slashes first so the suffix check below also matches\n // endpoints written like \".../v1/traces/\". Bounded loop instead of\n // /\\/+$/ to avoid the polynomial-regex pattern CodeQL flags.\n let base = resolved.endpoint;\n while (base.endsWith('/')) {\n base = base.slice(0, -1);\n }\n\n // Strip any existing signal-path suffix (with or without leading slash variations)\n for (const path of Object.values(signalPaths)) {\n if (base.endsWith(path)) {\n base = base.slice(0, -path.length);\n break;\n }\n }\n\n return base + signalPaths[signal];\n }\n\n /**\n * Build exporter constructor options for the given signal endpoint.\n * For gRPC, converts headers to Metadata. For HTTP protocols, passes headers directly.\n */\n private async buildExporterOptions(\n protocol: ExportProtocol,\n url: string,\n headers: Record<string, string>,\n ): Promise<Record<string, unknown>> {\n if (protocol === 'grpc') {\n const grpcModule = await import('@grpc/grpc-js');\n const metadata = new grpcModule.Metadata();\n for (const [key, value] of Object.entries(headers)) {\n metadata.set(key, value);\n }\n return { url, metadata, timeoutMillis: this.config.timeout };\n }\n return { url, headers, timeoutMillis: this.config.timeout };\n }\n\n // ===========================================================================\n // Setup — eager, parallel initialization of all signals\n // ===========================================================================\n\n /**\n * Wait for setup to complete. If init() was called, this awaits the\n * already-in-flight setup promise. If init() was never called (standalone\n * usage without Mastra), this triggers setup on first use.\n */\n private ensureSetup(): Promise<void> {\n if (!this.setupPromise) {\n this.setupPromise = this.setupAllSignals();\n }\n return this.setupPromise;\n }\n\n /**\n * Resolve provider config once and set up all enabled signals in parallel.\n * Each signal setup catches its own errors — this method never rejects.\n */\n private async setupAllSignals(): Promise<void> {\n const resolved = this.resolveProvider();\n if (!resolved) {\n this.debugLog('Setup skipped: provider not resolved');\n return;\n }\n\n const protocol = resolved.protocol;\n const setupTasks: Promise<void>[] = [];\n\n if (this.config.signals?.traces !== false) {\n setupTasks.push(this.setupTraces(resolved, protocol));\n } else {\n this.debugLog('Trace export disabled via config');\n }\n\n if (this.config.signals?.logs !== false) {\n setupTasks.push(this.setupLogs(resolved, protocol));\n } else {\n this.debugLog('Log export disabled via config');\n }\n\n await Promise.all(setupTasks);\n\n this.debugLog(`Setup complete [traces=${!!this.processor}, logs=${!!this.otelLogger}]`);\n }\n\n // ---------------------------------------------------------------------------\n // Trace setup\n // ---------------------------------------------------------------------------\n\n private async setupTraces(resolved: ResolvedProviderConfig, protocol: ExportProtocol): Promise<void> {\n try {\n // Create or use the provided SpanExporter\n if (this.config.exporter) {\n this.exporter = this.config.exporter;\n } else {\n const headers = resolved.headers;\n // Zipkin doesn't follow OTLP signal-path conventions; pass its endpoint through unchanged.\n const endpoint = protocol === 'zipkin' ? resolved.endpoint : this.getSignalEndpoint(resolved, 'traces');\n\n this.debugLog(`Setting up trace exporter: protocol=${protocol}, endpoint=${endpoint}`);\n\n const ExporterClass = await loadExporter(protocol, this.providerName);\n if (!ExporterClass) {\n this.debugLog(`Trace exporter not available for protocol: ${protocol}`);\n return;\n }\n\n const exporterOptions =\n protocol === 'zipkin'\n ? { url: endpoint, headers }\n : await this.buildExporterOptions(protocol, endpoint, headers);\n this.exporter = new ExporterClass(exporterOptions);\n\n this.debugLog(`Trace exporter created: ${this.exporter?.constructor?.name ?? 'unknown'} -> ${endpoint}`);\n }\n\n // Create processor\n const serviceName = this.observabilityConfig?.serviceName || 'mastra-service';\n\n this.spanConverter = new SpanConverter({\n packageName: '@mastra/otel-exporter',\n serviceName,\n config: this.config,\n format: 'GenAI_v1_38_0',\n });\n\n const exporterForProcessor = this.isDebug\n ? new DebugSpanExporterWrapper(this.exporter!, msg => this.debugLog(msg))\n : this.exporter!;\n\n this.processor = new BatchSpanProcessor(exporterForProcessor, {\n maxExportBatchSize: this.config.batchSize || 512,\n maxQueueSize: 2048,\n scheduledDelayMillis: 5000,\n exportTimeoutMillis: this.config.timeout || 30000,\n });\n\n this.debugLog(\n `Trace export initialized (service.name: \"${serviceName}\", batch size: ${this.config.batchSize || 512}, delay: 5s)`,\n );\n } catch (error) {\n this.logger.warn('[OtelExporter] Failed to initialize trace export');\n this.debugLog('Trace setup error:', error);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Log setup\n // ---------------------------------------------------------------------------\n\n private async setupLogs(resolved: ResolvedProviderConfig, protocol: ExportProtocol): Promise<void> {\n try {\n const LogExporterClass = await loadSignalExporter('logs', protocol, this.providerName);\n if (!LogExporterClass) {\n this.debugLog(`Log exporter package not available for protocol \"${protocol}\". Log export disabled.`);\n return;\n }\n\n const logEndpoint = this.getSignalEndpoint(resolved, 'logs');\n const headers = resolved.headers;\n\n this.debugLog(`Setting up log exporter: protocol=${protocol}, endpoint=${logEndpoint}`);\n\n const logExporterOptions = await this.buildExporterOptions(protocol, logEndpoint, headers);\n const logExporter = new LogExporterClass(logExporterOptions);\n\n const exporterForProcessor = this.isDebug\n ? new DebugLogExporterWrapper(logExporter, msg => this.debugLog(msg))\n : logExporter;\n\n const resource = resourceFromAttributes({\n ...(this.config.resourceAttributes ?? {}),\n [ATTR_SERVICE_NAME]: this.observabilityConfig?.serviceName || 'mastra-service',\n });\n\n this.loggerProvider = new LoggerProvider({\n resource,\n processors: [\n new BatchLogRecordProcessor(exporterForProcessor, {\n maxExportBatchSize: this.config.batchSize || 512,\n maxQueueSize: 2048,\n scheduledDelayMillis: 5000,\n exportTimeoutMillis: this.config.timeout || 30000,\n }),\n ],\n });\n\n this.otelLogger = this.loggerProvider.getLogger('@mastra/otel-exporter');\n\n this.debugLog(`Log export initialized (endpoint: ${logEndpoint})`);\n } catch (error) {\n this.logger.warn('[OtelExporter] Failed to initialize log export');\n this.debugLog('Log setup error:', error);\n }\n }\n\n // ===========================================================================\n // Trace event handler\n // ===========================================================================\n\n protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n if (this.config.signals?.traces === false) return;\n if (event.type !== TracingEventType.SPAN_ENDED) return;\n\n await this.ensureSetup();\n\n if (this.isDisabled || !this.processor) return;\n\n const span = event.exportedSpan;\n\n try {\n const otelSpan = await this.spanConverter!.convertSpan(span);\n this.processor.onEnd(otelSpan);\n\n this.debugLog(\n `Queued 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 // ===========================================================================\n // Log event handler\n // ===========================================================================\n\n async onLogEvent(event: LogEvent): Promise<void> {\n this.debugLog(`onLogEvent received (level: ${event.log.level}, message: \"${event.log.message}\")`);\n\n await this.ensureSetup();\n\n if (this.isDisabled) {\n this.debugLog('Log event skipped: exporter is disabled');\n return;\n }\n\n if (!this.otelLogger) {\n this.debugLog('Log event skipped: log exporter not available');\n return;\n }\n\n try {\n const logParams = convertLog(event.log);\n\n // Mirror trace context into the OTEL log Context so backends (Grafana, Datadog,\n // Honeycomb, etc.) correlate logs with traces using the standard OTLP fields.\n // Also keep mastra.traceId / mastra.spanId attributes for backends that key\n // off attributes only.\n const attributes = { ...logParams.attributes };\n let logContext = apiContext.active();\n if (logParams.traceId && logParams.spanId) {\n attributes['mastra.traceId'] = logParams.traceId;\n attributes['mastra.spanId'] = logParams.spanId;\n logContext = trace.setSpanContext(logContext, {\n traceId: logParams.traceId,\n spanId: logParams.spanId,\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n });\n }\n\n this.otelLogger.emit({\n timestamp: logParams.timestamp,\n severityNumber: logParams.severityNumber,\n severityText: logParams.severityText,\n body: logParams.body,\n attributes,\n context: logContext,\n });\n\n this.debugLog(`Exported log (level: ${event.log.level}, trace: ${event.log.traceId || 'none'})`);\n } catch (error) {\n this.logger.error('[OtelExporter] Failed to export log:', error);\n }\n }\n\n // ===========================================================================\n // Lifecycle\n // ===========================================================================\n\n /**\n * Force flush any buffered data without shutting down the exporter.\n * Delegates to all active processors/providers.\n */\n async flush(): Promise<void> {\n // Wait for setup so we don't miss providers that are still being initialized.\n if (this.setupPromise) {\n await this.setupPromise;\n }\n\n const flushPromises: Promise<void>[] = [];\n const signals: string[] = [];\n\n if (this.processor) {\n flushPromises.push(this.processor.forceFlush());\n signals.push('traces');\n }\n if (this.loggerProvider) {\n flushPromises.push(this.loggerProvider.forceFlush());\n signals.push('logs');\n }\n\n if (flushPromises.length > 0) {\n this.debugLog(`Flushing signals: ${signals.join(', ')}...`);\n await Promise.all(flushPromises);\n this.debugLog('Flushed all pending data');\n } else {\n this.debugLog('Flush called but no active exporters');\n }\n }\n\n async shutdown(): Promise<void> {\n // Wait for setup so we don't shut down before providers finish initializing.\n if (this.setupPromise) {\n await this.setupPromise;\n }\n\n const shutdownPromises: Promise<void>[] = [];\n\n if (this.processor) {\n shutdownPromises.push(this.processor.shutdown());\n }\n if (this.loggerProvider) {\n shutdownPromises.push(this.loggerProvider.shutdown());\n }\n\n if (shutdownPromises.length > 0) {\n await Promise.all(shutdownPromises);\n }\n }\n}\n"]}
package/dist/index.js CHANGED
@@ -613,6 +613,7 @@ var SpanConverter = class {
613
613
  this.params = params;
614
614
  this.format = params.format;
615
615
  }
616
+ params;
616
617
  resource;
617
618
  scope;
618
619
  initPromise;
@@ -779,6 +780,8 @@ var DebugSpanExporterWrapper = class {
779
780
  this.inner = inner;
780
781
  this.debugLog = debugLog;
781
782
  }
783
+ inner;
784
+ debugLog;
782
785
  export(spans, resultCallback) {
783
786
  const count = spans.length;
784
787
  this.inner.export(spans, (result) => {
@@ -802,6 +805,8 @@ var DebugLogExporterWrapper = class {
802
805
  this.inner = inner;
803
806
  this.debugLog = debugLog;
804
807
  }
808
+ inner;
809
+ debugLog;
805
810
  export(logs, resultCallback) {
806
811
  const count = logs.length;
807
812
  this.inner.export(logs, (result) => {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/loadExporter.ts","../src/log-converter.ts","../src/provider-configs.ts","../src/gen-ai-messages.ts","../src/gen-ai-semantics.ts","../src/span-converter.ts","../src/tracing.ts"],"names":["dateToHrTime","SpanType","resourceFromAttributes","ATTR_SERVICE_NAME","apiContext","TraceFlags"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Dynamic loader for optional OTel signal exporters.\n *\n * Each combination of signal (traces/logs) and protocol (http/json,\n * http/protobuf, grpc, zipkin) maps to a different npm package. We dynamically\n * import only the one the user's provider config requires, and cache the\n * constructor so subsequent calls are free.\n */\n\nimport type { ExportProtocol } from './types.js';\n\nexport type SignalType = 'traces' | 'logs';\n\n// ---------------------------------------------------------------------------\n// Package / export-name matrix\n// ---------------------------------------------------------------------------\n\ninterface ExporterSpec {\n /** npm package to dynamic-import */\n pkg: string;\n /** Named export to pull from the package */\n exportName: string;\n /** Extra packages to mention in the install hint (e.g. @grpc/grpc-js) */\n extras?: string[];\n}\n\ntype ProtocolKey = 'http/json' | 'http/protobuf' | 'grpc' | 'zipkin';\n\nconst EXPORTER_SPECS: Record<SignalType, Partial<Record<ProtocolKey, ExporterSpec>>> = {\n traces: {\n 'http/json': { pkg: '@opentelemetry/exporter-trace-otlp-http', exportName: 'OTLPTraceExporter' },\n 'http/protobuf': { pkg: '@opentelemetry/exporter-trace-otlp-proto', exportName: 'OTLPTraceExporter' },\n grpc: {\n pkg: '@opentelemetry/exporter-trace-otlp-grpc',\n exportName: 'OTLPTraceExporter',\n extras: ['@grpc/grpc-js'],\n },\n zipkin: { pkg: '@opentelemetry/exporter-zipkin', exportName: 'ZipkinExporter' },\n },\n logs: {\n 'http/json': { pkg: '@opentelemetry/exporter-logs-otlp-http', exportName: 'OTLPLogExporter' },\n 'http/protobuf': { pkg: '@opentelemetry/exporter-logs-otlp-proto', exportName: 'OTLPLogExporter' },\n grpc: {\n pkg: '@opentelemetry/exporter-logs-otlp-grpc',\n exportName: 'OTLPLogExporter',\n extras: ['@grpc/grpc-js'],\n },\n // zipkin: not supported\n },\n};\n\n// ---------------------------------------------------------------------------\n// Cache + loader\n// ---------------------------------------------------------------------------\n\n/** Cache keyed by \"signal:protocol\" */\nconst cache = new Map<string, any>();\n\n/**\n * Load a trace exporter for the given protocol.\n * Backward-compatible with existing usage in tracing.ts.\n */\nexport async function loadExporter(protocol: ExportProtocol, provider?: string): Promise<any> {\n return loadSignalExporter('traces', protocol, provider);\n}\n\n/**\n * Load a signal-specific exporter class for the given protocol.\n * Returns the constructor, or null if the package isn't installed.\n */\nexport async function loadSignalExporter(\n signal: SignalType,\n protocol: ExportProtocol,\n provider?: string,\n): Promise<any> {\n const spec = EXPORTER_SPECS[signal]?.[protocol];\n\n if (!spec) {\n if (protocol === 'zipkin') {\n console.warn(\n `[OtelExporter] Zipkin does not support OTLP ${signal}. ${capitalize(signal)} export will be disabled.`,\n );\n }\n return null;\n }\n\n const cacheKey = `${signal}:${protocol}`;\n if (cache.has(cacheKey)) {\n return cache.get(cacheKey);\n }\n\n try {\n const mod = await import(spec.pkg);\n const ExporterClass = mod[spec.exportName];\n if (typeof ExporterClass !== 'function') {\n console.error(\n `[OtelExporter] ${capitalize(signal)} ${protocol} exporter package \"${spec.pkg}\" did not expose a \"${spec.exportName}\" export. ` +\n `${capitalize(signal)} export will be disabled.`,\n );\n return null;\n }\n cache.set(cacheKey, ExporterClass);\n return ExporterClass;\n } catch {\n const providerInfo = provider ? ` (required for ${provider})` : '';\n const allPkgs = [spec.pkg, ...(spec.extras ?? [])].join(' ');\n console.error(\n `[OtelExporter] ${capitalize(signal)} ${protocol} exporter is not installed${providerInfo}.\\n` +\n ` Install the required package(s):\\n` +\n ` npm install ${allPkgs}`,\n );\n return null;\n }\n}\n\nfunction capitalize(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n","/**\n * Convert Mastra ExportedLog to OpenTelemetry LogRecord format\n */\n\nimport type { ExportedLog, LogLevel } from '@mastra/core/observability';\nimport type { HrTime } from '@opentelemetry/api';\nimport type { LogAttributes } from '@opentelemetry/api-logs';\nimport { SeverityNumber } from '@opentelemetry/api-logs';\n\n/**\n * Map Mastra LogLevel to OTEL SeverityNumber\n */\nexport function mapSeverity(level: LogLevel): SeverityNumber {\n switch (level) {\n case 'debug':\n return SeverityNumber.DEBUG;\n case 'info':\n return SeverityNumber.INFO;\n case 'warn':\n return SeverityNumber.WARN;\n case 'error':\n return SeverityNumber.ERROR;\n case 'fatal':\n return SeverityNumber.FATAL;\n default:\n return SeverityNumber.UNSPECIFIED;\n }\n}\n\n/**\n * Convert a Date to OTEL HrTime [seconds, nanoseconds]\n */\nfunction dateToHrTime(date: Date): HrTime {\n const ms = date.getTime();\n const seconds = Math.floor(ms / 1000);\n const nanoseconds = (ms % 1000) * 1_000_000;\n return [seconds, nanoseconds];\n}\n\n/**\n * Stringify a value for use as an OTEL log attribute. Falls back to a\n * placeholder rather than throwing if the value contains a circular\n * reference, throws from a custom toJSON, or otherwise cannot be serialized.\n */\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value);\n } catch {\n return '[unserializable]';\n }\n}\n\n/**\n * Build OTEL log attributes from ExportedLog fields.\n * Includes trace correlation and metadata.\n */\nexport function buildLogAttributes(log: ExportedLog): LogAttributes {\n const attributes: LogAttributes = {};\n\n // Add structured data fields as attributes\n if (log.data) {\n for (const [key, value] of Object.entries(log.data)) {\n if (value === null || value === undefined) continue;\n attributes[`mastra.log.${key}`] =\n typeof value === 'object' ? safeStringify(value) : (value as string | number | boolean);\n }\n }\n\n // Add metadata as attributes\n if (log.metadata) {\n for (const [key, value] of Object.entries(log.metadata)) {\n if (value === null || value === undefined) continue;\n attributes[`mastra.metadata.${key}`] =\n typeof value === 'object' ? safeStringify(value) : (value as string | number | boolean);\n }\n }\n\n // Add tags if present\n if (log.tags?.length) {\n attributes['mastra.tags'] = safeStringify(log.tags);\n }\n\n return attributes;\n}\n\n/**\n * Parameters for emitting an OTEL log record from a Mastra ExportedLog.\n */\nexport interface OtelLogEmitParams {\n timestamp: HrTime;\n severityNumber: SeverityNumber;\n severityText: string;\n body: string;\n attributes: LogAttributes;\n traceId?: string;\n spanId?: string;\n}\n\n/**\n * Convert an ExportedLog into parameters suitable for OTEL Logger.emit()\n */\nexport function convertLog(log: ExportedLog): OtelLogEmitParams {\n return {\n timestamp: dateToHrTime(log.timestamp),\n severityNumber: mapSeverity(log.level),\n severityText: log.level.toUpperCase(),\n body: log.message,\n attributes: buildLogAttributes(log),\n traceId: log.traceId,\n spanId: log.spanId,\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, debug?: boolean): ResolvedProviderConfig | null {\n const providerName = Object.keys(config)[0];\n\n if (debug) {\n console.info(`[OtelExporter:debug] Resolving provider config for: ${providerName}`);\n }\n\n let resolved: ResolvedProviderConfig | null;\n\n if ('dash0' in config) {\n resolved = resolveDash0Config(config.dash0);\n } else if ('signoz' in config) {\n resolved = resolveSignozConfig(config.signoz);\n } else if ('newrelic' in config) {\n resolved = resolveNewRelicConfig(config.newrelic);\n } else if ('traceloop' in config) {\n resolved = resolveTraceloopConfig(config.traceloop);\n } else if ('laminar' in config) {\n resolved = resolveLaminarConfig(config.laminar);\n } else if ('custom' in config) {\n resolved = resolveCustomConfig(config.custom);\n } else {\n // TypeScript exhaustiveness check\n const _exhaustive: never = config;\n return _exhaustive;\n }\n\n if (debug && resolved) {\n // Header values frequently carry credentials (Bearer tokens, API keys, Basic auth).\n // Don't log any portion of the value — even prefix/suffix slices can leak.\n const maskedHeaders: Record<string, string> = {};\n for (const [key, value] of Object.entries(resolved.headers)) {\n maskedHeaders[key] = value ? '[REDACTED]' : '[EMPTY]';\n }\n console.info(`[OtelExporter:debug] Provider \"${providerName}\" resolved:`, {\n endpoint: resolved.endpoint,\n protocol: resolved.protocol,\n headers: maskedHeaders,\n });\n } else if (debug && !resolved) {\n console.info(`[OtelExporter:debug] Provider \"${providerName}\" resolution returned null (disabled)`);\n }\n\n return resolved;\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_USAGE_CACHE_READ_INPUT_TOKENS,\n ATTR_GEN_AI_USAGE_CACHE_CREATION_INPUT_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 [ATTR_GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS]?: number;\n [ATTR_GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS]?: number;\n 'gen_ai.usage.reasoning_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 input tokens (subset of input_tokens)\n if (usage.inputDetails?.cacheRead !== undefined) {\n metrics[ATTR_GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS] = usage.inputDetails.cacheRead;\n }\n\n // Cache creation input tokens (subset of input_tokens)\n if (usage.inputDetails?.cacheWrite !== undefined) {\n metrics[ATTR_GEN_AI_USAGE_CACHE_CREATION_INPUT_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 // Completion start time (TTFT) - used by observability backends for time-to-first-token metrics\n if (modelAttrs.completionStartTime) {\n attributes['mastra.completion_start_time'] = modelAttrs.completionStartTime.toISOString();\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 Exporter for Mastra\n *\n * Exports traces and logs to any OTLP-compatible endpoint.\n */\n\nimport type {\n TracingEvent,\n LogEvent,\n InitExporterOptions,\n ObservabilityInstanceConfig,\n} from '@mastra/core/observability';\nimport { TracingEventType } from '@mastra/core/observability';\nimport { BaseExporter } from '@mastra/observability';\nimport { context as apiContext, diag, DiagConsoleLogger, DiagLogLevel, trace, TraceFlags } from '@opentelemetry/api';\nimport type { Logger } from '@opentelemetry/api-logs';\n\nimport type { ExportResult } from '@opentelemetry/core';\nimport { ExportResultCode } from '@opentelemetry/core';\n\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport { LoggerProvider, BatchLogRecordProcessor } from '@opentelemetry/sdk-logs';\nimport type { SpanExporter, ReadableSpan } from '@opentelemetry/sdk-trace-base';\nimport { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport { ATTR_SERVICE_NAME } from '@opentelemetry/semantic-conventions';\n\nimport { loadExporter, loadSignalExporter } from './loadExporter.js';\nimport { convertLog } from './log-converter.js';\nimport { resolveProviderConfig } from './provider-configs.js';\nimport type { ResolvedProviderConfig } from './provider-configs.js';\nimport { SpanConverter } from './span-converter.js';\nimport type { ExportProtocol, OtelExporterConfig } from './types.js';\n\n/**\n * Wrapper around a SpanExporter that logs export results when debug mode is enabled.\n * The OTel SDK intentionally does not log on success, making debugging difficult.\n * This wrapper adds visibility into each batch export's outcome.\n */\nclass DebugSpanExporterWrapper implements SpanExporter {\n constructor(\n private inner: SpanExporter,\n private debugLog: (msg: string) => void,\n ) {}\n\n export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void {\n const count = spans.length;\n this.inner.export(spans, (result: ExportResult) => {\n if (result.code === ExportResultCode.SUCCESS) {\n this.debugLog(`[OtelExporter] Export completed: ${count} spans sent successfully`);\n } else {\n this.debugLog(`[OtelExporter] Export FAILED: ${count} spans, error: ${result.error?.message ?? 'unknown'}`);\n }\n resultCallback(result);\n });\n }\n\n async shutdown(): Promise<void> {\n return this.inner.shutdown();\n }\n\n async forceFlush(): Promise<void> {\n return this.inner.forceFlush?.();\n }\n}\n\n/**\n * Wrapper around a LogRecordExporter that logs export results when debug mode is enabled.\n * Same pattern as DebugSpanExporterWrapper but for log records.\n */\nclass DebugLogExporterWrapper {\n constructor(\n private inner: any,\n private debugLog: (msg: string) => void,\n ) {}\n\n export(logs: any[], resultCallback: (result: ExportResult) => void): void {\n const count = logs.length;\n this.inner.export(logs, (result: ExportResult) => {\n if (result.code === ExportResultCode.SUCCESS) {\n this.debugLog(`[OtelExporter] Log export completed: ${count} logs sent successfully`);\n } else {\n this.debugLog(`[OtelExporter] Log export FAILED: ${count} logs, error: ${result.error?.message ?? 'unknown'}`);\n }\n resultCallback(result);\n });\n }\n\n async shutdown(): Promise<void> {\n return this.inner.shutdown();\n }\n\n async forceFlush(): Promise<void> {\n return this.inner.forceFlush?.();\n }\n}\n\nexport class OtelExporter extends BaseExporter {\n private config: OtelExporterConfig;\n private observabilityConfig?: ObservabilityInstanceConfig;\n\n // Trace signal\n private spanConverter?: SpanConverter;\n private processor?: BatchSpanProcessor;\n private exporter?: SpanExporter;\n\n // Log signal\n private loggerProvider?: LoggerProvider;\n private otelLogger?: Logger;\n\n // Provider config (resolved once, shared across signals)\n private resolvedConfig?: ResolvedProviderConfig | null;\n private providerName?: string;\n\n // Single setup promise — all signals initialize together at init() time.\n // Event handlers await this before processing. Never rejects.\n private setupPromise?: Promise<void>;\n\n name = 'opentelemetry';\n\n constructor(config: OtelExporterConfig) {\n super(config);\n\n this.config = config;\n\n // Set OTel SDK diagnostics to INFO level so we see warnings/errors from\n // the SDK internals. We intentionally do NOT use DEBUG here because:\n // 1. OTLPExportDelegate dumps enormous payloads at DEBUG level\n // 2. diag.setLogger() is global and can be overwritten by other code\n // Our DebugSpanExporterWrapper provides export-result logging instead.\n if (config.logLevel === 'debug') {\n diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.INFO);\n }\n }\n\n /**\n * Initialize with observability configuration and eagerly set up the trace\n * and log signal exporters in parallel.\n *\n * Called by Mastra during component registration. The async setup runs in the\n * background — event handlers await the resulting promise before processing.\n */\n init(options: InitExporterOptions) {\n this.observabilityConfig = options.config;\n this.setupPromise = this.setupAllSignals();\n }\n\n // ===========================================================================\n // Provider config resolution (shared across all signals)\n // ===========================================================================\n\n private get isDebug(): boolean {\n return this.config.logLevel === 'debug';\n }\n\n /**\n * Debug logging that bypasses the Mastra logger.\n *\n * The Mastra framework replaces our logger via __setLogger() with one at\n * INFO level, which silently swallows all this.logger.debug() calls.\n * For debug output we need to go through console.info directly.\n */\n\n private debugLog = (...args: unknown[]) => this.isDebug && console.info('[OtelExporter:debug]', ...args);\n\n private resolveProvider(): ResolvedProviderConfig | null {\n if (this.resolvedConfig !== undefined) {\n return this.resolvedConfig;\n }\n\n if (!this.config.provider) {\n this.setDisabled(\n '[OtelExporter] Provider configuration is required. Use the \"custom\" provider for generic endpoints.',\n );\n this.resolvedConfig = null;\n return null;\n }\n\n this.providerName = Object.keys(this.config.provider)[0];\n const resolved = resolveProviderConfig(this.config.provider, this.isDebug);\n if (!resolved) {\n this.setDisabled('[OtelExporter] Provider configuration validation failed.');\n this.resolvedConfig = null;\n return null;\n }\n\n this.resolvedConfig = resolved;\n return resolved;\n }\n\n /**\n * Derive the endpoint for a specific signal from the resolved provider config.\n * Strips trailing slashes and any existing signal-path suffix so we never\n * produce a doubled \"//v1/logs\" or leave a stale \"/v1/traces\" on a logs URL.\n */\n private getSignalEndpoint(resolved: ResolvedProviderConfig, signal: 'traces' | 'logs'): string {\n const signalPaths: Record<string, string> = {\n traces: '/v1/traces',\n logs: '/v1/logs',\n };\n\n // Drop trailing slashes first so the suffix check below also matches\n // endpoints written like \".../v1/traces/\". Bounded loop instead of\n // /\\/+$/ to avoid the polynomial-regex pattern CodeQL flags.\n let base = resolved.endpoint;\n while (base.endsWith('/')) {\n base = base.slice(0, -1);\n }\n\n // Strip any existing signal-path suffix (with or without leading slash variations)\n for (const path of Object.values(signalPaths)) {\n if (base.endsWith(path)) {\n base = base.slice(0, -path.length);\n break;\n }\n }\n\n return base + signalPaths[signal];\n }\n\n /**\n * Build exporter constructor options for the given signal endpoint.\n * For gRPC, converts headers to Metadata. For HTTP protocols, passes headers directly.\n */\n private async buildExporterOptions(\n protocol: ExportProtocol,\n url: string,\n headers: Record<string, string>,\n ): Promise<Record<string, unknown>> {\n if (protocol === 'grpc') {\n const grpcModule = await import('@grpc/grpc-js');\n const metadata = new grpcModule.Metadata();\n for (const [key, value] of Object.entries(headers)) {\n metadata.set(key, value);\n }\n return { url, metadata, timeoutMillis: this.config.timeout };\n }\n return { url, headers, timeoutMillis: this.config.timeout };\n }\n\n // ===========================================================================\n // Setup — eager, parallel initialization of all signals\n // ===========================================================================\n\n /**\n * Wait for setup to complete. If init() was called, this awaits the\n * already-in-flight setup promise. If init() was never called (standalone\n * usage without Mastra), this triggers setup on first use.\n */\n private ensureSetup(): Promise<void> {\n if (!this.setupPromise) {\n this.setupPromise = this.setupAllSignals();\n }\n return this.setupPromise;\n }\n\n /**\n * Resolve provider config once and set up all enabled signals in parallel.\n * Each signal setup catches its own errors — this method never rejects.\n */\n private async setupAllSignals(): Promise<void> {\n const resolved = this.resolveProvider();\n if (!resolved) {\n this.debugLog('Setup skipped: provider not resolved');\n return;\n }\n\n const protocol = resolved.protocol;\n const setupTasks: Promise<void>[] = [];\n\n if (this.config.signals?.traces !== false) {\n setupTasks.push(this.setupTraces(resolved, protocol));\n } else {\n this.debugLog('Trace export disabled via config');\n }\n\n if (this.config.signals?.logs !== false) {\n setupTasks.push(this.setupLogs(resolved, protocol));\n } else {\n this.debugLog('Log export disabled via config');\n }\n\n await Promise.all(setupTasks);\n\n this.debugLog(`Setup complete [traces=${!!this.processor}, logs=${!!this.otelLogger}]`);\n }\n\n // ---------------------------------------------------------------------------\n // Trace setup\n // ---------------------------------------------------------------------------\n\n private async setupTraces(resolved: ResolvedProviderConfig, protocol: ExportProtocol): Promise<void> {\n try {\n // Create or use the provided SpanExporter\n if (this.config.exporter) {\n this.exporter = this.config.exporter;\n } else {\n const headers = resolved.headers;\n // Zipkin doesn't follow OTLP signal-path conventions; pass its endpoint through unchanged.\n const endpoint = protocol === 'zipkin' ? resolved.endpoint : this.getSignalEndpoint(resolved, 'traces');\n\n this.debugLog(`Setting up trace exporter: protocol=${protocol}, endpoint=${endpoint}`);\n\n const ExporterClass = await loadExporter(protocol, this.providerName);\n if (!ExporterClass) {\n this.debugLog(`Trace exporter not available for protocol: ${protocol}`);\n return;\n }\n\n const exporterOptions =\n protocol === 'zipkin'\n ? { url: endpoint, headers }\n : await this.buildExporterOptions(protocol, endpoint, headers);\n this.exporter = new ExporterClass(exporterOptions);\n\n this.debugLog(`Trace exporter created: ${this.exporter?.constructor?.name ?? 'unknown'} -> ${endpoint}`);\n }\n\n // Create processor\n const serviceName = this.observabilityConfig?.serviceName || 'mastra-service';\n\n this.spanConverter = new SpanConverter({\n packageName: '@mastra/otel-exporter',\n serviceName,\n config: this.config,\n format: 'GenAI_v1_38_0',\n });\n\n const exporterForProcessor = this.isDebug\n ? new DebugSpanExporterWrapper(this.exporter!, msg => this.debugLog(msg))\n : this.exporter!;\n\n this.processor = new BatchSpanProcessor(exporterForProcessor, {\n maxExportBatchSize: this.config.batchSize || 512,\n maxQueueSize: 2048,\n scheduledDelayMillis: 5000,\n exportTimeoutMillis: this.config.timeout || 30000,\n });\n\n this.debugLog(\n `Trace export initialized (service.name: \"${serviceName}\", batch size: ${this.config.batchSize || 512}, delay: 5s)`,\n );\n } catch (error) {\n this.logger.warn('[OtelExporter] Failed to initialize trace export');\n this.debugLog('Trace setup error:', error);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Log setup\n // ---------------------------------------------------------------------------\n\n private async setupLogs(resolved: ResolvedProviderConfig, protocol: ExportProtocol): Promise<void> {\n try {\n const LogExporterClass = await loadSignalExporter('logs', protocol, this.providerName);\n if (!LogExporterClass) {\n this.debugLog(`Log exporter package not available for protocol \"${protocol}\". Log export disabled.`);\n return;\n }\n\n const logEndpoint = this.getSignalEndpoint(resolved, 'logs');\n const headers = resolved.headers;\n\n this.debugLog(`Setting up log exporter: protocol=${protocol}, endpoint=${logEndpoint}`);\n\n const logExporterOptions = await this.buildExporterOptions(protocol, logEndpoint, headers);\n const logExporter = new LogExporterClass(logExporterOptions);\n\n const exporterForProcessor = this.isDebug\n ? new DebugLogExporterWrapper(logExporter, msg => this.debugLog(msg))\n : logExporter;\n\n const resource = resourceFromAttributes({\n ...(this.config.resourceAttributes ?? {}),\n [ATTR_SERVICE_NAME]: this.observabilityConfig?.serviceName || 'mastra-service',\n });\n\n this.loggerProvider = new LoggerProvider({\n resource,\n processors: [\n new BatchLogRecordProcessor(exporterForProcessor, {\n maxExportBatchSize: this.config.batchSize || 512,\n maxQueueSize: 2048,\n scheduledDelayMillis: 5000,\n exportTimeoutMillis: this.config.timeout || 30000,\n }),\n ],\n });\n\n this.otelLogger = this.loggerProvider.getLogger('@mastra/otel-exporter');\n\n this.debugLog(`Log export initialized (endpoint: ${logEndpoint})`);\n } catch (error) {\n this.logger.warn('[OtelExporter] Failed to initialize log export');\n this.debugLog('Log setup error:', error);\n }\n }\n\n // ===========================================================================\n // Trace event handler\n // ===========================================================================\n\n protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n if (this.config.signals?.traces === false) return;\n if (event.type !== TracingEventType.SPAN_ENDED) return;\n\n await this.ensureSetup();\n\n if (this.isDisabled || !this.processor) return;\n\n const span = event.exportedSpan;\n\n try {\n const otelSpan = await this.spanConverter!.convertSpan(span);\n this.processor.onEnd(otelSpan);\n\n this.debugLog(\n `Queued 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 // ===========================================================================\n // Log event handler\n // ===========================================================================\n\n async onLogEvent(event: LogEvent): Promise<void> {\n this.debugLog(`onLogEvent received (level: ${event.log.level}, message: \"${event.log.message}\")`);\n\n await this.ensureSetup();\n\n if (this.isDisabled) {\n this.debugLog('Log event skipped: exporter is disabled');\n return;\n }\n\n if (!this.otelLogger) {\n this.debugLog('Log event skipped: log exporter not available');\n return;\n }\n\n try {\n const logParams = convertLog(event.log);\n\n // Mirror trace context into the OTEL log Context so backends (Grafana, Datadog,\n // Honeycomb, etc.) correlate logs with traces using the standard OTLP fields.\n // Also keep mastra.traceId / mastra.spanId attributes for backends that key\n // off attributes only.\n const attributes = { ...logParams.attributes };\n let logContext = apiContext.active();\n if (logParams.traceId && logParams.spanId) {\n attributes['mastra.traceId'] = logParams.traceId;\n attributes['mastra.spanId'] = logParams.spanId;\n logContext = trace.setSpanContext(logContext, {\n traceId: logParams.traceId,\n spanId: logParams.spanId,\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n });\n }\n\n this.otelLogger.emit({\n timestamp: logParams.timestamp,\n severityNumber: logParams.severityNumber,\n severityText: logParams.severityText,\n body: logParams.body,\n attributes,\n context: logContext,\n });\n\n this.debugLog(`Exported log (level: ${event.log.level}, trace: ${event.log.traceId || 'none'})`);\n } catch (error) {\n this.logger.error('[OtelExporter] Failed to export log:', error);\n }\n }\n\n // ===========================================================================\n // Lifecycle\n // ===========================================================================\n\n /**\n * Force flush any buffered data without shutting down the exporter.\n * Delegates to all active processors/providers.\n */\n async flush(): Promise<void> {\n // Wait for setup so we don't miss providers that are still being initialized.\n if (this.setupPromise) {\n await this.setupPromise;\n }\n\n const flushPromises: Promise<void>[] = [];\n const signals: string[] = [];\n\n if (this.processor) {\n flushPromises.push(this.processor.forceFlush());\n signals.push('traces');\n }\n if (this.loggerProvider) {\n flushPromises.push(this.loggerProvider.forceFlush());\n signals.push('logs');\n }\n\n if (flushPromises.length > 0) {\n this.debugLog(`Flushing signals: ${signals.join(', ')}...`);\n await Promise.all(flushPromises);\n this.debugLog('Flushed all pending data');\n } else {\n this.debugLog('Flush called but no active exporters');\n }\n }\n\n async shutdown(): Promise<void> {\n // Wait for setup so we don't shut down before providers finish initializing.\n if (this.setupPromise) {\n await this.setupPromise;\n }\n\n const shutdownPromises: Promise<void>[] = [];\n\n if (this.processor) {\n shutdownPromises.push(this.processor.shutdown());\n }\n if (this.loggerProvider) {\n shutdownPromises.push(this.loggerProvider.shutdown());\n }\n\n if (shutdownPromises.length > 0) {\n await Promise.all(shutdownPromises);\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/loadExporter.ts","../src/log-converter.ts","../src/provider-configs.ts","../src/gen-ai-messages.ts","../src/gen-ai-semantics.ts","../src/span-converter.ts","../src/tracing.ts"],"names":["dateToHrTime","SpanType","resourceFromAttributes","ATTR_SERVICE_NAME","apiContext","TraceFlags"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Dynamic loader for optional OTel signal exporters.\n *\n * Each combination of signal (traces/logs) and protocol (http/json,\n * http/protobuf, grpc, zipkin) maps to a different npm package. We dynamically\n * import only the one the user's provider config requires, and cache the\n * constructor so subsequent calls are free.\n */\n\nimport type { ExportProtocol } from './types.js';\n\nexport type SignalType = 'traces' | 'logs';\n\n// ---------------------------------------------------------------------------\n// Package / export-name matrix\n// ---------------------------------------------------------------------------\n\ninterface ExporterSpec {\n /** npm package to dynamic-import */\n pkg: string;\n /** Named export to pull from the package */\n exportName: string;\n /** Extra packages to mention in the install hint (e.g. @grpc/grpc-js) */\n extras?: string[];\n}\n\ntype ProtocolKey = 'http/json' | 'http/protobuf' | 'grpc' | 'zipkin';\n\nconst EXPORTER_SPECS: Record<SignalType, Partial<Record<ProtocolKey, ExporterSpec>>> = {\n traces: {\n 'http/json': { pkg: '@opentelemetry/exporter-trace-otlp-http', exportName: 'OTLPTraceExporter' },\n 'http/protobuf': { pkg: '@opentelemetry/exporter-trace-otlp-proto', exportName: 'OTLPTraceExporter' },\n grpc: {\n pkg: '@opentelemetry/exporter-trace-otlp-grpc',\n exportName: 'OTLPTraceExporter',\n extras: ['@grpc/grpc-js'],\n },\n zipkin: { pkg: '@opentelemetry/exporter-zipkin', exportName: 'ZipkinExporter' },\n },\n logs: {\n 'http/json': { pkg: '@opentelemetry/exporter-logs-otlp-http', exportName: 'OTLPLogExporter' },\n 'http/protobuf': { pkg: '@opentelemetry/exporter-logs-otlp-proto', exportName: 'OTLPLogExporter' },\n grpc: {\n pkg: '@opentelemetry/exporter-logs-otlp-grpc',\n exportName: 'OTLPLogExporter',\n extras: ['@grpc/grpc-js'],\n },\n // zipkin: not supported\n },\n};\n\n// ---------------------------------------------------------------------------\n// Cache + loader\n// ---------------------------------------------------------------------------\n\n/** Cache keyed by \"signal:protocol\" */\nconst cache = new Map<string, any>();\n\n/**\n * Load a trace exporter for the given protocol.\n * Backward-compatible with existing usage in tracing.ts.\n */\nexport async function loadExporter(protocol: ExportProtocol, provider?: string): Promise<any> {\n return loadSignalExporter('traces', protocol, provider);\n}\n\n/**\n * Load a signal-specific exporter class for the given protocol.\n * Returns the constructor, or null if the package isn't installed.\n */\nexport async function loadSignalExporter(\n signal: SignalType,\n protocol: ExportProtocol,\n provider?: string,\n): Promise<any> {\n const spec = EXPORTER_SPECS[signal]?.[protocol];\n\n if (!spec) {\n if (protocol === 'zipkin') {\n console.warn(\n `[OtelExporter] Zipkin does not support OTLP ${signal}. ${capitalize(signal)} export will be disabled.`,\n );\n }\n return null;\n }\n\n const cacheKey = `${signal}:${protocol}`;\n if (cache.has(cacheKey)) {\n return cache.get(cacheKey);\n }\n\n try {\n const mod = await import(spec.pkg);\n const ExporterClass = mod[spec.exportName];\n if (typeof ExporterClass !== 'function') {\n console.error(\n `[OtelExporter] ${capitalize(signal)} ${protocol} exporter package \"${spec.pkg}\" did not expose a \"${spec.exportName}\" export. ` +\n `${capitalize(signal)} export will be disabled.`,\n );\n return null;\n }\n cache.set(cacheKey, ExporterClass);\n return ExporterClass;\n } catch {\n const providerInfo = provider ? ` (required for ${provider})` : '';\n const allPkgs = [spec.pkg, ...(spec.extras ?? [])].join(' ');\n console.error(\n `[OtelExporter] ${capitalize(signal)} ${protocol} exporter is not installed${providerInfo}.\\n` +\n ` Install the required package(s):\\n` +\n ` npm install ${allPkgs}`,\n );\n return null;\n }\n}\n\nfunction capitalize(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n","/**\n * Convert Mastra ExportedLog to OpenTelemetry LogRecord format\n */\n\nimport type { ExportedLog, LogLevel } from '@mastra/core/observability';\nimport type { HrTime } from '@opentelemetry/api';\nimport type { LogAttributes } from '@opentelemetry/api-logs';\nimport { SeverityNumber } from '@opentelemetry/api-logs';\n\n/**\n * Map Mastra LogLevel to OTEL SeverityNumber\n */\nexport function mapSeverity(level: LogLevel): SeverityNumber {\n switch (level) {\n case 'debug':\n return SeverityNumber.DEBUG;\n case 'info':\n return SeverityNumber.INFO;\n case 'warn':\n return SeverityNumber.WARN;\n case 'error':\n return SeverityNumber.ERROR;\n case 'fatal':\n return SeverityNumber.FATAL;\n default:\n return SeverityNumber.UNSPECIFIED;\n }\n}\n\n/**\n * Convert a Date to OTEL HrTime [seconds, nanoseconds]\n */\nfunction dateToHrTime(date: Date): HrTime {\n const ms = date.getTime();\n const seconds = Math.floor(ms / 1000);\n const nanoseconds = (ms % 1000) * 1_000_000;\n return [seconds, nanoseconds];\n}\n\n/**\n * Stringify a value for use as an OTEL log attribute. Falls back to a\n * placeholder rather than throwing if the value contains a circular\n * reference, throws from a custom toJSON, or otherwise cannot be serialized.\n */\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value);\n } catch {\n return '[unserializable]';\n }\n}\n\n/**\n * Build OTEL log attributes from ExportedLog fields.\n * Includes trace correlation and metadata.\n */\nexport function buildLogAttributes(log: ExportedLog): LogAttributes {\n const attributes: LogAttributes = {};\n\n // Add structured data fields as attributes\n if (log.data) {\n for (const [key, value] of Object.entries(log.data)) {\n if (value === null || value === undefined) continue;\n attributes[`mastra.log.${key}`] =\n typeof value === 'object' ? safeStringify(value) : (value as string | number | boolean);\n }\n }\n\n // Add metadata as attributes\n if (log.metadata) {\n for (const [key, value] of Object.entries(log.metadata)) {\n if (value === null || value === undefined) continue;\n attributes[`mastra.metadata.${key}`] =\n typeof value === 'object' ? safeStringify(value) : (value as string | number | boolean);\n }\n }\n\n // Add tags if present\n if (log.tags?.length) {\n attributes['mastra.tags'] = safeStringify(log.tags);\n }\n\n return attributes;\n}\n\n/**\n * Parameters for emitting an OTEL log record from a Mastra ExportedLog.\n */\nexport interface OtelLogEmitParams {\n timestamp: HrTime;\n severityNumber: SeverityNumber;\n severityText: string;\n body: string;\n attributes: LogAttributes;\n traceId?: string;\n spanId?: string;\n}\n\n/**\n * Convert an ExportedLog into parameters suitable for OTEL Logger.emit()\n */\nexport function convertLog(log: ExportedLog): OtelLogEmitParams {\n return {\n timestamp: dateToHrTime(log.timestamp),\n severityNumber: mapSeverity(log.level),\n severityText: log.level.toUpperCase(),\n body: log.message,\n attributes: buildLogAttributes(log),\n traceId: log.traceId,\n spanId: log.spanId,\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, debug?: boolean): ResolvedProviderConfig | null {\n const providerName = Object.keys(config)[0];\n\n if (debug) {\n console.info(`[OtelExporter:debug] Resolving provider config for: ${providerName}`);\n }\n\n let resolved: ResolvedProviderConfig | null;\n\n if ('dash0' in config) {\n resolved = resolveDash0Config(config.dash0);\n } else if ('signoz' in config) {\n resolved = resolveSignozConfig(config.signoz);\n } else if ('newrelic' in config) {\n resolved = resolveNewRelicConfig(config.newrelic);\n } else if ('traceloop' in config) {\n resolved = resolveTraceloopConfig(config.traceloop);\n } else if ('laminar' in config) {\n resolved = resolveLaminarConfig(config.laminar);\n } else if ('custom' in config) {\n resolved = resolveCustomConfig(config.custom);\n } else {\n // TypeScript exhaustiveness check\n const _exhaustive: never = config;\n return _exhaustive;\n }\n\n if (debug && resolved) {\n // Header values frequently carry credentials (Bearer tokens, API keys, Basic auth).\n // Don't log any portion of the value — even prefix/suffix slices can leak.\n const maskedHeaders: Record<string, string> = {};\n for (const [key, value] of Object.entries(resolved.headers)) {\n maskedHeaders[key] = value ? '[REDACTED]' : '[EMPTY]';\n }\n console.info(`[OtelExporter:debug] Provider \"${providerName}\" resolved:`, {\n endpoint: resolved.endpoint,\n protocol: resolved.protocol,\n headers: maskedHeaders,\n });\n } else if (debug && !resolved) {\n console.info(`[OtelExporter:debug] Provider \"${providerName}\" resolution returned null (disabled)`);\n }\n\n return resolved;\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_USAGE_CACHE_READ_INPUT_TOKENS,\n ATTR_GEN_AI_USAGE_CACHE_CREATION_INPUT_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 [ATTR_GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS]?: number;\n [ATTR_GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS]?: number;\n 'gen_ai.usage.reasoning_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 input tokens (subset of input_tokens)\n if (usage.inputDetails?.cacheRead !== undefined) {\n metrics[ATTR_GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS] = usage.inputDetails.cacheRead;\n }\n\n // Cache creation input tokens (subset of input_tokens)\n if (usage.inputDetails?.cacheWrite !== undefined) {\n metrics[ATTR_GEN_AI_USAGE_CACHE_CREATION_INPUT_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 // Completion start time (TTFT) - used by observability backends for time-to-first-token metrics\n if (modelAttrs.completionStartTime) {\n attributes['mastra.completion_start_time'] = modelAttrs.completionStartTime.toISOString();\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 Exporter for Mastra\n *\n * Exports traces and logs to any OTLP-compatible endpoint.\n */\n\nimport type {\n TracingEvent,\n LogEvent,\n InitExporterOptions,\n ObservabilityInstanceConfig,\n} from '@mastra/core/observability';\nimport { TracingEventType } from '@mastra/core/observability';\nimport { BaseExporter } from '@mastra/observability';\nimport { context as apiContext, diag, DiagConsoleLogger, DiagLogLevel, trace, TraceFlags } from '@opentelemetry/api';\nimport type { Logger } from '@opentelemetry/api-logs';\n\nimport type { ExportResult } from '@opentelemetry/core';\nimport { ExportResultCode } from '@opentelemetry/core';\n\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport { LoggerProvider, BatchLogRecordProcessor } from '@opentelemetry/sdk-logs';\nimport type { SpanExporter, ReadableSpan } from '@opentelemetry/sdk-trace-base';\nimport { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport { ATTR_SERVICE_NAME } from '@opentelemetry/semantic-conventions';\n\nimport { loadExporter, loadSignalExporter } from './loadExporter.js';\nimport { convertLog } from './log-converter.js';\nimport { resolveProviderConfig } from './provider-configs.js';\nimport type { ResolvedProviderConfig } from './provider-configs.js';\nimport { SpanConverter } from './span-converter.js';\nimport type { ExportProtocol, OtelExporterConfig } from './types.js';\n\n/**\n * Wrapper around a SpanExporter that logs export results when debug mode is enabled.\n * The OTel SDK intentionally does not log on success, making debugging difficult.\n * This wrapper adds visibility into each batch export's outcome.\n */\nclass DebugSpanExporterWrapper implements SpanExporter {\n constructor(\n private inner: SpanExporter,\n private debugLog: (msg: string) => void,\n ) {}\n\n export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void {\n const count = spans.length;\n this.inner.export(spans, (result: ExportResult) => {\n if (result.code === ExportResultCode.SUCCESS) {\n this.debugLog(`[OtelExporter] Export completed: ${count} spans sent successfully`);\n } else {\n this.debugLog(`[OtelExporter] Export FAILED: ${count} spans, error: ${result.error?.message ?? 'unknown'}`);\n }\n resultCallback(result);\n });\n }\n\n async shutdown(): Promise<void> {\n return this.inner.shutdown();\n }\n\n async forceFlush(): Promise<void> {\n return this.inner.forceFlush?.();\n }\n}\n\n/**\n * Wrapper around a LogRecordExporter that logs export results when debug mode is enabled.\n * Same pattern as DebugSpanExporterWrapper but for log records.\n */\nclass DebugLogExporterWrapper {\n constructor(\n private inner: any,\n private debugLog: (msg: string) => void,\n ) {}\n\n export(logs: any[], resultCallback: (result: ExportResult) => void): void {\n const count = logs.length;\n this.inner.export(logs, (result: ExportResult) => {\n if (result.code === ExportResultCode.SUCCESS) {\n this.debugLog(`[OtelExporter] Log export completed: ${count} logs sent successfully`);\n } else {\n this.debugLog(`[OtelExporter] Log export FAILED: ${count} logs, error: ${result.error?.message ?? 'unknown'}`);\n }\n resultCallback(result);\n });\n }\n\n async shutdown(): Promise<void> {\n return this.inner.shutdown();\n }\n\n async forceFlush(): Promise<void> {\n return this.inner.forceFlush?.();\n }\n}\n\nexport class OtelExporter extends BaseExporter {\n private config: OtelExporterConfig;\n private observabilityConfig?: ObservabilityInstanceConfig;\n\n // Trace signal\n private spanConverter?: SpanConverter;\n private processor?: BatchSpanProcessor;\n private exporter?: SpanExporter;\n\n // Log signal\n private loggerProvider?: LoggerProvider;\n private otelLogger?: Logger;\n\n // Provider config (resolved once, shared across signals)\n private resolvedConfig?: ResolvedProviderConfig | null;\n private providerName?: string;\n\n // Single setup promise — all signals initialize together at init() time.\n // Event handlers await this before processing. Never rejects.\n private setupPromise?: Promise<void>;\n\n name = 'opentelemetry';\n\n constructor(config: OtelExporterConfig) {\n super(config);\n\n this.config = config;\n\n // Set OTel SDK diagnostics to INFO level so we see warnings/errors from\n // the SDK internals. We intentionally do NOT use DEBUG here because:\n // 1. OTLPExportDelegate dumps enormous payloads at DEBUG level\n // 2. diag.setLogger() is global and can be overwritten by other code\n // Our DebugSpanExporterWrapper provides export-result logging instead.\n if (config.logLevel === 'debug') {\n diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.INFO);\n }\n }\n\n /**\n * Initialize with observability configuration and eagerly set up the trace\n * and log signal exporters in parallel.\n *\n * Called by Mastra during component registration. The async setup runs in the\n * background — event handlers await the resulting promise before processing.\n */\n init(options: InitExporterOptions) {\n this.observabilityConfig = options.config;\n this.setupPromise = this.setupAllSignals();\n }\n\n // ===========================================================================\n // Provider config resolution (shared across all signals)\n // ===========================================================================\n\n private get isDebug(): boolean {\n return this.config.logLevel === 'debug';\n }\n\n /**\n * Debug logging that bypasses the Mastra logger.\n *\n * The Mastra framework replaces our logger via __setLogger() with one at\n * INFO level, which silently swallows all this.logger.debug() calls.\n * For debug output we need to go through console.info directly.\n */\n\n private debugLog = (...args: unknown[]) => this.isDebug && console.info('[OtelExporter:debug]', ...args);\n\n private resolveProvider(): ResolvedProviderConfig | null {\n if (this.resolvedConfig !== undefined) {\n return this.resolvedConfig;\n }\n\n if (!this.config.provider) {\n this.setDisabled(\n '[OtelExporter] Provider configuration is required. Use the \"custom\" provider for generic endpoints.',\n );\n this.resolvedConfig = null;\n return null;\n }\n\n this.providerName = Object.keys(this.config.provider)[0];\n const resolved = resolveProviderConfig(this.config.provider, this.isDebug);\n if (!resolved) {\n this.setDisabled('[OtelExporter] Provider configuration validation failed.');\n this.resolvedConfig = null;\n return null;\n }\n\n this.resolvedConfig = resolved;\n return resolved;\n }\n\n /**\n * Derive the endpoint for a specific signal from the resolved provider config.\n * Strips trailing slashes and any existing signal-path suffix so we never\n * produce a doubled \"//v1/logs\" or leave a stale \"/v1/traces\" on a logs URL.\n */\n private getSignalEndpoint(resolved: ResolvedProviderConfig, signal: 'traces' | 'logs'): string {\n const signalPaths: Record<string, string> = {\n traces: '/v1/traces',\n logs: '/v1/logs',\n };\n\n // Drop trailing slashes first so the suffix check below also matches\n // endpoints written like \".../v1/traces/\". Bounded loop instead of\n // /\\/+$/ to avoid the polynomial-regex pattern CodeQL flags.\n let base = resolved.endpoint;\n while (base.endsWith('/')) {\n base = base.slice(0, -1);\n }\n\n // Strip any existing signal-path suffix (with or without leading slash variations)\n for (const path of Object.values(signalPaths)) {\n if (base.endsWith(path)) {\n base = base.slice(0, -path.length);\n break;\n }\n }\n\n return base + signalPaths[signal];\n }\n\n /**\n * Build exporter constructor options for the given signal endpoint.\n * For gRPC, converts headers to Metadata. For HTTP protocols, passes headers directly.\n */\n private async buildExporterOptions(\n protocol: ExportProtocol,\n url: string,\n headers: Record<string, string>,\n ): Promise<Record<string, unknown>> {\n if (protocol === 'grpc') {\n const grpcModule = await import('@grpc/grpc-js');\n const metadata = new grpcModule.Metadata();\n for (const [key, value] of Object.entries(headers)) {\n metadata.set(key, value);\n }\n return { url, metadata, timeoutMillis: this.config.timeout };\n }\n return { url, headers, timeoutMillis: this.config.timeout };\n }\n\n // ===========================================================================\n // Setup — eager, parallel initialization of all signals\n // ===========================================================================\n\n /**\n * Wait for setup to complete. If init() was called, this awaits the\n * already-in-flight setup promise. If init() was never called (standalone\n * usage without Mastra), this triggers setup on first use.\n */\n private ensureSetup(): Promise<void> {\n if (!this.setupPromise) {\n this.setupPromise = this.setupAllSignals();\n }\n return this.setupPromise;\n }\n\n /**\n * Resolve provider config once and set up all enabled signals in parallel.\n * Each signal setup catches its own errors — this method never rejects.\n */\n private async setupAllSignals(): Promise<void> {\n const resolved = this.resolveProvider();\n if (!resolved) {\n this.debugLog('Setup skipped: provider not resolved');\n return;\n }\n\n const protocol = resolved.protocol;\n const setupTasks: Promise<void>[] = [];\n\n if (this.config.signals?.traces !== false) {\n setupTasks.push(this.setupTraces(resolved, protocol));\n } else {\n this.debugLog('Trace export disabled via config');\n }\n\n if (this.config.signals?.logs !== false) {\n setupTasks.push(this.setupLogs(resolved, protocol));\n } else {\n this.debugLog('Log export disabled via config');\n }\n\n await Promise.all(setupTasks);\n\n this.debugLog(`Setup complete [traces=${!!this.processor}, logs=${!!this.otelLogger}]`);\n }\n\n // ---------------------------------------------------------------------------\n // Trace setup\n // ---------------------------------------------------------------------------\n\n private async setupTraces(resolved: ResolvedProviderConfig, protocol: ExportProtocol): Promise<void> {\n try {\n // Create or use the provided SpanExporter\n if (this.config.exporter) {\n this.exporter = this.config.exporter;\n } else {\n const headers = resolved.headers;\n // Zipkin doesn't follow OTLP signal-path conventions; pass its endpoint through unchanged.\n const endpoint = protocol === 'zipkin' ? resolved.endpoint : this.getSignalEndpoint(resolved, 'traces');\n\n this.debugLog(`Setting up trace exporter: protocol=${protocol}, endpoint=${endpoint}`);\n\n const ExporterClass = await loadExporter(protocol, this.providerName);\n if (!ExporterClass) {\n this.debugLog(`Trace exporter not available for protocol: ${protocol}`);\n return;\n }\n\n const exporterOptions =\n protocol === 'zipkin'\n ? { url: endpoint, headers }\n : await this.buildExporterOptions(protocol, endpoint, headers);\n this.exporter = new ExporterClass(exporterOptions);\n\n this.debugLog(`Trace exporter created: ${this.exporter?.constructor?.name ?? 'unknown'} -> ${endpoint}`);\n }\n\n // Create processor\n const serviceName = this.observabilityConfig?.serviceName || 'mastra-service';\n\n this.spanConverter = new SpanConverter({\n packageName: '@mastra/otel-exporter',\n serviceName,\n config: this.config,\n format: 'GenAI_v1_38_0',\n });\n\n const exporterForProcessor = this.isDebug\n ? new DebugSpanExporterWrapper(this.exporter!, msg => this.debugLog(msg))\n : this.exporter!;\n\n this.processor = new BatchSpanProcessor(exporterForProcessor, {\n maxExportBatchSize: this.config.batchSize || 512,\n maxQueueSize: 2048,\n scheduledDelayMillis: 5000,\n exportTimeoutMillis: this.config.timeout || 30000,\n });\n\n this.debugLog(\n `Trace export initialized (service.name: \"${serviceName}\", batch size: ${this.config.batchSize || 512}, delay: 5s)`,\n );\n } catch (error) {\n this.logger.warn('[OtelExporter] Failed to initialize trace export');\n this.debugLog('Trace setup error:', error);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Log setup\n // ---------------------------------------------------------------------------\n\n private async setupLogs(resolved: ResolvedProviderConfig, protocol: ExportProtocol): Promise<void> {\n try {\n const LogExporterClass = await loadSignalExporter('logs', protocol, this.providerName);\n if (!LogExporterClass) {\n this.debugLog(`Log exporter package not available for protocol \"${protocol}\". Log export disabled.`);\n return;\n }\n\n const logEndpoint = this.getSignalEndpoint(resolved, 'logs');\n const headers = resolved.headers;\n\n this.debugLog(`Setting up log exporter: protocol=${protocol}, endpoint=${logEndpoint}`);\n\n const logExporterOptions = await this.buildExporterOptions(protocol, logEndpoint, headers);\n const logExporter = new LogExporterClass(logExporterOptions);\n\n const exporterForProcessor = this.isDebug\n ? new DebugLogExporterWrapper(logExporter, msg => this.debugLog(msg))\n : logExporter;\n\n const resource = resourceFromAttributes({\n ...(this.config.resourceAttributes ?? {}),\n [ATTR_SERVICE_NAME]: this.observabilityConfig?.serviceName || 'mastra-service',\n });\n\n this.loggerProvider = new LoggerProvider({\n resource,\n processors: [\n new BatchLogRecordProcessor(exporterForProcessor, {\n maxExportBatchSize: this.config.batchSize || 512,\n maxQueueSize: 2048,\n scheduledDelayMillis: 5000,\n exportTimeoutMillis: this.config.timeout || 30000,\n }),\n ],\n });\n\n this.otelLogger = this.loggerProvider.getLogger('@mastra/otel-exporter');\n\n this.debugLog(`Log export initialized (endpoint: ${logEndpoint})`);\n } catch (error) {\n this.logger.warn('[OtelExporter] Failed to initialize log export');\n this.debugLog('Log setup error:', error);\n }\n }\n\n // ===========================================================================\n // Trace event handler\n // ===========================================================================\n\n protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n if (this.config.signals?.traces === false) return;\n if (event.type !== TracingEventType.SPAN_ENDED) return;\n\n await this.ensureSetup();\n\n if (this.isDisabled || !this.processor) return;\n\n const span = event.exportedSpan;\n\n try {\n const otelSpan = await this.spanConverter!.convertSpan(span);\n this.processor.onEnd(otelSpan);\n\n this.debugLog(\n `Queued 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 // ===========================================================================\n // Log event handler\n // ===========================================================================\n\n async onLogEvent(event: LogEvent): Promise<void> {\n this.debugLog(`onLogEvent received (level: ${event.log.level}, message: \"${event.log.message}\")`);\n\n await this.ensureSetup();\n\n if (this.isDisabled) {\n this.debugLog('Log event skipped: exporter is disabled');\n return;\n }\n\n if (!this.otelLogger) {\n this.debugLog('Log event skipped: log exporter not available');\n return;\n }\n\n try {\n const logParams = convertLog(event.log);\n\n // Mirror trace context into the OTEL log Context so backends (Grafana, Datadog,\n // Honeycomb, etc.) correlate logs with traces using the standard OTLP fields.\n // Also keep mastra.traceId / mastra.spanId attributes for backends that key\n // off attributes only.\n const attributes = { ...logParams.attributes };\n let logContext = apiContext.active();\n if (logParams.traceId && logParams.spanId) {\n attributes['mastra.traceId'] = logParams.traceId;\n attributes['mastra.spanId'] = logParams.spanId;\n logContext = trace.setSpanContext(logContext, {\n traceId: logParams.traceId,\n spanId: logParams.spanId,\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n });\n }\n\n this.otelLogger.emit({\n timestamp: logParams.timestamp,\n severityNumber: logParams.severityNumber,\n severityText: logParams.severityText,\n body: logParams.body,\n attributes,\n context: logContext,\n });\n\n this.debugLog(`Exported log (level: ${event.log.level}, trace: ${event.log.traceId || 'none'})`);\n } catch (error) {\n this.logger.error('[OtelExporter] Failed to export log:', error);\n }\n }\n\n // ===========================================================================\n // Lifecycle\n // ===========================================================================\n\n /**\n * Force flush any buffered data without shutting down the exporter.\n * Delegates to all active processors/providers.\n */\n async flush(): Promise<void> {\n // Wait for setup so we don't miss providers that are still being initialized.\n if (this.setupPromise) {\n await this.setupPromise;\n }\n\n const flushPromises: Promise<void>[] = [];\n const signals: string[] = [];\n\n if (this.processor) {\n flushPromises.push(this.processor.forceFlush());\n signals.push('traces');\n }\n if (this.loggerProvider) {\n flushPromises.push(this.loggerProvider.forceFlush());\n signals.push('logs');\n }\n\n if (flushPromises.length > 0) {\n this.debugLog(`Flushing signals: ${signals.join(', ')}...`);\n await Promise.all(flushPromises);\n this.debugLog('Flushed all pending data');\n } else {\n this.debugLog('Flush called but no active exporters');\n }\n }\n\n async shutdown(): Promise<void> {\n // Wait for setup so we don't shut down before providers finish initializing.\n if (this.setupPromise) {\n await this.setupPromise;\n }\n\n const shutdownPromises: Promise<void>[] = [];\n\n if (this.processor) {\n shutdownPromises.push(this.processor.shutdown());\n }\n if (this.loggerProvider) {\n shutdownPromises.push(this.loggerProvider.shutdown());\n }\n\n if (shutdownPromises.length > 0) {\n await Promise.all(shutdownPromises);\n }\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mastra/otel-exporter",
3
- "version": "1.1.0",
3
+ "version": "1.1.1-alpha.1",
4
4
  "description": "OpenTelemetry observability exporter for Mastra - supports OTLP traces and logs with multiple cloud providers",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -32,7 +32,7 @@
32
32
  "@opentelemetry/sdk-trace-base": "^2.7.0",
33
33
  "@opentelemetry/sdk-trace-node": "^2.7.0",
34
34
  "@opentelemetry/semantic-conventions": "^1.40.0",
35
- "@mastra/observability": "1.12.0"
35
+ "@mastra/observability": "1.13.0-alpha.1"
36
36
  },
37
37
  "optionalDependencies": {
38
38
  "@grpc/grpc-js": "^1.14.3",
@@ -52,9 +52,9 @@
52
52
  "tsup": "^8.5.1",
53
53
  "typescript": "^6.0.3",
54
54
  "vitest": "4.1.5",
55
- "@internal/types-builder": "0.0.68",
56
- "@mastra/core": "1.33.0",
57
- "@internal/lint": "0.0.93"
55
+ "@internal/lint": "0.0.96",
56
+ "@internal/types-builder": "0.0.71",
57
+ "@mastra/core": "1.36.0-alpha.3"
58
58
  },
59
59
  "peerDependencies": {
60
60
  "@grpc/grpc-js": "^1.13.4",