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