@mastra/otel-exporter 1.0.0-beta.3 → 1.0.0-beta.5
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 +19 -0
- package/dist/gen-ai-semantics.d.ts +19 -1
- package/dist/gen-ai-semantics.d.ts.map +1 -1
- package/dist/index.cjs +32 -15
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +33 -16
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# @mastra/otel-exporter
|
|
2
2
|
|
|
3
|
+
## 1.0.0-beta.5
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Fixed CachedToken tracking in all Observability Exporters. Also fixed TimeToFirstToken in Langfuse, Braintrust, PostHog exporters. Fixed trace formatting in Posthog Exporter. ([#11029](https://github.com/mastra-ai/mastra/pull/11029))
|
|
8
|
+
|
|
9
|
+
- Updated dependencies [[`edb07e4`](https://github.com/mastra-ai/mastra/commit/edb07e49283e0c28bd094a60e03439bf6ecf0221), [`b7e17d3`](https://github.com/mastra-ai/mastra/commit/b7e17d3f5390bb5a71efc112204413656fcdc18d), [`261473a`](https://github.com/mastra-ai/mastra/commit/261473ac637e633064a22076671e2e02b002214d), [`5d7000f`](https://github.com/mastra-ai/mastra/commit/5d7000f757cd65ea9dc5b05e662fd83dfd44e932), [`4f0331a`](https://github.com/mastra-ai/mastra/commit/4f0331a79bf6eb5ee598a5086e55de4b5a0ada03), [`8a000da`](https://github.com/mastra-ai/mastra/commit/8a000da0c09c679a2312f6b3aa05b2ca78ca7393)]:
|
|
10
|
+
- @mastra/core@1.0.0-beta.10
|
|
11
|
+
- @mastra/observability@1.0.0-beta.4
|
|
12
|
+
|
|
13
|
+
## 1.0.0-beta.4
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- Add agentId and agentName attributes to MODEL_GENERATION spans. This allows users to correlate gen_ai.usage metrics with specific agents when analyzing LLM operation spans. The attributes are exported as gen_ai.agent.id and gen_ai.agent.name in the OtelExporter. ([#10984](https://github.com/mastra-ai/mastra/pull/10984))
|
|
18
|
+
|
|
19
|
+
- Updated dependencies [[`72df8ae`](https://github.com/mastra-ai/mastra/commit/72df8ae595584cdd7747d5c39ffaca45e4507227), [`9198899`](https://github.com/mastra-ai/mastra/commit/91988995c427b185c33714b7f3be955367911324), [`653e65a`](https://github.com/mastra-ai/mastra/commit/653e65ae1f9502c2958a32f47a5a2df11e612a92), [`c6fd6fe`](https://github.com/mastra-ai/mastra/commit/c6fd6fedd09e9cf8004b03a80925f5e94826ad7e), [`0bed332`](https://github.com/mastra-ai/mastra/commit/0bed332843f627202c6520eaf671771313cd20f3)]:
|
|
20
|
+
- @mastra/core@1.0.0-beta.9
|
|
21
|
+
|
|
3
22
|
## 1.0.0-beta.3
|
|
4
23
|
|
|
5
24
|
### Patch Changes
|
|
@@ -8,8 +8,26 @@
|
|
|
8
8
|
* @see https://opentelemetry.io/docs/specs/semconv/gen-ai/non-normative/examples-llm-calls/
|
|
9
9
|
* @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/
|
|
10
10
|
*/
|
|
11
|
-
import type { AnyExportedSpan } from '@mastra/core/observability';
|
|
11
|
+
import type { AnyExportedSpan, UsageStats } from '@mastra/core/observability';
|
|
12
12
|
import type { Attributes } from '@opentelemetry/api';
|
|
13
|
+
import { ATTR_GEN_AI_USAGE_INPUT_TOKENS, ATTR_GEN_AI_USAGE_OUTPUT_TOKENS } from '@opentelemetry/semantic-conventions/incubating';
|
|
14
|
+
/**
|
|
15
|
+
* Token usage attributes following OTel GenAI semantic conventions.
|
|
16
|
+
* @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-spans/
|
|
17
|
+
*/
|
|
18
|
+
export interface OtelUsageMetrics {
|
|
19
|
+
[ATTR_GEN_AI_USAGE_INPUT_TOKENS]?: number;
|
|
20
|
+
[ATTR_GEN_AI_USAGE_OUTPUT_TOKENS]?: number;
|
|
21
|
+
'gen_ai.usage.reasoning_tokens'?: number;
|
|
22
|
+
'gen_ai.usage.cached_input_tokens'?: number;
|
|
23
|
+
'gen_ai.usage.cache_write_tokens'?: number;
|
|
24
|
+
'gen_ai.usage.audio_input_tokens'?: number;
|
|
25
|
+
'gen_ai.usage.audio_output_tokens'?: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Formats UsageStats to OTel GenAI semantic convention attributes.
|
|
29
|
+
*/
|
|
30
|
+
export declare function formatUsageMetrics(usage?: UsageStats): OtelUsageMetrics;
|
|
13
31
|
/**
|
|
14
32
|
* Get an OTEL-compliant span name based on span type and attributes
|
|
15
33
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gen-ai-semantics.d.ts","sourceRoot":"","sources":["../src/gen-ai-semantics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAEV,eAAe,
|
|
1
|
+
{"version":3,"file":"gen-ai-semantics.d.ts","sourceRoot":"","sources":["../src/gen-ai-semantics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAEV,eAAe,EAIf,UAAU,EAEX,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAgBL,8BAA8B,EAC9B,+BAA+B,EAYhC,MAAM,gDAAgD,CAAC;AAGxD;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,CAAC,8BAA8B,CAAC,CAAC,EAAE,MAAM,CAAC;IAC1C,CAAC,+BAA+B,CAAC,CAAC,EAAE,MAAM,CAAC;IAC3C,+BAA+B,CAAC,EAAE,MAAM,CAAC;IACzC,kCAAkC,CAAC,EAAE,MAAM,CAAC;IAC5C,iCAAiC,CAAC,EAAE,MAAM,CAAC;IAC3C,iCAAiC,CAAC,EAAE,MAAM,CAAC;IAC3C,kCAAkC,CAAC,EAAE,MAAM,CAAC;CAC7C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,gBAAgB,CAqCvE;AAuDD;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAUzD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,eAAe,GAAG,UAAU,CA8K/D"}
|
package/dist/index.cjs
CHANGED
|
@@ -286,6 +286,32 @@ var convertMastraMessagesToGenAIMessages = (inputOutputString) => {
|
|
|
286
286
|
};
|
|
287
287
|
|
|
288
288
|
// src/gen-ai-semantics.ts
|
|
289
|
+
function formatUsageMetrics(usage) {
|
|
290
|
+
if (!usage) return {};
|
|
291
|
+
const metrics = {};
|
|
292
|
+
if (usage.inputTokens !== void 0) {
|
|
293
|
+
metrics[incubating.ATTR_GEN_AI_USAGE_INPUT_TOKENS] = usage.inputTokens;
|
|
294
|
+
}
|
|
295
|
+
if (usage.outputTokens !== void 0) {
|
|
296
|
+
metrics[incubating.ATTR_GEN_AI_USAGE_OUTPUT_TOKENS] = usage.outputTokens;
|
|
297
|
+
}
|
|
298
|
+
if (usage.outputDetails?.reasoning !== void 0) {
|
|
299
|
+
metrics["gen_ai.usage.reasoning_tokens"] = usage.outputDetails.reasoning;
|
|
300
|
+
}
|
|
301
|
+
if (usage.inputDetails?.cacheRead !== void 0) {
|
|
302
|
+
metrics["gen_ai.usage.cached_input_tokens"] = usage.inputDetails.cacheRead;
|
|
303
|
+
}
|
|
304
|
+
if (usage.inputDetails?.cacheWrite !== void 0) {
|
|
305
|
+
metrics["gen_ai.usage.cache_write_tokens"] = usage.inputDetails.cacheWrite;
|
|
306
|
+
}
|
|
307
|
+
if (usage.inputDetails?.audio !== void 0) {
|
|
308
|
+
metrics["gen_ai.usage.audio_input_tokens"] = usage.inputDetails.audio;
|
|
309
|
+
}
|
|
310
|
+
if (usage.outputDetails?.audio !== void 0) {
|
|
311
|
+
metrics["gen_ai.usage.audio_output_tokens"] = usage.outputDetails.audio;
|
|
312
|
+
}
|
|
313
|
+
return metrics;
|
|
314
|
+
}
|
|
289
315
|
function getOperationName(span) {
|
|
290
316
|
switch (span.type) {
|
|
291
317
|
case observability.SpanType.MODEL_GENERATION:
|
|
@@ -368,22 +394,13 @@ function getAttributes(span) {
|
|
|
368
394
|
if (modelAttrs.provider) {
|
|
369
395
|
attributes[incubating.ATTR_GEN_AI_PROVIDER_NAME] = normalizeProvider(modelAttrs.provider);
|
|
370
396
|
}
|
|
371
|
-
if (modelAttrs.
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
}
|
|
377
|
-
if (outputTokens !== void 0) {
|
|
378
|
-
attributes[incubating.ATTR_GEN_AI_USAGE_OUTPUT_TOKENS] = outputTokens;
|
|
379
|
-
}
|
|
380
|
-
if (modelAttrs.usage.reasoningTokens !== void 0) {
|
|
381
|
-
attributes["gen_ai.usage.reasoning_tokens"] = modelAttrs.usage.reasoningTokens;
|
|
382
|
-
}
|
|
383
|
-
if (modelAttrs.usage.cachedInputTokens !== void 0) {
|
|
384
|
-
attributes["gen_ai.usage.cached_input_tokens"] = modelAttrs.usage.cachedInputTokens;
|
|
385
|
-
}
|
|
397
|
+
if (modelAttrs.agentId) {
|
|
398
|
+
attributes[incubating.ATTR_GEN_AI_AGENT_ID] = modelAttrs.agentId;
|
|
399
|
+
}
|
|
400
|
+
if (modelAttrs.agentName) {
|
|
401
|
+
attributes[incubating.ATTR_GEN_AI_AGENT_NAME] = modelAttrs.agentName;
|
|
386
402
|
}
|
|
403
|
+
Object.assign(attributes, formatUsageMetrics(modelAttrs.usage));
|
|
387
404
|
if (modelAttrs.parameters) {
|
|
388
405
|
if (modelAttrs.parameters.temperature !== void 0) {
|
|
389
406
|
attributes[incubating.ATTR_GEN_AI_REQUEST_TEMPERATURE] = modelAttrs.parameters.temperature;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/loadExporter.ts","../src/provider-configs.ts","../src/gen-ai-messages.ts","../src/gen-ai-semantics.ts","../src/span-converter.ts","../src/tracing.ts"],"names":["SpanType","ATTR_GEN_AI_OPERATION_NAME","ATTR_GEN_AI_INPUT_MESSAGES","ATTR_GEN_AI_OUTPUT_MESSAGES","ATTR_GEN_AI_REQUEST_MODEL","ATTR_GEN_AI_PROVIDER_NAME","ATTR_GEN_AI_USAGE_INPUT_TOKENS","ATTR_GEN_AI_USAGE_OUTPUT_TOKENS","ATTR_GEN_AI_REQUEST_TEMPERATURE","ATTR_GEN_AI_REQUEST_MAX_TOKENS","ATTR_GEN_AI_REQUEST_TOP_P","ATTR_GEN_AI_REQUEST_TOP_K","ATTR_GEN_AI_REQUEST_PRESENCE_PENALTY","ATTR_GEN_AI_REQUEST_FREQUENCY_PENALTY","ATTR_GEN_AI_REQUEST_STOP_SEQUENCES","ATTR_GEN_AI_REQUEST_SEED","ATTR_GEN_AI_RESPONSE_FINISH_REASONS","ATTR_GEN_AI_RESPONSE_MODEL","ATTR_GEN_AI_RESPONSE_ID","ATTR_SERVER_ADDRESS","ATTR_SERVER_PORT","ATTR_GEN_AI_TOOL_NAME","ATTR_GEN_AI_TOOL_DESCRIPTION","ATTR_GEN_AI_AGENT_ID","ATTR_GEN_AI_AGENT_NAME","ATTR_GEN_AI_CONVERSATION_ID","ATTR_GEN_AI_SYSTEM_INSTRUCTIONS","ATTR_ERROR_TYPE","ATTR_ERROR_MESSAGE","resourceFromAttributes","ATTR_SERVICE_NAME","ATTR_SERVICE_VERSION","ATTR_TELEMETRY_SDK_NAME","ATTR_TELEMETRY_SDK_VERSION","ATTR_TELEMETRY_SDK_LANGUAGE","TraceFlags","fileURLToPath","readFileSync","SpanKind","SpanStatusCode","BaseExporter","diag","DiagConsoleLogger","DiagLogLevel","BatchSpanProcessor","TracingEventType"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Dynamic loader for optional OtelExporters\n */\n\nimport type { ExportProtocol } from './types.js';\n\n// Dynamic imports for optional dependencies\nlet OTLPHttpExporter: any;\nlet OTLPGrpcExporter: any;\nlet OTLPProtoExporter: any;\nlet ZipkinExporter: any;\n\nexport async function loadExporter(protocol: ExportProtocol, provider?: string): Promise<any> {\n switch (protocol) {\n case 'zipkin':\n if (!ZipkinExporter) {\n try {\n const module = await import('@opentelemetry/exporter-zipkin');\n ZipkinExporter = module.ZipkinExporter;\n } catch {\n console.error(\n `[OtelExporter] Zipkin exporter is not installed.\\n` +\n `To use Zipkin export, install the required package:\\n` +\n ` npm install @opentelemetry/exporter-zipkin`,\n );\n return null;\n }\n }\n return ZipkinExporter;\n\n case 'grpc':\n if (!OTLPGrpcExporter) {\n try {\n const module = await import('@opentelemetry/exporter-trace-otlp-grpc');\n OTLPGrpcExporter = module.OTLPTraceExporter;\n } catch {\n const providerInfo = provider ? ` (required for ${provider})` : '';\n console.error(\n `[OtelExporter] gRPC exporter is not installed${providerInfo}.\\n` +\n `To use gRPC export, install the required packages:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-grpc @grpc/grpc-js`,\n );\n return null;\n }\n }\n return OTLPGrpcExporter;\n\n case 'http/protobuf':\n if (!OTLPProtoExporter) {\n try {\n const module = await import('@opentelemetry/exporter-trace-otlp-proto');\n OTLPProtoExporter = module.OTLPTraceExporter;\n } catch {\n const providerInfo = provider ? ` (required for ${provider})` : '';\n console.error(\n `[OtelExporter] HTTP/Protobuf exporter is not installed${providerInfo}.\\n` +\n `To use HTTP/Protobuf export, install the required package:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-proto`,\n );\n return null;\n }\n }\n return OTLPProtoExporter;\n\n case 'http/json':\n default:\n if (!OTLPHttpExporter) {\n try {\n const module = await import('@opentelemetry/exporter-trace-otlp-http');\n OTLPHttpExporter = module.OTLPTraceExporter;\n } catch {\n const providerInfo = provider ? ` (required for ${provider})` : '';\n console.error(\n `[OtelExporter] HTTP/JSON exporter is not installed${providerInfo}.\\n` +\n `To use HTTP/JSON export, install the required package:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-http`,\n );\n return null;\n }\n }\n return OTLPHttpExporter;\n }\n}\n","/**\n * Provider-specific configurations for OtelExporters\n */\n\nimport type {\n ProviderConfig,\n ExportProtocol,\n Dash0Config,\n SignozConfig,\n NewRelicConfig,\n TraceloopConfig,\n LaminarConfig,\n CustomConfig,\n} from './types.js';\n\nexport interface ResolvedProviderConfig {\n endpoint: string;\n headers: Record<string, string>;\n protocol: ExportProtocol;\n}\n\nexport function resolveProviderConfig(config: ProviderConfig): ResolvedProviderConfig | null {\n if ('dash0' in config) {\n return resolveDash0Config(config.dash0);\n } else if ('signoz' in config) {\n return resolveSignozConfig(config.signoz);\n } else if ('newrelic' in config) {\n return resolveNewRelicConfig(config.newrelic);\n } else if ('traceloop' in config) {\n return resolveTraceloopConfig(config.traceloop);\n } else if ('laminar' in config) {\n return resolveLaminarConfig(config.laminar);\n } else if ('custom' in config) {\n return resolveCustomConfig(config.custom);\n } else {\n // TypeScript exhaustiveness check\n const _exhaustive: never = config;\n return _exhaustive;\n }\n}\n\nfunction resolveDash0Config(config: Dash0Config): ResolvedProviderConfig | null {\n 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 * Utilities for converting Mastra messages to OpenTelemetry gen_ai message format\n * Based on OpenTelemetry GenAI semantic conventions\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/#gen-ai-input-messages\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-input-messages.json\n */\n\n/**\n * Type representation of a gen_ai chat message part\n */\ntype GenAIMessagePart =\n | {\n type: 'text';\n content: string;\n }\n | {\n type: 'tool_call';\n id: string;\n name: string;\n arguments: string;\n }\n | {\n type: 'tool_call_response';\n id: string;\n name: string;\n response: string;\n };\n\n/**\n * Type representation of a gen_ai chat message\n */\ntype GenAIMessage = {\n role: string;\n parts: GenAIMessagePart[];\n};\n\n/**\n * Assumed type representation of a Mastra message content type\n */\ntype MastraMessagePart =\n | {\n type: 'text';\n text: string;\n }\n | { type: 'tool-call'; toolCallId: string; toolName: string; input: unknown }\n | { type: 'tool-result'; toolCallId: string; toolName: string; output: { value: unknown } };\n\n/**\n * Assumed type representation of a Mastra message\n */\ntype MastraMessage = {\n role: string;\n content: MastraMessagePart[] | string;\n};\n\nconst isMastraMessagePart = (p: unknown): p is MastraMessagePart => {\n return (\n typeof p === 'object' &&\n p != null &&\n 'type' in p &&\n (p.type === 'text' || p.type === 'tool-call' || p.type === 'tool-result') &&\n ((p.type === 'text' && 'text' in p) ||\n (p.type === 'tool-call' && 'toolCallId' in p && 'toolName' in p && 'input' in p) ||\n (p.type === 'tool-result' && 'toolCallId' in p && 'toolName' in p && 'output' in p))\n );\n};\n\nconst isMastraMessage = (m: unknown): m is MastraMessage => {\n return (\n typeof m === 'object' &&\n m != null &&\n 'role' in m &&\n 'content' in m &&\n (typeof m.content === 'string' || (Array.isArray(m.content) && m.content.every(isMastraMessagePart)))\n );\n};\n\n/**\n * Convert an Input/Output string from a MastraSpan into a jsonified string that adheres to\n * OpenTelemetry gen_ai.input.messages and gen_ai.output.messages schema.\n * If parsing fails at any step, the original inputOutputString is returned unmodified.\n *\n * This conversion is best effort; It assumes a consistent shape for mastra messages, and converts\n * into the gen_ai input and output schemas as of October 20th, 2025.\n *\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/#gen-ai-input-messages\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-input-messages.json\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/#gen-ai-output-messages\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-output-messages.json\n *\n * @param inputOutputString a jsonified string that contains messages adhering to what appears to be\n * Mastra's message shape.\n * @returns a jsonified string that contains messages adhering to the OpenTelemetry gen_ai.input.messages and gen_ai.output.messages schema.\n * If parsing fails at any step, the original inputOutputString is returned unmodified.\n */\nexport const convertMastraMessagesToGenAIMessages = (inputOutputString: string): string => {\n try {\n const parsedIO = JSON.parse(inputOutputString) as unknown;\n if (typeof parsedIO !== 'object' || parsedIO == null || (!('messages' in parsedIO) && !('text' in parsedIO))) {\n // inputOutputString fails initial type guard, just return it\n return inputOutputString;\n }\n // if the IO simply contains a text string, return a single text message\n // formatted as a gen_ai assistant message, assuming its an assistant response\n if ('text' in parsedIO) {\n return JSON.stringify([\n {\n role: 'assistant',\n parts: [{ type: 'text', content: parsedIO.text as string }],\n } satisfies GenAIMessage,\n ]);\n }\n // if the IO contains messages, convert them to gen_ai messages\n if (Array.isArray(parsedIO.messages)) {\n return JSON.stringify(\n (parsedIO.messages as unknown[]).map(m => {\n if (!isMastraMessage(m)) {\n return m;\n }\n const role = m.role;\n let parts: GenAIMessagePart[] = [];\n if (Array.isArray(m.content)) {\n parts = m.content.map(c => {\n switch (c.type) {\n case 'text':\n return {\n type: 'text',\n content: c.text,\n };\n case 'tool-call':\n return {\n type: 'tool_call',\n id: c.toolCallId,\n name: c.toolName,\n arguments: JSON.stringify(c.input),\n };\n case 'tool-result':\n return {\n type: 'tool_call_response',\n id: c.toolCallId,\n name: c.toolName,\n response: JSON.stringify(c.output.value),\n };\n default:\n return c;\n }\n });\n } else {\n parts = [\n {\n type: 'text',\n content: m.content,\n },\n ];\n }\n return {\n role,\n parts,\n } satisfies GenAIMessage;\n }),\n );\n }\n // we've failed type-guards, just return original I/O string\n return inputOutputString;\n } catch {\n // silently fallback to original I/O string\n return inputOutputString;\n }\n};\n","/**\n * Utilities for converting Mastra Spans to OTel Spans\n * with Semantic conventions for generative AI systems\n * @see https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/gen-ai/README.md\n * @see https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/gen-ai/gen-ai-events.md\n * @see https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/gen-ai/gen-ai-spans.md\n * @see https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/gen-ai/gen-ai-agent-spans.md\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/non-normative/examples-llm-calls/\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/\n */\n\nimport { SpanType } from '@mastra/core/observability';\nimport type {\n AgentRunAttributes,\n AnyExportedSpan,\n MCPToolCallAttributes,\n ModelGenerationAttributes,\n ToolCallAttributes,\n WorkflowRunAttributes,\n} from '@mastra/core/observability';\nimport type { Attributes } from '@opentelemetry/api';\nimport {\n ATTR_ERROR_MESSAGE,\n ATTR_ERROR_TYPE,\n ATTR_GEN_AI_PROVIDER_NAME,\n ATTR_GEN_AI_REQUEST_MODEL,\n ATTR_GEN_AI_RESPONSE_MODEL,\n ATTR_GEN_AI_REQUEST_MAX_TOKENS,\n ATTR_GEN_AI_REQUEST_TEMPERATURE,\n ATTR_GEN_AI_REQUEST_TOP_P,\n ATTR_GEN_AI_REQUEST_TOP_K,\n ATTR_GEN_AI_REQUEST_PRESENCE_PENALTY,\n ATTR_GEN_AI_REQUEST_FREQUENCY_PENALTY,\n ATTR_GEN_AI_REQUEST_STOP_SEQUENCES,\n ATTR_GEN_AI_REQUEST_SEED,\n ATTR_GEN_AI_INPUT_MESSAGES,\n ATTR_GEN_AI_OUTPUT_MESSAGES,\n ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n ATTR_GEN_AI_AGENT_ID,\n ATTR_GEN_AI_AGENT_NAME,\n ATTR_GEN_AI_TOOL_DESCRIPTION,\n ATTR_GEN_AI_OPERATION_NAME,\n ATTR_GEN_AI_RESPONSE_FINISH_REASONS,\n ATTR_GEN_AI_RESPONSE_ID,\n ATTR_GEN_AI_CONVERSATION_ID,\n ATTR_GEN_AI_SYSTEM_INSTRUCTIONS,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n ATTR_GEN_AI_TOOL_NAME,\n} from '@opentelemetry/semantic-conventions/incubating';\nimport { convertMastraMessagesToGenAIMessages } from './gen-ai-messages';\n\n/**\n * Get the operation name based on span type for gen_ai.operation.name\n */\nfunction getOperationName(span: AnyExportedSpan): string {\n switch (span.type) {\n case SpanType.MODEL_GENERATION:\n return 'chat';\n case SpanType.TOOL_CALL:\n case SpanType.MCP_TOOL_CALL:\n return 'execute_tool';\n case SpanType.AGENT_RUN:\n return 'invoke_agent';\n case SpanType.WORKFLOW_RUN:\n return 'invoke_workflow';\n default:\n return span.type.toLowerCase();\n }\n}\n/**\n * Keep only unicode letters, numbers, dot, underscore, space, dash.\n */\nfunction sanitizeSpanName(name: string): string {\n return name.replace(/[^\\p{L}\\p{N}._ -]/gu, '');\n}\n\nfunction getSpanIdentifier(span: AnyExportedSpan): string | null {\n switch (span.type) {\n case SpanType.MODEL_GENERATION: {\n const attrs = span.attributes as ModelGenerationAttributes;\n return attrs?.model ?? 'unknown';\n }\n\n case SpanType.TOOL_CALL:\n case SpanType.MCP_TOOL_CALL: {\n const attrs = span.attributes as ToolCallAttributes | MCPToolCallAttributes;\n return attrs?.toolId ?? 'unknown';\n }\n\n case SpanType.AGENT_RUN: {\n const attrs = span.attributes as AgentRunAttributes;\n return attrs?.agentName ?? attrs?.agentId ?? 'unknown';\n }\n\n case SpanType.WORKFLOW_RUN: {\n const attrs = span.attributes as WorkflowRunAttributes;\n return attrs?.workflowId ?? 'unknown';\n }\n\n default:\n return null;\n }\n}\n\n/**\n * Get an OTEL-compliant span name based on span type and attributes\n */\nexport function getSpanName(span: AnyExportedSpan): string {\n const identifier = getSpanIdentifier(span);\n\n if (identifier) {\n const operation = getOperationName(span);\n return `${operation} ${identifier}`;\n }\n\n // For other types, use a simplified version of the original name\n return sanitizeSpanName(span.name);\n}\n\n/**\n * Gets OpenTelemetry attributes from Mastra Span\n * Following OTEL Semantic Conventions for GenAI\n */\nexport function getAttributes(span: AnyExportedSpan): Attributes {\n const attributes: Attributes = {};\n const spanType = span.type.toLowerCase();\n\n // Add gen_ai.operation.name based on span type\n attributes[ATTR_GEN_AI_OPERATION_NAME] = getOperationName(span);\n\n // Add span type for better visibility\n attributes['mastra.span.type'] = span.type;\n\n // Handle input/output based on span type\n // Always add input/output for Laminar compatibility\n if (span.input !== undefined) {\n const inputStr = typeof span.input === 'string' ? span.input : JSON.stringify(span.input);\n // Add specific attributes based on span type\n if (span.type === SpanType.MODEL_GENERATION) {\n attributes[ATTR_GEN_AI_INPUT_MESSAGES] = convertMastraMessagesToGenAIMessages(inputStr);\n } else if (span.type === SpanType.TOOL_CALL || span.type === SpanType.MCP_TOOL_CALL) {\n attributes['gen_ai.tool.call.arguments'] = inputStr;\n } else {\n attributes[`mastra.${spanType}.input`] = inputStr;\n }\n }\n\n if (span.output !== undefined) {\n const outputStr = typeof span.output === 'string' ? span.output : JSON.stringify(span.output);\n // Add specific attributes based on span type\n if (span.type === SpanType.MODEL_GENERATION) {\n attributes[ATTR_GEN_AI_OUTPUT_MESSAGES] = convertMastraMessagesToGenAIMessages(outputStr);\n // TODO\n // attributes['gen_ai.output.type'] = image/json/speech/text/<other>\n } else if (span.type === SpanType.TOOL_CALL || span.type === SpanType.MCP_TOOL_CALL) {\n attributes['gen_ai.tool.call.result'] = outputStr;\n } else {\n attributes[`mastra.${spanType}.output`] = outputStr;\n }\n }\n\n // Add model-specific attributes using OTEL semantic conventions\n if (span.type === SpanType.MODEL_GENERATION && span.attributes) {\n const modelAttrs = span.attributes as ModelGenerationAttributes;\n\n // Model and provider\n if (modelAttrs.model) {\n attributes[ATTR_GEN_AI_REQUEST_MODEL] = modelAttrs.model;\n }\n\n if (modelAttrs.provider) {\n attributes[ATTR_GEN_AI_PROVIDER_NAME] = normalizeProvider(modelAttrs.provider);\n }\n\n // Token usage - use OTEL standard naming\n if (modelAttrs.usage) {\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[ATTR_GEN_AI_USAGE_INPUT_TOKENS] = inputTokens;\n }\n if (outputTokens !== undefined) {\n attributes[ATTR_GEN_AI_USAGE_OUTPUT_TOKENS] = outputTokens;\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[ATTR_GEN_AI_REQUEST_TEMPERATURE] = modelAttrs.parameters.temperature;\n }\n if (modelAttrs.parameters.maxOutputTokens !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_MAX_TOKENS] = modelAttrs.parameters.maxOutputTokens;\n }\n if (modelAttrs.parameters.topP !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_TOP_P] = modelAttrs.parameters.topP;\n }\n if (modelAttrs.parameters.topK !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_TOP_K] = modelAttrs.parameters.topK;\n }\n if (modelAttrs.parameters.presencePenalty !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_PRESENCE_PENALTY] = modelAttrs.parameters.presencePenalty;\n }\n if (modelAttrs.parameters.frequencyPenalty !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_FREQUENCY_PENALTY] = modelAttrs.parameters.frequencyPenalty;\n }\n if (modelAttrs.parameters.stopSequences) {\n attributes[ATTR_GEN_AI_REQUEST_STOP_SEQUENCES] = JSON.stringify(modelAttrs.parameters.stopSequences);\n }\n if (modelAttrs.parameters.seed) {\n attributes[ATTR_GEN_AI_REQUEST_SEED] = modelAttrs.parameters.seed;\n }\n }\n\n // Response attributes\n if (modelAttrs.finishReason) {\n attributes[ATTR_GEN_AI_RESPONSE_FINISH_REASONS] = JSON.stringify([modelAttrs.finishReason]);\n }\n if (modelAttrs.responseModel) {\n attributes[ATTR_GEN_AI_RESPONSE_MODEL] = modelAttrs.responseModel;\n }\n if (modelAttrs.responseId) {\n attributes[ATTR_GEN_AI_RESPONSE_ID] = modelAttrs.responseId;\n }\n\n // Server attributes\n if (modelAttrs.serverAddress) {\n attributes[ATTR_SERVER_ADDRESS] = modelAttrs.serverAddress;\n }\n if (modelAttrs.serverPort !== undefined) {\n attributes[ATTR_SERVER_PORT] = modelAttrs.serverPort;\n }\n }\n\n // Add tool-specific attributes using OTEL conventions\n if ((span.type === SpanType.TOOL_CALL || span.type === SpanType.MCP_TOOL_CALL) && span.attributes) {\n const toolAttrs = span.attributes as ToolCallAttributes | MCPToolCallAttributes;\n\n // Tool identification\n if (toolAttrs.toolId) {\n attributes[ATTR_GEN_AI_TOOL_NAME] = toolAttrs.toolId;\n }\n\n //TODO:\n // attributes['gen_ai.tool.call.id'] = call_mszuSIzqtI65i1wAUOE8w5H4\n // attributes['gen_ai.tool.type'] = function; extension; datastore\n\n // MCP-specific attributes\n if (span.type === SpanType.MCP_TOOL_CALL) {\n const mcpAttrs = toolAttrs as MCPToolCallAttributes;\n if (mcpAttrs.mcpServer) {\n attributes[ATTR_SERVER_ADDRESS] = mcpAttrs.mcpServer;\n }\n } else {\n if ((toolAttrs as ToolCallAttributes).toolDescription) {\n attributes[ATTR_GEN_AI_TOOL_DESCRIPTION] = (toolAttrs as ToolCallAttributes).toolDescription;\n }\n }\n }\n\n // Add agent-specific attributes\n if (span.type === SpanType.AGENT_RUN && span.attributes) {\n const agentAttrs = span.attributes as AgentRunAttributes;\n if (agentAttrs.agentId) {\n attributes[ATTR_GEN_AI_AGENT_ID] = agentAttrs.agentId;\n }\n if (agentAttrs.agentName) {\n attributes[ATTR_GEN_AI_AGENT_NAME] = agentAttrs.agentName;\n }\n if (agentAttrs.conversationId) {\n attributes[ATTR_GEN_AI_CONVERSATION_ID] = agentAttrs.conversationId;\n }\n if (agentAttrs.maxSteps) {\n attributes[`mastra.${spanType}.max_steps`] = agentAttrs.maxSteps;\n }\n if (agentAttrs.availableTools) {\n attributes[`gen_ai.tool.definitions`] = JSON.stringify(agentAttrs.availableTools);\n }\n\n //TODO:\n // attributes[ATTR_GEN_AI_AGENT_DESCRIPTION] = agentAttrs.description;\n // attributes[ATTR_GEN_AI_REQUEST_MODEL] = agentAttrs.model.name;\n\n attributes[ATTR_GEN_AI_SYSTEM_INSTRUCTIONS] = agentAttrs.instructions;\n }\n\n // Add error information if present\n if (span.errorInfo) {\n attributes[ATTR_ERROR_TYPE] = span.errorInfo.id || 'unknown';\n attributes[ATTR_ERROR_MESSAGE] = span.errorInfo.message;\n if (span.errorInfo.domain) {\n attributes['error.domain'] = span.errorInfo.domain;\n }\n if (span.errorInfo.category) {\n attributes['error.category'] = span.errorInfo.category;\n }\n }\n\n return attributes;\n}\n\n/**\n * Canonical OTel provider keys mapped to a list of possible fuzzy aliases.\n */\nconst PROVIDER_ALIASES: Record<string, string[]> = {\n anthropic: ['anthropic', 'claude'],\n 'aws.bedrock': ['awsbedrock', 'bedrock', 'amazonbedrock'],\n 'azure.ai.inference': ['azureaiinference', 'azureinference'],\n 'azure.ai.openai': ['azureaiopenai', 'azureopenai', 'msopenai', 'microsoftopenai'],\n cohere: ['cohere'],\n deepseek: ['deepseek'],\n 'gcp.gemini': ['gcpgemini', 'gemini'],\n 'gcp.gen_ai': ['gcpgenai', 'googlegenai', 'googleai'],\n 'gcp.vertex_ai': ['gcpvertexai', 'vertexai'],\n groq: ['groq'],\n 'ibm.watsonx.ai': ['ibmwatsonxai', 'watsonx', 'watsonxai'],\n mistral_ai: ['mistral', 'mistralai'],\n openai: ['openai', 'oai'],\n perplexity: ['perplexity', 'pplx'],\n x_ai: ['xai', 'x-ai', 'x_ai', 'x.com ai'],\n};\n\n/**\n * Normalize a provider input string into a matchable token.\n * Keep only alphanumerics and lowercase the result.\n */\nfunction normalizeProviderString(input: string): string {\n return input.toLowerCase().replace(/[^a-z0-9]/g, '');\n}\n\n/**\n * Attempts to map a providerName to one of the canonical OTel provider names.\n * If no match is found, returns the original providerName unchanged.\n */\nfunction normalizeProvider(providerName: string): string {\n const normalized = normalizeProviderString(providerName);\n\n for (const [canonical, aliases] of Object.entries(PROVIDER_ALIASES)) {\n for (const alias of aliases) {\n if (normalized === alias) {\n return canonical;\n }\n }\n }\n\n // No match → return the raw input in lowercase\n return providerName.toLowerCase();\n}\n","/**\n * Convert Mastra Spans to OpenTelemetry spans\n */\nimport { readFileSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport { SpanType } from '@mastra/core/observability';\nimport type { AnyExportedSpan } from '@mastra/core/observability';\nimport { SpanKind, SpanStatusCode, TraceFlags } from '@opentelemetry/api';\nimport type { HrTime, Link, SpanContext, SpanStatus } from '@opentelemetry/api';\nimport type { InstrumentationScope } from '@opentelemetry/core';\nimport type { Resource } from '@opentelemetry/resources';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\n\nimport type { ReadableSpan, TimedEvent } from '@opentelemetry/sdk-trace-base';\nimport {\n ATTR_SERVICE_NAME,\n ATTR_SERVICE_VERSION,\n ATTR_TELEMETRY_SDK_LANGUAGE,\n ATTR_TELEMETRY_SDK_NAME,\n ATTR_TELEMETRY_SDK_VERSION,\n} from '@opentelemetry/semantic-conventions';\n\nimport { getAttributes, getSpanName } from './gen-ai-semantics.js';\nimport type { OtelExporterConfig } from './types.js';\n\nexport type SpanFormat = 'GenAI_v1_38_0';\n\n// If more formats come later:\n// export type SpanFormat =\n// | \"GenAI_v1_38_0\"\n// | \"GenAI_v1_38_0\"\n// | \"Custom_v2\";\n\nexport class SpanConverter {\n private resource?: Resource;\n private scope?: InstrumentationScope;\n private initPromise?: Promise<void>;\n private format: SpanFormat;\n\n constructor(\n private readonly params: {\n format: SpanFormat;\n packageName: string;\n serviceName?: string;\n config?: OtelExporterConfig;\n },\n ) {\n this.format = params.format;\n }\n\n /**\n * Lazily initialize resource & scope on first use.\n * Subsequent calls reuse the same promise (no races).\n */\n private async initIfNeeded(): Promise<void> {\n if (this.initPromise) {\n return this.initPromise;\n }\n\n this.initPromise = (async () => {\n const packageVersion = (await getPackageVersion(this.params.packageName)) ?? 'unknown';\n\n const serviceVersion = (await getPackageVersion('@mastra/core')) ?? 'unknown';\n\n let resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: this.params.serviceName || 'mastra-service',\n [ATTR_SERVICE_VERSION]: serviceVersion,\n [ATTR_TELEMETRY_SDK_NAME]: this.params.packageName,\n [ATTR_TELEMETRY_SDK_VERSION]: packageVersion,\n [ATTR_TELEMETRY_SDK_LANGUAGE]: 'nodejs',\n });\n\n if (this.params.config?.resourceAttributes) {\n resource = resource.merge(\n // Duplicate attributes from config will override defaults above\n resourceFromAttributes(this.params.config.resourceAttributes),\n );\n }\n\n this.resource = resource;\n this.scope = {\n name: this.params.packageName,\n version: packageVersion,\n };\n })();\n\n return this.initPromise;\n }\n\n /**\n * Convert a Mastra Span to an OpenTelemetry ReadableSpan\n */\n async convertSpan(span: AnyExportedSpan): Promise<ReadableSpan> {\n await this.initIfNeeded();\n\n if (!this.resource || !this.scope) {\n throw new Error('SpanConverter not initialized correctly');\n }\n\n // --- Core fields derived from Mastra span ---\n const name = getSpanName(span);\n const kind = getSpanKind(span.type);\n const attributes = getAttributes(span);\n\n // Add metadata as custom attributes (not gen_ai specific)\n if (span.metadata) {\n for (const [k, v] of Object.entries(span.metadata)) {\n if (v === null || v === undefined) {\n continue;\n }\n attributes[`mastra.metadata.${k}`] = typeof v === 'object' ? JSON.stringify(v) : v;\n }\n }\n\n // Add tags for root spans (only root spans can have tags)\n // Tags are JSON-stringified for maximum backend compatibility\n // While OTEL spec supports arrays, many backends (Jaeger, Zipkin, Tempo) don't fully support them\n if (span.isRootSpan && span.tags?.length) {\n attributes['mastra.tags'] = JSON.stringify(span.tags);\n }\n\n const startTime = dateToHrTime(span.startTime);\n const endTime = span.endTime ? dateToHrTime(span.endTime) : startTime;\n const duration = computeDuration(span.startTime, span.endTime);\n\n const { status, events } = buildStatusAndEvents(span, startTime);\n\n const spanContext: SpanContext = {\n traceId: span.traceId,\n spanId: span.id,\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n };\n\n const parentSpanContext = span.parentSpanId\n ? {\n traceId: span.traceId,\n spanId: span.parentSpanId,\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n }\n : undefined;\n\n const links: Link[] = []; // fill if you add link support later\n\n const readable: ReadableSpan = {\n name,\n kind,\n spanContext: () => spanContext,\n parentSpanContext,\n startTime,\n endTime,\n status,\n attributes,\n links,\n events,\n duration,\n ended: !!span.endTime,\n resource: this.resource,\n instrumentationScope: this.scope,\n droppedAttributesCount: 0,\n droppedEventsCount: 0,\n droppedLinksCount: 0,\n };\n\n return readable;\n }\n}\n\nasync function getPackageVersion(pkgName: string): Promise<string | undefined> {\n try {\n // Resolve `package.json` for the given package\n const manifestUrl = new URL(await import.meta.resolve(`${pkgName}/package.json`));\n\n const path = fileURLToPath(manifestUrl);\n const pkgJson = JSON.parse(readFileSync(path, 'utf8'));\n return pkgJson.version;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Get the appropriate Otel SpanKind based on Mastra SpanType.\n *\n * @param type - The Mastra span type\n * @returns The appropriate OTEL SpanKind\n */\nexport function getSpanKind(type: SpanType): SpanKind {\n switch (type) {\n case SpanType.MODEL_GENERATION:\n case SpanType.MCP_TOOL_CALL:\n return SpanKind.CLIENT;\n default:\n return SpanKind.INTERNAL;\n }\n}\n\n/**\n * Convert JavaScript Date to hrtime format\n */\nfunction dateToHrTime(date: Date): HrTime {\n const ms = date.getTime();\n const seconds = Math.floor(ms / 1000);\n const nanoseconds = (ms % 1000) * 1000000;\n return [seconds, nanoseconds];\n}\n\nfunction computeDuration(start: Date, end?: Date): HrTime {\n if (!end) return [0, 0];\n const diffMs = end.getTime() - start.getTime();\n return [Math.floor(diffMs / 1000), (diffMs % 1000) * 1_000_000];\n}\n\n/**\n * Build status + events from span.errorInfo (if present)\n */\nfunction buildStatusAndEvents(\n span: AnyExportedSpan,\n defaultTime: HrTime,\n): { status: SpanStatus; events: TimedEvent[] } {\n const events: TimedEvent[] = [];\n\n if (span.errorInfo) {\n const status: SpanStatus = {\n code: SpanStatusCode.ERROR,\n message: span.errorInfo.message,\n };\n\n events.push({\n name: 'exception',\n attributes: {\n 'exception.message': span.errorInfo.message,\n 'exception.type': 'Error',\n ...(span.errorInfo.details?.stack && {\n 'exception.stacktrace': span.errorInfo.details.stack as string,\n }),\n },\n time: defaultTime,\n droppedAttributesCount: 0,\n });\n\n return { status, events };\n }\n\n if (span.endTime) {\n return {\n status: { code: SpanStatusCode.OK },\n events,\n };\n }\n\n return {\n status: { code: SpanStatusCode.UNSET },\n events,\n };\n}\n","/**\n * OpenTelemetry Tracing Exporter for Mastra\n */\n\nimport type {\n TracingEvent,\n AnyExportedSpan,\n InitExporterOptions,\n ObservabilityInstanceConfig,\n} from '@mastra/core/observability';\nimport { TracingEventType } from '@mastra/core/observability';\nimport { BaseExporter } from '@mastra/observability';\nimport { diag, DiagConsoleLogger, DiagLogLevel } from '@opentelemetry/api';\n\nimport { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport type { SpanExporter } from '@opentelemetry/sdk-trace-base';\n\nimport { loadExporter } from './loadExporter.js';\nimport { resolveProviderConfig } from './provider-configs.js';\nimport { SpanConverter } from './span-converter.js';\nimport type { OtelExporterConfig } from './types.js';\n\nexport class OtelExporter extends BaseExporter {\n private config: OtelExporterConfig;\n private observabilityConfig?: ObservabilityInstanceConfig;\n private spanConverter?: SpanConverter;\n private processor?: BatchSpanProcessor;\n private exporter?: SpanExporter;\n private isSetup: boolean = false;\n\n name = 'opentelemetry';\n\n constructor(config: OtelExporterConfig) {\n super(config);\n\n this.config = config;\n\n // Set up OpenTelemetry diagnostics if debug mode\n if (config.logLevel === 'debug') {\n diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.DEBUG);\n }\n }\n\n /**\n * Initialize with tracing configuration\n */\n init(options: InitExporterOptions) {\n this.observabilityConfig = options.config;\n }\n\n private async setupExporter() {\n // already setup or exporter already set\n if (this.isSetup || this.exporter) return;\n\n // Provider configuration is required\n if (!this.config.provider) {\n this.logger.error(\n '[OtelExporter] Provider configuration is required. Use the \"custom\" provider for generic endpoints.',\n );\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n // Resolve provider configuration\n const resolved = resolveProviderConfig(this.config.provider);\n if (!resolved) {\n // Configuration validation failed, disable tracing\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n // user provided an instantiated SpanExporter, use it\n if (this.config.exporter) {\n this.exporter = this.config.exporter;\n return;\n }\n\n const endpoint = resolved.endpoint;\n const headers = resolved.headers;\n const protocol = resolved.protocol;\n\n // Load and create the appropriate exporter based on protocol\n const providerName = Object.keys(this.config.provider)[0];\n const ExporterClass = await loadExporter(protocol, providerName);\n\n if (!ExporterClass) {\n // Exporter not available, disable tracing\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n try {\n if (protocol === 'zipkin') {\n this.exporter = new ExporterClass({\n url: endpoint,\n headers,\n });\n } else if (protocol === 'grpc') {\n // gRPC uses Metadata object instead of headers\n // Dynamically import @grpc/grpc-js to create metadata\n let metadata: any;\n try {\n // @ts-ignore - Dynamic import for optional dependency\n const grpcModule = await import('@grpc/grpc-js');\n metadata = new grpcModule.Metadata();\n Object.entries(headers).forEach(([key, value]) => {\n metadata.set(key, value);\n });\n } catch (grpcError) {\n this.logger.error(\n `[OtelExporter] Failed to load gRPC metadata. Install required packages:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-grpc @grpc/grpc-js\\n`,\n grpcError,\n );\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n this.exporter = new ExporterClass({\n url: endpoint,\n metadata,\n timeoutMillis: this.config.timeout,\n });\n } else {\n // HTTP/JSON and HTTP/Protobuf use headers\n this.exporter = new ExporterClass({\n url: endpoint,\n headers,\n timeoutMillis: this.config.timeout,\n });\n }\n } catch (error) {\n this.logger.error(`[OtelExporter] Failed to create exporter:`, error);\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n }\n\n private async setupProcessor() {\n if (this.processor || this.isSetup) return;\n\n this.spanConverter = new SpanConverter({\n packageName: '@mastra/otel-exporter',\n serviceName: this.observabilityConfig?.serviceName,\n config: this.config,\n format: 'GenAI_v1_38_0',\n });\n\n // Always use BatchSpanProcessor for production\n // It queues spans and exports them in batches for better performance\n this.processor = new BatchSpanProcessor(this.exporter!, {\n maxExportBatchSize: this.config.batchSize || 512, // Default batch size\n maxQueueSize: 2048, // Maximum spans to queue\n scheduledDelayMillis: 5000, // Export every 5 seconds\n exportTimeoutMillis: this.config.timeout || 30000, // Export timeout\n });\n\n this.logger.debug(\n `[OtelExporter] Using BatchSpanProcessor (batch size: ${this.config.batchSize || 512}, delay: 5s)`,\n );\n }\n\n private async setup() {\n if (this.isSetup) return;\n await this.setupExporter();\n await this.setupProcessor();\n this.isSetup = true;\n }\n\n protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n // Only process SPAN_ENDED events for OTEL\n // OTEL expects complete spans with start and end times\n if (event.type !== TracingEventType.SPAN_ENDED) {\n return;\n }\n\n const span = event.exportedSpan;\n await this.exportSpan(span);\n }\n\n private async exportSpan(span: AnyExportedSpan): Promise<void> {\n // Ensure exporter is set up\n if (!this.isSetup) {\n await this.setup();\n }\n\n // Skip if disabled\n if (this.isDisabled || !this.processor) {\n return;\n }\n\n try {\n // Convert the span to OTEL format\n const otelSpan = await this.spanConverter!.convertSpan(span);\n\n // Export the span immediately through the processor\n // The processor will handle batching if configured\n await new Promise<void>(resolve => {\n this.processor!.onEnd(otelSpan);\n resolve();\n });\n\n this.logger.debug(\n `[OtelExporter] Exported span ${span.id} (trace: ${span.traceId}, parent: ${span.parentSpanId || 'none'}, type: ${span.type})`,\n );\n } catch (error) {\n this.logger.error(`[OtelExporter] Failed to export span ${span.id}:`, error);\n }\n }\n\n async shutdown(): Promise<void> {\n // Shutdown the processor to flush any remaining spans\n if (this.processor) {\n await this.processor.shutdown();\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/loadExporter.ts","../src/provider-configs.ts","../src/gen-ai-messages.ts","../src/gen-ai-semantics.ts","../src/span-converter.ts","../src/tracing.ts"],"names":["ATTR_GEN_AI_USAGE_INPUT_TOKENS","ATTR_GEN_AI_USAGE_OUTPUT_TOKENS","SpanType","ATTR_GEN_AI_OPERATION_NAME","ATTR_GEN_AI_INPUT_MESSAGES","ATTR_GEN_AI_OUTPUT_MESSAGES","ATTR_GEN_AI_REQUEST_MODEL","ATTR_GEN_AI_PROVIDER_NAME","ATTR_GEN_AI_AGENT_ID","ATTR_GEN_AI_AGENT_NAME","ATTR_GEN_AI_REQUEST_TEMPERATURE","ATTR_GEN_AI_REQUEST_MAX_TOKENS","ATTR_GEN_AI_REQUEST_TOP_P","ATTR_GEN_AI_REQUEST_TOP_K","ATTR_GEN_AI_REQUEST_PRESENCE_PENALTY","ATTR_GEN_AI_REQUEST_FREQUENCY_PENALTY","ATTR_GEN_AI_REQUEST_STOP_SEQUENCES","ATTR_GEN_AI_REQUEST_SEED","ATTR_GEN_AI_RESPONSE_FINISH_REASONS","ATTR_GEN_AI_RESPONSE_MODEL","ATTR_GEN_AI_RESPONSE_ID","ATTR_SERVER_ADDRESS","ATTR_SERVER_PORT","ATTR_GEN_AI_TOOL_NAME","ATTR_GEN_AI_TOOL_DESCRIPTION","ATTR_GEN_AI_CONVERSATION_ID","ATTR_GEN_AI_SYSTEM_INSTRUCTIONS","ATTR_ERROR_TYPE","ATTR_ERROR_MESSAGE","resourceFromAttributes","ATTR_SERVICE_NAME","ATTR_SERVICE_VERSION","ATTR_TELEMETRY_SDK_NAME","ATTR_TELEMETRY_SDK_VERSION","ATTR_TELEMETRY_SDK_LANGUAGE","TraceFlags","fileURLToPath","readFileSync","SpanKind","SpanStatusCode","BaseExporter","diag","DiagConsoleLogger","DiagLogLevel","BatchSpanProcessor","TracingEventType"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Dynamic loader for optional OtelExporters\n */\n\nimport type { ExportProtocol } from './types.js';\n\n// Dynamic imports for optional dependencies\nlet OTLPHttpExporter: any;\nlet OTLPGrpcExporter: any;\nlet OTLPProtoExporter: any;\nlet ZipkinExporter: any;\n\nexport async function loadExporter(protocol: ExportProtocol, provider?: string): Promise<any> {\n switch (protocol) {\n case 'zipkin':\n if (!ZipkinExporter) {\n try {\n const module = await import('@opentelemetry/exporter-zipkin');\n ZipkinExporter = module.ZipkinExporter;\n } catch {\n console.error(\n `[OtelExporter] Zipkin exporter is not installed.\\n` +\n `To use Zipkin export, install the required package:\\n` +\n ` npm install @opentelemetry/exporter-zipkin`,\n );\n return null;\n }\n }\n return ZipkinExporter;\n\n case 'grpc':\n if (!OTLPGrpcExporter) {\n try {\n const module = await import('@opentelemetry/exporter-trace-otlp-grpc');\n OTLPGrpcExporter = module.OTLPTraceExporter;\n } catch {\n const providerInfo = provider ? ` (required for ${provider})` : '';\n console.error(\n `[OtelExporter] gRPC exporter is not installed${providerInfo}.\\n` +\n `To use gRPC export, install the required packages:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-grpc @grpc/grpc-js`,\n );\n return null;\n }\n }\n return OTLPGrpcExporter;\n\n case 'http/protobuf':\n if (!OTLPProtoExporter) {\n try {\n const module = await import('@opentelemetry/exporter-trace-otlp-proto');\n OTLPProtoExporter = module.OTLPTraceExporter;\n } catch {\n const providerInfo = provider ? ` (required for ${provider})` : '';\n console.error(\n `[OtelExporter] HTTP/Protobuf exporter is not installed${providerInfo}.\\n` +\n `To use HTTP/Protobuf export, install the required package:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-proto`,\n );\n return null;\n }\n }\n return OTLPProtoExporter;\n\n case 'http/json':\n default:\n if (!OTLPHttpExporter) {\n try {\n const module = await import('@opentelemetry/exporter-trace-otlp-http');\n OTLPHttpExporter = module.OTLPTraceExporter;\n } catch {\n const providerInfo = provider ? ` (required for ${provider})` : '';\n console.error(\n `[OtelExporter] HTTP/JSON exporter is not installed${providerInfo}.\\n` +\n `To use HTTP/JSON export, install the required package:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-http`,\n );\n return null;\n }\n }\n return OTLPHttpExporter;\n }\n}\n","/**\n * Provider-specific configurations for OtelExporters\n */\n\nimport type {\n ProviderConfig,\n ExportProtocol,\n Dash0Config,\n SignozConfig,\n NewRelicConfig,\n TraceloopConfig,\n LaminarConfig,\n CustomConfig,\n} from './types.js';\n\nexport interface ResolvedProviderConfig {\n endpoint: string;\n headers: Record<string, string>;\n protocol: ExportProtocol;\n}\n\nexport function resolveProviderConfig(config: ProviderConfig): ResolvedProviderConfig | null {\n if ('dash0' in config) {\n return resolveDash0Config(config.dash0);\n } else if ('signoz' in config) {\n return resolveSignozConfig(config.signoz);\n } else if ('newrelic' in config) {\n return resolveNewRelicConfig(config.newrelic);\n } else if ('traceloop' in config) {\n return resolveTraceloopConfig(config.traceloop);\n } else if ('laminar' in config) {\n return resolveLaminarConfig(config.laminar);\n } else if ('custom' in config) {\n return resolveCustomConfig(config.custom);\n } else {\n // TypeScript exhaustiveness check\n const _exhaustive: never = config;\n return _exhaustive;\n }\n}\n\nfunction resolveDash0Config(config: Dash0Config): ResolvedProviderConfig | null {\n 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 * Utilities for converting Mastra messages to OpenTelemetry gen_ai message format\n * Based on OpenTelemetry GenAI semantic conventions\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/#gen-ai-input-messages\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-input-messages.json\n */\n\n/**\n * Type representation of a gen_ai chat message part\n */\ntype GenAIMessagePart =\n | {\n type: 'text';\n content: string;\n }\n | {\n type: 'tool_call';\n id: string;\n name: string;\n arguments: string;\n }\n | {\n type: 'tool_call_response';\n id: string;\n name: string;\n response: string;\n };\n\n/**\n * Type representation of a gen_ai chat message\n */\ntype GenAIMessage = {\n role: string;\n parts: GenAIMessagePart[];\n};\n\n/**\n * Assumed type representation of a Mastra message content type\n */\ntype MastraMessagePart =\n | {\n type: 'text';\n text: string;\n }\n | { type: 'tool-call'; toolCallId: string; toolName: string; input: unknown }\n | { type: 'tool-result'; toolCallId: string; toolName: string; output: { value: unknown } };\n\n/**\n * Assumed type representation of a Mastra message\n */\ntype MastraMessage = {\n role: string;\n content: MastraMessagePart[] | string;\n};\n\nconst isMastraMessagePart = (p: unknown): p is MastraMessagePart => {\n return (\n typeof p === 'object' &&\n p != null &&\n 'type' in p &&\n (p.type === 'text' || p.type === 'tool-call' || p.type === 'tool-result') &&\n ((p.type === 'text' && 'text' in p) ||\n (p.type === 'tool-call' && 'toolCallId' in p && 'toolName' in p && 'input' in p) ||\n (p.type === 'tool-result' && 'toolCallId' in p && 'toolName' in p && 'output' in p))\n );\n};\n\nconst isMastraMessage = (m: unknown): m is MastraMessage => {\n return (\n typeof m === 'object' &&\n m != null &&\n 'role' in m &&\n 'content' in m &&\n (typeof m.content === 'string' || (Array.isArray(m.content) && m.content.every(isMastraMessagePart)))\n );\n};\n\n/**\n * Convert an Input/Output string from a MastraSpan into a jsonified string that adheres to\n * OpenTelemetry gen_ai.input.messages and gen_ai.output.messages schema.\n * If parsing fails at any step, the original inputOutputString is returned unmodified.\n *\n * This conversion is best effort; It assumes a consistent shape for mastra messages, and converts\n * into the gen_ai input and output schemas as of October 20th, 2025.\n *\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/#gen-ai-input-messages\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-input-messages.json\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/#gen-ai-output-messages\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-output-messages.json\n *\n * @param inputOutputString a jsonified string that contains messages adhering to what appears to be\n * Mastra's message shape.\n * @returns a jsonified string that contains messages adhering to the OpenTelemetry gen_ai.input.messages and gen_ai.output.messages schema.\n * If parsing fails at any step, the original inputOutputString is returned unmodified.\n */\nexport const convertMastraMessagesToGenAIMessages = (inputOutputString: string): string => {\n try {\n const parsedIO = JSON.parse(inputOutputString) as unknown;\n if (typeof parsedIO !== 'object' || parsedIO == null || (!('messages' in parsedIO) && !('text' in parsedIO))) {\n // inputOutputString fails initial type guard, just return it\n return inputOutputString;\n }\n // if the IO simply contains a text string, return a single text message\n // formatted as a gen_ai assistant message, assuming its an assistant response\n if ('text' in parsedIO) {\n return JSON.stringify([\n {\n role: 'assistant',\n parts: [{ type: 'text', content: parsedIO.text as string }],\n } satisfies GenAIMessage,\n ]);\n }\n // if the IO contains messages, convert them to gen_ai messages\n if (Array.isArray(parsedIO.messages)) {\n return JSON.stringify(\n (parsedIO.messages as unknown[]).map(m => {\n if (!isMastraMessage(m)) {\n return m;\n }\n const role = m.role;\n let parts: GenAIMessagePart[] = [];\n if (Array.isArray(m.content)) {\n parts = m.content.map(c => {\n switch (c.type) {\n case 'text':\n return {\n type: 'text',\n content: c.text,\n };\n case 'tool-call':\n return {\n type: 'tool_call',\n id: c.toolCallId,\n name: c.toolName,\n arguments: JSON.stringify(c.input),\n };\n case 'tool-result':\n return {\n type: 'tool_call_response',\n id: c.toolCallId,\n name: c.toolName,\n response: JSON.stringify(c.output.value),\n };\n default:\n return c;\n }\n });\n } else {\n parts = [\n {\n type: 'text',\n content: m.content,\n },\n ];\n }\n return {\n role,\n parts,\n } satisfies GenAIMessage;\n }),\n );\n }\n // we've failed type-guards, just return original I/O string\n return inputOutputString;\n } catch {\n // silently fallback to original I/O string\n return inputOutputString;\n }\n};\n","/**\n * Utilities for converting Mastra Spans to OTel Spans\n * with Semantic conventions for generative AI systems\n * @see https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/gen-ai/README.md\n * @see https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/gen-ai/gen-ai-events.md\n * @see https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/gen-ai/gen-ai-spans.md\n * @see https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/gen-ai/gen-ai-agent-spans.md\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/non-normative/examples-llm-calls/\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/\n */\n\nimport { SpanType } from '@mastra/core/observability';\nimport type {\n AgentRunAttributes,\n AnyExportedSpan,\n MCPToolCallAttributes,\n ModelGenerationAttributes,\n ToolCallAttributes,\n UsageStats,\n WorkflowRunAttributes,\n} from '@mastra/core/observability';\nimport type { Attributes } from '@opentelemetry/api';\nimport {\n ATTR_ERROR_MESSAGE,\n ATTR_ERROR_TYPE,\n ATTR_GEN_AI_PROVIDER_NAME,\n ATTR_GEN_AI_REQUEST_MODEL,\n ATTR_GEN_AI_RESPONSE_MODEL,\n ATTR_GEN_AI_REQUEST_MAX_TOKENS,\n ATTR_GEN_AI_REQUEST_TEMPERATURE,\n ATTR_GEN_AI_REQUEST_TOP_P,\n ATTR_GEN_AI_REQUEST_TOP_K,\n ATTR_GEN_AI_REQUEST_PRESENCE_PENALTY,\n ATTR_GEN_AI_REQUEST_FREQUENCY_PENALTY,\n ATTR_GEN_AI_REQUEST_STOP_SEQUENCES,\n ATTR_GEN_AI_REQUEST_SEED,\n ATTR_GEN_AI_INPUT_MESSAGES,\n ATTR_GEN_AI_OUTPUT_MESSAGES,\n ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n ATTR_GEN_AI_AGENT_ID,\n ATTR_GEN_AI_AGENT_NAME,\n ATTR_GEN_AI_TOOL_DESCRIPTION,\n ATTR_GEN_AI_OPERATION_NAME,\n ATTR_GEN_AI_RESPONSE_FINISH_REASONS,\n ATTR_GEN_AI_RESPONSE_ID,\n ATTR_GEN_AI_CONVERSATION_ID,\n ATTR_GEN_AI_SYSTEM_INSTRUCTIONS,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n ATTR_GEN_AI_TOOL_NAME,\n} from '@opentelemetry/semantic-conventions/incubating';\nimport { convertMastraMessagesToGenAIMessages } from './gen-ai-messages';\n\n/**\n * Token usage attributes following OTel GenAI semantic conventions.\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-spans/\n */\nexport interface OtelUsageMetrics {\n [ATTR_GEN_AI_USAGE_INPUT_TOKENS]?: number;\n [ATTR_GEN_AI_USAGE_OUTPUT_TOKENS]?: number;\n 'gen_ai.usage.reasoning_tokens'?: number;\n 'gen_ai.usage.cached_input_tokens'?: number;\n 'gen_ai.usage.cache_write_tokens'?: number;\n 'gen_ai.usage.audio_input_tokens'?: number;\n 'gen_ai.usage.audio_output_tokens'?: number;\n}\n\n/**\n * Formats UsageStats to OTel GenAI semantic convention attributes.\n */\nexport function formatUsageMetrics(usage?: UsageStats): OtelUsageMetrics {\n if (!usage) return {};\n\n const metrics: OtelUsageMetrics = {};\n\n if (usage.inputTokens !== undefined) {\n metrics[ATTR_GEN_AI_USAGE_INPUT_TOKENS] = usage.inputTokens;\n }\n\n if (usage.outputTokens !== undefined) {\n metrics[ATTR_GEN_AI_USAGE_OUTPUT_TOKENS] = usage.outputTokens;\n }\n\n // Reasoning tokens from outputDetails\n if (usage.outputDetails?.reasoning !== undefined) {\n metrics['gen_ai.usage.reasoning_tokens'] = usage.outputDetails.reasoning;\n }\n\n // Cache read tokens from inputDetails\n if (usage.inputDetails?.cacheRead !== undefined) {\n metrics['gen_ai.usage.cached_input_tokens'] = usage.inputDetails.cacheRead;\n }\n\n // Cache write tokens from inputDetails\n if (usage.inputDetails?.cacheWrite !== undefined) {\n metrics['gen_ai.usage.cache_write_tokens'] = usage.inputDetails.cacheWrite;\n }\n\n // Audio tokens from inputDetails/outputDetails\n if (usage.inputDetails?.audio !== undefined) {\n metrics['gen_ai.usage.audio_input_tokens'] = usage.inputDetails.audio;\n }\n if (usage.outputDetails?.audio !== undefined) {\n metrics['gen_ai.usage.audio_output_tokens'] = usage.outputDetails.audio;\n }\n\n return metrics;\n}\n\n/**\n * Get the operation name based on span type for gen_ai.operation.name\n */\nfunction getOperationName(span: AnyExportedSpan): string {\n switch (span.type) {\n case SpanType.MODEL_GENERATION:\n return 'chat';\n case SpanType.TOOL_CALL:\n case SpanType.MCP_TOOL_CALL:\n return 'execute_tool';\n case SpanType.AGENT_RUN:\n return 'invoke_agent';\n case SpanType.WORKFLOW_RUN:\n return 'invoke_workflow';\n default:\n return span.type.toLowerCase();\n }\n}\n/**\n * Keep only unicode letters, numbers, dot, underscore, space, dash.\n */\nfunction sanitizeSpanName(name: string): string {\n return name.replace(/[^\\p{L}\\p{N}._ -]/gu, '');\n}\n\nfunction getSpanIdentifier(span: AnyExportedSpan): string | null {\n switch (span.type) {\n case SpanType.MODEL_GENERATION: {\n const attrs = span.attributes as ModelGenerationAttributes;\n return attrs?.model ?? 'unknown';\n }\n\n case SpanType.TOOL_CALL:\n case SpanType.MCP_TOOL_CALL: {\n const attrs = span.attributes as ToolCallAttributes | MCPToolCallAttributes;\n return attrs?.toolId ?? 'unknown';\n }\n\n case SpanType.AGENT_RUN: {\n const attrs = span.attributes as AgentRunAttributes;\n return attrs?.agentName ?? attrs?.agentId ?? 'unknown';\n }\n\n case SpanType.WORKFLOW_RUN: {\n const attrs = span.attributes as WorkflowRunAttributes;\n return attrs?.workflowId ?? 'unknown';\n }\n\n default:\n return null;\n }\n}\n\n/**\n * Get an OTEL-compliant span name based on span type and attributes\n */\nexport function getSpanName(span: AnyExportedSpan): string {\n const identifier = getSpanIdentifier(span);\n\n if (identifier) {\n const operation = getOperationName(span);\n return `${operation} ${identifier}`;\n }\n\n // For other types, use a simplified version of the original name\n return sanitizeSpanName(span.name);\n}\n\n/**\n * Gets OpenTelemetry attributes from Mastra Span\n * Following OTEL Semantic Conventions for GenAI\n */\nexport function getAttributes(span: AnyExportedSpan): Attributes {\n const attributes: Attributes = {};\n const spanType = span.type.toLowerCase();\n\n // Add gen_ai.operation.name based on span type\n attributes[ATTR_GEN_AI_OPERATION_NAME] = getOperationName(span);\n\n // Add span type for better visibility\n attributes['mastra.span.type'] = span.type;\n\n // Handle input/output based on span type\n // Always add input/output for Laminar compatibility\n if (span.input !== undefined) {\n const inputStr = typeof span.input === 'string' ? span.input : JSON.stringify(span.input);\n // Add specific attributes based on span type\n if (span.type === SpanType.MODEL_GENERATION) {\n attributes[ATTR_GEN_AI_INPUT_MESSAGES] = convertMastraMessagesToGenAIMessages(inputStr);\n } else if (span.type === SpanType.TOOL_CALL || span.type === SpanType.MCP_TOOL_CALL) {\n attributes['gen_ai.tool.call.arguments'] = inputStr;\n } else {\n attributes[`mastra.${spanType}.input`] = inputStr;\n }\n }\n\n if (span.output !== undefined) {\n const outputStr = typeof span.output === 'string' ? span.output : JSON.stringify(span.output);\n // Add specific attributes based on span type\n if (span.type === SpanType.MODEL_GENERATION) {\n attributes[ATTR_GEN_AI_OUTPUT_MESSAGES] = convertMastraMessagesToGenAIMessages(outputStr);\n // TODO\n // attributes['gen_ai.output.type'] = image/json/speech/text/<other>\n } else if (span.type === SpanType.TOOL_CALL || span.type === SpanType.MCP_TOOL_CALL) {\n attributes['gen_ai.tool.call.result'] = outputStr;\n } else {\n attributes[`mastra.${spanType}.output`] = outputStr;\n }\n }\n\n // Add model-specific attributes using OTEL semantic conventions\n if (span.type === SpanType.MODEL_GENERATION && span.attributes) {\n const modelAttrs = span.attributes as ModelGenerationAttributes;\n\n // Model and provider\n if (modelAttrs.model) {\n attributes[ATTR_GEN_AI_REQUEST_MODEL] = modelAttrs.model;\n }\n\n if (modelAttrs.provider) {\n attributes[ATTR_GEN_AI_PROVIDER_NAME] = normalizeProvider(modelAttrs.provider);\n }\n\n // Agent context - allows correlating model generation with the agent that invoked it\n if (modelAttrs.agentId) {\n attributes[ATTR_GEN_AI_AGENT_ID] = modelAttrs.agentId;\n }\n if (modelAttrs.agentName) {\n attributes[ATTR_GEN_AI_AGENT_NAME] = modelAttrs.agentName;\n }\n // Token usage - use OTEL standard naming + OpenInference conventions\n Object.assign(attributes, formatUsageMetrics(modelAttrs.usage));\n\n // Parameters using OTEL conventions\n if (modelAttrs.parameters) {\n if (modelAttrs.parameters.temperature !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_TEMPERATURE] = modelAttrs.parameters.temperature;\n }\n if (modelAttrs.parameters.maxOutputTokens !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_MAX_TOKENS] = modelAttrs.parameters.maxOutputTokens;\n }\n if (modelAttrs.parameters.topP !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_TOP_P] = modelAttrs.parameters.topP;\n }\n if (modelAttrs.parameters.topK !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_TOP_K] = modelAttrs.parameters.topK;\n }\n if (modelAttrs.parameters.presencePenalty !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_PRESENCE_PENALTY] = modelAttrs.parameters.presencePenalty;\n }\n if (modelAttrs.parameters.frequencyPenalty !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_FREQUENCY_PENALTY] = modelAttrs.parameters.frequencyPenalty;\n }\n if (modelAttrs.parameters.stopSequences) {\n attributes[ATTR_GEN_AI_REQUEST_STOP_SEQUENCES] = JSON.stringify(modelAttrs.parameters.stopSequences);\n }\n if (modelAttrs.parameters.seed) {\n attributes[ATTR_GEN_AI_REQUEST_SEED] = modelAttrs.parameters.seed;\n }\n }\n\n // Response attributes\n if (modelAttrs.finishReason) {\n attributes[ATTR_GEN_AI_RESPONSE_FINISH_REASONS] = JSON.stringify([modelAttrs.finishReason]);\n }\n if (modelAttrs.responseModel) {\n attributes[ATTR_GEN_AI_RESPONSE_MODEL] = modelAttrs.responseModel;\n }\n if (modelAttrs.responseId) {\n attributes[ATTR_GEN_AI_RESPONSE_ID] = modelAttrs.responseId;\n }\n\n // Server attributes\n if (modelAttrs.serverAddress) {\n attributes[ATTR_SERVER_ADDRESS] = modelAttrs.serverAddress;\n }\n if (modelAttrs.serverPort !== undefined) {\n attributes[ATTR_SERVER_PORT] = modelAttrs.serverPort;\n }\n }\n\n // Add tool-specific attributes using OTEL conventions\n if ((span.type === SpanType.TOOL_CALL || span.type === SpanType.MCP_TOOL_CALL) && span.attributes) {\n const toolAttrs = span.attributes as ToolCallAttributes | MCPToolCallAttributes;\n\n // Tool identification\n if (toolAttrs.toolId) {\n attributes[ATTR_GEN_AI_TOOL_NAME] = toolAttrs.toolId;\n }\n\n //TODO:\n // attributes['gen_ai.tool.call.id'] = call_mszuSIzqtI65i1wAUOE8w5H4\n // attributes['gen_ai.tool.type'] = function; extension; datastore\n\n // MCP-specific attributes\n if (span.type === SpanType.MCP_TOOL_CALL) {\n const mcpAttrs = toolAttrs as MCPToolCallAttributes;\n if (mcpAttrs.mcpServer) {\n attributes[ATTR_SERVER_ADDRESS] = mcpAttrs.mcpServer;\n }\n } else {\n if ((toolAttrs as ToolCallAttributes).toolDescription) {\n attributes[ATTR_GEN_AI_TOOL_DESCRIPTION] = (toolAttrs as ToolCallAttributes).toolDescription;\n }\n }\n }\n\n // Add agent-specific attributes\n if (span.type === SpanType.AGENT_RUN && span.attributes) {\n const agentAttrs = span.attributes as AgentRunAttributes;\n if (agentAttrs.agentId) {\n attributes[ATTR_GEN_AI_AGENT_ID] = agentAttrs.agentId;\n }\n if (agentAttrs.agentName) {\n attributes[ATTR_GEN_AI_AGENT_NAME] = agentAttrs.agentName;\n }\n if (agentAttrs.conversationId) {\n attributes[ATTR_GEN_AI_CONVERSATION_ID] = agentAttrs.conversationId;\n }\n if (agentAttrs.maxSteps) {\n attributes[`mastra.${spanType}.max_steps`] = agentAttrs.maxSteps;\n }\n if (agentAttrs.availableTools) {\n attributes[`gen_ai.tool.definitions`] = JSON.stringify(agentAttrs.availableTools);\n }\n\n //TODO:\n // attributes[ATTR_GEN_AI_AGENT_DESCRIPTION] = agentAttrs.description;\n // attributes[ATTR_GEN_AI_REQUEST_MODEL] = agentAttrs.model.name;\n\n attributes[ATTR_GEN_AI_SYSTEM_INSTRUCTIONS] = agentAttrs.instructions;\n }\n\n // Add error information if present\n if (span.errorInfo) {\n attributes[ATTR_ERROR_TYPE] = span.errorInfo.id || 'unknown';\n attributes[ATTR_ERROR_MESSAGE] = span.errorInfo.message;\n if (span.errorInfo.domain) {\n attributes['error.domain'] = span.errorInfo.domain;\n }\n if (span.errorInfo.category) {\n attributes['error.category'] = span.errorInfo.category;\n }\n }\n\n return attributes;\n}\n\n/**\n * Canonical OTel provider keys mapped to a list of possible fuzzy aliases.\n */\nconst PROVIDER_ALIASES: Record<string, string[]> = {\n anthropic: ['anthropic', 'claude'],\n 'aws.bedrock': ['awsbedrock', 'bedrock', 'amazonbedrock'],\n 'azure.ai.inference': ['azureaiinference', 'azureinference'],\n 'azure.ai.openai': ['azureaiopenai', 'azureopenai', 'msopenai', 'microsoftopenai'],\n cohere: ['cohere'],\n deepseek: ['deepseek'],\n 'gcp.gemini': ['gcpgemini', 'gemini'],\n 'gcp.gen_ai': ['gcpgenai', 'googlegenai', 'googleai'],\n 'gcp.vertex_ai': ['gcpvertexai', 'vertexai'],\n groq: ['groq'],\n 'ibm.watsonx.ai': ['ibmwatsonxai', 'watsonx', 'watsonxai'],\n mistral_ai: ['mistral', 'mistralai'],\n openai: ['openai', 'oai'],\n perplexity: ['perplexity', 'pplx'],\n x_ai: ['xai', 'x-ai', 'x_ai', 'x.com ai'],\n};\n\n/**\n * Normalize a provider input string into a matchable token.\n * Keep only alphanumerics and lowercase the result.\n */\nfunction normalizeProviderString(input: string): string {\n return input.toLowerCase().replace(/[^a-z0-9]/g, '');\n}\n\n/**\n * Attempts to map a providerName to one of the canonical OTel provider names.\n * If no match is found, returns the original providerName unchanged.\n */\nfunction normalizeProvider(providerName: string): string {\n const normalized = normalizeProviderString(providerName);\n\n for (const [canonical, aliases] of Object.entries(PROVIDER_ALIASES)) {\n for (const alias of aliases) {\n if (normalized === alias) {\n return canonical;\n }\n }\n }\n\n // No match → return the raw input in lowercase\n return providerName.toLowerCase();\n}\n","/**\n * Convert Mastra Spans to OpenTelemetry spans\n */\nimport { readFileSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport { SpanType } from '@mastra/core/observability';\nimport type { AnyExportedSpan } from '@mastra/core/observability';\nimport { SpanKind, SpanStatusCode, TraceFlags } from '@opentelemetry/api';\nimport type { HrTime, Link, SpanContext, SpanStatus } from '@opentelemetry/api';\nimport type { InstrumentationScope } from '@opentelemetry/core';\nimport type { Resource } from '@opentelemetry/resources';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\n\nimport type { ReadableSpan, TimedEvent } from '@opentelemetry/sdk-trace-base';\nimport {\n ATTR_SERVICE_NAME,\n ATTR_SERVICE_VERSION,\n ATTR_TELEMETRY_SDK_LANGUAGE,\n ATTR_TELEMETRY_SDK_NAME,\n ATTR_TELEMETRY_SDK_VERSION,\n} from '@opentelemetry/semantic-conventions';\n\nimport { getAttributes, getSpanName } from './gen-ai-semantics.js';\nimport type { OtelExporterConfig } from './types.js';\n\nexport type SpanFormat = 'GenAI_v1_38_0';\n\n// If more formats come later:\n// export type SpanFormat =\n// | \"GenAI_v1_38_0\"\n// | \"GenAI_v1_38_0\"\n// | \"Custom_v2\";\n\nexport class SpanConverter {\n private resource?: Resource;\n private scope?: InstrumentationScope;\n private initPromise?: Promise<void>;\n private format: SpanFormat;\n\n constructor(\n private readonly params: {\n format: SpanFormat;\n packageName: string;\n serviceName?: string;\n config?: OtelExporterConfig;\n },\n ) {\n this.format = params.format;\n }\n\n /**\n * Lazily initialize resource & scope on first use.\n * Subsequent calls reuse the same promise (no races).\n */\n private async initIfNeeded(): Promise<void> {\n if (this.initPromise) {\n return this.initPromise;\n }\n\n this.initPromise = (async () => {\n const packageVersion = (await getPackageVersion(this.params.packageName)) ?? 'unknown';\n\n const serviceVersion = (await getPackageVersion('@mastra/core')) ?? 'unknown';\n\n let resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: this.params.serviceName || 'mastra-service',\n [ATTR_SERVICE_VERSION]: serviceVersion,\n [ATTR_TELEMETRY_SDK_NAME]: this.params.packageName,\n [ATTR_TELEMETRY_SDK_VERSION]: packageVersion,\n [ATTR_TELEMETRY_SDK_LANGUAGE]: 'nodejs',\n });\n\n if (this.params.config?.resourceAttributes) {\n resource = resource.merge(\n // Duplicate attributes from config will override defaults above\n resourceFromAttributes(this.params.config.resourceAttributes),\n );\n }\n\n this.resource = resource;\n this.scope = {\n name: this.params.packageName,\n version: packageVersion,\n };\n })();\n\n return this.initPromise;\n }\n\n /**\n * Convert a Mastra Span to an OpenTelemetry ReadableSpan\n */\n async convertSpan(span: AnyExportedSpan): Promise<ReadableSpan> {\n await this.initIfNeeded();\n\n if (!this.resource || !this.scope) {\n throw new Error('SpanConverter not initialized correctly');\n }\n\n // --- Core fields derived from Mastra span ---\n const name = getSpanName(span);\n const kind = getSpanKind(span.type);\n const attributes = getAttributes(span);\n\n // Add metadata as custom attributes (not gen_ai specific)\n if (span.metadata) {\n for (const [k, v] of Object.entries(span.metadata)) {\n if (v === null || v === undefined) {\n continue;\n }\n attributes[`mastra.metadata.${k}`] = typeof v === 'object' ? JSON.stringify(v) : v;\n }\n }\n\n // Add tags for root spans (only root spans can have tags)\n // Tags are JSON-stringified for maximum backend compatibility\n // While OTEL spec supports arrays, many backends (Jaeger, Zipkin, Tempo) don't fully support them\n if (span.isRootSpan && span.tags?.length) {\n attributes['mastra.tags'] = JSON.stringify(span.tags);\n }\n\n const startTime = dateToHrTime(span.startTime);\n const endTime = span.endTime ? dateToHrTime(span.endTime) : startTime;\n const duration = computeDuration(span.startTime, span.endTime);\n\n const { status, events } = buildStatusAndEvents(span, startTime);\n\n const spanContext: SpanContext = {\n traceId: span.traceId,\n spanId: span.id,\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n };\n\n const parentSpanContext = span.parentSpanId\n ? {\n traceId: span.traceId,\n spanId: span.parentSpanId,\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n }\n : undefined;\n\n const links: Link[] = []; // fill if you add link support later\n\n const readable: ReadableSpan = {\n name,\n kind,\n spanContext: () => spanContext,\n parentSpanContext,\n startTime,\n endTime,\n status,\n attributes,\n links,\n events,\n duration,\n ended: !!span.endTime,\n resource: this.resource,\n instrumentationScope: this.scope,\n droppedAttributesCount: 0,\n droppedEventsCount: 0,\n droppedLinksCount: 0,\n };\n\n return readable;\n }\n}\n\nasync function getPackageVersion(pkgName: string): Promise<string | undefined> {\n try {\n // Resolve `package.json` for the given package\n const manifestUrl = new URL(await import.meta.resolve(`${pkgName}/package.json`));\n\n const path = fileURLToPath(manifestUrl);\n const pkgJson = JSON.parse(readFileSync(path, 'utf8'));\n return pkgJson.version;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Get the appropriate Otel SpanKind based on Mastra SpanType.\n *\n * @param type - The Mastra span type\n * @returns The appropriate OTEL SpanKind\n */\nexport function getSpanKind(type: SpanType): SpanKind {\n switch (type) {\n case SpanType.MODEL_GENERATION:\n case SpanType.MCP_TOOL_CALL:\n return SpanKind.CLIENT;\n default:\n return SpanKind.INTERNAL;\n }\n}\n\n/**\n * Convert JavaScript Date to hrtime format\n */\nfunction dateToHrTime(date: Date): HrTime {\n const ms = date.getTime();\n const seconds = Math.floor(ms / 1000);\n const nanoseconds = (ms % 1000) * 1000000;\n return [seconds, nanoseconds];\n}\n\nfunction computeDuration(start: Date, end?: Date): HrTime {\n if (!end) return [0, 0];\n const diffMs = end.getTime() - start.getTime();\n return [Math.floor(diffMs / 1000), (diffMs % 1000) * 1_000_000];\n}\n\n/**\n * Build status + events from span.errorInfo (if present)\n */\nfunction buildStatusAndEvents(\n span: AnyExportedSpan,\n defaultTime: HrTime,\n): { status: SpanStatus; events: TimedEvent[] } {\n const events: TimedEvent[] = [];\n\n if (span.errorInfo) {\n const status: SpanStatus = {\n code: SpanStatusCode.ERROR,\n message: span.errorInfo.message,\n };\n\n events.push({\n name: 'exception',\n attributes: {\n 'exception.message': span.errorInfo.message,\n 'exception.type': 'Error',\n ...(span.errorInfo.details?.stack && {\n 'exception.stacktrace': span.errorInfo.details.stack as string,\n }),\n },\n time: defaultTime,\n droppedAttributesCount: 0,\n });\n\n return { status, events };\n }\n\n if (span.endTime) {\n return {\n status: { code: SpanStatusCode.OK },\n events,\n };\n }\n\n return {\n status: { code: SpanStatusCode.UNSET },\n events,\n };\n}\n","/**\n * OpenTelemetry Tracing Exporter for Mastra\n */\n\nimport type {\n TracingEvent,\n AnyExportedSpan,\n InitExporterOptions,\n ObservabilityInstanceConfig,\n} from '@mastra/core/observability';\nimport { TracingEventType } from '@mastra/core/observability';\nimport { BaseExporter } from '@mastra/observability';\nimport { diag, DiagConsoleLogger, DiagLogLevel } from '@opentelemetry/api';\n\nimport { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport type { SpanExporter } from '@opentelemetry/sdk-trace-base';\n\nimport { loadExporter } from './loadExporter.js';\nimport { resolveProviderConfig } from './provider-configs.js';\nimport { SpanConverter } from './span-converter.js';\nimport type { OtelExporterConfig } from './types.js';\n\nexport class OtelExporter extends BaseExporter {\n private config: OtelExporterConfig;\n private observabilityConfig?: ObservabilityInstanceConfig;\n private spanConverter?: SpanConverter;\n private processor?: BatchSpanProcessor;\n private exporter?: SpanExporter;\n private isSetup: boolean = false;\n\n name = 'opentelemetry';\n\n constructor(config: OtelExporterConfig) {\n super(config);\n\n this.config = config;\n\n // Set up OpenTelemetry diagnostics if debug mode\n if (config.logLevel === 'debug') {\n diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.DEBUG);\n }\n }\n\n /**\n * Initialize with tracing configuration\n */\n init(options: InitExporterOptions) {\n this.observabilityConfig = options.config;\n }\n\n private async setupExporter() {\n // already setup or exporter already set\n if (this.isSetup || this.exporter) return;\n\n // Provider configuration is required\n if (!this.config.provider) {\n this.logger.error(\n '[OtelExporter] Provider configuration is required. Use the \"custom\" provider for generic endpoints.',\n );\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n // Resolve provider configuration\n const resolved = resolveProviderConfig(this.config.provider);\n if (!resolved) {\n // Configuration validation failed, disable tracing\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n // user provided an instantiated SpanExporter, use it\n if (this.config.exporter) {\n this.exporter = this.config.exporter;\n return;\n }\n\n const endpoint = resolved.endpoint;\n const headers = resolved.headers;\n const protocol = resolved.protocol;\n\n // Load and create the appropriate exporter based on protocol\n const providerName = Object.keys(this.config.provider)[0];\n const ExporterClass = await loadExporter(protocol, providerName);\n\n if (!ExporterClass) {\n // Exporter not available, disable tracing\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n try {\n if (protocol === 'zipkin') {\n this.exporter = new ExporterClass({\n url: endpoint,\n headers,\n });\n } else if (protocol === 'grpc') {\n // gRPC uses Metadata object instead of headers\n // Dynamically import @grpc/grpc-js to create metadata\n let metadata: any;\n try {\n // @ts-ignore - Dynamic import for optional dependency\n const grpcModule = await import('@grpc/grpc-js');\n metadata = new grpcModule.Metadata();\n Object.entries(headers).forEach(([key, value]) => {\n metadata.set(key, value);\n });\n } catch (grpcError) {\n this.logger.error(\n `[OtelExporter] Failed to load gRPC metadata. Install required packages:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-grpc @grpc/grpc-js\\n`,\n grpcError,\n );\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n this.exporter = new ExporterClass({\n url: endpoint,\n metadata,\n timeoutMillis: this.config.timeout,\n });\n } else {\n // HTTP/JSON and HTTP/Protobuf use headers\n this.exporter = new ExporterClass({\n url: endpoint,\n headers,\n timeoutMillis: this.config.timeout,\n });\n }\n } catch (error) {\n this.logger.error(`[OtelExporter] Failed to create exporter:`, error);\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n }\n\n private async setupProcessor() {\n if (this.processor || this.isSetup) return;\n\n this.spanConverter = new SpanConverter({\n packageName: '@mastra/otel-exporter',\n serviceName: this.observabilityConfig?.serviceName,\n config: this.config,\n format: 'GenAI_v1_38_0',\n });\n\n // Always use BatchSpanProcessor for production\n // It queues spans and exports them in batches for better performance\n this.processor = new BatchSpanProcessor(this.exporter!, {\n maxExportBatchSize: this.config.batchSize || 512, // Default batch size\n maxQueueSize: 2048, // Maximum spans to queue\n scheduledDelayMillis: 5000, // Export every 5 seconds\n exportTimeoutMillis: this.config.timeout || 30000, // Export timeout\n });\n\n this.logger.debug(\n `[OtelExporter] Using BatchSpanProcessor (batch size: ${this.config.batchSize || 512}, delay: 5s)`,\n );\n }\n\n private async setup() {\n if (this.isSetup) return;\n await this.setupExporter();\n await this.setupProcessor();\n this.isSetup = true;\n }\n\n protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n // Only process SPAN_ENDED events for OTEL\n // OTEL expects complete spans with start and end times\n if (event.type !== TracingEventType.SPAN_ENDED) {\n return;\n }\n\n const span = event.exportedSpan;\n await this.exportSpan(span);\n }\n\n private async exportSpan(span: AnyExportedSpan): Promise<void> {\n // Ensure exporter is set up\n if (!this.isSetup) {\n await this.setup();\n }\n\n // Skip if disabled\n if (this.isDisabled || !this.processor) {\n return;\n }\n\n try {\n // Convert the span to OTEL format\n const otelSpan = await this.spanConverter!.convertSpan(span);\n\n // Export the span immediately through the processor\n // The processor will handle batching if configured\n await new Promise<void>(resolve => {\n this.processor!.onEnd(otelSpan);\n resolve();\n });\n\n this.logger.debug(\n `[OtelExporter] Exported span ${span.id} (trace: ${span.traceId}, parent: ${span.parentSpanId || 'none'}, type: ${span.type})`,\n );\n } catch (error) {\n this.logger.error(`[OtelExporter] Failed to export span ${span.id}:`, error);\n }\n }\n\n async shutdown(): Promise<void> {\n // Shutdown the processor to flush any remaining spans\n if (this.processor) {\n await this.processor.shutdown();\n }\n }\n}\n"]}
|
package/dist/index.js
CHANGED
|
@@ -6,7 +6,7 @@ import { readFileSync } from 'fs';
|
|
|
6
6
|
import { fileURLToPath } from 'url';
|
|
7
7
|
import { resourceFromAttributes } from '@opentelemetry/resources';
|
|
8
8
|
import { ATTR_TELEMETRY_SDK_LANGUAGE, ATTR_TELEMETRY_SDK_VERSION, ATTR_TELEMETRY_SDK_NAME, ATTR_SERVICE_VERSION, ATTR_SERVICE_NAME } from '@opentelemetry/semantic-conventions';
|
|
9
|
-
import { ATTR_GEN_AI_OPERATION_NAME, ATTR_GEN_AI_INPUT_MESSAGES, ATTR_GEN_AI_OUTPUT_MESSAGES, ATTR_GEN_AI_REQUEST_MODEL, ATTR_GEN_AI_PROVIDER_NAME,
|
|
9
|
+
import { ATTR_GEN_AI_OPERATION_NAME, ATTR_GEN_AI_INPUT_MESSAGES, ATTR_GEN_AI_OUTPUT_MESSAGES, ATTR_GEN_AI_REQUEST_MODEL, ATTR_GEN_AI_PROVIDER_NAME, ATTR_GEN_AI_AGENT_ID, ATTR_GEN_AI_AGENT_NAME, ATTR_GEN_AI_REQUEST_TEMPERATURE, ATTR_GEN_AI_REQUEST_MAX_TOKENS, ATTR_GEN_AI_REQUEST_TOP_P, ATTR_GEN_AI_REQUEST_TOP_K, ATTR_GEN_AI_REQUEST_PRESENCE_PENALTY, ATTR_GEN_AI_REQUEST_FREQUENCY_PENALTY, ATTR_GEN_AI_REQUEST_STOP_SEQUENCES, ATTR_GEN_AI_REQUEST_SEED, ATTR_GEN_AI_RESPONSE_FINISH_REASONS, ATTR_GEN_AI_RESPONSE_MODEL, ATTR_GEN_AI_RESPONSE_ID, ATTR_SERVER_ADDRESS, ATTR_SERVER_PORT, ATTR_GEN_AI_TOOL_NAME, ATTR_GEN_AI_TOOL_DESCRIPTION, ATTR_GEN_AI_CONVERSATION_ID, ATTR_GEN_AI_SYSTEM_INSTRUCTIONS, ATTR_ERROR_TYPE, ATTR_ERROR_MESSAGE, ATTR_GEN_AI_USAGE_INPUT_TOKENS, ATTR_GEN_AI_USAGE_OUTPUT_TOKENS } from '@opentelemetry/semantic-conventions/incubating';
|
|
10
10
|
|
|
11
11
|
// src/tracing.ts
|
|
12
12
|
|
|
@@ -284,6 +284,32 @@ var convertMastraMessagesToGenAIMessages = (inputOutputString) => {
|
|
|
284
284
|
};
|
|
285
285
|
|
|
286
286
|
// src/gen-ai-semantics.ts
|
|
287
|
+
function formatUsageMetrics(usage) {
|
|
288
|
+
if (!usage) return {};
|
|
289
|
+
const metrics = {};
|
|
290
|
+
if (usage.inputTokens !== void 0) {
|
|
291
|
+
metrics[ATTR_GEN_AI_USAGE_INPUT_TOKENS] = usage.inputTokens;
|
|
292
|
+
}
|
|
293
|
+
if (usage.outputTokens !== void 0) {
|
|
294
|
+
metrics[ATTR_GEN_AI_USAGE_OUTPUT_TOKENS] = usage.outputTokens;
|
|
295
|
+
}
|
|
296
|
+
if (usage.outputDetails?.reasoning !== void 0) {
|
|
297
|
+
metrics["gen_ai.usage.reasoning_tokens"] = usage.outputDetails.reasoning;
|
|
298
|
+
}
|
|
299
|
+
if (usage.inputDetails?.cacheRead !== void 0) {
|
|
300
|
+
metrics["gen_ai.usage.cached_input_tokens"] = usage.inputDetails.cacheRead;
|
|
301
|
+
}
|
|
302
|
+
if (usage.inputDetails?.cacheWrite !== void 0) {
|
|
303
|
+
metrics["gen_ai.usage.cache_write_tokens"] = usage.inputDetails.cacheWrite;
|
|
304
|
+
}
|
|
305
|
+
if (usage.inputDetails?.audio !== void 0) {
|
|
306
|
+
metrics["gen_ai.usage.audio_input_tokens"] = usage.inputDetails.audio;
|
|
307
|
+
}
|
|
308
|
+
if (usage.outputDetails?.audio !== void 0) {
|
|
309
|
+
metrics["gen_ai.usage.audio_output_tokens"] = usage.outputDetails.audio;
|
|
310
|
+
}
|
|
311
|
+
return metrics;
|
|
312
|
+
}
|
|
287
313
|
function getOperationName(span) {
|
|
288
314
|
switch (span.type) {
|
|
289
315
|
case SpanType.MODEL_GENERATION:
|
|
@@ -366,22 +392,13 @@ function getAttributes(span) {
|
|
|
366
392
|
if (modelAttrs.provider) {
|
|
367
393
|
attributes[ATTR_GEN_AI_PROVIDER_NAME] = normalizeProvider(modelAttrs.provider);
|
|
368
394
|
}
|
|
369
|
-
if (modelAttrs.
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
}
|
|
375
|
-
if (outputTokens !== void 0) {
|
|
376
|
-
attributes[ATTR_GEN_AI_USAGE_OUTPUT_TOKENS] = outputTokens;
|
|
377
|
-
}
|
|
378
|
-
if (modelAttrs.usage.reasoningTokens !== void 0) {
|
|
379
|
-
attributes["gen_ai.usage.reasoning_tokens"] = modelAttrs.usage.reasoningTokens;
|
|
380
|
-
}
|
|
381
|
-
if (modelAttrs.usage.cachedInputTokens !== void 0) {
|
|
382
|
-
attributes["gen_ai.usage.cached_input_tokens"] = modelAttrs.usage.cachedInputTokens;
|
|
383
|
-
}
|
|
395
|
+
if (modelAttrs.agentId) {
|
|
396
|
+
attributes[ATTR_GEN_AI_AGENT_ID] = modelAttrs.agentId;
|
|
397
|
+
}
|
|
398
|
+
if (modelAttrs.agentName) {
|
|
399
|
+
attributes[ATTR_GEN_AI_AGENT_NAME] = modelAttrs.agentName;
|
|
384
400
|
}
|
|
401
|
+
Object.assign(attributes, formatUsageMetrics(modelAttrs.usage));
|
|
385
402
|
if (modelAttrs.parameters) {
|
|
386
403
|
if (modelAttrs.parameters.temperature !== void 0) {
|
|
387
404
|
attributes[ATTR_GEN_AI_REQUEST_TEMPERATURE] = modelAttrs.parameters.temperature;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/loadExporter.ts","../src/provider-configs.ts","../src/gen-ai-messages.ts","../src/gen-ai-semantics.ts","../src/span-converter.ts","../src/tracing.ts"],"names":["SpanType"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Dynamic loader for optional OtelExporters\n */\n\nimport type { ExportProtocol } from './types.js';\n\n// Dynamic imports for optional dependencies\nlet OTLPHttpExporter: any;\nlet OTLPGrpcExporter: any;\nlet OTLPProtoExporter: any;\nlet ZipkinExporter: any;\n\nexport async function loadExporter(protocol: ExportProtocol, provider?: string): Promise<any> {\n switch (protocol) {\n case 'zipkin':\n if (!ZipkinExporter) {\n try {\n const module = await import('@opentelemetry/exporter-zipkin');\n ZipkinExporter = module.ZipkinExporter;\n } catch {\n console.error(\n `[OtelExporter] Zipkin exporter is not installed.\\n` +\n `To use Zipkin export, install the required package:\\n` +\n ` npm install @opentelemetry/exporter-zipkin`,\n );\n return null;\n }\n }\n return ZipkinExporter;\n\n case 'grpc':\n if (!OTLPGrpcExporter) {\n try {\n const module = await import('@opentelemetry/exporter-trace-otlp-grpc');\n OTLPGrpcExporter = module.OTLPTraceExporter;\n } catch {\n const providerInfo = provider ? ` (required for ${provider})` : '';\n console.error(\n `[OtelExporter] gRPC exporter is not installed${providerInfo}.\\n` +\n `To use gRPC export, install the required packages:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-grpc @grpc/grpc-js`,\n );\n return null;\n }\n }\n return OTLPGrpcExporter;\n\n case 'http/protobuf':\n if (!OTLPProtoExporter) {\n try {\n const module = await import('@opentelemetry/exporter-trace-otlp-proto');\n OTLPProtoExporter = module.OTLPTraceExporter;\n } catch {\n const providerInfo = provider ? ` (required for ${provider})` : '';\n console.error(\n `[OtelExporter] HTTP/Protobuf exporter is not installed${providerInfo}.\\n` +\n `To use HTTP/Protobuf export, install the required package:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-proto`,\n );\n return null;\n }\n }\n return OTLPProtoExporter;\n\n case 'http/json':\n default:\n if (!OTLPHttpExporter) {\n try {\n const module = await import('@opentelemetry/exporter-trace-otlp-http');\n OTLPHttpExporter = module.OTLPTraceExporter;\n } catch {\n const providerInfo = provider ? ` (required for ${provider})` : '';\n console.error(\n `[OtelExporter] HTTP/JSON exporter is not installed${providerInfo}.\\n` +\n `To use HTTP/JSON export, install the required package:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-http`,\n );\n return null;\n }\n }\n return OTLPHttpExporter;\n }\n}\n","/**\n * Provider-specific configurations for OtelExporters\n */\n\nimport type {\n ProviderConfig,\n ExportProtocol,\n Dash0Config,\n SignozConfig,\n NewRelicConfig,\n TraceloopConfig,\n LaminarConfig,\n CustomConfig,\n} from './types.js';\n\nexport interface ResolvedProviderConfig {\n endpoint: string;\n headers: Record<string, string>;\n protocol: ExportProtocol;\n}\n\nexport function resolveProviderConfig(config: ProviderConfig): ResolvedProviderConfig | null {\n if ('dash0' in config) {\n return resolveDash0Config(config.dash0);\n } else if ('signoz' in config) {\n return resolveSignozConfig(config.signoz);\n } else if ('newrelic' in config) {\n return resolveNewRelicConfig(config.newrelic);\n } else if ('traceloop' in config) {\n return resolveTraceloopConfig(config.traceloop);\n } else if ('laminar' in config) {\n return resolveLaminarConfig(config.laminar);\n } else if ('custom' in config) {\n return resolveCustomConfig(config.custom);\n } else {\n // TypeScript exhaustiveness check\n const _exhaustive: never = config;\n return _exhaustive;\n }\n}\n\nfunction resolveDash0Config(config: Dash0Config): ResolvedProviderConfig | null {\n 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 * Utilities for converting Mastra messages to OpenTelemetry gen_ai message format\n * Based on OpenTelemetry GenAI semantic conventions\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/#gen-ai-input-messages\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-input-messages.json\n */\n\n/**\n * Type representation of a gen_ai chat message part\n */\ntype GenAIMessagePart =\n | {\n type: 'text';\n content: string;\n }\n | {\n type: 'tool_call';\n id: string;\n name: string;\n arguments: string;\n }\n | {\n type: 'tool_call_response';\n id: string;\n name: string;\n response: string;\n };\n\n/**\n * Type representation of a gen_ai chat message\n */\ntype GenAIMessage = {\n role: string;\n parts: GenAIMessagePart[];\n};\n\n/**\n * Assumed type representation of a Mastra message content type\n */\ntype MastraMessagePart =\n | {\n type: 'text';\n text: string;\n }\n | { type: 'tool-call'; toolCallId: string; toolName: string; input: unknown }\n | { type: 'tool-result'; toolCallId: string; toolName: string; output: { value: unknown } };\n\n/**\n * Assumed type representation of a Mastra message\n */\ntype MastraMessage = {\n role: string;\n content: MastraMessagePart[] | string;\n};\n\nconst isMastraMessagePart = (p: unknown): p is MastraMessagePart => {\n return (\n typeof p === 'object' &&\n p != null &&\n 'type' in p &&\n (p.type === 'text' || p.type === 'tool-call' || p.type === 'tool-result') &&\n ((p.type === 'text' && 'text' in p) ||\n (p.type === 'tool-call' && 'toolCallId' in p && 'toolName' in p && 'input' in p) ||\n (p.type === 'tool-result' && 'toolCallId' in p && 'toolName' in p && 'output' in p))\n );\n};\n\nconst isMastraMessage = (m: unknown): m is MastraMessage => {\n return (\n typeof m === 'object' &&\n m != null &&\n 'role' in m &&\n 'content' in m &&\n (typeof m.content === 'string' || (Array.isArray(m.content) && m.content.every(isMastraMessagePart)))\n );\n};\n\n/**\n * Convert an Input/Output string from a MastraSpan into a jsonified string that adheres to\n * OpenTelemetry gen_ai.input.messages and gen_ai.output.messages schema.\n * If parsing fails at any step, the original inputOutputString is returned unmodified.\n *\n * This conversion is best effort; It assumes a consistent shape for mastra messages, and converts\n * into the gen_ai input and output schemas as of October 20th, 2025.\n *\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/#gen-ai-input-messages\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-input-messages.json\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/#gen-ai-output-messages\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-output-messages.json\n *\n * @param inputOutputString a jsonified string that contains messages adhering to what appears to be\n * Mastra's message shape.\n * @returns a jsonified string that contains messages adhering to the OpenTelemetry gen_ai.input.messages and gen_ai.output.messages schema.\n * If parsing fails at any step, the original inputOutputString is returned unmodified.\n */\nexport const convertMastraMessagesToGenAIMessages = (inputOutputString: string): string => {\n try {\n const parsedIO = JSON.parse(inputOutputString) as unknown;\n if (typeof parsedIO !== 'object' || parsedIO == null || (!('messages' in parsedIO) && !('text' in parsedIO))) {\n // inputOutputString fails initial type guard, just return it\n return inputOutputString;\n }\n // if the IO simply contains a text string, return a single text message\n // formatted as a gen_ai assistant message, assuming its an assistant response\n if ('text' in parsedIO) {\n return JSON.stringify([\n {\n role: 'assistant',\n parts: [{ type: 'text', content: parsedIO.text as string }],\n } satisfies GenAIMessage,\n ]);\n }\n // if the IO contains messages, convert them to gen_ai messages\n if (Array.isArray(parsedIO.messages)) {\n return JSON.stringify(\n (parsedIO.messages as unknown[]).map(m => {\n if (!isMastraMessage(m)) {\n return m;\n }\n const role = m.role;\n let parts: GenAIMessagePart[] = [];\n if (Array.isArray(m.content)) {\n parts = m.content.map(c => {\n switch (c.type) {\n case 'text':\n return {\n type: 'text',\n content: c.text,\n };\n case 'tool-call':\n return {\n type: 'tool_call',\n id: c.toolCallId,\n name: c.toolName,\n arguments: JSON.stringify(c.input),\n };\n case 'tool-result':\n return {\n type: 'tool_call_response',\n id: c.toolCallId,\n name: c.toolName,\n response: JSON.stringify(c.output.value),\n };\n default:\n return c;\n }\n });\n } else {\n parts = [\n {\n type: 'text',\n content: m.content,\n },\n ];\n }\n return {\n role,\n parts,\n } satisfies GenAIMessage;\n }),\n );\n }\n // we've failed type-guards, just return original I/O string\n return inputOutputString;\n } catch {\n // silently fallback to original I/O string\n return inputOutputString;\n }\n};\n","/**\n * Utilities for converting Mastra Spans to OTel Spans\n * with Semantic conventions for generative AI systems\n * @see https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/gen-ai/README.md\n * @see https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/gen-ai/gen-ai-events.md\n * @see https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/gen-ai/gen-ai-spans.md\n * @see https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/gen-ai/gen-ai-agent-spans.md\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/non-normative/examples-llm-calls/\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/\n */\n\nimport { SpanType } from '@mastra/core/observability';\nimport type {\n AgentRunAttributes,\n AnyExportedSpan,\n MCPToolCallAttributes,\n ModelGenerationAttributes,\n ToolCallAttributes,\n WorkflowRunAttributes,\n} from '@mastra/core/observability';\nimport type { Attributes } from '@opentelemetry/api';\nimport {\n ATTR_ERROR_MESSAGE,\n ATTR_ERROR_TYPE,\n ATTR_GEN_AI_PROVIDER_NAME,\n ATTR_GEN_AI_REQUEST_MODEL,\n ATTR_GEN_AI_RESPONSE_MODEL,\n ATTR_GEN_AI_REQUEST_MAX_TOKENS,\n ATTR_GEN_AI_REQUEST_TEMPERATURE,\n ATTR_GEN_AI_REQUEST_TOP_P,\n ATTR_GEN_AI_REQUEST_TOP_K,\n ATTR_GEN_AI_REQUEST_PRESENCE_PENALTY,\n ATTR_GEN_AI_REQUEST_FREQUENCY_PENALTY,\n ATTR_GEN_AI_REQUEST_STOP_SEQUENCES,\n ATTR_GEN_AI_REQUEST_SEED,\n ATTR_GEN_AI_INPUT_MESSAGES,\n ATTR_GEN_AI_OUTPUT_MESSAGES,\n ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n ATTR_GEN_AI_AGENT_ID,\n ATTR_GEN_AI_AGENT_NAME,\n ATTR_GEN_AI_TOOL_DESCRIPTION,\n ATTR_GEN_AI_OPERATION_NAME,\n ATTR_GEN_AI_RESPONSE_FINISH_REASONS,\n ATTR_GEN_AI_RESPONSE_ID,\n ATTR_GEN_AI_CONVERSATION_ID,\n ATTR_GEN_AI_SYSTEM_INSTRUCTIONS,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n ATTR_GEN_AI_TOOL_NAME,\n} from '@opentelemetry/semantic-conventions/incubating';\nimport { convertMastraMessagesToGenAIMessages } from './gen-ai-messages';\n\n/**\n * Get the operation name based on span type for gen_ai.operation.name\n */\nfunction getOperationName(span: AnyExportedSpan): string {\n switch (span.type) {\n case SpanType.MODEL_GENERATION:\n return 'chat';\n case SpanType.TOOL_CALL:\n case SpanType.MCP_TOOL_CALL:\n return 'execute_tool';\n case SpanType.AGENT_RUN:\n return 'invoke_agent';\n case SpanType.WORKFLOW_RUN:\n return 'invoke_workflow';\n default:\n return span.type.toLowerCase();\n }\n}\n/**\n * Keep only unicode letters, numbers, dot, underscore, space, dash.\n */\nfunction sanitizeSpanName(name: string): string {\n return name.replace(/[^\\p{L}\\p{N}._ -]/gu, '');\n}\n\nfunction getSpanIdentifier(span: AnyExportedSpan): string | null {\n switch (span.type) {\n case SpanType.MODEL_GENERATION: {\n const attrs = span.attributes as ModelGenerationAttributes;\n return attrs?.model ?? 'unknown';\n }\n\n case SpanType.TOOL_CALL:\n case SpanType.MCP_TOOL_CALL: {\n const attrs = span.attributes as ToolCallAttributes | MCPToolCallAttributes;\n return attrs?.toolId ?? 'unknown';\n }\n\n case SpanType.AGENT_RUN: {\n const attrs = span.attributes as AgentRunAttributes;\n return attrs?.agentName ?? attrs?.agentId ?? 'unknown';\n }\n\n case SpanType.WORKFLOW_RUN: {\n const attrs = span.attributes as WorkflowRunAttributes;\n return attrs?.workflowId ?? 'unknown';\n }\n\n default:\n return null;\n }\n}\n\n/**\n * Get an OTEL-compliant span name based on span type and attributes\n */\nexport function getSpanName(span: AnyExportedSpan): string {\n const identifier = getSpanIdentifier(span);\n\n if (identifier) {\n const operation = getOperationName(span);\n return `${operation} ${identifier}`;\n }\n\n // For other types, use a simplified version of the original name\n return sanitizeSpanName(span.name);\n}\n\n/**\n * Gets OpenTelemetry attributes from Mastra Span\n * Following OTEL Semantic Conventions for GenAI\n */\nexport function getAttributes(span: AnyExportedSpan): Attributes {\n const attributes: Attributes = {};\n const spanType = span.type.toLowerCase();\n\n // Add gen_ai.operation.name based on span type\n attributes[ATTR_GEN_AI_OPERATION_NAME] = getOperationName(span);\n\n // Add span type for better visibility\n attributes['mastra.span.type'] = span.type;\n\n // Handle input/output based on span type\n // Always add input/output for Laminar compatibility\n if (span.input !== undefined) {\n const inputStr = typeof span.input === 'string' ? span.input : JSON.stringify(span.input);\n // Add specific attributes based on span type\n if (span.type === SpanType.MODEL_GENERATION) {\n attributes[ATTR_GEN_AI_INPUT_MESSAGES] = convertMastraMessagesToGenAIMessages(inputStr);\n } else if (span.type === SpanType.TOOL_CALL || span.type === SpanType.MCP_TOOL_CALL) {\n attributes['gen_ai.tool.call.arguments'] = inputStr;\n } else {\n attributes[`mastra.${spanType}.input`] = inputStr;\n }\n }\n\n if (span.output !== undefined) {\n const outputStr = typeof span.output === 'string' ? span.output : JSON.stringify(span.output);\n // Add specific attributes based on span type\n if (span.type === SpanType.MODEL_GENERATION) {\n attributes[ATTR_GEN_AI_OUTPUT_MESSAGES] = convertMastraMessagesToGenAIMessages(outputStr);\n // TODO\n // attributes['gen_ai.output.type'] = image/json/speech/text/<other>\n } else if (span.type === SpanType.TOOL_CALL || span.type === SpanType.MCP_TOOL_CALL) {\n attributes['gen_ai.tool.call.result'] = outputStr;\n } else {\n attributes[`mastra.${spanType}.output`] = outputStr;\n }\n }\n\n // Add model-specific attributes using OTEL semantic conventions\n if (span.type === SpanType.MODEL_GENERATION && span.attributes) {\n const modelAttrs = span.attributes as ModelGenerationAttributes;\n\n // Model and provider\n if (modelAttrs.model) {\n attributes[ATTR_GEN_AI_REQUEST_MODEL] = modelAttrs.model;\n }\n\n if (modelAttrs.provider) {\n attributes[ATTR_GEN_AI_PROVIDER_NAME] = normalizeProvider(modelAttrs.provider);\n }\n\n // Token usage - use OTEL standard naming\n if (modelAttrs.usage) {\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[ATTR_GEN_AI_USAGE_INPUT_TOKENS] = inputTokens;\n }\n if (outputTokens !== undefined) {\n attributes[ATTR_GEN_AI_USAGE_OUTPUT_TOKENS] = outputTokens;\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[ATTR_GEN_AI_REQUEST_TEMPERATURE] = modelAttrs.parameters.temperature;\n }\n if (modelAttrs.parameters.maxOutputTokens !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_MAX_TOKENS] = modelAttrs.parameters.maxOutputTokens;\n }\n if (modelAttrs.parameters.topP !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_TOP_P] = modelAttrs.parameters.topP;\n }\n if (modelAttrs.parameters.topK !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_TOP_K] = modelAttrs.parameters.topK;\n }\n if (modelAttrs.parameters.presencePenalty !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_PRESENCE_PENALTY] = modelAttrs.parameters.presencePenalty;\n }\n if (modelAttrs.parameters.frequencyPenalty !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_FREQUENCY_PENALTY] = modelAttrs.parameters.frequencyPenalty;\n }\n if (modelAttrs.parameters.stopSequences) {\n attributes[ATTR_GEN_AI_REQUEST_STOP_SEQUENCES] = JSON.stringify(modelAttrs.parameters.stopSequences);\n }\n if (modelAttrs.parameters.seed) {\n attributes[ATTR_GEN_AI_REQUEST_SEED] = modelAttrs.parameters.seed;\n }\n }\n\n // Response attributes\n if (modelAttrs.finishReason) {\n attributes[ATTR_GEN_AI_RESPONSE_FINISH_REASONS] = JSON.stringify([modelAttrs.finishReason]);\n }\n if (modelAttrs.responseModel) {\n attributes[ATTR_GEN_AI_RESPONSE_MODEL] = modelAttrs.responseModel;\n }\n if (modelAttrs.responseId) {\n attributes[ATTR_GEN_AI_RESPONSE_ID] = modelAttrs.responseId;\n }\n\n // Server attributes\n if (modelAttrs.serverAddress) {\n attributes[ATTR_SERVER_ADDRESS] = modelAttrs.serverAddress;\n }\n if (modelAttrs.serverPort !== undefined) {\n attributes[ATTR_SERVER_PORT] = modelAttrs.serverPort;\n }\n }\n\n // Add tool-specific attributes using OTEL conventions\n if ((span.type === SpanType.TOOL_CALL || span.type === SpanType.MCP_TOOL_CALL) && span.attributes) {\n const toolAttrs = span.attributes as ToolCallAttributes | MCPToolCallAttributes;\n\n // Tool identification\n if (toolAttrs.toolId) {\n attributes[ATTR_GEN_AI_TOOL_NAME] = toolAttrs.toolId;\n }\n\n //TODO:\n // attributes['gen_ai.tool.call.id'] = call_mszuSIzqtI65i1wAUOE8w5H4\n // attributes['gen_ai.tool.type'] = function; extension; datastore\n\n // MCP-specific attributes\n if (span.type === SpanType.MCP_TOOL_CALL) {\n const mcpAttrs = toolAttrs as MCPToolCallAttributes;\n if (mcpAttrs.mcpServer) {\n attributes[ATTR_SERVER_ADDRESS] = mcpAttrs.mcpServer;\n }\n } else {\n if ((toolAttrs as ToolCallAttributes).toolDescription) {\n attributes[ATTR_GEN_AI_TOOL_DESCRIPTION] = (toolAttrs as ToolCallAttributes).toolDescription;\n }\n }\n }\n\n // Add agent-specific attributes\n if (span.type === SpanType.AGENT_RUN && span.attributes) {\n const agentAttrs = span.attributes as AgentRunAttributes;\n if (agentAttrs.agentId) {\n attributes[ATTR_GEN_AI_AGENT_ID] = agentAttrs.agentId;\n }\n if (agentAttrs.agentName) {\n attributes[ATTR_GEN_AI_AGENT_NAME] = agentAttrs.agentName;\n }\n if (agentAttrs.conversationId) {\n attributes[ATTR_GEN_AI_CONVERSATION_ID] = agentAttrs.conversationId;\n }\n if (agentAttrs.maxSteps) {\n attributes[`mastra.${spanType}.max_steps`] = agentAttrs.maxSteps;\n }\n if (agentAttrs.availableTools) {\n attributes[`gen_ai.tool.definitions`] = JSON.stringify(agentAttrs.availableTools);\n }\n\n //TODO:\n // attributes[ATTR_GEN_AI_AGENT_DESCRIPTION] = agentAttrs.description;\n // attributes[ATTR_GEN_AI_REQUEST_MODEL] = agentAttrs.model.name;\n\n attributes[ATTR_GEN_AI_SYSTEM_INSTRUCTIONS] = agentAttrs.instructions;\n }\n\n // Add error information if present\n if (span.errorInfo) {\n attributes[ATTR_ERROR_TYPE] = span.errorInfo.id || 'unknown';\n attributes[ATTR_ERROR_MESSAGE] = span.errorInfo.message;\n if (span.errorInfo.domain) {\n attributes['error.domain'] = span.errorInfo.domain;\n }\n if (span.errorInfo.category) {\n attributes['error.category'] = span.errorInfo.category;\n }\n }\n\n return attributes;\n}\n\n/**\n * Canonical OTel provider keys mapped to a list of possible fuzzy aliases.\n */\nconst PROVIDER_ALIASES: Record<string, string[]> = {\n anthropic: ['anthropic', 'claude'],\n 'aws.bedrock': ['awsbedrock', 'bedrock', 'amazonbedrock'],\n 'azure.ai.inference': ['azureaiinference', 'azureinference'],\n 'azure.ai.openai': ['azureaiopenai', 'azureopenai', 'msopenai', 'microsoftopenai'],\n cohere: ['cohere'],\n deepseek: ['deepseek'],\n 'gcp.gemini': ['gcpgemini', 'gemini'],\n 'gcp.gen_ai': ['gcpgenai', 'googlegenai', 'googleai'],\n 'gcp.vertex_ai': ['gcpvertexai', 'vertexai'],\n groq: ['groq'],\n 'ibm.watsonx.ai': ['ibmwatsonxai', 'watsonx', 'watsonxai'],\n mistral_ai: ['mistral', 'mistralai'],\n openai: ['openai', 'oai'],\n perplexity: ['perplexity', 'pplx'],\n x_ai: ['xai', 'x-ai', 'x_ai', 'x.com ai'],\n};\n\n/**\n * Normalize a provider input string into a matchable token.\n * Keep only alphanumerics and lowercase the result.\n */\nfunction normalizeProviderString(input: string): string {\n return input.toLowerCase().replace(/[^a-z0-9]/g, '');\n}\n\n/**\n * Attempts to map a providerName to one of the canonical OTel provider names.\n * If no match is found, returns the original providerName unchanged.\n */\nfunction normalizeProvider(providerName: string): string {\n const normalized = normalizeProviderString(providerName);\n\n for (const [canonical, aliases] of Object.entries(PROVIDER_ALIASES)) {\n for (const alias of aliases) {\n if (normalized === alias) {\n return canonical;\n }\n }\n }\n\n // No match → return the raw input in lowercase\n return providerName.toLowerCase();\n}\n","/**\n * Convert Mastra Spans to OpenTelemetry spans\n */\nimport { readFileSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport { SpanType } from '@mastra/core/observability';\nimport type { AnyExportedSpan } from '@mastra/core/observability';\nimport { SpanKind, SpanStatusCode, TraceFlags } from '@opentelemetry/api';\nimport type { HrTime, Link, SpanContext, SpanStatus } from '@opentelemetry/api';\nimport type { InstrumentationScope } from '@opentelemetry/core';\nimport type { Resource } from '@opentelemetry/resources';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\n\nimport type { ReadableSpan, TimedEvent } from '@opentelemetry/sdk-trace-base';\nimport {\n ATTR_SERVICE_NAME,\n ATTR_SERVICE_VERSION,\n ATTR_TELEMETRY_SDK_LANGUAGE,\n ATTR_TELEMETRY_SDK_NAME,\n ATTR_TELEMETRY_SDK_VERSION,\n} from '@opentelemetry/semantic-conventions';\n\nimport { getAttributes, getSpanName } from './gen-ai-semantics.js';\nimport type { OtelExporterConfig } from './types.js';\n\nexport type SpanFormat = 'GenAI_v1_38_0';\n\n// If more formats come later:\n// export type SpanFormat =\n// | \"GenAI_v1_38_0\"\n// | \"GenAI_v1_38_0\"\n// | \"Custom_v2\";\n\nexport class SpanConverter {\n private resource?: Resource;\n private scope?: InstrumentationScope;\n private initPromise?: Promise<void>;\n private format: SpanFormat;\n\n constructor(\n private readonly params: {\n format: SpanFormat;\n packageName: string;\n serviceName?: string;\n config?: OtelExporterConfig;\n },\n ) {\n this.format = params.format;\n }\n\n /**\n * Lazily initialize resource & scope on first use.\n * Subsequent calls reuse the same promise (no races).\n */\n private async initIfNeeded(): Promise<void> {\n if (this.initPromise) {\n return this.initPromise;\n }\n\n this.initPromise = (async () => {\n const packageVersion = (await getPackageVersion(this.params.packageName)) ?? 'unknown';\n\n const serviceVersion = (await getPackageVersion('@mastra/core')) ?? 'unknown';\n\n let resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: this.params.serviceName || 'mastra-service',\n [ATTR_SERVICE_VERSION]: serviceVersion,\n [ATTR_TELEMETRY_SDK_NAME]: this.params.packageName,\n [ATTR_TELEMETRY_SDK_VERSION]: packageVersion,\n [ATTR_TELEMETRY_SDK_LANGUAGE]: 'nodejs',\n });\n\n if (this.params.config?.resourceAttributes) {\n resource = resource.merge(\n // Duplicate attributes from config will override defaults above\n resourceFromAttributes(this.params.config.resourceAttributes),\n );\n }\n\n this.resource = resource;\n this.scope = {\n name: this.params.packageName,\n version: packageVersion,\n };\n })();\n\n return this.initPromise;\n }\n\n /**\n * Convert a Mastra Span to an OpenTelemetry ReadableSpan\n */\n async convertSpan(span: AnyExportedSpan): Promise<ReadableSpan> {\n await this.initIfNeeded();\n\n if (!this.resource || !this.scope) {\n throw new Error('SpanConverter not initialized correctly');\n }\n\n // --- Core fields derived from Mastra span ---\n const name = getSpanName(span);\n const kind = getSpanKind(span.type);\n const attributes = getAttributes(span);\n\n // Add metadata as custom attributes (not gen_ai specific)\n if (span.metadata) {\n for (const [k, v] of Object.entries(span.metadata)) {\n if (v === null || v === undefined) {\n continue;\n }\n attributes[`mastra.metadata.${k}`] = typeof v === 'object' ? JSON.stringify(v) : v;\n }\n }\n\n // Add tags for root spans (only root spans can have tags)\n // Tags are JSON-stringified for maximum backend compatibility\n // While OTEL spec supports arrays, many backends (Jaeger, Zipkin, Tempo) don't fully support them\n if (span.isRootSpan && span.tags?.length) {\n attributes['mastra.tags'] = JSON.stringify(span.tags);\n }\n\n const startTime = dateToHrTime(span.startTime);\n const endTime = span.endTime ? dateToHrTime(span.endTime) : startTime;\n const duration = computeDuration(span.startTime, span.endTime);\n\n const { status, events } = buildStatusAndEvents(span, startTime);\n\n const spanContext: SpanContext = {\n traceId: span.traceId,\n spanId: span.id,\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n };\n\n const parentSpanContext = span.parentSpanId\n ? {\n traceId: span.traceId,\n spanId: span.parentSpanId,\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n }\n : undefined;\n\n const links: Link[] = []; // fill if you add link support later\n\n const readable: ReadableSpan = {\n name,\n kind,\n spanContext: () => spanContext,\n parentSpanContext,\n startTime,\n endTime,\n status,\n attributes,\n links,\n events,\n duration,\n ended: !!span.endTime,\n resource: this.resource,\n instrumentationScope: this.scope,\n droppedAttributesCount: 0,\n droppedEventsCount: 0,\n droppedLinksCount: 0,\n };\n\n return readable;\n }\n}\n\nasync function getPackageVersion(pkgName: string): Promise<string | undefined> {\n try {\n // Resolve `package.json` for the given package\n const manifestUrl = new URL(await import.meta.resolve(`${pkgName}/package.json`));\n\n const path = fileURLToPath(manifestUrl);\n const pkgJson = JSON.parse(readFileSync(path, 'utf8'));\n return pkgJson.version;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Get the appropriate Otel SpanKind based on Mastra SpanType.\n *\n * @param type - The Mastra span type\n * @returns The appropriate OTEL SpanKind\n */\nexport function getSpanKind(type: SpanType): SpanKind {\n switch (type) {\n case SpanType.MODEL_GENERATION:\n case SpanType.MCP_TOOL_CALL:\n return SpanKind.CLIENT;\n default:\n return SpanKind.INTERNAL;\n }\n}\n\n/**\n * Convert JavaScript Date to hrtime format\n */\nfunction dateToHrTime(date: Date): HrTime {\n const ms = date.getTime();\n const seconds = Math.floor(ms / 1000);\n const nanoseconds = (ms % 1000) * 1000000;\n return [seconds, nanoseconds];\n}\n\nfunction computeDuration(start: Date, end?: Date): HrTime {\n if (!end) return [0, 0];\n const diffMs = end.getTime() - start.getTime();\n return [Math.floor(diffMs / 1000), (diffMs % 1000) * 1_000_000];\n}\n\n/**\n * Build status + events from span.errorInfo (if present)\n */\nfunction buildStatusAndEvents(\n span: AnyExportedSpan,\n defaultTime: HrTime,\n): { status: SpanStatus; events: TimedEvent[] } {\n const events: TimedEvent[] = [];\n\n if (span.errorInfo) {\n const status: SpanStatus = {\n code: SpanStatusCode.ERROR,\n message: span.errorInfo.message,\n };\n\n events.push({\n name: 'exception',\n attributes: {\n 'exception.message': span.errorInfo.message,\n 'exception.type': 'Error',\n ...(span.errorInfo.details?.stack && {\n 'exception.stacktrace': span.errorInfo.details.stack as string,\n }),\n },\n time: defaultTime,\n droppedAttributesCount: 0,\n });\n\n return { status, events };\n }\n\n if (span.endTime) {\n return {\n status: { code: SpanStatusCode.OK },\n events,\n };\n }\n\n return {\n status: { code: SpanStatusCode.UNSET },\n events,\n };\n}\n","/**\n * OpenTelemetry Tracing Exporter for Mastra\n */\n\nimport type {\n TracingEvent,\n AnyExportedSpan,\n InitExporterOptions,\n ObservabilityInstanceConfig,\n} from '@mastra/core/observability';\nimport { TracingEventType } from '@mastra/core/observability';\nimport { BaseExporter } from '@mastra/observability';\nimport { diag, DiagConsoleLogger, DiagLogLevel } from '@opentelemetry/api';\n\nimport { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport type { SpanExporter } from '@opentelemetry/sdk-trace-base';\n\nimport { loadExporter } from './loadExporter.js';\nimport { resolveProviderConfig } from './provider-configs.js';\nimport { SpanConverter } from './span-converter.js';\nimport type { OtelExporterConfig } from './types.js';\n\nexport class OtelExporter extends BaseExporter {\n private config: OtelExporterConfig;\n private observabilityConfig?: ObservabilityInstanceConfig;\n private spanConverter?: SpanConverter;\n private processor?: BatchSpanProcessor;\n private exporter?: SpanExporter;\n private isSetup: boolean = false;\n\n name = 'opentelemetry';\n\n constructor(config: OtelExporterConfig) {\n super(config);\n\n this.config = config;\n\n // Set up OpenTelemetry diagnostics if debug mode\n if (config.logLevel === 'debug') {\n diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.DEBUG);\n }\n }\n\n /**\n * Initialize with tracing configuration\n */\n init(options: InitExporterOptions) {\n this.observabilityConfig = options.config;\n }\n\n private async setupExporter() {\n // already setup or exporter already set\n if (this.isSetup || this.exporter) return;\n\n // Provider configuration is required\n if (!this.config.provider) {\n this.logger.error(\n '[OtelExporter] Provider configuration is required. Use the \"custom\" provider for generic endpoints.',\n );\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n // Resolve provider configuration\n const resolved = resolveProviderConfig(this.config.provider);\n if (!resolved) {\n // Configuration validation failed, disable tracing\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n // user provided an instantiated SpanExporter, use it\n if (this.config.exporter) {\n this.exporter = this.config.exporter;\n return;\n }\n\n const endpoint = resolved.endpoint;\n const headers = resolved.headers;\n const protocol = resolved.protocol;\n\n // Load and create the appropriate exporter based on protocol\n const providerName = Object.keys(this.config.provider)[0];\n const ExporterClass = await loadExporter(protocol, providerName);\n\n if (!ExporterClass) {\n // Exporter not available, disable tracing\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n try {\n if (protocol === 'zipkin') {\n this.exporter = new ExporterClass({\n url: endpoint,\n headers,\n });\n } else if (protocol === 'grpc') {\n // gRPC uses Metadata object instead of headers\n // Dynamically import @grpc/grpc-js to create metadata\n let metadata: any;\n try {\n // @ts-ignore - Dynamic import for optional dependency\n const grpcModule = await import('@grpc/grpc-js');\n metadata = new grpcModule.Metadata();\n Object.entries(headers).forEach(([key, value]) => {\n metadata.set(key, value);\n });\n } catch (grpcError) {\n this.logger.error(\n `[OtelExporter] Failed to load gRPC metadata. Install required packages:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-grpc @grpc/grpc-js\\n`,\n grpcError,\n );\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n this.exporter = new ExporterClass({\n url: endpoint,\n metadata,\n timeoutMillis: this.config.timeout,\n });\n } else {\n // HTTP/JSON and HTTP/Protobuf use headers\n this.exporter = new ExporterClass({\n url: endpoint,\n headers,\n timeoutMillis: this.config.timeout,\n });\n }\n } catch (error) {\n this.logger.error(`[OtelExporter] Failed to create exporter:`, error);\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n }\n\n private async setupProcessor() {\n if (this.processor || this.isSetup) return;\n\n this.spanConverter = new SpanConverter({\n packageName: '@mastra/otel-exporter',\n serviceName: this.observabilityConfig?.serviceName,\n config: this.config,\n format: 'GenAI_v1_38_0',\n });\n\n // Always use BatchSpanProcessor for production\n // It queues spans and exports them in batches for better performance\n this.processor = new BatchSpanProcessor(this.exporter!, {\n maxExportBatchSize: this.config.batchSize || 512, // Default batch size\n maxQueueSize: 2048, // Maximum spans to queue\n scheduledDelayMillis: 5000, // Export every 5 seconds\n exportTimeoutMillis: this.config.timeout || 30000, // Export timeout\n });\n\n this.logger.debug(\n `[OtelExporter] Using BatchSpanProcessor (batch size: ${this.config.batchSize || 512}, delay: 5s)`,\n );\n }\n\n private async setup() {\n if (this.isSetup) return;\n await this.setupExporter();\n await this.setupProcessor();\n this.isSetup = true;\n }\n\n protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n // Only process SPAN_ENDED events for OTEL\n // OTEL expects complete spans with start and end times\n if (event.type !== TracingEventType.SPAN_ENDED) {\n return;\n }\n\n const span = event.exportedSpan;\n await this.exportSpan(span);\n }\n\n private async exportSpan(span: AnyExportedSpan): Promise<void> {\n // Ensure exporter is set up\n if (!this.isSetup) {\n await this.setup();\n }\n\n // Skip if disabled\n if (this.isDisabled || !this.processor) {\n return;\n }\n\n try {\n // Convert the span to OTEL format\n const otelSpan = await this.spanConverter!.convertSpan(span);\n\n // Export the span immediately through the processor\n // The processor will handle batching if configured\n await new Promise<void>(resolve => {\n this.processor!.onEnd(otelSpan);\n resolve();\n });\n\n this.logger.debug(\n `[OtelExporter] Exported span ${span.id} (trace: ${span.traceId}, parent: ${span.parentSpanId || 'none'}, type: ${span.type})`,\n );\n } catch (error) {\n this.logger.error(`[OtelExporter] Failed to export span ${span.id}:`, error);\n }\n }\n\n async shutdown(): Promise<void> {\n // Shutdown the processor to flush any remaining spans\n if (this.processor) {\n await this.processor.shutdown();\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/loadExporter.ts","../src/provider-configs.ts","../src/gen-ai-messages.ts","../src/gen-ai-semantics.ts","../src/span-converter.ts","../src/tracing.ts"],"names":["SpanType"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Dynamic loader for optional OtelExporters\n */\n\nimport type { ExportProtocol } from './types.js';\n\n// Dynamic imports for optional dependencies\nlet OTLPHttpExporter: any;\nlet OTLPGrpcExporter: any;\nlet OTLPProtoExporter: any;\nlet ZipkinExporter: any;\n\nexport async function loadExporter(protocol: ExportProtocol, provider?: string): Promise<any> {\n switch (protocol) {\n case 'zipkin':\n if (!ZipkinExporter) {\n try {\n const module = await import('@opentelemetry/exporter-zipkin');\n ZipkinExporter = module.ZipkinExporter;\n } catch {\n console.error(\n `[OtelExporter] Zipkin exporter is not installed.\\n` +\n `To use Zipkin export, install the required package:\\n` +\n ` npm install @opentelemetry/exporter-zipkin`,\n );\n return null;\n }\n }\n return ZipkinExporter;\n\n case 'grpc':\n if (!OTLPGrpcExporter) {\n try {\n const module = await import('@opentelemetry/exporter-trace-otlp-grpc');\n OTLPGrpcExporter = module.OTLPTraceExporter;\n } catch {\n const providerInfo = provider ? ` (required for ${provider})` : '';\n console.error(\n `[OtelExporter] gRPC exporter is not installed${providerInfo}.\\n` +\n `To use gRPC export, install the required packages:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-grpc @grpc/grpc-js`,\n );\n return null;\n }\n }\n return OTLPGrpcExporter;\n\n case 'http/protobuf':\n if (!OTLPProtoExporter) {\n try {\n const module = await import('@opentelemetry/exporter-trace-otlp-proto');\n OTLPProtoExporter = module.OTLPTraceExporter;\n } catch {\n const providerInfo = provider ? ` (required for ${provider})` : '';\n console.error(\n `[OtelExporter] HTTP/Protobuf exporter is not installed${providerInfo}.\\n` +\n `To use HTTP/Protobuf export, install the required package:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-proto`,\n );\n return null;\n }\n }\n return OTLPProtoExporter;\n\n case 'http/json':\n default:\n if (!OTLPHttpExporter) {\n try {\n const module = await import('@opentelemetry/exporter-trace-otlp-http');\n OTLPHttpExporter = module.OTLPTraceExporter;\n } catch {\n const providerInfo = provider ? ` (required for ${provider})` : '';\n console.error(\n `[OtelExporter] HTTP/JSON exporter is not installed${providerInfo}.\\n` +\n `To use HTTP/JSON export, install the required package:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-http`,\n );\n return null;\n }\n }\n return OTLPHttpExporter;\n }\n}\n","/**\n * Provider-specific configurations for OtelExporters\n */\n\nimport type {\n ProviderConfig,\n ExportProtocol,\n Dash0Config,\n SignozConfig,\n NewRelicConfig,\n TraceloopConfig,\n LaminarConfig,\n CustomConfig,\n} from './types.js';\n\nexport interface ResolvedProviderConfig {\n endpoint: string;\n headers: Record<string, string>;\n protocol: ExportProtocol;\n}\n\nexport function resolveProviderConfig(config: ProviderConfig): ResolvedProviderConfig | null {\n if ('dash0' in config) {\n return resolveDash0Config(config.dash0);\n } else if ('signoz' in config) {\n return resolveSignozConfig(config.signoz);\n } else if ('newrelic' in config) {\n return resolveNewRelicConfig(config.newrelic);\n } else if ('traceloop' in config) {\n return resolveTraceloopConfig(config.traceloop);\n } else if ('laminar' in config) {\n return resolveLaminarConfig(config.laminar);\n } else if ('custom' in config) {\n return resolveCustomConfig(config.custom);\n } else {\n // TypeScript exhaustiveness check\n const _exhaustive: never = config;\n return _exhaustive;\n }\n}\n\nfunction resolveDash0Config(config: Dash0Config): ResolvedProviderConfig | null {\n 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 * Utilities for converting Mastra messages to OpenTelemetry gen_ai message format\n * Based on OpenTelemetry GenAI semantic conventions\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/#gen-ai-input-messages\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-input-messages.json\n */\n\n/**\n * Type representation of a gen_ai chat message part\n */\ntype GenAIMessagePart =\n | {\n type: 'text';\n content: string;\n }\n | {\n type: 'tool_call';\n id: string;\n name: string;\n arguments: string;\n }\n | {\n type: 'tool_call_response';\n id: string;\n name: string;\n response: string;\n };\n\n/**\n * Type representation of a gen_ai chat message\n */\ntype GenAIMessage = {\n role: string;\n parts: GenAIMessagePart[];\n};\n\n/**\n * Assumed type representation of a Mastra message content type\n */\ntype MastraMessagePart =\n | {\n type: 'text';\n text: string;\n }\n | { type: 'tool-call'; toolCallId: string; toolName: string; input: unknown }\n | { type: 'tool-result'; toolCallId: string; toolName: string; output: { value: unknown } };\n\n/**\n * Assumed type representation of a Mastra message\n */\ntype MastraMessage = {\n role: string;\n content: MastraMessagePart[] | string;\n};\n\nconst isMastraMessagePart = (p: unknown): p is MastraMessagePart => {\n return (\n typeof p === 'object' &&\n p != null &&\n 'type' in p &&\n (p.type === 'text' || p.type === 'tool-call' || p.type === 'tool-result') &&\n ((p.type === 'text' && 'text' in p) ||\n (p.type === 'tool-call' && 'toolCallId' in p && 'toolName' in p && 'input' in p) ||\n (p.type === 'tool-result' && 'toolCallId' in p && 'toolName' in p && 'output' in p))\n );\n};\n\nconst isMastraMessage = (m: unknown): m is MastraMessage => {\n return (\n typeof m === 'object' &&\n m != null &&\n 'role' in m &&\n 'content' in m &&\n (typeof m.content === 'string' || (Array.isArray(m.content) && m.content.every(isMastraMessagePart)))\n );\n};\n\n/**\n * Convert an Input/Output string from a MastraSpan into a jsonified string that adheres to\n * OpenTelemetry gen_ai.input.messages and gen_ai.output.messages schema.\n * If parsing fails at any step, the original inputOutputString is returned unmodified.\n *\n * This conversion is best effort; It assumes a consistent shape for mastra messages, and converts\n * into the gen_ai input and output schemas as of October 20th, 2025.\n *\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/#gen-ai-input-messages\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-input-messages.json\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/#gen-ai-output-messages\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-output-messages.json\n *\n * @param inputOutputString a jsonified string that contains messages adhering to what appears to be\n * Mastra's message shape.\n * @returns a jsonified string that contains messages adhering to the OpenTelemetry gen_ai.input.messages and gen_ai.output.messages schema.\n * If parsing fails at any step, the original inputOutputString is returned unmodified.\n */\nexport const convertMastraMessagesToGenAIMessages = (inputOutputString: string): string => {\n try {\n const parsedIO = JSON.parse(inputOutputString) as unknown;\n if (typeof parsedIO !== 'object' || parsedIO == null || (!('messages' in parsedIO) && !('text' in parsedIO))) {\n // inputOutputString fails initial type guard, just return it\n return inputOutputString;\n }\n // if the IO simply contains a text string, return a single text message\n // formatted as a gen_ai assistant message, assuming its an assistant response\n if ('text' in parsedIO) {\n return JSON.stringify([\n {\n role: 'assistant',\n parts: [{ type: 'text', content: parsedIO.text as string }],\n } satisfies GenAIMessage,\n ]);\n }\n // if the IO contains messages, convert them to gen_ai messages\n if (Array.isArray(parsedIO.messages)) {\n return JSON.stringify(\n (parsedIO.messages as unknown[]).map(m => {\n if (!isMastraMessage(m)) {\n return m;\n }\n const role = m.role;\n let parts: GenAIMessagePart[] = [];\n if (Array.isArray(m.content)) {\n parts = m.content.map(c => {\n switch (c.type) {\n case 'text':\n return {\n type: 'text',\n content: c.text,\n };\n case 'tool-call':\n return {\n type: 'tool_call',\n id: c.toolCallId,\n name: c.toolName,\n arguments: JSON.stringify(c.input),\n };\n case 'tool-result':\n return {\n type: 'tool_call_response',\n id: c.toolCallId,\n name: c.toolName,\n response: JSON.stringify(c.output.value),\n };\n default:\n return c;\n }\n });\n } else {\n parts = [\n {\n type: 'text',\n content: m.content,\n },\n ];\n }\n return {\n role,\n parts,\n } satisfies GenAIMessage;\n }),\n );\n }\n // we've failed type-guards, just return original I/O string\n return inputOutputString;\n } catch {\n // silently fallback to original I/O string\n return inputOutputString;\n }\n};\n","/**\n * Utilities for converting Mastra Spans to OTel Spans\n * with Semantic conventions for generative AI systems\n * @see https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/gen-ai/README.md\n * @see https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/gen-ai/gen-ai-events.md\n * @see https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/gen-ai/gen-ai-spans.md\n * @see https://github.com/open-telemetry/semantic-conventions/blob/v1.38.0/docs/gen-ai/gen-ai-agent-spans.md\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/non-normative/examples-llm-calls/\n * @see https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/\n */\n\nimport { SpanType } from '@mastra/core/observability';\nimport type {\n AgentRunAttributes,\n AnyExportedSpan,\n MCPToolCallAttributes,\n ModelGenerationAttributes,\n ToolCallAttributes,\n UsageStats,\n WorkflowRunAttributes,\n} from '@mastra/core/observability';\nimport type { Attributes } from '@opentelemetry/api';\nimport {\n ATTR_ERROR_MESSAGE,\n ATTR_ERROR_TYPE,\n ATTR_GEN_AI_PROVIDER_NAME,\n ATTR_GEN_AI_REQUEST_MODEL,\n ATTR_GEN_AI_RESPONSE_MODEL,\n ATTR_GEN_AI_REQUEST_MAX_TOKENS,\n ATTR_GEN_AI_REQUEST_TEMPERATURE,\n ATTR_GEN_AI_REQUEST_TOP_P,\n ATTR_GEN_AI_REQUEST_TOP_K,\n ATTR_GEN_AI_REQUEST_PRESENCE_PENALTY,\n ATTR_GEN_AI_REQUEST_FREQUENCY_PENALTY,\n ATTR_GEN_AI_REQUEST_STOP_SEQUENCES,\n ATTR_GEN_AI_REQUEST_SEED,\n ATTR_GEN_AI_INPUT_MESSAGES,\n ATTR_GEN_AI_OUTPUT_MESSAGES,\n ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n ATTR_GEN_AI_AGENT_ID,\n ATTR_GEN_AI_AGENT_NAME,\n ATTR_GEN_AI_TOOL_DESCRIPTION,\n ATTR_GEN_AI_OPERATION_NAME,\n ATTR_GEN_AI_RESPONSE_FINISH_REASONS,\n ATTR_GEN_AI_RESPONSE_ID,\n ATTR_GEN_AI_CONVERSATION_ID,\n ATTR_GEN_AI_SYSTEM_INSTRUCTIONS,\n ATTR_SERVER_ADDRESS,\n ATTR_SERVER_PORT,\n ATTR_GEN_AI_TOOL_NAME,\n} from '@opentelemetry/semantic-conventions/incubating';\nimport { convertMastraMessagesToGenAIMessages } from './gen-ai-messages';\n\n/**\n * Token usage attributes following OTel GenAI semantic conventions.\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-spans/\n */\nexport interface OtelUsageMetrics {\n [ATTR_GEN_AI_USAGE_INPUT_TOKENS]?: number;\n [ATTR_GEN_AI_USAGE_OUTPUT_TOKENS]?: number;\n 'gen_ai.usage.reasoning_tokens'?: number;\n 'gen_ai.usage.cached_input_tokens'?: number;\n 'gen_ai.usage.cache_write_tokens'?: number;\n 'gen_ai.usage.audio_input_tokens'?: number;\n 'gen_ai.usage.audio_output_tokens'?: number;\n}\n\n/**\n * Formats UsageStats to OTel GenAI semantic convention attributes.\n */\nexport function formatUsageMetrics(usage?: UsageStats): OtelUsageMetrics {\n if (!usage) return {};\n\n const metrics: OtelUsageMetrics = {};\n\n if (usage.inputTokens !== undefined) {\n metrics[ATTR_GEN_AI_USAGE_INPUT_TOKENS] = usage.inputTokens;\n }\n\n if (usage.outputTokens !== undefined) {\n metrics[ATTR_GEN_AI_USAGE_OUTPUT_TOKENS] = usage.outputTokens;\n }\n\n // Reasoning tokens from outputDetails\n if (usage.outputDetails?.reasoning !== undefined) {\n metrics['gen_ai.usage.reasoning_tokens'] = usage.outputDetails.reasoning;\n }\n\n // Cache read tokens from inputDetails\n if (usage.inputDetails?.cacheRead !== undefined) {\n metrics['gen_ai.usage.cached_input_tokens'] = usage.inputDetails.cacheRead;\n }\n\n // Cache write tokens from inputDetails\n if (usage.inputDetails?.cacheWrite !== undefined) {\n metrics['gen_ai.usage.cache_write_tokens'] = usage.inputDetails.cacheWrite;\n }\n\n // Audio tokens from inputDetails/outputDetails\n if (usage.inputDetails?.audio !== undefined) {\n metrics['gen_ai.usage.audio_input_tokens'] = usage.inputDetails.audio;\n }\n if (usage.outputDetails?.audio !== undefined) {\n metrics['gen_ai.usage.audio_output_tokens'] = usage.outputDetails.audio;\n }\n\n return metrics;\n}\n\n/**\n * Get the operation name based on span type for gen_ai.operation.name\n */\nfunction getOperationName(span: AnyExportedSpan): string {\n switch (span.type) {\n case SpanType.MODEL_GENERATION:\n return 'chat';\n case SpanType.TOOL_CALL:\n case SpanType.MCP_TOOL_CALL:\n return 'execute_tool';\n case SpanType.AGENT_RUN:\n return 'invoke_agent';\n case SpanType.WORKFLOW_RUN:\n return 'invoke_workflow';\n default:\n return span.type.toLowerCase();\n }\n}\n/**\n * Keep only unicode letters, numbers, dot, underscore, space, dash.\n */\nfunction sanitizeSpanName(name: string): string {\n return name.replace(/[^\\p{L}\\p{N}._ -]/gu, '');\n}\n\nfunction getSpanIdentifier(span: AnyExportedSpan): string | null {\n switch (span.type) {\n case SpanType.MODEL_GENERATION: {\n const attrs = span.attributes as ModelGenerationAttributes;\n return attrs?.model ?? 'unknown';\n }\n\n case SpanType.TOOL_CALL:\n case SpanType.MCP_TOOL_CALL: {\n const attrs = span.attributes as ToolCallAttributes | MCPToolCallAttributes;\n return attrs?.toolId ?? 'unknown';\n }\n\n case SpanType.AGENT_RUN: {\n const attrs = span.attributes as AgentRunAttributes;\n return attrs?.agentName ?? attrs?.agentId ?? 'unknown';\n }\n\n case SpanType.WORKFLOW_RUN: {\n const attrs = span.attributes as WorkflowRunAttributes;\n return attrs?.workflowId ?? 'unknown';\n }\n\n default:\n return null;\n }\n}\n\n/**\n * Get an OTEL-compliant span name based on span type and attributes\n */\nexport function getSpanName(span: AnyExportedSpan): string {\n const identifier = getSpanIdentifier(span);\n\n if (identifier) {\n const operation = getOperationName(span);\n return `${operation} ${identifier}`;\n }\n\n // For other types, use a simplified version of the original name\n return sanitizeSpanName(span.name);\n}\n\n/**\n * Gets OpenTelemetry attributes from Mastra Span\n * Following OTEL Semantic Conventions for GenAI\n */\nexport function getAttributes(span: AnyExportedSpan): Attributes {\n const attributes: Attributes = {};\n const spanType = span.type.toLowerCase();\n\n // Add gen_ai.operation.name based on span type\n attributes[ATTR_GEN_AI_OPERATION_NAME] = getOperationName(span);\n\n // Add span type for better visibility\n attributes['mastra.span.type'] = span.type;\n\n // Handle input/output based on span type\n // Always add input/output for Laminar compatibility\n if (span.input !== undefined) {\n const inputStr = typeof span.input === 'string' ? span.input : JSON.stringify(span.input);\n // Add specific attributes based on span type\n if (span.type === SpanType.MODEL_GENERATION) {\n attributes[ATTR_GEN_AI_INPUT_MESSAGES] = convertMastraMessagesToGenAIMessages(inputStr);\n } else if (span.type === SpanType.TOOL_CALL || span.type === SpanType.MCP_TOOL_CALL) {\n attributes['gen_ai.tool.call.arguments'] = inputStr;\n } else {\n attributes[`mastra.${spanType}.input`] = inputStr;\n }\n }\n\n if (span.output !== undefined) {\n const outputStr = typeof span.output === 'string' ? span.output : JSON.stringify(span.output);\n // Add specific attributes based on span type\n if (span.type === SpanType.MODEL_GENERATION) {\n attributes[ATTR_GEN_AI_OUTPUT_MESSAGES] = convertMastraMessagesToGenAIMessages(outputStr);\n // TODO\n // attributes['gen_ai.output.type'] = image/json/speech/text/<other>\n } else if (span.type === SpanType.TOOL_CALL || span.type === SpanType.MCP_TOOL_CALL) {\n attributes['gen_ai.tool.call.result'] = outputStr;\n } else {\n attributes[`mastra.${spanType}.output`] = outputStr;\n }\n }\n\n // Add model-specific attributes using OTEL semantic conventions\n if (span.type === SpanType.MODEL_GENERATION && span.attributes) {\n const modelAttrs = span.attributes as ModelGenerationAttributes;\n\n // Model and provider\n if (modelAttrs.model) {\n attributes[ATTR_GEN_AI_REQUEST_MODEL] = modelAttrs.model;\n }\n\n if (modelAttrs.provider) {\n attributes[ATTR_GEN_AI_PROVIDER_NAME] = normalizeProvider(modelAttrs.provider);\n }\n\n // Agent context - allows correlating model generation with the agent that invoked it\n if (modelAttrs.agentId) {\n attributes[ATTR_GEN_AI_AGENT_ID] = modelAttrs.agentId;\n }\n if (modelAttrs.agentName) {\n attributes[ATTR_GEN_AI_AGENT_NAME] = modelAttrs.agentName;\n }\n // Token usage - use OTEL standard naming + OpenInference conventions\n Object.assign(attributes, formatUsageMetrics(modelAttrs.usage));\n\n // Parameters using OTEL conventions\n if (modelAttrs.parameters) {\n if (modelAttrs.parameters.temperature !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_TEMPERATURE] = modelAttrs.parameters.temperature;\n }\n if (modelAttrs.parameters.maxOutputTokens !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_MAX_TOKENS] = modelAttrs.parameters.maxOutputTokens;\n }\n if (modelAttrs.parameters.topP !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_TOP_P] = modelAttrs.parameters.topP;\n }\n if (modelAttrs.parameters.topK !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_TOP_K] = modelAttrs.parameters.topK;\n }\n if (modelAttrs.parameters.presencePenalty !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_PRESENCE_PENALTY] = modelAttrs.parameters.presencePenalty;\n }\n if (modelAttrs.parameters.frequencyPenalty !== undefined) {\n attributes[ATTR_GEN_AI_REQUEST_FREQUENCY_PENALTY] = modelAttrs.parameters.frequencyPenalty;\n }\n if (modelAttrs.parameters.stopSequences) {\n attributes[ATTR_GEN_AI_REQUEST_STOP_SEQUENCES] = JSON.stringify(modelAttrs.parameters.stopSequences);\n }\n if (modelAttrs.parameters.seed) {\n attributes[ATTR_GEN_AI_REQUEST_SEED] = modelAttrs.parameters.seed;\n }\n }\n\n // Response attributes\n if (modelAttrs.finishReason) {\n attributes[ATTR_GEN_AI_RESPONSE_FINISH_REASONS] = JSON.stringify([modelAttrs.finishReason]);\n }\n if (modelAttrs.responseModel) {\n attributes[ATTR_GEN_AI_RESPONSE_MODEL] = modelAttrs.responseModel;\n }\n if (modelAttrs.responseId) {\n attributes[ATTR_GEN_AI_RESPONSE_ID] = modelAttrs.responseId;\n }\n\n // Server attributes\n if (modelAttrs.serverAddress) {\n attributes[ATTR_SERVER_ADDRESS] = modelAttrs.serverAddress;\n }\n if (modelAttrs.serverPort !== undefined) {\n attributes[ATTR_SERVER_PORT] = modelAttrs.serverPort;\n }\n }\n\n // Add tool-specific attributes using OTEL conventions\n if ((span.type === SpanType.TOOL_CALL || span.type === SpanType.MCP_TOOL_CALL) && span.attributes) {\n const toolAttrs = span.attributes as ToolCallAttributes | MCPToolCallAttributes;\n\n // Tool identification\n if (toolAttrs.toolId) {\n attributes[ATTR_GEN_AI_TOOL_NAME] = toolAttrs.toolId;\n }\n\n //TODO:\n // attributes['gen_ai.tool.call.id'] = call_mszuSIzqtI65i1wAUOE8w5H4\n // attributes['gen_ai.tool.type'] = function; extension; datastore\n\n // MCP-specific attributes\n if (span.type === SpanType.MCP_TOOL_CALL) {\n const mcpAttrs = toolAttrs as MCPToolCallAttributes;\n if (mcpAttrs.mcpServer) {\n attributes[ATTR_SERVER_ADDRESS] = mcpAttrs.mcpServer;\n }\n } else {\n if ((toolAttrs as ToolCallAttributes).toolDescription) {\n attributes[ATTR_GEN_AI_TOOL_DESCRIPTION] = (toolAttrs as ToolCallAttributes).toolDescription;\n }\n }\n }\n\n // Add agent-specific attributes\n if (span.type === SpanType.AGENT_RUN && span.attributes) {\n const agentAttrs = span.attributes as AgentRunAttributes;\n if (agentAttrs.agentId) {\n attributes[ATTR_GEN_AI_AGENT_ID] = agentAttrs.agentId;\n }\n if (agentAttrs.agentName) {\n attributes[ATTR_GEN_AI_AGENT_NAME] = agentAttrs.agentName;\n }\n if (agentAttrs.conversationId) {\n attributes[ATTR_GEN_AI_CONVERSATION_ID] = agentAttrs.conversationId;\n }\n if (agentAttrs.maxSteps) {\n attributes[`mastra.${spanType}.max_steps`] = agentAttrs.maxSteps;\n }\n if (agentAttrs.availableTools) {\n attributes[`gen_ai.tool.definitions`] = JSON.stringify(agentAttrs.availableTools);\n }\n\n //TODO:\n // attributes[ATTR_GEN_AI_AGENT_DESCRIPTION] = agentAttrs.description;\n // attributes[ATTR_GEN_AI_REQUEST_MODEL] = agentAttrs.model.name;\n\n attributes[ATTR_GEN_AI_SYSTEM_INSTRUCTIONS] = agentAttrs.instructions;\n }\n\n // Add error information if present\n if (span.errorInfo) {\n attributes[ATTR_ERROR_TYPE] = span.errorInfo.id || 'unknown';\n attributes[ATTR_ERROR_MESSAGE] = span.errorInfo.message;\n if (span.errorInfo.domain) {\n attributes['error.domain'] = span.errorInfo.domain;\n }\n if (span.errorInfo.category) {\n attributes['error.category'] = span.errorInfo.category;\n }\n }\n\n return attributes;\n}\n\n/**\n * Canonical OTel provider keys mapped to a list of possible fuzzy aliases.\n */\nconst PROVIDER_ALIASES: Record<string, string[]> = {\n anthropic: ['anthropic', 'claude'],\n 'aws.bedrock': ['awsbedrock', 'bedrock', 'amazonbedrock'],\n 'azure.ai.inference': ['azureaiinference', 'azureinference'],\n 'azure.ai.openai': ['azureaiopenai', 'azureopenai', 'msopenai', 'microsoftopenai'],\n cohere: ['cohere'],\n deepseek: ['deepseek'],\n 'gcp.gemini': ['gcpgemini', 'gemini'],\n 'gcp.gen_ai': ['gcpgenai', 'googlegenai', 'googleai'],\n 'gcp.vertex_ai': ['gcpvertexai', 'vertexai'],\n groq: ['groq'],\n 'ibm.watsonx.ai': ['ibmwatsonxai', 'watsonx', 'watsonxai'],\n mistral_ai: ['mistral', 'mistralai'],\n openai: ['openai', 'oai'],\n perplexity: ['perplexity', 'pplx'],\n x_ai: ['xai', 'x-ai', 'x_ai', 'x.com ai'],\n};\n\n/**\n * Normalize a provider input string into a matchable token.\n * Keep only alphanumerics and lowercase the result.\n */\nfunction normalizeProviderString(input: string): string {\n return input.toLowerCase().replace(/[^a-z0-9]/g, '');\n}\n\n/**\n * Attempts to map a providerName to one of the canonical OTel provider names.\n * If no match is found, returns the original providerName unchanged.\n */\nfunction normalizeProvider(providerName: string): string {\n const normalized = normalizeProviderString(providerName);\n\n for (const [canonical, aliases] of Object.entries(PROVIDER_ALIASES)) {\n for (const alias of aliases) {\n if (normalized === alias) {\n return canonical;\n }\n }\n }\n\n // No match → return the raw input in lowercase\n return providerName.toLowerCase();\n}\n","/**\n * Convert Mastra Spans to OpenTelemetry spans\n */\nimport { readFileSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport { SpanType } from '@mastra/core/observability';\nimport type { AnyExportedSpan } from '@mastra/core/observability';\nimport { SpanKind, SpanStatusCode, TraceFlags } from '@opentelemetry/api';\nimport type { HrTime, Link, SpanContext, SpanStatus } from '@opentelemetry/api';\nimport type { InstrumentationScope } from '@opentelemetry/core';\nimport type { Resource } from '@opentelemetry/resources';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\n\nimport type { ReadableSpan, TimedEvent } from '@opentelemetry/sdk-trace-base';\nimport {\n ATTR_SERVICE_NAME,\n ATTR_SERVICE_VERSION,\n ATTR_TELEMETRY_SDK_LANGUAGE,\n ATTR_TELEMETRY_SDK_NAME,\n ATTR_TELEMETRY_SDK_VERSION,\n} from '@opentelemetry/semantic-conventions';\n\nimport { getAttributes, getSpanName } from './gen-ai-semantics.js';\nimport type { OtelExporterConfig } from './types.js';\n\nexport type SpanFormat = 'GenAI_v1_38_0';\n\n// If more formats come later:\n// export type SpanFormat =\n// | \"GenAI_v1_38_0\"\n// | \"GenAI_v1_38_0\"\n// | \"Custom_v2\";\n\nexport class SpanConverter {\n private resource?: Resource;\n private scope?: InstrumentationScope;\n private initPromise?: Promise<void>;\n private format: SpanFormat;\n\n constructor(\n private readonly params: {\n format: SpanFormat;\n packageName: string;\n serviceName?: string;\n config?: OtelExporterConfig;\n },\n ) {\n this.format = params.format;\n }\n\n /**\n * Lazily initialize resource & scope on first use.\n * Subsequent calls reuse the same promise (no races).\n */\n private async initIfNeeded(): Promise<void> {\n if (this.initPromise) {\n return this.initPromise;\n }\n\n this.initPromise = (async () => {\n const packageVersion = (await getPackageVersion(this.params.packageName)) ?? 'unknown';\n\n const serviceVersion = (await getPackageVersion('@mastra/core')) ?? 'unknown';\n\n let resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: this.params.serviceName || 'mastra-service',\n [ATTR_SERVICE_VERSION]: serviceVersion,\n [ATTR_TELEMETRY_SDK_NAME]: this.params.packageName,\n [ATTR_TELEMETRY_SDK_VERSION]: packageVersion,\n [ATTR_TELEMETRY_SDK_LANGUAGE]: 'nodejs',\n });\n\n if (this.params.config?.resourceAttributes) {\n resource = resource.merge(\n // Duplicate attributes from config will override defaults above\n resourceFromAttributes(this.params.config.resourceAttributes),\n );\n }\n\n this.resource = resource;\n this.scope = {\n name: this.params.packageName,\n version: packageVersion,\n };\n })();\n\n return this.initPromise;\n }\n\n /**\n * Convert a Mastra Span to an OpenTelemetry ReadableSpan\n */\n async convertSpan(span: AnyExportedSpan): Promise<ReadableSpan> {\n await this.initIfNeeded();\n\n if (!this.resource || !this.scope) {\n throw new Error('SpanConverter not initialized correctly');\n }\n\n // --- Core fields derived from Mastra span ---\n const name = getSpanName(span);\n const kind = getSpanKind(span.type);\n const attributes = getAttributes(span);\n\n // Add metadata as custom attributes (not gen_ai specific)\n if (span.metadata) {\n for (const [k, v] of Object.entries(span.metadata)) {\n if (v === null || v === undefined) {\n continue;\n }\n attributes[`mastra.metadata.${k}`] = typeof v === 'object' ? JSON.stringify(v) : v;\n }\n }\n\n // Add tags for root spans (only root spans can have tags)\n // Tags are JSON-stringified for maximum backend compatibility\n // While OTEL spec supports arrays, many backends (Jaeger, Zipkin, Tempo) don't fully support them\n if (span.isRootSpan && span.tags?.length) {\n attributes['mastra.tags'] = JSON.stringify(span.tags);\n }\n\n const startTime = dateToHrTime(span.startTime);\n const endTime = span.endTime ? dateToHrTime(span.endTime) : startTime;\n const duration = computeDuration(span.startTime, span.endTime);\n\n const { status, events } = buildStatusAndEvents(span, startTime);\n\n const spanContext: SpanContext = {\n traceId: span.traceId,\n spanId: span.id,\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n };\n\n const parentSpanContext = span.parentSpanId\n ? {\n traceId: span.traceId,\n spanId: span.parentSpanId,\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n }\n : undefined;\n\n const links: Link[] = []; // fill if you add link support later\n\n const readable: ReadableSpan = {\n name,\n kind,\n spanContext: () => spanContext,\n parentSpanContext,\n startTime,\n endTime,\n status,\n attributes,\n links,\n events,\n duration,\n ended: !!span.endTime,\n resource: this.resource,\n instrumentationScope: this.scope,\n droppedAttributesCount: 0,\n droppedEventsCount: 0,\n droppedLinksCount: 0,\n };\n\n return readable;\n }\n}\n\nasync function getPackageVersion(pkgName: string): Promise<string | undefined> {\n try {\n // Resolve `package.json` for the given package\n const manifestUrl = new URL(await import.meta.resolve(`${pkgName}/package.json`));\n\n const path = fileURLToPath(manifestUrl);\n const pkgJson = JSON.parse(readFileSync(path, 'utf8'));\n return pkgJson.version;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Get the appropriate Otel SpanKind based on Mastra SpanType.\n *\n * @param type - The Mastra span type\n * @returns The appropriate OTEL SpanKind\n */\nexport function getSpanKind(type: SpanType): SpanKind {\n switch (type) {\n case SpanType.MODEL_GENERATION:\n case SpanType.MCP_TOOL_CALL:\n return SpanKind.CLIENT;\n default:\n return SpanKind.INTERNAL;\n }\n}\n\n/**\n * Convert JavaScript Date to hrtime format\n */\nfunction dateToHrTime(date: Date): HrTime {\n const ms = date.getTime();\n const seconds = Math.floor(ms / 1000);\n const nanoseconds = (ms % 1000) * 1000000;\n return [seconds, nanoseconds];\n}\n\nfunction computeDuration(start: Date, end?: Date): HrTime {\n if (!end) return [0, 0];\n const diffMs = end.getTime() - start.getTime();\n return [Math.floor(diffMs / 1000), (diffMs % 1000) * 1_000_000];\n}\n\n/**\n * Build status + events from span.errorInfo (if present)\n */\nfunction buildStatusAndEvents(\n span: AnyExportedSpan,\n defaultTime: HrTime,\n): { status: SpanStatus; events: TimedEvent[] } {\n const events: TimedEvent[] = [];\n\n if (span.errorInfo) {\n const status: SpanStatus = {\n code: SpanStatusCode.ERROR,\n message: span.errorInfo.message,\n };\n\n events.push({\n name: 'exception',\n attributes: {\n 'exception.message': span.errorInfo.message,\n 'exception.type': 'Error',\n ...(span.errorInfo.details?.stack && {\n 'exception.stacktrace': span.errorInfo.details.stack as string,\n }),\n },\n time: defaultTime,\n droppedAttributesCount: 0,\n });\n\n return { status, events };\n }\n\n if (span.endTime) {\n return {\n status: { code: SpanStatusCode.OK },\n events,\n };\n }\n\n return {\n status: { code: SpanStatusCode.UNSET },\n events,\n };\n}\n","/**\n * OpenTelemetry Tracing Exporter for Mastra\n */\n\nimport type {\n TracingEvent,\n AnyExportedSpan,\n InitExporterOptions,\n ObservabilityInstanceConfig,\n} from '@mastra/core/observability';\nimport { TracingEventType } from '@mastra/core/observability';\nimport { BaseExporter } from '@mastra/observability';\nimport { diag, DiagConsoleLogger, DiagLogLevel } from '@opentelemetry/api';\n\nimport { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport type { SpanExporter } from '@opentelemetry/sdk-trace-base';\n\nimport { loadExporter } from './loadExporter.js';\nimport { resolveProviderConfig } from './provider-configs.js';\nimport { SpanConverter } from './span-converter.js';\nimport type { OtelExporterConfig } from './types.js';\n\nexport class OtelExporter extends BaseExporter {\n private config: OtelExporterConfig;\n private observabilityConfig?: ObservabilityInstanceConfig;\n private spanConverter?: SpanConverter;\n private processor?: BatchSpanProcessor;\n private exporter?: SpanExporter;\n private isSetup: boolean = false;\n\n name = 'opentelemetry';\n\n constructor(config: OtelExporterConfig) {\n super(config);\n\n this.config = config;\n\n // Set up OpenTelemetry diagnostics if debug mode\n if (config.logLevel === 'debug') {\n diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.DEBUG);\n }\n }\n\n /**\n * Initialize with tracing configuration\n */\n init(options: InitExporterOptions) {\n this.observabilityConfig = options.config;\n }\n\n private async setupExporter() {\n // already setup or exporter already set\n if (this.isSetup || this.exporter) return;\n\n // Provider configuration is required\n if (!this.config.provider) {\n this.logger.error(\n '[OtelExporter] Provider configuration is required. Use the \"custom\" provider for generic endpoints.',\n );\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n // Resolve provider configuration\n const resolved = resolveProviderConfig(this.config.provider);\n if (!resolved) {\n // Configuration validation failed, disable tracing\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n // user provided an instantiated SpanExporter, use it\n if (this.config.exporter) {\n this.exporter = this.config.exporter;\n return;\n }\n\n const endpoint = resolved.endpoint;\n const headers = resolved.headers;\n const protocol = resolved.protocol;\n\n // Load and create the appropriate exporter based on protocol\n const providerName = Object.keys(this.config.provider)[0];\n const ExporterClass = await loadExporter(protocol, providerName);\n\n if (!ExporterClass) {\n // Exporter not available, disable tracing\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n try {\n if (protocol === 'zipkin') {\n this.exporter = new ExporterClass({\n url: endpoint,\n headers,\n });\n } else if (protocol === 'grpc') {\n // gRPC uses Metadata object instead of headers\n // Dynamically import @grpc/grpc-js to create metadata\n let metadata: any;\n try {\n // @ts-ignore - Dynamic import for optional dependency\n const grpcModule = await import('@grpc/grpc-js');\n metadata = new grpcModule.Metadata();\n Object.entries(headers).forEach(([key, value]) => {\n metadata.set(key, value);\n });\n } catch (grpcError) {\n this.logger.error(\n `[OtelExporter] Failed to load gRPC metadata. Install required packages:\\n` +\n ` npm install @opentelemetry/exporter-trace-otlp-grpc @grpc/grpc-js\\n`,\n grpcError,\n );\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n\n this.exporter = new ExporterClass({\n url: endpoint,\n metadata,\n timeoutMillis: this.config.timeout,\n });\n } else {\n // HTTP/JSON and HTTP/Protobuf use headers\n this.exporter = new ExporterClass({\n url: endpoint,\n headers,\n timeoutMillis: this.config.timeout,\n });\n }\n } catch (error) {\n this.logger.error(`[OtelExporter] Failed to create exporter:`, error);\n this.isDisabled = true;\n this.isSetup = true;\n return;\n }\n }\n\n private async setupProcessor() {\n if (this.processor || this.isSetup) return;\n\n this.spanConverter = new SpanConverter({\n packageName: '@mastra/otel-exporter',\n serviceName: this.observabilityConfig?.serviceName,\n config: this.config,\n format: 'GenAI_v1_38_0',\n });\n\n // Always use BatchSpanProcessor for production\n // It queues spans and exports them in batches for better performance\n this.processor = new BatchSpanProcessor(this.exporter!, {\n maxExportBatchSize: this.config.batchSize || 512, // Default batch size\n maxQueueSize: 2048, // Maximum spans to queue\n scheduledDelayMillis: 5000, // Export every 5 seconds\n exportTimeoutMillis: this.config.timeout || 30000, // Export timeout\n });\n\n this.logger.debug(\n `[OtelExporter] Using BatchSpanProcessor (batch size: ${this.config.batchSize || 512}, delay: 5s)`,\n );\n }\n\n private async setup() {\n if (this.isSetup) return;\n await this.setupExporter();\n await this.setupProcessor();\n this.isSetup = true;\n }\n\n protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n // Only process SPAN_ENDED events for OTEL\n // OTEL expects complete spans with start and end times\n if (event.type !== TracingEventType.SPAN_ENDED) {\n return;\n }\n\n const span = event.exportedSpan;\n await this.exportSpan(span);\n }\n\n private async exportSpan(span: AnyExportedSpan): Promise<void> {\n // Ensure exporter is set up\n if (!this.isSetup) {\n await this.setup();\n }\n\n // Skip if disabled\n if (this.isDisabled || !this.processor) {\n return;\n }\n\n try {\n // Convert the span to OTEL format\n const otelSpan = await this.spanConverter!.convertSpan(span);\n\n // Export the span immediately through the processor\n // The processor will handle batching if configured\n await new Promise<void>(resolve => {\n this.processor!.onEnd(otelSpan);\n resolve();\n });\n\n this.logger.debug(\n `[OtelExporter] Exported span ${span.id} (trace: ${span.traceId}, parent: ${span.parentSpanId || 'none'}, type: ${span.type})`,\n );\n } catch (error) {\n this.logger.error(`[OtelExporter] Failed to export span ${span.id}:`, error);\n }\n }\n\n async shutdown(): Promise<void> {\n // Shutdown the processor to flush any remaining spans\n if (this.processor) {\n await this.processor.shutdown();\n }\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mastra/otel-exporter",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.5",
|
|
4
4
|
"description": "OpenTelemetry observability exporter for Mastra - supports OTLP, Zipkin, and multiple cloud providers",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"@opentelemetry/sdk-trace-base": "^2.1.0",
|
|
31
31
|
"@opentelemetry/sdk-trace-node": "^2.1.0",
|
|
32
32
|
"@opentelemetry/semantic-conventions": "1.38.0",
|
|
33
|
-
"@mastra/observability": "1.0.0-beta.
|
|
33
|
+
"@mastra/observability": "1.0.0-beta.4"
|
|
34
34
|
},
|
|
35
35
|
"optionalDependencies": {
|
|
36
36
|
"@grpc/grpc-js": "^1.14.1",
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"vitest": "4.0.12",
|
|
51
51
|
"@internal/lint": "0.0.53",
|
|
52
52
|
"@internal/types-builder": "0.0.28",
|
|
53
|
-
"@mastra/core": "1.0.0-beta.
|
|
53
|
+
"@mastra/core": "1.0.0-beta.10"
|
|
54
54
|
},
|
|
55
55
|
"peerDependencies": {
|
|
56
56
|
"@grpc/grpc-js": "^1.13.4",
|