@mastra/otel-exporter 0.0.0-usechat-duplicate-20251016110554 → 0.0.0-vnext-20251104230439

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/loadExporter.ts","../src/provider-configs.ts","../src/mastra-span.ts","../src/span-converter.ts","../src/ai-tracing.ts"],"names":["SpanStatusCode","TraceFlags","AISpanType","SpanKind","ConsoleLogger","diag","DiagConsoleLogger","DiagLogLevel","resourceFromAttributes","ATTR_SERVICE_NAME","ATTR_SERVICE_VERSION","ATTR_TELEMETRY_SDK_NAME","ATTR_TELEMETRY_SDK_VERSION","ATTR_TELEMETRY_SDK_LANGUAGE","BatchSpanProcessor","AITracingEventType"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Dynamic loader for optional OtelExporters\n */\n\nimport type { ExportProtocol } from './types.js';\n\n// Dynamic imports for optional dependencies\nlet OTLPHttpExporter: any;\nlet OTLPGrpcExporter: any;\nlet OTLPProtoExporter: any;\nlet ZipkinExporter: any;\n\nexport async function loadExporter(protocol: ExportProtocol, provider?: string): Promise<any> {\n switch (protocol) {\n case 'zipkin':\n if (!ZipkinExporter) {\n try {\n const module = await import('@opentelemetry/exporter-zipkin');\n ZipkinExporter = module.ZipkinExporter;\n } catch {\n console.error(\n `[OtelExporter] Zipkin exporter is not installed.\\n` +\n `To use Zipkin export, install the required package:\\n` +\n ` npm install @opentelemetry/exporter-zipkin`,\n );\n return null;\n }\n }\n return ZipkinExporter;\n\n case 'grpc':\n if (!OTLPGrpcExporter) {\n try {\n const module = await import('@opentelemetry/exporter-trace-otlp-grpc');\n OTLPGrpcExporter = module.OTLPTraceExporter;\n } catch {\n const providerInfo = provider ? ` (required for ${provider})` : '';\n console.error(\n `[OtelExporter] gRPC exporter is not installed${providerInfo}.\\n` +\n `To use gRPC export, install the required packages:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-grpc @grpc/grpc-js`,\n );\n return null;\n }\n }\n return OTLPGrpcExporter;\n\n case 'http/protobuf':\n if (!OTLPProtoExporter) {\n try {\n const module = await import('@opentelemetry/exporter-trace-otlp-proto');\n OTLPProtoExporter = module.OTLPTraceExporter;\n } catch {\n const providerInfo = provider ? ` (required for ${provider})` : '';\n console.error(\n `[OtelExporter] HTTP/Protobuf exporter is not installed${providerInfo}.\\n` +\n `To use HTTP/Protobuf export, install the required package:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-proto`,\n );\n return null;\n }\n }\n return OTLPProtoExporter;\n\n case 'http/json':\n default:\n if (!OTLPHttpExporter) {\n try {\n const module = await import('@opentelemetry/exporter-trace-otlp-http');\n OTLPHttpExporter = module.OTLPTraceExporter;\n } catch {\n const providerInfo = provider ? ` (required for ${provider})` : '';\n console.error(\n `[OtelExporter] HTTP/JSON exporter is not installed${providerInfo}.\\n` +\n `To use HTTP/JSON export, install the required package:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-http`,\n );\n return null;\n }\n }\n return OTLPHttpExporter;\n }\n}\n","/**\n * Provider-specific configurations for OtelExporters\n */\n\nimport type {\n ProviderConfig,\n ExportProtocol,\n Dash0Config,\n SignozConfig,\n NewRelicConfig,\n TraceloopConfig,\n LaminarConfig,\n CustomConfig,\n} from './types.js';\n\nexport interface ResolvedProviderConfig {\n endpoint: string;\n headers: Record<string, string>;\n protocol: ExportProtocol;\n}\n\nexport function resolveProviderConfig(config: ProviderConfig): ResolvedProviderConfig | null {\n if ('dash0' in config) {\n return resolveDash0Config(config.dash0);\n } else if ('signoz' in config) {\n return resolveSignozConfig(config.signoz);\n } else if ('newrelic' in config) {\n return resolveNewRelicConfig(config.newrelic);\n } else if ('traceloop' in config) {\n return resolveTraceloopConfig(config.traceloop);\n } else if ('laminar' in config) {\n return resolveLaminarConfig(config.laminar);\n } else if ('custom' in config) {\n return resolveCustomConfig(config.custom);\n } else {\n // TypeScript exhaustiveness check\n const _exhaustive: never = config;\n return _exhaustive;\n }\n}\n\nfunction resolveDash0Config(config: Dash0Config): ResolvedProviderConfig | null {\n if (!config.apiKey) {\n console.error('[OtelExporter] Dash0 configuration requires apiKey. Tracing will be disabled.');\n return null;\n }\n\n if (!config.endpoint) {\n console.error('[OtelExporter] Dash0 configuration requires endpoint. Tracing will be disabled.');\n return null;\n }\n\n // Dash0 uses gRPC by default\n // Endpoint should be like: ingress.us-west-2.aws.dash0.com:4317\n // gRPC endpoints also need /v1/traces suffix\n // Requires: npm install @opentelemetry/exporter-trace-otlp-grpc @grpc/grpc-js\n let endpoint = config.endpoint;\n if (!endpoint.includes('/v1/traces')) {\n endpoint = `${endpoint}/v1/traces`;\n }\n\n const headers: Record<string, string> = {\n authorization: `Bearer ${config.apiKey}`, // lowercase for gRPC metadata\n };\n\n if (config.dataset) {\n headers['dash0-dataset'] = config.dataset; // lowercase for gRPC metadata\n }\n\n return {\n endpoint,\n headers,\n protocol: 'grpc', // Use gRPC for Dash0\n };\n}\n\nfunction resolveSignozConfig(config: SignozConfig): ResolvedProviderConfig | null {\n if (!config.apiKey) {\n console.error('[OtelExporter] SigNoz configuration requires apiKey. Tracing will be disabled.');\n return null;\n }\n\n // SigNoz uses OTLP endpoint with /v1/traces suffix\n const endpoint = config.endpoint || `https://ingest.${config.region || 'us'}.signoz.cloud:443/v1/traces`;\n\n return {\n endpoint,\n headers: {\n 'signoz-ingestion-key': config.apiKey,\n },\n protocol: 'http/protobuf',\n };\n}\n\nfunction resolveNewRelicConfig(config: NewRelicConfig): ResolvedProviderConfig | null {\n if (!config.apiKey) {\n console.error('[OtelExporter] New Relic configuration requires apiKey (license key). Tracing will be disabled.');\n return null;\n }\n\n // New Relic recommends HTTP/protobuf over gRPC\n // New Relic uses OTLP endpoint with /v1/traces suffix\n const endpoint = config.endpoint || 'https://otlp.nr-data.net:443/v1/traces';\n\n return {\n endpoint,\n headers: {\n 'api-key': config.apiKey,\n },\n protocol: 'http/protobuf',\n };\n}\n\nfunction resolveTraceloopConfig(config: TraceloopConfig): ResolvedProviderConfig | null {\n if (!config.apiKey) {\n console.error('[OtelExporter] Traceloop configuration requires apiKey. Tracing will be disabled.');\n return null;\n }\n\n // Traceloop uses OTLP endpoint with /v1/traces suffix\n const endpoint = config.endpoint || 'https://api.traceloop.com/v1/traces';\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${config.apiKey}`,\n };\n\n if (config.destinationId) {\n headers['x-traceloop-destination-id'] = config.destinationId;\n }\n\n return {\n endpoint,\n headers,\n protocol: 'http/json',\n };\n}\n\nfunction resolveLaminarConfig(config: LaminarConfig): ResolvedProviderConfig | null {\n if (!config.apiKey) {\n console.error('[OtelExporter] Laminar configuration requires apiKey. Tracing will be disabled.');\n return null;\n }\n\n // Laminar uses OTLP endpoint with /v1/traces suffix for HTTP\n // They support both gRPC and HTTP, but we'll use HTTP for consistency\n const endpoint = config.endpoint || 'https://api.lmnr.ai/v1/traces';\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${config.apiKey}`,\n };\n\n // Only add team ID header if provided (for backwards compatibility)\n if (config.teamId) {\n headers['x-laminar-team-id'] = config.teamId;\n }\n\n return {\n endpoint,\n headers,\n protocol: 'http/protobuf', // Use HTTP/protobuf instead of gRPC for better compatibility\n };\n}\n\nfunction resolveCustomConfig(config: CustomConfig): ResolvedProviderConfig | null {\n if (!config.endpoint) {\n console.error('[OtelExporter] Custom configuration requires endpoint. Tracing will be disabled.');\n return null;\n }\n\n return {\n endpoint: config.endpoint,\n headers: config.headers || {},\n protocol: config.protocol || 'http/json',\n };\n}\n","/**\n * Custom OpenTelemetry span that preserves Mastra's trace and span IDs\n */\n\nimport type { AnyExportedAISpan } from '@mastra/core/ai-tracing';\nimport { SpanStatusCode, TraceFlags } from '@opentelemetry/api';\nimport type { SpanKind, SpanContext, SpanStatus, Attributes, Link } from '@opentelemetry/api';\nimport type { InstrumentationScope } from '@opentelemetry/core';\nimport type { Resource } from '@opentelemetry/resources';\nimport type { ReadableSpan, TimedEvent } from '@opentelemetry/sdk-trace-base';\n\n/**\n * A custom ReadableSpan implementation that preserves Mastra's IDs\n */\nexport class MastraReadableSpan implements ReadableSpan {\n readonly name: string;\n readonly kind: SpanKind;\n readonly spanContext: () => SpanContext;\n readonly parentSpanId?: string;\n readonly startTime: [number, number];\n readonly endTime: [number, number];\n readonly status: SpanStatus;\n readonly attributes: Attributes;\n readonly links: Link[];\n readonly events: TimedEvent[];\n readonly duration: [number, number];\n readonly ended: boolean;\n readonly resource: Resource;\n readonly instrumentationLibrary: InstrumentationScope;\n readonly instrumentationScope: InstrumentationScope;\n readonly droppedAttributesCount: number = 0;\n readonly droppedEventsCount: number = 0;\n readonly droppedLinksCount: number = 0;\n\n constructor(\n aiSpan: AnyExportedAISpan,\n attributes: Attributes,\n kind: SpanKind,\n parentSpanId?: string,\n resource?: Resource,\n instrumentationLibrary?: InstrumentationScope,\n ) {\n this.name = aiSpan.name;\n this.kind = kind;\n this.attributes = attributes;\n this.parentSpanId = parentSpanId;\n this.links = [];\n this.events = [];\n\n // Convert JavaScript Date to hrtime format [seconds, nanoseconds]\n this.startTime = this.dateToHrTime(aiSpan.startTime);\n this.endTime = aiSpan.endTime ? this.dateToHrTime(aiSpan.endTime) : this.startTime;\n this.ended = !!aiSpan.endTime;\n\n // Calculate duration\n if (aiSpan.endTime) {\n const durationMs = aiSpan.endTime.getTime() - aiSpan.startTime.getTime();\n this.duration = [Math.floor(durationMs / 1000), (durationMs % 1000) * 1000000];\n } else {\n this.duration = [0, 0];\n }\n\n // Set status based on error info\n if (aiSpan.errorInfo) {\n this.status = {\n code: SpanStatusCode.ERROR,\n message: aiSpan.errorInfo.message,\n };\n\n // Add error as event\n this.events.push({\n name: 'exception',\n attributes: {\n 'exception.message': aiSpan.errorInfo.message,\n 'exception.type': 'Error',\n ...(aiSpan.errorInfo.details?.stack && {\n 'exception.stacktrace': aiSpan.errorInfo.details.stack as string,\n }),\n },\n time: this.startTime,\n droppedAttributesCount: 0,\n });\n } else if (aiSpan.endTime) {\n this.status = { code: SpanStatusCode.OK };\n } else {\n this.status = { code: SpanStatusCode.UNSET };\n }\n\n // Add instant event if needed\n if (aiSpan.isEvent) {\n this.events.push({\n name: 'instant_event',\n attributes: {},\n time: this.startTime,\n droppedAttributesCount: 0,\n });\n }\n\n // Create span context with Mastra's IDs\n this.spanContext = () => ({\n traceId: aiSpan.traceId,\n spanId: aiSpan.id,\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n });\n\n // Set resource and instrumentation library\n this.resource = resource || ({} as Resource);\n this.instrumentationLibrary = instrumentationLibrary || {\n name: '@mastra/otel',\n version: '1.0.0',\n };\n // instrumentationScope is the same as instrumentationLibrary\n this.instrumentationScope = this.instrumentationLibrary;\n }\n\n /**\n * Convert JavaScript Date to hrtime format\n */\n private dateToHrTime(date: Date): [number, number] {\n const ms = date.getTime();\n const seconds = Math.floor(ms / 1000);\n const nanoseconds = (ms % 1000) * 1000000;\n return [seconds, nanoseconds];\n }\n}\n","/**\n * Convert Mastra AI spans to OpenTelemetry spans\n */\n\nimport type {\n AnyExportedAISpan,\n LLMGenerationAttributes,\n AgentRunAttributes,\n ToolCallAttributes,\n MCPToolCallAttributes,\n WorkflowRunAttributes,\n} from '@mastra/core/ai-tracing';\nimport { AISpanType } from '@mastra/core/ai-tracing';\nimport { SpanKind } from '@opentelemetry/api';\nimport type { Attributes } from '@opentelemetry/api';\nimport type { InstrumentationScope } from '@opentelemetry/core';\nimport type { Resource } from '@opentelemetry/resources';\nimport { MastraReadableSpan } from './mastra-span.js';\n\n// Map Mastra span types to OpenTelemetry span kinds following OTEL conventions\n// Only non-INTERNAL mappings are specified - all others default to SpanKind.INTERNAL\nconst SPAN_KIND_MAPPING: Partial<Record<AISpanType, SpanKind>> = {\n // LLM operations are CLIENT spans (calling external AI services)\n [AISpanType.LLM_GENERATION]: SpanKind.CLIENT,\n [AISpanType.LLM_CHUNK]: SpanKind.CLIENT,\n\n // MCP tool calls are CLIENT (external service calls)\n [AISpanType.MCP_TOOL_CALL]: SpanKind.CLIENT,\n\n // Root spans for agent/workflow are SERVER (entry points)\n [AISpanType.AGENT_RUN]: SpanKind.SERVER,\n [AISpanType.WORKFLOW_RUN]: SpanKind.SERVER,\n};\n\nexport class SpanConverter {\n private resource?: Resource;\n private instrumentationLibrary: InstrumentationScope;\n\n constructor(resource?: Resource) {\n this.resource = resource;\n this.instrumentationLibrary = {\n name: '@mastra/otel',\n version: '1.0.0',\n };\n }\n\n /**\n * Convert a Mastra AI span to an OpenTelemetry ReadableSpan\n * This preserves Mastra's trace and span IDs\n */\n convertSpan(aiSpan: AnyExportedAISpan): MastraReadableSpan {\n const spanKind = this.getSpanKind(aiSpan);\n const attributes = this.buildAttributes(aiSpan);\n const spanName = this.buildSpanName(aiSpan);\n\n // Create a new span with OTEL-compliant naming\n const otelSpan = { ...aiSpan, name: spanName };\n\n return new MastraReadableSpan(\n otelSpan,\n attributes,\n spanKind,\n aiSpan.parentSpanId, // Use the parentSpanId from the Mastra span directly\n this.resource,\n this.instrumentationLibrary,\n );\n }\n\n /**\n * Get the appropriate SpanKind based on span type and context\n */\n private getSpanKind(aiSpan: AnyExportedAISpan): SpanKind {\n // Root spans should be SERVER\n if (aiSpan.isRootSpan) {\n if (aiSpan.type === AISpanType.AGENT_RUN || aiSpan.type === AISpanType.WORKFLOW_RUN) {\n return SpanKind.SERVER;\n }\n }\n return SPAN_KIND_MAPPING[aiSpan.type] || SpanKind.INTERNAL;\n }\n\n /**\n * Build OTEL-compliant span name based on span type and attributes\n */\n private buildSpanName(aiSpan: AnyExportedAISpan): string {\n switch (aiSpan.type) {\n case AISpanType.LLM_GENERATION: {\n const attrs = aiSpan.attributes as LLMGenerationAttributes;\n const operation = attrs?.resultType === 'tool_selection' ? 'tool_selection' : 'chat';\n const model = attrs?.model || 'unknown';\n return `${operation} ${model}`;\n }\n\n case AISpanType.TOOL_CALL:\n case AISpanType.MCP_TOOL_CALL: {\n const toolAttrs = aiSpan.attributes as ToolCallAttributes | MCPToolCallAttributes;\n const toolName = toolAttrs?.toolId || 'unknown';\n return `tool.execute ${toolName}`;\n }\n\n case AISpanType.AGENT_RUN: {\n const agentAttrs = aiSpan.attributes as AgentRunAttributes;\n const agentId = agentAttrs?.agentId || 'unknown';\n return `agent.${agentId}`;\n }\n\n case AISpanType.WORKFLOW_RUN: {\n const workflowAttrs = aiSpan.attributes as WorkflowRunAttributes;\n const workflowId = workflowAttrs?.workflowId || 'unknown';\n return `workflow.${workflowId}`;\n }\n\n case AISpanType.WORKFLOW_STEP:\n // Keep the original name as it's likely descriptive\n return aiSpan.name;\n\n default:\n // For other types, use a simplified version of the original name\n return aiSpan.name;\n }\n }\n\n /**\n * Build OpenTelemetry attributes from Mastra AI span\n * Following OTEL Semantic Conventions for GenAI\n */\n private buildAttributes(aiSpan: AnyExportedAISpan): Attributes {\n const attributes: Attributes = {};\n\n // Add gen_ai.operation.name based on span type\n attributes['gen_ai.operation.name'] = this.getOperationName(aiSpan);\n\n // Add span kind semantic attribute\n attributes['span.kind'] = this.getSpanKindString(aiSpan);\n\n // Add span type for better visibility\n attributes['mastra.span.type'] = aiSpan.type;\n\n // Add trace and span IDs for debugging\n attributes['mastra.trace_id'] = aiSpan.traceId;\n attributes['mastra.span_id'] = aiSpan.id;\n if (aiSpan.parentSpanId) {\n attributes['mastra.parent_span_id'] = aiSpan.parentSpanId;\n }\n\n // Handle input/output based on span type\n // Always add input/output for Laminar compatibility\n if (aiSpan.input !== undefined) {\n const inputStr = typeof aiSpan.input === 'string' ? aiSpan.input : JSON.stringify(aiSpan.input);\n // Add generic input for all providers\n attributes['input'] = inputStr;\n\n // Add specific attributes based on span type\n if (aiSpan.type === AISpanType.LLM_GENERATION) {\n attributes['gen_ai.prompt'] = inputStr;\n } else if (aiSpan.type === AISpanType.TOOL_CALL || aiSpan.type === AISpanType.MCP_TOOL_CALL) {\n attributes['gen_ai.tool.input'] = inputStr;\n }\n }\n\n if (aiSpan.output !== undefined) {\n const outputStr = typeof aiSpan.output === 'string' ? aiSpan.output : JSON.stringify(aiSpan.output);\n // Add generic output for all providers\n attributes['output'] = outputStr;\n\n // Add specific attributes based on span type\n if (aiSpan.type === AISpanType.LLM_GENERATION) {\n attributes['gen_ai.completion'] = outputStr;\n } else if (aiSpan.type === AISpanType.TOOL_CALL || aiSpan.type === AISpanType.MCP_TOOL_CALL) {\n attributes['gen_ai.tool.output'] = outputStr;\n }\n }\n\n // Add LLM-specific attributes using OTEL semantic conventions\n if (aiSpan.type === AISpanType.LLM_GENERATION && aiSpan.attributes) {\n const llmAttrs = aiSpan.attributes as LLMGenerationAttributes;\n\n // Model and provider\n if (llmAttrs.model) {\n attributes['gen_ai.request.model'] = llmAttrs.model;\n }\n\n if (llmAttrs.provider) {\n attributes['gen_ai.system'] = llmAttrs.provider;\n }\n\n // Token usage - use OTEL standard naming\n if (llmAttrs.usage) {\n // Handle both v5 format (inputTokens/outputTokens) and legacy format (promptTokens/completionTokens)\n const inputTokens = llmAttrs.usage.inputTokens ?? llmAttrs.usage.promptTokens;\n const outputTokens = llmAttrs.usage.outputTokens ?? llmAttrs.usage.completionTokens;\n\n if (inputTokens !== undefined) {\n attributes['gen_ai.usage.input_tokens'] = inputTokens;\n }\n if (outputTokens !== undefined) {\n attributes['gen_ai.usage.output_tokens'] = outputTokens;\n }\n if (llmAttrs.usage.totalTokens !== undefined) {\n attributes['gen_ai.usage.total_tokens'] = llmAttrs.usage.totalTokens;\n }\n\n // Add other token metrics if present\n if (llmAttrs.usage.reasoningTokens !== undefined) {\n attributes['gen_ai.usage.reasoning_tokens'] = llmAttrs.usage.reasoningTokens;\n }\n if (llmAttrs.usage.cachedInputTokens !== undefined) {\n attributes['gen_ai.usage.cached_input_tokens'] = llmAttrs.usage.cachedInputTokens;\n }\n }\n\n // Parameters using OTEL conventions\n if (llmAttrs.parameters) {\n if (llmAttrs.parameters.temperature !== undefined) {\n attributes['gen_ai.request.temperature'] = llmAttrs.parameters.temperature;\n }\n if (llmAttrs.parameters.maxOutputTokens !== undefined) {\n attributes['gen_ai.request.max_tokens'] = llmAttrs.parameters.maxOutputTokens;\n }\n if (llmAttrs.parameters.topP !== undefined) {\n attributes['gen_ai.request.top_p'] = llmAttrs.parameters.topP;\n }\n if (llmAttrs.parameters.topK !== undefined) {\n attributes['gen_ai.request.top_k'] = llmAttrs.parameters.topK;\n }\n if (llmAttrs.parameters.presencePenalty !== undefined) {\n attributes['gen_ai.request.presence_penalty'] = llmAttrs.parameters.presencePenalty;\n }\n if (llmAttrs.parameters.frequencyPenalty !== undefined) {\n attributes['gen_ai.request.frequency_penalty'] = llmAttrs.parameters.frequencyPenalty;\n }\n if (llmAttrs.parameters.stopSequences) {\n attributes['gen_ai.request.stop_sequences'] = JSON.stringify(llmAttrs.parameters.stopSequences);\n }\n }\n\n // Response attributes\n if (llmAttrs.finishReason) {\n attributes['gen_ai.response.finish_reasons'] = llmAttrs.finishReason;\n }\n }\n\n // Add tool-specific attributes using OTEL conventions\n if ((aiSpan.type === AISpanType.TOOL_CALL || aiSpan.type === AISpanType.MCP_TOOL_CALL) && aiSpan.attributes) {\n const toolAttrs = aiSpan.attributes as ToolCallAttributes | MCPToolCallAttributes;\n\n // Tool identification\n if (toolAttrs.toolId) {\n attributes['gen_ai.tool.name'] = toolAttrs.toolId;\n }\n\n // MCP-specific attributes\n if (aiSpan.type === AISpanType.MCP_TOOL_CALL) {\n const mcpAttrs = toolAttrs as MCPToolCallAttributes;\n if (mcpAttrs.mcpServer) {\n attributes['mcp.server'] = mcpAttrs.mcpServer;\n }\n if (mcpAttrs.serverVersion) {\n attributes['mcp.server.version'] = mcpAttrs.serverVersion;\n }\n } else {\n if ((toolAttrs as ToolCallAttributes).toolDescription) {\n attributes['gen_ai.tool.description'] = (toolAttrs as ToolCallAttributes).toolDescription;\n }\n }\n\n // Tool execution result\n if (toolAttrs.success !== undefined) {\n attributes['gen_ai.tool.success'] = toolAttrs.success;\n }\n }\n\n // Add agent-specific attributes\n if (aiSpan.type === AISpanType.AGENT_RUN && aiSpan.attributes) {\n const agentAttrs = aiSpan.attributes as AgentRunAttributes;\n if (agentAttrs.agentId) {\n attributes['agent.id'] = agentAttrs.agentId;\n }\n if (agentAttrs.maxSteps) {\n attributes['agent.max_steps'] = agentAttrs.maxSteps;\n }\n if (agentAttrs.availableTools) {\n attributes['agent.available_tools'] = JSON.stringify(agentAttrs.availableTools);\n }\n }\n\n // Add workflow-specific attributes\n if (aiSpan.type === AISpanType.WORKFLOW_RUN && aiSpan.attributes) {\n const workflowAttrs = aiSpan.attributes as WorkflowRunAttributes;\n if (workflowAttrs.workflowId) {\n attributes['workflow.id'] = workflowAttrs.workflowId;\n }\n if (workflowAttrs.status) {\n attributes['workflow.status'] = workflowAttrs.status;\n }\n }\n\n // Add error information if present\n if (aiSpan.errorInfo) {\n attributes['error'] = true;\n attributes['error.type'] = aiSpan.errorInfo.id || 'unknown';\n attributes['error.message'] = aiSpan.errorInfo.message;\n if (aiSpan.errorInfo.domain) {\n attributes['error.domain'] = aiSpan.errorInfo.domain;\n }\n if (aiSpan.errorInfo.category) {\n attributes['error.category'] = aiSpan.errorInfo.category;\n }\n }\n\n // Add metadata as custom attributes with proper typing\n if (aiSpan.metadata) {\n Object.entries(aiSpan.metadata).forEach(([key, value]) => {\n // Skip if attribute already exists\n if (!attributes[key]) {\n // Ensure value is a valid OTEL attribute type\n if (value === null || value === undefined) {\n return;\n }\n if (typeof value === 'object') {\n attributes[key] = JSON.stringify(value);\n } else {\n attributes[key] = value;\n }\n }\n });\n }\n\n // Add timing information\n if (aiSpan.startTime) {\n attributes['mastra.start_time'] = aiSpan.startTime.toISOString();\n }\n if (aiSpan.endTime) {\n attributes['mastra.end_time'] = aiSpan.endTime.toISOString();\n const duration = aiSpan.endTime.getTime() - aiSpan.startTime.getTime();\n attributes['mastra.duration_ms'] = duration;\n }\n\n return attributes;\n }\n\n /**\n * Get the operation name based on span type for gen_ai.operation.name\n */\n private getOperationName(aiSpan: AnyExportedAISpan): string {\n switch (aiSpan.type) {\n case AISpanType.LLM_GENERATION: {\n const attrs = aiSpan.attributes as LLMGenerationAttributes;\n return attrs?.resultType === 'tool_selection' ? 'tool_selection' : 'chat';\n }\n case AISpanType.TOOL_CALL:\n case AISpanType.MCP_TOOL_CALL:\n return 'tool.execute';\n case AISpanType.AGENT_RUN:\n return 'agent.run';\n case AISpanType.WORKFLOW_RUN:\n return 'workflow.run';\n default:\n return aiSpan.type.replace(/_/g, '.');\n }\n }\n\n /**\n * Get span kind as string for attribute\n */\n private getSpanKindString(aiSpan: AnyExportedAISpan): string {\n const kind = this.getSpanKind(aiSpan);\n switch (kind) {\n case SpanKind.SERVER:\n return 'server';\n case SpanKind.CLIENT:\n return 'client';\n case SpanKind.INTERNAL:\n return 'internal';\n case SpanKind.PRODUCER:\n return 'producer';\n case SpanKind.CONSUMER:\n return 'consumer';\n default:\n return 'internal';\n }\n }\n}\n","/**\n * OpenTelemetry AI Tracing Exporter for Mastra\n */\n\nimport { AITracingEventType } from '@mastra/core/ai-tracing';\nimport type { AITracingExporter, AITracingEvent, AnyExportedAISpan, TracingConfig } from '@mastra/core/ai-tracing';\nimport { ConsoleLogger } from '@mastra/core/logger';\nimport { diag, DiagConsoleLogger, DiagLogLevel } from '@opentelemetry/api';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport type { SpanExporter } from '@opentelemetry/sdk-trace-base';\nimport {\n ATTR_SERVICE_NAME,\n ATTR_SERVICE_VERSION,\n ATTR_TELEMETRY_SDK_LANGUAGE,\n ATTR_TELEMETRY_SDK_NAME,\n ATTR_TELEMETRY_SDK_VERSION,\n} from '@opentelemetry/semantic-conventions';\n\nimport { loadExporter } from './loadExporter.js';\nimport { resolveProviderConfig } from './provider-configs.js';\nimport { SpanConverter } from './span-converter.js';\nimport type { OtelExporterConfig } from './types.js';\n\nexport class OtelExporter implements AITracingExporter {\n private config: OtelExporterConfig;\n private tracingConfig?: TracingConfig;\n private spanConverter: SpanConverter;\n private processor?: BatchSpanProcessor;\n private exporter?: SpanExporter;\n private isSetup: boolean = false;\n private isDisabled: boolean = false;\n private logger: ConsoleLogger;\n\n name = 'opentelemetry';\n\n constructor(config: OtelExporterConfig) {\n this.config = config;\n this.spanConverter = new SpanConverter();\n this.logger = new ConsoleLogger({ level: config.logLevel ?? 'warn' });\n\n // Set up OpenTelemetry diagnostics if debug mode\n if (config.logLevel === 'debug') {\n diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.DEBUG);\n }\n }\n\n /**\n * Initialize with tracing configuration\n */\n init(config: TracingConfig): void {\n this.tracingConfig = config;\n }\n\n private async setupExporter() {\n if (this.isSetup) return;\n\n // Provider configuration is required\n if (!this.config.provider) {\n this.logger.error(\n '[OtelExporter] Provider configuration is required. Use the \"custom\" provider for generic endpoints.',\n );\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n // Resolve provider configuration\n const resolved = resolveProviderConfig(this.config.provider);\n if (!resolved) {\n // Configuration validation failed, disable tracing\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n const endpoint = resolved.endpoint;\n const headers = resolved.headers;\n const protocol = resolved.protocol;\n\n // Load and create the appropriate exporter based on protocol\n const providerName = Object.keys(this.config.provider)[0];\n const ExporterClass = await loadExporter(protocol, providerName);\n\n if (!ExporterClass) {\n // Exporter not available, disable tracing\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n try {\n if (protocol === 'zipkin') {\n this.exporter = new ExporterClass({\n url: endpoint,\n headers,\n });\n } else if (protocol === 'grpc') {\n // gRPC uses Metadata object instead of headers\n // Dynamically import @grpc/grpc-js to create metadata\n let metadata: any;\n try {\n // @ts-ignore - Dynamic import for optional dependency\n const grpcModule = await import('@grpc/grpc-js');\n metadata = new grpcModule.Metadata();\n Object.entries(headers).forEach(([key, value]) => {\n metadata.set(key, value);\n });\n } catch (grpcError) {\n this.logger.error(\n `[OtelExporter] Failed to load gRPC metadata. Install required packages:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-grpc @grpc/grpc-js\\n`,\n grpcError,\n );\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n this.exporter = new ExporterClass({\n url: endpoint,\n metadata,\n timeoutMillis: this.config.timeout,\n });\n } else {\n // HTTP/JSON and HTTP/Protobuf use headers\n this.exporter = new ExporterClass({\n url: endpoint,\n headers,\n timeoutMillis: this.config.timeout,\n });\n }\n } catch (error) {\n this.logger.error(`[OtelExporter] Failed to create exporter:`, error);\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n // Create resource with service name from TracingConfig\n let resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: this.tracingConfig?.serviceName || 'mastra-service',\n [ATTR_SERVICE_VERSION]: '1.0.0',\n // Add telemetry SDK information\n [ATTR_TELEMETRY_SDK_NAME]: '@mastra/otel-exporter',\n [ATTR_TELEMETRY_SDK_VERSION]: '1.0.0',\n [ATTR_TELEMETRY_SDK_LANGUAGE]: 'nodejs',\n });\n\n if (this.config.resourceAttributes) {\n resource = resource.merge(\n // Duplicate attributes from config will override defaults above\n resourceFromAttributes(this.config.resourceAttributes),\n );\n }\n\n // Store the resource for the span converter\n this.spanConverter = new SpanConverter(resource);\n\n // Always use BatchSpanProcessor for production\n // It queues spans and exports them in batches for better performance\n this.processor = new BatchSpanProcessor(this.exporter!, {\n maxExportBatchSize: this.config.batchSize || 512, // Default batch size\n maxQueueSize: 2048, // Maximum spans to queue\n scheduledDelayMillis: 5000, // Export every 5 seconds\n exportTimeoutMillis: this.config.timeout || 30000, // Export timeout\n });\n\n this.logger.debug(\n `[OtelExporter] Using BatchSpanProcessor (batch size: ${this.config.batchSize || 512}, delay: 5s)`,\n );\n this.isSetup = true;\n }\n\n async exportEvent(event: AITracingEvent): Promise<void> {\n // Skip if disabled due to configuration errors\n if (this.isDisabled) {\n return;\n }\n\n // Only process SPAN_ENDED events for OTEL\n // OTEL expects complete spans with start and end times\n if (event.type !== AITracingEventType.SPAN_ENDED) {\n return;\n }\n\n const span = event.exportedSpan;\n await this.exportSpan(span);\n }\n\n private async exportSpan(span: AnyExportedAISpan): Promise<void> {\n // Ensure exporter is set up\n if (!this.isSetup) {\n await this.setupExporter();\n }\n\n // Skip if disabled\n if (this.isDisabled || !this.processor) {\n return;\n }\n\n try {\n // Convert the span to OTEL format\n const readableSpan = this.spanConverter.convertSpan(span);\n\n // Export the span immediately through the processor\n // The processor will handle batching if configured\n await new Promise<void>(resolve => {\n this.processor!.onEnd(readableSpan);\n resolve();\n });\n\n this.logger.debug(\n `[OtelExporter] Exported span ${span.id} (trace: ${span.traceId}, parent: ${span.parentSpanId || 'none'}, type: ${span.type})`,\n );\n } catch (error) {\n this.logger.error(`[OtelExporter] Failed to export span ${span.id}:`, error);\n }\n }\n\n async shutdown(): Promise<void> {\n // Shutdown the processor to flush any remaining spans\n if (this.processor) {\n await this.processor.shutdown();\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/loadExporter.ts","../src/provider-configs.ts","../src/mastra-span.ts","../src/span-converter.ts","../src/ai-tracing.ts"],"names":["SpanStatusCode","TraceFlags","AISpanType","SpanKind","BaseExporter","diag","DiagConsoleLogger","DiagLogLevel","resourceFromAttributes","ATTR_SERVICE_NAME","ATTR_SERVICE_VERSION","ATTR_TELEMETRY_SDK_NAME","ATTR_TELEMETRY_SDK_VERSION","ATTR_TELEMETRY_SDK_LANGUAGE","BatchSpanProcessor","AITracingEventType"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Dynamic loader for optional OtelExporters\n */\n\nimport type { ExportProtocol } from './types.js';\n\n// Dynamic imports for optional dependencies\nlet OTLPHttpExporter: any;\nlet OTLPGrpcExporter: any;\nlet OTLPProtoExporter: any;\nlet ZipkinExporter: any;\n\nexport async function loadExporter(protocol: ExportProtocol, provider?: string): Promise<any> {\n switch (protocol) {\n case 'zipkin':\n if (!ZipkinExporter) {\n try {\n const module = await import('@opentelemetry/exporter-zipkin');\n ZipkinExporter = module.ZipkinExporter;\n } catch {\n console.error(\n `[OtelExporter] Zipkin exporter is not installed.\\n` +\n `To use Zipkin export, install the required package:\\n` +\n ` npm install @opentelemetry/exporter-zipkin`,\n );\n return null;\n }\n }\n return ZipkinExporter;\n\n case 'grpc':\n if (!OTLPGrpcExporter) {\n try {\n const module = await import('@opentelemetry/exporter-trace-otlp-grpc');\n OTLPGrpcExporter = module.OTLPTraceExporter;\n } catch {\n const providerInfo = provider ? ` (required for ${provider})` : '';\n console.error(\n `[OtelExporter] gRPC exporter is not installed${providerInfo}.\\n` +\n `To use gRPC export, install the required packages:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-grpc @grpc/grpc-js`,\n );\n return null;\n }\n }\n return OTLPGrpcExporter;\n\n case 'http/protobuf':\n if (!OTLPProtoExporter) {\n try {\n const module = await import('@opentelemetry/exporter-trace-otlp-proto');\n OTLPProtoExporter = module.OTLPTraceExporter;\n } catch {\n const providerInfo = provider ? ` (required for ${provider})` : '';\n console.error(\n `[OtelExporter] HTTP/Protobuf exporter is not installed${providerInfo}.\\n` +\n `To use HTTP/Protobuf export, install the required package:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-proto`,\n );\n return null;\n }\n }\n return OTLPProtoExporter;\n\n case 'http/json':\n default:\n if (!OTLPHttpExporter) {\n try {\n const module = await import('@opentelemetry/exporter-trace-otlp-http');\n OTLPHttpExporter = module.OTLPTraceExporter;\n } catch {\n const providerInfo = provider ? ` (required for ${provider})` : '';\n console.error(\n `[OtelExporter] HTTP/JSON exporter is not installed${providerInfo}.\\n` +\n `To use HTTP/JSON export, install the required package:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-http`,\n );\n return null;\n }\n }\n return OTLPHttpExporter;\n }\n}\n","/**\n * Provider-specific configurations for OtelExporters\n */\n\nimport type {\n ProviderConfig,\n ExportProtocol,\n Dash0Config,\n SignozConfig,\n NewRelicConfig,\n TraceloopConfig,\n LaminarConfig,\n CustomConfig,\n} from './types.js';\n\nexport interface ResolvedProviderConfig {\n endpoint: string;\n headers: Record<string, string>;\n protocol: ExportProtocol;\n}\n\nexport function resolveProviderConfig(config: ProviderConfig): ResolvedProviderConfig | null {\n if ('dash0' in config) {\n return resolveDash0Config(config.dash0);\n } else if ('signoz' in config) {\n return resolveSignozConfig(config.signoz);\n } else if ('newrelic' in config) {\n return resolveNewRelicConfig(config.newrelic);\n } else if ('traceloop' in config) {\n return resolveTraceloopConfig(config.traceloop);\n } else if ('laminar' in config) {\n return resolveLaminarConfig(config.laminar);\n } else if ('custom' in config) {\n return resolveCustomConfig(config.custom);\n } else {\n // TypeScript exhaustiveness check\n const _exhaustive: never = config;\n return _exhaustive;\n }\n}\n\nfunction resolveDash0Config(config: Dash0Config): ResolvedProviderConfig | null {\n if (!config.apiKey) {\n console.error('[OtelExporter] Dash0 configuration requires apiKey. Tracing will be disabled.');\n return null;\n }\n\n if (!config.endpoint) {\n console.error('[OtelExporter] Dash0 configuration requires endpoint. Tracing will be disabled.');\n return null;\n }\n\n // Dash0 uses gRPC by default\n // Endpoint should be like: ingress.us-west-2.aws.dash0.com:4317\n // gRPC endpoints also need /v1/traces suffix\n // Requires: npm install @opentelemetry/exporter-trace-otlp-grpc @grpc/grpc-js\n let endpoint = config.endpoint;\n if (!endpoint.includes('/v1/traces')) {\n endpoint = `${endpoint}/v1/traces`;\n }\n\n const headers: Record<string, string> = {\n authorization: `Bearer ${config.apiKey}`, // lowercase for gRPC metadata\n };\n\n if (config.dataset) {\n headers['dash0-dataset'] = config.dataset; // lowercase for gRPC metadata\n }\n\n return {\n endpoint,\n headers,\n protocol: 'grpc', // Use gRPC for Dash0\n };\n}\n\nfunction resolveSignozConfig(config: SignozConfig): ResolvedProviderConfig | null {\n if (!config.apiKey) {\n console.error('[OtelExporter] SigNoz configuration requires apiKey. Tracing will be disabled.');\n return null;\n }\n\n // SigNoz uses OTLP endpoint with /v1/traces suffix\n const endpoint = config.endpoint || `https://ingest.${config.region || 'us'}.signoz.cloud:443/v1/traces`;\n\n return {\n endpoint,\n headers: {\n 'signoz-ingestion-key': config.apiKey,\n },\n protocol: 'http/protobuf',\n };\n}\n\nfunction resolveNewRelicConfig(config: NewRelicConfig): ResolvedProviderConfig | null {\n if (!config.apiKey) {\n console.error('[OtelExporter] New Relic configuration requires apiKey (license key). Tracing will be disabled.');\n return null;\n }\n\n // New Relic recommends HTTP/protobuf over gRPC\n // New Relic uses OTLP endpoint with /v1/traces suffix\n const endpoint = config.endpoint || 'https://otlp.nr-data.net:443/v1/traces';\n\n return {\n endpoint,\n headers: {\n 'api-key': config.apiKey,\n },\n protocol: 'http/protobuf',\n };\n}\n\nfunction resolveTraceloopConfig(config: TraceloopConfig): ResolvedProviderConfig | null {\n if (!config.apiKey) {\n console.error('[OtelExporter] Traceloop configuration requires apiKey. Tracing will be disabled.');\n return null;\n }\n\n // Traceloop uses OTLP endpoint with /v1/traces suffix\n const endpoint = config.endpoint || 'https://api.traceloop.com/v1/traces';\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${config.apiKey}`,\n };\n\n if (config.destinationId) {\n headers['x-traceloop-destination-id'] = config.destinationId;\n }\n\n return {\n endpoint,\n headers,\n protocol: 'http/json',\n };\n}\n\nfunction resolveLaminarConfig(config: LaminarConfig): ResolvedProviderConfig | null {\n if (!config.apiKey) {\n console.error('[OtelExporter] Laminar configuration requires apiKey. Tracing will be disabled.');\n return null;\n }\n\n // Laminar uses OTLP endpoint with /v1/traces suffix for HTTP\n // They support both gRPC and HTTP, but we'll use HTTP for consistency\n const endpoint = config.endpoint || 'https://api.lmnr.ai/v1/traces';\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${config.apiKey}`,\n };\n\n // Only add team ID header if provided (for backwards compatibility)\n if (config.teamId) {\n headers['x-laminar-team-id'] = config.teamId;\n }\n\n return {\n endpoint,\n headers,\n protocol: 'http/protobuf', // Use HTTP/protobuf instead of gRPC for better compatibility\n };\n}\n\nfunction resolveCustomConfig(config: CustomConfig): ResolvedProviderConfig | null {\n if (!config.endpoint) {\n console.error('[OtelExporter] Custom configuration requires endpoint. Tracing will be disabled.');\n return null;\n }\n\n return {\n endpoint: config.endpoint,\n headers: config.headers || {},\n protocol: config.protocol || 'http/json',\n };\n}\n","/**\n * Custom OpenTelemetry span that preserves Mastra's trace and span IDs\n */\n\nimport type { AnyExportedAISpan } from '@mastra/core/observability';\nimport { SpanStatusCode, TraceFlags } from '@opentelemetry/api';\nimport type { SpanKind, SpanContext, SpanStatus, Attributes, Link } from '@opentelemetry/api';\nimport type { InstrumentationScope } from '@opentelemetry/core';\nimport type { Resource } from '@opentelemetry/resources';\nimport type { ReadableSpan, TimedEvent } from '@opentelemetry/sdk-trace-base';\n\n/**\n * A custom ReadableSpan implementation that preserves Mastra's IDs\n */\nexport class MastraReadableSpan implements ReadableSpan {\n readonly name: string;\n readonly kind: SpanKind;\n readonly spanContext: () => SpanContext;\n readonly parentSpanContext?: SpanContext;\n readonly parentSpanId?: string;\n readonly startTime: [number, number];\n readonly endTime: [number, number];\n readonly status: SpanStatus;\n readonly attributes: Attributes;\n readonly links: Link[];\n readonly events: TimedEvent[];\n readonly duration: [number, number];\n readonly ended: boolean;\n readonly resource: Resource;\n readonly instrumentationLibrary: InstrumentationScope;\n readonly instrumentationScope: InstrumentationScope;\n readonly droppedAttributesCount: number = 0;\n readonly droppedEventsCount: number = 0;\n readonly droppedLinksCount: number = 0;\n\n constructor(\n aiSpan: AnyExportedAISpan,\n attributes: Attributes,\n kind: SpanKind,\n parentSpanId?: string,\n resource?: Resource,\n instrumentationLibrary?: InstrumentationScope,\n ) {\n this.name = aiSpan.name;\n this.kind = kind;\n this.attributes = attributes;\n this.parentSpanId = parentSpanId;\n this.links = [];\n this.events = [];\n\n // Convert JavaScript Date to hrtime format [seconds, nanoseconds]\n this.startTime = this.dateToHrTime(aiSpan.startTime);\n this.endTime = aiSpan.endTime ? this.dateToHrTime(aiSpan.endTime) : this.startTime;\n this.ended = !!aiSpan.endTime;\n\n // Calculate duration\n if (aiSpan.endTime) {\n const durationMs = aiSpan.endTime.getTime() - aiSpan.startTime.getTime();\n this.duration = [Math.floor(durationMs / 1000), (durationMs % 1000) * 1000000];\n } else {\n this.duration = [0, 0];\n }\n\n // Set status based on error info\n if (aiSpan.errorInfo) {\n this.status = {\n code: SpanStatusCode.ERROR,\n message: aiSpan.errorInfo.message,\n };\n\n // Add error as event\n this.events.push({\n name: 'exception',\n attributes: {\n 'exception.message': aiSpan.errorInfo.message,\n 'exception.type': 'Error',\n ...(aiSpan.errorInfo.details?.stack && {\n 'exception.stacktrace': aiSpan.errorInfo.details.stack as string,\n }),\n },\n time: this.startTime,\n droppedAttributesCount: 0,\n });\n } else if (aiSpan.endTime) {\n this.status = { code: SpanStatusCode.OK };\n } else {\n this.status = { code: SpanStatusCode.UNSET };\n }\n\n // Add instant event if needed\n if (aiSpan.isEvent) {\n this.events.push({\n name: 'instant_event',\n attributes: {},\n time: this.startTime,\n droppedAttributesCount: 0,\n });\n }\n\n // Create span context with Mastra's IDs\n this.spanContext = () => ({\n traceId: aiSpan.traceId,\n spanId: aiSpan.id,\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n });\n\n // Set parent span context if parent span ID is provided\n if (parentSpanId) {\n this.parentSpanContext = {\n traceId: aiSpan.traceId,\n spanId: parentSpanId,\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n };\n }\n\n // Set resource and instrumentation library\n this.resource = resource || ({} as Resource);\n this.instrumentationLibrary = instrumentationLibrary || {\n name: '@mastra/otel',\n version: '1.0.0',\n };\n // instrumentationScope is the same as instrumentationLibrary\n this.instrumentationScope = this.instrumentationLibrary;\n }\n\n /**\n * Convert JavaScript Date to hrtime format\n */\n private dateToHrTime(date: Date): [number, number] {\n const ms = date.getTime();\n const seconds = Math.floor(ms / 1000);\n const nanoseconds = (ms % 1000) * 1000000;\n return [seconds, nanoseconds];\n }\n}\n","/**\n * Convert Mastra AI spans to OpenTelemetry spans\n */\n\nimport type {\n AnyExportedAISpan,\n ModelGenerationAttributes,\n AgentRunAttributes,\n ToolCallAttributes,\n MCPToolCallAttributes,\n WorkflowRunAttributes,\n} from '@mastra/core/observability';\nimport { AISpanType } from '@mastra/core/observability';\nimport { SpanKind } from '@opentelemetry/api';\nimport type { Attributes } from '@opentelemetry/api';\nimport type { InstrumentationScope } from '@opentelemetry/core';\nimport type { Resource } from '@opentelemetry/resources';\nimport { MastraReadableSpan } from './mastra-span.js';\n\n// Map Mastra span types to OpenTelemetry span kinds following OTEL conventions\n// Only non-INTERNAL mappings are specified - all others default to SpanKind.INTERNAL\nconst SPAN_KIND_MAPPING: Partial<Record<AISpanType, SpanKind>> = {\n // Model operations are CLIENT spans (calling external AI services)\n [AISpanType.MODEL_GENERATION]: SpanKind.CLIENT,\n [AISpanType.MODEL_CHUNK]: SpanKind.CLIENT,\n\n // MCP tool calls are CLIENT (external service calls)\n [AISpanType.MCP_TOOL_CALL]: SpanKind.CLIENT,\n\n // Root spans for agent/workflow are SERVER (entry points)\n [AISpanType.AGENT_RUN]: SpanKind.SERVER,\n [AISpanType.WORKFLOW_RUN]: SpanKind.SERVER,\n};\n\nexport class SpanConverter {\n private resource?: Resource;\n private instrumentationLibrary: InstrumentationScope;\n\n constructor(resource?: Resource) {\n this.resource = resource;\n this.instrumentationLibrary = {\n name: '@mastra/otel',\n version: '1.0.0',\n };\n }\n\n /**\n * Convert a Mastra AI span to an OpenTelemetry ReadableSpan\n * This preserves Mastra's trace and span IDs\n */\n convertSpan(aiSpan: AnyExportedAISpan): MastraReadableSpan {\n const spanKind = this.getSpanKind(aiSpan);\n const attributes = this.buildAttributes(aiSpan);\n const spanName = this.buildSpanName(aiSpan);\n\n // Create a new span with OTEL-compliant naming\n const otelSpan = { ...aiSpan, name: spanName };\n\n return new MastraReadableSpan(\n otelSpan,\n attributes,\n spanKind,\n aiSpan.parentSpanId, // Use the parentSpanId from the Mastra span directly\n this.resource,\n this.instrumentationLibrary,\n );\n }\n\n /**\n * Get the appropriate SpanKind based on span type and context\n */\n private getSpanKind(aiSpan: AnyExportedAISpan): SpanKind {\n // Root spans should be SERVER\n if (aiSpan.isRootSpan) {\n if (aiSpan.type === AISpanType.AGENT_RUN || aiSpan.type === AISpanType.WORKFLOW_RUN) {\n return SpanKind.SERVER;\n }\n }\n return SPAN_KIND_MAPPING[aiSpan.type] || SpanKind.INTERNAL;\n }\n\n /**\n * Build OTEL-compliant span name based on span type and attributes\n */\n private buildSpanName(aiSpan: AnyExportedAISpan): string {\n switch (aiSpan.type) {\n case AISpanType.MODEL_GENERATION: {\n const attrs = aiSpan.attributes as ModelGenerationAttributes;\n const operation = attrs?.resultType === 'tool_selection' ? 'tool_selection' : 'chat';\n const model = attrs?.model || 'unknown';\n return `${operation} ${model}`;\n }\n\n case AISpanType.TOOL_CALL:\n case AISpanType.MCP_TOOL_CALL: {\n const toolAttrs = aiSpan.attributes as ToolCallAttributes | MCPToolCallAttributes;\n const toolName = toolAttrs?.toolId || 'unknown';\n return `tool.execute ${toolName}`;\n }\n\n case AISpanType.AGENT_RUN: {\n const agentAttrs = aiSpan.attributes as AgentRunAttributes;\n const agentId = agentAttrs?.agentId || 'unknown';\n return `agent.${agentId}`;\n }\n\n case AISpanType.WORKFLOW_RUN: {\n const workflowAttrs = aiSpan.attributes as WorkflowRunAttributes;\n const workflowId = workflowAttrs?.workflowId || 'unknown';\n return `workflow.${workflowId}`;\n }\n\n case AISpanType.WORKFLOW_STEP:\n // Keep the original name as it's likely descriptive\n return aiSpan.name;\n\n default:\n // For other types, use a simplified version of the original name\n return aiSpan.name;\n }\n }\n\n /**\n * Build OpenTelemetry attributes from Mastra AI span\n * Following OTEL Semantic Conventions for GenAI\n */\n private buildAttributes(aiSpan: AnyExportedAISpan): Attributes {\n const attributes: Attributes = {};\n\n // Add gen_ai.operation.name based on span type\n attributes['gen_ai.operation.name'] = this.getOperationName(aiSpan);\n\n // Add span kind semantic attribute\n attributes['span.kind'] = this.getSpanKindString(aiSpan);\n\n // Add span type for better visibility\n attributes['mastra.span.type'] = aiSpan.type;\n\n // Add trace and span IDs for debugging\n attributes['mastra.trace_id'] = aiSpan.traceId;\n attributes['mastra.span_id'] = aiSpan.id;\n if (aiSpan.parentSpanId) {\n attributes['mastra.parent_span_id'] = aiSpan.parentSpanId;\n }\n\n // Handle input/output based on span type\n // Always add input/output for Laminar compatibility\n if (aiSpan.input !== undefined) {\n const inputStr = typeof aiSpan.input === 'string' ? aiSpan.input : JSON.stringify(aiSpan.input);\n // Add generic input for all providers\n attributes['input'] = inputStr;\n\n // Add specific attributes based on span type\n if (aiSpan.type === AISpanType.MODEL_GENERATION) {\n attributes['gen_ai.prompt'] = inputStr;\n } else if (aiSpan.type === AISpanType.TOOL_CALL || aiSpan.type === AISpanType.MCP_TOOL_CALL) {\n attributes['gen_ai.tool.input'] = inputStr;\n }\n }\n\n if (aiSpan.output !== undefined) {\n const outputStr = typeof aiSpan.output === 'string' ? aiSpan.output : JSON.stringify(aiSpan.output);\n // Add generic output for all providers\n attributes['output'] = outputStr;\n\n // Add specific attributes based on span type\n if (aiSpan.type === AISpanType.MODEL_GENERATION) {\n attributes['gen_ai.completion'] = outputStr;\n } else if (aiSpan.type === AISpanType.TOOL_CALL || aiSpan.type === AISpanType.MCP_TOOL_CALL) {\n attributes['gen_ai.tool.output'] = outputStr;\n }\n }\n\n // Add model-specific attributes using OTEL semantic conventions\n if (aiSpan.type === AISpanType.MODEL_GENERATION && aiSpan.attributes) {\n const modelAttrs = aiSpan.attributes as ModelGenerationAttributes;\n\n // Model and provider\n if (modelAttrs.model) {\n attributes['gen_ai.request.model'] = modelAttrs.model;\n }\n\n if (modelAttrs.provider) {\n attributes['gen_ai.system'] = modelAttrs.provider;\n }\n\n // Token usage - use OTEL standard naming\n if (modelAttrs.usage) {\n // Handle both v5 format (inputTokens/outputTokens) and legacy format (promptTokens/completionTokens)\n const inputTokens = modelAttrs.usage.inputTokens ?? modelAttrs.usage.promptTokens;\n const outputTokens = modelAttrs.usage.outputTokens ?? modelAttrs.usage.completionTokens;\n\n if (inputTokens !== undefined) {\n attributes['gen_ai.usage.input_tokens'] = inputTokens;\n }\n if (outputTokens !== undefined) {\n attributes['gen_ai.usage.output_tokens'] = outputTokens;\n }\n if (modelAttrs.usage.totalTokens !== undefined) {\n attributes['gen_ai.usage.total_tokens'] = modelAttrs.usage.totalTokens;\n }\n\n // Add other token metrics if present\n if (modelAttrs.usage.reasoningTokens !== undefined) {\n attributes['gen_ai.usage.reasoning_tokens'] = modelAttrs.usage.reasoningTokens;\n }\n if (modelAttrs.usage.cachedInputTokens !== undefined) {\n attributes['gen_ai.usage.cached_input_tokens'] = modelAttrs.usage.cachedInputTokens;\n }\n }\n\n // Parameters using OTEL conventions\n if (modelAttrs.parameters) {\n if (modelAttrs.parameters.temperature !== undefined) {\n attributes['gen_ai.request.temperature'] = modelAttrs.parameters.temperature;\n }\n if (modelAttrs.parameters.maxOutputTokens !== undefined) {\n attributes['gen_ai.request.max_tokens'] = modelAttrs.parameters.maxOutputTokens;\n }\n if (modelAttrs.parameters.topP !== undefined) {\n attributes['gen_ai.request.top_p'] = modelAttrs.parameters.topP;\n }\n if (modelAttrs.parameters.topK !== undefined) {\n attributes['gen_ai.request.top_k'] = modelAttrs.parameters.topK;\n }\n if (modelAttrs.parameters.presencePenalty !== undefined) {\n attributes['gen_ai.request.presence_penalty'] = modelAttrs.parameters.presencePenalty;\n }\n if (modelAttrs.parameters.frequencyPenalty !== undefined) {\n attributes['gen_ai.request.frequency_penalty'] = modelAttrs.parameters.frequencyPenalty;\n }\n if (modelAttrs.parameters.stopSequences) {\n attributes['gen_ai.request.stop_sequences'] = JSON.stringify(modelAttrs.parameters.stopSequences);\n }\n }\n\n // Response attributes\n if (modelAttrs.finishReason) {\n attributes['gen_ai.response.finish_reasons'] = modelAttrs.finishReason;\n }\n }\n\n // Add tool-specific attributes using OTEL conventions\n if ((aiSpan.type === AISpanType.TOOL_CALL || aiSpan.type === AISpanType.MCP_TOOL_CALL) && aiSpan.attributes) {\n const toolAttrs = aiSpan.attributes as ToolCallAttributes | MCPToolCallAttributes;\n\n // Tool identification\n if (toolAttrs.toolId) {\n attributes['gen_ai.tool.name'] = toolAttrs.toolId;\n }\n\n // MCP-specific attributes\n if (aiSpan.type === AISpanType.MCP_TOOL_CALL) {\n const mcpAttrs = toolAttrs as MCPToolCallAttributes;\n if (mcpAttrs.mcpServer) {\n attributes['mcp.server'] = mcpAttrs.mcpServer;\n }\n if (mcpAttrs.serverVersion) {\n attributes['mcp.server.version'] = mcpAttrs.serverVersion;\n }\n } else {\n if ((toolAttrs as ToolCallAttributes).toolDescription) {\n attributes['gen_ai.tool.description'] = (toolAttrs as ToolCallAttributes).toolDescription;\n }\n }\n\n // Tool execution result\n if (toolAttrs.success !== undefined) {\n attributes['gen_ai.tool.success'] = toolAttrs.success;\n }\n }\n\n // Add agent-specific attributes\n if (aiSpan.type === AISpanType.AGENT_RUN && aiSpan.attributes) {\n const agentAttrs = aiSpan.attributes as AgentRunAttributes;\n if (agentAttrs.agentId) {\n attributes['agent.id'] = agentAttrs.agentId;\n attributes['gen_ai.agent.id'] = agentAttrs.agentId;\n }\n if (agentAttrs.maxSteps) {\n attributes['agent.max_steps'] = agentAttrs.maxSteps;\n }\n if (agentAttrs.availableTools) {\n attributes['agent.available_tools'] = JSON.stringify(agentAttrs.availableTools);\n }\n }\n\n // Add workflow-specific attributes\n if (aiSpan.type === AISpanType.WORKFLOW_RUN && aiSpan.attributes) {\n const workflowAttrs = aiSpan.attributes as WorkflowRunAttributes;\n if (workflowAttrs.workflowId) {\n attributes['workflow.id'] = workflowAttrs.workflowId;\n }\n if (workflowAttrs.status) {\n attributes['workflow.status'] = workflowAttrs.status;\n }\n }\n\n // Add error information if present\n if (aiSpan.errorInfo) {\n attributes['error'] = true;\n attributes['error.type'] = aiSpan.errorInfo.id || 'unknown';\n attributes['error.message'] = aiSpan.errorInfo.message;\n if (aiSpan.errorInfo.domain) {\n attributes['error.domain'] = aiSpan.errorInfo.domain;\n }\n if (aiSpan.errorInfo.category) {\n attributes['error.category'] = aiSpan.errorInfo.category;\n }\n }\n\n // Add metadata as custom attributes with proper typing\n if (aiSpan.metadata) {\n Object.entries(aiSpan.metadata).forEach(([key, value]) => {\n // Skip if attribute already exists\n if (!attributes[key]) {\n // Ensure value is a valid OTEL attribute type\n if (value === null || value === undefined) {\n return;\n }\n if (typeof value === 'object') {\n attributes[key] = JSON.stringify(value);\n } else {\n attributes[key] = value;\n }\n }\n });\n }\n\n // Add timing information\n if (aiSpan.startTime) {\n attributes['mastra.start_time'] = aiSpan.startTime.toISOString();\n }\n if (aiSpan.endTime) {\n attributes['mastra.end_time'] = aiSpan.endTime.toISOString();\n const duration = aiSpan.endTime.getTime() - aiSpan.startTime.getTime();\n attributes['mastra.duration_ms'] = duration;\n }\n\n return attributes;\n }\n\n /**\n * Get the operation name based on span type for gen_ai.operation.name\n */\n private getOperationName(aiSpan: AnyExportedAISpan): string {\n switch (aiSpan.type) {\n case AISpanType.MODEL_GENERATION: {\n const attrs = aiSpan.attributes as ModelGenerationAttributes;\n return attrs?.resultType === 'tool_selection' ? 'tool_selection' : 'chat';\n }\n case AISpanType.TOOL_CALL:\n case AISpanType.MCP_TOOL_CALL:\n return 'tool.execute';\n case AISpanType.AGENT_RUN:\n return 'agent.run';\n case AISpanType.WORKFLOW_RUN:\n return 'workflow.run';\n default:\n return aiSpan.type.replace(/_/g, '.');\n }\n }\n\n /**\n * Get span kind as string for attribute\n */\n private getSpanKindString(aiSpan: AnyExportedAISpan): string {\n const kind = this.getSpanKind(aiSpan);\n switch (kind) {\n case SpanKind.SERVER:\n return 'server';\n case SpanKind.CLIENT:\n return 'client';\n case SpanKind.INTERNAL:\n return 'internal';\n case SpanKind.PRODUCER:\n return 'producer';\n case SpanKind.CONSUMER:\n return 'consumer';\n default:\n return 'internal';\n }\n }\n}\n","/**\n * OpenTelemetry AI Tracing Exporter for Mastra\n */\n\nimport type { AITracingEvent, AnyExportedAISpan, InitExporterOptions, TracingConfig } from '@mastra/core/observability';\nimport { AITracingEventType } from '@mastra/core/observability';\nimport { BaseExporter } from '@mastra/observability';\nimport { diag, DiagConsoleLogger, DiagLogLevel } from '@opentelemetry/api';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport type { SpanExporter } from '@opentelemetry/sdk-trace-base';\nimport {\n ATTR_SERVICE_NAME,\n ATTR_SERVICE_VERSION,\n ATTR_TELEMETRY_SDK_LANGUAGE,\n ATTR_TELEMETRY_SDK_NAME,\n ATTR_TELEMETRY_SDK_VERSION,\n} from '@opentelemetry/semantic-conventions';\n\nimport { loadExporter } from './loadExporter.js';\nimport { resolveProviderConfig } from './provider-configs.js';\nimport { SpanConverter } from './span-converter.js';\nimport type { OtelExporterConfig } from './types.js';\n\nexport class OtelExporter extends BaseExporter {\n private config: OtelExporterConfig;\n private tracingConfig?: TracingConfig;\n private spanConverter: SpanConverter;\n private processor?: BatchSpanProcessor;\n private exporter?: SpanExporter;\n private isSetup: boolean = false;\n\n name = 'opentelemetry';\n\n constructor(config: OtelExporterConfig) {\n super(config);\n\n this.config = config;\n this.spanConverter = new SpanConverter();\n\n // Set up OpenTelemetry diagnostics if debug mode\n if (config.logLevel === 'debug') {\n diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.DEBUG);\n }\n }\n\n /**\n * Initialize with tracing configuration\n */\n init(options: InitExporterOptions) {\n this.tracingConfig = options.config;\n }\n\n private async setupExporter() {\n // already setup or exporter already set\n if (this.isSetup || this.exporter) return;\n\n // Provider configuration is required\n if (!this.config.provider) {\n this.logger.error(\n '[OtelExporter] Provider configuration is required. Use the \"custom\" provider for generic endpoints.',\n );\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n // Resolve provider configuration\n const resolved = resolveProviderConfig(this.config.provider);\n if (!resolved) {\n // Configuration validation failed, disable tracing\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n // user provided an instantiated SpanExporter, use it\n if (this.config.exporter) {\n this.exporter = this.config.exporter;\n return;\n }\n\n const endpoint = resolved.endpoint;\n const headers = resolved.headers;\n const protocol = resolved.protocol;\n\n // Load and create the appropriate exporter based on protocol\n const providerName = Object.keys(this.config.provider)[0];\n const ExporterClass = await loadExporter(protocol, providerName);\n\n if (!ExporterClass) {\n // Exporter not available, disable tracing\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n try {\n if (protocol === 'zipkin') {\n this.exporter = new ExporterClass({\n url: endpoint,\n headers,\n });\n } else if (protocol === 'grpc') {\n // gRPC uses Metadata object instead of headers\n // Dynamically import @grpc/grpc-js to create metadata\n let metadata: any;\n try {\n // @ts-ignore - Dynamic import for optional dependency\n const grpcModule = await import('@grpc/grpc-js');\n metadata = new grpcModule.Metadata();\n Object.entries(headers).forEach(([key, value]) => {\n metadata.set(key, value);\n });\n } catch (grpcError) {\n this.logger.error(\n `[OtelExporter] Failed to load gRPC metadata. Install required packages:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-grpc @grpc/grpc-js\\n`,\n grpcError,\n );\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n this.exporter = new ExporterClass({\n url: endpoint,\n metadata,\n timeoutMillis: this.config.timeout,\n });\n } else {\n // HTTP/JSON and HTTP/Protobuf use headers\n this.exporter = new ExporterClass({\n url: endpoint,\n headers,\n timeoutMillis: this.config.timeout,\n });\n }\n } catch (error) {\n this.logger.error(`[OtelExporter] Failed to create exporter:`, error);\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n }\n\n private async setupProcessor() {\n if (this.processor || this.isSetup) return;\n\n // Create resource with service name from TracingConfig\n let resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: this.tracingConfig?.serviceName || 'mastra-service',\n [ATTR_SERVICE_VERSION]: '1.0.0',\n // Add telemetry SDK information\n [ATTR_TELEMETRY_SDK_NAME]: '@mastra/otel-exporter',\n [ATTR_TELEMETRY_SDK_VERSION]: '1.0.0',\n [ATTR_TELEMETRY_SDK_LANGUAGE]: 'nodejs',\n });\n\n if (this.config.resourceAttributes) {\n resource = resource.merge(\n // Duplicate attributes from config will override defaults above\n resourceFromAttributes(this.config.resourceAttributes),\n );\n }\n\n // Store the resource in the genai span converter\n this.spanConverter = new SpanConverter(resource);\n\n // Always use BatchSpanProcessor for production\n // It queues spans and exports them in batches for better performance\n this.processor = new BatchSpanProcessor(this.exporter!, {\n maxExportBatchSize: this.config.batchSize || 512, // Default batch size\n maxQueueSize: 2048, // Maximum spans to queue\n scheduledDelayMillis: 5000, // Export every 5 seconds\n exportTimeoutMillis: this.config.timeout || 30000, // Export timeout\n });\n\n this.logger.debug(\n `[OtelExporter] Using BatchSpanProcessor (batch size: ${this.config.batchSize || 512}, delay: 5s)`,\n );\n }\n\n private async setup() {\n if (this.isSetup) return;\n await this.setupExporter();\n await this.setupProcessor();\n this.isSetup = true;\n }\n\n protected async _exportEvent(event: AITracingEvent): Promise<void> {\n // Only process SPAN_ENDED events for OTEL\n // OTEL expects complete spans with start and end times\n if (event.type !== AITracingEventType.SPAN_ENDED) {\n return;\n }\n\n const span = event.exportedSpan;\n await this.exportSpan(span);\n }\n\n private async exportSpan(span: AnyExportedAISpan): Promise<void> {\n // Ensure exporter is set up\n if (!this.isSetup) {\n await this.setup();\n }\n\n // Skip if disabled\n if (this.isDisabled || !this.processor) {\n return;\n }\n\n try {\n // Convert the span to OTEL format\n const readableSpan = this.spanConverter.convertSpan(span);\n\n // Export the span immediately through the processor\n // The processor will handle batching if configured\n await new Promise<void>(resolve => {\n this.processor!.onEnd(readableSpan);\n resolve();\n });\n\n this.logger.debug(\n `[OtelExporter] Exported span ${span.id} (trace: ${span.traceId}, parent: ${span.parentSpanId || 'none'}, type: ${span.type})`,\n );\n } catch (error) {\n this.logger.error(`[OtelExporter] Failed to export span ${span.id}:`, error);\n }\n }\n\n async shutdown(): Promise<void> {\n // Shutdown the processor to flush any remaining spans\n if (this.processor) {\n await this.processor.shutdown();\n }\n }\n}\n"]}
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { AITracingEventType, AISpanType } from '@mastra/core/ai-tracing';
2
- import { ConsoleLogger } from '@mastra/core/logger';
1
+ import { AITracingEventType, AISpanType } from '@mastra/core/observability';
2
+ import { BaseExporter } from '@mastra/observability';
3
3
  import { diag, DiagConsoleLogger, DiagLogLevel, SpanKind, SpanStatusCode, TraceFlags } from '@opentelemetry/api';
4
4
  import { resourceFromAttributes } from '@opentelemetry/resources';
5
5
  import { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';
@@ -207,6 +207,7 @@ var MastraReadableSpan = class {
207
207
  name;
208
208
  kind;
209
209
  spanContext;
210
+ parentSpanContext;
210
211
  parentSpanId;
211
212
  startTime;
212
213
  endTime;
@@ -274,6 +275,14 @@ var MastraReadableSpan = class {
274
275
  traceFlags: TraceFlags.SAMPLED,
275
276
  isRemote: false
276
277
  });
278
+ if (parentSpanId) {
279
+ this.parentSpanContext = {
280
+ traceId: aiSpan.traceId,
281
+ spanId: parentSpanId,
282
+ traceFlags: TraceFlags.SAMPLED,
283
+ isRemote: false
284
+ };
285
+ }
277
286
  this.resource = resource || {};
278
287
  this.instrumentationLibrary = instrumentationLibrary || {
279
288
  name: "@mastra/otel",
@@ -294,9 +303,9 @@ var MastraReadableSpan = class {
294
303
 
295
304
  // src/span-converter.ts
296
305
  var SPAN_KIND_MAPPING = {
297
- // LLM operations are CLIENT spans (calling external AI services)
298
- [AISpanType.LLM_GENERATION]: SpanKind.CLIENT,
299
- [AISpanType.LLM_CHUNK]: SpanKind.CLIENT,
306
+ // Model operations are CLIENT spans (calling external AI services)
307
+ [AISpanType.MODEL_GENERATION]: SpanKind.CLIENT,
308
+ [AISpanType.MODEL_CHUNK]: SpanKind.CLIENT,
300
309
  // MCP tool calls are CLIENT (external service calls)
301
310
  [AISpanType.MCP_TOOL_CALL]: SpanKind.CLIENT,
302
311
  // Root spans for agent/workflow are SERVER (entry points)
@@ -348,7 +357,7 @@ var SpanConverter = class {
348
357
  */
349
358
  buildSpanName(aiSpan) {
350
359
  switch (aiSpan.type) {
351
- case AISpanType.LLM_GENERATION: {
360
+ case AISpanType.MODEL_GENERATION: {
352
361
  const attrs = aiSpan.attributes;
353
362
  const operation = attrs?.resultType === "tool_selection" ? "tool_selection" : "chat";
354
363
  const model = attrs?.model || "unknown";
@@ -393,7 +402,7 @@ var SpanConverter = class {
393
402
  if (aiSpan.input !== void 0) {
394
403
  const inputStr = typeof aiSpan.input === "string" ? aiSpan.input : JSON.stringify(aiSpan.input);
395
404
  attributes["input"] = inputStr;
396
- if (aiSpan.type === AISpanType.LLM_GENERATION) {
405
+ if (aiSpan.type === AISpanType.MODEL_GENERATION) {
397
406
  attributes["gen_ai.prompt"] = inputStr;
398
407
  } else if (aiSpan.type === AISpanType.TOOL_CALL || aiSpan.type === AISpanType.MCP_TOOL_CALL) {
399
408
  attributes["gen_ai.tool.input"] = inputStr;
@@ -402,64 +411,64 @@ var SpanConverter = class {
402
411
  if (aiSpan.output !== void 0) {
403
412
  const outputStr = typeof aiSpan.output === "string" ? aiSpan.output : JSON.stringify(aiSpan.output);
404
413
  attributes["output"] = outputStr;
405
- if (aiSpan.type === AISpanType.LLM_GENERATION) {
414
+ if (aiSpan.type === AISpanType.MODEL_GENERATION) {
406
415
  attributes["gen_ai.completion"] = outputStr;
407
416
  } else if (aiSpan.type === AISpanType.TOOL_CALL || aiSpan.type === AISpanType.MCP_TOOL_CALL) {
408
417
  attributes["gen_ai.tool.output"] = outputStr;
409
418
  }
410
419
  }
411
- if (aiSpan.type === AISpanType.LLM_GENERATION && aiSpan.attributes) {
412
- const llmAttrs = aiSpan.attributes;
413
- if (llmAttrs.model) {
414
- attributes["gen_ai.request.model"] = llmAttrs.model;
420
+ if (aiSpan.type === AISpanType.MODEL_GENERATION && aiSpan.attributes) {
421
+ const modelAttrs = aiSpan.attributes;
422
+ if (modelAttrs.model) {
423
+ attributes["gen_ai.request.model"] = modelAttrs.model;
415
424
  }
416
- if (llmAttrs.provider) {
417
- attributes["gen_ai.system"] = llmAttrs.provider;
425
+ if (modelAttrs.provider) {
426
+ attributes["gen_ai.system"] = modelAttrs.provider;
418
427
  }
419
- if (llmAttrs.usage) {
420
- const inputTokens = llmAttrs.usage.inputTokens ?? llmAttrs.usage.promptTokens;
421
- const outputTokens = llmAttrs.usage.outputTokens ?? llmAttrs.usage.completionTokens;
428
+ if (modelAttrs.usage) {
429
+ const inputTokens = modelAttrs.usage.inputTokens ?? modelAttrs.usage.promptTokens;
430
+ const outputTokens = modelAttrs.usage.outputTokens ?? modelAttrs.usage.completionTokens;
422
431
  if (inputTokens !== void 0) {
423
432
  attributes["gen_ai.usage.input_tokens"] = inputTokens;
424
433
  }
425
434
  if (outputTokens !== void 0) {
426
435
  attributes["gen_ai.usage.output_tokens"] = outputTokens;
427
436
  }
428
- if (llmAttrs.usage.totalTokens !== void 0) {
429
- attributes["gen_ai.usage.total_tokens"] = llmAttrs.usage.totalTokens;
437
+ if (modelAttrs.usage.totalTokens !== void 0) {
438
+ attributes["gen_ai.usage.total_tokens"] = modelAttrs.usage.totalTokens;
430
439
  }
431
- if (llmAttrs.usage.reasoningTokens !== void 0) {
432
- attributes["gen_ai.usage.reasoning_tokens"] = llmAttrs.usage.reasoningTokens;
440
+ if (modelAttrs.usage.reasoningTokens !== void 0) {
441
+ attributes["gen_ai.usage.reasoning_tokens"] = modelAttrs.usage.reasoningTokens;
433
442
  }
434
- if (llmAttrs.usage.cachedInputTokens !== void 0) {
435
- attributes["gen_ai.usage.cached_input_tokens"] = llmAttrs.usage.cachedInputTokens;
443
+ if (modelAttrs.usage.cachedInputTokens !== void 0) {
444
+ attributes["gen_ai.usage.cached_input_tokens"] = modelAttrs.usage.cachedInputTokens;
436
445
  }
437
446
  }
438
- if (llmAttrs.parameters) {
439
- if (llmAttrs.parameters.temperature !== void 0) {
440
- attributes["gen_ai.request.temperature"] = llmAttrs.parameters.temperature;
447
+ if (modelAttrs.parameters) {
448
+ if (modelAttrs.parameters.temperature !== void 0) {
449
+ attributes["gen_ai.request.temperature"] = modelAttrs.parameters.temperature;
441
450
  }
442
- if (llmAttrs.parameters.maxOutputTokens !== void 0) {
443
- attributes["gen_ai.request.max_tokens"] = llmAttrs.parameters.maxOutputTokens;
451
+ if (modelAttrs.parameters.maxOutputTokens !== void 0) {
452
+ attributes["gen_ai.request.max_tokens"] = modelAttrs.parameters.maxOutputTokens;
444
453
  }
445
- if (llmAttrs.parameters.topP !== void 0) {
446
- attributes["gen_ai.request.top_p"] = llmAttrs.parameters.topP;
454
+ if (modelAttrs.parameters.topP !== void 0) {
455
+ attributes["gen_ai.request.top_p"] = modelAttrs.parameters.topP;
447
456
  }
448
- if (llmAttrs.parameters.topK !== void 0) {
449
- attributes["gen_ai.request.top_k"] = llmAttrs.parameters.topK;
457
+ if (modelAttrs.parameters.topK !== void 0) {
458
+ attributes["gen_ai.request.top_k"] = modelAttrs.parameters.topK;
450
459
  }
451
- if (llmAttrs.parameters.presencePenalty !== void 0) {
452
- attributes["gen_ai.request.presence_penalty"] = llmAttrs.parameters.presencePenalty;
460
+ if (modelAttrs.parameters.presencePenalty !== void 0) {
461
+ attributes["gen_ai.request.presence_penalty"] = modelAttrs.parameters.presencePenalty;
453
462
  }
454
- if (llmAttrs.parameters.frequencyPenalty !== void 0) {
455
- attributes["gen_ai.request.frequency_penalty"] = llmAttrs.parameters.frequencyPenalty;
463
+ if (modelAttrs.parameters.frequencyPenalty !== void 0) {
464
+ attributes["gen_ai.request.frequency_penalty"] = modelAttrs.parameters.frequencyPenalty;
456
465
  }
457
- if (llmAttrs.parameters.stopSequences) {
458
- attributes["gen_ai.request.stop_sequences"] = JSON.stringify(llmAttrs.parameters.stopSequences);
466
+ if (modelAttrs.parameters.stopSequences) {
467
+ attributes["gen_ai.request.stop_sequences"] = JSON.stringify(modelAttrs.parameters.stopSequences);
459
468
  }
460
469
  }
461
- if (llmAttrs.finishReason) {
462
- attributes["gen_ai.response.finish_reasons"] = llmAttrs.finishReason;
470
+ if (modelAttrs.finishReason) {
471
+ attributes["gen_ai.response.finish_reasons"] = modelAttrs.finishReason;
463
472
  }
464
473
  }
465
474
  if ((aiSpan.type === AISpanType.TOOL_CALL || aiSpan.type === AISpanType.MCP_TOOL_CALL) && aiSpan.attributes) {
@@ -488,6 +497,7 @@ var SpanConverter = class {
488
497
  const agentAttrs = aiSpan.attributes;
489
498
  if (agentAttrs.agentId) {
490
499
  attributes["agent.id"] = agentAttrs.agentId;
500
+ attributes["gen_ai.agent.id"] = agentAttrs.agentId;
491
501
  }
492
502
  if (agentAttrs.maxSteps) {
493
503
  attributes["agent.max_steps"] = agentAttrs.maxSteps;
@@ -545,7 +555,7 @@ var SpanConverter = class {
545
555
  */
546
556
  getOperationName(aiSpan) {
547
557
  switch (aiSpan.type) {
548
- case AISpanType.LLM_GENERATION: {
558
+ case AISpanType.MODEL_GENERATION: {
549
559
  const attrs = aiSpan.attributes;
550
560
  return attrs?.resultType === "tool_selection" ? "tool_selection" : "chat";
551
561
  }
@@ -583,20 +593,18 @@ var SpanConverter = class {
583
593
  };
584
594
 
585
595
  // src/ai-tracing.ts
586
- var OtelExporter = class {
596
+ var OtelExporter = class extends BaseExporter {
587
597
  config;
588
598
  tracingConfig;
589
599
  spanConverter;
590
600
  processor;
591
601
  exporter;
592
602
  isSetup = false;
593
- isDisabled = false;
594
- logger;
595
603
  name = "opentelemetry";
596
604
  constructor(config) {
605
+ super(config);
597
606
  this.config = config;
598
607
  this.spanConverter = new SpanConverter();
599
- this.logger = new ConsoleLogger({ level: config.logLevel ?? "warn" });
600
608
  if (config.logLevel === "debug") {
601
609
  diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.DEBUG);
602
610
  }
@@ -604,11 +612,11 @@ var OtelExporter = class {
604
612
  /**
605
613
  * Initialize with tracing configuration
606
614
  */
607
- init(config) {
608
- this.tracingConfig = config;
615
+ init(options) {
616
+ this.tracingConfig = options.config;
609
617
  }
610
618
  async setupExporter() {
611
- if (this.isSetup) return;
619
+ if (this.isSetup || this.exporter) return;
612
620
  if (!this.config.provider) {
613
621
  this.logger.error(
614
622
  '[OtelExporter] Provider configuration is required. Use the "custom" provider for generic endpoints.'
@@ -623,6 +631,10 @@ var OtelExporter = class {
623
631
  this.isSetup = true;
624
632
  return;
625
633
  }
634
+ if (this.config.exporter) {
635
+ this.exporter = this.config.exporter;
636
+ return;
637
+ }
626
638
  const endpoint = resolved.endpoint;
627
639
  const headers = resolved.headers;
628
640
  const protocol = resolved.protocol;
@@ -676,6 +688,9 @@ var OtelExporter = class {
676
688
  this.isSetup = true;
677
689
  return;
678
690
  }
691
+ }
692
+ async setupProcessor() {
693
+ if (this.processor || this.isSetup) return;
679
694
  let resource = resourceFromAttributes({
680
695
  [ATTR_SERVICE_NAME]: this.tracingConfig?.serviceName || "mastra-service",
681
696
  [ATTR_SERVICE_VERSION]: "1.0.0",
@@ -704,12 +719,14 @@ var OtelExporter = class {
704
719
  this.logger.debug(
705
720
  `[OtelExporter] Using BatchSpanProcessor (batch size: ${this.config.batchSize || 512}, delay: 5s)`
706
721
  );
722
+ }
723
+ async setup() {
724
+ if (this.isSetup) return;
725
+ await this.setupExporter();
726
+ await this.setupProcessor();
707
727
  this.isSetup = true;
708
728
  }
709
- async exportEvent(event) {
710
- if (this.isDisabled) {
711
- return;
712
- }
729
+ async _exportEvent(event) {
713
730
  if (event.type !== AITracingEventType.SPAN_ENDED) {
714
731
  return;
715
732
  }
@@ -718,7 +735,7 @@ var OtelExporter = class {
718
735
  }
719
736
  async exportSpan(span) {
720
737
  if (!this.isSetup) {
721
- await this.setupExporter();
738
+ await this.setup();
722
739
  }
723
740
  if (this.isDisabled || !this.processor) {
724
741
  return;