@mastra/laminar 1.0.23-alpha.0 → 1.1.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @mastra/laminar
2
2
 
3
+ ## 1.1.0-alpha.1
4
+
5
+ ### Minor Changes
6
+
7
+ - Mastra Eval results are now forwarded to Laminar. ([#16185](https://github.com/mastra-ai/mastra/pull/16185))
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [[`6742347`](https://github.com/mastra-ai/mastra/commit/6742347d71955d7639adc9ddf6ff8282de7ee3ba), [`7b0ad1f`](https://github.com/mastra-ai/mastra/commit/7b0ad1f5c53dc118c6da12ae82ae2587037dc2b8), [`62666c3`](https://github.com/mastra-ai/mastra/commit/62666c367eaeac3941ead454b1d38810cc855721), [`4af2160`](https://github.com/mastra-ai/mastra/commit/4af2160322f4718cac421930cce85641e9512389), [`b2fd6be`](https://github.com/mastra-ai/mastra/commit/b2fd6beef989f5e463c9a33d8a6c20ac1800e011), [`136c959`](https://github.com/mastra-ai/mastra/commit/136c9592fb0eeb0cd212f28629d8a29b7557a2fc), [`00106be`](https://github.com/mastra-ai/mastra/commit/00106bede59b81e5b0e9cd6aad8d3b5dbc336387), [`4df7cc7`](https://github.com/mastra-ai/mastra/commit/4df7cc79342fd065fe7fdeef93c094db14b12bcd), [`aca3121`](https://github.com/mastra-ai/mastra/commit/aca31211233dac25459f140ea4fcfb3a5af64c18), [`7b0ad1f`](https://github.com/mastra-ai/mastra/commit/7b0ad1f5c53dc118c6da12ae82ae2587037dc2b8), [`9cdf38e`](https://github.com/mastra-ai/mastra/commit/9cdf38e58506e1109c8b38f97cd7770978a4218e), [`990851e`](https://github.com/mastra-ai/mastra/commit/990851edcb0e30be5c2c18b6532f1a876cc2d335), [`6068a6c`](https://github.com/mastra-ai/mastra/commit/6068a6c42950fad3ebfc92346417896ba60803d2), [`00106be`](https://github.com/mastra-ai/mastra/commit/00106bede59b81e5b0e9cd6aad8d3b5dbc336387), [`e2a079c`](https://github.com/mastra-ai/mastra/commit/e2a079cc3755b1895f7bd5dc36e9be81b11c7c22), [`534a456`](https://github.com/mastra-ai/mastra/commit/534a456a25e4df1e5407e7e632f4cb3b1fa14f9d), [`36bae07`](https://github.com/mastra-ai/mastra/commit/36bae07c0e70b1b3006f2fd20830e8883dcbd066)]:
12
+ - @mastra/core@1.33.0-alpha.7
13
+ - @mastra/observability@1.12.0-alpha.1
14
+
3
15
  ## 1.0.23-alpha.0
4
16
 
5
17
  ### Patch Changes
package/dist/index.cjs CHANGED
@@ -215,17 +215,11 @@ var LaminarExporter = class extends observability.BaseExporter {
215
215
  });
216
216
  this.isSetup = true;
217
217
  }
218
- async _addScoreToTrace({
219
- traceId,
220
- spanId,
221
- score,
222
- reason,
223
- scorerName,
224
- metadata
225
- }) {
218
+ async submitScore(args) {
226
219
  if (!this.config) return;
220
+ const { traceId, spanId, name, score, reason, metadata } = args;
227
221
  const payload = {
228
- name: scorerName,
222
+ name,
229
223
  score,
230
224
  source: "Code",
231
225
  metadata: { ...metadata ?? {}, ...reason ? { reason } : {} }
@@ -235,15 +229,18 @@ var LaminarExporter = class extends observability.BaseExporter {
235
229
  } else {
236
230
  payload.traceId = otelTraceIdToUUID(traceId);
237
231
  }
232
+ const headers = {
233
+ Authorization: `Bearer ${this.config.apiKey}`,
234
+ "content-type": "application/json"
235
+ };
236
+ const controller = new AbortController();
237
+ const timer = setTimeout(() => controller.abort(), this.config.timeoutMillis);
238
238
  try {
239
- const scoreHeaders = {
240
- Authorization: `Bearer ${this.config.apiKey}`,
241
- "content-type": "application/json"
242
- };
243
239
  const response = await fetch(`${stripTrailingSlash(this.config.baseUrl)}/v1/evaluators/score`, {
244
240
  method: "POST",
245
- headers: scoreHeaders,
246
- body: JSON.stringify(payload)
241
+ headers,
242
+ body: JSON.stringify(payload),
243
+ signal: controller.signal
247
244
  });
248
245
  if (!response.ok) {
249
246
  this.logger.warn("[LaminarExporter] Failed to attach score to trace/span", {
@@ -251,18 +248,50 @@ var LaminarExporter = class extends observability.BaseExporter {
251
248
  statusText: response.statusText,
252
249
  traceId,
253
250
  spanId,
254
- scorerName
251
+ name
255
252
  });
256
253
  }
257
254
  } catch (error) {
255
+ const isAbort = error instanceof Error && error.name === "AbortError";
258
256
  this.logger.error("[LaminarExporter] Error attaching score to trace/span", {
259
257
  error,
258
+ timedOut: isAbort,
259
+ timeoutMillis: this.config.timeoutMillis,
260
260
  traceId,
261
261
  spanId,
262
- scorerName
262
+ name
263
263
  });
264
+ } finally {
265
+ clearTimeout(timer);
264
266
  }
265
267
  }
268
+ async onScoreEvent(event) {
269
+ const { score } = event;
270
+ if (!score.traceId) return;
271
+ await this.submitScore({
272
+ traceId: score.traceId,
273
+ spanId: score.spanId,
274
+ name: score.scorerName ?? score.scorerId,
275
+ score: score.score,
276
+ reason: score.reason,
277
+ metadata: score.metadata
278
+ });
279
+ }
280
+ /**
281
+ * @deprecated Use the observability score event pipeline (`mastra.observability.addScore`)
282
+ * instead. Preserved for backwards compatibility; forwards to the same Laminar score endpoint
283
+ * as `onScoreEvent`.
284
+ */
285
+ async _addScoreToTrace(args) {
286
+ await this.submitScore({
287
+ traceId: args.traceId,
288
+ spanId: args.spanId,
289
+ name: args.scorerName,
290
+ score: args.score,
291
+ reason: args.reason,
292
+ metadata: args.metadata
293
+ });
294
+ }
266
295
  /**
267
296
  * Force flush any buffered spans without shutting down the exporter.
268
297
  * This is useful in serverless environments where you need to ensure spans
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tracing.ts"],"names":["BaseExporter","resourceFromAttributes","ATTR_SERVICE_NAME","ATTR_SERVICE_VERSION","ATTR_TELEMETRY_SDK_NAME","ATTR_TELEMETRY_SDK_VERSION","ATTR_TELEMETRY_SDK_LANGUAGE","TracingEventType","TraceFlags","OTLPTraceExporter","SimpleSpanProcessor","BatchSpanProcessor","SpanType","SpanStatusCode","SpanKind"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Laminar Exporter for Mastra Observability\n *\n * This exporter sends observability data to Laminar via OTLP/HTTP (protobuf).\n * It also implements addScoreToTrace() to attach scorer results in Laminar.\n */\n\nimport type {\n AnyExportedSpan,\n InitExporterOptions,\n ModelGenerationAttributes,\n TracingEvent,\n UsageStats,\n} from '@mastra/core/observability';\nimport { SpanType, TracingEventType } from '@mastra/core/observability';\nimport { BaseExporter } from '@mastra/observability';\nimport type { BaseExporterConfig } from '@mastra/observability';\nimport { SpanKind, SpanStatusCode, TraceFlags } from '@opentelemetry/api';\nimport type { Attributes, HrTime, Link, SpanContext, SpanStatus } from '@opentelemetry/api';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport type { Resource } from '@opentelemetry/resources';\nimport { BatchSpanProcessor, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport type { ReadableSpan, SpanExporter, 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\n// Laminar span attributes\nconst LMNR_SPAN_INPUT = 'lmnr.span.input';\nconst LMNR_SPAN_OUTPUT = 'lmnr.span.output';\nconst LMNR_SPAN_TYPE = 'lmnr.span.type';\nconst LMNR_SPAN_PATH = 'lmnr.span.path';\nconst LMNR_SPAN_IDS_PATH = 'lmnr.span.ids_path';\nconst LMNR_SPAN_INSTRUMENTATION_SOURCE = 'lmnr.span.instrumentation_source';\nconst LMNR_SPAN_SDK_VERSION = 'lmnr.span.sdk_version';\nconst LMNR_SPAN_LANGUAGE_VERSION = 'lmnr.span.language_version';\n\nconst LMNR_ASSOCIATION_PREFIX = 'lmnr.association.properties';\nconst LMNR_SESSION_ID = `${LMNR_ASSOCIATION_PREFIX}.session_id`;\nconst LMNR_USER_ID = `${LMNR_ASSOCIATION_PREFIX}.user_id`;\nconst LMNR_TAGS = `${LMNR_ASSOCIATION_PREFIX}.tags`;\n\n// Laminar GenAI attributes (as used by Laminar backend)\nconst GEN_AI_SYSTEM = 'gen_ai.system';\nconst GEN_AI_REQUEST_MODEL = 'gen_ai.request.model';\nconst GEN_AI_RESPONSE_MODEL = 'gen_ai.response.model';\nconst GEN_AI_USAGE_INPUT_TOKENS = 'gen_ai.usage.input_tokens';\nconst GEN_AI_USAGE_OUTPUT_TOKENS = 'gen_ai.usage.output_tokens';\nconst GEN_AI_CACHE_WRITE_INPUT_TOKENS = 'gen_ai.usage.cache_creation_input_tokens';\nconst GEN_AI_CACHE_READ_INPUT_TOKENS = 'gen_ai.usage.cache_read_input_tokens';\n\ntype LaminarSpanType = 'DEFAULT' | 'LLM' | 'TOOL';\n\ntype TraceState = {\n spanPathById: Map<string, string[]>;\n spanIdsPathById: Map<string, string[]>;\n activeSpanIds: Set<string>;\n};\n\ntype InstrumentationScope = {\n name: string;\n version?: string;\n schemaUrl?: string;\n};\n\nexport interface LaminarExporterConfig extends BaseExporterConfig {\n /**\n * Laminar project API key. Defaults to `process.env.LMNR_PROJECT_API_KEY`.\n */\n apiKey?: string;\n /**\n * Base URL for Laminar APIs. Defaults to `process.env.LMNR_BASE_URL` or `https://api.lmnr.ai`.\n *\n * Used for:\n * - trace exports (if `endpoint`/`LAMINAR_ENDPOINT` are not set)\n * - evaluator scoring (`/v1/evaluators/score`)\n */\n baseUrl?: string;\n /**\n * Full OTLP/HTTP traces endpoint. Defaults to `process.env.LAMINAR_ENDPOINT` or `${baseUrl}/v1/traces`.\n */\n endpoint?: string;\n /**\n * Additional headers to include in OTLP requests.\n */\n headers?: Record<string, string>;\n /**\n * Flush after each span for near-realtime visibility.\n */\n realtime?: boolean;\n /**\n * Disable batching (uses SimpleSpanProcessor).\n */\n disableBatch?: boolean;\n /**\n * Max spans to export per batch (BatchSpanProcessor only).\n */\n batchSize?: number;\n /**\n * OTLP export timeout in milliseconds.\n */\n timeoutMillis?: number;\n}\n\ntype ResolvedLaminarConfig = Required<Pick<LaminarExporterConfig, 'realtime' | 'disableBatch' | 'batchSize'>> & {\n apiKey: string;\n baseUrl: string;\n endpoint: string;\n headers: Record<string, string>;\n timeoutMillis: number;\n};\n\nexport class LaminarExporter extends BaseExporter {\n name = 'laminar';\n\n private config: ResolvedLaminarConfig | null;\n private traceMap = new Map<string, TraceState>();\n\n private resource?: Resource;\n private scope?: InstrumentationScope;\n private processor?: BatchSpanProcessor | SimpleSpanProcessor;\n private exporter?: SpanExporter;\n private isSetup = false;\n\n constructor(config: LaminarExporterConfig = {}) {\n super(config);\n\n const apiKey = config.apiKey ?? process.env.LMNR_PROJECT_API_KEY;\n if (!apiKey) {\n this.setDisabled(\n 'Missing required API key. Set LMNR_PROJECT_API_KEY environment variable or pass apiKey in config.',\n );\n this.config = null;\n return;\n }\n\n const envEndpoint = process.env.LAMINAR_ENDPOINT;\n const baseUrl = stripTrailingSlash(config.baseUrl ?? process.env.LMNR_BASE_URL ?? 'https://api.lmnr.ai');\n const endpoint = config.endpoint ?? envEndpoint ?? `${baseUrl}/v1/traces`;\n\n const headers: Record<string, string> = {\n ...config.headers,\n Authorization: `Bearer ${apiKey}`,\n };\n\n this.config = {\n apiKey,\n baseUrl,\n endpoint,\n headers,\n realtime: config.realtime ?? false,\n disableBatch: config.disableBatch ?? false,\n batchSize: config.batchSize ?? 512,\n timeoutMillis: config.timeoutMillis ?? 30000,\n };\n }\n\n init(options: InitExporterOptions): void {\n // Build resource & scope lazily so we can include serviceName.\n const serviceName = options.config?.serviceName || 'mastra-service';\n\n this.resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: serviceName,\n [ATTR_SERVICE_VERSION]: 'unknown',\n [ATTR_TELEMETRY_SDK_NAME]: '@mastra/laminar',\n [ATTR_TELEMETRY_SDK_VERSION]: 'unknown',\n [ATTR_TELEMETRY_SDK_LANGUAGE]: 'nodejs',\n });\n\n this.scope = {\n name: '@mastra/laminar',\n version: 'unknown',\n };\n }\n\n protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n // Track hierarchy on span start to build lmnr.span.path/ids_path for child spans.\n if (event.type === TracingEventType.SPAN_STARTED && !event.exportedSpan.isEvent) {\n this.handleSpanStarted(event.exportedSpan);\n return;\n }\n\n // Only export when the span is ended (including event spans).\n if (event.type !== TracingEventType.SPAN_ENDED) {\n return;\n }\n\n await this.handleSpanEnded(event.exportedSpan);\n }\n\n private handleSpanStarted(span: AnyExportedSpan): void {\n const traceState = this.getOrCreateTraceState(span.traceId);\n const name = span.name;\n\n const parentId = span.parentSpanId;\n const parentPath = parentId ? traceState.spanPathById.get(parentId) : undefined;\n const parentIdsPath = parentId ? traceState.spanIdsPathById.get(parentId) : undefined;\n\n const spanPath = parentPath ? [...parentPath, name] : [name];\n const spanIdsPath = parentIdsPath ? [...parentIdsPath, otelSpanIdToUUID(span.id)] : [otelSpanIdToUUID(span.id)];\n\n traceState.spanPathById.set(span.id, spanPath);\n traceState.spanIdsPathById.set(span.id, spanIdsPath);\n traceState.activeSpanIds.add(span.id);\n }\n\n private async handleSpanEnded(span: AnyExportedSpan): Promise<void> {\n if (!this.config) {\n return;\n }\n\n await this.setupIfNeeded();\n\n if (!this.processor || !this.exporter) {\n return;\n }\n\n const traceState = this.getOrCreateTraceState(span.traceId);\n\n // Ensure we have path data even for event spans (which never emit SPAN_STARTED).\n if (!traceState.spanPathById.has(span.id) || !traceState.spanIdsPathById.has(span.id)) {\n const name = span.name;\n const parentId = span.parentSpanId;\n const parentPath = parentId ? traceState.spanPathById.get(parentId) : undefined;\n const parentIdsPath = parentId ? traceState.spanIdsPathById.get(parentId) : undefined;\n\n const spanPath = parentPath ? [...parentPath, name] : [name];\n const spanIdsPath = parentIdsPath ? [...parentIdsPath, otelSpanIdToUUID(span.id)] : [otelSpanIdToUUID(span.id)];\n\n traceState.spanPathById.set(span.id, spanPath);\n traceState.spanIdsPathById.set(span.id, spanIdsPath);\n }\n\n try {\n const otelSpan = this.convertSpanToOtel(span, traceState);\n this.processor.onEnd(otelSpan);\n\n if (this.config.realtime) {\n await this.processor.forceFlush();\n }\n } catch (error) {\n this.logger.error('[LaminarExporter] Failed to export span', { error, spanId: span.id, traceId: span.traceId });\n } finally {\n // Refcount cleanup (non-event spans only; event spans never enter active set)\n traceState.activeSpanIds.delete(span.id);\n\n if (traceState.activeSpanIds.size === 0) {\n this.traceMap.delete(span.traceId);\n }\n }\n }\n\n private getOrCreateTraceState(traceId: string): TraceState {\n const existing = this.traceMap.get(traceId);\n if (existing) return existing;\n\n const created: TraceState = {\n spanPathById: new Map(),\n spanIdsPathById: new Map(),\n activeSpanIds: new Set(),\n };\n this.traceMap.set(traceId, created);\n return created;\n }\n\n private convertSpanToOtel(span: AnyExportedSpan, traceState: TraceState): ReadableSpan {\n if (!this.resource || !this.scope) {\n // init() is optional; fall back to defaults if it wasn't called for some reason.\n this.resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: 'mastra-service',\n [ATTR_SERVICE_VERSION]: 'unknown',\n [ATTR_TELEMETRY_SDK_NAME]: '@mastra/laminar',\n [ATTR_TELEMETRY_SDK_VERSION]: 'unknown',\n [ATTR_TELEMETRY_SDK_LANGUAGE]: 'nodejs',\n });\n this.scope = { name: '@mastra/laminar', version: 'unknown' };\n }\n\n const name = span.name;\n const kind = getSpanKind(span.type);\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 traceId = normalizeTraceId(span.traceId);\n const spanId = normalizeSpanId(span.id);\n\n const spanContext: SpanContext = {\n traceId,\n spanId,\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n };\n\n const parentSpanContext = span.parentSpanId\n ? {\n traceId,\n spanId: normalizeSpanId(span.parentSpanId),\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n }\n : undefined;\n\n const attributes = buildLaminarAttributes(span, traceState);\n\n const links: Link[] = [];\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: true,\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 private async setupIfNeeded(): Promise<void> {\n if (this.isSetup || !this.config) {\n return;\n }\n\n this.exporter = new OTLPTraceExporter({\n url: this.config.endpoint,\n headers: this.config.headers,\n timeoutMillis: this.config.timeoutMillis,\n });\n\n this.processor = this.config.disableBatch\n ? new SimpleSpanProcessor(this.exporter)\n : new BatchSpanProcessor(this.exporter, {\n maxExportBatchSize: this.config.batchSize,\n exportTimeoutMillis: this.config.timeoutMillis,\n });\n\n this.isSetup = true;\n }\n\n async _addScoreToTrace({\n traceId,\n spanId,\n score,\n reason,\n scorerName,\n metadata,\n }: {\n traceId: string;\n spanId?: string;\n score: number;\n reason?: string;\n scorerName: string;\n metadata?: Record<string, any>;\n }): Promise<void> {\n if (!this.config) return;\n\n const payload: Record<string, unknown> = {\n name: scorerName,\n score,\n source: 'Code',\n metadata: { ...(metadata ?? {}), ...(reason ? { reason } : {}) },\n };\n\n if (spanId) {\n payload.spanId = otelSpanIdToUUID(spanId);\n } else {\n payload.traceId = otelTraceIdToUUID(traceId);\n }\n\n try {\n const scoreHeaders: Record<string, string> = {\n Authorization: `Bearer ${this.config.apiKey}`,\n 'content-type': 'application/json',\n };\n\n const response = await fetch(`${stripTrailingSlash(this.config.baseUrl)}/v1/evaluators/score`, {\n method: 'POST',\n headers: scoreHeaders,\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n this.logger.warn('[LaminarExporter] Failed to attach score to trace/span', {\n status: response.status,\n statusText: response.statusText,\n traceId,\n spanId,\n scorerName,\n });\n }\n } catch (error) {\n this.logger.error('[LaminarExporter] Error attaching score to trace/span', {\n error,\n traceId,\n spanId,\n scorerName,\n });\n }\n }\n\n /**\n * Force flush any buffered spans without shutting down the exporter.\n * This is useful in serverless environments where you need to ensure spans\n * are exported before the runtime instance is terminated.\n */\n async flush(): Promise<void> {\n if (this.isDisabled || !this.processor) return;\n\n try {\n await this.processor.forceFlush();\n this.logger.debug('[LaminarExporter] Flushed pending spans');\n } catch (error) {\n this.logger.error('[LaminarExporter] Error flushing spans', { error });\n }\n }\n\n async shutdown(): Promise<void> {\n try {\n await this.processor?.shutdown();\n } finally {\n this.traceMap.clear();\n await super.shutdown();\n }\n }\n}\n\nfunction buildLaminarAttributes(span: AnyExportedSpan, traceState: TraceState): Attributes {\n const attributes: Attributes = {};\n\n const spanPath = traceState.spanPathById.get(span.id);\n const spanIdsPath = traceState.spanIdsPathById.get(span.id);\n\n if (spanPath) {\n attributes[LMNR_SPAN_PATH] = spanPath;\n }\n\n if (spanIdsPath) {\n attributes[LMNR_SPAN_IDS_PATH] = spanIdsPath;\n }\n\n attributes[LMNR_SPAN_TYPE] = mapLaminarSpanType(span.type);\n attributes[LMNR_SPAN_INSTRUMENTATION_SOURCE] = 'javascript';\n\n // These attributes are optional in Laminar, but helpful for debugging.\n attributes[LMNR_SPAN_SDK_VERSION] = 'unknown';\n attributes[LMNR_SPAN_LANGUAGE_VERSION] = process.version;\n\n // Association properties\n const sessionId = span.metadata?.sessionId;\n if (typeof sessionId === 'string' && sessionId.length > 0) {\n attributes[LMNR_SESSION_ID] = sessionId;\n }\n\n const userId = span.metadata?.userId;\n if (typeof userId === 'string' && userId.length > 0) {\n attributes[LMNR_USER_ID] = userId;\n }\n\n // Attach Mastra metadata as Laminar trace/span metadata (best-effort, scalar/array-only)\n // Laminar treats `lmnr.association.properties.metadata.*` as freeform metadata.\n if (span.metadata) {\n for (const [key, value] of Object.entries(span.metadata)) {\n if (key === 'sessionId' || key === 'userId' || value === undefined || value === null) {\n continue;\n }\n\n const attributeValue = toLaminarAttributeValue(value);\n if (attributeValue === undefined) {\n continue;\n }\n\n attributes[`${LMNR_ASSOCIATION_PREFIX}.metadata.${key}`] = attributeValue;\n }\n }\n\n if (span.isRootSpan && span.tags?.length) {\n attributes[LMNR_TAGS] = span.tags;\n }\n\n // Span input/output (Laminar prefers these over gen_ai.* / other conventions)\n if (span.input !== undefined) {\n attributes[LMNR_SPAN_INPUT] = serializeForLaminar(getLaminarSpanInput(span));\n }\n\n if (span.output !== undefined) {\n attributes[LMNR_SPAN_OUTPUT] = serializeForLaminar(span.output);\n }\n\n if (span.type === SpanType.MODEL_GENERATION) {\n const modelAttrs = (span.attributes ?? {}) as ModelGenerationAttributes;\n\n if (modelAttrs.provider) {\n attributes[GEN_AI_SYSTEM] = normalizeProvider(modelAttrs.provider);\n }\n\n if (modelAttrs.model) {\n attributes[GEN_AI_REQUEST_MODEL] = modelAttrs.model;\n }\n\n if (modelAttrs.responseModel) {\n attributes[GEN_AI_RESPONSE_MODEL] = modelAttrs.responseModel;\n }\n\n Object.assign(attributes, formatLaminarUsage(modelAttrs.usage));\n }\n\n return attributes;\n}\n\nfunction mapLaminarSpanType(spanType: SpanType): LaminarSpanType {\n switch (spanType) {\n case SpanType.MODEL_GENERATION:\n case SpanType.MODEL_STEP:\n case SpanType.MODEL_CHUNK:\n return 'LLM';\n case SpanType.TOOL_CALL:\n case SpanType.MCP_TOOL_CALL:\n return 'TOOL';\n default:\n return 'DEFAULT';\n }\n}\n\nfunction formatLaminarUsage(usage?: UsageStats): Attributes {\n if (!usage) return {};\n\n const out: Attributes = {};\n\n if (usage.inputTokens !== undefined) {\n out[GEN_AI_USAGE_INPUT_TOKENS] = usage.inputTokens;\n }\n\n if (usage.outputTokens !== undefined) {\n out[GEN_AI_USAGE_OUTPUT_TOKENS] = usage.outputTokens;\n }\n\n if (usage.inputDetails?.cacheWrite !== undefined) {\n out[GEN_AI_CACHE_WRITE_INPUT_TOKENS] = usage.inputDetails.cacheWrite;\n }\n\n if (usage.inputDetails?.cacheRead !== undefined) {\n out[GEN_AI_CACHE_READ_INPUT_TOKENS] = usage.inputDetails.cacheRead;\n }\n\n return out;\n}\n\nfunction serializeForLaminar(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n\n try {\n return JSON.stringify(value);\n } catch {\n return '[unserializable]';\n }\n}\n\nfunction getLaminarSpanInput(span: AnyExportedSpan): unknown {\n // Mastra MODEL_GENERATION spans commonly use `{ messages, ... }` as input.\n // Laminar can render rich chat views when `lmnr.span.input` is a message list.\n if (span.type !== SpanType.MODEL_GENERATION) {\n return span.input;\n }\n\n const input = span.input;\n if (!input || typeof input !== 'object' || Array.isArray(input)) {\n return input;\n }\n\n const maybeMessages = (input as { messages?: unknown }).messages;\n return Array.isArray(maybeMessages) ? maybeMessages : input;\n}\n\nfunction toLaminarAttributeValue(value: unknown): Attributes[string] | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n\n if (Array.isArray(value)) {\n const isHomogeneous =\n value.every(v => typeof v === 'string') ||\n value.every(v => typeof v === 'number') ||\n value.every(v => typeof v === 'boolean');\n if (isHomogeneous) return value;\n }\n\n return serializeForLaminar(value);\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) * 1_000_000;\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\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 return {\n status: { code: SpanStatusCode.OK },\n events,\n };\n}\n\nfunction 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\nexport function stripTrailingSlash(url: string): string {\n let end = url.length;\n while (end > 0 && url.charCodeAt(end - 1) === 47 /* '/' */) {\n end--;\n }\n return end === url.length ? url : url.slice(0, end);\n}\n\nfunction normalizeTraceId(traceId: string): string {\n let id = traceId.toLowerCase();\n if (id.startsWith('0x')) id = id.slice(2);\n return id.padStart(32, '0').slice(-32);\n}\n\nfunction normalizeSpanId(spanId: string): string {\n let id = spanId.toLowerCase();\n if (id.startsWith('0x')) id = id.slice(2);\n return id.padStart(16, '0').slice(-16);\n}\n\nexport function otelSpanIdToUUID(spanId: string): string {\n const normalized = normalizeSpanId(spanId);\n return normalized\n .padStart(32, '0')\n .replace(/^([0-9a-f]{8})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{12})$/, '$1-$2-$3-$4-$5');\n}\n\nexport function otelTraceIdToUUID(traceId: string): string {\n const normalized = normalizeTraceId(traceId);\n return normalized.replace(/^([0-9a-f]{8})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{12})$/, '$1-$2-$3-$4-$5');\n}\n\nfunction normalizeProvider(provider: string): string {\n return provider.split('.').shift()?.toLowerCase().trim() || provider.toLowerCase().trim();\n}\n"]}
1
+ {"version":3,"sources":["../src/tracing.ts"],"names":["BaseExporter","resourceFromAttributes","ATTR_SERVICE_NAME","ATTR_SERVICE_VERSION","ATTR_TELEMETRY_SDK_NAME","ATTR_TELEMETRY_SDK_VERSION","ATTR_TELEMETRY_SDK_LANGUAGE","TracingEventType","TraceFlags","OTLPTraceExporter","SimpleSpanProcessor","BatchSpanProcessor","SpanType","SpanStatusCode","SpanKind"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Laminar Exporter for Mastra Observability\n *\n * This exporter sends observability data to Laminar via OTLP/HTTP (protobuf).\n * It also implements addScoreToTrace() to attach scorer results in Laminar.\n */\n\nimport type {\n AnyExportedSpan,\n InitExporterOptions,\n ModelGenerationAttributes,\n ScoreEvent,\n TracingEvent,\n UsageStats,\n} from '@mastra/core/observability';\nimport { SpanType, TracingEventType } from '@mastra/core/observability';\nimport { BaseExporter } from '@mastra/observability';\nimport type { BaseExporterConfig } from '@mastra/observability';\nimport { SpanKind, SpanStatusCode, TraceFlags } from '@opentelemetry/api';\nimport type { Attributes, HrTime, Link, SpanContext, SpanStatus } from '@opentelemetry/api';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport type { Resource } from '@opentelemetry/resources';\nimport { BatchSpanProcessor, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport type { ReadableSpan, SpanExporter, 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\n// Laminar span attributes\nconst LMNR_SPAN_INPUT = 'lmnr.span.input';\nconst LMNR_SPAN_OUTPUT = 'lmnr.span.output';\nconst LMNR_SPAN_TYPE = 'lmnr.span.type';\nconst LMNR_SPAN_PATH = 'lmnr.span.path';\nconst LMNR_SPAN_IDS_PATH = 'lmnr.span.ids_path';\nconst LMNR_SPAN_INSTRUMENTATION_SOURCE = 'lmnr.span.instrumentation_source';\nconst LMNR_SPAN_SDK_VERSION = 'lmnr.span.sdk_version';\nconst LMNR_SPAN_LANGUAGE_VERSION = 'lmnr.span.language_version';\n\nconst LMNR_ASSOCIATION_PREFIX = 'lmnr.association.properties';\nconst LMNR_SESSION_ID = `${LMNR_ASSOCIATION_PREFIX}.session_id`;\nconst LMNR_USER_ID = `${LMNR_ASSOCIATION_PREFIX}.user_id`;\nconst LMNR_TAGS = `${LMNR_ASSOCIATION_PREFIX}.tags`;\n\n// Laminar GenAI attributes (as used by Laminar backend)\nconst GEN_AI_SYSTEM = 'gen_ai.system';\nconst GEN_AI_REQUEST_MODEL = 'gen_ai.request.model';\nconst GEN_AI_RESPONSE_MODEL = 'gen_ai.response.model';\nconst GEN_AI_USAGE_INPUT_TOKENS = 'gen_ai.usage.input_tokens';\nconst GEN_AI_USAGE_OUTPUT_TOKENS = 'gen_ai.usage.output_tokens';\nconst GEN_AI_CACHE_WRITE_INPUT_TOKENS = 'gen_ai.usage.cache_creation_input_tokens';\nconst GEN_AI_CACHE_READ_INPUT_TOKENS = 'gen_ai.usage.cache_read_input_tokens';\n\ntype LaminarSpanType = 'DEFAULT' | 'LLM' | 'TOOL';\n\ntype TraceState = {\n spanPathById: Map<string, string[]>;\n spanIdsPathById: Map<string, string[]>;\n activeSpanIds: Set<string>;\n};\n\ntype InstrumentationScope = {\n name: string;\n version?: string;\n schemaUrl?: string;\n};\n\nexport interface LaminarExporterConfig extends BaseExporterConfig {\n /**\n * Laminar project API key. Defaults to `process.env.LMNR_PROJECT_API_KEY`.\n */\n apiKey?: string;\n /**\n * Base URL for Laminar APIs. Defaults to `process.env.LMNR_BASE_URL` or `https://api.lmnr.ai`.\n *\n * Used for:\n * - trace exports (if `endpoint`/`LAMINAR_ENDPOINT` are not set)\n * - evaluator scoring (`/v1/evaluators/score`)\n */\n baseUrl?: string;\n /**\n * Full OTLP/HTTP traces endpoint. Defaults to `process.env.LAMINAR_ENDPOINT` or `${baseUrl}/v1/traces`.\n */\n endpoint?: string;\n /**\n * Additional headers to include in OTLP requests.\n */\n headers?: Record<string, string>;\n /**\n * Flush after each span for near-realtime visibility.\n */\n realtime?: boolean;\n /**\n * Disable batching (uses SimpleSpanProcessor).\n */\n disableBatch?: boolean;\n /**\n * Max spans to export per batch (BatchSpanProcessor only).\n */\n batchSize?: number;\n /**\n * OTLP export timeout in milliseconds.\n */\n timeoutMillis?: number;\n}\n\ntype ResolvedLaminarConfig = Required<Pick<LaminarExporterConfig, 'realtime' | 'disableBatch' | 'batchSize'>> & {\n apiKey: string;\n baseUrl: string;\n endpoint: string;\n headers: Record<string, string>;\n timeoutMillis: number;\n};\n\nexport class LaminarExporter extends BaseExporter {\n name = 'laminar';\n\n private config: ResolvedLaminarConfig | null;\n private traceMap = new Map<string, TraceState>();\n\n private resource?: Resource;\n private scope?: InstrumentationScope;\n private processor?: BatchSpanProcessor | SimpleSpanProcessor;\n private exporter?: SpanExporter;\n private isSetup = false;\n\n constructor(config: LaminarExporterConfig = {}) {\n super(config);\n\n const apiKey = config.apiKey ?? process.env.LMNR_PROJECT_API_KEY;\n if (!apiKey) {\n this.setDisabled(\n 'Missing required API key. Set LMNR_PROJECT_API_KEY environment variable or pass apiKey in config.',\n );\n this.config = null;\n return;\n }\n\n const envEndpoint = process.env.LAMINAR_ENDPOINT;\n const baseUrl = stripTrailingSlash(config.baseUrl ?? process.env.LMNR_BASE_URL ?? 'https://api.lmnr.ai');\n const endpoint = config.endpoint ?? envEndpoint ?? `${baseUrl}/v1/traces`;\n\n const headers: Record<string, string> = {\n ...config.headers,\n Authorization: `Bearer ${apiKey}`,\n };\n\n this.config = {\n apiKey,\n baseUrl,\n endpoint,\n headers,\n realtime: config.realtime ?? false,\n disableBatch: config.disableBatch ?? false,\n batchSize: config.batchSize ?? 512,\n timeoutMillis: config.timeoutMillis ?? 30000,\n };\n }\n\n init(options: InitExporterOptions): void {\n // Build resource & scope lazily so we can include serviceName.\n const serviceName = options.config?.serviceName || 'mastra-service';\n\n this.resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: serviceName,\n [ATTR_SERVICE_VERSION]: 'unknown',\n [ATTR_TELEMETRY_SDK_NAME]: '@mastra/laminar',\n [ATTR_TELEMETRY_SDK_VERSION]: 'unknown',\n [ATTR_TELEMETRY_SDK_LANGUAGE]: 'nodejs',\n });\n\n this.scope = {\n name: '@mastra/laminar',\n version: 'unknown',\n };\n }\n\n protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n // Track hierarchy on span start to build lmnr.span.path/ids_path for child spans.\n if (event.type === TracingEventType.SPAN_STARTED && !event.exportedSpan.isEvent) {\n this.handleSpanStarted(event.exportedSpan);\n return;\n }\n\n // Only export when the span is ended (including event spans).\n if (event.type !== TracingEventType.SPAN_ENDED) {\n return;\n }\n\n await this.handleSpanEnded(event.exportedSpan);\n }\n\n private handleSpanStarted(span: AnyExportedSpan): void {\n const traceState = this.getOrCreateTraceState(span.traceId);\n const name = span.name;\n\n const parentId = span.parentSpanId;\n const parentPath = parentId ? traceState.spanPathById.get(parentId) : undefined;\n const parentIdsPath = parentId ? traceState.spanIdsPathById.get(parentId) : undefined;\n\n const spanPath = parentPath ? [...parentPath, name] : [name];\n const spanIdsPath = parentIdsPath ? [...parentIdsPath, otelSpanIdToUUID(span.id)] : [otelSpanIdToUUID(span.id)];\n\n traceState.spanPathById.set(span.id, spanPath);\n traceState.spanIdsPathById.set(span.id, spanIdsPath);\n traceState.activeSpanIds.add(span.id);\n }\n\n private async handleSpanEnded(span: AnyExportedSpan): Promise<void> {\n if (!this.config) {\n return;\n }\n\n await this.setupIfNeeded();\n\n if (!this.processor || !this.exporter) {\n return;\n }\n\n const traceState = this.getOrCreateTraceState(span.traceId);\n\n // Ensure we have path data even for event spans (which never emit SPAN_STARTED).\n if (!traceState.spanPathById.has(span.id) || !traceState.spanIdsPathById.has(span.id)) {\n const name = span.name;\n const parentId = span.parentSpanId;\n const parentPath = parentId ? traceState.spanPathById.get(parentId) : undefined;\n const parentIdsPath = parentId ? traceState.spanIdsPathById.get(parentId) : undefined;\n\n const spanPath = parentPath ? [...parentPath, name] : [name];\n const spanIdsPath = parentIdsPath ? [...parentIdsPath, otelSpanIdToUUID(span.id)] : [otelSpanIdToUUID(span.id)];\n\n traceState.spanPathById.set(span.id, spanPath);\n traceState.spanIdsPathById.set(span.id, spanIdsPath);\n }\n\n try {\n const otelSpan = this.convertSpanToOtel(span, traceState);\n this.processor.onEnd(otelSpan);\n\n if (this.config.realtime) {\n await this.processor.forceFlush();\n }\n } catch (error) {\n this.logger.error('[LaminarExporter] Failed to export span', { error, spanId: span.id, traceId: span.traceId });\n } finally {\n // Refcount cleanup (non-event spans only; event spans never enter active set)\n traceState.activeSpanIds.delete(span.id);\n\n if (traceState.activeSpanIds.size === 0) {\n this.traceMap.delete(span.traceId);\n }\n }\n }\n\n private getOrCreateTraceState(traceId: string): TraceState {\n const existing = this.traceMap.get(traceId);\n if (existing) return existing;\n\n const created: TraceState = {\n spanPathById: new Map(),\n spanIdsPathById: new Map(),\n activeSpanIds: new Set(),\n };\n this.traceMap.set(traceId, created);\n return created;\n }\n\n private convertSpanToOtel(span: AnyExportedSpan, traceState: TraceState): ReadableSpan {\n if (!this.resource || !this.scope) {\n // init() is optional; fall back to defaults if it wasn't called for some reason.\n this.resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: 'mastra-service',\n [ATTR_SERVICE_VERSION]: 'unknown',\n [ATTR_TELEMETRY_SDK_NAME]: '@mastra/laminar',\n [ATTR_TELEMETRY_SDK_VERSION]: 'unknown',\n [ATTR_TELEMETRY_SDK_LANGUAGE]: 'nodejs',\n });\n this.scope = { name: '@mastra/laminar', version: 'unknown' };\n }\n\n const name = span.name;\n const kind = getSpanKind(span.type);\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 traceId = normalizeTraceId(span.traceId);\n const spanId = normalizeSpanId(span.id);\n\n const spanContext: SpanContext = {\n traceId,\n spanId,\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n };\n\n const parentSpanContext = span.parentSpanId\n ? {\n traceId,\n spanId: normalizeSpanId(span.parentSpanId),\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n }\n : undefined;\n\n const attributes = buildLaminarAttributes(span, traceState);\n\n const links: Link[] = [];\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: true,\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 private async setupIfNeeded(): Promise<void> {\n if (this.isSetup || !this.config) {\n return;\n }\n\n this.exporter = new OTLPTraceExporter({\n url: this.config.endpoint,\n headers: this.config.headers,\n timeoutMillis: this.config.timeoutMillis,\n });\n\n this.processor = this.config.disableBatch\n ? new SimpleSpanProcessor(this.exporter)\n : new BatchSpanProcessor(this.exporter, {\n maxExportBatchSize: this.config.batchSize,\n exportTimeoutMillis: this.config.timeoutMillis,\n });\n\n this.isSetup = true;\n }\n\n private async submitScore(args: {\n traceId: string;\n spanId?: string;\n name: string;\n score: number;\n reason?: string;\n metadata?: Record<string, unknown>;\n }): Promise<void> {\n if (!this.config) return;\n\n const { traceId, spanId, name, score, reason, metadata } = args;\n\n const payload: Record<string, unknown> = {\n name,\n score,\n source: 'Code',\n metadata: { ...(metadata ?? {}), ...(reason ? { reason } : {}) },\n };\n\n if (spanId) {\n payload.spanId = otelSpanIdToUUID(spanId);\n } else {\n payload.traceId = otelTraceIdToUUID(traceId);\n }\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.config.apiKey}`,\n 'content-type': 'application/json',\n };\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.config.timeoutMillis);\n\n try {\n const response = await fetch(`${stripTrailingSlash(this.config.baseUrl)}/v1/evaluators/score`, {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n this.logger.warn('[LaminarExporter] Failed to attach score to trace/span', {\n status: response.status,\n statusText: response.statusText,\n traceId,\n spanId,\n name,\n });\n }\n } catch (error) {\n const isAbort = error instanceof Error && error.name === 'AbortError';\n this.logger.error('[LaminarExporter] Error attaching score to trace/span', {\n error,\n timedOut: isAbort,\n timeoutMillis: this.config.timeoutMillis,\n traceId,\n spanId,\n name,\n });\n } finally {\n clearTimeout(timer);\n }\n }\n\n async onScoreEvent(event: ScoreEvent): Promise<void> {\n const { score } = event;\n if (!score.traceId) return;\n await this.submitScore({\n traceId: score.traceId,\n spanId: score.spanId,\n name: score.scorerName ?? score.scorerId,\n score: score.score,\n reason: score.reason,\n metadata: score.metadata,\n });\n }\n\n /**\n * @deprecated Use the observability score event pipeline (`mastra.observability.addScore`)\n * instead. Preserved for backwards compatibility; forwards to the same Laminar score endpoint\n * as `onScoreEvent`.\n */\n async _addScoreToTrace(args: {\n traceId: string;\n spanId?: string;\n score: number;\n reason?: string;\n scorerName: string;\n metadata?: Record<string, any>;\n }): Promise<void> {\n await this.submitScore({\n traceId: args.traceId,\n spanId: args.spanId,\n name: args.scorerName,\n score: args.score,\n reason: args.reason,\n metadata: args.metadata,\n });\n }\n\n /**\n * Force flush any buffered spans without shutting down the exporter.\n * This is useful in serverless environments where you need to ensure spans\n * are exported before the runtime instance is terminated.\n */\n async flush(): Promise<void> {\n if (this.isDisabled || !this.processor) return;\n\n try {\n await this.processor.forceFlush();\n this.logger.debug('[LaminarExporter] Flushed pending spans');\n } catch (error) {\n this.logger.error('[LaminarExporter] Error flushing spans', { error });\n }\n }\n\n async shutdown(): Promise<void> {\n try {\n await this.processor?.shutdown();\n } finally {\n this.traceMap.clear();\n await super.shutdown();\n }\n }\n}\n\nfunction buildLaminarAttributes(span: AnyExportedSpan, traceState: TraceState): Attributes {\n const attributes: Attributes = {};\n\n const spanPath = traceState.spanPathById.get(span.id);\n const spanIdsPath = traceState.spanIdsPathById.get(span.id);\n\n if (spanPath) {\n attributes[LMNR_SPAN_PATH] = spanPath;\n }\n\n if (spanIdsPath) {\n attributes[LMNR_SPAN_IDS_PATH] = spanIdsPath;\n }\n\n attributes[LMNR_SPAN_TYPE] = mapLaminarSpanType(span.type);\n attributes[LMNR_SPAN_INSTRUMENTATION_SOURCE] = 'javascript';\n\n // These attributes are optional in Laminar, but helpful for debugging.\n attributes[LMNR_SPAN_SDK_VERSION] = 'unknown';\n attributes[LMNR_SPAN_LANGUAGE_VERSION] = process.version;\n\n // Association properties\n const sessionId = span.metadata?.sessionId;\n if (typeof sessionId === 'string' && sessionId.length > 0) {\n attributes[LMNR_SESSION_ID] = sessionId;\n }\n\n const userId = span.metadata?.userId;\n if (typeof userId === 'string' && userId.length > 0) {\n attributes[LMNR_USER_ID] = userId;\n }\n\n // Attach Mastra metadata as Laminar trace/span metadata (best-effort, scalar/array-only)\n // Laminar treats `lmnr.association.properties.metadata.*` as freeform metadata.\n if (span.metadata) {\n for (const [key, value] of Object.entries(span.metadata)) {\n if (key === 'sessionId' || key === 'userId' || value === undefined || value === null) {\n continue;\n }\n\n const attributeValue = toLaminarAttributeValue(value);\n if (attributeValue === undefined) {\n continue;\n }\n\n attributes[`${LMNR_ASSOCIATION_PREFIX}.metadata.${key}`] = attributeValue;\n }\n }\n\n if (span.isRootSpan && span.tags?.length) {\n attributes[LMNR_TAGS] = span.tags;\n }\n\n // Span input/output (Laminar prefers these over gen_ai.* / other conventions)\n if (span.input !== undefined) {\n attributes[LMNR_SPAN_INPUT] = serializeForLaminar(getLaminarSpanInput(span));\n }\n\n if (span.output !== undefined) {\n attributes[LMNR_SPAN_OUTPUT] = serializeForLaminar(span.output);\n }\n\n if (span.type === SpanType.MODEL_GENERATION) {\n const modelAttrs = (span.attributes ?? {}) as ModelGenerationAttributes;\n\n if (modelAttrs.provider) {\n attributes[GEN_AI_SYSTEM] = normalizeProvider(modelAttrs.provider);\n }\n\n if (modelAttrs.model) {\n attributes[GEN_AI_REQUEST_MODEL] = modelAttrs.model;\n }\n\n if (modelAttrs.responseModel) {\n attributes[GEN_AI_RESPONSE_MODEL] = modelAttrs.responseModel;\n }\n\n Object.assign(attributes, formatLaminarUsage(modelAttrs.usage));\n }\n\n return attributes;\n}\n\nfunction mapLaminarSpanType(spanType: SpanType): LaminarSpanType {\n switch (spanType) {\n case SpanType.MODEL_GENERATION:\n case SpanType.MODEL_STEP:\n case SpanType.MODEL_CHUNK:\n return 'LLM';\n case SpanType.TOOL_CALL:\n case SpanType.MCP_TOOL_CALL:\n return 'TOOL';\n default:\n return 'DEFAULT';\n }\n}\n\nfunction formatLaminarUsage(usage?: UsageStats): Attributes {\n if (!usage) return {};\n\n const out: Attributes = {};\n\n if (usage.inputTokens !== undefined) {\n out[GEN_AI_USAGE_INPUT_TOKENS] = usage.inputTokens;\n }\n\n if (usage.outputTokens !== undefined) {\n out[GEN_AI_USAGE_OUTPUT_TOKENS] = usage.outputTokens;\n }\n\n if (usage.inputDetails?.cacheWrite !== undefined) {\n out[GEN_AI_CACHE_WRITE_INPUT_TOKENS] = usage.inputDetails.cacheWrite;\n }\n\n if (usage.inputDetails?.cacheRead !== undefined) {\n out[GEN_AI_CACHE_READ_INPUT_TOKENS] = usage.inputDetails.cacheRead;\n }\n\n return out;\n}\n\nfunction serializeForLaminar(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n\n try {\n return JSON.stringify(value);\n } catch {\n return '[unserializable]';\n }\n}\n\nfunction getLaminarSpanInput(span: AnyExportedSpan): unknown {\n // Mastra MODEL_GENERATION spans commonly use `{ messages, ... }` as input.\n // Laminar can render rich chat views when `lmnr.span.input` is a message list.\n if (span.type !== SpanType.MODEL_GENERATION) {\n return span.input;\n }\n\n const input = span.input;\n if (!input || typeof input !== 'object' || Array.isArray(input)) {\n return input;\n }\n\n const maybeMessages = (input as { messages?: unknown }).messages;\n return Array.isArray(maybeMessages) ? maybeMessages : input;\n}\n\nfunction toLaminarAttributeValue(value: unknown): Attributes[string] | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n\n if (Array.isArray(value)) {\n const isHomogeneous =\n value.every(v => typeof v === 'string') ||\n value.every(v => typeof v === 'number') ||\n value.every(v => typeof v === 'boolean');\n if (isHomogeneous) return value;\n }\n\n return serializeForLaminar(value);\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) * 1_000_000;\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\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 return {\n status: { code: SpanStatusCode.OK },\n events,\n };\n}\n\nfunction 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\nexport function stripTrailingSlash(url: string): string {\n let end = url.length;\n while (end > 0 && url.charCodeAt(end - 1) === 47 /* '/' */) {\n end--;\n }\n return end === url.length ? url : url.slice(0, end);\n}\n\nfunction normalizeTraceId(traceId: string): string {\n let id = traceId.toLowerCase();\n if (id.startsWith('0x')) id = id.slice(2);\n return id.padStart(32, '0').slice(-32);\n}\n\nfunction normalizeSpanId(spanId: string): string {\n let id = spanId.toLowerCase();\n if (id.startsWith('0x')) id = id.slice(2);\n return id.padStart(16, '0').slice(-16);\n}\n\nexport function otelSpanIdToUUID(spanId: string): string {\n const normalized = normalizeSpanId(spanId);\n return normalized\n .padStart(32, '0')\n .replace(/^([0-9a-f]{8})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{12})$/, '$1-$2-$3-$4-$5');\n}\n\nexport function otelTraceIdToUUID(traceId: string): string {\n const normalized = normalizeTraceId(traceId);\n return normalized.replace(/^([0-9a-f]{8})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{12})$/, '$1-$2-$3-$4-$5');\n}\n\nfunction normalizeProvider(provider: string): string {\n return provider.split('.').shift()?.toLowerCase().trim() || provider.toLowerCase().trim();\n}\n"]}
package/dist/index.js CHANGED
@@ -213,17 +213,11 @@ var LaminarExporter = class extends BaseExporter {
213
213
  });
214
214
  this.isSetup = true;
215
215
  }
216
- async _addScoreToTrace({
217
- traceId,
218
- spanId,
219
- score,
220
- reason,
221
- scorerName,
222
- metadata
223
- }) {
216
+ async submitScore(args) {
224
217
  if (!this.config) return;
218
+ const { traceId, spanId, name, score, reason, metadata } = args;
225
219
  const payload = {
226
- name: scorerName,
220
+ name,
227
221
  score,
228
222
  source: "Code",
229
223
  metadata: { ...metadata ?? {}, ...reason ? { reason } : {} }
@@ -233,15 +227,18 @@ var LaminarExporter = class extends BaseExporter {
233
227
  } else {
234
228
  payload.traceId = otelTraceIdToUUID(traceId);
235
229
  }
230
+ const headers = {
231
+ Authorization: `Bearer ${this.config.apiKey}`,
232
+ "content-type": "application/json"
233
+ };
234
+ const controller = new AbortController();
235
+ const timer = setTimeout(() => controller.abort(), this.config.timeoutMillis);
236
236
  try {
237
- const scoreHeaders = {
238
- Authorization: `Bearer ${this.config.apiKey}`,
239
- "content-type": "application/json"
240
- };
241
237
  const response = await fetch(`${stripTrailingSlash(this.config.baseUrl)}/v1/evaluators/score`, {
242
238
  method: "POST",
243
- headers: scoreHeaders,
244
- body: JSON.stringify(payload)
239
+ headers,
240
+ body: JSON.stringify(payload),
241
+ signal: controller.signal
245
242
  });
246
243
  if (!response.ok) {
247
244
  this.logger.warn("[LaminarExporter] Failed to attach score to trace/span", {
@@ -249,18 +246,50 @@ var LaminarExporter = class extends BaseExporter {
249
246
  statusText: response.statusText,
250
247
  traceId,
251
248
  spanId,
252
- scorerName
249
+ name
253
250
  });
254
251
  }
255
252
  } catch (error) {
253
+ const isAbort = error instanceof Error && error.name === "AbortError";
256
254
  this.logger.error("[LaminarExporter] Error attaching score to trace/span", {
257
255
  error,
256
+ timedOut: isAbort,
257
+ timeoutMillis: this.config.timeoutMillis,
258
258
  traceId,
259
259
  spanId,
260
- scorerName
260
+ name
261
261
  });
262
+ } finally {
263
+ clearTimeout(timer);
262
264
  }
263
265
  }
266
+ async onScoreEvent(event) {
267
+ const { score } = event;
268
+ if (!score.traceId) return;
269
+ await this.submitScore({
270
+ traceId: score.traceId,
271
+ spanId: score.spanId,
272
+ name: score.scorerName ?? score.scorerId,
273
+ score: score.score,
274
+ reason: score.reason,
275
+ metadata: score.metadata
276
+ });
277
+ }
278
+ /**
279
+ * @deprecated Use the observability score event pipeline (`mastra.observability.addScore`)
280
+ * instead. Preserved for backwards compatibility; forwards to the same Laminar score endpoint
281
+ * as `onScoreEvent`.
282
+ */
283
+ async _addScoreToTrace(args) {
284
+ await this.submitScore({
285
+ traceId: args.traceId,
286
+ spanId: args.spanId,
287
+ name: args.scorerName,
288
+ score: args.score,
289
+ reason: args.reason,
290
+ metadata: args.metadata
291
+ });
292
+ }
264
293
  /**
265
294
  * Force flush any buffered spans without shutting down the exporter.
266
295
  * This is useful in serverless environments where you need to ensure spans
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tracing.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Laminar Exporter for Mastra Observability\n *\n * This exporter sends observability data to Laminar via OTLP/HTTP (protobuf).\n * It also implements addScoreToTrace() to attach scorer results in Laminar.\n */\n\nimport type {\n AnyExportedSpan,\n InitExporterOptions,\n ModelGenerationAttributes,\n TracingEvent,\n UsageStats,\n} from '@mastra/core/observability';\nimport { SpanType, TracingEventType } from '@mastra/core/observability';\nimport { BaseExporter } from '@mastra/observability';\nimport type { BaseExporterConfig } from '@mastra/observability';\nimport { SpanKind, SpanStatusCode, TraceFlags } from '@opentelemetry/api';\nimport type { Attributes, HrTime, Link, SpanContext, SpanStatus } from '@opentelemetry/api';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport type { Resource } from '@opentelemetry/resources';\nimport { BatchSpanProcessor, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport type { ReadableSpan, SpanExporter, 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\n// Laminar span attributes\nconst LMNR_SPAN_INPUT = 'lmnr.span.input';\nconst LMNR_SPAN_OUTPUT = 'lmnr.span.output';\nconst LMNR_SPAN_TYPE = 'lmnr.span.type';\nconst LMNR_SPAN_PATH = 'lmnr.span.path';\nconst LMNR_SPAN_IDS_PATH = 'lmnr.span.ids_path';\nconst LMNR_SPAN_INSTRUMENTATION_SOURCE = 'lmnr.span.instrumentation_source';\nconst LMNR_SPAN_SDK_VERSION = 'lmnr.span.sdk_version';\nconst LMNR_SPAN_LANGUAGE_VERSION = 'lmnr.span.language_version';\n\nconst LMNR_ASSOCIATION_PREFIX = 'lmnr.association.properties';\nconst LMNR_SESSION_ID = `${LMNR_ASSOCIATION_PREFIX}.session_id`;\nconst LMNR_USER_ID = `${LMNR_ASSOCIATION_PREFIX}.user_id`;\nconst LMNR_TAGS = `${LMNR_ASSOCIATION_PREFIX}.tags`;\n\n// Laminar GenAI attributes (as used by Laminar backend)\nconst GEN_AI_SYSTEM = 'gen_ai.system';\nconst GEN_AI_REQUEST_MODEL = 'gen_ai.request.model';\nconst GEN_AI_RESPONSE_MODEL = 'gen_ai.response.model';\nconst GEN_AI_USAGE_INPUT_TOKENS = 'gen_ai.usage.input_tokens';\nconst GEN_AI_USAGE_OUTPUT_TOKENS = 'gen_ai.usage.output_tokens';\nconst GEN_AI_CACHE_WRITE_INPUT_TOKENS = 'gen_ai.usage.cache_creation_input_tokens';\nconst GEN_AI_CACHE_READ_INPUT_TOKENS = 'gen_ai.usage.cache_read_input_tokens';\n\ntype LaminarSpanType = 'DEFAULT' | 'LLM' | 'TOOL';\n\ntype TraceState = {\n spanPathById: Map<string, string[]>;\n spanIdsPathById: Map<string, string[]>;\n activeSpanIds: Set<string>;\n};\n\ntype InstrumentationScope = {\n name: string;\n version?: string;\n schemaUrl?: string;\n};\n\nexport interface LaminarExporterConfig extends BaseExporterConfig {\n /**\n * Laminar project API key. Defaults to `process.env.LMNR_PROJECT_API_KEY`.\n */\n apiKey?: string;\n /**\n * Base URL for Laminar APIs. Defaults to `process.env.LMNR_BASE_URL` or `https://api.lmnr.ai`.\n *\n * Used for:\n * - trace exports (if `endpoint`/`LAMINAR_ENDPOINT` are not set)\n * - evaluator scoring (`/v1/evaluators/score`)\n */\n baseUrl?: string;\n /**\n * Full OTLP/HTTP traces endpoint. Defaults to `process.env.LAMINAR_ENDPOINT` or `${baseUrl}/v1/traces`.\n */\n endpoint?: string;\n /**\n * Additional headers to include in OTLP requests.\n */\n headers?: Record<string, string>;\n /**\n * Flush after each span for near-realtime visibility.\n */\n realtime?: boolean;\n /**\n * Disable batching (uses SimpleSpanProcessor).\n */\n disableBatch?: boolean;\n /**\n * Max spans to export per batch (BatchSpanProcessor only).\n */\n batchSize?: number;\n /**\n * OTLP export timeout in milliseconds.\n */\n timeoutMillis?: number;\n}\n\ntype ResolvedLaminarConfig = Required<Pick<LaminarExporterConfig, 'realtime' | 'disableBatch' | 'batchSize'>> & {\n apiKey: string;\n baseUrl: string;\n endpoint: string;\n headers: Record<string, string>;\n timeoutMillis: number;\n};\n\nexport class LaminarExporter extends BaseExporter {\n name = 'laminar';\n\n private config: ResolvedLaminarConfig | null;\n private traceMap = new Map<string, TraceState>();\n\n private resource?: Resource;\n private scope?: InstrumentationScope;\n private processor?: BatchSpanProcessor | SimpleSpanProcessor;\n private exporter?: SpanExporter;\n private isSetup = false;\n\n constructor(config: LaminarExporterConfig = {}) {\n super(config);\n\n const apiKey = config.apiKey ?? process.env.LMNR_PROJECT_API_KEY;\n if (!apiKey) {\n this.setDisabled(\n 'Missing required API key. Set LMNR_PROJECT_API_KEY environment variable or pass apiKey in config.',\n );\n this.config = null;\n return;\n }\n\n const envEndpoint = process.env.LAMINAR_ENDPOINT;\n const baseUrl = stripTrailingSlash(config.baseUrl ?? process.env.LMNR_BASE_URL ?? 'https://api.lmnr.ai');\n const endpoint = config.endpoint ?? envEndpoint ?? `${baseUrl}/v1/traces`;\n\n const headers: Record<string, string> = {\n ...config.headers,\n Authorization: `Bearer ${apiKey}`,\n };\n\n this.config = {\n apiKey,\n baseUrl,\n endpoint,\n headers,\n realtime: config.realtime ?? false,\n disableBatch: config.disableBatch ?? false,\n batchSize: config.batchSize ?? 512,\n timeoutMillis: config.timeoutMillis ?? 30000,\n };\n }\n\n init(options: InitExporterOptions): void {\n // Build resource & scope lazily so we can include serviceName.\n const serviceName = options.config?.serviceName || 'mastra-service';\n\n this.resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: serviceName,\n [ATTR_SERVICE_VERSION]: 'unknown',\n [ATTR_TELEMETRY_SDK_NAME]: '@mastra/laminar',\n [ATTR_TELEMETRY_SDK_VERSION]: 'unknown',\n [ATTR_TELEMETRY_SDK_LANGUAGE]: 'nodejs',\n });\n\n this.scope = {\n name: '@mastra/laminar',\n version: 'unknown',\n };\n }\n\n protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n // Track hierarchy on span start to build lmnr.span.path/ids_path for child spans.\n if (event.type === TracingEventType.SPAN_STARTED && !event.exportedSpan.isEvent) {\n this.handleSpanStarted(event.exportedSpan);\n return;\n }\n\n // Only export when the span is ended (including event spans).\n if (event.type !== TracingEventType.SPAN_ENDED) {\n return;\n }\n\n await this.handleSpanEnded(event.exportedSpan);\n }\n\n private handleSpanStarted(span: AnyExportedSpan): void {\n const traceState = this.getOrCreateTraceState(span.traceId);\n const name = span.name;\n\n const parentId = span.parentSpanId;\n const parentPath = parentId ? traceState.spanPathById.get(parentId) : undefined;\n const parentIdsPath = parentId ? traceState.spanIdsPathById.get(parentId) : undefined;\n\n const spanPath = parentPath ? [...parentPath, name] : [name];\n const spanIdsPath = parentIdsPath ? [...parentIdsPath, otelSpanIdToUUID(span.id)] : [otelSpanIdToUUID(span.id)];\n\n traceState.spanPathById.set(span.id, spanPath);\n traceState.spanIdsPathById.set(span.id, spanIdsPath);\n traceState.activeSpanIds.add(span.id);\n }\n\n private async handleSpanEnded(span: AnyExportedSpan): Promise<void> {\n if (!this.config) {\n return;\n }\n\n await this.setupIfNeeded();\n\n if (!this.processor || !this.exporter) {\n return;\n }\n\n const traceState = this.getOrCreateTraceState(span.traceId);\n\n // Ensure we have path data even for event spans (which never emit SPAN_STARTED).\n if (!traceState.spanPathById.has(span.id) || !traceState.spanIdsPathById.has(span.id)) {\n const name = span.name;\n const parentId = span.parentSpanId;\n const parentPath = parentId ? traceState.spanPathById.get(parentId) : undefined;\n const parentIdsPath = parentId ? traceState.spanIdsPathById.get(parentId) : undefined;\n\n const spanPath = parentPath ? [...parentPath, name] : [name];\n const spanIdsPath = parentIdsPath ? [...parentIdsPath, otelSpanIdToUUID(span.id)] : [otelSpanIdToUUID(span.id)];\n\n traceState.spanPathById.set(span.id, spanPath);\n traceState.spanIdsPathById.set(span.id, spanIdsPath);\n }\n\n try {\n const otelSpan = this.convertSpanToOtel(span, traceState);\n this.processor.onEnd(otelSpan);\n\n if (this.config.realtime) {\n await this.processor.forceFlush();\n }\n } catch (error) {\n this.logger.error('[LaminarExporter] Failed to export span', { error, spanId: span.id, traceId: span.traceId });\n } finally {\n // Refcount cleanup (non-event spans only; event spans never enter active set)\n traceState.activeSpanIds.delete(span.id);\n\n if (traceState.activeSpanIds.size === 0) {\n this.traceMap.delete(span.traceId);\n }\n }\n }\n\n private getOrCreateTraceState(traceId: string): TraceState {\n const existing = this.traceMap.get(traceId);\n if (existing) return existing;\n\n const created: TraceState = {\n spanPathById: new Map(),\n spanIdsPathById: new Map(),\n activeSpanIds: new Set(),\n };\n this.traceMap.set(traceId, created);\n return created;\n }\n\n private convertSpanToOtel(span: AnyExportedSpan, traceState: TraceState): ReadableSpan {\n if (!this.resource || !this.scope) {\n // init() is optional; fall back to defaults if it wasn't called for some reason.\n this.resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: 'mastra-service',\n [ATTR_SERVICE_VERSION]: 'unknown',\n [ATTR_TELEMETRY_SDK_NAME]: '@mastra/laminar',\n [ATTR_TELEMETRY_SDK_VERSION]: 'unknown',\n [ATTR_TELEMETRY_SDK_LANGUAGE]: 'nodejs',\n });\n this.scope = { name: '@mastra/laminar', version: 'unknown' };\n }\n\n const name = span.name;\n const kind = getSpanKind(span.type);\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 traceId = normalizeTraceId(span.traceId);\n const spanId = normalizeSpanId(span.id);\n\n const spanContext: SpanContext = {\n traceId,\n spanId,\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n };\n\n const parentSpanContext = span.parentSpanId\n ? {\n traceId,\n spanId: normalizeSpanId(span.parentSpanId),\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n }\n : undefined;\n\n const attributes = buildLaminarAttributes(span, traceState);\n\n const links: Link[] = [];\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: true,\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 private async setupIfNeeded(): Promise<void> {\n if (this.isSetup || !this.config) {\n return;\n }\n\n this.exporter = new OTLPTraceExporter({\n url: this.config.endpoint,\n headers: this.config.headers,\n timeoutMillis: this.config.timeoutMillis,\n });\n\n this.processor = this.config.disableBatch\n ? new SimpleSpanProcessor(this.exporter)\n : new BatchSpanProcessor(this.exporter, {\n maxExportBatchSize: this.config.batchSize,\n exportTimeoutMillis: this.config.timeoutMillis,\n });\n\n this.isSetup = true;\n }\n\n async _addScoreToTrace({\n traceId,\n spanId,\n score,\n reason,\n scorerName,\n metadata,\n }: {\n traceId: string;\n spanId?: string;\n score: number;\n reason?: string;\n scorerName: string;\n metadata?: Record<string, any>;\n }): Promise<void> {\n if (!this.config) return;\n\n const payload: Record<string, unknown> = {\n name: scorerName,\n score,\n source: 'Code',\n metadata: { ...(metadata ?? {}), ...(reason ? { reason } : {}) },\n };\n\n if (spanId) {\n payload.spanId = otelSpanIdToUUID(spanId);\n } else {\n payload.traceId = otelTraceIdToUUID(traceId);\n }\n\n try {\n const scoreHeaders: Record<string, string> = {\n Authorization: `Bearer ${this.config.apiKey}`,\n 'content-type': 'application/json',\n };\n\n const response = await fetch(`${stripTrailingSlash(this.config.baseUrl)}/v1/evaluators/score`, {\n method: 'POST',\n headers: scoreHeaders,\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n this.logger.warn('[LaminarExporter] Failed to attach score to trace/span', {\n status: response.status,\n statusText: response.statusText,\n traceId,\n spanId,\n scorerName,\n });\n }\n } catch (error) {\n this.logger.error('[LaminarExporter] Error attaching score to trace/span', {\n error,\n traceId,\n spanId,\n scorerName,\n });\n }\n }\n\n /**\n * Force flush any buffered spans without shutting down the exporter.\n * This is useful in serverless environments where you need to ensure spans\n * are exported before the runtime instance is terminated.\n */\n async flush(): Promise<void> {\n if (this.isDisabled || !this.processor) return;\n\n try {\n await this.processor.forceFlush();\n this.logger.debug('[LaminarExporter] Flushed pending spans');\n } catch (error) {\n this.logger.error('[LaminarExporter] Error flushing spans', { error });\n }\n }\n\n async shutdown(): Promise<void> {\n try {\n await this.processor?.shutdown();\n } finally {\n this.traceMap.clear();\n await super.shutdown();\n }\n }\n}\n\nfunction buildLaminarAttributes(span: AnyExportedSpan, traceState: TraceState): Attributes {\n const attributes: Attributes = {};\n\n const spanPath = traceState.spanPathById.get(span.id);\n const spanIdsPath = traceState.spanIdsPathById.get(span.id);\n\n if (spanPath) {\n attributes[LMNR_SPAN_PATH] = spanPath;\n }\n\n if (spanIdsPath) {\n attributes[LMNR_SPAN_IDS_PATH] = spanIdsPath;\n }\n\n attributes[LMNR_SPAN_TYPE] = mapLaminarSpanType(span.type);\n attributes[LMNR_SPAN_INSTRUMENTATION_SOURCE] = 'javascript';\n\n // These attributes are optional in Laminar, but helpful for debugging.\n attributes[LMNR_SPAN_SDK_VERSION] = 'unknown';\n attributes[LMNR_SPAN_LANGUAGE_VERSION] = process.version;\n\n // Association properties\n const sessionId = span.metadata?.sessionId;\n if (typeof sessionId === 'string' && sessionId.length > 0) {\n attributes[LMNR_SESSION_ID] = sessionId;\n }\n\n const userId = span.metadata?.userId;\n if (typeof userId === 'string' && userId.length > 0) {\n attributes[LMNR_USER_ID] = userId;\n }\n\n // Attach Mastra metadata as Laminar trace/span metadata (best-effort, scalar/array-only)\n // Laminar treats `lmnr.association.properties.metadata.*` as freeform metadata.\n if (span.metadata) {\n for (const [key, value] of Object.entries(span.metadata)) {\n if (key === 'sessionId' || key === 'userId' || value === undefined || value === null) {\n continue;\n }\n\n const attributeValue = toLaminarAttributeValue(value);\n if (attributeValue === undefined) {\n continue;\n }\n\n attributes[`${LMNR_ASSOCIATION_PREFIX}.metadata.${key}`] = attributeValue;\n }\n }\n\n if (span.isRootSpan && span.tags?.length) {\n attributes[LMNR_TAGS] = span.tags;\n }\n\n // Span input/output (Laminar prefers these over gen_ai.* / other conventions)\n if (span.input !== undefined) {\n attributes[LMNR_SPAN_INPUT] = serializeForLaminar(getLaminarSpanInput(span));\n }\n\n if (span.output !== undefined) {\n attributes[LMNR_SPAN_OUTPUT] = serializeForLaminar(span.output);\n }\n\n if (span.type === SpanType.MODEL_GENERATION) {\n const modelAttrs = (span.attributes ?? {}) as ModelGenerationAttributes;\n\n if (modelAttrs.provider) {\n attributes[GEN_AI_SYSTEM] = normalizeProvider(modelAttrs.provider);\n }\n\n if (modelAttrs.model) {\n attributes[GEN_AI_REQUEST_MODEL] = modelAttrs.model;\n }\n\n if (modelAttrs.responseModel) {\n attributes[GEN_AI_RESPONSE_MODEL] = modelAttrs.responseModel;\n }\n\n Object.assign(attributes, formatLaminarUsage(modelAttrs.usage));\n }\n\n return attributes;\n}\n\nfunction mapLaminarSpanType(spanType: SpanType): LaminarSpanType {\n switch (spanType) {\n case SpanType.MODEL_GENERATION:\n case SpanType.MODEL_STEP:\n case SpanType.MODEL_CHUNK:\n return 'LLM';\n case SpanType.TOOL_CALL:\n case SpanType.MCP_TOOL_CALL:\n return 'TOOL';\n default:\n return 'DEFAULT';\n }\n}\n\nfunction formatLaminarUsage(usage?: UsageStats): Attributes {\n if (!usage) return {};\n\n const out: Attributes = {};\n\n if (usage.inputTokens !== undefined) {\n out[GEN_AI_USAGE_INPUT_TOKENS] = usage.inputTokens;\n }\n\n if (usage.outputTokens !== undefined) {\n out[GEN_AI_USAGE_OUTPUT_TOKENS] = usage.outputTokens;\n }\n\n if (usage.inputDetails?.cacheWrite !== undefined) {\n out[GEN_AI_CACHE_WRITE_INPUT_TOKENS] = usage.inputDetails.cacheWrite;\n }\n\n if (usage.inputDetails?.cacheRead !== undefined) {\n out[GEN_AI_CACHE_READ_INPUT_TOKENS] = usage.inputDetails.cacheRead;\n }\n\n return out;\n}\n\nfunction serializeForLaminar(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n\n try {\n return JSON.stringify(value);\n } catch {\n return '[unserializable]';\n }\n}\n\nfunction getLaminarSpanInput(span: AnyExportedSpan): unknown {\n // Mastra MODEL_GENERATION spans commonly use `{ messages, ... }` as input.\n // Laminar can render rich chat views when `lmnr.span.input` is a message list.\n if (span.type !== SpanType.MODEL_GENERATION) {\n return span.input;\n }\n\n const input = span.input;\n if (!input || typeof input !== 'object' || Array.isArray(input)) {\n return input;\n }\n\n const maybeMessages = (input as { messages?: unknown }).messages;\n return Array.isArray(maybeMessages) ? maybeMessages : input;\n}\n\nfunction toLaminarAttributeValue(value: unknown): Attributes[string] | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n\n if (Array.isArray(value)) {\n const isHomogeneous =\n value.every(v => typeof v === 'string') ||\n value.every(v => typeof v === 'number') ||\n value.every(v => typeof v === 'boolean');\n if (isHomogeneous) return value;\n }\n\n return serializeForLaminar(value);\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) * 1_000_000;\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\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 return {\n status: { code: SpanStatusCode.OK },\n events,\n };\n}\n\nfunction 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\nexport function stripTrailingSlash(url: string): string {\n let end = url.length;\n while (end > 0 && url.charCodeAt(end - 1) === 47 /* '/' */) {\n end--;\n }\n return end === url.length ? url : url.slice(0, end);\n}\n\nfunction normalizeTraceId(traceId: string): string {\n let id = traceId.toLowerCase();\n if (id.startsWith('0x')) id = id.slice(2);\n return id.padStart(32, '0').slice(-32);\n}\n\nfunction normalizeSpanId(spanId: string): string {\n let id = spanId.toLowerCase();\n if (id.startsWith('0x')) id = id.slice(2);\n return id.padStart(16, '0').slice(-16);\n}\n\nexport function otelSpanIdToUUID(spanId: string): string {\n const normalized = normalizeSpanId(spanId);\n return normalized\n .padStart(32, '0')\n .replace(/^([0-9a-f]{8})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{12})$/, '$1-$2-$3-$4-$5');\n}\n\nexport function otelTraceIdToUUID(traceId: string): string {\n const normalized = normalizeTraceId(traceId);\n return normalized.replace(/^([0-9a-f]{8})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{12})$/, '$1-$2-$3-$4-$5');\n}\n\nfunction normalizeProvider(provider: string): string {\n return provider.split('.').shift()?.toLowerCase().trim() || provider.toLowerCase().trim();\n}\n"]}
1
+ {"version":3,"sources":["../src/tracing.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Laminar Exporter for Mastra Observability\n *\n * This exporter sends observability data to Laminar via OTLP/HTTP (protobuf).\n * It also implements addScoreToTrace() to attach scorer results in Laminar.\n */\n\nimport type {\n AnyExportedSpan,\n InitExporterOptions,\n ModelGenerationAttributes,\n ScoreEvent,\n TracingEvent,\n UsageStats,\n} from '@mastra/core/observability';\nimport { SpanType, TracingEventType } from '@mastra/core/observability';\nimport { BaseExporter } from '@mastra/observability';\nimport type { BaseExporterConfig } from '@mastra/observability';\nimport { SpanKind, SpanStatusCode, TraceFlags } from '@opentelemetry/api';\nimport type { Attributes, HrTime, Link, SpanContext, SpanStatus } from '@opentelemetry/api';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport type { Resource } from '@opentelemetry/resources';\nimport { BatchSpanProcessor, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport type { ReadableSpan, SpanExporter, 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\n// Laminar span attributes\nconst LMNR_SPAN_INPUT = 'lmnr.span.input';\nconst LMNR_SPAN_OUTPUT = 'lmnr.span.output';\nconst LMNR_SPAN_TYPE = 'lmnr.span.type';\nconst LMNR_SPAN_PATH = 'lmnr.span.path';\nconst LMNR_SPAN_IDS_PATH = 'lmnr.span.ids_path';\nconst LMNR_SPAN_INSTRUMENTATION_SOURCE = 'lmnr.span.instrumentation_source';\nconst LMNR_SPAN_SDK_VERSION = 'lmnr.span.sdk_version';\nconst LMNR_SPAN_LANGUAGE_VERSION = 'lmnr.span.language_version';\n\nconst LMNR_ASSOCIATION_PREFIX = 'lmnr.association.properties';\nconst LMNR_SESSION_ID = `${LMNR_ASSOCIATION_PREFIX}.session_id`;\nconst LMNR_USER_ID = `${LMNR_ASSOCIATION_PREFIX}.user_id`;\nconst LMNR_TAGS = `${LMNR_ASSOCIATION_PREFIX}.tags`;\n\n// Laminar GenAI attributes (as used by Laminar backend)\nconst GEN_AI_SYSTEM = 'gen_ai.system';\nconst GEN_AI_REQUEST_MODEL = 'gen_ai.request.model';\nconst GEN_AI_RESPONSE_MODEL = 'gen_ai.response.model';\nconst GEN_AI_USAGE_INPUT_TOKENS = 'gen_ai.usage.input_tokens';\nconst GEN_AI_USAGE_OUTPUT_TOKENS = 'gen_ai.usage.output_tokens';\nconst GEN_AI_CACHE_WRITE_INPUT_TOKENS = 'gen_ai.usage.cache_creation_input_tokens';\nconst GEN_AI_CACHE_READ_INPUT_TOKENS = 'gen_ai.usage.cache_read_input_tokens';\n\ntype LaminarSpanType = 'DEFAULT' | 'LLM' | 'TOOL';\n\ntype TraceState = {\n spanPathById: Map<string, string[]>;\n spanIdsPathById: Map<string, string[]>;\n activeSpanIds: Set<string>;\n};\n\ntype InstrumentationScope = {\n name: string;\n version?: string;\n schemaUrl?: string;\n};\n\nexport interface LaminarExporterConfig extends BaseExporterConfig {\n /**\n * Laminar project API key. Defaults to `process.env.LMNR_PROJECT_API_KEY`.\n */\n apiKey?: string;\n /**\n * Base URL for Laminar APIs. Defaults to `process.env.LMNR_BASE_URL` or `https://api.lmnr.ai`.\n *\n * Used for:\n * - trace exports (if `endpoint`/`LAMINAR_ENDPOINT` are not set)\n * - evaluator scoring (`/v1/evaluators/score`)\n */\n baseUrl?: string;\n /**\n * Full OTLP/HTTP traces endpoint. Defaults to `process.env.LAMINAR_ENDPOINT` or `${baseUrl}/v1/traces`.\n */\n endpoint?: string;\n /**\n * Additional headers to include in OTLP requests.\n */\n headers?: Record<string, string>;\n /**\n * Flush after each span for near-realtime visibility.\n */\n realtime?: boolean;\n /**\n * Disable batching (uses SimpleSpanProcessor).\n */\n disableBatch?: boolean;\n /**\n * Max spans to export per batch (BatchSpanProcessor only).\n */\n batchSize?: number;\n /**\n * OTLP export timeout in milliseconds.\n */\n timeoutMillis?: number;\n}\n\ntype ResolvedLaminarConfig = Required<Pick<LaminarExporterConfig, 'realtime' | 'disableBatch' | 'batchSize'>> & {\n apiKey: string;\n baseUrl: string;\n endpoint: string;\n headers: Record<string, string>;\n timeoutMillis: number;\n};\n\nexport class LaminarExporter extends BaseExporter {\n name = 'laminar';\n\n private config: ResolvedLaminarConfig | null;\n private traceMap = new Map<string, TraceState>();\n\n private resource?: Resource;\n private scope?: InstrumentationScope;\n private processor?: BatchSpanProcessor | SimpleSpanProcessor;\n private exporter?: SpanExporter;\n private isSetup = false;\n\n constructor(config: LaminarExporterConfig = {}) {\n super(config);\n\n const apiKey = config.apiKey ?? process.env.LMNR_PROJECT_API_KEY;\n if (!apiKey) {\n this.setDisabled(\n 'Missing required API key. Set LMNR_PROJECT_API_KEY environment variable or pass apiKey in config.',\n );\n this.config = null;\n return;\n }\n\n const envEndpoint = process.env.LAMINAR_ENDPOINT;\n const baseUrl = stripTrailingSlash(config.baseUrl ?? process.env.LMNR_BASE_URL ?? 'https://api.lmnr.ai');\n const endpoint = config.endpoint ?? envEndpoint ?? `${baseUrl}/v1/traces`;\n\n const headers: Record<string, string> = {\n ...config.headers,\n Authorization: `Bearer ${apiKey}`,\n };\n\n this.config = {\n apiKey,\n baseUrl,\n endpoint,\n headers,\n realtime: config.realtime ?? false,\n disableBatch: config.disableBatch ?? false,\n batchSize: config.batchSize ?? 512,\n timeoutMillis: config.timeoutMillis ?? 30000,\n };\n }\n\n init(options: InitExporterOptions): void {\n // Build resource & scope lazily so we can include serviceName.\n const serviceName = options.config?.serviceName || 'mastra-service';\n\n this.resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: serviceName,\n [ATTR_SERVICE_VERSION]: 'unknown',\n [ATTR_TELEMETRY_SDK_NAME]: '@mastra/laminar',\n [ATTR_TELEMETRY_SDK_VERSION]: 'unknown',\n [ATTR_TELEMETRY_SDK_LANGUAGE]: 'nodejs',\n });\n\n this.scope = {\n name: '@mastra/laminar',\n version: 'unknown',\n };\n }\n\n protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n // Track hierarchy on span start to build lmnr.span.path/ids_path for child spans.\n if (event.type === TracingEventType.SPAN_STARTED && !event.exportedSpan.isEvent) {\n this.handleSpanStarted(event.exportedSpan);\n return;\n }\n\n // Only export when the span is ended (including event spans).\n if (event.type !== TracingEventType.SPAN_ENDED) {\n return;\n }\n\n await this.handleSpanEnded(event.exportedSpan);\n }\n\n private handleSpanStarted(span: AnyExportedSpan): void {\n const traceState = this.getOrCreateTraceState(span.traceId);\n const name = span.name;\n\n const parentId = span.parentSpanId;\n const parentPath = parentId ? traceState.spanPathById.get(parentId) : undefined;\n const parentIdsPath = parentId ? traceState.spanIdsPathById.get(parentId) : undefined;\n\n const spanPath = parentPath ? [...parentPath, name] : [name];\n const spanIdsPath = parentIdsPath ? [...parentIdsPath, otelSpanIdToUUID(span.id)] : [otelSpanIdToUUID(span.id)];\n\n traceState.spanPathById.set(span.id, spanPath);\n traceState.spanIdsPathById.set(span.id, spanIdsPath);\n traceState.activeSpanIds.add(span.id);\n }\n\n private async handleSpanEnded(span: AnyExportedSpan): Promise<void> {\n if (!this.config) {\n return;\n }\n\n await this.setupIfNeeded();\n\n if (!this.processor || !this.exporter) {\n return;\n }\n\n const traceState = this.getOrCreateTraceState(span.traceId);\n\n // Ensure we have path data even for event spans (which never emit SPAN_STARTED).\n if (!traceState.spanPathById.has(span.id) || !traceState.spanIdsPathById.has(span.id)) {\n const name = span.name;\n const parentId = span.parentSpanId;\n const parentPath = parentId ? traceState.spanPathById.get(parentId) : undefined;\n const parentIdsPath = parentId ? traceState.spanIdsPathById.get(parentId) : undefined;\n\n const spanPath = parentPath ? [...parentPath, name] : [name];\n const spanIdsPath = parentIdsPath ? [...parentIdsPath, otelSpanIdToUUID(span.id)] : [otelSpanIdToUUID(span.id)];\n\n traceState.spanPathById.set(span.id, spanPath);\n traceState.spanIdsPathById.set(span.id, spanIdsPath);\n }\n\n try {\n const otelSpan = this.convertSpanToOtel(span, traceState);\n this.processor.onEnd(otelSpan);\n\n if (this.config.realtime) {\n await this.processor.forceFlush();\n }\n } catch (error) {\n this.logger.error('[LaminarExporter] Failed to export span', { error, spanId: span.id, traceId: span.traceId });\n } finally {\n // Refcount cleanup (non-event spans only; event spans never enter active set)\n traceState.activeSpanIds.delete(span.id);\n\n if (traceState.activeSpanIds.size === 0) {\n this.traceMap.delete(span.traceId);\n }\n }\n }\n\n private getOrCreateTraceState(traceId: string): TraceState {\n const existing = this.traceMap.get(traceId);\n if (existing) return existing;\n\n const created: TraceState = {\n spanPathById: new Map(),\n spanIdsPathById: new Map(),\n activeSpanIds: new Set(),\n };\n this.traceMap.set(traceId, created);\n return created;\n }\n\n private convertSpanToOtel(span: AnyExportedSpan, traceState: TraceState): ReadableSpan {\n if (!this.resource || !this.scope) {\n // init() is optional; fall back to defaults if it wasn't called for some reason.\n this.resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: 'mastra-service',\n [ATTR_SERVICE_VERSION]: 'unknown',\n [ATTR_TELEMETRY_SDK_NAME]: '@mastra/laminar',\n [ATTR_TELEMETRY_SDK_VERSION]: 'unknown',\n [ATTR_TELEMETRY_SDK_LANGUAGE]: 'nodejs',\n });\n this.scope = { name: '@mastra/laminar', version: 'unknown' };\n }\n\n const name = span.name;\n const kind = getSpanKind(span.type);\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 traceId = normalizeTraceId(span.traceId);\n const spanId = normalizeSpanId(span.id);\n\n const spanContext: SpanContext = {\n traceId,\n spanId,\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n };\n\n const parentSpanContext = span.parentSpanId\n ? {\n traceId,\n spanId: normalizeSpanId(span.parentSpanId),\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n }\n : undefined;\n\n const attributes = buildLaminarAttributes(span, traceState);\n\n const links: Link[] = [];\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: true,\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 private async setupIfNeeded(): Promise<void> {\n if (this.isSetup || !this.config) {\n return;\n }\n\n this.exporter = new OTLPTraceExporter({\n url: this.config.endpoint,\n headers: this.config.headers,\n timeoutMillis: this.config.timeoutMillis,\n });\n\n this.processor = this.config.disableBatch\n ? new SimpleSpanProcessor(this.exporter)\n : new BatchSpanProcessor(this.exporter, {\n maxExportBatchSize: this.config.batchSize,\n exportTimeoutMillis: this.config.timeoutMillis,\n });\n\n this.isSetup = true;\n }\n\n private async submitScore(args: {\n traceId: string;\n spanId?: string;\n name: string;\n score: number;\n reason?: string;\n metadata?: Record<string, unknown>;\n }): Promise<void> {\n if (!this.config) return;\n\n const { traceId, spanId, name, score, reason, metadata } = args;\n\n const payload: Record<string, unknown> = {\n name,\n score,\n source: 'Code',\n metadata: { ...(metadata ?? {}), ...(reason ? { reason } : {}) },\n };\n\n if (spanId) {\n payload.spanId = otelSpanIdToUUID(spanId);\n } else {\n payload.traceId = otelTraceIdToUUID(traceId);\n }\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.config.apiKey}`,\n 'content-type': 'application/json',\n };\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.config.timeoutMillis);\n\n try {\n const response = await fetch(`${stripTrailingSlash(this.config.baseUrl)}/v1/evaluators/score`, {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n this.logger.warn('[LaminarExporter] Failed to attach score to trace/span', {\n status: response.status,\n statusText: response.statusText,\n traceId,\n spanId,\n name,\n });\n }\n } catch (error) {\n const isAbort = error instanceof Error && error.name === 'AbortError';\n this.logger.error('[LaminarExporter] Error attaching score to trace/span', {\n error,\n timedOut: isAbort,\n timeoutMillis: this.config.timeoutMillis,\n traceId,\n spanId,\n name,\n });\n } finally {\n clearTimeout(timer);\n }\n }\n\n async onScoreEvent(event: ScoreEvent): Promise<void> {\n const { score } = event;\n if (!score.traceId) return;\n await this.submitScore({\n traceId: score.traceId,\n spanId: score.spanId,\n name: score.scorerName ?? score.scorerId,\n score: score.score,\n reason: score.reason,\n metadata: score.metadata,\n });\n }\n\n /**\n * @deprecated Use the observability score event pipeline (`mastra.observability.addScore`)\n * instead. Preserved for backwards compatibility; forwards to the same Laminar score endpoint\n * as `onScoreEvent`.\n */\n async _addScoreToTrace(args: {\n traceId: string;\n spanId?: string;\n score: number;\n reason?: string;\n scorerName: string;\n metadata?: Record<string, any>;\n }): Promise<void> {\n await this.submitScore({\n traceId: args.traceId,\n spanId: args.spanId,\n name: args.scorerName,\n score: args.score,\n reason: args.reason,\n metadata: args.metadata,\n });\n }\n\n /**\n * Force flush any buffered spans without shutting down the exporter.\n * This is useful in serverless environments where you need to ensure spans\n * are exported before the runtime instance is terminated.\n */\n async flush(): Promise<void> {\n if (this.isDisabled || !this.processor) return;\n\n try {\n await this.processor.forceFlush();\n this.logger.debug('[LaminarExporter] Flushed pending spans');\n } catch (error) {\n this.logger.error('[LaminarExporter] Error flushing spans', { error });\n }\n }\n\n async shutdown(): Promise<void> {\n try {\n await this.processor?.shutdown();\n } finally {\n this.traceMap.clear();\n await super.shutdown();\n }\n }\n}\n\nfunction buildLaminarAttributes(span: AnyExportedSpan, traceState: TraceState): Attributes {\n const attributes: Attributes = {};\n\n const spanPath = traceState.spanPathById.get(span.id);\n const spanIdsPath = traceState.spanIdsPathById.get(span.id);\n\n if (spanPath) {\n attributes[LMNR_SPAN_PATH] = spanPath;\n }\n\n if (spanIdsPath) {\n attributes[LMNR_SPAN_IDS_PATH] = spanIdsPath;\n }\n\n attributes[LMNR_SPAN_TYPE] = mapLaminarSpanType(span.type);\n attributes[LMNR_SPAN_INSTRUMENTATION_SOURCE] = 'javascript';\n\n // These attributes are optional in Laminar, but helpful for debugging.\n attributes[LMNR_SPAN_SDK_VERSION] = 'unknown';\n attributes[LMNR_SPAN_LANGUAGE_VERSION] = process.version;\n\n // Association properties\n const sessionId = span.metadata?.sessionId;\n if (typeof sessionId === 'string' && sessionId.length > 0) {\n attributes[LMNR_SESSION_ID] = sessionId;\n }\n\n const userId = span.metadata?.userId;\n if (typeof userId === 'string' && userId.length > 0) {\n attributes[LMNR_USER_ID] = userId;\n }\n\n // Attach Mastra metadata as Laminar trace/span metadata (best-effort, scalar/array-only)\n // Laminar treats `lmnr.association.properties.metadata.*` as freeform metadata.\n if (span.metadata) {\n for (const [key, value] of Object.entries(span.metadata)) {\n if (key === 'sessionId' || key === 'userId' || value === undefined || value === null) {\n continue;\n }\n\n const attributeValue = toLaminarAttributeValue(value);\n if (attributeValue === undefined) {\n continue;\n }\n\n attributes[`${LMNR_ASSOCIATION_PREFIX}.metadata.${key}`] = attributeValue;\n }\n }\n\n if (span.isRootSpan && span.tags?.length) {\n attributes[LMNR_TAGS] = span.tags;\n }\n\n // Span input/output (Laminar prefers these over gen_ai.* / other conventions)\n if (span.input !== undefined) {\n attributes[LMNR_SPAN_INPUT] = serializeForLaminar(getLaminarSpanInput(span));\n }\n\n if (span.output !== undefined) {\n attributes[LMNR_SPAN_OUTPUT] = serializeForLaminar(span.output);\n }\n\n if (span.type === SpanType.MODEL_GENERATION) {\n const modelAttrs = (span.attributes ?? {}) as ModelGenerationAttributes;\n\n if (modelAttrs.provider) {\n attributes[GEN_AI_SYSTEM] = normalizeProvider(modelAttrs.provider);\n }\n\n if (modelAttrs.model) {\n attributes[GEN_AI_REQUEST_MODEL] = modelAttrs.model;\n }\n\n if (modelAttrs.responseModel) {\n attributes[GEN_AI_RESPONSE_MODEL] = modelAttrs.responseModel;\n }\n\n Object.assign(attributes, formatLaminarUsage(modelAttrs.usage));\n }\n\n return attributes;\n}\n\nfunction mapLaminarSpanType(spanType: SpanType): LaminarSpanType {\n switch (spanType) {\n case SpanType.MODEL_GENERATION:\n case SpanType.MODEL_STEP:\n case SpanType.MODEL_CHUNK:\n return 'LLM';\n case SpanType.TOOL_CALL:\n case SpanType.MCP_TOOL_CALL:\n return 'TOOL';\n default:\n return 'DEFAULT';\n }\n}\n\nfunction formatLaminarUsage(usage?: UsageStats): Attributes {\n if (!usage) return {};\n\n const out: Attributes = {};\n\n if (usage.inputTokens !== undefined) {\n out[GEN_AI_USAGE_INPUT_TOKENS] = usage.inputTokens;\n }\n\n if (usage.outputTokens !== undefined) {\n out[GEN_AI_USAGE_OUTPUT_TOKENS] = usage.outputTokens;\n }\n\n if (usage.inputDetails?.cacheWrite !== undefined) {\n out[GEN_AI_CACHE_WRITE_INPUT_TOKENS] = usage.inputDetails.cacheWrite;\n }\n\n if (usage.inputDetails?.cacheRead !== undefined) {\n out[GEN_AI_CACHE_READ_INPUT_TOKENS] = usage.inputDetails.cacheRead;\n }\n\n return out;\n}\n\nfunction serializeForLaminar(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n\n try {\n return JSON.stringify(value);\n } catch {\n return '[unserializable]';\n }\n}\n\nfunction getLaminarSpanInput(span: AnyExportedSpan): unknown {\n // Mastra MODEL_GENERATION spans commonly use `{ messages, ... }` as input.\n // Laminar can render rich chat views when `lmnr.span.input` is a message list.\n if (span.type !== SpanType.MODEL_GENERATION) {\n return span.input;\n }\n\n const input = span.input;\n if (!input || typeof input !== 'object' || Array.isArray(input)) {\n return input;\n }\n\n const maybeMessages = (input as { messages?: unknown }).messages;\n return Array.isArray(maybeMessages) ? maybeMessages : input;\n}\n\nfunction toLaminarAttributeValue(value: unknown): Attributes[string] | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n\n if (Array.isArray(value)) {\n const isHomogeneous =\n value.every(v => typeof v === 'string') ||\n value.every(v => typeof v === 'number') ||\n value.every(v => typeof v === 'boolean');\n if (isHomogeneous) return value;\n }\n\n return serializeForLaminar(value);\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) * 1_000_000;\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\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 return {\n status: { code: SpanStatusCode.OK },\n events,\n };\n}\n\nfunction 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\nexport function stripTrailingSlash(url: string): string {\n let end = url.length;\n while (end > 0 && url.charCodeAt(end - 1) === 47 /* '/' */) {\n end--;\n }\n return end === url.length ? url : url.slice(0, end);\n}\n\nfunction normalizeTraceId(traceId: string): string {\n let id = traceId.toLowerCase();\n if (id.startsWith('0x')) id = id.slice(2);\n return id.padStart(32, '0').slice(-32);\n}\n\nfunction normalizeSpanId(spanId: string): string {\n let id = spanId.toLowerCase();\n if (id.startsWith('0x')) id = id.slice(2);\n return id.padStart(16, '0').slice(-16);\n}\n\nexport function otelSpanIdToUUID(spanId: string): string {\n const normalized = normalizeSpanId(spanId);\n return normalized\n .padStart(32, '0')\n .replace(/^([0-9a-f]{8})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{12})$/, '$1-$2-$3-$4-$5');\n}\n\nexport function otelTraceIdToUUID(traceId: string): string {\n const normalized = normalizeTraceId(traceId);\n return normalized.replace(/^([0-9a-f]{8})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{12})$/, '$1-$2-$3-$4-$5');\n}\n\nfunction normalizeProvider(provider: string): string {\n return provider.split('.').shift()?.toLowerCase().trim() || provider.toLowerCase().trim();\n}\n"]}
package/dist/tracing.d.ts CHANGED
@@ -4,7 +4,7 @@
4
4
  * This exporter sends observability data to Laminar via OTLP/HTTP (protobuf).
5
5
  * It also implements addScoreToTrace() to attach scorer results in Laminar.
6
6
  */
7
- import type { InitExporterOptions, TracingEvent } from '@mastra/core/observability';
7
+ import type { InitExporterOptions, ScoreEvent, TracingEvent } from '@mastra/core/observability';
8
8
  import { BaseExporter } from '@mastra/observability';
9
9
  import type { BaseExporterConfig } from '@mastra/observability';
10
10
  export interface LaminarExporterConfig extends BaseExporterConfig {
@@ -62,7 +62,14 @@ export declare class LaminarExporter extends BaseExporter {
62
62
  private getOrCreateTraceState;
63
63
  private convertSpanToOtel;
64
64
  private setupIfNeeded;
65
- _addScoreToTrace({ traceId, spanId, score, reason, scorerName, metadata, }: {
65
+ private submitScore;
66
+ onScoreEvent(event: ScoreEvent): Promise<void>;
67
+ /**
68
+ * @deprecated Use the observability score event pipeline (`mastra.observability.addScore`)
69
+ * instead. Preserved for backwards compatibility; forwards to the same Laminar score endpoint
70
+ * as `onScoreEvent`.
71
+ */
72
+ _addScoreToTrace(args: {
66
73
  traceId: string;
67
74
  spanId?: string;
68
75
  score: number;
@@ -1 +1 @@
1
- {"version":3,"file":"tracing.d.ts","sourceRoot":"","sources":["../src/tracing.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAEV,mBAAmB,EAEnB,YAAY,EAEb,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAsDhE,MAAM,WAAW,qBAAsB,SAAQ,kBAAkB;IAC/D;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAUD,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,IAAI,SAAa;IAEjB,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,QAAQ,CAAiC;IAEjD,OAAO,CAAC,QAAQ,CAAC,CAAW;IAC5B,OAAO,CAAC,KAAK,CAAC,CAAuB;IACrC,OAAO,CAAC,SAAS,CAAC,CAA2C;IAC7D,OAAO,CAAC,QAAQ,CAAC,CAAe;IAChC,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,GAAE,qBAA0B;IAiC9C,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;cAkBxB,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAevE,OAAO,CAAC,iBAAiB;YAgBX,eAAe;IA8C7B,OAAO,CAAC,qBAAqB;IAa7B,OAAO,CAAC,iBAAiB;YAoEX,aAAa;IAqBrB,gBAAgB,CAAC,EACrB,OAAO,EACP,MAAM,EACN,KAAK,EACL,MAAM,EACN,UAAU,EACV,QAAQ,GACT,EAAE;QACD,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAChC,GAAG,OAAO,CAAC,IAAI,CAAC;IA+CjB;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAWtB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAQhC;AAuOD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMtD;AAcD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKvD;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGzD"}
1
+ {"version":3,"file":"tracing.d.ts","sourceRoot":"","sources":["../src/tracing.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAEV,mBAAmB,EAEnB,UAAU,EACV,YAAY,EAEb,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAsDhE,MAAM,WAAW,qBAAsB,SAAQ,kBAAkB;IAC/D;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAUD,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,IAAI,SAAa;IAEjB,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,QAAQ,CAAiC;IAEjD,OAAO,CAAC,QAAQ,CAAC,CAAW;IAC5B,OAAO,CAAC,KAAK,CAAC,CAAuB;IACrC,OAAO,CAAC,SAAS,CAAC,CAA2C;IAC7D,OAAO,CAAC,QAAQ,CAAC,CAAe;IAChC,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,GAAE,qBAA0B;IAiC9C,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;cAkBxB,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAevE,OAAO,CAAC,iBAAiB;YAgBX,eAAe;IA8C7B,OAAO,CAAC,qBAAqB;IAa7B,OAAO,CAAC,iBAAiB;YAoEX,aAAa;YAqBb,WAAW;IAiEnB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAapD;;;;OAIG;IACG,gBAAgB,CAAC,IAAI,EAAE;QAC3B,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAChC,GAAG,OAAO,CAAC,IAAI,CAAC;IAWjB;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAWtB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAQhC;AAuOD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMtD;AAcD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKvD;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGzD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mastra/laminar",
3
- "version": "1.0.23-alpha.0",
3
+ "version": "1.1.0-alpha.1",
4
4
  "description": "Laminar observability provider for Mastra - tracing + scoring export",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -29,7 +29,7 @@
29
29
  "@opentelemetry/resources": "^2.7.0",
30
30
  "@opentelemetry/sdk-trace-base": "^2.7.0",
31
31
  "@opentelemetry/semantic-conventions": "^1.40.0",
32
- "@mastra/observability": "1.12.0-alpha.0"
32
+ "@mastra/observability": "1.12.0-alpha.1"
33
33
  },
34
34
  "devDependencies": {
35
35
  "@types/node": "22.19.15",
@@ -41,7 +41,7 @@
41
41
  "vitest": "4.1.5",
42
42
  "@internal/lint": "0.0.92",
43
43
  "@internal/types-builder": "0.0.67",
44
- "@mastra/core": "1.33.0-alpha.5"
44
+ "@mastra/core": "1.33.0-alpha.7"
45
45
  },
46
46
  "peerDependencies": {
47
47
  "@mastra/core": ">=1.16.0-0 <2.0.0-0"