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