@mastra/observability 1.14.1-alpha.0 → 1.14.1-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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/bus/route-event.ts","../src/bus/base.ts","../src/spans/serialization.ts","../src/bus/observability-bus.ts","../src/config.ts","../src/context/logger.ts","../src/context/metrics.ts","../src/metrics/pricing-model.ts","../src/metrics/pricing-registry.ts","../src/metrics/types.ts","../src/metrics/usage-metrics.ts","../src/metrics/estimator.ts","../src/metrics/auto-extract.ts","../src/metrics/cardinality.ts","../src/usage.ts","../src/model-tracing.ts","../src/spans/base.ts","../src/spans/default.ts","../src/spans/no-op.ts","../src/instances/base.ts","../src/client/id.ts","../src/client/otlp.ts","../src/client/w3c.ts","../src/client/proxy.ts","../src/exporters/base.ts","../src/exporters/tracking.ts","../src/exporters/span-formatters.ts","../src/exporters/auth-failure-cooldown.ts","../src/exporters/cloud.ts","../src/exporters/console.ts","../src/exporters/event-buffer.ts","../src/exporters/default.ts","../src/exporters/mastra-platform.ts","../src/exporters/mastra-storage.ts","../src/exporters/test.ts","../src/instances/default.ts","../src/recorded.ts","../src/registry.ts","../src/span_processors/sensitive-data-filter.ts","../src/default.ts","../src/features.ts","../src/tracing-options.ts"],"names":["TracingEventType","MastraBase","RegisteredLogger","cleaned","SamplingStrategyType","z","SpanType","generateSignalId","fs","path","require","createRequire","DEFAULT_BLOCKED_LABELS","coreFeatures","TransformStream","InternalSpans","error","MastraError","noOpLoggerContext","getNestedValue","setNestedValue","EntityType","ConsoleLogger","LogLevel","fetchWithRetry","ErrorDomain","ErrorCategory","buildUpdateSpanRecord","buildFeedbackRecord","buildLogRecord","buildMetricRecord","buildScoreRecord","buildCreateSpanRecord","SIGNAL_PUBLISH_SUFFIXES","SIGNAL_PUBLISH_SEGMENTS","trimTrailingSlashes","createInvalidEndpointError","VALID_PROJECT_ID","createInvalidProjectIdError","resolveBaseEndpoint","buildSignalPath","buildSignalEndpoint","resolveExplicitSignalEndpoint","deriveSignalEndpointFromTracesEndpoint","resolveTracingStorageStrategy","EventType"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Shared event routing logic for observability handlers (exporters and bridges).\n *\n * Both ObservabilityExporter and ObservabilityBridge implement the same optional\n * signal handlers (onTracingEvent, onLogEvent, onMetricEvent, onScoreEvent,\n * onFeedbackEvent). This module provides a single routing function used by both\n * the ObservabilityBus (for exporters) and BaseObservabilityInstance (for bridges).\n */\n\nimport type { IMastraLogger } from '@mastra/core/logger';\nimport type {\n ObservabilityEvents,\n TracingEvent,\n LogEvent,\n MetricEvent,\n ScoreEvent,\n FeedbackEvent,\n ObservabilityEvent,\n ObservabilityDropEvent,\n} from '@mastra/core/observability';\nimport { TracingEventType } from '@mastra/core/observability';\n\n/**\n * Any handler that can receive routed observability events.\n * Both ObservabilityExporter and ObservabilityBridge extend\n * ObservabilityEvents, so this matches either.\n */\nexport type ObservabilityHandler = ObservabilityEvents & { name: string };\n\ntype LegacyScoreHandler = ObservabilityHandler & {\n addScoreToTrace?: (args: {\n traceId: string;\n spanId?: string;\n score: number;\n reason?: string;\n scorerName: string;\n metadata?: Record<string, any>;\n }) => void | Promise<void>;\n};\n\n/**\n * Route a single event to the appropriate method on a handler.\n *\n * For tracing events, prefers onTracingEvent when present and falls back\n * to exportTracingEvent. For all other signals, calls the corresponding\n * optional handler method if the handler implements it.\n *\n * Returns the handler promise (if async) so callers can track it for flush().\n * Async rejections are caught to prevent unhandled rejections.\n * Sync throws are caught so one failing handler doesn't break others.\n */\nexport function routeToHandler(\n handler: ObservabilityHandler,\n event: ObservabilityEvent,\n logger: IMastraLogger,\n): void | Promise<void> {\n try {\n switch (event.type) {\n case TracingEventType.SPAN_STARTED:\n case TracingEventType.SPAN_UPDATED:\n case TracingEventType.SPAN_ENDED: {\n const fn = handler.onTracingEvent\n ? handler.onTracingEvent.bind(handler)\n : handler.exportTracingEvent.bind(handler);\n return catchAsyncResult(fn(event as TracingEvent), handler.name, 'tracing', logger);\n }\n\n case 'log':\n if (handler.onLogEvent) {\n return catchAsyncResult(handler.onLogEvent(event as LogEvent), handler.name, 'log', logger);\n }\n break;\n\n case 'metric':\n if (handler.onMetricEvent) {\n return catchAsyncResult(handler.onMetricEvent(event as MetricEvent), handler.name, 'metric', logger);\n }\n break;\n\n case 'score':\n if (handler.onScoreEvent) {\n return catchAsyncResult(handler.onScoreEvent(event as ScoreEvent), handler.name, 'score', logger);\n }\n if ((handler as LegacyScoreHandler).addScoreToTrace) {\n const score = (event as ScoreEvent).score;\n if (!score.traceId) break;\n return catchAsyncResult(\n (handler as LegacyScoreHandler).addScoreToTrace!({\n traceId: score.traceId,\n ...(score.spanId ? { spanId: score.spanId } : {}),\n score: score.score,\n ...(score.reason ? { reason: score.reason } : {}),\n scorerName: score.scorerName ?? score.scorerId,\n ...(score.metadata ? { metadata: score.metadata as Record<string, any> } : {}),\n }),\n handler.name,\n 'score',\n logger,\n );\n }\n break;\n\n case 'feedback':\n if (handler.onFeedbackEvent) {\n return catchAsyncResult(handler.onFeedbackEvent(event as FeedbackEvent), handler.name, 'feedback', logger);\n }\n break;\n }\n } catch (err) {\n logger.error(`[Observability] Handler error [handler=${handler.name}]:`, err);\n }\n}\n\n/**\n * Route exporter pipeline drop events to a handler.\n *\n * Drop events are meta-events for alerting and health reporting, so they use a\n * dedicated hook instead of the normal observability signal router.\n */\nexport function routeDropToHandler(\n handler: ObservabilityHandler,\n event: ObservabilityDropEvent,\n logger: IMastraLogger,\n): void | Promise<void> {\n try {\n if (handler.onDroppedEvent) {\n return catchAsyncResult(handler.onDroppedEvent(event), handler.name, 'drop', logger);\n }\n } catch (err) {\n logger.error(`[Observability] Handler error [handler=${handler.name}]:`, err);\n }\n}\n\n/**\n * Catch rejected promises from async handlers and return the tracked promise.\n * The returned promise always resolves (never rejects) — errors are logged.\n */\nfunction catchAsyncResult(\n result: void | Promise<void>,\n handlerName: string,\n signal: string,\n logger: IMastraLogger,\n): void | Promise<void> {\n if (result && typeof (result as Promise<void>).then === 'function') {\n return (result as Promise<void>).catch(err => {\n logger.error(`[Observability] ${signal} handler error [handler=${handlerName}]:`, err);\n });\n }\n}\n","/**\n * BaseObservabilityEventBus - Generic event bus for observability events.\n *\n * Provides a synchronous pub/sub mechanism:\n * - Events are dispatched to subscribers immediately on emit()\n * - Graceful error handling (handler errors don't break other handlers)\n * - flush() awaits any in-flight async subscriber promises\n * - Clean shutdown flushes then clears subscribers\n *\n * Buffering/batching is intentionally NOT done here — individual exporters\n * own their own batching strategy.\n */\n\nimport { MastraBase } from '@mastra/core/base';\nimport { RegisteredLogger } from '@mastra/core/logger';\nimport type { ObservabilityEventBus } from '@mastra/core/observability';\n\nexport class BaseObservabilityEventBus<TEvent> extends MastraBase implements ObservabilityEventBus<TEvent> {\n private subscribers: Set<(event: TEvent) => void> = new Set();\n\n /** In-flight async subscriber promises. Self-cleaning via .finally(). */\n private pendingSubscribers: Set<Promise<void>> = new Set();\n\n constructor({ name }: { name?: string } = {}) {\n super({ component: RegisteredLogger.OBSERVABILITY, name: name ?? 'EventBus' });\n }\n\n /**\n * Dispatch an event to all subscribers synchronously.\n * Async handler promises are tracked internally and drained by {@link flush}.\n *\n * @param event - The event to broadcast to subscribers.\n */\n emit(event: TEvent): void {\n for (const handler of this.subscribers) {\n try {\n // Handler is typed as () => void, but at runtime an async fn returns a Promise.\n // Defensively catch rejected promises so they don't become unhandled rejections.\n const result: unknown = handler(event);\n if (result && typeof (result as Promise<void>).then === 'function') {\n const promise = (result as Promise<void>).catch(err => {\n this.logger.error('[ObservabilityEventBus] Handler error:', err);\n });\n this.pendingSubscribers.add(promise);\n void promise.finally(() => this.pendingSubscribers.delete(promise));\n }\n } catch (err) {\n this.logger.error('[ObservabilityEventBus] Handler error:', err);\n }\n }\n }\n\n /**\n * Register a handler to receive future events.\n *\n * @param handler - Callback invoked synchronously on each {@link emit}.\n * @returns An unsubscribe function that removes the handler.\n */\n subscribe(handler: (event: TEvent) => void): () => void {\n this.subscribers.add(handler);\n return () => {\n this.subscribers.delete(handler);\n };\n }\n\n /** Max flush drain iterations before bailing — prevents infinite loops when handlers re-emit. */\n private static readonly MAX_FLUSH_ITERATIONS = 3;\n\n /** Await all in-flight async subscriber promises, draining until empty. */\n async flush(): Promise<void> {\n let iterations = 0;\n while (this.pendingSubscribers.size > 0) {\n await Promise.allSettled([...this.pendingSubscribers]);\n iterations++;\n if (iterations >= BaseObservabilityEventBus.MAX_FLUSH_ITERATIONS) {\n this.logger.error(\n `[ObservabilityEventBus] flush() exceeded ${BaseObservabilityEventBus.MAX_FLUSH_ITERATIONS} drain iterations — ` +\n `${this.pendingSubscribers.size} promises still pending. Handlers may be re-emitting during flush.`,\n );\n break;\n }\n }\n }\n\n /** Flush pending promises, then clear all subscribers. */\n async shutdown(): Promise<void> {\n await this.flush();\n this.subscribers.clear();\n }\n}\n","/**\n * Bounded serialization utilities for AI tracing.\n *\n * These utilities prevent memory issues by enforcing strict limits on\n * string lengths, array sizes, object depths, and total output size.\n * They are designed to be used across all tracing/telemetry systems.\n *\n * ## Custom Span Serialization\n *\n * Classes can implement a `serializeForSpan()` method to provide a custom\n * representation when serialized for tracing spans. This is useful for:\n * - Excluding internal state and implementation details\n * - Removing functions and circular references\n * - Providing a clean, readable representation for observability\n *\n * @example\n * ```typescript\n * class MyClass {\n * private internalState = new Map();\n * public data: string[];\n *\n * serializeForSpan() {\n * return { data: this.data };\n * }\n * }\n * ```\n */\n\n/**\n * Default keys to strip from objects during deep cleaning.\n * These are typically internal/sensitive fields that shouldn't be traced.\n */\nexport const DEFAULT_KEYS_TO_STRIP = new Set([\n 'logger',\n 'experimental_providerMetadata',\n 'providerMetadata',\n 'steps',\n 'tracingContext',\n 'execute', // Tool execute functions\n 'validate', // Schema validate functions\n]);\n\nexport interface DeepCleanOptions {\n keysToStrip: Set<string> | string[] | Record<string, unknown>;\n maxDepth: number;\n maxStringLength: number;\n maxArrayLength: number;\n maxObjectKeys: number;\n}\n\nexport const DEFAULT_DEEP_CLEAN_OPTIONS: DeepCleanOptions = Object.freeze({\n keysToStrip: DEFAULT_KEYS_TO_STRIP,\n maxDepth: 8,\n maxStringLength: 128 * 1024, // 128KB - sufficient for large LLM prompts/responses\n maxArrayLength: 50,\n maxObjectKeys: 50,\n});\n\n/**\n * Merge user-provided serialization options with defaults.\n * Returns a complete DeepCleanOptions object.\n */\nexport function mergeSerializationOptions(userOptions?: {\n maxStringLength?: number;\n maxDepth?: number;\n maxArrayLength?: number;\n maxObjectKeys?: number;\n}): DeepCleanOptions {\n if (!userOptions) {\n return DEFAULT_DEEP_CLEAN_OPTIONS;\n }\n return {\n keysToStrip: DEFAULT_KEYS_TO_STRIP,\n maxDepth: userOptions.maxDepth ?? DEFAULT_DEEP_CLEAN_OPTIONS.maxDepth,\n maxStringLength: userOptions.maxStringLength ?? DEFAULT_DEEP_CLEAN_OPTIONS.maxStringLength,\n maxArrayLength: userOptions.maxArrayLength ?? DEFAULT_DEEP_CLEAN_OPTIONS.maxArrayLength,\n maxObjectKeys: userOptions.maxObjectKeys ?? DEFAULT_DEEP_CLEAN_OPTIONS.maxObjectKeys,\n };\n}\n\n/**\n * Hard-cap any string to prevent unbounded growth.\n */\nexport function truncateString(s: string, maxChars: number): string {\n if (s.length <= maxChars) {\n return s;\n }\n\n return s.slice(0, maxChars) + '…[truncated]';\n}\n\nexport type SerializedMapEntry = [keyType: string, key: any, value: any];\n\nexport interface SerializedMap {\n __type: 'Map';\n __map_entries: SerializedMapEntry[];\n __truncated?: string;\n}\n\nfunction formatSerializationError(error: unknown): string {\n return `[${error instanceof Error ? truncateString(error.message, 256) : 'unknown error'}]`;\n}\n\nfunction getMapKeyType(key: unknown): string {\n if (key === null) {\n return 'null';\n }\n if (key instanceof Date) {\n return 'date';\n }\n if (Array.isArray(key)) {\n return 'array';\n }\n if (key instanceof Map) {\n return 'map';\n }\n if (key instanceof Set) {\n return 'set';\n }\n if (key instanceof Error) {\n return 'error';\n }\n\n return typeof key;\n}\n\nfunction restoreSerializedMapKey(keyType: string, key: any): unknown {\n switch (keyType) {\n case 'undefined':\n return undefined;\n case 'null':\n return null;\n case 'bigint':\n return typeof key === 'string' && key.endsWith('n') ? BigInt(key.slice(0, -1)) : key;\n case 'date':\n return typeof key === 'string' ? new Date(key) : key;\n default:\n return key;\n }\n}\n\nexport function isSerializedMap(value: unknown): value is SerializedMap {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as SerializedMap).__type === 'Map' &&\n Array.isArray((value as SerializedMap).__map_entries)\n );\n}\n\nexport function reconstructSerializedMap(value: SerializedMap): Map<unknown, unknown> {\n return new Map(\n value.__map_entries.map(([keyType, key, mapValue]) => [restoreSerializedMapKey(keyType, key), mapValue]),\n );\n}\n\n/**\n * Detect if an object is a JSON Schema.\n * Looks for typical JSON Schema markers like $schema, type with properties, etc.\n */\nfunction isJsonSchema(val: any): boolean {\n if (typeof val !== 'object' || val === null) return false;\n\n // Has explicit $schema property\n if (val.$schema && typeof val.$schema === 'string' && val.$schema.includes('json-schema')) {\n return true;\n }\n\n // Has type: \"object\" with properties (common pattern)\n if (val.type === 'object' && val.properties && typeof val.properties === 'object') {\n return true;\n }\n\n return false;\n}\n\n/**\n * Recursively cleans a value by removing circular references, stripping problematic keys,\n * and enforcing size limits on strings, arrays, and objects.\n *\n * This is used by AI tracing spans to sanitize input/output data before storing.\n *\n * @param value - The value to clean (object, array, primitive, etc.)\n * @param options - Optional configuration for cleaning behavior\n * @returns A cleaned version of the input with size limits enforced\n */\nexport function deepClean(value: any, options: DeepCleanOptions = DEFAULT_DEEP_CLEAN_OPTIONS): any {\n const { keysToStrip, maxDepth, maxStringLength, maxArrayLength, maxObjectKeys } = options;\n\n // Normalize to a Set once so lookups are always O(1).\n // Bundlers can transform `new Set([...])` into a plain object or array,\n // so we accept all three forms and coerce up front.\n const stripSet =\n keysToStrip instanceof Set\n ? keysToStrip\n : new Set(Array.isArray(keysToStrip) ? keysToStrip : Object.keys(keysToStrip));\n\n // Track objects on the current ancestor path to detect true circular\n // references (A → B → A) without false-flagging shared references\n // (A → X, B → X). A shared (non-circular) reference is simply\n // serialized again in each location where it appears.\n const ancestors = new WeakSet<any>();\n\n function helper(val: any, depth: number): any {\n if (depth > maxDepth) {\n return '[MaxDepth]';\n }\n\n // Handle primitives\n if (val === null || val === undefined) {\n return val;\n }\n\n // Handle strings - enforce length limit\n if (typeof val === 'string') {\n return truncateString(val, maxStringLength);\n }\n\n // Handle other non-object primitives explicitly\n if (typeof val === 'number' || typeof val === 'boolean') {\n return val;\n }\n if (typeof val === 'bigint') {\n return `${val}n`;\n }\n if (typeof val === 'function') {\n return '[Function]';\n }\n if (typeof val === 'symbol') {\n return val.description ? `[Symbol(${val.description})]` : '[Symbol]';\n }\n\n // Handle Date objects - preserve as-is\n if (val instanceof Date) {\n return val;\n }\n\n // Handle circular references — only flag when the same object is an\n // ancestor of the current node (true cycle), not merely seen elsewhere.\n if (typeof val === 'object') {\n if (ancestors.has(val)) {\n return '[Circular]';\n }\n ancestors.add(val);\n }\n\n try {\n // Handle Errors specially - preserve name, message, stack, and cause.\n // Done inside the try so the ancestor set is cleaned up in finally,\n // which also means cycles via `cause` are caught.\n if (val instanceof Error) {\n let errorName: unknown;\n let errorMessage: unknown;\n let errorStack: unknown;\n let rawCause: unknown;\n let causeReadFailed = false;\n\n try {\n errorName = val.name;\n } catch (error) {\n errorName = formatSerializationError(error);\n }\n\n try {\n errorMessage = val.message;\n } catch (error) {\n errorMessage = formatSerializationError(error);\n }\n\n try {\n errorStack = val.stack;\n } catch (error) {\n errorStack = formatSerializationError(error);\n }\n\n try {\n rawCause = (val as any).cause;\n } catch (error) {\n causeReadFailed = true;\n rawCause = formatSerializationError(error);\n }\n\n const cleanedError: Record<string, any> = {\n name: typeof errorName === 'string' ? truncateString(errorName, maxStringLength) : errorName,\n message: typeof errorMessage === 'string' ? truncateString(errorMessage, maxStringLength) : errorMessage,\n };\n if (typeof errorStack === 'string') {\n cleanedError.stack = truncateString(errorStack, maxStringLength);\n } else if (errorStack !== undefined) {\n cleanedError.stack = errorStack;\n }\n if (causeReadFailed) {\n cleanedError.cause = rawCause;\n } else if (rawCause !== undefined) {\n try {\n cleanedError.cause = helper(rawCause, depth + 1);\n } catch (error) {\n cleanedError.cause = formatSerializationError(error);\n }\n }\n return cleanedError;\n }\n\n // Handle Map - emit a tagged wrapper so key type/value identity is preserved.\n if (val instanceof Map) {\n const cleanedMap: SerializedMap = { __type: 'Map', __map_entries: [] };\n let mapKeyCount = 0;\n let omittedMapEntries = 0;\n for (const [mapKey, mapVal] of val) {\n if (typeof mapKey === 'string' && stripSet.has(mapKey)) {\n continue;\n }\n\n if (mapKeyCount >= maxObjectKeys) {\n omittedMapEntries++;\n continue;\n }\n\n const mapKeyType = getMapKeyType(mapKey);\n let cleanedMapKey: any;\n let cleanedMapValue: any;\n\n try {\n cleanedMapKey = helper(mapKey, depth + 1);\n } catch (error) {\n cleanedMapKey = formatSerializationError(error);\n }\n\n try {\n cleanedMapValue = helper(mapVal, depth + 1);\n } catch (error) {\n cleanedMapValue = formatSerializationError(error);\n }\n\n cleanedMap.__map_entries.push([mapKeyType, cleanedMapKey, cleanedMapValue]);\n mapKeyCount++;\n }\n if (omittedMapEntries > 0) {\n cleanedMap.__truncated = `${omittedMapEntries} more keys omitted`;\n }\n return cleanedMap;\n }\n\n // Handle Set - convert to an array.\n if (val instanceof Set) {\n const cleanedSet: any[] = [];\n let i = 0;\n const totalSetSize = val.size;\n for (const item of val) {\n if (i >= maxArrayLength) break;\n try {\n cleanedSet.push(helper(item, depth + 1));\n } catch (error) {\n cleanedSet.push(formatSerializationError(error));\n }\n i++;\n }\n if (totalSetSize > maxArrayLength) {\n cleanedSet.push(`[…${totalSetSize - maxArrayLength} more items]`);\n }\n return cleanedSet;\n }\n\n // Handle arrays - enforce length limit\n if (Array.isArray(val)) {\n const cleaned = [];\n\n for (let i = 0; i < Math.min(val.length, maxArrayLength); i++) {\n try {\n cleaned.push(helper(val[i], depth + 1));\n } catch (error) {\n cleaned.push(formatSerializationError(error));\n }\n }\n\n if (val.length > maxArrayLength) {\n cleaned.push(`[…${val.length - maxArrayLength} more items]`);\n }\n return cleaned;\n }\n\n // Handle Buffer and typed arrays - don't serialize large binary data\n if (typeof Buffer !== 'undefined' && Buffer.isBuffer(val)) {\n return `[Buffer length=${val.length}]`;\n }\n\n if (ArrayBuffer.isView(val)) {\n const ctor = (val as any).constructor?.name ?? 'TypedArray';\n const byteLength = (val as any).byteLength ?? '?';\n return `[${ctor} byteLength=${byteLength}]`;\n }\n\n if (val instanceof ArrayBuffer) {\n return `[ArrayBuffer byteLength=${val.byteLength}]`;\n }\n\n // Handle objects with serializeForSpan() method - use their custom trace serialization\n let serializeForSpan;\n try {\n serializeForSpan = val.serializeForSpan;\n } catch (error) {\n return `[serializeForSpan failed: ${error instanceof Error ? truncateString(error.message, 256) : 'unknown error'}]`;\n }\n\n if (typeof serializeForSpan === 'function') {\n try {\n return helper(serializeForSpan.call(val), depth);\n } catch (error) {\n return `[serializeForSpan failed: ${error instanceof Error ? truncateString(error.message, 256) : 'unknown error'}]`;\n }\n }\n\n // Handle JSON Schema objects - return as-is to preserve raw schemas for debugging.\n // JSON schemas are plain serializable objects (no circular refs, functions, etc.)\n // so we skip recursive traversal for performance.\n let looksLikeJsonSchema = false;\n try {\n looksLikeJsonSchema = isJsonSchema(val);\n } catch {\n looksLikeJsonSchema = false;\n }\n\n if (looksLikeJsonSchema) {\n return val;\n }\n\n // Handle objects - enforce key limit\n const cleaned: Record<string, any> = {};\n const keys = Object.keys(val).filter(key => !stripSet.has(key));\n let keyCount = 0;\n\n for (const key of keys) {\n if (keyCount >= maxObjectKeys) {\n cleaned['__truncated'] = `${keys.length - keyCount} more keys omitted`;\n break;\n }\n\n try {\n cleaned[key] = helper((val as Record<string, unknown>)[key], depth + 1);\n keyCount++;\n } catch (error) {\n cleaned[key] = formatSerializationError(error);\n keyCount++;\n }\n }\n\n return cleaned;\n } finally {\n // Remove from ancestor set when leaving this node so parallel\n // branches can serialize the same shared reference independently.\n if (typeof val === 'object' && val !== null) {\n ancestors.delete(val);\n }\n }\n }\n\n return helper(value, 0);\n}\n","/**\n * ObservabilityBus - Unified event bus for all observability signals.\n *\n * Routes events to registered exporters and an optional bridge based on event\n * type. Each handler declares which signals it supports by implementing the\n * corresponding method (onTracingEvent, onLogEvent, onMetricEvent,\n * onScoreEvent, onFeedbackEvent).\n *\n * Handler presence = signal support. If a handler does not implement a method,\n * events of that type are silently skipped for that handler.\n */\n\nimport type {\n ObservabilityExporter,\n ObservabilityBridge,\n ObservabilityEvent,\n ObservabilityDropEvent,\n SerializationOptions,\n} from '@mastra/core/observability';\n\nimport type { DeepCleanOptions } from '../spans/serialization';\nimport { deepClean, mergeSerializationOptions } from '../spans/serialization';\nimport { BaseObservabilityEventBus } from './base';\nimport { routeDropToHandler, routeToHandler } from './route-event';\n\n/**\n * Apply deepClean() to non-tracing observability events. Tracing events are\n * already deep-cleaned at span construction time (see spans/base.ts and\n * spans/default.ts), so they pass through unchanged.\n *\n * For log/metric/score/feedback we clean the entire exported payload object\n * (not just the freeform sub-fields) so every user-supplied field — top-level\n * strings like `message`/`reason`/`comment`, arrays like `tags`, nested\n * `metadata`/`data`/`costMetadata`, and any future fields — is bounded,\n * stripped of circular refs/functions/symbols, and safe for JSON.stringify\n * before exporters or bridges see it.\n *\n * Identity scalars (timestamps, numeric score/value, IDs) are passed through\n * by deepClean unchanged, so the cleaned object is structurally identical to\n * the input for well-formed events.\n */\nfunction cleanEvent(event: ObservabilityEvent, options: DeepCleanOptions): ObservabilityEvent {\n switch (event.type) {\n case 'log':\n return { type: 'log', log: deepClean(event.log, options) };\n case 'metric':\n return { type: 'metric', metric: deepClean(event.metric, options) };\n case 'score':\n return { type: 'score', score: deepClean(event.score, options) };\n case 'feedback':\n return { type: 'feedback', feedback: deepClean(event.feedback, options) };\n default:\n // Tracing events are already cleaned at span construction.\n return event;\n }\n}\n\n/** Max flush drain iterations before bailing — prevents infinite loops when handlers re-emit. */\nconst MAX_FLUSH_ITERATIONS = 3;\n\n/**\n * Unified event bus for all observability signals (tracing, logs, metrics, scores, feedback).\n * Routes events to registered exporters and an optional bridge.\n */\nexport class ObservabilityBus extends BaseObservabilityEventBus<ObservabilityEvent> {\n private exporters: ObservabilityExporter[] = [];\n private bridge?: ObservabilityBridge;\n\n /** In-flight handler promises from routeToHandler. Self-cleaning via .finally(). */\n private pendingHandlers: Set<Promise<void>> = new Set();\n\n private handlerBufferFlushDepth = 0;\n private dropEventsEmittedDuringHandlerFlush = 0;\n\n /** Resolved deepClean options applied to non-tracing events before fan-out. */\n private deepCleanOptions: DeepCleanOptions;\n\n constructor(opts?: { serializationOptions?: SerializationOptions }) {\n super({ name: 'ObservabilityBus' });\n this.deepCleanOptions = mergeSerializationOptions(opts?.serializationOptions);\n }\n\n /**\n * Register an exporter to receive routed events.\n * Duplicate registrations (same instance) are silently ignored.\n *\n * @param exporter - The exporter to register.\n */\n registerExporter(exporter: ObservabilityExporter): void {\n if (this.exporters.includes(exporter)) {\n return;\n }\n this.exporters.push(exporter);\n }\n\n /**\n * Unregister an exporter.\n *\n * @param exporter - The exporter instance to remove.\n * @returns `true` if the exporter was found and removed, `false` otherwise.\n */\n unregisterExporter(exporter: ObservabilityExporter): boolean {\n const index = this.exporters.indexOf(exporter);\n if (index !== -1) {\n this.exporters.splice(index, 1);\n return true;\n }\n return false;\n }\n\n /**\n * Get registered exporters (read-only snapshot).\n */\n getExporters(): readonly ObservabilityExporter[] {\n return [...this.exporters];\n }\n\n /**\n * Register a bridge to receive all routed events alongside exporters.\n * Only one bridge can be registered at a time; replacing an existing bridge\n * logs a warning.\n *\n * @param bridge - The bridge to register.\n */\n registerBridge(bridge: ObservabilityBridge): void {\n if (this.bridge) {\n this.logger.warn(`[ObservabilityBus] Replacing existing bridge with new bridge`);\n }\n this.bridge = bridge;\n }\n\n /**\n * Unregister the bridge.\n *\n * @returns `true` if a bridge was registered and removed, `false` otherwise.\n */\n unregisterBridge(): boolean {\n if (this.bridge) {\n this.bridge = undefined;\n return true;\n }\n return false;\n }\n\n /**\n * Get the registered bridge, if any.\n */\n getBridge(): ObservabilityBridge | undefined {\n return this.bridge;\n }\n\n /**\n * Emit an event: route to exporter/bridge handlers, then forward to base\n * class for subscriber delivery.\n *\n * emit() is synchronous — async handler promises are tracked internally\n * and can be drained via flush().\n */\n emit(event: ObservabilityEvent): void {\n // Sanitize free-form payload fields on non-tracing signals before\n // fanning out. Tracing events are already deep-cleaned at span\n // construction, so cleanEvent() returns them unchanged.\n const cleaned = cleanEvent(event, this.deepCleanOptions);\n\n // Route to appropriate handler on each registered exporter\n for (const exporter of this.exporters) {\n this.trackPromise(routeToHandler(exporter, cleaned, this.logger));\n }\n\n // Route to bridge (same routing logic as exporters)\n if (this.bridge) {\n this.trackPromise(routeToHandler(this.bridge, cleaned, this.logger));\n }\n\n // Deliver to subscribers (base class tracks its own pending promises)\n super.emit(cleaned);\n }\n\n /**\n * Emit exporter pipeline drop events to exporters and the bridge.\n *\n * Drop events describe exporter health, not user observability data, so they\n * are intentionally not delivered to generic event-bus subscribers.\n */\n emitDropEvent(event: ObservabilityDropEvent): void {\n if (this.handlerBufferFlushDepth > 0) {\n this.dropEventsEmittedDuringHandlerFlush++;\n }\n\n for (const exporter of this.exporters) {\n this.trackPromise(routeDropToHandler(exporter, event, this.logger));\n }\n\n if (this.bridge) {\n this.trackPromise(routeDropToHandler(this.bridge, event, this.logger));\n }\n }\n\n /**\n * Track an async handler promise so flush() can await it.\n * No-ops for sync (void) results.\n */\n private trackPromise(result: void | Promise<void>): void {\n if (result && typeof (result as Promise<void>).then === 'function') {\n const promise = result as Promise<void>;\n this.pendingHandlers.add(promise);\n void promise.finally(() => this.pendingHandlers.delete(promise));\n }\n }\n\n /** Await in-flight routed handler promises, draining until empty. */\n private async drainPendingHandlers(): Promise<void> {\n let iterations = 0;\n while (this.pendingHandlers.size > 0) {\n await Promise.allSettled([...this.pendingHandlers]);\n iterations++;\n if (iterations >= MAX_FLUSH_ITERATIONS) {\n this.logger.error(\n `[ObservabilityBus] flush() exceeded ${MAX_FLUSH_ITERATIONS} drain iterations — ` +\n `${this.pendingHandlers.size} promises still pending. Handlers may be re-emitting during flush.`,\n );\n // Final settlement pass: ensure every remaining promise has settled\n // before moving on, even if new promises keep appearing.\n if (this.pendingHandlers.size > 0) {\n await Promise.allSettled([...this.pendingHandlers]);\n }\n break;\n }\n }\n }\n\n /** Drain exporter and bridge SDK-internal buffers. */\n private async flushHandlerBuffers(): Promise<boolean> {\n const initialDropCount = this.dropEventsEmittedDuringHandlerFlush;\n this.handlerBufferFlushDepth++;\n try {\n const bufferFlushPromises: Promise<void>[] = this.exporters.map(e => e.flush());\n if (this.bridge) {\n bufferFlushPromises.push(this.bridge.flush());\n }\n if (bufferFlushPromises.length > 0) {\n await Promise.allSettled(bufferFlushPromises);\n }\n return this.dropEventsEmittedDuringHandlerFlush > initialDropCount;\n } finally {\n this.handlerBufferFlushDepth--;\n }\n }\n\n /**\n * Multi-phase flush to ensure all observability data is fully exported.\n *\n * **Phase 1 — Delivery:** Await all in-flight handler promises (exporters,\n * bridge, and base-class subscribers). After this resolves, all event data\n * has been delivered to handler methods.\n *\n * **Phase 2 — Buffer drain:** Call flush() on each exporter and bridge to\n * drain their SDK-internal buffers (e.g., OTEL BatchSpanProcessor, Langfuse\n * client queue). Phases are sequential — buffer drains must not start until\n * delivery completes, otherwise exporters would flush empty buffers.\n *\n * Exporter flushes can emit drop events. When that happens, flush loops\n * through delivery and buffer drain again so alerting integrations that buffer\n * drop notifications are drained before returning.\n */\n async flush(): Promise<void> {\n // Phase 1: Await in-flight handler delivery promises, draining until empty.\n await this.drainPendingHandlers();\n await super.flush();\n\n for (let iterations = 0; iterations < MAX_FLUSH_ITERATIONS; iterations++) {\n const emittedDropEvents = await this.flushHandlerBuffers();\n if (!emittedDropEvents && this.pendingHandlers.size === 0) {\n return;\n }\n\n await this.drainPendingHandlers();\n await super.flush();\n }\n\n this.logger.error(\n `[ObservabilityBus] flush() exceeded ${MAX_FLUSH_ITERATIONS} buffer drain iterations. ` +\n `Handlers may be emitting drop events during every flush.`,\n );\n }\n\n /** Flush all pending events and exporter buffers, then clear subscribers. */\n async shutdown(): Promise<void> {\n await this.flush();\n await super.shutdown();\n }\n}\n","/**\n * Configuration types for Mastra Observability\n *\n * These types define the configuration structure for observability,\n * including tracing configs, sampling strategies, and registry setup.\n */\n\nimport type { RequestContext } from '@mastra/core/di';\nimport type {\n ObservabilityInstance,\n ObservabilityExporter,\n ObservabilityBridge,\n SpanOutputProcessor,\n ConfigSelector,\n SerializationOptions,\n CardinalityConfig,\n LogLevel,\n AnyExportedSpan,\n} from '@mastra/core/observability';\nimport { SpanType } from '@mastra/core/observability';\nimport { z } from 'zod/v4';\nimport type { SensitiveDataFilterOptions } from './span_processors';\n\n// ============================================================================\n// Sampling Strategy Types\n// ============================================================================\n\n/**\n * Sampling strategy types\n */\nexport enum SamplingStrategyType {\n ALWAYS = 'always',\n NEVER = 'never',\n RATIO = 'ratio',\n CUSTOM = 'custom',\n}\n\nconst functionSchema = z.custom<(...args: any[]) => unknown>(value => typeof value === 'function', {\n message: 'Expected function',\n});\n\n/**\n * Options passed when using a custom sampler strategy\n */\nexport interface CustomSamplerOptions {\n requestContext?: RequestContext;\n metadata?: Record<string, any>;\n}\n\n/**\n * Sampling strategy configuration\n */\nexport type SamplingStrategy =\n | { type: SamplingStrategyType.ALWAYS }\n | { type: SamplingStrategyType.NEVER }\n | { type: SamplingStrategyType.RATIO; probability: number }\n | { type: SamplingStrategyType.CUSTOM; sampler: (options?: CustomSamplerOptions) => boolean };\n\n// ============================================================================\n// Observability Configuration Types\n// ============================================================================\n\n/**\n * Configuration for a single observability instance\n */\nexport interface ObservabilityInstanceConfig {\n /** Unique identifier for this config in the tracing registry */\n name: string;\n /** Service name for tracing */\n serviceName: string;\n /** Sampling strategy - controls whether tracing is collected (defaults to ALWAYS) */\n sampling?: SamplingStrategy;\n /** Custom exporters */\n exporters?: ObservabilityExporter[];\n /** Observability bridge (e.g., OpenTelemetry bridge for context extraction) */\n bridge?: ObservabilityBridge;\n /** Custom span output processors */\n spanOutputProcessors?: SpanOutputProcessor[];\n /** Set to `true` if you want to see spans internal to the operation of mastra */\n includeInternalSpans?: boolean;\n /**\n * Span types to exclude from export. Spans of these types are silently dropped\n * before reaching exporters. This is useful for reducing noise and costs in\n * observability platforms that charge per-span (e.g., Langfuse).\n *\n * @example\n * ```typescript\n * excludeSpanTypes: [SpanType.MODEL_CHUNK, SpanType.MODEL_STEP]\n * ```\n */\n excludeSpanTypes?: SpanType[];\n /**\n * Filter function to control which spans are exported. Return `true` to keep\n * the span, `false` to drop it. This runs after `excludeSpanTypes` and\n * `spanOutputProcessors`, giving you access to the final exported span data\n * for fine-grained filtering by type, attributes, entity, metadata, or any\n * combination.\n *\n * @example\n * ```typescript\n * spanFilter: (span) => {\n * // Drop all model chunks\n * if (span.type === SpanType.MODEL_CHUNK) return false;\n * // Only keep tool calls that failed\n * if (span.type === SpanType.TOOL_CALL && span.attributes?.success) return false;\n * return true;\n * }\n * ```\n */\n spanFilter?: (span: AnyExportedSpan) => boolean;\n /**\n * RequestContext keys to automatically extract as metadata for all spans\n * created with this tracing configuration.\n * Supports dot notation for nested values.\n */\n requestContextKeys?: string[];\n /**\n * Options for controlling serialization of span data (input/output/attributes).\n * Use these to customize truncation limits for large payloads.\n */\n serializationOptions?: SerializationOptions;\n /**\n * Cardinality protection settings for metrics.\n * Controls which labels are blocked and whether UUID-like values are filtered.\n * Applied to all metrics (auto-extracted and user-defined).\n */\n cardinality?: CardinalityConfig;\n /**\n * Configuration for the observability logger (loggerVNext).\n * Controls log level filtering and whether dual-write logging is enabled.\n */\n logging?: {\n /** Set to `false` to disable dual-write logging to observability storage. Defaults to `true`. */\n enabled?: boolean;\n /** Minimum log level to write to observability storage. Defaults to `'warn'`. */\n level?: LogLevel;\n };\n}\n\n/**\n * Complete Observability registry configuration\n */\nexport interface ObservabilityRegistryConfig {\n /**\n * Enables default exporters, with sampling: always, and sensitive data filtering\n * @deprecated Use explicit `configs` with MastraStorageExporter, MastraPlatformExporter, and SensitiveDataFilter instead.\n * This option will be removed in a future version.\n */\n default?: {\n enabled?: boolean;\n };\n /** Map of tracing instance names to their configurations or pre-instantiated instances */\n configs?: Record<string, Omit<ObservabilityInstanceConfig, 'name'> | ObservabilityInstance>;\n /** Optional selector function to choose which tracing instance to use */\n configSelector?: ConfigSelector;\n /**\n * Controls whether a `SensitiveDataFilter` span output processor is automatically\n * applied to every configured observability instance. This protects against\n * accidentally exporting secrets (API keys, tokens, passwords, etc.) to\n * exporters such as the Mastra cloud exporter.\n *\n * - `true` (default): apply `SensitiveDataFilter` with default options.\n * - `false`: do not auto-apply the filter. You can still add it manually via\n * `spanOutputProcessors` on a specific config.\n * - an object: apply `SensitiveDataFilter` with the provided options.\n *\n * If a config already includes a `SensitiveDataFilter` in\n * `spanOutputProcessors`, the auto-applied filter is skipped to avoid\n * double redaction. The auto-applied filter runs last (after any\n * user-provided processors) so that sensitive data introduced or\n * surfaced by upstream processors is still redacted before export.\n * Pre-instantiated `ObservabilityInstance` values are not modified.\n */\n sensitiveDataFilter?: boolean | SensitiveDataFilterOptions;\n}\n\n// ============================================================================\n// Zod Schemas for Validation\n// ============================================================================\n\n/**\n * Zod schema for SamplingStrategy\n */\nexport const samplingStrategySchema = z.discriminatedUnion('type', [\n z.object({\n type: z.literal(SamplingStrategyType.ALWAYS),\n }),\n z.object({\n type: z.literal(SamplingStrategyType.NEVER),\n }),\n z.object({\n type: z.literal(SamplingStrategyType.RATIO),\n probability: z.number().min(0, 'Probability must be between 0 and 1').max(1, 'Probability must be between 0 and 1'),\n }),\n z.object({\n type: z.literal(SamplingStrategyType.CUSTOM),\n sampler: functionSchema,\n }),\n]);\n\n/**\n * Zod schema for SerializationOptions\n */\nexport const serializationOptionsSchema = z\n .object({\n maxStringLength: z.number().int().positive().optional(),\n maxDepth: z.number().int().positive().optional(),\n maxArrayLength: z.number().int().positive().optional(),\n maxObjectKeys: z.number().int().positive().optional(),\n })\n .optional();\n\nconst LOG_LEVELS = ['debug', 'info', 'warn', 'error', 'fatal'] as const;\n\nconst cardinalityConfigSchema = z\n .object({\n blockedLabels: z.array(z.string()).optional(),\n blockUUIDs: z.boolean().optional(),\n })\n .optional();\n\nconst loggingConfigSchema = z\n .object({\n enabled: z.boolean().optional(),\n level: z.enum(LOG_LEVELS).optional(),\n })\n .optional();\n\nconst spanFilterSchema = functionSchema.optional();\n\nconst observabilityInstanceConfigFields = {\n serviceName: z.string().min(1, 'Service name is required'),\n sampling: samplingStrategySchema.optional(),\n exporters: z.array(z.any()).optional(),\n bridge: z.any().optional(),\n spanOutputProcessors: z.array(z.any()).optional(),\n includeInternalSpans: z.boolean().optional(),\n excludeSpanTypes: z.array(z.nativeEnum(SpanType)).optional(),\n spanFilter: spanFilterSchema,\n requestContextKeys: z.array(z.string()).optional(),\n serializationOptions: serializationOptionsSchema,\n cardinality: cardinalityConfigSchema,\n logging: loggingConfigSchema,\n};\n\n/**\n * Zod schema for ObservabilityInstanceConfig\n * Note: exporters, spanOutputProcessors, bridge, and configSelector are validated as any\n * since they're complex runtime objects\n */\nexport const observabilityInstanceConfigSchema = z\n .object({\n name: z.string().min(1, 'Name is required'),\n ...observabilityInstanceConfigFields,\n })\n .refine(\n data => {\n // At least one exporter or a bridge must be provided\n const hasExporters = data.exporters && data.exporters.length > 0;\n const hasBridge = !!data.bridge;\n return hasExporters || hasBridge;\n },\n {\n message: 'At least one exporter or a bridge is required',\n },\n );\n\n/**\n * Zod schema for config values in the configs map\n * This is the config object without the name field\n */\nexport const observabilityConfigValueSchema = z.object(observabilityInstanceConfigFields).refine(\n data => {\n // At least one exporter or a bridge must be provided\n const hasExporters = data.exporters && data.exporters.length > 0;\n const hasBridge = !!data.bridge;\n return hasExporters || hasBridge;\n },\n {\n message: 'At least one exporter or a bridge is required',\n },\n);\n\n/**\n * Zod schema for ObservabilityRegistryConfig\n * Note: Individual configs are validated separately in the constructor to allow for\n * both plain config objects and pre-instantiated ObservabilityInstance objects.\n * The schema is permissive to handle edge cases gracefully (arrays, null values).\n */\nconst sensitiveDataFilterOptionsSchema = z\n .object({\n sensitiveFields: z.array(z.string()).optional(),\n redactionToken: z.string().optional(),\n redactionStyle: z.enum(['full', 'partial']).optional(),\n })\n .strict();\n\nexport const observabilityRegistryConfigSchema = z\n .object({\n default: z\n .object({\n enabled: z.boolean().optional(),\n })\n .optional()\n .nullable(),\n configs: z.union([z.record(z.string(), z.any()), z.array(z.any()), z.null()]).optional(),\n configSelector: functionSchema.optional(),\n sensitiveDataFilter: z.union([z.boolean(), sensitiveDataFilterOptionsSchema]).optional(),\n })\n .passthrough() // Allow additional properties\n .refine(\n data => {\n // Validate that default (when enabled) and configs are mutually exclusive\n const isDefaultEnabled = data.default?.enabled === true;\n // Check if configs has any entries (only if it's actually an object)\n const hasConfigs =\n data.configs && typeof data.configs === 'object' && !Array.isArray(data.configs)\n ? Object.keys(data.configs).length > 0\n : false;\n\n // Cannot have both default enabled and any configs\n return !(isDefaultEnabled && hasConfigs);\n },\n {\n message:\n 'Cannot specify both \"default\" (when enabled) and \"configs\". Use either default observability or custom configs, but not both.',\n },\n )\n .refine(\n data => {\n // Validate that configSelector is required when there are multiple configs\n const configCount =\n data.configs && typeof data.configs === 'object' && !Array.isArray(data.configs)\n ? Object.keys(data.configs).length\n : 0;\n\n // If there are 2 or more configs, configSelector must be provided\n if (configCount > 1 && !data.configSelector) {\n return false;\n }\n\n return true;\n },\n {\n message:\n 'A \"configSelector\" function is required when multiple configs are specified to determine which config to use.',\n },\n )\n .refine(\n data => {\n // Validate that if configSelector is provided, there must be configs or default\n if (data.configSelector) {\n const isDefaultEnabled = data.default?.enabled === true;\n const hasConfigs =\n data.configs && typeof data.configs === 'object' && !Array.isArray(data.configs)\n ? Object.keys(data.configs).length > 0\n : false;\n\n // If configSelector is provided, must have either default enabled or configs\n return isDefaultEnabled || hasConfigs;\n }\n\n return true;\n },\n {\n message: 'A \"configSelector\" requires at least one config or default observability to be configured.',\n },\n );\n","/**\n * LoggerContextImpl - Structured logging with automatic trace correlation.\n *\n * Emits LogEvent to the ObservabilityBus. All context (correlationContext,\n * metadata) is snapshotted at construction time.\n */\n\nimport { generateSignalId } from '@mastra/core/observability';\nimport type { LogLevel, LoggerContext, ExportedLog, LogEvent, CorrelationContext } from '@mastra/core/observability';\n\nimport type { ObservabilityBus } from '../bus';\n\nexport interface LoggerContextConfig {\n /** Top-level trace identity for emitted log events */\n traceId?: string;\n\n /** Top-level span identity for emitted log events */\n spanId?: string;\n\n /** Canonical correlation context for log correlation */\n correlationContext?: CorrelationContext;\n\n /** Metadata (entity context, runId, environment, serviceName, etc.) */\n metadata?: Record<string, unknown>;\n\n /** Bus for event emission */\n observabilityBus: ObservabilityBus;\n\n /** Minimum log level (logs below this are discarded) */\n minLevel?: LogLevel;\n}\n\n/** Numeric priority used to compare log levels against the configured minimum. */\nconst LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n fatal: 4,\n};\n\nexport class LoggerContextImpl implements LoggerContext {\n private config: LoggerContextConfig;\n\n /**\n * Create a logger context. Context and metadata are defensively copied so\n * mutations after construction do not affect emitted logs.\n */\n constructor(config: LoggerContextConfig) {\n const correlationContext = config.correlationContext ? { ...config.correlationContext } : undefined;\n\n this.config = {\n ...config,\n traceId: config.traceId ?? correlationContext?.traceId,\n spanId: config.spanId ?? correlationContext?.spanId,\n correlationContext,\n metadata: config.metadata ? structuredClone(config.metadata) : undefined,\n };\n }\n\n /** Log at DEBUG level. */\n debug(message: string, data?: Record<string, unknown>): void {\n this.log('debug', message, data);\n }\n\n /** Log at INFO level. */\n info(message: string, data?: Record<string, unknown>): void {\n this.log('info', message, data);\n }\n\n /** Log at WARN level. */\n warn(message: string, data?: Record<string, unknown>): void {\n this.log('warn', message, data);\n }\n\n /** Log at ERROR level. */\n error(message: string, data?: Record<string, unknown>): void {\n this.log('error', message, data);\n }\n\n /** Log at FATAL level. */\n fatal(message: string, data?: Record<string, unknown>): void {\n this.log('fatal', message, data);\n }\n\n /**\n * Build an ExportedLog, check against the minimum level, and emit it through the bus.\n */\n private log(level: LogLevel, message: string, data?: Record<string, unknown>): void {\n const minLevel = this.config.minLevel ?? 'warn';\n if (LOG_LEVEL_PRIORITY[level] < LOG_LEVEL_PRIORITY[minLevel]) {\n return;\n }\n\n const exportedLog: ExportedLog = {\n logId: generateSignalId(),\n timestamp: new Date(),\n level,\n message,\n data,\n traceId: this.config.traceId,\n spanId: this.config.spanId,\n correlationContext: this.config.correlationContext,\n metadata: this.config.metadata,\n };\n\n const event: LogEvent = { type: 'log', log: exportedLog };\n this.config.observabilityBus.emit(event);\n }\n}\n","/**\n * MetricsContextImpl - User-facing metric emission API.\n *\n * All metrics are validated, cardinality-filtered, and constructed here\n * before being routed through ObservabilityBus.emit().\n * CorrelationContext and metadata are snapshotted at construction time.\n */\n\nimport { generateSignalId } from '@mastra/core/observability';\nimport type {\n MetricsContext,\n Counter,\n Gauge,\n Histogram,\n CorrelationContext,\n CostContext,\n ExportedMetric,\n MetricEvent,\n MetricEmitOptions,\n} from '@mastra/core/observability';\n\nimport type { ObservabilityBus } from '../bus';\nimport type { CardinalityFilter } from '../metrics/cardinality';\n\n/** Configuration for creating a MetricsContextImpl. */\nexport interface MetricsContextConfig {\n /** Top-level trace identity for emitted metric events */\n traceId?: string;\n\n /** Top-level span identity for emitted metric events */\n spanId?: string;\n\n /** Canonical correlation context derived from the current span */\n correlationContext?: CorrelationContext;\n\n /** Non-canonical metadata to attach to emitted metric events */\n metadata?: Record<string, unknown>;\n\n /** Cardinality filter applied to emitted metric labels */\n cardinalityFilter: CardinalityFilter;\n\n /** Bus for event emission */\n observabilityBus: ObservabilityBus;\n}\n\n/**\n * User-facing metric emission API. All metrics are routed through\n * ObservabilityBus.emit() after validation and cardinality filtering.\n */\nexport class MetricsContextImpl implements MetricsContext {\n private traceId?: string;\n private spanId?: string;\n private correlationContext?: CorrelationContext;\n private metadata?: Record<string, unknown>;\n private cardinalityFilter: CardinalityFilter;\n private observabilityBus: ObservabilityBus;\n\n /**\n * Create a metrics context. Correlation context and metadata are defensively\n * copied so mutations after construction do not affect emitted metrics.\n */\n constructor(config: MetricsContextConfig) {\n this.correlationContext = config.correlationContext ? { ...config.correlationContext } : undefined;\n this.traceId = config.traceId ?? this.correlationContext?.traceId;\n this.spanId = config.spanId ?? this.correlationContext?.spanId;\n this.metadata = config.metadata ? structuredClone(config.metadata) : undefined;\n this.cardinalityFilter = config.cardinalityFilter;\n this.observabilityBus = config.observabilityBus;\n }\n\n /** Emit a metric observation. */\n emit(name: string, value: number, labels?: Record<string, string>, options?: MetricEmitOptions): void {\n if (!Number.isFinite(value) || value < 0) {\n return;\n }\n\n const filteredLabels = labels ? this.cardinalityFilter.filterLabels(labels) : {};\n const costContext = options?.costContext ? cloneCostContext(options.costContext) : undefined;\n\n const exportedMetric: ExportedMetric = {\n metricId: generateSignalId(),\n timestamp: new Date(),\n traceId: this.traceId,\n spanId: this.spanId,\n name,\n value,\n labels: filteredLabels,\n correlationContext: this.correlationContext,\n costContext,\n metadata: this.metadata,\n };\n\n const event: MetricEvent = { type: 'metric', metric: exportedMetric };\n this.observabilityBus.emit(event);\n }\n\n /** @deprecated Use `emit()` instead. */\n counter(name: string): Counter {\n return {\n add: (value: number, additionalLabels?: Record<string, string>) => {\n this.emit(name, value, additionalLabels);\n },\n };\n }\n\n /** @deprecated Use `emit()` instead. */\n gauge(name: string): Gauge {\n return {\n set: (value: number, additionalLabels?: Record<string, string>) => {\n this.emit(name, value, additionalLabels);\n },\n };\n }\n\n /** @deprecated Use `emit()` instead. */\n histogram(name: string): Histogram {\n return {\n record: (value: number, additionalLabels?: Record<string, string>) => {\n this.emit(name, value, additionalLabels);\n },\n };\n }\n}\n\nfunction cloneCostContext(costContext: CostContext): CostContext {\n return {\n provider: costContext.provider,\n model: costContext.model,\n estimatedCost: costContext.estimatedCost,\n costUnit: costContext.costUnit,\n costMetadata: costContext.costMetadata ? structuredClone(costContext.costMetadata) : undefined,\n };\n}\n","import type { UsageStats } from '@mastra/core/observability';\nimport type { PricingMeter, PricingConditionOperator, PricingConditionField } from './types';\n\nexport class PricingTier {\n readonly index: number;\n readonly when?: Array<{ field: PricingConditionField; op: PricingConditionOperator; value: number }>;\n readonly rates: Partial<Record<PricingMeter, number>>;\n\n constructor(args: {\n index: number;\n when?: Array<{ field: PricingConditionField; op: PricingConditionOperator; value: number }>;\n rates: Partial<Record<PricingMeter, number>>;\n }) {\n this.index = args.index;\n this.when = args.when;\n this.rates = args.rates;\n }\n\n matchesUsage(usage: UsageStats): boolean {\n if (!this.when || this.when.length === 0) {\n return true;\n }\n\n return this.when.every(condition => this.matchesCondition(condition, usage));\n }\n\n hasMatchingMeterForUsage(meter: PricingMeter): boolean {\n return Boolean(meter && typeof this.rates[meter] === 'number');\n }\n\n private matchesCondition(\n condition: { field: PricingConditionField; op: PricingConditionOperator; value: number },\n usage: UsageStats,\n ): boolean {\n const left = this.getConditionFieldValue(condition.field, usage);\n if (left == null) {\n return false;\n }\n\n switch (condition.op) {\n case 'gt':\n return left > condition.value;\n case 'gte':\n return left >= condition.value;\n case 'lt':\n return left < condition.value;\n case 'lte':\n return left <= condition.value;\n case 'eq':\n return left === condition.value;\n case 'neq':\n return left !== condition.value;\n default:\n return false;\n }\n }\n\n private getConditionFieldValue(field: PricingConditionField, usage: UsageStats): number | null {\n switch (field) {\n case 'total_input_tokens':\n return typeof usage.inputTokens === 'number' ? usage.inputTokens : null;\n default:\n return null;\n }\n }\n}\n\nexport class PricingModel {\n readonly id: string;\n readonly provider: string;\n readonly model: string;\n readonly schema: string;\n readonly currency: string;\n readonly tiers: PricingTier[];\n\n constructor(args: {\n id: string;\n provider: string;\n model: string;\n schema: string;\n currency: string;\n tiers: PricingTier[];\n }) {\n this.id = args.id;\n this.provider = args.provider;\n this.model = args.model;\n this.schema = args.schema;\n this.currency = args.currency;\n this.tiers = args.tiers;\n }\n\n getPricingTierForUsage(usage: UsageStats): PricingTier | null {\n for (const tier of this.tiers) {\n if (tier.when && tier.when.length > 0 && tier.matchesUsage(usage)) {\n return tier;\n }\n }\n\n return this.getBasePricingTier();\n }\n\n getBasePricingTier(): PricingTier | null {\n return this.tiers[0] ?? null;\n }\n}\n","import fs from 'node:fs';\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\nimport { PricingModel, PricingTier } from './pricing-model';\nimport type { PricingMeter, PricingConditionOperator, PricingConditionField } from './types';\n\nconst DATA_FILE_NAME = 'pricing-data.jsonl';\n\ntype MinifiedMeterKey = 'it' | 'ot' | 'icrt' | 'icwt' | 'iat' | 'oat' | 'ort';\ntype MinifiedConditionFieldKey = 'tit';\n\ninterface MinifiedCondition {\n f: MinifiedConditionFieldKey;\n op: PricingConditionOperator;\n value: number;\n}\n\ninterface MinifiedTier {\n w?: MinifiedCondition[];\n r: Partial<Record<MinifiedMeterKey, { c: number }>>;\n}\n\ninterface MinifiedPricingModelRow {\n i: string;\n p: string;\n m: string;\n s: {\n v: string;\n d: {\n u: string;\n t: MinifiedTier[];\n };\n };\n}\n\nconst MINIFIED_METER_TO_CANONICAL: Record<MinifiedMeterKey, PricingMeter> = {\n it: 'input_tokens',\n ot: 'output_tokens',\n icrt: 'input_cache_read_tokens',\n icwt: 'input_cache_write_tokens',\n iat: 'input_audio_tokens',\n oat: 'output_audio_tokens',\n ort: 'output_reasoning_tokens',\n};\n\nconst MINIFIED_CONDITION_FIELD_TO_CANONICAL: Record<MinifiedConditionFieldKey, PricingConditionField> = {\n tit: 'total_input_tokens',\n};\n\nlet cachedLoadError: string | null = null;\n\nexport class PricingRegistry {\n private static globalRegistry: PricingRegistry | null = null;\n\n constructor(private readonly pricingModels: Map<string, PricingModel>) {}\n\n static fromText(pricingModelText: string): PricingRegistry {\n return new PricingRegistry(parsePricingModelText(pricingModelText));\n }\n\n static getGlobal(): PricingRegistry | null {\n if (PricingRegistry.globalRegistry) {\n return PricingRegistry.globalRegistry;\n }\n\n const pricingModels = loadPricingModels();\n if (!pricingModels) {\n return null;\n }\n\n PricingRegistry.globalRegistry = new PricingRegistry(pricingModels);\n return PricingRegistry.globalRegistry;\n }\n\n get(args: { provider: string; model: string }): PricingModel | null {\n // Try all model name variants in order of preference\n const variants = getModelVariants(args.model);\n for (const variant of variants) {\n const key = makePricingKey({ provider: args.provider, model: variant });\n const match = this.pricingModels.get(key);\n if (match) return match;\n }\n return null;\n }\n}\n\nfunction loadPricingModels(): Map<string, PricingModel> | null {\n if (cachedLoadError) {\n return null;\n }\n\n try {\n const content = fs.readFileSync(resolvePricingModelPath(), 'utf-8');\n return parsePricingModelText(content);\n } catch (error) {\n cachedLoadError = error instanceof Error ? error.message : String(error);\n return null;\n }\n}\n\nfunction parsePricingModelText(content: string): Map<string, PricingModel> {\n const pricingModels = new Map<string, PricingModel>();\n\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed) {\n continue;\n }\n\n const parsed = JSON.parse(trimmed) as MinifiedPricingModelRow;\n const pricingModel = expandPricingModelRow(parsed);\n pricingModels.set(makePricingKey(pricingModel), pricingModel);\n }\n\n return pricingModels;\n}\n\nfunction expandPricingModelRow(row: MinifiedPricingModelRow): PricingModel {\n return new PricingModel({\n id: row.i,\n provider: row.p,\n model: row.m,\n schema: row.s.v,\n currency: row.s.d.u,\n tiers: row.s.d.t.map(\n (tier, index) =>\n new PricingTier({\n index,\n when: tier.w?.map(condition => ({\n field: MINIFIED_CONDITION_FIELD_TO_CANONICAL[condition.f],\n op: condition.op,\n value: condition.value,\n })),\n rates: Object.fromEntries(\n Object.entries(tier.r).map(([meter, value]) => [\n MINIFIED_METER_TO_CANONICAL[meter as MinifiedMeterKey],\n value!.c,\n ]),\n ) as Partial<Record<PricingMeter, number>>,\n }),\n ),\n });\n}\n\nfunction resolvePricingModelPath(): string {\n const packageRoot = getPackageRoot();\n const candidates = [\n path.join(packageRoot, 'dist', 'metrics', DATA_FILE_NAME),\n path.join(packageRoot, 'src', 'metrics', DATA_FILE_NAME),\n path.join(process.cwd(), 'observability', 'mastra', 'src', 'metrics', DATA_FILE_NAME),\n path.join(process.cwd(), 'src', 'metrics', DATA_FILE_NAME),\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n }\n\n throw new Error(`Unable to locate pricing data JSONL at any known path: ${candidates.join(', ')}`);\n}\n\nfunction getPackageRoot(): string {\n try {\n const require = createRequire(import.meta.url || 'file://');\n const packageJsonPath = require.resolve('@mastra/observability/package.json');\n return path.dirname(packageJsonPath);\n } catch {\n return process.cwd();\n }\n}\n\nfunction makePricingKey(args: { provider: string; model: string }): string {\n return `${normalizeProvider(args.provider)}::${normalizeKeyPart(args.model)}`;\n}\n\nfunction normalizeKeyPart(value: string): string {\n return value.trim().toLowerCase();\n}\n\n/**\n * Normalize a provider string by stripping AI SDK capability suffixes\n * (e.g. \"openai.chat\" → \"openai\", \"anthropic.messages\" → \"anthropic\").\n * The pricing data uses bare provider names without these suffixes.\n */\nfunction normalizeProvider(provider: string): string {\n const normalized = provider.trim().toLowerCase();\n const dotIndex = normalized.indexOf('.');\n return dotIndex !== -1 ? normalized.substring(0, dotIndex) : normalized;\n}\n\n/**\n * Generate model name variants to try during lookup, in priority order:\n * 1. Original (and date-stripped original)\n * 2. Dots → dashes, e.g. \"gpt-5.4\" → \"gpt-5-4\" (and date-stripped)\n * 3. Dots and slashes → dashes, e.g. \"xiaomi/mimo-v2-pro\" → \"xiaomi-mimo-v2-pro\"\n * (covers OpenRouter entries that keep the vendor prefix flattened with a dash)\n * 4. Vendor prefix dropped, e.g. \"openai/gpt-5-mini\" → \"gpt-5-mini\", and the\n * same with dots flattened, e.g. \"google/gemini-2.5-flash\" → \"gemini-2-5-flash\"\n * (covers OpenRouter entries stored without the vendor prefix, including\n * dotted versions)\n *\n * Each variant is also tried with its date suffix stripped.\n * The Set dedupes so non-prefixed inputs do not pay for redundant lookups.\n */\nfunction getModelVariants(model: string): string[] {\n const variants = new Set<string>();\n const add = (v: string) => {\n variants.add(v);\n variants.add(stripDateSuffix(v));\n };\n\n add(model);\n add(model.replace(/\\./g, '-'));\n add(model.replace(/[./]/g, '-'));\n\n const slashIndex = model.indexOf('/');\n if (slashIndex !== -1) {\n // Vendor-prefixed routes (e.g. OpenRouter's `google/gemini-2.5-flash`) need the\n // same dot-flattening as the full id; otherwise the stripped suffix keeps its dots\n // (`gemini-2.5-flash`) and never matches a flattened pricing key (`gemini-2-5-flash`).\n const withoutVendor = model.substring(slashIndex + 1);\n add(withoutVendor);\n add(withoutVendor.replace(/\\./g, '-'));\n }\n\n return [...variants];\n}\n\n/**\n * Strip date suffix from model names.\n * Handles multiple date formats used by different providers:\n * - OpenAI: YYYY-MM-DD at end (e.g., \"gpt-5-4-mini-2026-03-17\" → \"gpt-5-4-mini\")\n * - Anthropic: YYYYMMDD with optional suffix (e.g., \"claude-sonnet-4-5-20250929-thinking\" → \"claude-sonnet-4-5-thinking\")\n * - Cohere/Gemini: MM-YYYY at end (e.g., \"command-r-08-2024\" → \"command-r\")\n */\nfunction stripDateSuffix(model: string): string {\n // OpenAI format: -YYYY-MM-DD at end\n let stripped = model.replace(/-20\\d{2}-\\d{2}-\\d{2}$/, '');\n if (stripped !== model) return stripped;\n\n // Anthropic format: -YYYYMMDD, possibly followed by suffix like -thinking\n stripped = model.replace(/-20\\d{6}(-[a-z]+)?$/, '$1');\n if (stripped !== model) return stripped;\n\n // Cohere/Gemini format: -MM-YYYY at end\n stripped = model.replace(/-\\d{2}-20\\d{2}$/, '');\n return stripped;\n}\n","export type PricingConditionField = 'total_input_tokens';\nexport type PricingConditionOperator = 'gt' | 'gte' | 'lt' | 'lte' | 'eq' | 'neq';\n\nexport const PricingMeter = {\n INPUT_TOKENS: 'input_tokens',\n INPUT_AUDIO_TOKENS: 'input_audio_tokens',\n INPUT_CACHE_READ_TOKENS: 'input_cache_read_tokens',\n INPUT_CACHE_WRITE_TOKENS: 'input_cache_write_tokens',\n INPUT_IMAGE_TOKENS: 'input_image_tokens',\n\n OUTPUT_TOKENS: 'output_tokens',\n OUTPUT_AUDIO_TOKENS: 'output_audio_tokens',\n OUTPUT_IMAGE_TOKENS: 'output_image_tokens',\n OUTPUT_REASONING_TOKENS: 'output_reasoning_tokens',\n} as const;\n\nexport type PricingMeter = (typeof PricingMeter)[keyof typeof PricingMeter];\n\nexport const TokenMetrics = {\n TOTAL_INPUT: 'mastra_model_total_input_tokens',\n TOTAL_OUTPUT: 'mastra_model_total_output_tokens',\n INPUT_TEXT: 'mastra_model_input_text_tokens',\n INPUT_CACHE_READ: 'mastra_model_input_cache_read_tokens',\n INPUT_CACHE_WRITE: 'mastra_model_input_cache_write_tokens',\n INPUT_AUDIO: 'mastra_model_input_audio_tokens',\n INPUT_IMAGE: 'mastra_model_input_image_tokens',\n OUTPUT_TEXT: 'mastra_model_output_text_tokens',\n OUTPUT_REASONING: 'mastra_model_output_reasoning_tokens',\n OUTPUT_AUDIO: 'mastra_model_output_audio_tokens',\n OUTPUT_IMAGE: 'mastra_model_output_image_tokens',\n} as const;\n\nexport type TokenMetrics = (typeof TokenMetrics)[keyof typeof TokenMetrics];\n","import type { UsageStats } from '@mastra/core/observability';\nimport { TokenMetrics } from './types';\n\nexport interface TokenMetricSample {\n name: TokenMetrics;\n value: number;\n}\n\nexport function getTokenMetricSamples(usage: UsageStats): TokenMetricSample[] {\n const samples: TokenMetricSample[] = [];\n const pushIfDefined = (name: TokenMetrics, value: number | undefined) => {\n if (value != null) {\n samples.push({ name, value });\n }\n };\n const pushIfPositive = (name: TokenMetrics, value: number | undefined) => {\n if (value != null && value > 0) {\n samples.push({ name, value });\n }\n };\n\n pushIfDefined(TokenMetrics.TOTAL_INPUT, usage.inputTokens);\n pushIfDefined(TokenMetrics.TOTAL_OUTPUT, usage.outputTokens);\n\n if (usage.inputDetails) {\n pushIfPositive(TokenMetrics.INPUT_TEXT, usage.inputDetails.text);\n pushIfPositive(TokenMetrics.INPUT_CACHE_READ, usage.inputDetails.cacheRead);\n pushIfPositive(TokenMetrics.INPUT_CACHE_WRITE, usage.inputDetails.cacheWrite);\n pushIfPositive(TokenMetrics.INPUT_AUDIO, usage.inputDetails.audio);\n pushIfPositive(TokenMetrics.INPUT_IMAGE, usage.inputDetails.image);\n }\n\n if (usage.outputDetails) {\n pushIfPositive(TokenMetrics.OUTPUT_TEXT, usage.outputDetails.text);\n pushIfPositive(TokenMetrics.OUTPUT_REASONING, usage.outputDetails.reasoning);\n pushIfPositive(TokenMetrics.OUTPUT_AUDIO, usage.outputDetails.audio);\n pushIfPositive(TokenMetrics.OUTPUT_IMAGE, usage.outputDetails.image);\n }\n\n return samples;\n}\n","import type { CostContext, UsageStats } from '@mastra/core/observability';\nimport type { PricingTier, PricingModel } from './pricing-model';\nimport { PricingRegistry } from './pricing-registry';\nimport { TokenMetrics, PricingMeter } from './types';\nimport { getTokenMetricSamples } from './usage-metrics';\n\nexport function estimateCosts(\n args: {\n provider: string;\n model: string;\n usage: UsageStats;\n },\n pricingRegistry: PricingRegistry | null = PricingRegistry.getGlobal(),\n): Map<TokenMetrics, CostContext> {\n const { provider, model, usage } = args;\n const results = new Map<TokenMetrics, CostContext>();\n\n const pricingModel = pricingRegistry?.get({ provider, model });\n if (!pricingModel) {\n const errorContext: CostContext = { costMetadata: { error: 'no_matching_model' }, provider, model };\n applyErrorContextForUsage(results, usage, errorContext);\n return results;\n }\n const costMetadata: Record<string, unknown> = { pricing_id: pricingModel.id };\n\n const pricingTier = pricingModel.getPricingTierForUsage(usage);\n if (!pricingTier) {\n const errorContext: CostContext = { costMetadata: { ...costMetadata, error: 'no_matching_tier' }, provider, model };\n applyErrorContextForUsage(results, usage, errorContext);\n return results;\n }\n costMetadata['tier_index'] = pricingTier.index;\n\n const estimateFields = {\n pricingModel,\n pricingTier,\n costMetadata,\n };\n\n const inputDetailResults: Array<{ success: boolean; costContext: CostContext }> = [];\n if (usage.inputDetails?.audio) {\n const result = estimateCostForMeter({\n meter: PricingMeter.INPUT_AUDIO_TOKENS,\n tokenCount: usage.inputDetails.audio,\n ...estimateFields,\n });\n results.set(TokenMetrics.INPUT_AUDIO, result.costContext);\n inputDetailResults.push(result);\n }\n\n if (usage.inputDetails?.cacheRead) {\n const result = estimateCostForMeter({\n meter: PricingMeter.INPUT_CACHE_READ_TOKENS,\n tokenCount: usage.inputDetails.cacheRead,\n ...estimateFields,\n });\n results.set(TokenMetrics.INPUT_CACHE_READ, result.costContext);\n inputDetailResults.push(result);\n }\n\n if (usage.inputDetails?.cacheWrite) {\n const result = estimateCostForMeter({\n meter: PricingMeter.INPUT_CACHE_WRITE_TOKENS,\n tokenCount: usage.inputDetails.cacheWrite,\n ...estimateFields,\n });\n results.set(TokenMetrics.INPUT_CACHE_WRITE, result.costContext);\n inputDetailResults.push(result);\n }\n\n if (usage.inputDetails?.image) {\n const result = estimateCostForMeter({\n meter: PricingMeter.INPUT_IMAGE_TOKENS,\n tokenCount: usage.inputDetails.image,\n ...estimateFields,\n });\n results.set(TokenMetrics.INPUT_IMAGE, result.costContext);\n inputDetailResults.push(result);\n }\n\n if (usage.inputDetails?.text) {\n const result = estimateCostForMeter({\n meter: PricingMeter.INPUT_TOKENS,\n tokenCount: usage.inputDetails.text,\n ...estimateFields,\n });\n results.set(TokenMetrics.INPUT_TEXT, result.costContext);\n inputDetailResults.push(result);\n }\n\n setAggregateCostContext({\n results,\n totalMetric: TokenMetrics.TOTAL_INPUT,\n fallbackMeter: PricingMeter.INPUT_TOKENS,\n totalTokenCount: usage.inputTokens,\n detailResults: inputDetailResults,\n ...estimateFields,\n });\n\n const outputDetailResults: Array<{ success: boolean; costContext: CostContext }> = [];\n if (usage.outputDetails?.audio) {\n const result = estimateCostForMeter({\n meter: PricingMeter.OUTPUT_AUDIO_TOKENS,\n tokenCount: usage.outputDetails.audio,\n ...estimateFields,\n });\n results.set(TokenMetrics.OUTPUT_AUDIO, result.costContext);\n outputDetailResults.push(result);\n }\n\n if (usage.outputDetails?.image) {\n const result = estimateCostForMeter({\n meter: PricingMeter.OUTPUT_IMAGE_TOKENS,\n tokenCount: usage.outputDetails.image,\n ...estimateFields,\n });\n results.set(TokenMetrics.OUTPUT_IMAGE, result.costContext);\n outputDetailResults.push(result);\n }\n\n if (usage.outputDetails?.reasoning) {\n const result = estimateCostForMeter({\n meter: PricingMeter.OUTPUT_REASONING_TOKENS,\n tokenCount: usage.outputDetails.reasoning,\n ...estimateFields,\n });\n results.set(TokenMetrics.OUTPUT_REASONING, result.costContext);\n outputDetailResults.push(result);\n }\n\n if (usage.outputDetails?.text) {\n const result = estimateCostForMeter({\n meter: PricingMeter.OUTPUT_TOKENS,\n tokenCount: usage.outputDetails.text,\n ...estimateFields,\n });\n results.set(TokenMetrics.OUTPUT_TEXT, result.costContext);\n outputDetailResults.push(result);\n }\n\n setAggregateCostContext({\n results,\n totalMetric: TokenMetrics.TOTAL_OUTPUT,\n fallbackMeter: PricingMeter.OUTPUT_TOKENS,\n totalTokenCount: usage.outputTokens,\n detailResults: outputDetailResults,\n ...estimateFields,\n });\n\n return results;\n}\n\nfunction applyErrorContextForUsage(\n results: Map<TokenMetrics, CostContext>,\n usage: UsageStats,\n errorContext: CostContext,\n): void {\n for (const sample of getTokenMetricSamples(usage)) {\n results.set(sample.name, errorContext);\n }\n}\n\nfunction setAggregateCostContext(args: {\n results: Map<TokenMetrics, CostContext>;\n totalMetric: TokenMetrics;\n fallbackMeter: PricingMeter;\n totalTokenCount: number | undefined;\n detailResults: Array<{ success: boolean; costContext: CostContext }>;\n pricingModel: PricingModel;\n pricingTier: PricingTier;\n costMetadata: Record<string, unknown>;\n}): void {\n const {\n results,\n totalMetric,\n fallbackMeter,\n totalTokenCount,\n detailResults,\n pricingModel,\n pricingTier,\n costMetadata,\n } = args;\n if (totalTokenCount == null) {\n return;\n }\n\n const successfulDetailCosts = detailResults\n .filter(result => result.success)\n .map(result => result.costContext.estimatedCost)\n .filter((value): value is number => typeof value === 'number');\n\n if (successfulDetailCosts.length > 0) {\n const hasFailedDetailCost = detailResults.some(result => !result.success);\n results.set(totalMetric, {\n provider: pricingModel.provider,\n model: pricingModel.model,\n estimatedCost: successfulDetailCosts.reduce((sum, value) => sum + value, 0),\n costUnit: pricingModel.currency,\n costMetadata: hasFailedDetailCost ? { ...costMetadata, error: 'partial_cost' } : { ...costMetadata },\n });\n return;\n }\n\n const fallbackResult = estimateCostForMeter({\n meter: fallbackMeter,\n tokenCount: totalTokenCount,\n pricingModel,\n pricingTier,\n costMetadata,\n });\n results.set(totalMetric, fallbackResult.costContext);\n}\n\nfunction estimateCostForMeter(args: {\n pricingModel: PricingModel;\n pricingTier: PricingTier;\n meter: PricingMeter;\n tokenCount: number;\n costMetadata: Record<string, unknown>;\n}): {\n success: boolean;\n costContext: CostContext;\n} {\n const { pricingModel, pricingTier, meter, tokenCount, costMetadata } = args;\n const costContext: CostContext = {\n provider: pricingModel.provider,\n model: pricingModel.model,\n };\n const pricePerUnit = pricingTier.rates[meter];\n if (typeof pricePerUnit !== 'number') {\n return {\n success: false,\n costContext: {\n ...costContext,\n costMetadata: { ...costMetadata, error: 'no_pricing_for_usage_type' },\n },\n };\n }\n\n return {\n success: true,\n costContext: {\n ...costContext,\n estimatedCost: tokenCount * pricePerUnit,\n costUnit: pricingModel.currency,\n costMetadata: { ...costMetadata },\n },\n };\n}\n","/**\n * Emits metrics derived from live spans.\n */\n\nimport { SpanType } from '@mastra/core/observability';\nimport type {\n AnySpan,\n CostContext,\n MetricsContext,\n ModelGenerationAttributes,\n UsageStats,\n} from '@mastra/core/observability';\nimport { estimateCosts } from './estimator';\nimport type { TokenMetrics } from './types';\nimport { getTokenMetricSamples } from './usage-metrics';\n\n/** Emit duration metrics for a live span. */\nexport function emitDurationMetrics(span: AnySpan, metrics: MetricsContext): void {\n const durationMetricName = getDurationMetricName(span);\n if (!durationMetricName || !span.startTime || !span.endTime) {\n return;\n }\n\n const durationMs = span.endTime.getTime() - span.startTime.getTime();\n metrics.emit(durationMetricName, durationMs, {\n status: span.errorInfo ? 'error' : 'ok',\n });\n}\n\n/** Emit token usage metrics for a model-generation span. */\nexport function emitTokenMetrics(span: AnySpan, metrics: MetricsContext): void {\n if (span.type !== SpanType.MODEL_GENERATION) {\n return;\n }\n\n const attrs = span.attributes as ModelGenerationAttributes | undefined;\n if (!attrs?.usage) {\n return;\n }\n\n emitUsageMetrics(attrs, attrs.usage, metrics);\n}\n\n/**\n * Emit token usage metrics from an explicit usage payload, using the supplied\n * metrics context (which carries entity / parent / root labels) and the\n * supplied provider+model for cost lookup.\n *\n * Used when an internal MODEL_GENERATION's usage is rolled up to a visible\n * ancestor span: the metric labels come from the ancestor's context, the\n * cost calculation still uses the original model that incurred the tokens.\n */\nexport function emitTokenMetricsForUsage(\n usage: UsageStats,\n provider: string | undefined,\n model: string | undefined,\n metrics: MetricsContext,\n): void {\n emitUsageMetrics({ provider, model } as ModelGenerationAttributes, usage, metrics);\n}\n\n/** Emit all auto-extracted metrics for a live span end. */\nexport function emitAutoExtractedMetrics(span: AnySpan, metrics: MetricsContext): void {\n emitDurationMetrics(span, metrics);\n emitTokenMetrics(span, metrics);\n}\n\nfunction emitUsageMetrics(\n attrs: ModelGenerationAttributes,\n usage: NonNullable<ModelGenerationAttributes['usage']>,\n metrics: MetricsContext,\n): void {\n let metricCosts = new Map<TokenMetrics, CostContext>();\n try {\n const provider = attrs.provider;\n const model = attrs.responseModel ?? attrs.model;\n\n if (provider && model) {\n metricCosts = estimateCosts({\n provider,\n model,\n usage,\n });\n }\n } catch {\n metricCosts = new Map();\n }\n\n const emit = (name: TokenMetrics, value: number) => {\n const costContext = metricCosts.get(name);\n if (!costContext) {\n metrics.emit(name, value);\n return;\n }\n\n metrics.emit(name, value, undefined, { costContext });\n };\n\n for (const sample of getTokenMetricSamples(usage)) {\n emit(sample.name, sample.value);\n }\n}\n\nfunction getDurationMetricName(span: AnySpan): string | null {\n switch (span.type) {\n case SpanType.AGENT_RUN:\n return 'mastra_agent_duration_ms';\n case SpanType.TOOL_CALL:\n case SpanType.MCP_TOOL_CALL:\n return 'mastra_tool_duration_ms';\n case SpanType.CLIENT_TOOL_CALL:\n // The CLIENT_TOOL_CALL server span measures only carrier emission\n // and args capture. The actual client execution duration is\n // emitted by the client observability proxy using the wall-clock\n // duration measured in @mastra/client-js.\n return null;\n case SpanType.WORKFLOW_RUN:\n return 'mastra_workflow_duration_ms';\n case SpanType.MODEL_GENERATION:\n return 'mastra_model_duration_ms';\n case SpanType.PROCESSOR_RUN:\n return 'mastra_processor_duration_ms';\n default:\n return null;\n }\n}\n","/**\n * CardinalityFilter - Prevents metric cardinality explosion.\n *\n * Filters out high-cardinality labels (like trace_id, user_id) and\n * optionally blocks UUID-like values in labels.\n */\n\nimport type { CardinalityConfig } from '@mastra/core/observability';\nimport { DEFAULT_BLOCKED_LABELS } from '@mastra/core/observability';\n\n/** Matches standard UUID v4 strings (case-insensitive). */\nconst UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nexport class CardinalityFilter {\n private blockedLabels: Set<string>;\n private blockUUIDs: boolean;\n\n /**\n * @param config - Optional configuration. When omitted, uses\n * {@link DEFAULT_BLOCKED_LABELS} and blocks UUID-valued labels.\n */\n constructor(config?: CardinalityConfig) {\n const blocked = config?.blockedLabels ?? [...DEFAULT_BLOCKED_LABELS];\n this.blockedLabels = new Set(blocked.map(l => l.toLowerCase()));\n this.blockUUIDs = config?.blockUUIDs ?? true;\n }\n\n /**\n * Return a copy of `labels` with blocked keys and UUID values removed.\n *\n * @param labels - Raw metric labels to filter.\n * @returns A new object containing only the allowed labels.\n */\n filterLabels(labels: Record<string, string>): Record<string, string> {\n const filtered: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(labels)) {\n if (this.blockedLabels.has(key.toLowerCase())) {\n continue;\n }\n\n if (this.blockUUIDs && UUID_REGEX.test(value)) {\n continue;\n }\n\n filtered[key] = value;\n }\n\n return filtered;\n }\n}\n","/**\n * Usage extraction utilities for converting AI SDK usage to Mastra UsageStats\n */\n\nimport type { InputTokenDetails, OutputTokenDetails, UsageStats } from '@mastra/core/observability';\nimport type { LanguageModelUsage, ProviderMetadata } from '@mastra/core/stream';\n\n/**\n * Provider-specific metadata shapes for type-safe access.\n * These match the actual shapes from AI SDK providers.\n */\ninterface AnthropicMetadata {\n cacheReadInputTokens?: number;\n cacheCreationInputTokens?: number;\n}\n\ninterface GoogleUsageMetadata {\n cachedContentTokenCount?: number;\n thoughtsTokenCount?: number;\n}\n\ninterface GoogleMetadata {\n usageMetadata?: GoogleUsageMetadata;\n}\n\ninterface V3InputUsage {\n total?: number;\n noCache?: number;\n cacheRead?: number;\n cacheWrite?: number;\n}\n\ninterface V3RawUsage {\n inputTokens?: V3InputUsage;\n}\n\nfunction isV3RawUsage(raw: unknown): raw is V3RawUsage {\n return typeof raw === 'object' && raw !== null && 'inputTokens' in raw;\n}\n\n/**\n * AI SDK aggregated input token details.\n * Available on totalUsage in multi-step runs - properly summed across all steps.\n */\ninterface AISdkInputTokenDetails {\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n}\n\n/**\n * Null-safe check: returns true if value is a number (including 0).\n */\nfunction isDefined(value: unknown): value is number {\n return value != null;\n}\n\n/**\n * Extracts and normalizes token usage from AI SDK response, including\n * provider-specific cache tokens from providerMetadata.\n *\n * Cache token extraction priority (highest to lowest):\n * 1. AI SDK aggregated inputTokenDetails (properly summed across all steps in multi-step runs)\n * 2. Mastra-aggregated top-level usage fields (usage.cachedInputTokens, usage.cacheCreationInputTokens) -\n * summed across steps by RunOutput, so they are correct for multi-step runs.\n * 3. Provider-specific providerMetadata (accurate for single-step, LAST STEP ONLY in multi-step).\n *\n * Handles:\n * - OpenAI: cachedInputTokens in usage object\n * - Anthropic: cacheCreationInputTokens, cacheReadInputTokens in providerMetadata.anthropic\n * - Google/Gemini: cachedContentTokenCount, thoughtsTokenCount in providerMetadata.google.usageMetadata\n * - OpenRouter: Uses OpenAI-compatible structure (cache tokens in usage)\n *\n * @param usage - The LanguageModelV2Usage from AI SDK response\n * @param providerMetadata - Optional provider-specific metadata\n * @returns UsageStats with inputDetails and outputDetails\n */\nexport function extractUsageMetrics(usage?: LanguageModelUsage, providerMetadata?: ProviderMetadata): UsageStats {\n if (!usage) {\n return {};\n }\n\n const inputDetails: InputTokenDetails = {};\n const outputDetails: OutputTokenDetails = {};\n\n let inputTokens = usage.inputTokens;\n const outputTokens = usage.outputTokens;\n\n // ===== AI SDK aggregated format (inputTokenDetails) =====\n // In multi-step runs, providerMetadata only reflects the LAST step.\n // AI SDK's inputTokenDetails is properly aggregated across all steps,\n // so we prefer it as the primary source for cache tokens.\n const aiSdkDetails = (usage as { inputTokenDetails?: AISdkInputTokenDetails }).inputTokenDetails;\n\n if (isDefined(aiSdkDetails?.cacheReadTokens)) {\n inputDetails.cacheRead = aiSdkDetails.cacheReadTokens;\n }\n if (isDefined(aiSdkDetails?.cacheWriteTokens)) {\n inputDetails.cacheWrite = aiSdkDetails.cacheWriteTokens;\n }\n\n // Mastra-aggregated fields — summed across steps by RunOutput; prefer over per-step providerMetadata.\n if (!isDefined(inputDetails.cacheRead) && isDefined(usage.cachedInputTokens)) {\n inputDetails.cacheRead = usage.cachedInputTokens;\n }\n if (!isDefined(inputDetails.cacheWrite) && isDefined(usage.cacheCreationInputTokens)) {\n inputDetails.cacheWrite = usage.cacheCreationInputTokens;\n }\n\n // reasoningTokens from usage (OpenAI o1 models)\n if (isDefined(usage.reasoningTokens)) {\n outputDetails.reasoning = usage.reasoningTokens;\n }\n\n // ===== Anthropic =====\n // Cache tokens are in providerMetadata.anthropic\n // inputTokens does NOT include cache tokens - need to sum them\n const anthropic = providerMetadata?.anthropic as AnthropicMetadata | undefined;\n\n if (anthropic) {\n const rawV3InputUsage = isV3RawUsage(usage.raw) ? usage.raw.inputTokens : undefined;\n const hasV3CachedTotals =\n rawV3InputUsage?.total !== undefined &&\n (rawV3InputUsage.cacheRead !== undefined || rawV3InputUsage.cacheWrite !== undefined);\n\n if (!isDefined(inputDetails.cacheRead) && isDefined(anthropic.cacheReadInputTokens)) {\n inputDetails.cacheRead = anthropic.cacheReadInputTokens;\n }\n if (!isDefined(inputDetails.cacheWrite) && isDefined(anthropic.cacheCreationInputTokens)) {\n inputDetails.cacheWrite = anthropic.cacheCreationInputTokens;\n }\n\n // Skip adjustment when inputTokens already includes cache tokens (V3 raw or any positive Mastra-aggregated cache field).\n const inputAlreadyIncludesCache =\n hasV3CachedTotals ||\n (isDefined(usage.cachedInputTokens) && usage.cachedInputTokens > 0) ||\n (isDefined(usage.cacheCreationInputTokens) && usage.cacheCreationInputTokens > 0);\n\n if (!inputAlreadyIncludesCache && (isDefined(inputDetails.cacheRead) || isDefined(inputDetails.cacheWrite))) {\n inputTokens = (usage.inputTokens ?? 0) + (inputDetails.cacheRead ?? 0) + (inputDetails.cacheWrite ?? 0);\n }\n }\n\n // ===== Google/Gemini =====\n // Cache tokens and thoughts are in providerMetadata.google.usageMetadata\n const google = providerMetadata?.google as GoogleMetadata | undefined;\n\n if (google?.usageMetadata) {\n if (!isDefined(inputDetails.cacheRead) && isDefined(google.usageMetadata.cachedContentTokenCount)) {\n inputDetails.cacheRead = google.usageMetadata.cachedContentTokenCount;\n }\n // Gemini \"thoughts\" are similar to reasoning tokens\n if (isDefined(google.usageMetadata.thoughtsTokenCount)) {\n outputDetails.reasoning = google.usageMetadata.thoughtsTokenCount;\n }\n }\n\n if (isDefined(inputTokens)) {\n inputDetails.text = Math.max(\n 0,\n inputTokens - sumDefinedValues(inputDetails, ['cacheRead', 'cacheWrite', 'audio', 'image']),\n );\n }\n\n if (isDefined(outputTokens)) {\n outputDetails.text = Math.max(0, outputTokens - sumDefinedValues(outputDetails, ['reasoning', 'audio', 'image']));\n }\n\n // Build the final UsageStats object\n const result: UsageStats = {\n inputTokens,\n outputTokens,\n };\n\n // Only include details if there's data\n if (Object.keys(inputDetails).length > 0) {\n result.inputDetails = inputDetails;\n }\n if (Object.keys(outputDetails).length > 0) {\n result.outputDetails = outputDetails;\n }\n\n return result;\n}\n\nfunction sumDefinedValues<T extends object, K extends keyof T>(obj: T, keys: K[]): number {\n return keys.reduce((sum, key) => sum + ((obj[key] as number | undefined) ?? 0), 0);\n}\n\nfunction addOptional(a: number | undefined, b: number | undefined): number | undefined {\n if (a === undefined && b === undefined) return undefined;\n return (a ?? 0) + (b ?? 0);\n}\n\nfunction mergeInputDetails(\n a: InputTokenDetails | undefined,\n b: InputTokenDetails | undefined,\n): InputTokenDetails | undefined {\n if (!a) return b ? { ...b } : undefined;\n if (!b) return { ...a };\n return {\n text: addOptional(a.text, b.text),\n cacheRead: addOptional(a.cacheRead, b.cacheRead),\n cacheWrite: addOptional(a.cacheWrite, b.cacheWrite),\n audio: addOptional(a.audio, b.audio),\n image: addOptional(a.image, b.image),\n };\n}\n\nfunction mergeOutputDetails(\n a: OutputTokenDetails | undefined,\n b: OutputTokenDetails | undefined,\n): OutputTokenDetails | undefined {\n if (!a) return b ? { ...b } : undefined;\n if (!b) return { ...a };\n return {\n text: addOptional(a.text, b.text),\n reasoning: addOptional(a.reasoning, b.reasoning),\n audio: addOptional(a.audio, b.audio),\n image: addOptional(a.image, b.image),\n };\n}\n\n/**\n * Sum two UsageStats into a new one. Treats undefined fields as zero when\n * the other side has a value, and preserves undefined when both are absent.\n * Used to roll up internal model-generation usage onto a visible ancestor\n * span so cost / token attribution survives internal-span filtering.\n */\nexport function addUsageStats(a: UsageStats | undefined, b: UsageStats): UsageStats {\n if (!a) {\n return {\n ...b,\n inputDetails: b.inputDetails ? { ...b.inputDetails } : undefined,\n outputDetails: b.outputDetails ? { ...b.outputDetails } : undefined,\n };\n }\n return {\n inputTokens: addOptional(a.inputTokens, b.inputTokens),\n outputTokens: addOptional(a.outputTokens, b.outputTokens),\n inputDetails: mergeInputDetails(a.inputDetails, b.inputDetails),\n outputDetails: mergeOutputDetails(a.outputDetails, b.outputDetails),\n };\n}\n","/**\n * Model Span Tracing\n *\n * Provides span tracking for Model generations, including:\n * - MODEL_STEP spans (one per Model API call - includes processors and tool executions)\n * - MODEL_INFERENCE spans (the provider call itself - model latency only)\n * - MODEL_CHUNK spans (individual streaming chunks within an inference)\n *\n * Hierarchy: MODEL_GENERATION -> MODEL_STEP -> MODEL_INFERENCE -> MODEL_CHUNK\n *\n * Processors and tool executions remain children of MODEL_STEP (siblings of\n * MODEL_INFERENCE), so MODEL_INFERENCE measures pure model time.\n */\n\nimport { TransformStream } from 'node:stream/web';\nimport { coreFeatures } from '@mastra/core/features';\nimport { SpanType } from '@mastra/core/observability';\nimport type {\n Span,\n EndGenerationOptions,\n ErrorSpanOptions,\n ModelInferenceContext,\n TracingContext,\n UpdateSpanOptions,\n} from '@mastra/core/observability';\nimport type { ChunkType, StepStartPayload, StepFinishPayload } from '@mastra/core/stream';\n\n/**\n * Feature gate for MODEL_INFERENCE spans. When the installed @mastra/core\n * predates the feature flag, `SpanType.MODEL_INFERENCE` resolves to undefined\n * at runtime; in that case the tracker falls back to parenting MODEL_CHUNK\n * spans directly under MODEL_STEP (the pre-MODEL_INFERENCE behavior).\n *\n * Read at every call so tests can toggle the flag between cases. The set\n * lookup is O(1) and not on a hot path.\n */\nfunction supportsModelInference(): boolean {\n return coreFeatures.has('model-inference-span');\n}\n\nimport { extractUsageMetrics } from './usage';\n\ntype StepInputPreview = Array<{ role: string; content: string }> | Record<string, unknown> | string | undefined;\n\nfunction formatPreviewLabel(label: unknown, fallback: string): string {\n return typeof label === 'string' && label.length > 0 ? label : fallback;\n}\n\nfunction summarizePart(part: unknown): string {\n if (typeof part === 'string') {\n return part;\n }\n\n if (!part || typeof part !== 'object') {\n return '';\n }\n\n if ('text' in part && typeof part.text === 'string') {\n return part.text;\n }\n\n if ('parts' in part && Array.isArray(part.parts)) {\n return part.parts.map(summarizePart).filter(Boolean).join('');\n }\n\n if ('inlineData' in part && part.inlineData && typeof part.inlineData === 'object') {\n return `[${formatPreviewLabel((part.inlineData as { mimeType?: unknown }).mimeType, 'binary')}]`;\n }\n\n if ('image_url' in part) {\n return '[image]';\n }\n\n if ('functionCall' in part && part.functionCall && typeof part.functionCall === 'object') {\n return `[tool: ${formatPreviewLabel((part.functionCall as { name?: unknown }).name, 'unknown')}]`;\n }\n\n if ('function_call' in part && part.function_call && typeof part.function_call === 'object') {\n return `[tool: ${formatPreviewLabel((part.function_call as { name?: unknown }).name, 'unknown')}]`;\n }\n\n if ('function' in part && part.function && typeof part.function === 'object') {\n return `[tool: ${formatPreviewLabel((part.function as { name?: unknown }).name, 'unknown')}]`;\n }\n\n if ('toolName' in part) {\n return `[tool: ${formatPreviewLabel((part as { toolName?: unknown }).toolName, 'unknown')}]`;\n }\n\n if ('type' in part && typeof part.type === 'string') {\n switch (part.type) {\n case 'image':\n return '[image]';\n case 'file':\n return '[file]';\n case 'reasoning':\n return '[reasoning]';\n case 'tool-call':\n return `[tool: ${formatPreviewLabel((part as { toolName?: unknown }).toolName, 'unknown')}]`;\n case 'tool-result':\n return '[tool-result]';\n default:\n return `[${part.type}]`;\n }\n }\n\n if ('content' in part && typeof part.content === 'string') {\n return part.content;\n }\n\n return '[object]';\n}\n\nfunction summarizeMessageContent(content: unknown): string {\n if (typeof content === 'string') {\n return content;\n }\n\n if (Array.isArray(content)) {\n return content.map(summarizePart).filter(Boolean).join('');\n }\n\n if (content && typeof content === 'object') {\n if ('parts' in content && Array.isArray(content.parts)) {\n return content.parts.map(summarizePart).filter(Boolean).join('');\n }\n\n return summarizePart(content);\n }\n\n if (content == null) {\n return '';\n }\n\n return String(content);\n}\n\nfunction appendToolPreview(preview: string, toolCalls: unknown): string {\n if (!Array.isArray(toolCalls) || toolCalls.length === 0) {\n return preview;\n }\n\n const toolPreview = toolCalls\n .map(toolCall => summarizePart(toolCall))\n .filter(Boolean)\n .join(' ');\n\n if (!toolPreview) {\n return preview;\n }\n\n return preview ? `${preview} ${toolPreview}` : toolPreview;\n}\n\nfunction appendPreview(preview: string, addition: string): string {\n if (!addition) {\n return preview;\n }\n\n return preview ? `${preview} ${addition}` : addition;\n}\n\nfunction normalizeMessages(messages: unknown[]): Array<{ role: string; content: string }> {\n return messages.map(message => {\n if (!message || typeof message !== 'object') {\n return { role: 'user', content: summarizeMessageContent(message) };\n }\n\n const role = typeof (message as { role?: unknown }).role === 'string' ? (message as { role: string }).role : 'user';\n\n const baseContent = summarizeMessageContent((message as { content?: unknown }).content);\n const contentWithToolArrays = appendToolPreview(\n appendToolPreview(baseContent, (message as { toolCalls?: unknown }).toolCalls),\n (message as { tool_calls?: unknown }).tool_calls,\n );\n const functionCall = (message as { functionCall?: unknown }).functionCall;\n const functionCallPreview = functionCall === undefined ? '' : summarizePart({ functionCall });\n const functionCallSnakeCase = (message as { function_call?: unknown }).function_call;\n const functionCallSnakeCasePreview =\n functionCallSnakeCase === undefined ? '' : summarizePart({ function_call: functionCallSnakeCase });\n const contentWithFunctionCall = appendPreview(\n appendPreview(contentWithToolArrays, functionCallPreview),\n functionCallSnakeCasePreview,\n );\n\n return { role, content: contentWithFunctionCall };\n });\n}\n\nfunction summarizeRequestBody(body: unknown): StepInputPreview {\n if (body == null) {\n return undefined;\n }\n\n if (typeof body !== 'object') {\n return typeof body === 'string' ? body : String(body);\n }\n\n if (Array.isArray((body as { messages?: unknown }).messages)) {\n return normalizeMessages((body as { messages: unknown[] }).messages);\n }\n\n if (Array.isArray((body as { input?: unknown }).input)) {\n return normalizeMessages((body as { input: unknown[] }).input);\n }\n\n if (Array.isArray((body as { contents?: unknown }).contents)) {\n return (body as { contents: Array<{ role?: unknown; parts?: unknown[] }> }).contents.map(item => ({\n role: typeof item?.role === 'string' ? item.role : 'user',\n content: Array.isArray(item?.parts) ? item.parts.map(summarizePart).filter(Boolean).join('') : '',\n }));\n }\n\n const summary: Record<string, unknown> = {};\n\n if (typeof (body as { model?: unknown }).model === 'string') {\n summary.model = (body as { model: string }).model;\n }\n\n const bodyKeys = Object.keys(body as Record<string, unknown>).filter(key => key !== 'body');\n if (bodyKeys.length > 0) {\n summary.keys = bodyKeys;\n }\n\n return Object.keys(summary).length > 0 ? summary : '[request body]';\n}\n\n/**\n * Extract a shallow conversation preview for model_step span input.\n */\nfunction extractStepInput(payload?: StepStartPayload): StepInputPreview {\n if (Array.isArray(payload?.inputMessages)) {\n return normalizeMessages(payload.inputMessages);\n }\n\n const request = payload?.request;\n if (!request) return undefined;\n\n const { body } = request;\n if (body == null) return request;\n\n try {\n const parsed = typeof body === 'string' ? JSON.parse(body) : body;\n return summarizeRequestBody(parsed);\n } catch {\n // body was not valid JSON; return as-is\n return request;\n }\n}\n\n/**\n * Manages MODEL_STEP and MODEL_CHUNK span tracking for streaming Model responses.\n *\n * Should be instantiated once per MODEL_GENERATION span and shared across\n * all streaming steps (including after tool calls).\n */\nexport class ModelSpanTracker {\n #modelSpan?: Span<SpanType.MODEL_GENERATION>;\n #currentStepSpan?: Span<SpanType.MODEL_STEP>;\n #currentInferenceSpan?: Span<SpanType.MODEL_INFERENCE>;\n #currentChunkSpan?: Span<SpanType.MODEL_CHUNK>;\n #currentChunkType?: string;\n #accumulator: Record<string, any> = {};\n #stepIndex: number = 0;\n #chunkSequence: number = 0;\n #completionStartTime?: Date;\n #currentStepInputIsFinal: boolean = false;\n /** When true, step-finish chunks don't auto-close the step span (for durable execution) */\n #deferStepClose: boolean = false;\n /** Stored step-finish payload when defer mode is enabled */\n #pendingStepFinishPayload?: StepFinishPayload<any, any>;\n /** Static request-side context applied to every MODEL_INFERENCE span */\n #inferenceContext?: ModelInferenceContext;\n\n constructor(modelSpan?: Span<SpanType.MODEL_GENERATION>) {\n this.#modelSpan = modelSpan;\n }\n\n /**\n * Set request-side context applied to subsequent MODEL_INFERENCE spans.\n * No-op when paired with an older @mastra/core that lacks the feature flag.\n */\n setInferenceContext(context: ModelInferenceContext): void {\n this.#inferenceContext = context;\n }\n\n /**\n * Capture the completion start time (time to first token) when the first content chunk arrives.\n */\n #captureCompletionStartTime(): void {\n if (this.#completionStartTime) {\n return;\n }\n this.#completionStartTime = new Date();\n }\n\n /**\n * Get the tracing context for creating child spans.\n * Returns the current step span if active, otherwise the model span.\n */\n getTracingContext(): TracingContext {\n return {\n currentSpan: this.#currentStepSpan ?? this.#modelSpan,\n };\n }\n\n /**\n * Report an error on the generation span\n */\n reportGenerationError(options: ErrorSpanOptions<SpanType.MODEL_GENERATION>): void {\n this.#modelSpan?.error(options);\n }\n\n /**\n * End the generation span with optional raw usage data.\n * If usage is provided, it will be converted to UsageStats with cache token details.\n */\n endGeneration(options?: EndGenerationOptions): void {\n const { usage, providerMetadata, ...spanOptions } = options ?? {};\n\n if (spanOptions.attributes) {\n spanOptions.attributes.completionStartTime = this.#completionStartTime;\n spanOptions.attributes.usage = extractUsageMetrics(usage, providerMetadata);\n }\n\n this.#modelSpan?.end(spanOptions);\n }\n\n /**\n * Update the generation span\n */\n updateGeneration(options: UpdateSpanOptions<SpanType.MODEL_GENERATION>): void {\n this.#modelSpan?.update(options);\n }\n\n /**\n * Enable or disable deferred step closing for durable execution.\n * When enabled, step-finish chunks won't automatically close the step span.\n * Use exportCurrentStep() to get the span data, then close it manually later.\n */\n setDeferStepClose(defer: boolean): void {\n this.#deferStepClose = defer;\n }\n\n /**\n * Export the current step span for later rebuilding (durable execution).\n * Returns undefined if no step span is active.\n */\n exportCurrentStep(): ReturnType<Span<SpanType.MODEL_STEP>['exportSpan']> | undefined {\n return this.#currentStepSpan?.exportSpan();\n }\n\n /**\n * Get the pending step finish payload (captured when defer mode is enabled).\n * This contains usage, finishReason, etc. for closing the step later.\n */\n getPendingStepFinishPayload(): StepFinishPayload<any, any> | undefined {\n return this.#pendingStepFinishPayload;\n }\n\n /**\n * Set the starting step index for durable execution.\n * Used when resuming across agentic loop iterations to maintain step continuity.\n */\n setStepIndex(index: number): void {\n this.#stepIndex = index;\n }\n\n /**\n * Get the current step index.\n */\n getStepIndex(): number {\n return this.#stepIndex;\n }\n\n /**\n * Start a new Model execution step.\n * This should be called at the beginning of LLM execution to capture accurate startTime.\n * The step-start chunk payload can be passed later via updateStep() if needed.\n *\n * Note: this only opens MODEL_STEP. The MODEL_INFERENCE child span is opened\n * separately via startInference() so its duration excludes input processor work.\n * Callers that don't call startInference() explicitly will get one auto-created\n * when the first model chunk arrives.\n */\n startStep(payload?: StepStartPayload): void {\n // Don't create duplicate step spans\n if (this.#currentStepSpan) {\n return;\n }\n\n const input = extractStepInput(payload);\n this.#currentStepSpan = this.#modelSpan?.createChildSpan({\n name: `step: ${this.#stepIndex}`,\n type: SpanType.MODEL_STEP,\n attributes: {\n stepIndex: this.#stepIndex,\n ...(payload?.messageId ? { messageId: payload.messageId } : {}),\n ...(payload?.warnings?.length ? { warnings: payload.warnings } : {}),\n },\n input,\n tracingPolicy: this.#modelSpan?.tracingPolicy,\n });\n this.#currentStepInputIsFinal = Array.isArray(payload?.inputMessages);\n // Reset chunk sequence for new step\n this.#chunkSequence = 0;\n }\n\n /**\n * End the current MODEL_INFERENCE span when the provider stream finishes.\n * Fields are duplicated onto MODEL_STEP (in #endStepSpan) so existing\n * integrations that read usage/finishReason from the step span continue\n * to work unchanged.\n *\n * Safe to call multiple times - no-ops if the span is already closed.\n */\n #endInferenceSpan<OUTPUT>(payload: StepFinishPayload<any, OUTPUT>): void {\n if (!this.#currentInferenceSpan) return;\n\n const { usage: rawUsage, ...otherOutput } = payload.output;\n const usage = extractUsageMetrics(rawUsage, payload.metadata?.providerMetadata);\n\n this.#currentInferenceSpan.end({\n output: otherOutput,\n attributes: {\n usage,\n finishReason: payload.stepResult.reason,\n warnings: payload.stepResult.warnings,\n completionStartTime: this.#completionStartTime,\n },\n });\n this.#currentInferenceSpan = undefined;\n }\n\n /**\n * Open the MODEL_INFERENCE span for the current step. Chunks (including tool-call\n * chunks emitted by the model) parent under this span so its duration reflects\n * pure model latency.\n *\n * Should be called immediately before invoking the model — after any input\n * processors / `prepareStep` work has completed — so the span's startTime\n * does not include processor time. The latest `#inferenceContext` (set via\n * setInferenceContext) is snapshotted onto the span at creation.\n *\n * No-ops when the installed @mastra/core lacks the `model-inference-span`\n * feature flag, or when called without an active step span. Auto-invoked from\n * chunk handlers as a safety net; explicit callers get the most accurate\n * start time.\n */\n startInference(payload?: StepStartPayload): void {\n if (!supportsModelInference()) {\n return;\n }\n if (!this.#currentStepSpan || this.#currentInferenceSpan) {\n return;\n }\n\n const input = extractStepInput(payload);\n const generationAttrs = this.#modelSpan?.attributes;\n const ctx = this.#inferenceContext;\n this.#currentInferenceSpan = this.#currentStepSpan.createChildSpan({\n name: `inference: ${this.#stepIndex}`,\n type: SpanType.MODEL_INFERENCE,\n attributes: {\n stepIndex: this.#stepIndex,\n model: generationAttrs?.model,\n provider: generationAttrs?.provider,\n streaming: generationAttrs?.streaming,\n ...(ctx?.parameters !== undefined ? { parameters: ctx.parameters } : {}),\n ...(ctx?.providerOptions !== undefined ? { providerOptions: ctx.providerOptions } : {}),\n ...(ctx?.availableTools !== undefined ? { availableTools: ctx.availableTools } : {}),\n ...(ctx?.toolChoice !== undefined ? { toolChoice: ctx.toolChoice } : {}),\n ...(ctx?.responseFormat !== undefined ? { responseFormat: ctx.responseFormat } : {}),\n },\n input,\n tracingPolicy: this.#modelSpan?.tracingPolicy,\n });\n }\n\n /**\n * Update the current step span with additional payload data.\n * Called when step-start chunk arrives with request/warnings info.\n */\n updateStep(payload?: StepStartPayload): void {\n if (!this.#currentStepSpan || !payload) {\n return;\n }\n\n const hasFinalInput = Array.isArray(payload.inputMessages);\n const input = hasFinalInput || !this.#currentStepInputIsFinal ? extractStepInput(payload) : undefined;\n\n // Update span with request/warnings from the step-start chunk\n this.#currentStepSpan.update({\n ...(input !== undefined ? { input } : {}),\n attributes: {\n ...(payload.messageId ? { messageId: payload.messageId } : {}),\n ...(payload.warnings?.length ? { warnings: payload.warnings } : {}),\n },\n });\n if (hasFinalInput) {\n this.#currentStepInputIsFinal = true;\n }\n }\n\n /**\n * End the current Model execution step with token usage, finish reason, output, and metadata\n */\n #endStepSpan<OUTPUT>(payload: StepFinishPayload<any, OUTPUT>) {\n // Flush any pending chunk span before ending the step\n // (handles case where text-delta arrives without text-end)\n this.#endChunkSpan();\n\n if (!this.#currentStepSpan) return;\n\n // Extract all data from step-finish chunk\n const output = payload.output;\n const { usage: rawUsage, ...otherOutput } = output;\n const stepResult = payload.stepResult;\n const metadata = payload.metadata;\n\n // Convert raw usage to UsageStats with cache token details\n const usage = extractUsageMetrics(rawUsage, metadata?.providerMetadata);\n\n // Remove verbose/redundant fields from metadata:\n // - request: too verbose\n // - id/timestamp: chunk-level data, not step-related\n // - modelId/modelVersion/modelProvider: duplicates of modelMetadata\n const cleanMetadata = metadata ? { ...metadata } : undefined;\n if (cleanMetadata) {\n for (const key of ['request', 'id', 'timestamp', 'modelId', 'modelVersion', 'modelProvider']) {\n delete cleanMetadata[key];\n }\n }\n\n // Inference may already be closed (closed eagerly on step-finish in defer\n // mode so its duration reflects pure model latency, not subsequent tool\n // execution). Close it here for the non-deferred path.\n this.#endInferenceSpan(payload);\n\n this.#currentStepSpan.end({\n output: otherOutput,\n attributes: {\n usage,\n isContinued: stepResult.isContinued,\n finishReason: stepResult.reason,\n warnings: stepResult.warnings,\n },\n metadata: {\n ...cleanMetadata,\n },\n });\n this.#currentStepSpan = undefined;\n this.#currentStepInputIsFinal = false;\n this.#stepIndex++;\n }\n\n /**\n * Returns the parent span for chunks. Chunks parent under MODEL_INFERENCE\n * (the provider call) when available, falling back to MODEL_STEP only if\n * startStep() was bypassed.\n */\n #chunkParent(): Span<SpanType.MODEL_INFERENCE> | Span<SpanType.MODEL_STEP> | undefined {\n return this.#currentInferenceSpan ?? this.#currentStepSpan;\n }\n\n /**\n * Safety-net invoked from chunk handlers: auto-create MODEL_STEP and\n * MODEL_INFERENCE if a chunk arrives before the loop has explicitly opened\n * them, so chunks parent under MODEL_INFERENCE rather than falling through\n * to MODEL_STEP. Idempotent — each public start* method is itself a no-op\n * when its span is already live.\n */\n #ensureStepAndInference(): void {\n if (!this.#currentStepSpan) {\n this.startStep();\n }\n if (!this.#currentInferenceSpan) {\n this.startInference();\n }\n }\n\n /**\n * Create a new chunk span (for multi-part chunks like text-start/delta/end)\n */\n #startChunkSpan(chunkType: string, initialData?: Record<string, any>) {\n // End any existing chunk span before starting a new one\n // (handles transitions like text-delta → tool-call without text-end)\n this.#endChunkSpan();\n\n this.#ensureStepAndInference();\n\n this.#currentChunkSpan = this.#chunkParent()?.createChildSpan({\n name: `chunk: '${chunkType}'`,\n type: SpanType.MODEL_CHUNK,\n attributes: {\n chunkType,\n sequenceNumber: this.#chunkSequence,\n },\n tracingPolicy: this.#modelSpan?.tracingPolicy,\n });\n this.#currentChunkType = chunkType;\n this.#accumulator = initialData || {};\n }\n\n /**\n * Append string content to a specific field in the accumulator\n */\n #appendToAccumulator(field: string, text: string) {\n if (this.#accumulator[field] === undefined) {\n this.#accumulator[field] = text;\n } else {\n this.#accumulator[field] += text;\n }\n }\n\n /**\n * End the current chunk span.\n * Safe to call multiple times - will no-op if span already ended.\n */\n #endChunkSpan(output?: any) {\n if (!this.#currentChunkSpan) return;\n\n this.#currentChunkSpan.end({\n output: output !== undefined ? output : this.#accumulator,\n });\n this.#currentChunkSpan = undefined;\n this.#currentChunkType = undefined;\n this.#accumulator = {};\n this.#chunkSequence++;\n }\n\n /**\n * Create an event span (for single chunks like tool-call)\n */\n #createEventSpan(\n chunkType: string,\n output: any,\n options?: { attributes?: Record<string, any>; metadata?: Record<string, any> },\n ) {\n this.#ensureStepAndInference();\n\n const span = this.#chunkParent()?.createEventSpan({\n name: `chunk: '${chunkType}'`,\n type: SpanType.MODEL_CHUNK,\n attributes: {\n chunkType,\n sequenceNumber: this.#chunkSequence,\n ...options?.attributes,\n },\n metadata: options?.metadata,\n output,\n tracingPolicy: this.#modelSpan?.tracingPolicy,\n });\n\n if (span) {\n this.#chunkSequence++;\n }\n }\n\n /**\n * Check if there is currently an active chunk span\n */\n #hasActiveChunkSpan(): boolean {\n return !!this.#currentChunkSpan;\n }\n\n /**\n * Get the current accumulator value\n */\n #getAccumulator(): Record<string, any> {\n return this.#accumulator;\n }\n\n /**\n * Handle text chunk spans (text-start/delta/end)\n */\n #handleTextChunk<OUTPUT>(chunk: ChunkType<OUTPUT>) {\n switch (chunk.type) {\n case 'text-start':\n this.#startChunkSpan('text');\n break;\n\n case 'text-delta':\n // Auto-create span if we receive text-delta without text-start\n // (AI SDK streaming doesn't always emit wrapper events)\n // Allow transition from any other chunk type\n if (this.#currentChunkType !== 'text') {\n this.#startChunkSpan('text');\n }\n this.#appendToAccumulator('text', chunk.payload.text);\n break;\n\n case 'text-end': {\n this.#endChunkSpan();\n break;\n }\n }\n }\n\n /**\n * Handle reasoning chunk spans (reasoning-start/delta/end)\n */\n #handleReasoningChunk<OUTPUT>(chunk: ChunkType<OUTPUT>) {\n switch (chunk.type) {\n case 'reasoning-start':\n this.#startChunkSpan('reasoning');\n break;\n\n case 'reasoning-delta':\n // Auto-create span if we receive reasoning-delta without reasoning-start\n // (AI SDK streaming doesn't always emit wrapper events)\n // Allow transition from any other chunk type\n if (this.#currentChunkType !== 'reasoning') {\n this.#startChunkSpan('reasoning');\n }\n this.#appendToAccumulator('text', chunk.payload.text);\n break;\n\n case 'reasoning-end': {\n this.#endChunkSpan();\n break;\n }\n }\n }\n\n /**\n * Handle tool call chunk spans (tool-call-input-streaming-start/delta/end, tool-call)\n */\n #handleToolCallChunk<OUTPUT>(chunk: ChunkType<OUTPUT>) {\n switch (chunk.type) {\n case 'tool-call-input-streaming-start':\n this.#startChunkSpan('tool-call', {\n toolName: chunk.payload.toolName,\n toolCallId: chunk.payload.toolCallId,\n });\n break;\n\n case 'tool-call-delta':\n this.#appendToAccumulator('toolInput', chunk.payload.argsTextDelta);\n break;\n\n case 'tool-call-input-streaming-end':\n case 'tool-call': {\n // Build output with toolName, toolCallId, and parsed toolInput\n const acc = this.#getAccumulator();\n let toolInput;\n try {\n toolInput = acc.toolInput ? JSON.parse(acc.toolInput) : {};\n } catch {\n toolInput = acc.toolInput; // Keep as string if parsing fails\n }\n this.#endChunkSpan({\n toolName: acc.toolName,\n toolCallId: acc.toolCallId,\n toolInput,\n });\n break;\n }\n }\n }\n\n /**\n * Handle object chunk spans (object, object-result)\n */\n #handleObjectChunk<OUTPUT>(chunk: ChunkType<OUTPUT>) {\n switch (chunk.type) {\n case 'object':\n // Start span on first partial object chunk (only if not already started)\n // Multiple object chunks may arrive as the object is being generated\n // Check specifically for object chunk type to allow transitioning from other types\n if (this.#currentChunkType !== 'object') {\n this.#startChunkSpan('object');\n }\n break;\n\n case 'object-result':\n // End the span with the final complete object as output\n this.#endChunkSpan(chunk.object);\n break;\n }\n }\n\n /**\n * Handle tool-call-approval chunks.\n * Creates a span for approval requests so they can be seen in traces for debugging.\n */\n #handleToolApprovalChunk<OUTPUT>(chunk: ChunkType<OUTPUT>) {\n if (chunk.type !== 'tool-call-approval') return;\n const payload = chunk.payload;\n\n this.#ensureStepAndInference();\n\n // Create an event span for the approval request\n // Using createEventSpan since approvals are point-in-time events (not time ranges)\n const span = this.#chunkParent()?.createEventSpan({\n name: `chunk: 'tool-call-approval'`,\n type: SpanType.MODEL_CHUNK,\n attributes: {\n chunkType: 'tool-call-approval',\n sequenceNumber: this.#chunkSequence,\n },\n output: payload,\n tracingPolicy: this.#modelSpan?.tracingPolicy,\n });\n\n if (span) {\n this.#chunkSequence++;\n }\n }\n /**\n * Wraps a stream with model tracing transform to track MODEL_STEP and MODEL_CHUNK spans.\n *\n * This should be added to the stream pipeline to automatically\n * create MODEL_STEP and MODEL_CHUNK spans for each semantic unit in the stream.\n */\n wrapStream<T extends { pipeThrough: Function }>(stream: T): T {\n return stream.pipeThrough(\n new TransformStream({\n transform: (chunk, controller) => {\n // Capture completion start time on first actual content (for time-to-first-token)\n switch (chunk.type) {\n case 'text-delta':\n case 'tool-call-delta':\n case 'reasoning-delta':\n this.#captureCompletionStartTime();\n break;\n }\n\n controller.enqueue(chunk);\n\n // Handle chunk span tracking based on chunk type\n switch (chunk.type) {\n case 'text-start':\n case 'text-delta':\n case 'text-end':\n this.#handleTextChunk(chunk);\n break;\n\n case 'tool-call-input-streaming-start':\n case 'tool-call-delta':\n case 'tool-call-input-streaming-end':\n case 'tool-call':\n this.#handleToolCallChunk(chunk);\n break;\n\n case 'reasoning-start':\n case 'reasoning-delta':\n case 'reasoning-end':\n this.#handleReasoningChunk(chunk);\n break;\n\n case 'object':\n case 'object-result':\n this.#handleObjectChunk(chunk);\n break;\n\n case 'step-start':\n // If step already started (via startStep()), just update with payload data\n // Otherwise start a new step (for backwards compatibility)\n if (this.#currentStepSpan) {\n this.updateStep(chunk.payload);\n } else {\n this.startStep(chunk.payload);\n }\n // step-start fires when the provider stream has begun. Open the\n // inference span here as a safety net for callers that don't\n // explicitly call startInference() before invoking the model —\n // chunks that follow will parent under MODEL_INFERENCE.\n if (!this.#currentInferenceSpan) {\n this.startInference(chunk.payload);\n }\n break;\n\n case 'step-finish':\n if (this.#deferStepClose) {\n // Durable mode: save payload for later, don't close the step.\n // Close MODEL_INFERENCE eagerly though - the provider stream is\n // done, and any subsequent tool execution under the step should\n // not inflate inference duration.\n this.#pendingStepFinishPayload = chunk.payload;\n this.#endChunkSpan();\n this.#endInferenceSpan(chunk.payload);\n } else {\n // Normal mode: close the step immediately\n this.#endStepSpan(chunk.payload);\n }\n break;\n\n // Infrastructure chunks - skip creating spans for these\n // They are either redundant, metadata-only, or error/control flow\n case 'raw': // Redundant raw data\n case 'start': // Stream start marker\n case 'finish': // Stream finish marker (step-finish already captures this)\n case 'response-metadata': // Response metadata (not semantic content)\n case 'source': // Source references (metadata)\n case 'file': // Binary file data (too large/not semantic)\n case 'error': // Error handling\n case 'abort': // Abort signal\n case 'tripwire': // Processor rejection\n case 'watch': // Internal watch event\n case 'tool-error': // Tool error handling\n case 'tool-call-suspended': // Suspension (not content)\n case 'reasoning-signature': // Signature metadata\n case 'redacted-reasoning': // Redacted content metadata\n case 'step-output': // Step output wrapper (content is nested)\n // Don't create spans for these chunks\n break;\n\n case 'tool-call-approval': // Approval request - create span for debugging\n this.#handleToolApprovalChunk(chunk);\n break;\n\n case 'tool-output':\n // tool-output chunks are streaming progress from tools (e.g., sub-agents)\n // No span created - the final tool-result event captures the result\n break;\n\n case 'tool-result': {\n // tool-result is always a point-in-time event span\n // (tool execution duration is captured by the parent tool_call span)\n const {\n // Metadata - tool call context (unique to tool-result chunks)\n toolCallId,\n toolName,\n isError,\n dynamic,\n providerExecuted,\n providerMetadata,\n // Keep provider-executed results on MODEL_CHUNK because they come\n // from the model/provider stream and may not have a sibling TOOL_CALL span.\n // For locally executed tools, the canonical payload lives on TOOL_CALL.\n result,\n // Stripped - redundant (already on TOOL_CALL span input)\n args: _args,\n } = (chunk.payload as Record<string, any>) || {};\n\n // All tool-result specific fields go in metadata\n const metadata: Record<string, any> = { toolCallId, toolName };\n if (isError !== undefined) metadata.isError = isError;\n if (dynamic !== undefined) metadata.dynamic = dynamic;\n if (providerExecuted !== undefined) metadata.providerExecuted = providerExecuted;\n if (providerMetadata !== undefined) metadata.providerMetadata = providerMetadata;\n\n this.#createEventSpan(chunk.type, providerExecuted ? result : undefined, { metadata });\n break;\n }\n\n // Default: skip creating spans for unrecognized chunk types\n // All semantic content chunks should be explicitly handled above\n // Unknown chunks are likely infrastructure or custom chunks that don't need tracing\n default:\n // No span created - reduces trace noise\n break;\n }\n },\n }),\n ) as T;\n }\n}\n","import { SpanType, InternalSpans } from '@mastra/core/observability';\nimport type {\n Span,\n SpanTypeMap,\n AnySpan,\n ChildSpanOptions,\n ChildEventOptions,\n EndSpanOptions,\n ErrorSpanOptions,\n UpdateSpanOptions,\n CreateSpanOptions,\n ObservabilityInstance,\n ExportedSpan,\n TraceState,\n IModelSpanTracker,\n AIModelGenerationSpan,\n EntityType,\n TracingPolicy,\n CorrelationContext,\n} from '@mastra/core/observability';\n\nimport { ModelSpanTracker } from '../model-tracing';\nimport { deepClean, mergeSerializationOptions } from './serialization';\nimport type { DeepCleanOptions } from './serialization';\n\n/** Extended span type that includes getParentSpan method available on BaseSpan instances */\ntype AnyBaseSpan = AnySpan & { getParentSpan(includeInternalSpans?: boolean): AnySpan | undefined };\n\n/**\n * Determines if a span type should be considered internal based on flags.\n * Returns false if flags are undefined.\n */\nfunction isSpanInternal(spanType: SpanType, flags?: InternalSpans): boolean {\n if (flags === undefined || flags === InternalSpans.NONE) {\n return false;\n }\n\n switch (spanType) {\n // Workflow-related spans\n case SpanType.WORKFLOW_RUN:\n case SpanType.WORKFLOW_STEP:\n case SpanType.WORKFLOW_CONDITIONAL:\n case SpanType.WORKFLOW_CONDITIONAL_EVAL:\n case SpanType.WORKFLOW_PARALLEL:\n case SpanType.WORKFLOW_LOOP:\n case SpanType.WORKFLOW_SLEEP:\n case SpanType.WORKFLOW_WAIT_EVENT:\n return (flags & InternalSpans.WORKFLOW) !== 0;\n\n // Agent-related spans\n case SpanType.AGENT_RUN:\n return (flags & InternalSpans.AGENT) !== 0;\n\n // Tool-related spans\n case SpanType.TOOL_CALL:\n case SpanType.MCP_TOOL_CALL:\n return (flags & InternalSpans.TOOL) !== 0;\n\n // Model-related spans\n case SpanType.MODEL_GENERATION:\n case SpanType.MODEL_STEP:\n case SpanType.MODEL_INFERENCE:\n case SpanType.MODEL_CHUNK:\n return (flags & InternalSpans.MODEL) !== 0;\n\n // Default: never internal\n default:\n return false;\n }\n}\n\n/**\n * Get the external parent span ID from CreateSpanOptions.\n *\n * If the parent is internal, walks up the parent chain to find\n * the closest external ancestor. If the parent is already external,\n * returns its ID directly.\n *\n * This is useful when exporting spans to external observability systems\n * that shouldn't include internal framework spans.\n *\n * @param options - Span creation options\n * @returns The external parent span ID, or undefined if no external parent exists\n *\n * @example\n * ```typescript\n * // Parent is external - returns parent.id\n * const externalParent = { id: 'span-123', isInternal: false };\n * const options = { parent: externalParent, ... };\n * getExternalParentId(options); // 'span-123'\n *\n * // Parent is internal - walks up to find external ancestor\n * const externalGrandparent = { id: 'span-456', isInternal: false };\n * const internalParent = { id: 'span-123', isInternal: true, parent: externalGrandparent };\n * const options = { parent: internalParent, ... };\n * getExternalParentId(options); // 'span-456'\n * ```\n */\nexport function getExternalParentId(options: CreateSpanOptions<any>): string | undefined {\n if (!options.parent) {\n return undefined;\n }\n\n if (options.parent.isInternal) {\n // Parent is internal, find its external ancestor\n return options.parent.getParentSpanId(false);\n } else {\n // Parent is already external, use it directly\n return options.parent.id;\n }\n}\n\nexport abstract class BaseSpan<TType extends SpanType = any> implements Span<TType> {\n public abstract id: string;\n public abstract traceId: string;\n\n public name: string;\n public type: TType;\n public attributes: SpanTypeMap[TType];\n public parent?: AnySpan;\n public startTime: Date;\n public endTime?: Date;\n public isEvent: boolean;\n public isInternal: boolean;\n public tracingPolicy?: TracingPolicy;\n public observabilityInstance: ObservabilityInstance;\n public input?: any;\n public output?: any;\n public errorInfo?: {\n message: string;\n id?: string;\n name?: string;\n stack?: string;\n domain?: string;\n category?: string;\n details?: Record<string, any>;\n };\n public metadata?: Record<string, any>;\n public requestContext?: Record<string, any>;\n public tags?: string[];\n public traceState?: TraceState;\n /** Entity type that created the span (e.g., agent, workflow) */\n public entityType?: EntityType;\n /** Entity ID that created the span */\n public entityId?: string;\n /** Entity name that created the span */\n public entityName?: string;\n /** Parent span ID (for root spans that are children of external spans) */\n protected parentSpanId?: string;\n /** Deep clean options for serialization */\n protected deepCleanOptions: DeepCleanOptions;\n /**\n * Whether this span is filtered out before export. When true, BaseSpan/\n * DefaultSpan skip attaching attributes/input/output/errorInfo/requestContext\n * entirely -- they are never read on excluded spans, and skipping avoids\n * both the deepClean cost and holding references to large payloads for\n * the lifetime of the span. Set when excludeSpanTypes drops the type,\n * when the span is internal and includeInternalSpans is false, or when\n * the subclass is always excluded (e.g., NoOpSpan).\n *\n * Note: metadata is still attached and deepCleaned because it is read in\n * process by getCorrelationContext() and by getLoggerContext() /\n * getMetricsContext() (which structuredClone it).\n */\n protected isExcluded: boolean;\n /** Cached canonical correlation context for this live span */\n protected correlationContext?: CorrelationContext;\n\n /**\n * Subclasses can override to unconditionally mark the span as excluded.\n * NoOpSpan uses this because it is never exported regardless of config.\n */\n protected get alwaysExcluded(): boolean {\n return false;\n }\n\n constructor(options: CreateSpanOptions<TType>, observabilityInstance: ObservabilityInstance) {\n // Get serialization options from observability instance config\n const observabilityConfig = observabilityInstance.getConfig();\n this.deepCleanOptions = mergeSerializationOptions(observabilityConfig.serializationOptions);\n\n this.name = options.name;\n this.type = options.type;\n this.isInternal = isSpanInternal(this.type, options.tracingPolicy?.internal);\n\n // Determine up front whether this span will ever reach exporters.\n // getSpanForExport() drops these same spans before export, so we can\n // skip both the deepClean cost and the retention of large payload\n // references for the lifetime of the span (notably per-chunk\n // MODEL_CHUNK spans when excludeSpanTypes: [MODEL_CHUNK] is set).\n this.isExcluded =\n this.alwaysExcluded ||\n observabilityConfig.excludeSpanTypes?.includes(this.type) === true ||\n (this.isInternal && !observabilityConfig.includeInternalSpans);\n\n // Metadata is always attached and deepCleaned: it is read in-process\n // by getCorrelationContext() and by getLoggerContext() /\n // getMetricsContext() (which structuredClone it), and non-filtered\n // child spans inherit it via options.parent?.metadata.\n this.metadata = deepClean(\n options.parent?.metadata || options.metadata ? { ...options.parent?.metadata, ...options.metadata } : undefined,\n this.deepCleanOptions,\n );\n\n if (options.requestContext && options.requestContext.size() > 0) {\n this.requestContext = deepClean(options.requestContext.all, this.deepCleanOptions);\n }\n\n this.parent = options.parent;\n this.startTime = options.startTime ?? new Date();\n this.observabilityInstance = observabilityInstance;\n this.isEvent = options.isEvent ?? false;\n this.tracingPolicy = options.tracingPolicy;\n this.traceState = options.traceState;\n // Tags are only set for root spans (spans without a parent)\n this.tags = !options.parent && options.tags?.length ? options.tags : undefined;\n // Entity identification - inherit from closest non-internal parent if not explicitly provided\n const entityParent = this.getParentSpan(false);\n this.entityType = options.entityType ?? entityParent?.entityType;\n this.entityId = options.entityId ?? entityParent?.entityId;\n this.entityName = options.entityName ?? entityParent?.entityName;\n\n if (this.isExcluded) {\n // Keep the shape of attributes stable for any live-span reader.\n // input/output/errorInfo/requestContext stay undefined.\n this.attributes = {} as SpanTypeMap[TType];\n return;\n }\n\n this.attributes = deepClean(options.attributes, this.deepCleanOptions) || ({} as SpanTypeMap[TType]);\n if (options.requestContext && options.requestContext.size() > 0) {\n this.requestContext = deepClean(options.requestContext.all, this.deepCleanOptions);\n }\n\n if (this.isEvent) {\n // Event spans don't have endTime or input.\n // Event spans are immediately emitted by the BaseObservability class via the end() event.\n this.output = deepClean(options.output, this.deepCleanOptions);\n } else {\n this.input = deepClean(options.input, this.deepCleanOptions);\n }\n }\n\n // Methods for span lifecycle\n /** End the span */\n abstract end(options?: EndSpanOptions<TType>): void;\n\n /** Record an error for the span, optionally end the span as well */\n abstract error(options: ErrorSpanOptions<TType>): void;\n\n /** Update span attributes */\n abstract update(options: UpdateSpanOptions<TType>): void;\n\n createChildSpan(options: ChildSpanOptions<SpanType.MODEL_GENERATION>): AIModelGenerationSpan;\n createChildSpan<TChildType extends SpanType>(options: ChildSpanOptions<TChildType>): Span<TChildType> {\n return this.observabilityInstance.startSpan<TChildType>({ ...options, parent: this, isEvent: false });\n }\n\n createEventSpan<TChildType extends SpanType>(options: ChildEventOptions<TChildType>): Span<TChildType> {\n return this.observabilityInstance.startSpan<TChildType>({ ...options, parent: this, isEvent: true });\n }\n\n /**\n * Create a ModelSpanTracker for this span (only works if this is a MODEL_GENERATION span)\n * Returns undefined for non-MODEL_GENERATION spans\n */\n createTracker(): IModelSpanTracker | undefined {\n // Only create tracker for MODEL_GENERATION spans\n if (this.type !== SpanType.MODEL_GENERATION) {\n return undefined;\n }\n\n return new ModelSpanTracker(this as Span<SpanType.MODEL_GENERATION>);\n }\n\n /** Returns `TRUE` if the span is the root span of a trace */\n get isRootSpan(): boolean {\n return !this.parent;\n }\n\n /** Returns `TRUE` if the span is a valid span (not a NO-OP Span) */\n abstract get isValid(): boolean;\n\n /** Get the closest parent span, optionally skipping internal spans */\n public getParentSpan(includeInternalSpans?: boolean): AnySpan | undefined {\n if (!this.parent) {\n return undefined;\n }\n if (includeInternalSpans) return this.parent;\n if (this.parent.isInternal) return (this.parent as AnyBaseSpan).getParentSpan(includeInternalSpans);\n return this.parent;\n }\n\n /** Get the closest parent spanId that isn't an internal span */\n public getParentSpanId(includeInternalSpans?: boolean): string | undefined {\n if (!this.parent) {\n // Return parent span ID if available (for root spans with external parent)\n return this.parentSpanId;\n }\n const parentSpan = this.getParentSpan(includeInternalSpans);\n if (parentSpan) {\n return parentSpan.id;\n }\n // All ancestors are internal, recurse to get root's parentSpanId\n return this.parent.getParentSpanId(includeInternalSpans);\n }\n\n /** Find the closest parent span of a specific type by walking up the parent chain */\n public findParent<T extends SpanType>(spanType: T): Span<T> | undefined {\n let current: AnySpan | undefined = this.parent;\n\n while (current) {\n if (current.type === spanType) {\n return current as Span<T>;\n }\n current = current.parent;\n }\n\n return undefined;\n }\n\n /** Build and cache the canonical correlation context for this live span. */\n public getCorrelationContext(): CorrelationContext {\n if (this.correlationContext) {\n return this.correlationContext;\n }\n\n const metadata = this.metadata ?? {};\n const getMetadataString = (key: string): string | undefined =>\n typeof metadata[key] === 'string' ? metadata[key] : undefined;\n const getSpanMetadataString = (span: AnySpan | null | undefined, key: string): string | undefined => {\n const m = span?.metadata;\n return m && typeof m[key] === 'string' ? m[key] : undefined;\n };\n const parentSpan = this.getParentSpan(false);\n\n let rootSpan: AnySpan = this;\n while (rootSpan.parent) {\n rootSpan = rootSpan.parent;\n }\n\n const rootTags = rootSpan.tags?.length ? [...rootSpan.tags] : undefined;\n\n this.correlationContext = {\n traceId: this.traceId,\n spanId: this.id,\n tags: rootTags,\n entityType: this.entityType,\n entityId: this.entityId,\n entityName: this.entityName,\n entityVersionId: getMetadataString('entityVersionId'),\n parentEntityType: parentSpan?.entityType,\n parentEntityId: parentSpan?.entityId,\n parentEntityName: parentSpan?.entityName,\n parentEntityVersionId: getSpanMetadataString(parentSpan, 'entityVersionId'),\n rootEntityType: rootSpan.entityType,\n rootEntityId: rootSpan.entityId,\n rootEntityName: rootSpan.entityName,\n rootEntityVersionId: getSpanMetadataString(rootSpan, 'entityVersionId'),\n userId: getMetadataString('userId'),\n organizationId: getMetadataString('organizationId'),\n resourceId: getMetadataString('resourceId'),\n runId: getMetadataString('runId'),\n sessionId: getMetadataString('sessionId'),\n threadId: getMetadataString('threadId'),\n requestId: getMetadataString('requestId'),\n environment: getMetadataString('environment') ?? this.observabilityInstance.getMastraEnvironment?.(),\n source: getMetadataString('source'),\n serviceName: getMetadataString('serviceName') ?? this.observabilityInstance.getConfig().serviceName,\n experimentId: getMetadataString('experimentId'),\n };\n\n return this.correlationContext;\n }\n\n /** Returns a lightweight span ready for export */\n public exportSpan(includeInternalSpans?: boolean): ExportedSpan<TType> {\n // Check if input/output should be hidden based on traceState\n const hideInput = this.traceState?.hideInput ?? false;\n const hideOutput = this.traceState?.hideOutput ?? false;\n\n return {\n id: this.id,\n traceId: this.traceId,\n name: this.name,\n type: this.type,\n entityType: this.entityType,\n entityId: this.entityId,\n entityName: this.entityName,\n attributes: this.attributes,\n metadata: this.metadata,\n startTime: this.startTime,\n endTime: this.endTime,\n input: hideInput ? undefined : this.input,\n output: hideOutput ? undefined : this.output,\n errorInfo: this.errorInfo,\n requestContext: this.requestContext,\n isEvent: this.isEvent,\n isRootSpan: this.isRootSpan,\n parentSpanId: this.getParentSpanId(includeInternalSpans),\n // Tags are only included for root spans\n ...(this.isRootSpan && this.tags?.length ? { tags: this.tags } : {}),\n };\n }\n\n get externalTraceId(): string | undefined {\n return this.isValid ? this.traceId : undefined;\n }\n\n /**\n * Execute an async function within this span's tracing context.\n * Delegates to the bridge if available.\n */\n async executeInContext<T>(fn: () => Promise<T>): Promise<T> {\n const bridge = this.observabilityInstance.getBridge();\n\n if (bridge?.executeInContext) {\n const bridgeContextSpan = this.isInternal ? this.getParentSpan(false) : this;\n return bridge.executeInContext(bridgeContextSpan?.id ?? this.id, fn);\n }\n\n return fn();\n }\n\n /**\n * Execute a synchronous function within this span's tracing context.\n * Delegates to the bridge if available.\n */\n executeInContextSync<T>(fn: () => T): T {\n const bridge = this.observabilityInstance.getBridge();\n\n if (bridge?.executeInContextSync) {\n const bridgeContextSpan = this.isInternal ? this.getParentSpan(false) : this;\n return bridge.executeInContextSync(bridgeContextSpan?.id ?? this.id, fn);\n }\n\n return fn();\n }\n}\n","import { MastraError } from '@mastra/core/error';\nimport type {\n SpanType,\n ObservabilityInstance,\n EndSpanOptions,\n ErrorSpanOptions,\n UpdateSpanOptions,\n CreateSpanOptions,\n} from '@mastra/core/observability';\nimport { BaseSpan } from './base';\nimport { deepClean } from './serialization';\n\nexport class DefaultSpan<TType extends SpanType> extends BaseSpan<TType> {\n public id: string;\n public traceId: string;\n\n constructor(options: CreateSpanOptions<TType>, observabilityInstance: ObservabilityInstance) {\n super(options, observabilityInstance);\n\n // If spanId and traceId are provided, this is a rebuilt span - use provided IDs directly\n if (options.spanId && options.traceId) {\n this.id = options.spanId;\n this.traceId = options.traceId;\n if (options.parentSpanId) {\n this.parentSpanId = options.parentSpanId;\n }\n return;\n }\n\n // If bridge and not internal span, use bridge to init span\n const bridge = observabilityInstance.getBridge();\n if (bridge && !this.isInternal) {\n const bridgeIds = bridge.createSpan(options);\n if (bridgeIds) {\n this.id = bridgeIds.spanId;\n this.traceId = bridgeIds.traceId;\n this.parentSpanId = bridgeIds.parentSpanId;\n return;\n }\n }\n\n // No bridge or bridge failed - generate IDs ourselves\n if (options.parent) {\n this.traceId = options.parent.traceId;\n this.parentSpanId = options.parent.id;\n this.id = generateSpanId();\n return;\n }\n\n this.traceId = getOrCreateTraceId(options);\n this.id = generateSpanId();\n\n if (options.parentSpanId) {\n if (isValidSpanId(options.parentSpanId)) {\n this.parentSpanId = options.parentSpanId;\n } else {\n console.error(\n `[Mastra Tracing] Invalid parentSpanId: must be 1-16 hexadecimal characters, got \"${options.parentSpanId}\". Ignoring.`,\n );\n }\n }\n }\n\n end(options?: EndSpanOptions<TType>): void {\n if (this.isEvent) {\n return;\n }\n this.endTime = new Date();\n // Metadata is always updated (read by correlation/logger/metrics contexts).\n if (options?.metadata) {\n this.metadata = { ...this.metadata, ...deepClean(options.metadata, this.deepCleanOptions) };\n }\n if (this.isExcluded) {\n // Span is filtered before export; skip attaching heavy fields.\n return;\n }\n if (options?.output !== undefined) {\n this.output = deepClean(options.output, this.deepCleanOptions);\n }\n if (options?.attributes) {\n this.attributes = { ...this.attributes, ...deepClean(options.attributes, this.deepCleanOptions) };\n }\n // Tracing events automatically handled by base class\n }\n\n error(options: ErrorSpanOptions<TType>): void {\n if (this.isEvent) {\n return;\n }\n\n const { error, endSpan = true, attributes, metadata } = options;\n\n if (metadata) {\n this.metadata = { ...this.metadata, ...deepClean(metadata, this.deepCleanOptions) };\n }\n\n if (!this.isExcluded) {\n this.errorInfo = deepClean(\n error instanceof MastraError\n ? {\n id: error.id,\n details: error.details,\n category: error.category,\n domain: error.domain,\n message: error.message,\n name: error.name,\n // Prefer the original cause's stack when available. MastraError wraps\n // thrown errors, so its own stack points to the wrapping site rather\n // than where the underlying error was thrown.\n stack: (error.cause instanceof Error && error.cause.stack) || error.stack,\n }\n : {\n message: error.message,\n name: error.name,\n stack: error.stack,\n },\n this.deepCleanOptions,\n );\n\n if (attributes) {\n this.attributes = { ...this.attributes, ...deepClean(attributes, this.deepCleanOptions) };\n }\n }\n\n if (endSpan) {\n this.end();\n } else {\n // Trigger span update event when not ending the span\n this.update({});\n }\n }\n\n update(options: UpdateSpanOptions<TType>): void {\n if (this.isEvent) {\n return;\n }\n\n if (options.name !== undefined) {\n this.name = options.name;\n }\n // Metadata is always updated (read by correlation/logger/metrics contexts).\n if (options.metadata) {\n this.metadata = { ...this.metadata, ...deepClean(options.metadata, this.deepCleanOptions) };\n }\n if (this.isExcluded) {\n return;\n }\n if (options.input !== undefined) {\n this.input = deepClean(options.input, this.deepCleanOptions);\n }\n if (options.output !== undefined) {\n this.output = deepClean(options.output, this.deepCleanOptions);\n }\n if (options.attributes) {\n this.attributes = { ...this.attributes, ...deepClean(options.attributes, this.deepCleanOptions) };\n }\n // Tracing events automatically handled by base class\n }\n\n get isValid(): boolean {\n return true;\n }\n\n async export(): Promise<string> {\n return JSON.stringify({\n spanId: this.id,\n traceId: this.traceId,\n startTime: this.startTime,\n endTime: this.endTime,\n attributes: this.attributes,\n metadata: this.metadata,\n });\n }\n}\n\n/**\n * Generate OpenTelemetry-compatible span ID (64-bit, 16 hex chars)\n */\nfunction fillRandomBytes(bytes: Uint8Array): void {\n try {\n // Use Web Crypto API with proper this binding\n const webCrypto = globalThis.crypto;\n if (webCrypto?.getRandomValues) {\n webCrypto.getRandomValues.call(webCrypto, bytes);\n return;\n }\n } catch {\n // Fall through to fallback\n }\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = Math.floor(Math.random() * 256);\n }\n}\n\nfunction generateSpanId(): string {\n const bytes = new Uint8Array(8);\n fillRandomBytes(bytes);\n return Array.from(bytes, byte => byte.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Generate OpenTelemetry-compatible trace ID (128-bit, 32 hex chars)\n */\nfunction generateTraceId(): string {\n const bytes = new Uint8Array(16);\n fillRandomBytes(bytes);\n return Array.from(bytes, byte => byte.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Validate OpenTelemetry-compatible trace ID (1-32 hex characters)\n */\nfunction isValidTraceId(traceId: string): boolean {\n return /^[0-9a-f]{1,32}$/i.test(traceId);\n}\n\n/**\n * Validate OpenTelemetry-compatible span ID (1-16 hex characters)\n */\nfunction isValidSpanId(spanId: string): boolean {\n return /^[0-9a-f]{1,16}$/i.test(spanId);\n}\n\nfunction getOrCreateTraceId(options: CreateSpanOptions<SpanType>): string {\n if (options.traceId) {\n if (isValidTraceId(options.traceId)) {\n return options.traceId;\n } else {\n console.error(\n `[Mastra Tracing] Invalid traceId: must be 1-32 hexadecimal characters, got \"${options.traceId}\". Generating new trace ID.`,\n );\n }\n }\n return generateTraceId();\n}\n","/**\n * NoOpSpan Implementation for Mastra Observability\n */\n\nimport type {\n ObservabilityInstance,\n SpanType,\n CreateSpanOptions,\n EndSpanOptions,\n UpdateSpanOptions,\n ErrorSpanOptions,\n} from '@mastra/core/observability';\nimport { BaseSpan } from './base';\n\nexport class NoOpSpan<TType extends SpanType = any> extends BaseSpan<TType> {\n public id: string;\n public traceId: string;\n\n constructor(options: CreateSpanOptions<TType>, observabilityInstance: ObservabilityInstance) {\n super(options, observabilityInstance);\n this.id = 'no-op';\n this.traceId = 'no-op-trace';\n }\n\n end(_options?: EndSpanOptions<TType>): void {}\n\n error(_options: ErrorSpanOptions<TType>): void {}\n\n update(_options: UpdateSpanOptions<TType>): void {}\n\n get isValid(): boolean {\n return false;\n }\n\n // NoOpSpan is never exported, so treat it as always excluded.\n protected override get alwaysExcluded(): boolean {\n return true;\n }\n}\n","/**\n * BaseObservability - Abstract base class for Observability implementations\n */\n\nimport { MastraBase } from '@mastra/core/base';\nimport type { RequestContext } from '@mastra/core/di';\nimport type { IMastraLogger } from '@mastra/core/logger';\nimport { RegisteredLogger } from '@mastra/core/logger';\nimport { SpanType, TracingEventType, noOpLoggerContext } from '@mastra/core/observability';\nimport type {\n Span,\n ObservabilityExporter,\n ObservabilityBridge,\n SpanOutputProcessor,\n TracingEvent,\n AnySpan,\n EndSpanOptions,\n UpdateSpanOptions,\n StartSpanOptions,\n CreateSpanOptions,\n ObservabilityInstance,\n CustomSamplerOptions,\n ExportedSpan,\n AnyExportedSpan,\n TraceState,\n TracingOptions,\n LoggerContext,\n MetricsContext,\n ObservabilityEvent,\n ModelGenerationAttributes,\n UsageStats,\n} from '@mastra/core/observability';\nimport { getNestedValue, setNestedValue } from '@mastra/core/utils';\nimport { ObservabilityBus } from '../bus';\nimport type { ObservabilityInstanceConfig } from '../config';\nimport { SamplingStrategyType } from '../config';\nimport { LoggerContextImpl } from '../context/logger';\nimport { MetricsContextImpl } from '../context/metrics';\nimport { emitAutoExtractedMetrics, emitTokenMetricsForUsage } from '../metrics/auto-extract';\nimport { CardinalityFilter } from '../metrics/cardinality';\nimport { NoOpSpan } from '../spans';\nimport { addUsageStats } from '../usage';\n\n// ============================================================================\n// Abstract Base Class\n// ============================================================================\n\n/**\n * Abstract base class for all Observability implementations in Mastra.\n */\nexport abstract class BaseObservabilityInstance extends MastraBase implements ObservabilityInstance {\n protected config: ObservabilityInstanceConfig;\n\n /**\n * Unified event bus for all observability signals.\n * Routes events to registered exporters based on event type.\n */\n protected observabilityBus: ObservabilityBus;\n\n /**\n * Cardinality filter for metrics label protection.\n */\n protected cardinalityFilter: CardinalityFilter;\n\n /**\n * Deployment environment propagated from the parent Mastra instance.\n * Set by `Observability.setMastraContext`, read by spans as a fallback when\n * a span's `metadata.environment` isn't set.\n */\n #mastraEnvironment?: string;\n\n constructor(config: ObservabilityInstanceConfig) {\n super({ component: RegisteredLogger.OBSERVABILITY, name: config.serviceName });\n\n // Apply defaults for optional fields\n this.config = {\n serviceName: config.serviceName,\n name: config.name,\n sampling: config.sampling ?? { type: SamplingStrategyType.ALWAYS },\n exporters: config.exporters ?? [],\n spanOutputProcessors: config.spanOutputProcessors ?? [],\n bridge: config.bridge ?? undefined,\n includeInternalSpans: config.includeInternalSpans ?? false,\n excludeSpanTypes: config.excludeSpanTypes,\n spanFilter: config.spanFilter,\n requestContextKeys: config.requestContextKeys ?? [],\n serializationOptions: config.serializationOptions,\n logging: config.logging,\n };\n\n // Initialize cardinality filter for metrics (uses user config or defaults)\n this.cardinalityFilter = new CardinalityFilter(config.cardinality);\n\n // Initialize the unified ObservabilityBus\n this.observabilityBus = new ObservabilityBus({\n serializationOptions: this.config.serializationOptions,\n });\n\n for (const exporter of this.exporters) {\n this.observabilityBus.registerExporter(exporter);\n }\n\n // Register bridge on the bus so it receives all signals (tracing + non-tracing)\n if (this.config.bridge) {\n this.observabilityBus.registerBridge(this.config.bridge);\n }\n\n // Initialize bridge if present\n if (this.config.bridge?.init) {\n this.config.bridge.init({ config: this.config });\n }\n }\n\n /**\n * Override setLogger to add Observability specific initialization log\n * and propagate logger to exporters and bridge\n */\n __setLogger(logger: IMastraLogger) {\n super.__setLogger(logger);\n\n // Propagate logger to all exporters that support it\n this.exporters.forEach(exporter => {\n if (typeof exporter.__setLogger === 'function') {\n exporter.__setLogger(logger);\n }\n });\n\n // Propagate logger to bridge if present\n if (this.config.bridge?.__setLogger) {\n this.config.bridge.__setLogger(logger);\n }\n\n // Log Observability initialization details after logger is properly set\n this.logger.debug(\n `[Observability] Initialized [service=${this.config.serviceName}] [instance=${this.config.name}] [sampling=${this.config.sampling?.type}] [bridge=${!!this.config.bridge}]`,\n );\n }\n\n // ============================================================================\n // Protected getters for clean config access\n // ============================================================================\n\n protected get exporters(): ObservabilityExporter[] {\n return this.config.exporters || [];\n }\n\n protected get spanOutputProcessors(): SpanOutputProcessor[] {\n return this.config.spanOutputProcessors || [];\n }\n\n // ============================================================================\n // Public API - Single type-safe span creation method\n // ============================================================================\n\n /**\n * Start a new span of a specific SpanType\n *\n * Sampling Decision:\n * - For root spans (no parent): Perform sampling check using the configured strategy\n * - For child spans: Inherit the sampling decision from the parent\n * - If parent is a NoOpSpan (not sampled), child is also a NoOpSpan\n * - If parent is a valid span (sampled), child is also sampled\n *\n * This ensures trace-level sampling: either all spans in a trace are sampled or none are.\n * See: https://github.com/mastra-ai/mastra/issues/11504\n */\n startSpan<TType extends SpanType>(options: StartSpanOptions<TType>): Span<TType> {\n const { customSamplerOptions, requestContext, metadata, tracingOptions, ...rest } = options;\n\n // Determine sampling: inherit from parent or make new decision for root spans\n if (options.parent) {\n // Child span: inherit sampling decision from parent\n // If parent is a NoOpSpan (not sampled), child should also be a NoOpSpan\n if (!options.parent.isValid) {\n return new NoOpSpan<TType>({ ...rest, metadata }, this);\n }\n // Parent is valid (sampled), so child will also be sampled - continue to create actual span\n } else {\n // Root span: perform sampling check\n if (!this.shouldSample(customSamplerOptions)) {\n return new NoOpSpan<TType>({ ...rest, metadata }, this);\n }\n }\n\n // Compute or inherit TraceState\n let traceState: TraceState | undefined;\n\n if (options.parent) {\n // Child span: inherit from parent\n traceState = options.parent.traceState;\n } else {\n // Root span: compute new TraceState\n traceState = this.computeTraceState(tracingOptions);\n }\n\n // Merge tracingOptions.metadata with span metadata (tracingOptions.metadata takes precedence for root spans)\n const tracingMetadata = !options.parent ? tracingOptions?.metadata : undefined;\n const mergedMetadata = metadata || tracingMetadata ? { ...metadata, ...tracingMetadata } : undefined;\n\n // Extract metadata from RequestContext\n const enrichedMetadata = this.extractMetadataFromRequestContext(requestContext, mergedMetadata, traceState);\n\n // Inject the Mastra-level environment into root-span metadata when nothing\n // upstream provided one. Root-only is sufficient because BaseSpan inherits\n // parent metadata, so descendants pick the value up automatically.\n // Persisting it on metadata (rather than only computing it in\n // getCorrelationContext) is what lets the storage record-builders populate\n // the `environment` column on SpanRecord, which is then read by stored\n // score/feedback events via RecordedSpan / RecordedTrace.addScore.\n const finalMetadata =\n !options.parent &&\n this.#mastraEnvironment !== undefined &&\n (enrichedMetadata === undefined || enrichedMetadata.environment === undefined)\n ? { ...(enrichedMetadata ?? {}), environment: this.#mastraEnvironment }\n : enrichedMetadata;\n\n // Tags are only passed for root spans (no parent)\n const tags = !options.parent ? tracingOptions?.tags : undefined;\n\n // Extract traceId and parentSpanId from tracingOptions for root spans (no parent)\n // These allow nested workflows to join the parent workflow's trace\n const traceId = !options.parent ? (options.traceId ?? tracingOptions?.traceId) : options.traceId;\n const parentSpanId = !options.parent\n ? (options.parentSpanId ?? tracingOptions?.parentSpanId)\n : options.parentSpanId;\n\n const span = this.createSpan<TType>({\n ...rest,\n traceId,\n parentSpanId,\n metadata: finalMetadata,\n traceState,\n tags,\n requestContext,\n });\n\n if (span.isEvent) {\n this.emitSpanEnded(span);\n } else {\n // Automatically wire up tracing lifecycle\n this.wireSpanLifecycle(span);\n\n // Emit span started event\n this.emitSpanStarted(span);\n }\n\n return span;\n }\n\n /**\n * Rebuild a span from exported data for lifecycle operations.\n * Used by durable execution engines (e.g., Inngest) to end/update spans\n * that were created in a previous durable operation.\n *\n * The rebuilt span:\n * - Does NOT emit SPAN_STARTED (assumes original span already did)\n * - Can have end(), update(), error() called on it\n * - Will emit SPAN_ENDED or SPAN_UPDATED when those methods are called\n *\n * @param cached - The exported span data to rebuild from\n * @returns A span that can have lifecycle methods called on it\n */\n rebuildSpan<TType extends SpanType>(cached: ExportedSpan<TType>): Span<TType> {\n // Create span with existing IDs from cached data\n const span = this.createSpan<TType>({\n name: cached.name,\n type: cached.type,\n traceId: cached.traceId,\n spanId: cached.id,\n parentSpanId: cached.parentSpanId,\n startTime: cached.startTime instanceof Date ? cached.startTime : new Date(cached.startTime),\n input: cached.input,\n attributes: cached.attributes,\n metadata: cached.metadata,\n entityType: cached.entityType,\n entityId: cached.entityId,\n entityName: cached.entityName,\n });\n\n // Wire up lifecycle events (but skip SPAN_STARTED since it was already emitted)\n this.wireSpanLifecycle(span);\n\n return span;\n }\n\n // ============================================================================\n // Abstract Methods - Must be implemented by concrete classes\n // ============================================================================\n\n /**\n * Create a new span (called after sampling)\n *\n * Implementations should:\n * 1. Create a plain span with the provided attributes\n * 2. Return the span - base class handles all tracing lifecycle automatically\n *\n * The base class will automatically:\n * - Set trace relationships\n * - Wire span lifecycle callbacks\n * - Emit span_started event\n */\n protected abstract createSpan<TType extends SpanType>(options: CreateSpanOptions<TType>): Span<TType>;\n\n // ============================================================================\n // Configuration Management\n // ============================================================================\n\n /**\n * Get current configuration\n */\n getConfig(): Readonly<ObservabilityInstanceConfig> {\n return { ...this.config };\n }\n\n /**\n * Returns the deployment environment propagated from the parent Mastra instance.\n * Spans use this as a fallback when `metadata.environment` isn't set.\n */\n getMastraEnvironment(): string | undefined {\n return this.#mastraEnvironment;\n }\n\n /**\n * Internal hook used by `Observability.setMastraContext` to push the\n * resolved Mastra-level environment into this instance.\n */\n __setMastraEnvironment(environment: string | undefined): void {\n this.#mastraEnvironment = environment;\n }\n\n // ============================================================================\n // Plugin Access\n // ============================================================================\n\n /**\n * Get all exporters\n */\n getExporters(): readonly ObservabilityExporter[] {\n return [...this.exporters];\n }\n\n /**\n * Register an additional exporter at runtime.\n * Adds to both the bus (for event routing) and the config (for getExporters).\n */\n registerExporter(exporter: ObservabilityExporter): void {\n this.observabilityBus.registerExporter(exporter);\n this.config.exporters ??= [];\n if (this.config.exporters.includes(exporter)) {\n return;\n }\n this.config.exporters.push(exporter);\n\n if (typeof exporter.__setLogger === 'function') {\n exporter.__setLogger(this.logger);\n }\n }\n\n /**\n * Get all span output processors\n */\n getSpanOutputProcessors(): readonly SpanOutputProcessor[] {\n return [...this.spanOutputProcessors];\n }\n\n /**\n * Get the bridge instance if configured\n */\n getBridge(): ObservabilityBridge | undefined {\n return this.config.bridge;\n }\n\n /**\n * Get the logger instance (for exporters and other components)\n */\n getLogger() {\n return this.logger;\n }\n\n /**\n * Get the ObservabilityBus for this instance.\n * The bus routes all observability events (tracing, logs, metrics, scores, feedback)\n * to registered exporters based on event type.\n */\n getObservabilityBus(): ObservabilityBus {\n return this.observabilityBus;\n }\n\n // ============================================================================\n // Context-factory bridge methods\n // ============================================================================\n\n /**\n * Get a LoggerContext correlated to a span.\n * Called by the context-factory in core (deriveLoggerContext) so that\n * `observabilityContext.loggerVNext` is a real logger instead of no-op.\n */\n getLoggerContext(span?: AnySpan): LoggerContext {\n if (this.config.logging?.enabled === false) {\n return noOpLoggerContext;\n }\n\n const correlationContext = span?.getCorrelationContext?.();\n const metadata: Record<string, unknown> | undefined = span?.metadata ? structuredClone(span.metadata) : undefined;\n\n return new LoggerContextImpl({\n traceId: span?.traceId,\n spanId: span?.id,\n correlationContext,\n metadata,\n observabilityBus: this.observabilityBus,\n minLevel: this.config.logging?.level,\n });\n }\n\n /**\n * Get a MetricsContext correlated to a span.\n * Called by the context-factory in core (deriveMetricsContext) so that\n * `observabilityContext.metrics` is a real metrics context instead of no-op.\n */\n getMetricsContext(span?: AnySpan): MetricsContext {\n const correlationContext = span?.getCorrelationContext?.();\n const metadata: Record<string, unknown> | undefined = span?.metadata ? structuredClone(span.metadata) : undefined;\n\n return new MetricsContextImpl({\n traceId: span?.traceId,\n spanId: span?.id,\n correlationContext,\n metadata,\n cardinalityFilter: this.cardinalityFilter,\n observabilityBus: this.observabilityBus,\n });\n }\n\n /**\n * Emit any observability event through the bus.\n * The bus routes the event to the appropriate handler on each registered exporter,\n * and for tracing events triggers auto-extracted metrics.\n */\n protected emitObservabilityEvent(event: ObservabilityEvent): void {\n this.observabilityBus.emit(event);\n }\n\n /**\n * Internal hook used by RecordedTrace/RecordedSpan hydration to route\n * non-tracing annotation events back through the normal exporter pipeline.\n */\n __emitRecordedEvent(event: ObservabilityEvent): void {\n this.emitObservabilityEvent(event);\n }\n\n /**\n * Internal hook used by the client observability proxy (`client/`)\n * to route already-validated events through the normal bus without\n * going through the live span lifecycle. The caller is responsible\n * for constructing well-formed `ExportedSpan`s/`ExportedLog`s and\n * for any validation needed.\n */\n __receiveExternalEvent(event: ObservabilityEvent): void {\n this.emitObservabilityEvent(event);\n }\n\n // ============================================================================\n // Span Lifecycle Management\n // ============================================================================\n\n /**\n * Automatically wires up Observability lifecycle events for any span\n * This ensures all spans emit events regardless of implementation\n */\n private wireSpanLifecycle<TType extends SpanType>(span: Span<TType>): void {\n // Skip wiring for filtered internal spans, except MODEL_GENERATION —\n // those need the wrap so captureModelUsageRollup can intercept usage\n // before originalEnd discards it. Other internal types (AGENT_RUN,\n // WORKFLOW_RUN, MODEL_STEP, MODEL_CHUNK, …) carry nothing to roll up,\n // and skipping the closure-per-span cost matters in streaming hot\n // paths like per-chunk MODEL_CHUNK spans.\n if (!this.config.includeInternalSpans && span.isInternal && span.type !== SpanType.MODEL_GENERATION) {\n return;\n }\n\n // Store original methods\n const originalEnd = span.end.bind(span);\n const originalUpdate = span.update.bind(span);\n\n // Wrap methods to automatically emit tracing events\n span.end = (options?: EndSpanOptions<TType>) => {\n if (span.isEvent) {\n this.logger.warn(`End event is not available on event spans`);\n return;\n }\n\n // Capture rollup usage BEFORE originalEnd runs: excluded spans\n // drop end-time attributes (see DefaultSpan#end), so the only\n // place to read MODEL_GENERATION usage for a filtered span is the\n // end() options being passed in right now.\n const rollupTarget = this.captureModelUsageRollup(span, options);\n\n originalEnd(options);\n\n if (rollupTarget) {\n this.applyUsageRollup(rollupTarget);\n }\n\n this.emitSpanEnded(span);\n };\n\n span.update = (options: UpdateSpanOptions<TType>) => {\n if (span.isEvent) {\n this.logger.warn(`Update() is not available on event spans`);\n return;\n }\n originalUpdate(options);\n this.emitSpanUpdated(span);\n };\n }\n\n // ============================================================================\n // Utility Methods\n // ============================================================================\n\n /**\n * Check if a trace should be sampled\n */\n protected shouldSample(options?: CustomSamplerOptions): boolean {\n // Check built-in sampling strategy\n const { sampling } = this.config;\n\n switch (sampling?.type) {\n case undefined:\n return true;\n case SamplingStrategyType.ALWAYS:\n return true;\n case SamplingStrategyType.NEVER:\n return false;\n case SamplingStrategyType.RATIO:\n if (sampling.probability === undefined || sampling.probability < 0 || sampling.probability > 1) {\n this.logger.warn(\n `Invalid sampling probability: ${sampling.probability}. Expected value between 0 and 1. Defaulting to no sampling.`,\n );\n return false;\n }\n return Math.random() < sampling.probability;\n case SamplingStrategyType.CUSTOM:\n return sampling.sampler(options);\n default:\n throw new Error(`Sampling strategy type not implemented: ${(sampling as any).type}`);\n }\n }\n\n /**\n * Compute TraceState for a new trace based on configured and per-request keys\n */\n protected computeTraceState(tracingOptions?: TracingOptions): TraceState | undefined {\n const configuredKeys = this.config.requestContextKeys ?? [];\n const additionalKeys = tracingOptions?.requestContextKeys ?? [];\n\n // Merge: configured + additional\n const allKeys = [...configuredKeys, ...additionalKeys];\n\n const hideInput = tracingOptions?.hideInput;\n const hideOutput = tracingOptions?.hideOutput;\n\n // Return undefined if no TraceState properties are needed\n if (allKeys.length === 0 && !hideInput && !hideOutput) {\n return undefined;\n }\n\n return {\n requestContextKeys: allKeys,\n ...(hideInput !== undefined && { hideInput }),\n ...(hideOutput !== undefined && { hideOutput }),\n };\n }\n\n /**\n * Extract metadata from RequestContext using TraceState\n */\n protected extractMetadataFromRequestContext(\n requestContext: RequestContext | undefined,\n explicitMetadata: Record<string, any> | undefined,\n traceState: TraceState | undefined,\n ): Record<string, any> | undefined {\n if (!requestContext || !traceState || traceState.requestContextKeys.length === 0) {\n return explicitMetadata;\n }\n\n const extracted = this.extractKeys(requestContext, traceState.requestContextKeys);\n\n // Only return an object if we have extracted or explicit metadata\n if (Object.keys(extracted).length === 0 && !explicitMetadata) {\n return undefined;\n }\n\n return {\n ...extracted,\n ...explicitMetadata, // Explicit metadata always wins\n };\n }\n\n /**\n * Extract specific keys from RequestContext\n */\n protected extractKeys(requestContext: RequestContext, keys: string[]): Record<string, any> {\n const result: Record<string, any> = {};\n\n for (const key of keys) {\n // Handle dot notation: get first part from RequestContext, then navigate nested properties\n const parts = key.split('.');\n const rootKey = parts[0]!; // parts[0] always exists since key is a non-empty string\n const value = requestContext.get(rootKey);\n\n if (value !== undefined) {\n // If there are nested parts, extract them from the value\n if (parts.length > 1) {\n const nestedPath = parts.slice(1).join('.');\n const nestedValue = getNestedValue(value, nestedPath);\n if (nestedValue !== undefined) {\n setNestedValue(result, key, nestedValue);\n }\n } else {\n // Simple key, set directly\n setNestedValue(result, key, value);\n }\n }\n }\n\n return result;\n }\n\n /**\n * Process a span through all output processors\n */\n private processSpan(span?: AnySpan): AnySpan | undefined {\n for (const processor of this.spanOutputProcessors) {\n if (!span) {\n break;\n }\n\n try {\n span = processor.process(span);\n } catch (error) {\n this.logger.error(`[Observability] Processor error [name=${processor.name}]`, error);\n // Continue with other processors\n }\n }\n\n return span;\n }\n\n // ============================================================================\n // Event-driven Export Methods\n // ============================================================================\n\n /** Process a span through output processors and export it, returning undefined if filtered out. */\n getSpanForExport(span: AnySpan): AnyExportedSpan | undefined {\n if (!span.isValid) return undefined;\n if (span.isInternal && !this.config.includeInternalSpans) return undefined;\n\n // Check excludeSpanTypes before processing\n if (this.config.excludeSpanTypes?.includes(span.type)) return undefined;\n\n const processedSpan = this.processSpan(span);\n const exportedSpan = processedSpan?.exportSpan(this.config.includeInternalSpans);\n if (!exportedSpan) return undefined;\n\n // Apply spanFilter on the exported span data\n if (this.config.spanFilter) {\n try {\n if (!this.config.spanFilter(exportedSpan)) return undefined;\n } catch (error) {\n this.logger.error(`[Observability] spanFilter error`, error);\n // On filter error, keep the span to avoid silent data loss\n }\n }\n\n return exportedSpan;\n }\n\n /**\n * Emit a span started event.\n * Routes through the ObservabilityBus so exporters receive it via onTracingEvent.\n */\n protected emitSpanStarted(span: AnySpan): void {\n const exportedSpan = this.getSpanForExport(span);\n if (exportedSpan) {\n const event: TracingEvent = { type: TracingEventType.SPAN_STARTED, exportedSpan };\n this.emitTracingEvent(event);\n }\n }\n\n /**\n * Emit a span ended event (called automatically when spans end).\n * Emits any auto-extracted metrics while the live span tree is still available,\n * then routes the exported tracing event through the ObservabilityBus.\n */\n protected emitSpanEnded(span: AnySpan): void {\n const exportedSpan = this.getSpanForExport(span);\n\n if (exportedSpan) {\n try {\n // TODO: We intentionally export first so auto-extracted metrics are skipped\n // when the span is filtered out by processors. Metrics still use the live\n // span for correlation and parent traversal, but current span processors\n // mutate spans in place during export, so those mutations can still affect\n // the live span before metrics run. Future options to explore:\n // 1. Make span processors pure/non-mutating.\n // 2. Split trace processors from metric-specific processors/enrichers.\n // 3. Revisit whether auto-extracted metrics should run before export.\n emitAutoExtractedMetrics(span, this.getMetricsContext(span));\n } catch (err) {\n this.logger.error('[Observability] Auto-extraction error:', err);\n }\n\n const event: TracingEvent = { type: TracingEventType.SPAN_ENDED, exportedSpan };\n this.emitTracingEvent(event);\n }\n }\n\n /**\n * Emit a span updated event.\n * Routes through the ObservabilityBus so exporters receive it via onTracingEvent.\n */\n protected emitSpanUpdated(span: AnySpan): void {\n const exportedSpan = this.getSpanForExport(span);\n if (exportedSpan) {\n const event: TracingEvent = { type: TracingEventType.SPAN_UPDATED, exportedSpan };\n this.emitTracingEvent(event);\n }\n }\n\n /**\n * When an internal MODEL_GENERATION span ends, capture the rollup payload\n * (usage, provider, model, target ancestor) needed to attribute its cost\n * to the closest exported ancestor span. Returns undefined when no rollup\n * applies — non-MODEL_GENERATION spans, spans that will be exported, or\n * spans whose usage isn't available at end time.\n */\n private captureModelUsageRollup<TType extends SpanType>(\n span: Span<TType>,\n endOptions: EndSpanOptions<TType> | undefined,\n ): { ancestor: AnySpan; usage: UsageStats; provider?: string; model?: string } | undefined {\n if (span.type !== SpanType.MODEL_GENERATION) return undefined;\n // If the span itself will be exported, the existing auto-extract pipeline\n // emits its metrics; nothing to roll up.\n if (!span.isInternal || this.config.includeInternalSpans) return undefined;\n\n // For excluded spans, end() options carry the only copy of attributes —\n // the live span discards them in DefaultSpan#end. The liveAttrs fallback\n // is dead for the default implementation but kept for non-DefaultSpan\n // Span implementations that might preserve attributes on excluded spans.\n const endAttrs = (endOptions?.attributes as ModelGenerationAttributes | undefined) ?? undefined;\n const liveAttrs = span.attributes as ModelGenerationAttributes | undefined;\n const usage = endAttrs?.usage ?? liveAttrs?.usage;\n if (!usage) return undefined;\n\n const ancestor = this.findExportedAncestor(span);\n if (!ancestor) return undefined;\n\n const provider = endAttrs?.provider ?? liveAttrs?.provider;\n const model = endAttrs?.responseModel ?? endAttrs?.model ?? liveAttrs?.responseModel ?? liveAttrs?.model;\n\n return { ancestor, usage, provider, model };\n }\n\n /**\n * Accumulate usage onto the ancestor's `internalUsage` attribute (for trace\n * UI visibility) and emit auto-extracted token metrics now, using the\n * ancestor's metrics context so cost / token labels point at the visible\n * span instead of the hidden agent that incurred them.\n */\n private applyUsageRollup(target: { ancestor: AnySpan; usage: UsageStats; provider?: string; model?: string }): void {\n const { ancestor, usage, provider, model } = target;\n\n // Mutate the live ancestor's attributes directly. BaseSpan's constructor\n // guarantees `attributes` is always at least `{}` (see spans/base.ts),\n // and the ancestor hasn't ended yet (we're inside a descendant's end()),\n // so the export will pick up the mutated field.\n const attrs = ancestor.attributes as { internalUsage?: UsageStats };\n attrs.internalUsage = addUsageStats(attrs.internalUsage, usage);\n\n try {\n emitTokenMetricsForUsage(usage, provider, model, this.getMetricsContext(ancestor));\n } catch (err) {\n this.logger.error('[Observability] Usage rollup metric emission error:', err);\n }\n }\n\n /**\n * Walk up the parent chain to find the closest ancestor that will actually\n * reach exporters. Skips both internal-filtered ancestors and ancestors\n * whose type matches `excludeSpanTypes`, so the rollup target is one whose\n * mutated `internalUsage` attribute is visible in exported traces.\n *\n * Note: this does not preemptively run `spanFilter` — that filter can be\n * async and have side effects, so the rare case of a `spanFilter`-dropped\n * ancestor falls through.\n */\n private findExportedAncestor(span: AnySpan): AnySpan | undefined {\n let ancestor: AnySpan | undefined = span.parent;\n while (ancestor && this.isFilteredFromExport(ancestor)) {\n ancestor = ancestor.parent;\n }\n return ancestor;\n }\n\n /**\n * Returns true when a span would be dropped by `getSpanForExport` for a\n * reason cheap to check up-front (internal-span filtering or\n * `excludeSpanTypes`). Used by `findExportedAncestor` to skip rollup\n * targets that would silently lose their `internalUsage` attribute.\n */\n private isFilteredFromExport(span: AnySpan): boolean {\n if (span.isInternal && !this.config.includeInternalSpans) return true;\n if (this.config.excludeSpanTypes?.includes(span.type)) return true;\n return false;\n }\n\n /**\n * Emit a tracing event through the bus.\n *\n * The bus routes the event to each registered exporter's and bridge's\n * onTracingEvent handler.\n */\n private emitTracingEvent(event: TracingEvent): void {\n this.observabilityBus.emit(event);\n }\n\n /**\n * Export tracing event through all exporters and bridge.\n *\n * @deprecated Prefer emitTracingEvent() which routes through the bus.\n * Kept for backward compatibility with subclasses that may override it.\n */\n protected async exportTracingEvent(event: TracingEvent): Promise<void> {\n // Collect all export targets\n const targets: Array<{ name: string; exportTracingEvent: (event: TracingEvent) => Promise<void> }> = [\n ...this.exporters,\n ];\n\n // Add bridge if present\n if (this.config.bridge) {\n targets.push(this.config.bridge);\n }\n\n // Export to all targets\n const exportPromises = targets.map(async target => {\n try {\n await target.exportTracingEvent(event);\n this.logger.debug(`[Observability] Event exported [target=${target.name}] [type=${event.type}]`);\n } catch (error) {\n this.logger.error(`[Observability] Export error [target=${target.name}]`, error);\n // Don't rethrow - continue with other targets\n }\n });\n\n await Promise.allSettled(exportPromises);\n }\n\n // ============================================================================\n // Lifecycle Management\n // ============================================================================\n\n /**\n * Initialize Observability (called by Mastra during component registration)\n */\n init(): void {\n this.logger.debug(`[Observability] Initialization started [name=${this.name}]`);\n\n // Any initialization logic for the Observability system\n // This could include setting up queues, starting background processes, etc.\n\n this.logger.info(`[Observability] Initialized successfully [name=${this.name}]`);\n }\n\n /**\n * Flush all observability data: awaits in-flight handler promises, then\n * drains exporter and bridge SDK-internal buffers.\n *\n * Delegates to ObservabilityBus.flush() which owns the two-phase logic.\n *\n * This is critical for durable execution engines (e.g., Inngest) where\n * the process may be interrupted after a step completes. Calling flush()\n * outside the durable step ensures all span data reaches external systems.\n */\n async flush(): Promise<void> {\n this.logger.debug(`[Observability] Flush started [name=${this.name}]`);\n await this.observabilityBus.flush();\n this.logger.debug(`[Observability] Flush completed [name=${this.name}]`);\n }\n\n /**\n * Shutdown Observability and clean up resources\n */\n async shutdown(): Promise<void> {\n this.logger.debug(`[Observability] Shutdown started [name=${this.name}]`);\n\n // Phase 1: Shutdown the ObservabilityBus first (flushes remaining events, clears subscribers)\n await this.observabilityBus.shutdown();\n\n // Phase 2: Shutdown exporters, processors, and bridge after bus has flushed\n const shutdownPromises: Promise<void>[] = [\n ...this.exporters.map(e => e.shutdown()),\n ...this.spanOutputProcessors.map(p => p.shutdown()),\n ];\n if (this.config.bridge) {\n shutdownPromises.push(this.config.bridge.shutdown());\n }\n if (shutdownPromises.length > 0) {\n const results = await Promise.allSettled(shutdownPromises);\n for (const result of results) {\n if (result.status === 'rejected') {\n this.logger.error(`[Observability] Component shutdown failed [name=${this.name}]:`, result.reason);\n }\n }\n }\n\n this.logger.info(`[Observability] Shutdown completed [name=${this.name}]`);\n }\n}\n","export function generateClientSignalId(): string {\n return globalThis.crypto.randomUUID();\n}\n","/**\n * Hand-rolled OTLP/JSON decoder for the subset we need to ingest from\n * client-side tool execution.\n *\n * The full OTLP/JSON spec is defined in\n * https://opentelemetry.io/docs/specs/otlp/#otlphttp and the\n * opentelemetry-proto repo. We only consume `ResourceSpans` (for spans)\n * and `ResourceLogs` (for logs). The full message types are large and\n * include backwards-compat fields we never need; this walker reads the\n * fields we care about and ignores the rest.\n *\n * Using `@opentelemetry/otlp-transformer` would pull in the full proto\n * dependency tree (~hundreds of KB) for what amounts to a 100-line walker.\n */\n\nimport { SpanType } from '@mastra/core/observability';\nimport type { AnyExportedSpan, EntityType, ExportedLog, LogLevel } from '@mastra/core/observability';\n\nimport { generateClientSignalId } from './id';\n\n/**\n * Convert an OTLP nanosecond timestamp (string or number) to a JS Date.\n *\n * OTLP timestamps are uint64 nanoseconds since Unix epoch. JSON\n * marshalers serialize them as either decimal strings (recommended for\n * uint64 to avoid JS number precision loss) or numbers.\n */\nfunction nanosToDate(value: unknown): Date {\n if (typeof value === 'number') {\n return new Date(Math.round(value / 1e6));\n }\n if (typeof value === 'string') {\n // Avoid BigInt in hot path; just take the millisecond portion of the\n // decimal string. ns=19 chars max, ms=last 6 chars before the cut.\n if (value.length <= 6) return new Date(0);\n const ms = Number(value.slice(0, -6));\n return Number.isFinite(ms) ? new Date(ms) : new Date(0);\n }\n return new Date(0);\n}\n\n/**\n * OTLP attribute values are tagged unions:\n * `{ stringValue: \"...\" } | { intValue: 1 } | { boolValue: true } | ...`\n * Flatten to a plain `Record<string, unknown>` for our internal shape.\n */\nfunction flattenAttributes(otlpAttrs: unknown): Record<string, unknown> | undefined {\n if (!Array.isArray(otlpAttrs)) return undefined;\n const out: Record<string, unknown> = {};\n for (const attr of otlpAttrs) {\n if (!attr || typeof attr !== 'object') continue;\n const key = (attr as { key?: unknown }).key;\n if (typeof key !== 'string') continue;\n const v = (attr as { value?: unknown }).value;\n if (!v || typeof v !== 'object') continue;\n const value = v as Record<string, unknown>;\n if ('stringValue' in value) out[key] = value.stringValue;\n else if ('intValue' in value) out[key] = Number(value.intValue);\n else if ('doubleValue' in value) out[key] = value.doubleValue;\n else if ('boolValue' in value) out[key] = value.boolValue;\n else if ('arrayValue' in value || 'kvlistValue' in value) {\n // Nested values are uncommon for our use case; preserve raw shape.\n out[key] = value;\n }\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\n/**\n * Decoded shape of one span pulled out of an OTLP/JSON ResourceSpans\n * payload. Just enough fields to construct an ExportedSpan and forward\n * it through the bus.\n */\nexport interface DecodedOtlpSpan {\n traceId: string;\n spanId: string;\n parentSpanId?: string;\n name: string;\n startTime: Date;\n endTime?: Date;\n attributes?: Record<string, unknown>;\n /** OTLP status code: 0 unset, 1 ok, 2 error */\n statusCode?: number;\n statusMessage?: string;\n}\n\nexport interface DecodedOtlpLog {\n traceId: string;\n spanId?: string;\n timestamp: Date;\n /** OTLP severityText: \"INFO\", \"WARN\", etc. */\n severityText?: string;\n /** OTLP severityNumber: 1-24 */\n severityNumber?: number;\n body?: unknown;\n attributes?: Record<string, unknown>;\n}\n\n/**\n * Walk an OTLP/JSON ResourceSpans payload and return a flat list of\n * decoded spans. Returns an empty array (and never throws) if the\n * payload is malformed.\n */\nexport function decodeResourceSpans(payload: unknown): DecodedOtlpSpan[] {\n const out: DecodedOtlpSpan[] = [];\n const resourceSpans = (payload as { resourceSpans?: unknown[] } | undefined)?.resourceSpans;\n if (!Array.isArray(resourceSpans)) return out;\n\n for (const rs of resourceSpans) {\n const scopeSpans = (rs as { scopeSpans?: unknown[] } | undefined)?.scopeSpans;\n if (!Array.isArray(scopeSpans)) continue;\n for (const ss of scopeSpans) {\n const spans = (ss as { spans?: unknown[] } | undefined)?.spans;\n if (!Array.isArray(spans)) continue;\n for (const span of spans) {\n if (!span || typeof span !== 'object') continue;\n const s = span as Record<string, unknown>;\n const traceId = typeof s.traceId === 'string' ? s.traceId : undefined;\n const spanId = typeof s.spanId === 'string' ? s.spanId : undefined;\n const name = typeof s.name === 'string' ? s.name : undefined;\n if (!traceId || !spanId || !name) continue;\n const decoded: DecodedOtlpSpan = {\n traceId,\n spanId,\n parentSpanId: typeof s.parentSpanId === 'string' && s.parentSpanId ? s.parentSpanId : undefined,\n name,\n startTime: nanosToDate(s.startTimeUnixNano),\n endTime: s.endTimeUnixNano !== undefined ? nanosToDate(s.endTimeUnixNano) : undefined,\n attributes: flattenAttributes(s.attributes),\n };\n const status = s.status as Record<string, unknown> | undefined;\n if (status && typeof status === 'object') {\n if (typeof status.code === 'number') decoded.statusCode = status.code;\n if (typeof status.message === 'string') decoded.statusMessage = status.message;\n }\n out.push(decoded);\n }\n }\n }\n return out;\n}\n\nexport function decodeResourceLogs(payload: unknown): DecodedOtlpLog[] {\n const out: DecodedOtlpLog[] = [];\n const resourceLogs = (payload as { resourceLogs?: unknown[] } | undefined)?.resourceLogs;\n if (!Array.isArray(resourceLogs)) return out;\n\n for (const rl of resourceLogs) {\n const scopeLogs = (rl as { scopeLogs?: unknown[] } | undefined)?.scopeLogs;\n if (!Array.isArray(scopeLogs)) continue;\n for (const sl of scopeLogs) {\n const logRecords = (sl as { logRecords?: unknown[] } | undefined)?.logRecords;\n if (!Array.isArray(logRecords)) continue;\n for (const record of logRecords) {\n if (!record || typeof record !== 'object') continue;\n const r = record as Record<string, unknown>;\n const traceId = typeof r.traceId === 'string' ? r.traceId : undefined;\n if (!traceId) continue;\n // OTLP log body is a tagged union like attributes; we accept the\n // common stringValue case and otherwise pass through.\n let body: unknown = r.body;\n if (body && typeof body === 'object' && 'stringValue' in (body as Record<string, unknown>)) {\n body = (body as Record<string, unknown>).stringValue;\n }\n out.push({\n traceId,\n spanId: typeof r.spanId === 'string' && r.spanId ? r.spanId : undefined,\n timestamp: r.timeUnixNano !== undefined ? nanosToDate(r.timeUnixNano) : nanosToDate(r.observedTimeUnixNano),\n severityText: typeof r.severityText === 'string' ? r.severityText : undefined,\n severityNumber: typeof r.severityNumber === 'number' ? r.severityNumber : undefined,\n body,\n attributes: flattenAttributes(r.attributes),\n });\n }\n }\n }\n return out;\n}\n\n/**\n * Translate an OTLP severity (text or number) to a Mastra LogLevel.\n *\n * OTEL severity numbers per spec:\n * 1-4 trace, 5-8 debug, 9-12 info, 13-16 warn, 17-20 error, 21-24 fatal.\n */\nexport function otlpSeverityToLogLevel(text: string | undefined, num: number | undefined): LogLevel {\n if (text) {\n const lc = text.toLowerCase();\n if (lc.startsWith('trace') || lc.startsWith('debug')) return 'debug';\n if (lc.startsWith('info')) return 'info';\n if (lc.startsWith('warn')) return 'warn';\n if (lc.startsWith('error')) return 'error';\n if (lc.startsWith('fatal')) return 'fatal';\n }\n if (typeof num === 'number') {\n if (num <= 8) return 'debug';\n if (num <= 12) return 'info';\n if (num <= 16) return 'warn';\n if (num <= 20) return 'error';\n return 'fatal';\n }\n return 'info';\n}\n\n/**\n * Convert a decoded OTLP span into the Mastra ExportedSpan shape so it\n * can be emitted via the observability bus.\n *\n * All ingested spans use SpanType.GENERIC because we don't know what\n * the user instrumented inside their client tool. The original span\n * name and attributes are preserved.\n */\nexport function buildExportedSpan(\n decoded: DecodedOtlpSpan,\n options: { entityType?: EntityType; entityName?: string; isInternal?: boolean } = {},\n): AnyExportedSpan {\n const errorInfo =\n decoded.statusCode === 2\n ? {\n message: decoded.statusMessage ?? 'Client tool span reported error status',\n // SpanErrorInfo allows extra fields; keep the minimum.\n }\n : undefined;\n return {\n id: decoded.spanId,\n traceId: decoded.traceId,\n name: decoded.name,\n type: SpanType.GENERIC,\n parentSpanId: decoded.parentSpanId,\n isRootSpan: !decoded.parentSpanId,\n startTime: decoded.startTime,\n endTime: decoded.endTime,\n attributes: decoded.attributes,\n entityType: options.entityType,\n entityName: options.entityName,\n isEvent: false,\n ...(errorInfo ? { errorInfo: errorInfo as any } : {}),\n } as AnyExportedSpan;\n}\n\nexport function buildExportedLog(decoded: DecodedOtlpLog): ExportedLog {\n return {\n logId: generateClientSignalId(),\n timestamp: decoded.timestamp,\n traceId: decoded.traceId,\n spanId: decoded.spanId,\n level: otlpSeverityToLogLevel(decoded.severityText, decoded.severityNumber),\n message: typeof decoded.body === 'string' ? decoded.body : decoded.body !== undefined ? String(decoded.body) : '',\n data: decoded.attributes,\n };\n}\n","/**\n * Hand-rolled W3C Trace Context and Baggage propagation.\n *\n * The full propagators in `@opentelemetry/core` weigh ~27KB gzipped.\n * The W3C specs (https://www.w3.org/TR/trace-context/, https://www.w3.org/TR/baggage/)\n * are simple text formats; for the small subset we need (parse and\n * format `traceparent`, parse and format `baggage`), hand-rolling is\n * cheaper and avoids adding an OTEL dependency to @mastra/observability.\n */\n\nconst TRACEPARENT_RE = /^([0-9a-f]{2})-([0-9a-f]{32})-([0-9a-f]{16})-([0-9a-f]{2})$/;\n\nexport interface TraceparentParts {\n /** Version, currently always \"00\". */\n version: string;\n /** 32 hex chars. */\n traceId: string;\n /** 16 hex chars. Refers to the parent span this carrier identifies. */\n spanId: string;\n /** 2 hex chars. Bit 0 is the sampled flag. */\n flags: string;\n}\n\nexport function parseTraceparent(value: string | undefined): TraceparentParts | null {\n if (!value) return null;\n const m = TRACEPARENT_RE.exec(value.trim());\n if (!m) return null;\n if (m[1] === 'ff') return null;\n if (m[2] === '00000000000000000000000000000000') return null;\n if (m[3] === '0000000000000000') return null;\n return { version: m[1]!, traceId: m[2]!, spanId: m[3]!, flags: m[4]! };\n}\n\nexport function formatTraceparent(traceId: string, spanId: string, sampled: boolean): string {\n return `00-${traceId}-${spanId}-${sampled ? '01' : '00'}`;\n}\n\n/**\n * Parse a W3C Baggage header value into a Map.\n *\n * Format: `key=value,key2=value2;property=...`\n * Properties (after `;`) are ignored — we don't use them.\n * Values are percent-decoded per the spec.\n */\nexport function parseBaggage(value: string | undefined): Map<string, string> {\n const out = new Map<string, string>();\n if (!value) return out;\n for (const entry of value.split(',')) {\n const trimmed = entry.trim();\n if (!trimmed) continue;\n // Strip optional `;property=...` suffix\n const semi = trimmed.indexOf(';');\n const head = semi === -1 ? trimmed : trimmed.slice(0, semi);\n const eq = head.indexOf('=');\n if (eq === -1) continue;\n const key = head.slice(0, eq).trim();\n const rawValue = head.slice(eq + 1).trim();\n if (!key) continue;\n let decoded: string;\n try {\n decoded = decodeURIComponent(rawValue);\n } catch {\n decoded = rawValue;\n }\n out.set(key, decoded);\n }\n return out;\n}\n\n/**\n * Format a Map into a W3C Baggage header value.\n * Values are percent-encoded.\n */\nexport function formatBaggage(entries: Map<string, string> | Record<string, string>): string {\n const iter = entries instanceof Map ? entries.entries() : Object.entries(entries);\n const parts: string[] = [];\n for (const [key, value] of iter) {\n if (!key) continue;\n parts.push(`${key}=${encodeURIComponent(value)}`);\n }\n return parts.join(',');\n}\n","/**\n * ClientObservabilityProxy implementation for @mastra/observability.\n *\n * Handles the two halves of the client observability flow:\n *\n * - `inject(parentSpan)` (called from request 1) — produces the W3C\n * carrier the server attaches to the outgoing chunk so the client\n * SDK can extract it and parent its child spans/logs correctly.\n *\n * - `receive(payload, parentContext)` (called from request 2 when the\n * client returns) — decodes the OTLP/JSON payload the client sent\n * back, validates that it actually belongs to the parent trace\n * identified by `parentContext`, and forwards each span/log into\n * the observability bus so existing exporters pick them up.\n */\n\nimport type { IMastraLogger } from '@mastra/core/logger';\nimport { EntityType, TracingEventType } from '@mastra/core/observability';\nimport type {\n AnySpan,\n ClientObservabilityCarrier,\n ClientObservabilityProxy,\n ClientObservabilityPayload,\n LogEvent,\n MetricEvent,\n ObservabilityInstance,\n TracingEvent,\n} from '@mastra/core/observability';\n\nimport { BaseObservabilityInstance } from '../instances/base';\nimport { generateClientSignalId } from './id';\nimport { buildExportedLog, buildExportedSpan, decodeResourceLogs, decodeResourceSpans } from './otlp';\nimport type { DecodedOtlpLog, DecodedOtlpSpan } from './otlp';\nimport { formatTraceparent, parseTraceparent } from './w3c';\n\n/**\n * Hard caps. A misbehaving client could ship arbitrary OTLP; reject\n * payloads that blow past these limits to keep the server safe.\n */\nexport interface ClientObservabilityProxyLimits {\n /** Maximum number of spans accepted per receive call. */\n maxSpans: number;\n /** Maximum number of log records accepted per receive call. */\n maxLogs: number;\n /** Maximum total payload size in bytes (JSON.stringify length). */\n maxPayloadBytes: number;\n}\n\nexport const DEFAULT_LIMITS: ClientObservabilityProxyLimits = {\n maxSpans: 10,\n maxLogs: 10,\n maxPayloadBytes: 1024 * 1024,\n};\n\nexport interface CreateClientObservabilityProxyOptions {\n /**\n * Resolves the observability instance to forward into. Called per\n * `receive()` so config selection works the same way as for\n * server-side spans. Returning `undefined` causes the payload to be\n * dropped silently.\n */\n resolveInstance: () => ObservabilityInstance | undefined;\n /** Logger for warnings about dropped/rejected payloads. */\n logger?: IMastraLogger;\n limits?: Partial<ClientObservabilityProxyLimits>;\n}\n\nclass ClientObservabilityProxyImpl implements ClientObservabilityProxy {\n readonly #resolveInstance: () => ObservabilityInstance | undefined;\n readonly #logger?: IMastraLogger;\n readonly #limits: ClientObservabilityProxyLimits;\n\n constructor(options: CreateClientObservabilityProxyOptions) {\n this.#resolveInstance = options.resolveInstance;\n this.#logger = options.logger;\n this.#limits = { ...DEFAULT_LIMITS, ...options.limits };\n }\n\n inject(parentSpan: AnySpan): ClientObservabilityCarrier {\n return {\n // Mastra spans use OTel-compatible 32-hex traceIds and 16-hex\n // spanIds, so they drop straight into the W3C format. Sampled\n // flag is always 1: if the parent span exists at all, the trace\n // is being recorded server-side, so the client should record too.\n traceparent: formatTraceparent(parentSpan.traceId, parentSpan.id, true),\n };\n }\n\n receive(payload: ClientObservabilityPayload, parentContext: ClientObservabilityCarrier): void {\n if (!payload || (!payload.spans && !payload.logs && payload.executionDurationMs === undefined)) {\n return;\n }\n\n // Size cap before decoding so a hostile payload can't OOM us.\n let payloadBytes = 0;\n try {\n payloadBytes = JSON.stringify(payload).length;\n } catch {\n this.#warn('Client observability payload is not JSON-serializable; dropping.');\n return;\n }\n if (payloadBytes > this.#limits.maxPayloadBytes) {\n this.#warn('Client observability payload exceeds size limit; dropping.', {\n bytes: payloadBytes,\n limit: this.#limits.maxPayloadBytes,\n });\n return;\n }\n\n const parent = parseTraceparent(parentContext.traceparent);\n if (!parent) {\n this.#warn('Client observability parentContext.traceparent is malformed; dropping payload.');\n return;\n }\n\n const instance = this.#resolveInstance();\n if (!instance || !(instance instanceof BaseObservabilityInstance)) {\n // No instance to forward into; silently drop. This is normal in\n // tests and in setups without a default instance configured.\n return;\n }\n\n const decodedSpans = payload.spans ? decodeResourceSpans(payload.spans) : [];\n const decodedLogs = payload.logs ? decodeResourceLogs(payload.logs) : [];\n\n if (decodedSpans.length > this.#limits.maxSpans) {\n this.#warn('Client observability payload exceeds span count limit; dropping.', {\n spans: decodedSpans.length,\n limit: this.#limits.maxSpans,\n });\n return;\n }\n if (decodedLogs.length > this.#limits.maxLogs) {\n this.#warn('Client observability payload exceeds log count limit; dropping.', {\n logs: decodedLogs.length,\n limit: this.#limits.maxLogs,\n });\n return;\n }\n\n // Validation: every span/log traceId must match the parent\n // traceparent. This prevents a hostile client from injecting spans\n // into traces it doesn't own.\n if (!validateTraceIds(decodedSpans, decodedLogs, parent.traceId)) {\n this.#warn('Client observability payload contains spans or logs from a foreign trace; dropping.');\n return;\n }\n\n // Validation: every span's parentSpanId must resolve to the parent\n // span identified by parentContext, or to another span present in\n // this payload. Forbidding orphans prevents broken trees and bounds\n // the trust we place in client input.\n if (!validateParentLinks(decodedSpans, parent.spanId)) {\n this.#warn('Client observability payload contains spans with orphan parents; dropping.');\n return;\n }\n\n // All validation passed; emit through the bus.\n for (const decoded of decodedSpans) {\n const exported = buildExportedSpan(decoded);\n const startedEvent: TracingEvent = { type: TracingEventType.SPAN_STARTED, exportedSpan: exported };\n instance.__receiveExternalEvent(startedEvent);\n // If the span has an end time, also emit the ended event so\n // exporters that only care about completed spans see it.\n if (exported.endTime) {\n const endedEvent: TracingEvent = { type: TracingEventType.SPAN_ENDED, exportedSpan: exported };\n instance.__receiveExternalEvent(endedEvent);\n }\n }\n for (const decoded of decodedLogs) {\n const log = buildExportedLog(decoded);\n const event: LogEvent = { type: 'log', log };\n instance.__receiveExternalEvent(event);\n }\n\n // Emit the actual client-side execution duration. The server-side\n // CLIENT_TOOL_CALL span only measures carrier emission and args\n // capture, not the browser work performed inside execute().\n if (typeof payload.executionDurationMs === 'number') {\n const hasError = decodedSpans.some(s => s.statusCode === 2);\n const metricEvent: MetricEvent = {\n type: 'metric',\n metric: {\n metricId: generateClientSignalId(),\n timestamp: new Date(),\n traceId: parent.traceId,\n spanId: parent.spanId,\n name: 'mastra_tool_duration_ms',\n value: payload.executionDurationMs,\n labels: { status: hasError ? 'error' : 'ok', toolType: 'client' },\n correlationContext: {\n traceId: parent.traceId,\n spanId: parent.spanId,\n entityType: EntityType.TOOL,\n ...(payload.toolName ? { entityName: payload.toolName } : {}),\n },\n },\n };\n instance.__receiveExternalEvent(metricEvent);\n }\n }\n\n #warn(message: string, data?: Record<string, unknown>): void {\n if (this.#logger) {\n this.#logger.warn(`[ClientObservabilityProxy] ${message}`, data);\n }\n }\n}\n\nfunction validateTraceIds(spans: DecodedOtlpSpan[], logs: DecodedOtlpLog[], expected: string): boolean {\n for (const s of spans) if (s.traceId !== expected) return false;\n for (const l of logs) if (l.traceId !== expected) return false;\n return true;\n}\n\nfunction validateParentLinks(spans: DecodedOtlpSpan[], rootParent: string): boolean {\n if (spans.length === 0) return true;\n const known = new Set<string>([rootParent]);\n for (const s of spans) known.add(s.spanId);\n for (const s of spans) {\n if (!s.parentSpanId) {\n return false;\n }\n if (!known.has(s.parentSpanId)) {\n return false;\n }\n }\n return true;\n}\n\nexport function createClientObservabilityProxy(\n options: CreateClientObservabilityProxyOptions,\n): ClientObservabilityProxy {\n return new ClientObservabilityProxyImpl(options);\n}\n","/**\n * Base Exporter for Observability\n *\n * Provides common functionality shared by all observability exporters:\n * - Logger initialization with proper Mastra logger support\n * - Disabled state management\n * - Graceful shutdown lifecycle\n */\n\nimport { ConsoleLogger, LogLevel } from '@mastra/core/logger';\nimport type { IMastraLogger } from '@mastra/core/logger';\nimport type {\n TracingEvent,\n ObservabilityExporter,\n InitExporterOptions,\n CustomSpanFormatter,\n} from '@mastra/core/observability';\n\n/**\n * Base configuration that all exporters should support\n */\nexport interface BaseExporterConfig {\n /** Optional Mastra logger instance */\n logger?: IMastraLogger;\n /** Log level for the exporter (defaults to INFO) - accepts both enum and string */\n logLevel?: LogLevel | 'debug' | 'info' | 'warn' | 'error';\n /**\n * Custom span formatter function to transform exported spans before they are\n * processed by the exporter. This allows customization of how spans appear\n * in vendor-specific observability platforms.\n *\n * Use cases:\n * - Extract plain text from structured AI SDK messages for better readability\n * - Transform input/output format for specific vendor requirements\n * - Add or remove fields based on the target platform\n *\n * @example\n * ```typescript\n * const exporter = new BraintrustExporter({\n * customSpanFormatter: (span) => {\n * // Extract plain text user message for AGENT_RUN spans\n * if (span.type === SpanType.AGENT_RUN && Array.isArray(span.input)) {\n * const userMsg = span.input.find(m => m.role === 'user');\n * return { ...span, input: userMsg?.content ?? span.input };\n * }\n * return span;\n * },\n * });\n * ```\n */\n customSpanFormatter?: CustomSpanFormatter;\n}\n\n/**\n * Abstract base class for observability exporters\n *\n * Handles common concerns:\n * - Logger setup with proper Mastra logger\n * - Disabled state management\n * - Basic lifecycle methods\n *\n * @example\n * ```typescript\n * class MyExporter extends BaseExporter {\n * name = 'my-exporter';\n *\n * constructor(config: MyExporterConfig) {\n * super(config);\n *\n * if (!config.apiKey) {\n * this.setDisabled('Missing API key');\n * return;\n * }\n *\n * // Initialize exporter-specific logic\n * }\n *\n * async _exportEvent(event: TracingEvent): Promise<void> {\n * // Export logic\n * }\n * }\n * ```\n */\nexport abstract class BaseExporter implements ObservabilityExporter {\n /** Exporter name - must be implemented by subclasses */\n abstract name: string;\n\n /** Mastra logger instance */\n protected logger: IMastraLogger;\n\n /** Base configuration (accessible by subclasses) */\n protected readonly baseConfig: BaseExporterConfig;\n\n /** Whether this exporter is disabled */\n #disabled: boolean = false;\n\n /** Public getter for disabled state */\n get isDisabled(): boolean {\n return this.#disabled;\n }\n\n /**\n * Initialize the base exporter with logger\n */\n constructor(config: BaseExporterConfig = {}) {\n this.baseConfig = config;\n // Map string log level to LogLevel enum if needed\n const logLevel = this.resolveLogLevel(config.logLevel);\n // Use constructor name as fallback since this.name isn't set yet (subclass initializes it)\n this.logger = config.logger ?? new ConsoleLogger({ level: logLevel, name: this.constructor.name });\n }\n\n /**\n * Set the logger for the exporter (called by Mastra/ObservabilityInstance during initialization)\n */\n __setLogger(logger: IMastraLogger): void {\n this.logger = logger;\n // Use this.name here since it's guaranteed to be set by the subclass at this point\n this.logger.debug(`Logger updated for exporter [name=${this.name}]`);\n }\n\n /**\n * Convert string log level to LogLevel enum\n */\n private resolveLogLevel(logLevel?: LogLevel | 'debug' | 'info' | 'warn' | 'error'): LogLevel {\n if (!logLevel) {\n return LogLevel.INFO;\n }\n\n // If already a LogLevel enum, return as-is\n if (typeof logLevel === 'number') {\n return logLevel;\n }\n\n // Map string to enum\n const logLevelMap: Record<string, LogLevel> = {\n debug: LogLevel.DEBUG,\n info: LogLevel.INFO,\n warn: LogLevel.WARN,\n error: LogLevel.ERROR,\n };\n\n return logLevelMap[logLevel] ?? LogLevel.INFO;\n }\n\n /**\n * Mark the exporter as disabled and log a message\n *\n * @param reason - Reason why the exporter is disabled\n */\n protected setDisabled(reason: string, level: 'warn' | 'debug' = 'warn'): void {\n this.#disabled = true;\n this.logger[level](`${this.name} disabled: ${reason}`);\n }\n\n /**\n * Apply the customSpanFormatter if configured.\n * This is called automatically by exportTracingEvent before _exportTracingEvent.\n *\n * Supports both synchronous and asynchronous formatters. If the formatter\n * returns a Promise, it will be awaited.\n *\n * @param event - The incoming tracing event\n * @returns The (possibly modified) event to process\n */\n protected async applySpanFormatter(event: TracingEvent): Promise<TracingEvent> {\n if (this.baseConfig.customSpanFormatter) {\n try {\n const formattedSpan = await this.baseConfig.customSpanFormatter(event.exportedSpan);\n return {\n ...event,\n exportedSpan: formattedSpan,\n };\n } catch (error) {\n this.logger.error(`${this.name}: Error in customSpanFormatter`, {\n error,\n spanId: event.exportedSpan.id,\n traceId: event.exportedSpan.traceId,\n });\n // Fall through to return original event if formatter fails\n }\n }\n return event;\n }\n\n /**\n * Default onTracingEvent handler that delegates to exportTracingEvent.\n *\n * This provides backward compatibility: existing exporters that only implement\n * _exportTracingEvent will automatically receive tracing events routed through\n * the ObservabilityBus. Subclasses can override this if they need different\n * routing behavior for bus-delivered events.\n *\n * Handler presence on ObservabilityExporter = signal support.\n */\n onTracingEvent(event: TracingEvent): void | Promise<void> {\n return this.exportTracingEvent(event);\n }\n\n /**\n * Export a tracing event\n *\n * This method checks if the exporter is disabled, applies the customSpanFormatter,\n * then calls _exportTracingEvent.\n * Subclasses should implement _exportTracingEvent instead of overriding this method.\n */\n async exportTracingEvent(event: TracingEvent): Promise<void> {\n if (this.isDisabled) {\n return;\n }\n const processedEvent = await this.applySpanFormatter(event);\n await this._exportTracingEvent(processedEvent);\n }\n\n /**\n * Export a tracing event - must be implemented by subclasses\n *\n * This method is called by exportTracingEvent after checking if the exporter is disabled.\n */\n protected abstract _exportTracingEvent(event: TracingEvent): Promise<void>;\n\n /**\n * Optional initialization hook called after Mastra is fully configured\n */\n init?(_options: InitExporterOptions): void;\n\n /**\n * Optional method to add scores to traces\n */\n 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\n /**\n * Force flush any buffered/queued spans without shutting down the exporter.\n *\n * This is useful in serverless environments where you need to ensure spans\n * are exported before the runtime instance is terminated, while keeping\n * the exporter active for future requests.\n *\n * Default implementation is a no-op. Override to add flush logic.\n */\n async flush(): Promise<void> {\n this.logger.debug(`${this.name} flush called (no-op in base class)`);\n }\n\n /**\n * Shutdown the exporter and clean up resources\n *\n * Default implementation just logs. Override to add custom cleanup.\n */\n async shutdown(): Promise<void> {\n this.logger.info(`${this.name} shutdown complete`);\n }\n}\n","/**\n * TrackingExporter base class for vendor-specific observability exporters.\n *\n * Provides common functionality for caching trace data in memory, handling\n * out-of-order span arrival via queuing, delayed cleanup, and memory management.\n */\n\nimport { TracingEventType } from '@mastra/core/observability';\nimport type { TracingEvent, AnyExportedSpan, SpanErrorInfo } from '@mastra/core/observability';\nimport type { BaseExporterConfig } from './base';\nimport { BaseExporter } from './base';\n\n/**\n * Represents an event waiting in the early queue for its dependencies.\n */\nexport interface QueuedEvent {\n /** The original tracing event */\n event: TracingEvent;\n /** What this event is waiting for: 'root' or a specific parentSpanId */\n waitingFor: 'root' | string;\n /** Number of times we've attempted to process this event */\n attempts: number;\n /** When this event was queued */\n queuedAt: Date;\n}\n\nexport interface TrackingExporterConfig extends BaseExporterConfig {\n /**\n * Maximum number of attempts to process a queued event before dropping it.\n * @default 5\n */\n earlyQueueMaxAttempts?: number;\n\n /**\n * Time-to-live in milliseconds for queued events. Events older than this are dropped.\n * @default 30000 (30 seconds)\n */\n earlyQueueTTLMs?: number;\n\n /**\n * Delay in milliseconds before cleaning up trace data after all spans have ended.\n * This allows late-arriving data to still be processed.\n * @default 30000 (30 seconds)\n */\n traceCleanupDelayMs?: number;\n\n /**\n * Soft cap on number of traces with activeSpanCount == 0 awaiting cleanup.\n * When exceeded, oldest pending traces are force-cleaned.\n * @default 100\n */\n maxPendingCleanupTraces?: number;\n\n /**\n * Hard cap on total number of traces (including active ones).\n * When exceeded, oldest traces are killed (active spans aborted).\n * Safety valve for memory leaks.\n * @default 500\n */\n maxTotalTraces?: number;\n}\n\n/**\n * Per-trace data container that stores vendor-specific span/event objects and\n * manages the waiting queue for out-of-order event processing.\n *\n * @typeParam TRootData - Vendor-specific root/trace object type (e.g., Langfuse trace, Braintrust logger)\n * @typeParam TSpanData - Vendor-specific span object type (e.g., LangSmith RunTree, Braintrust Span)\n * @typeParam TEventData - Vendor-specific event object type\n * @typeParam TMetadata - Vendor-specific metadata type for spans\n */\nexport class TraceData<TRootData, TSpanData, TEventData, TMetadata> {\n /** The vendor-specific root/trace object */\n #rootSpan?: TRootData;\n /** The span ID of the root span */\n #rootSpanId?: string;\n /** Whether a span with isRootSpan=true has been successfully processed */\n #rootSpanProcessed: boolean;\n /** Maps eventId to vendor-specific event objects */\n #events: Map<string, TEventData>;\n /** Maps spanId to vendor-specific span objects */\n #spans: Map<string, TSpanData>;\n /** Maps spanId to parentSpanId, representing the span hierarchy */\n #tree: Map<string, string | undefined>;\n /** Set of span IDs that have started but not yet ended */\n #activeSpanIds: Set<string>;\n /** Maps spanId to vendor-specific metadata */\n #metadata: Map<string, TMetadata>;\n /** Arbitrary key-value storage for per-trace data */\n #extraData: Map<string, unknown>;\n /** Events waiting for the root span to be processed */\n #waitingForRoot: QueuedEvent[];\n /** Events waiting for specific parent spans, keyed by parentSpanId */\n #waitingForParent: Map<string, QueuedEvent[]>;\n\n /** When this trace data was created, used for cap enforcement */\n readonly createdAt: Date;\n\n constructor() {\n this.#events = new Map();\n this.#spans = new Map();\n this.#activeSpanIds = new Set();\n this.#tree = new Map();\n this.#metadata = new Map();\n this.#extraData = new Map();\n this.#rootSpanProcessed = false;\n this.#waitingForRoot = [];\n this.#waitingForParent = new Map();\n this.createdAt = new Date();\n }\n\n /**\n * Check if this trace has a root span registered.\n * @returns True if addRoot() has been called\n */\n hasRoot(): boolean {\n return !!this.#rootSpanId;\n }\n\n /**\n * Register the root span for this trace.\n * @param args.rootId - The span ID of the root span\n * @param args.rootData - The vendor-specific root object\n */\n addRoot(args: { rootId: string; rootData: TRootData }): void {\n this.#rootSpanId = args.rootId;\n this.#rootSpan = args.rootData;\n this.#rootSpanProcessed = true;\n }\n\n /**\n * Get the vendor-specific root object.\n * @returns The root object, or undefined if not yet set\n */\n getRoot(): TRootData | undefined {\n return this.#rootSpan;\n }\n\n /**\n * Check if a span with isRootSpan=true has been successfully processed.\n * Set via addRoot() or markRootSpanProcessed().\n * @returns True if the root span has been processed\n */\n isRootProcessed(): boolean {\n return this.#rootSpanProcessed;\n }\n\n /**\n * Mark that the root span has been processed.\n * Used by exporters with skipBuildRootTask=true where root goes through _buildSpan\n * instead of _buildRoot.\n */\n markRootSpanProcessed(): void {\n this.#rootSpanProcessed = true;\n }\n\n /**\n * Store an arbitrary value in per-trace storage.\n * @param key - Storage key\n * @param value - Value to store\n */\n setExtraValue(key: string, value: unknown): void {\n this.#extraData.set(key, value);\n }\n\n /**\n * Check if a key exists in per-trace storage.\n * @param key - Storage key\n * @returns True if the key exists\n */\n hasExtraValue(key: string): boolean {\n return this.#extraData.has(key);\n }\n\n /**\n * Get a value from per-trace storage.\n * @param key - Storage key\n * @returns The stored value, or undefined if not found\n */\n getExtraValue(key: string): unknown {\n return this.#extraData.get(key);\n }\n\n // ============================================================================\n // Early Queue Methods\n // ============================================================================\n\n /**\n * Add an event to the waiting queue.\n * @param args.event - The tracing event to queue\n * @param args.waitingFor - 'root' or a specific parentSpanId\n * @param args.attempts - Optional: preserve attempts count when re-queuing\n * @param args.queuedAt - Optional: preserve original queue time when re-queuing\n */\n addToWaitingQueue(args: {\n event: TracingEvent;\n waitingFor: 'root' | string;\n attempts?: number;\n queuedAt?: Date;\n }): void {\n const queuedEvent: QueuedEvent = {\n event: args.event,\n waitingFor: args.waitingFor,\n attempts: args.attempts ?? 0,\n queuedAt: args.queuedAt ?? new Date(),\n };\n\n if (args.waitingFor === 'root') {\n this.#waitingForRoot.push(queuedEvent);\n } else {\n const queue = this.#waitingForParent.get(args.waitingFor) ?? [];\n queue.push(queuedEvent);\n this.#waitingForParent.set(args.waitingFor, queue);\n }\n }\n\n /**\n * Get all events waiting for the root span.\n * Returns a copy of the internal array.\n */\n getEventsWaitingForRoot(): QueuedEvent[] {\n return [...this.#waitingForRoot];\n }\n\n /**\n * Get all events waiting for a specific parent span.\n * Returns a copy of the internal array.\n */\n getEventsWaitingFor(args: { spanId: string }): QueuedEvent[] {\n return [...(this.#waitingForParent.get(args.spanId) ?? [])];\n }\n\n /**\n * Clear the waiting-for-root queue.\n */\n clearWaitingForRoot(): void {\n this.#waitingForRoot = [];\n }\n\n /**\n * Clear the waiting queue for a specific parent span.\n */\n clearWaitingFor(args: { spanId: string }): void {\n this.#waitingForParent.delete(args.spanId);\n }\n\n /**\n * Get total count of events in all waiting queues.\n */\n waitingQueueSize(): number {\n let count = this.#waitingForRoot.length;\n for (const queue of this.#waitingForParent.values()) {\n count += queue.length;\n }\n return count;\n }\n\n /**\n * Get all queued events across all waiting queues.\n * Used for cleanup and logging orphaned events.\n * @returns Array of all queued events\n */\n getAllQueuedEvents(): QueuedEvent[] {\n const all: QueuedEvent[] = [...this.#waitingForRoot];\n for (const queue of this.#waitingForParent.values()) {\n all.push(...queue);\n }\n return all;\n }\n\n // ============================================================================\n // Span Tree Methods\n // ============================================================================\n\n /**\n * Record the parent-child relationship for a span.\n * @param args.spanId - The child span ID\n * @param args.parentSpanId - The parent span ID, or undefined for root spans\n */\n addBranch(args: { spanId: string; parentSpanId: string | undefined }): void {\n this.#tree.set(args.spanId, args.parentSpanId);\n }\n\n /**\n * Get the parent span ID for a given span.\n * @param args.spanId - The span ID to look up\n * @returns The parent span ID, or undefined if root or not found\n */\n getParentId(args: { spanId: string }): string | undefined {\n return this.#tree.get(args.spanId);\n }\n\n // ============================================================================\n // Span Management Methods\n // ============================================================================\n\n /**\n * Register a span and mark it as active.\n * @param args.spanId - The span ID\n * @param args.spanData - The vendor-specific span object\n */\n addSpan(args: { spanId: string; spanData: TSpanData }): void {\n this.#spans.set(args.spanId, args.spanData);\n this.#activeSpanIds.add(args.spanId);\n }\n\n /**\n * Check if a span exists (regardless of active state).\n * @param args.spanId - The span ID to check\n * @returns True if the span exists\n */\n hasSpan(args: { spanId: string }): boolean {\n return this.#spans.has(args.spanId);\n }\n\n /**\n * Get a span by ID.\n * @param args.spanId - The span ID to look up\n * @returns The vendor-specific span object, or undefined if not found\n */\n getSpan(args: { spanId: string }): TSpanData | undefined {\n return this.#spans.get(args.spanId);\n }\n\n /**\n * Mark a span as ended (no longer active).\n * @param args.spanId - The span ID to mark as ended\n */\n endSpan(args: { spanId: string }): void {\n this.#activeSpanIds.delete(args.spanId);\n }\n\n /**\n * Check if a span is currently active (started but not ended).\n * @param args.spanId - The span ID to check\n * @returns True if the span is active\n */\n isActiveSpan(args: { spanId: string }): boolean {\n return this.#activeSpanIds.has(args.spanId);\n }\n\n /**\n * Get the count of currently active spans.\n * @returns Number of active spans\n */\n activeSpanCount(): number {\n return this.#activeSpanIds.size;\n }\n\n /**\n * Get all active span IDs.\n * @returns Array of active span IDs\n */\n get activeSpanIds(): string[] {\n return [...this.#activeSpanIds];\n }\n\n // ============================================================================\n // Event Management Methods\n // ============================================================================\n\n /**\n * Register an event.\n * @param args.eventId - The event ID\n * @param args.eventData - The vendor-specific event object\n */\n addEvent(args: { eventId: string; eventData: TEventData }): void {\n this.#events.set(args.eventId, args.eventData);\n }\n\n // ============================================================================\n // Metadata Methods\n // ============================================================================\n\n /**\n * Store vendor-specific metadata for a span.\n * Note: This overwrites any existing metadata for the span.\n * @param args.spanId - The span ID\n * @param args.metadata - The vendor-specific metadata\n */\n addMetadata(args: { spanId: string; metadata: TMetadata }): void {\n this.#metadata.set(args.spanId, args.metadata);\n }\n\n /**\n * Get vendor-specific metadata for a span.\n * @param args.spanId - The span ID\n * @returns The metadata, or undefined if not found\n */\n getMetadata(args: { spanId: string }): TMetadata | undefined {\n return this.#metadata.get(args.spanId);\n }\n\n // ============================================================================\n // Parent Lookup Methods\n // ============================================================================\n\n /**\n * Get the parent span or event for a given span.\n * Looks up in both spans and events maps.\n * @param args.span - The span to find the parent for\n * @returns The parent span/event object, or undefined if root or not found\n */\n getParent(args: { span: AnyExportedSpan }): TSpanData | TEventData | undefined {\n const parentId = args.span.parentSpanId;\n if (parentId) {\n if (this.#spans.has(parentId)) {\n return this.#spans.get(parentId);\n }\n if (this.#events.has(parentId)) {\n return this.#events.get(parentId);\n }\n }\n return undefined;\n }\n\n /**\n * Get the parent span/event or fall back to the root object.\n * Useful for vendors that attach child spans to either parent spans or the trace root.\n * @param args.span - The span to find the parent for\n * @returns The parent span/event, the root object, or undefined\n */\n getParentOrRoot(args: { span: AnyExportedSpan }): TRootData | TSpanData | TEventData | undefined {\n return this.getParent(args) ?? this.getRoot();\n }\n}\n\n// Default configuration values\nconst DEFAULT_EARLY_QUEUE_MAX_ATTEMPTS = 5;\nconst DEFAULT_EARLY_QUEUE_TTL_MS = 30000; // 30 seconds\nconst DEFAULT_TRACE_CLEANUP_DELAY_MS = 30000; // 30 seconds\nconst DEFAULT_MAX_PENDING_CLEANUP_TRACES = 100;\nconst DEFAULT_MAX_TOTAL_TRACES = 500;\n\n/**\n * Abstract base class for vendor-specific observability exporters that need to\n * track trace and span state in memory.\n *\n * This class provides:\n * - Per-trace data caching via TraceData instances\n * - Out-of-order span handling via waiting queues (for when children arrive before parents)\n * - Delayed cleanup to handle late-arriving data\n * - Memory management via configurable soft/hard caps on trace count\n * - Graceful shutdown with span abortion\n *\n * Subclasses must implement the abstract methods to handle vendor-specific\n * span/event creation and lifecycle.\n *\n * @typeParam TRootData - Vendor-specific root/trace object type\n * @typeParam TSpanData - Vendor-specific span object type\n * @typeParam TEventData - Vendor-specific event object type\n * @typeParam TMetadata - Vendor-specific metadata type\n * @typeParam TConfig - Configuration type (must extend TrackingExporterConfig)\n *\n * @example\n * ```typescript\n * class MyExporter extends TrackingExporter<MyRoot, MySpan, MyEvent, MyMeta, MyConfig> {\n * name = 'my-exporter';\n *\n * protected async _buildRoot(args) { ... }\n * protected async _buildSpan(args) { ... }\n * protected async _buildEvent(args) { ... }\n * protected async _updateSpan(args) { ... }\n * protected async _finishSpan(args) { ... }\n * protected async _abortSpan(args) { ... }\n * }\n * ```\n */\nexport abstract class TrackingExporter<\n TRootData,\n TSpanData,\n TEventData,\n TMetadata,\n TConfig extends TrackingExporterConfig,\n> extends BaseExporter {\n /** Map of traceId to per-trace data container */\n #traceMap = new Map<string, TraceData<TRootData, TSpanData, TEventData, TMetadata>>();\n /** Flag to prevent processing during shutdown */\n #shutdownStarted = false;\n /** Flag to prevent concurrent hard cap enforcement */\n #hardCapEnforcementInProgress = false;\n /** Map of traceId to scheduled cleanup timeout */\n #pendingCleanups = new Map<string, ReturnType<typeof setTimeout>>();\n // Note: #traceMap maintains insertion order (JS Map spec), so we use\n // #traceMap.keys() to iterate traces oldest-first for cap enforcement.\n\n /** Subclass configuration with resolved values */\n protected readonly config: TConfig;\n\n /** Maximum attempts to process a queued event before dropping */\n readonly #earlyQueueMaxAttempts: number;\n /** TTL in milliseconds for queued events */\n readonly #earlyQueueTTLMs: number;\n /** Delay before cleaning up completed traces */\n readonly #traceCleanupDelayMs: number;\n /** Soft cap on traces awaiting cleanup */\n readonly #maxPendingCleanupTraces: number;\n /** Hard cap on total traces (will abort active spans if exceeded) */\n readonly #maxTotalTraces: number;\n\n constructor(config: TConfig) {\n super(config);\n this.config = config;\n\n this.#earlyQueueMaxAttempts = config.earlyQueueMaxAttempts ?? DEFAULT_EARLY_QUEUE_MAX_ATTEMPTS;\n this.#earlyQueueTTLMs = config.earlyQueueTTLMs ?? DEFAULT_EARLY_QUEUE_TTL_MS;\n this.#traceCleanupDelayMs = config.traceCleanupDelayMs ?? DEFAULT_TRACE_CLEANUP_DELAY_MS;\n this.#maxPendingCleanupTraces = config.maxPendingCleanupTraces ?? DEFAULT_MAX_PENDING_CLEANUP_TRACES;\n this.#maxTotalTraces = config.maxTotalTraces ?? DEFAULT_MAX_TOTAL_TRACES;\n }\n\n // ============================================================================\n // Early Queue Processing\n // ============================================================================\n\n /**\n * Schedule async processing of events waiting for root span.\n * Called after root span is successfully processed.\n */\n #scheduleProcessWaitingForRoot(traceId: string): void {\n setImmediate(() => {\n this.#processWaitingForRoot(traceId).catch(error => {\n this.logger.error(`${this.name}: Error processing waiting-for-root queue`, { error, traceId });\n });\n });\n }\n\n /**\n * Schedule async processing of events waiting for a specific parent span.\n * Called after a span/event is successfully created.\n */\n #scheduleProcessWaitingFor(traceId: string, spanId: string): void {\n setImmediate(() => {\n this.#processWaitingFor(traceId, spanId).catch(error => {\n this.logger.error(`${this.name}: Error processing waiting queue`, { error, traceId, spanId });\n });\n });\n }\n\n /**\n * Process all events waiting for root span.\n */\n async #processWaitingForRoot(traceId: string): Promise<void> {\n if (this.#shutdownStarted) return;\n\n const traceData = this.#traceMap.get(traceId);\n if (!traceData) return;\n\n const queue = traceData.getEventsWaitingForRoot();\n if (queue.length === 0) return;\n\n this.logger.debug(`${this.name}: Processing ${queue.length} events waiting for root`, { traceId });\n\n // Process events, collecting ones to keep\n const toKeep: QueuedEvent[] = [];\n const now = Date.now();\n\n for (const queuedEvent of queue) {\n // Check TTL\n if (now - queuedEvent.queuedAt.getTime() > this.#earlyQueueTTLMs) {\n this.logger.warn(`${this.name}: Dropping event due to TTL expiry`, {\n traceId,\n spanId: queuedEvent.event.exportedSpan.id,\n waitingFor: queuedEvent.waitingFor,\n queuedAt: queuedEvent.queuedAt,\n attempts: queuedEvent.attempts,\n });\n continue;\n }\n\n // Check max attempts\n if (queuedEvent.attempts >= this.#earlyQueueMaxAttempts) {\n this.logger.warn(`${this.name}: Dropping event due to max attempts`, {\n traceId,\n spanId: queuedEvent.event.exportedSpan.id,\n waitingFor: queuedEvent.waitingFor,\n attempts: queuedEvent.attempts,\n });\n continue;\n }\n\n // Try to process\n queuedEvent.attempts++;\n const processed = await this.#tryProcessQueuedEvent(queuedEvent, traceData);\n\n if (!processed) {\n // Move to waiting-for-parent if we now know the parent\n const parentId = queuedEvent.event.exportedSpan.parentSpanId;\n if (parentId && traceData.isRootProcessed()) {\n // Preserve attempts and queuedAt when moving between queues\n traceData.addToWaitingQueue({\n event: queuedEvent.event,\n waitingFor: parentId,\n attempts: queuedEvent.attempts,\n queuedAt: queuedEvent.queuedAt,\n });\n } else {\n toKeep.push(queuedEvent);\n }\n }\n }\n\n // Update the queue with remaining events\n traceData.clearWaitingForRoot();\n for (const event of toKeep) {\n // Preserve attempts and queuedAt when re-adding to queue\n traceData.addToWaitingQueue({\n event: event.event,\n waitingFor: 'root',\n attempts: event.attempts,\n queuedAt: event.queuedAt,\n });\n }\n }\n\n /**\n * Process events waiting for a specific parent span.\n */\n async #processWaitingFor(traceId: string, spanId: string): Promise<void> {\n if (this.#shutdownStarted) return;\n\n const traceData = this.#traceMap.get(traceId);\n if (!traceData) return;\n\n const queue = traceData.getEventsWaitingFor({ spanId });\n if (queue.length === 0) return;\n\n this.logger.debug(`${this.name}: Processing ${queue.length} events waiting for span`, { traceId, spanId });\n\n const toKeep: QueuedEvent[] = [];\n const now = Date.now();\n\n for (const queuedEvent of queue) {\n // Check TTL\n if (now - queuedEvent.queuedAt.getTime() > this.#earlyQueueTTLMs) {\n this.logger.warn(`${this.name}: Dropping event due to TTL expiry`, {\n traceId,\n spanId: queuedEvent.event.exportedSpan.id,\n waitingFor: queuedEvent.waitingFor,\n queuedAt: queuedEvent.queuedAt,\n attempts: queuedEvent.attempts,\n });\n continue;\n }\n\n // Check max attempts\n if (queuedEvent.attempts >= this.#earlyQueueMaxAttempts) {\n this.logger.warn(`${this.name}: Dropping event due to max attempts`, {\n traceId,\n spanId: queuedEvent.event.exportedSpan.id,\n waitingFor: queuedEvent.waitingFor,\n attempts: queuedEvent.attempts,\n });\n continue;\n }\n\n // Try to process\n queuedEvent.attempts++;\n const processed = await this.#tryProcessQueuedEvent(queuedEvent, traceData);\n\n if (!processed) {\n toKeep.push(queuedEvent);\n }\n }\n\n // Update the queue\n traceData.clearWaitingFor({ spanId });\n for (const event of toKeep) {\n // Preserve attempts and queuedAt when re-adding to queue\n traceData.addToWaitingQueue({\n event: event.event,\n waitingFor: spanId,\n attempts: event.attempts,\n queuedAt: event.queuedAt,\n });\n }\n }\n\n /**\n * Try to process a queued event.\n * Returns true if successfully processed, false if still waiting for dependencies.\n */\n async #tryProcessQueuedEvent(\n queuedEvent: QueuedEvent,\n traceData: TraceData<TRootData, TSpanData, TEventData, TMetadata>,\n ): Promise<boolean> {\n const { event } = queuedEvent;\n const { exportedSpan } = event;\n\n // Determine method\n const method = this.getMethod(event);\n\n try {\n switch (method) {\n case 'handleEventSpan': {\n traceData.addBranch({ spanId: exportedSpan.id, parentSpanId: exportedSpan.parentSpanId });\n const eventData = await this._buildEvent({ span: exportedSpan, traceData });\n if (eventData) {\n if (!this.skipCachingEventSpans) {\n traceData.addEvent({ eventId: exportedSpan.id, eventData });\n }\n // Successfully processed - schedule processing of events waiting for this one\n this.#scheduleProcessWaitingFor(exportedSpan.traceId, exportedSpan.id);\n return true;\n }\n return false;\n }\n\n case 'handleSpanStart': {\n traceData.addBranch({ spanId: exportedSpan.id, parentSpanId: exportedSpan.parentSpanId });\n const spanData = await this._buildSpan({ span: exportedSpan, traceData });\n if (spanData) {\n traceData.addSpan({ spanId: exportedSpan.id, spanData });\n // Mark root as processed if this is the root span\n if (exportedSpan.isRootSpan) {\n traceData.markRootSpanProcessed();\n }\n // Successfully processed - schedule processing of events waiting for this one\n this.#scheduleProcessWaitingFor(exportedSpan.traceId, exportedSpan.id);\n return true;\n }\n return false;\n }\n\n case 'handleSpanUpdate': {\n await this._updateSpan({ span: exportedSpan, traceData });\n return true;\n }\n\n case 'handleSpanEnd': {\n traceData.endSpan({ spanId: exportedSpan.id });\n await this._finishSpan({ span: exportedSpan, traceData });\n // Check if we should schedule cleanup\n if (traceData.activeSpanCount() === 0) {\n this.#scheduleCleanup(exportedSpan.traceId);\n }\n return true;\n }\n default:\n // Should never happen - exhaustive switch\n return false;\n }\n } catch (error) {\n this.logger.error(`${this.name}: Error processing queued event`, { error, event, method });\n return false;\n }\n }\n\n // ============================================================================\n // Delayed Cleanup\n // ============================================================================\n\n /**\n * Schedule cleanup of trace data after a delay.\n * Allows late-arriving data to still be processed.\n */\n #scheduleCleanup(traceId: string): void {\n // Cancel any existing scheduled cleanup for this trace\n this.#cancelScheduledCleanup(traceId);\n\n this.logger.debug(`${this.name}: Scheduling cleanup in ${this.#traceCleanupDelayMs}ms`, { traceId });\n\n const timeout = setTimeout(() => {\n this.#pendingCleanups.delete(traceId);\n this.#performCleanup(traceId);\n }, this.#traceCleanupDelayMs);\n\n this.#pendingCleanups.set(traceId, timeout);\n\n // Enforce soft cap on pending cleanups\n this.#enforcePendingCleanupCap();\n }\n\n /**\n * Cancel a scheduled cleanup for a trace.\n */\n #cancelScheduledCleanup(traceId: string): void {\n const existingTimeout = this.#pendingCleanups.get(traceId);\n if (existingTimeout) {\n clearTimeout(existingTimeout);\n this.#pendingCleanups.delete(traceId);\n this.logger.debug(`${this.name}: Cancelled scheduled cleanup`, { traceId });\n }\n }\n\n /**\n * Perform the actual cleanup of trace data.\n */\n #performCleanup(traceId: string): void {\n const traceData = this.#traceMap.get(traceId);\n if (!traceData) return;\n\n // Log any orphaned events in the queue\n const orphanedEvents = traceData.getAllQueuedEvents();\n if (orphanedEvents.length > 0) {\n this.logger.warn(`${this.name}: Dropping ${orphanedEvents.length} orphaned events on cleanup`, {\n traceId,\n orphanedEvents: orphanedEvents.map(e => ({\n spanId: e.event.exportedSpan.id,\n waitingFor: e.waitingFor,\n attempts: e.attempts,\n queuedAt: e.queuedAt,\n })),\n });\n }\n\n // Remove from trace map (O(1) - Map maintains insertion order automatically)\n this.#traceMap.delete(traceId);\n\n this.logger.debug(`${this.name}: Cleaned up trace data`, { traceId });\n }\n\n // ============================================================================\n // Cap Enforcement\n // ============================================================================\n\n /**\n * Enforce soft cap on pending cleanup traces.\n * Only removes traces with activeSpanCount == 0.\n */\n #enforcePendingCleanupCap(): void {\n if (this.#pendingCleanups.size <= this.#maxPendingCleanupTraces) {\n return;\n }\n\n const toRemove = this.#pendingCleanups.size - this.#maxPendingCleanupTraces;\n this.logger.warn(`${this.name}: Pending cleanup cap exceeded, force-cleaning ${toRemove} traces`, {\n pendingCount: this.#pendingCleanups.size,\n cap: this.#maxPendingCleanupTraces,\n });\n\n // Remove oldest pending cleanups (Map.keys() iterates in insertion order)\n let removed = 0;\n for (const traceId of this.#traceMap.keys()) {\n if (removed >= toRemove) break;\n\n if (this.#pendingCleanups.has(traceId)) {\n this.#cancelScheduledCleanup(traceId);\n this.#performCleanup(traceId);\n removed++;\n }\n }\n }\n\n /**\n * Enforce hard cap on total traces.\n * Will kill even active traces if necessary.\n * Uses a flag to prevent concurrent executions when called fire-and-forget.\n */\n async #enforceHardCap(): Promise<void> {\n // Skip if already under cap or enforcement already in progress\n if (this.#traceMap.size <= this.#maxTotalTraces || this.#hardCapEnforcementInProgress) {\n return;\n }\n\n this.#hardCapEnforcementInProgress = true;\n try {\n // Re-check after acquiring the flag (another call may have just finished)\n if (this.#traceMap.size <= this.#maxTotalTraces) {\n return;\n }\n\n const toRemove = this.#traceMap.size - this.#maxTotalTraces;\n this.logger.warn(`${this.name}: Total trace cap exceeded, killing ${toRemove} oldest traces`, {\n traceCount: this.#traceMap.size,\n cap: this.#maxTotalTraces,\n });\n\n const reason: SpanErrorInfo = {\n id: 'TRACE_CAP_EXCEEDED',\n message: 'Trace killed due to memory cap enforcement.',\n domain: 'MASTRA_OBSERVABILITY',\n category: 'SYSTEM',\n };\n\n let removed = 0;\n // Use a copy of keys since we're modifying the map during iteration\n for (const traceId of [...this.#traceMap.keys()]) {\n if (removed >= toRemove) break;\n\n const traceData = this.#traceMap.get(traceId);\n if (traceData) {\n // Abort any active spans\n for (const spanId of traceData.activeSpanIds) {\n const span = traceData.getSpan({ spanId });\n if (span) {\n await this._abortSpan({ span, traceData, reason });\n }\n }\n\n // Cancel any pending cleanup and remove\n this.#cancelScheduledCleanup(traceId);\n this.#performCleanup(traceId);\n removed++;\n }\n }\n } finally {\n this.#hardCapEnforcementInProgress = false;\n }\n }\n\n // ============================================================================\n // Lifecycle Hooks (Override in subclass)\n // ============================================================================\n\n /**\n * Hook called before processing each tracing event.\n * Override to transform or enrich the event before processing.\n *\n * Note: The customSpanFormatter is applied at the BaseExporter level before this hook.\n * Subclasses can override this to add additional pre-processing logic.\n *\n * @param event - The incoming tracing event\n * @returns The (possibly modified) event to process\n */\n protected async _preExportTracingEvent(event: TracingEvent): Promise<TracingEvent> {\n return event;\n }\n\n /**\n * Hook called after processing each tracing event.\n * Override to perform post-processing actions like flushing.\n */\n protected async _postExportTracingEvent(): Promise<void> {}\n\n // ============================================================================\n // Abstract Methods (Must implement in subclass)\n // ============================================================================\n\n /**\n * Build the vendor-specific root/trace object for a new trace.\n * Called when the first span of a trace arrives (if skipBuildRootTask is false).\n *\n * @param args.span - The root span data\n * @param args.traceData - The trace data container\n * @returns The vendor-specific root object, or undefined if unable to create\n */\n protected abstract _buildRoot(args: {\n span: AnyExportedSpan;\n traceData: TraceData<TRootData, TSpanData, TEventData, TMetadata>;\n }): Promise<TRootData | undefined>;\n\n /**\n * Build a vendor-specific event object.\n * Events are zero-duration spans used for logging discrete occurrences.\n *\n * @param args.span - The event span data\n * @param args.traceData - The trace data container\n * @returns The vendor-specific event object, or undefined if parent not ready\n */\n protected abstract _buildEvent(args: {\n span: AnyExportedSpan;\n traceData: TraceData<TRootData, TSpanData, TEventData, TMetadata>;\n }): Promise<TEventData | undefined>;\n\n /**\n * Build a vendor-specific span object when a span starts.\n * Should create the span in the vendor system and return the SDK object.\n *\n * @param args.span - The span data\n * @param args.traceData - The trace data container\n * @returns The vendor-specific span object, or undefined if parent not ready\n */\n protected abstract _buildSpan(args: {\n span: AnyExportedSpan;\n traceData: TraceData<TRootData, TSpanData, TEventData, TMetadata>;\n }): Promise<TSpanData | undefined>;\n\n /**\n * Update a span with new data (called on span_updated events).\n * Should update the vendor span with any new attributes, metrics, etc.\n *\n * @param args.span - The updated span data\n * @param args.traceData - The trace data container\n */\n protected abstract _updateSpan(args: {\n span: AnyExportedSpan;\n traceData: TraceData<TRootData, TSpanData, TEventData, TMetadata>;\n }): Promise<void>;\n\n /**\n * Finish a span (called on span_ended events).\n * Should close/end the span in the vendor system with final data.\n *\n * @param args.span - The ended span data\n * @param args.traceData - The trace data container\n */\n protected abstract _finishSpan(args: {\n span: AnyExportedSpan;\n traceData: TraceData<TRootData, TSpanData, TEventData, TMetadata>;\n }): Promise<void>;\n\n /**\n * Abort a span due to shutdown or memory cap enforcement.\n * Should mark the span as failed/aborted in the vendor system.\n *\n * @param args.span - The vendor-specific span object to abort\n * @param args.traceData - The trace data container\n * @param args.reason - Error info describing why the span was aborted\n */\n protected abstract _abortSpan(args: {\n span: TSpanData;\n traceData: TraceData<TRootData, TSpanData, TEventData, TMetadata>;\n reason: SpanErrorInfo;\n }): Promise<void>;\n\n // ============================================================================\n // Behavior Flags (Override in subclass as needed)\n // ============================================================================\n\n /**\n * If true, skip calling _buildRoot and let root spans go through _buildSpan.\n * Use when the vendor doesn't have a separate trace/root concept.\n * @default false\n */\n protected skipBuildRootTask = false;\n\n /**\n * If true, skip processing span_updated events entirely.\n * Use when the vendor doesn't support incremental span updates.\n * @default false\n */\n protected skipSpanUpdateEvents = false;\n\n /**\n * If true, don't cache event spans in TraceData.\n * Use when events can't be parents of other spans.\n * @default false\n */\n protected skipCachingEventSpans = false;\n\n private getMethod(event: TracingEvent): 'handleEventSpan' | 'handleSpanStart' | 'handleSpanUpdate' | 'handleSpanEnd' {\n if (event.exportedSpan.isEvent) {\n return 'handleEventSpan';\n }\n const eventType = event.type;\n switch (eventType) {\n case TracingEventType.SPAN_STARTED:\n return 'handleSpanStart';\n case TracingEventType.SPAN_UPDATED:\n return 'handleSpanUpdate';\n case TracingEventType.SPAN_ENDED:\n return 'handleSpanEnd';\n default: {\n // Exhaustive check - TypeScript will error if new TracingEventType values are added\n const _exhaustiveCheck: never = eventType;\n throw new Error(`Unhandled event type: ${_exhaustiveCheck}`);\n }\n }\n }\n\n protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n if (this.#shutdownStarted) {\n return;\n }\n\n const method = this.getMethod(event);\n if (method == 'handleSpanUpdate' && this.skipSpanUpdateEvents) {\n return;\n }\n\n const traceId = event.exportedSpan.traceId;\n const traceData = this.getTraceData({ traceId, method });\n\n const { exportedSpan } = await this._preExportTracingEvent(event);\n\n // Handle root span building for exporters that need it\n if (!this.skipBuildRootTask && !traceData.hasRoot()) {\n if (exportedSpan.isRootSpan) {\n this.logger.debug(`${this.name}: Building root`, {\n traceId: exportedSpan.traceId,\n spanId: exportedSpan.id,\n });\n const rootData = await this._buildRoot({ span: exportedSpan, traceData });\n if (rootData) {\n this.logger.debug(`${this.name}: Adding root`, {\n traceId: exportedSpan.traceId,\n spanId: exportedSpan.id,\n });\n traceData.addRoot({ rootId: exportedSpan.id, rootData });\n // Root is now processed, trigger async processing of waiting events\n this.#scheduleProcessWaitingForRoot(traceId);\n }\n // Note: Root span still continues to handleSpanStart below to track\n // the span as active and call _buildSpan for vendor-specific handling\n } else {\n this.logger.debug(`${this.name}: Root does not exist, adding span to waiting queue.`, {\n traceId: exportedSpan.traceId,\n spanId: exportedSpan.id,\n });\n traceData.addToWaitingQueue({ event, waitingFor: 'root' });\n return;\n }\n }\n\n if (exportedSpan.metadata && this.name in exportedSpan.metadata) {\n const metadata = exportedSpan.metadata[this.name] as TMetadata;\n this.logger.debug(`${this.name}: Found provider metadata in span`, {\n traceId: exportedSpan.traceId,\n spanId: exportedSpan.id,\n metadata,\n });\n traceData.addMetadata({ spanId: exportedSpan.id, metadata });\n }\n\n try {\n switch (method) {\n case 'handleEventSpan': {\n this.logger.debug(`${this.name}: handling event`, {\n traceId: exportedSpan.traceId,\n spanId: exportedSpan.id,\n });\n traceData.addBranch({ spanId: exportedSpan.id, parentSpanId: exportedSpan.parentSpanId });\n const eventData = await this._buildEvent({ span: exportedSpan, traceData });\n if (eventData) {\n if (!this.skipCachingEventSpans) {\n this.logger.debug(`${this.name}: adding event to traceData`, {\n traceId: exportedSpan.traceId,\n spanId: exportedSpan.id,\n });\n traceData.addEvent({ eventId: exportedSpan.id, eventData });\n }\n // Event created successfully, trigger processing of any waiting events\n this.#scheduleProcessWaitingFor(traceId, exportedSpan.id);\n } else {\n // Parent doesn't exist, queue for later\n const parentId = exportedSpan.parentSpanId;\n this.logger.debug(`${this.name}: adding event to waiting queue`, {\n traceId: exportedSpan.traceId,\n spanId: exportedSpan.id,\n waitingFor: parentId ?? 'root',\n });\n traceData.addToWaitingQueue({ event, waitingFor: parentId ?? 'root' });\n }\n break;\n }\n case 'handleSpanStart': {\n this.logger.debug(`${this.name}: handling span start`, {\n traceId: exportedSpan.traceId,\n spanId: exportedSpan.id,\n });\n traceData.addBranch({ spanId: exportedSpan.id, parentSpanId: exportedSpan.parentSpanId });\n const spanData = await this._buildSpan({ span: exportedSpan, traceData });\n if (spanData) {\n this.logger.debug(`${this.name}: adding span to traceData`, {\n traceId: exportedSpan.traceId,\n spanId: exportedSpan.id,\n });\n traceData.addSpan({ spanId: exportedSpan.id, spanData });\n // Mark root as processed for skipBuildRootTask exporters\n if (exportedSpan.isRootSpan) {\n traceData.markRootSpanProcessed();\n this.#scheduleProcessWaitingForRoot(traceId);\n }\n // Span created successfully, trigger processing of any waiting events\n this.#scheduleProcessWaitingFor(traceId, exportedSpan.id);\n } else {\n // Parent doesn't exist, queue for later\n const parentId = exportedSpan.parentSpanId;\n this.logger.debug(`${this.name}: adding span to waiting queue`, {\n traceId: exportedSpan.traceId,\n waitingFor: parentId ?? 'root',\n });\n traceData.addToWaitingQueue({ event, waitingFor: parentId ?? 'root' });\n }\n break;\n }\n case 'handleSpanUpdate':\n this.logger.debug(`${this.name}: handling span update`, {\n traceId: exportedSpan.traceId,\n spanId: exportedSpan.id,\n });\n await this._updateSpan({ span: exportedSpan, traceData });\n break;\n case 'handleSpanEnd':\n this.logger.debug(`${this.name}: handling span end`, {\n traceId: exportedSpan.traceId,\n spanId: exportedSpan.id,\n });\n traceData.endSpan({ spanId: exportedSpan.id });\n await this._finishSpan({ span: exportedSpan, traceData });\n // Schedule cleanup when all spans have ended\n if (traceData.activeSpanCount() === 0) {\n this.#scheduleCleanup(traceId);\n }\n break;\n }\n } catch (error) {\n this.logger.error(`${this.name}: exporter error`, { error, event, method });\n }\n\n // Reschedule cleanup if all spans have ended\n // This handles the case where late data arrives after all spans ended\n // (getTraceData cancels any existing cleanup, so we need to reschedule)\n if (traceData.activeSpanCount() === 0) {\n this.#scheduleCleanup(traceId);\n }\n\n await this._postExportTracingEvent();\n }\n\n // ============================================================================\n // Protected Helpers\n // ============================================================================\n\n /**\n * Get or create the TraceData container for a trace.\n * Also cancels any pending cleanup since new data has arrived.\n *\n * @param args.traceId - The trace ID\n * @param args.method - The calling method name (for logging)\n * @returns The TraceData container for this trace\n */\n protected getTraceData(args: {\n traceId: string;\n method: string;\n }): TraceData<TRootData, TSpanData, TEventData, TMetadata> {\n const { traceId, method } = args;\n\n // Cancel any scheduled cleanup - new data has arrived\n this.#cancelScheduledCleanup(traceId);\n\n if (!this.#traceMap.has(traceId)) {\n this.#traceMap.set(traceId, new TraceData());\n // Note: Map.set() maintains insertion order automatically\n this.logger.debug(`${this.name}: Created new trace data cache`, {\n traceId,\n method,\n });\n\n // Enforce hard cap on total traces\n this.#enforceHardCap().catch(error => {\n this.logger.error(`${this.name}: Error enforcing hard cap`, { error });\n });\n }\n return this.#traceMap.get(traceId)!;\n }\n\n /**\n * Get the current number of traces being tracked.\n * @returns The trace count\n */\n protected traceMapSize(): number {\n return this.#traceMap.size;\n }\n\n // ============================================================================\n // Flush and Shutdown Hooks (Override in subclass as needed)\n // ============================================================================\n\n /**\n * Hook called by flush() to perform vendor-specific flush logic.\n * Override to send buffered data to the vendor's API.\n *\n * Unlike _postShutdown(), this method should NOT release resources,\n * as the exporter will continue to be used after flushing.\n */\n protected async _flush(): Promise<void> {}\n\n /**\n * Force flush any buffered data 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 * Subclasses should override _flush() to implement vendor-specific flush logic.\n */\n async flush(): Promise<void> {\n if (this.isDisabled) {\n return;\n }\n\n this.logger.debug(`${this.name}: Flushing`);\n await this._flush();\n }\n\n /**\n * Hook called at the start of shutdown, before cancelling timers and aborting spans.\n * Override to perform vendor-specific pre-shutdown tasks.\n */\n protected async _preShutdown(): Promise<void> {}\n\n /**\n * Hook called at the end of shutdown, after all spans are aborted.\n * Override to perform vendor-specific cleanup (e.g., flushing).\n */\n protected async _postShutdown(): Promise<void> {}\n\n /**\n * Gracefully shut down the exporter.\n * Cancels all pending cleanup timers, aborts all active spans, and clears state.\n */\n async shutdown(): Promise<void> {\n if (this.isDisabled) {\n return;\n }\n\n this.#shutdownStarted = true;\n await this._preShutdown();\n\n // Cancel all pending cleanup timers\n for (const [traceId, timeout] of this.#pendingCleanups) {\n clearTimeout(timeout);\n this.logger.debug(`${this.name}: Cancelled pending cleanup on shutdown`, { traceId });\n }\n this.#pendingCleanups.clear();\n\n // End all active spans\n const reason: SpanErrorInfo = {\n id: 'SHUTDOWN',\n message: 'Observability is shutting down.',\n domain: 'MASTRA_OBSERVABILITY',\n category: 'SYSTEM',\n };\n\n for (const [traceId, traceData] of this.#traceMap) {\n // Log any orphaned events\n const orphanedEvents = traceData.getAllQueuedEvents();\n if (orphanedEvents.length > 0) {\n this.logger.warn(`${this.name}: Dropping ${orphanedEvents.length} orphaned events on shutdown`, {\n traceId,\n orphanedEvents: orphanedEvents.map(e => ({\n spanId: e.event.exportedSpan.id,\n waitingFor: e.waitingFor,\n attempts: e.attempts,\n })),\n });\n }\n\n // Abort active spans\n for (const spanId of traceData.activeSpanIds) {\n const span = traceData.getSpan({ spanId });\n if (span) {\n await this._abortSpan({ span, traceData, reason });\n }\n }\n }\n\n this.#traceMap.clear();\n await this._postShutdown();\n await super.shutdown();\n }\n}\n","/**\n * Utility functions for working with custom span formatters.\n */\n\nimport type { AnyExportedSpan, CustomSpanFormatter } from '@mastra/core/observability';\n\n/**\n * Chains multiple span formatters into a single formatter.\n *\n * Formatters are applied in order, with each receiving the output of the previous.\n * Supports both synchronous and asynchronous formatters - if any formatter returns\n * a Promise, the entire chain will return a Promise.\n *\n * @param formatters - Array of formatters to chain (can be sync or async)\n * @returns A single formatter that applies all formatters in sequence\n *\n * @example\n * ```typescript\n * // Chain sync formatters\n * const chainedFormatter = chainFormatters([\n * myPlainTextFormatter,\n * myRedactionFormatter,\n * ]);\n *\n * // Chain mixed sync and async formatters\n * const asyncChainedFormatter = chainFormatters([\n * myPlainTextFormatter, // sync\n * myAsyncEnrichmentFormatter, // async\n * ]);\n *\n * const exporter = new BraintrustExporter({\n * customSpanFormatter: chainedFormatter,\n * });\n * ```\n */\nexport function chainFormatters(formatters: CustomSpanFormatter[]): CustomSpanFormatter {\n return async (span: AnyExportedSpan): Promise<AnyExportedSpan> => {\n let currentSpan = span;\n for (const formatter of formatters) {\n currentSpan = await formatter(currentSpan);\n }\n return currentSpan;\n };\n}\n","import type { IMastraLogger } from '@mastra/core/logger';\nimport { fetchWithRetry } from '@mastra/core/utils';\n\nconst AUTH_FAILURE_STATUSES = new Set([401, 403]);\nconst AUTH_COOLDOWN_BASE_MS = 60_000;\n// Target cap before jitter; positive jitter can exceed this to avoid synchronized retry probes.\nconst AUTH_COOLDOWN_MAX_MS = 15 * 60_000;\nconst AUTH_COOLDOWN_JITTER_RATIO = 0.1;\n\nexport class AuthFailureError extends Error {\n readonly status: number;\n\n constructor(status: number, cause?: unknown) {\n super(`Request failed with authentication status: ${status}`, { cause });\n this.name = 'AuthFailureError';\n this.status = status;\n }\n}\n\nexport function isAuthFailureError(error: unknown): error is AuthFailureError {\n return error instanceof AuthFailureError;\n}\n\nfunction isAuthFailureStatus(status: number): boolean {\n return AUTH_FAILURE_STATUSES.has(status);\n}\n\nexport async function fetchWithAuthFailureHandling(\n url: string,\n options: RequestInit,\n maxRetries: number,\n): Promise<void> {\n let authFailureStatus: number | undefined;\n\n try {\n await fetchWithRetry(url, options, maxRetries, {\n shouldRetryResponse: response => {\n if (isAuthFailureStatus(response.status)) {\n authFailureStatus = response.status;\n return false;\n }\n\n return true;\n },\n });\n } catch (error) {\n if (authFailureStatus !== undefined) {\n throw new AuthFailureError(authFailureStatus, error);\n }\n\n throw error;\n }\n}\n\nexport class AuthFailureCooldown {\n private failureCount = 0;\n private cooldownUntilMs = 0;\n private droppedEventsDuringCooldown = 0;\n\n constructor(\n private readonly exporterName: string,\n private readonly getLogger: () => IMastraLogger,\n ) {}\n\n private shouldDropEvents(): boolean {\n return Date.now() < this.cooldownUntilMs;\n }\n\n dropEventIfCoolingDown(): boolean {\n return this.dropEventsIfCoolingDown(1);\n }\n\n dropEventsIfCoolingDown(count: number): boolean {\n if (!this.shouldDropEvents()) {\n return false;\n }\n\n this.droppedEventsDuringCooldown += count;\n return true;\n }\n\n reset(): number {\n const droppedEventsDuringCooldown = this.droppedEventsDuringCooldown;\n\n this.failureCount = 0;\n this.cooldownUntilMs = 0;\n this.droppedEventsDuringCooldown = 0;\n\n return droppedEventsDuringCooldown;\n }\n\n recordFailure(args: { status: number; failedSignals: string[]; droppedBatchSize: number }): void {\n this.failureCount++;\n const droppedEventsDuringCooldown = this.droppedEventsDuringCooldown;\n this.droppedEventsDuringCooldown = 0;\n\n const targetCooldownMs = Math.min(AUTH_COOLDOWN_BASE_MS * Math.pow(2, this.failureCount - 1), AUTH_COOLDOWN_MAX_MS);\n const jitterMs = Math.floor(targetCooldownMs * AUTH_COOLDOWN_JITTER_RATIO * (Math.random() - 0.5) * 2);\n const cooldownMs = Math.max(AUTH_COOLDOWN_BASE_MS, targetCooldownMs + jitterMs);\n const cooldownSeconds = Math.ceil(cooldownMs / 1000);\n\n this.cooldownUntilMs = Date.now() + cooldownMs;\n\n this.getLogger().warn(\n `${this.exporterName} received an authentication failure; pausing uploads for ${cooldownSeconds}s`,\n {\n status: args.status,\n failedSignals: args.failedSignals,\n droppedBatchSize: args.droppedBatchSize,\n droppedEventsDuringCooldown,\n authFailureCount: this.failureCount,\n cooldownMs,\n },\n );\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { LogLevel } from '@mastra/core/logger';\nimport { SpanType, TracingEventType } from '@mastra/core/observability';\nimport type {\n TracingEvent,\n AnyExportedSpan,\n LogEvent,\n MetricEvent,\n ScoreEvent,\n FeedbackEvent,\n} from '@mastra/core/observability';\nimport { AuthFailureCooldown, fetchWithAuthFailureHandling, isAuthFailureError } from './auth-failure-cooldown';\nimport { BaseExporter } from './base';\nimport type { BaseExporterConfig } from './base';\n\n/**\n * @deprecated Use `MastraPlatformExporterConfig` from `@mastra/observability`\n * instead. This type is kept for backward compatibility and will be removed in\n * a future major version.\n */\nexport interface CloudExporterConfig extends BaseExporterConfig {\n maxBatchSize?: number; // Default: 1000 spans\n maxBatchWaitMs?: number; // Default: 5000ms\n maxRetries?: number; // Default: 3\n\n // Cloud-specific configuration\n accessToken?: string; // Cloud access token (from env or config)\n projectId?: string; // Project ID for project-scoped collector routes\n endpoint?: string; // Base cloud endpoint\n tracesEndpoint?: string; // Explicit cloud traces endpoint override\n logsEndpoint?: string; // Explicit cloud logs endpoint override\n metricsEndpoint?: string; // Explicit cloud metrics endpoint override\n scoresEndpoint?: string; // Explicit cloud scores endpoint override\n feedbackEndpoint?: string; // Explicit cloud feedback endpoint override\n}\n\ntype CloudSignal = 'traces' | 'logs' | 'metrics' | 'scores' | 'feedback';\n\nconst SIGNAL_PUBLISH_SUFFIXES: Record<CloudSignal, string> = {\n traces: '/spans/publish',\n logs: '/logs/publish',\n metrics: '/metrics/publish',\n scores: '/scores/publish',\n feedback: '/feedback/publish',\n};\n\nconst DEFAULT_CLOUD_SPAN_FILTER = (span: AnyExportedSpan): boolean => span.type !== SpanType.MODEL_CHUNK;\n\nconst SIGNAL_PUBLISH_SEGMENTS: Record<CloudSignal, string> = {\n traces: 'spans',\n logs: 'logs',\n metrics: 'metrics',\n scores: 'scores',\n feedback: 'feedback',\n};\n\nfunction trimTrailingSlashes(value: string): string {\n let end = value.length;\n while (end > 0 && value.charCodeAt(end - 1) === 47) {\n end--;\n }\n return end === value.length ? value : value.slice(0, end);\n}\n\nfunction createInvalidEndpointError(endpoint: string, text: string, cause?: unknown): MastraError {\n return new MastraError(\n {\n id: `CLOUD_EXPORTER_INVALID_ENDPOINT`,\n text,\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.USER,\n details: {\n endpoint,\n },\n },\n cause,\n );\n}\n\nconst VALID_PROJECT_ID = /^[a-zA-Z0-9_-]+$/;\n\nfunction createInvalidProjectIdError(projectId: string): MastraError {\n return new MastraError({\n id: `CLOUD_EXPORTER_INVALID_PROJECT_ID`,\n text: 'CloudExporter projectId must only contain letters, numbers, hyphens, and underscores.',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.USER,\n details: {\n projectId,\n },\n });\n}\n\nfunction resolveBaseEndpoint(baseEndpoint: string): string {\n const normalizedEndpoint = trimTrailingSlashes(baseEndpoint);\n const invalidText =\n 'CloudExporter endpoint must be a base origin like \"https://collector.example.com\" with no path, search, or hash.';\n\n try {\n const parsedEndpoint = new URL(normalizedEndpoint);\n if (parsedEndpoint.pathname !== '/' || parsedEndpoint.search || parsedEndpoint.hash) {\n throw createInvalidEndpointError(baseEndpoint, invalidText);\n }\n return trimTrailingSlashes(parsedEndpoint.origin);\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n\n throw createInvalidEndpointError(baseEndpoint, invalidText, error);\n }\n}\n\nfunction buildSignalPath(signal: CloudSignal, projectId?: string): string {\n const signalSegment = SIGNAL_PUBLISH_SEGMENTS[signal];\n if (!projectId) {\n return `/ai/${signalSegment}/publish`;\n }\n\n return `/projects/${projectId}/ai/${signalSegment}/publish`;\n}\n\nfunction buildSignalEndpoint(baseEndpoint: string, signal: CloudSignal, projectId?: string): string {\n return `${baseEndpoint}${buildSignalPath(signal, projectId)}`;\n}\n\nfunction resolveExplicitSignalEndpoint(signal: CloudSignal, endpoint: string, projectId?: string): string {\n const normalizedEndpoint = trimTrailingSlashes(endpoint);\n const invalidText = `CloudExporter ${signal}Endpoint must be a base origin like \"https://collector.example.com\" or a full ${signal} publish URL ending in \"${SIGNAL_PUBLISH_SUFFIXES[signal]}\".`;\n\n try {\n const parsedEndpoint = new URL(normalizedEndpoint);\n if (parsedEndpoint.search || parsedEndpoint.hash) {\n throw createInvalidEndpointError(endpoint, invalidText);\n }\n\n const normalizedOrigin = trimTrailingSlashes(parsedEndpoint.origin);\n const normalizedPathname = trimTrailingSlashes(parsedEndpoint.pathname);\n\n if (!normalizedPathname || normalizedPathname === '/') {\n return buildSignalEndpoint(normalizedOrigin, signal, projectId);\n }\n\n if (normalizedPathname.endsWith(SIGNAL_PUBLISH_SUFFIXES[signal])) {\n return `${normalizedOrigin}${normalizedPathname}`;\n }\n\n throw createInvalidEndpointError(endpoint, invalidText);\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n\n throw createInvalidEndpointError(endpoint, invalidText, error);\n }\n}\n\nfunction deriveSignalEndpointFromTracesEndpoint(signal: CloudSignal, tracesEndpoint: string): string {\n if (signal === 'traces') {\n return tracesEndpoint;\n }\n\n const normalizedTracesEndpoint = trimTrailingSlashes(tracesEndpoint);\n const invalidText =\n 'CloudExporter tracesEndpoint must be a base origin like \"https://collector.example.com\" or a full traces publish URL ending in \"/spans/publish\".';\n\n try {\n const parsedEndpoint = new URL(normalizedTracesEndpoint);\n const normalizedOrigin = trimTrailingSlashes(parsedEndpoint.origin);\n const normalizedPathname = trimTrailingSlashes(parsedEndpoint.pathname);\n\n if (!normalizedPathname.endsWith(SIGNAL_PUBLISH_SUFFIXES.traces)) {\n throw createInvalidEndpointError(tracesEndpoint, invalidText);\n }\n\n const basePath = normalizedPathname.slice(0, -SIGNAL_PUBLISH_SUFFIXES.traces.length);\n return `${normalizedOrigin}${basePath}${SIGNAL_PUBLISH_SUFFIXES[signal]}`;\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n\n throw createInvalidEndpointError(tracesEndpoint, invalidText, error);\n }\n}\n\ninterface MastraCloudBuffer {\n spans: MastraCloudSpanRecord[];\n logs: MastraCloudLogRecord[];\n metrics: MastraCloudMetricRecord[];\n scores: MastraCloudScoreRecord[];\n feedback: MastraCloudFeedbackRecord[];\n firstEventTime?: Date;\n totalSize: number;\n}\n\ntype MastraCloudSpanRecord = AnyExportedSpan & {\n spanId: string;\n spanType: string;\n startedAt: Date;\n endedAt: Date | null;\n error: AnyExportedSpan['errorInfo'] | null;\n createdAt: Date;\n updatedAt: Date | null;\n};\n\ntype MastraCloudLogRecord = LogEvent['log'];\ntype MastraCloudMetricRecord = MetricEvent['metric'];\ntype MastraCloudScoreRecord = ScoreEvent['score'];\ntype MastraCloudFeedbackRecord = FeedbackEvent['feedback'];\n\ntype ResolvedCloudConfig = {\n logger: BaseExporterConfig['logger'];\n logLevel: NonNullable<BaseExporterConfig['logLevel']>;\n maxBatchSize: number;\n maxBatchWaitMs: number;\n maxRetries: number;\n accessToken: string;\n tracesEndpoint: string;\n logsEndpoint: string;\n metricsEndpoint: string;\n scoresEndpoint: string;\n feedbackEndpoint: string;\n};\n\n/**\n * @deprecated Use `MastraPlatformExporter` from `@mastra/observability` instead.\n * This class is preserved unchanged so existing integrations (including code\n * that matches on the `CLOUD_EXPORTER_*` error IDs or the\n * `mastra-cloud-observability-exporter` exporter name) keep working. It will\n * be removed in a future major version.\n */\nexport class CloudExporter extends BaseExporter {\n name = 'mastra-cloud-observability-exporter';\n\n private readonly cloudConfig: Readonly<ResolvedCloudConfig>;\n private readonly authFailureCooldown: AuthFailureCooldown;\n private buffer: MastraCloudBuffer;\n private flushTimer: NodeJS.Timeout | null = null;\n private inFlightFlushes = new Set<Promise<void>>();\n\n constructor(config: CloudExporterConfig = {}) {\n super(config);\n\n if (config.projectId !== undefined && !VALID_PROJECT_ID.test(config.projectId)) {\n throw createInvalidProjectIdError(config.projectId);\n }\n\n const accessToken = config.accessToken ?? process.env.MASTRA_CLOUD_ACCESS_TOKEN;\n const rawProjectId = config.projectId ?? process.env.MASTRA_PROJECT_ID;\n const projectId = rawProjectId && VALID_PROJECT_ID.test(rawProjectId) ? rawProjectId : undefined;\n if (!accessToken) {\n this.setDisabled('MASTRA_CLOUD_ACCESS_TOKEN environment variable not set.', 'debug');\n }\n\n const tracesEndpointOverride = config.tracesEndpoint ?? process.env.MASTRA_CLOUD_TRACES_ENDPOINT;\n let baseEndpoint: string | undefined;\n let tracesEndpoint: string;\n\n if (tracesEndpointOverride) {\n tracesEndpoint = resolveExplicitSignalEndpoint('traces', tracesEndpointOverride, projectId);\n } else {\n baseEndpoint = resolveBaseEndpoint(config.endpoint ?? 'https://observability.mastra.ai');\n tracesEndpoint = buildSignalEndpoint(baseEndpoint, 'traces', projectId);\n }\n\n const resolveConfiguredSignalEndpoint = (\n signal: Exclude<CloudSignal, 'traces'>,\n explicitEndpoint?: string,\n ): string => {\n if (explicitEndpoint) {\n return resolveExplicitSignalEndpoint(signal, explicitEndpoint, projectId);\n }\n\n if (tracesEndpointOverride) {\n return deriveSignalEndpointFromTracesEndpoint(signal, tracesEndpoint);\n }\n\n return buildSignalEndpoint(baseEndpoint!, signal, projectId);\n };\n\n this.cloudConfig = {\n logger: this.logger,\n logLevel: config.logLevel ?? LogLevel.INFO,\n maxBatchSize: config.maxBatchSize ?? 1000,\n maxBatchWaitMs: config.maxBatchWaitMs ?? 5000,\n maxRetries: config.maxRetries ?? 3,\n accessToken: accessToken || '',\n tracesEndpoint,\n logsEndpoint: resolveConfiguredSignalEndpoint('logs', config.logsEndpoint),\n metricsEndpoint: resolveConfiguredSignalEndpoint('metrics', config.metricsEndpoint),\n scoresEndpoint: resolveConfiguredSignalEndpoint('scores', config.scoresEndpoint),\n feedbackEndpoint: resolveConfiguredSignalEndpoint('feedback', config.feedbackEndpoint),\n };\n\n this.authFailureCooldown = new AuthFailureCooldown('CloudExporter', () => this.logger);\n\n this.buffer = {\n spans: [],\n logs: [],\n metrics: [],\n scores: [],\n feedback: [],\n totalSize: 0,\n };\n }\n\n protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n // Cloud Observability only process SPAN_ENDED events\n if (event.type !== TracingEventType.SPAN_ENDED) {\n return;\n }\n\n if (!DEFAULT_CLOUD_SPAN_FILTER(event.exportedSpan)) {\n return;\n }\n\n if (this.authFailureCooldown.dropEventIfCoolingDown()) {\n return;\n }\n\n this.addToBuffer(event);\n\n await this.handleBufferedEvent();\n }\n\n async onLogEvent(event: LogEvent): Promise<void> {\n if (this.isDisabled) {\n return;\n }\n\n if (this.authFailureCooldown.dropEventIfCoolingDown()) {\n return;\n }\n\n this.addLogToBuffer(event);\n await this.handleBufferedEvent();\n }\n\n async onMetricEvent(event: MetricEvent): Promise<void> {\n if (this.isDisabled) {\n return;\n }\n\n if (this.authFailureCooldown.dropEventIfCoolingDown()) {\n return;\n }\n\n this.addMetricToBuffer(event);\n await this.handleBufferedEvent();\n }\n\n async onScoreEvent(event: ScoreEvent): Promise<void> {\n if (this.isDisabled) {\n return;\n }\n\n if (this.authFailureCooldown.dropEventIfCoolingDown()) {\n return;\n }\n\n this.addScoreToBuffer(event);\n await this.handleBufferedEvent();\n }\n\n async onFeedbackEvent(event: FeedbackEvent): Promise<void> {\n if (this.isDisabled) {\n return;\n }\n\n if (this.authFailureCooldown.dropEventIfCoolingDown()) {\n return;\n }\n\n this.addFeedbackToBuffer(event);\n await this.handleBufferedEvent();\n }\n\n private addToBuffer(event: TracingEvent): void {\n this.markBufferStart();\n\n const spanRecord = this.formatSpan(event.exportedSpan);\n this.buffer.spans.push(spanRecord);\n this.buffer.totalSize++;\n }\n\n private addLogToBuffer(event: LogEvent): void {\n this.markBufferStart();\n\n this.buffer.logs.push(this.formatLog(event.log));\n this.buffer.totalSize++;\n }\n\n private addMetricToBuffer(event: MetricEvent): void {\n this.markBufferStart();\n\n this.buffer.metrics.push(this.formatMetric(event.metric));\n this.buffer.totalSize++;\n }\n\n private addScoreToBuffer(event: ScoreEvent): void {\n this.markBufferStart();\n\n this.buffer.scores.push(this.formatScore(event.score));\n this.buffer.totalSize++;\n }\n\n private addFeedbackToBuffer(event: FeedbackEvent): void {\n this.markBufferStart();\n\n this.buffer.feedback.push(this.formatFeedback(event.feedback));\n this.buffer.totalSize++;\n }\n\n private markBufferStart(): void {\n if (this.buffer.totalSize === 0) {\n this.buffer.firstEventTime = new Date();\n }\n }\n\n private formatSpan(span: AnyExportedSpan): MastraCloudSpanRecord {\n const spanRecord: MastraCloudSpanRecord = {\n ...span,\n spanId: span.id,\n spanType: span.type,\n startedAt: span.startTime,\n endedAt: span.endTime ?? null,\n error: span.errorInfo ?? null,\n createdAt: new Date(),\n updatedAt: null,\n };\n\n return spanRecord;\n }\n\n private formatLog(log: LogEvent['log']): MastraCloudLogRecord {\n return {\n ...log,\n };\n }\n\n private formatMetric(metric: MetricEvent['metric']): MastraCloudMetricRecord {\n return {\n ...metric,\n };\n }\n\n private formatScore(score: ScoreEvent['score']): MastraCloudScoreRecord {\n return {\n ...score,\n };\n }\n\n private formatFeedback(feedback: FeedbackEvent['feedback']): MastraCloudFeedbackRecord {\n return {\n ...feedback,\n };\n }\n\n private async handleBufferedEvent(): Promise<void> {\n if (this.shouldFlush()) {\n void this.flush().catch(error => {\n this.logger.error('Batch flush failed', {\n error: error instanceof Error ? error.message : String(error),\n });\n });\n } else if (this.buffer.totalSize === 1) {\n this.scheduleFlush();\n }\n }\n\n private shouldFlush(): boolean {\n // Size-based flush\n if (this.buffer.totalSize >= this.cloudConfig.maxBatchSize) {\n return true;\n }\n\n // Time-based flush\n if (this.buffer.firstEventTime && this.buffer.totalSize > 0) {\n const elapsed = Date.now() - this.buffer.firstEventTime.getTime();\n if (elapsed >= this.cloudConfig.maxBatchWaitMs) {\n return true;\n }\n }\n\n return false;\n }\n\n private scheduleFlush(): void {\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n }\n this.flushTimer = setTimeout(() => {\n void this.flush().catch(error => {\n const mastraError = new MastraError(\n {\n id: `CLOUD_EXPORTER_FAILED_TO_SCHEDULE_FLUSH`,\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.USER,\n },\n error,\n );\n this.logger.trackException(mastraError);\n this.logger.error('Scheduled flush failed', mastraError);\n });\n }, this.cloudConfig.maxBatchWaitMs);\n }\n\n private async flushBuffer(): Promise<void> {\n // Clear timer since we're flushing\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n this.flushTimer = null;\n }\n\n if (this.buffer.totalSize === 0) {\n return; // Nothing to flush\n }\n\n if (this.authFailureCooldown.dropEventsIfCoolingDown(this.buffer.totalSize)) {\n this.resetBuffer();\n return;\n }\n\n const startTime = Date.now();\n const spansCopy = [...this.buffer.spans];\n const logsCopy = [...this.buffer.logs];\n const metricsCopy = [...this.buffer.metrics];\n const scoresCopy = [...this.buffer.scores];\n const feedbackCopy = [...this.buffer.feedback];\n const batchSize = this.buffer.totalSize;\n const flushReason = this.buffer.totalSize >= this.cloudConfig.maxBatchSize ? 'size' : 'time';\n\n // Reset buffer immediately to prevent blocking new events\n this.resetBuffer();\n\n const results = await Promise.all([\n this.flushSignalBatch('traces', spansCopy),\n this.flushSignalBatch('logs', logsCopy),\n this.flushSignalBatch('metrics', metricsCopy),\n this.flushSignalBatch('scores', scoresCopy),\n this.flushSignalBatch('feedback', feedbackCopy),\n ]);\n\n const failedSignals = results.filter(result => !result.succeeded).map(result => result.signal);\n const authFailure = results.find(result => result.authFailureStatus !== undefined);\n\n const elapsed = Date.now() - startTime;\n\n if (failedSignals.length === 0) {\n const droppedEventsDuringAuthCooldown = this.authFailureCooldown.reset();\n const logData: Record<string, number | string> = {\n batchSize,\n flushReason,\n durationMs: elapsed,\n };\n\n if (droppedEventsDuringAuthCooldown > 0) {\n logData.droppedEventsDuringAuthCooldown = droppedEventsDuringAuthCooldown;\n }\n\n this.logger.debug('Batch flushed successfully', logData);\n return;\n }\n\n if (authFailure?.authFailureStatus !== undefined) {\n this.authFailureCooldown.recordFailure({\n status: authFailure.authFailureStatus,\n failedSignals,\n droppedBatchSize: batchSize,\n });\n }\n\n this.logger.warn('Batch flush completed with dropped signal batches', {\n batchSize,\n flushReason,\n durationMs: elapsed,\n failedSignals,\n });\n }\n\n /**\n * Uploads a signal batch to the configured cloud API using fetchWithRetry.\n */\n private async batchUpload<T>(signal: CloudSignal, records: T[]): Promise<void> {\n const headers = {\n Authorization: `Bearer ${this.cloudConfig.accessToken}`,\n 'Content-Type': 'application/json',\n };\n\n const endpointMap: Record<CloudSignal, string> = {\n traces: this.cloudConfig.tracesEndpoint,\n logs: this.cloudConfig.logsEndpoint,\n metrics: this.cloudConfig.metricsEndpoint,\n scores: this.cloudConfig.scoresEndpoint,\n feedback: this.cloudConfig.feedbackEndpoint,\n };\n\n const options: RequestInit = {\n method: 'POST',\n headers,\n body: JSON.stringify({ [SIGNAL_PUBLISH_SEGMENTS[signal]]: records }),\n };\n\n await fetchWithAuthFailureHandling(endpointMap[signal], options, this.cloudConfig.maxRetries);\n }\n\n private async flushSignalBatch<T>(\n signal: CloudSignal,\n records: T[],\n ): Promise<{ signal: CloudSignal; succeeded: boolean; authFailureStatus?: number }> {\n if (records.length === 0) {\n return { signal, succeeded: true };\n }\n\n try {\n await this.batchUpload(signal, records);\n return { signal, succeeded: true };\n } catch (error) {\n if (isAuthFailureError(error)) {\n return { signal, succeeded: false, authFailureStatus: error.status };\n }\n\n const errorId = `CLOUD_EXPORTER_FAILED_TO_BATCH_UPLOAD_${signal.toUpperCase()}` as Uppercase<string>;\n const mastraError = new MastraError(\n {\n id: errorId,\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.USER,\n details: {\n signal,\n droppedBatchSize: records.length,\n },\n },\n error,\n );\n this.logger.trackException(mastraError);\n this.logger.error('Batch upload failed after all retries, dropping batch', mastraError);\n return { signal, succeeded: false };\n }\n }\n\n private resetBuffer(): void {\n this.buffer.spans = [];\n this.buffer.logs = [];\n this.buffer.metrics = [];\n this.buffer.scores = [];\n this.buffer.feedback = [];\n this.buffer.firstEventTime = undefined;\n this.buffer.totalSize = 0;\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 // Skip if disabled\n if (this.isDisabled) {\n return;\n }\n\n while (this.buffer.totalSize > 0 || this.inFlightFlushes.size > 0) {\n if (this.buffer.totalSize > 0) {\n this.logger.debug('Flushing buffered events', {\n bufferedEvents: this.buffer.totalSize,\n });\n\n const flushPromise = this.flushBuffer();\n this.inFlightFlushes.add(flushPromise);\n\n try {\n await flushPromise;\n } finally {\n this.inFlightFlushes.delete(flushPromise);\n }\n\n continue;\n }\n\n await Promise.allSettled([...this.inFlightFlushes]);\n }\n }\n\n async shutdown(): Promise<void> {\n // Skip if disabled\n if (this.isDisabled) {\n return;\n }\n\n // Clear any pending timer\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n this.flushTimer = null;\n }\n\n try {\n await this.flush();\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: `CLOUD_EXPORTER_FAILED_TO_FLUSH_REMAINING_EVENTS_DURING_SHUTDOWN`,\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.USER,\n details: {\n remainingEvents: this.buffer.totalSize,\n },\n },\n error,\n );\n\n this.logger.trackException(mastraError);\n this.logger.error('Failed to flush remaining events during shutdown', mastraError);\n }\n\n this.logger.info('CloudExporter shutdown complete');\n }\n}\n","import { TracingEventType } from '@mastra/core/observability';\nimport type { TracingEvent } from '@mastra/core/observability';\nimport { BaseExporter } from './base';\nimport type { BaseExporterConfig } from './base';\n\nexport class ConsoleExporter extends BaseExporter {\n name = 'tracing-console-exporter';\n\n constructor(config: BaseExporterConfig = {}) {\n super(config);\n }\n\n protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n const span = event.exportedSpan;\n\n // Helper to safely stringify attributes (filtering already done by processor)\n const formatAttributes = (attributes: any) => {\n try {\n return JSON.stringify(attributes, null, 2);\n } catch (error) {\n const errMsg = error instanceof Error ? error.message : 'Unknown formatting error';\n return `[Unable to serialize attributes: ${errMsg}]`;\n }\n };\n\n // Helper to format duration\n const formatDuration = (startTime: Date, endTime?: Date) => {\n if (!endTime) return 'N/A';\n const duration = endTime.getTime() - startTime.getTime();\n return `${duration}ms`;\n };\n\n switch (event.type) {\n case TracingEventType.SPAN_STARTED:\n this.logger.info(`🚀 SPAN_STARTED`);\n this.logger.info(` Type: ${span.type}`);\n this.logger.info(` Name: ${span.name}`);\n this.logger.info(` ID: ${span.id}`);\n this.logger.info(` Trace ID: ${span.traceId}`);\n if (span.input !== undefined) {\n this.logger.info(` Input: ${formatAttributes(span.input)}`);\n }\n this.logger.info(` Attributes: ${formatAttributes(span.attributes)}`);\n this.logger.info('─'.repeat(80));\n break;\n\n case TracingEventType.SPAN_ENDED:\n const duration = formatDuration(span.startTime, span.endTime);\n this.logger.info(`✅ SPAN_ENDED`);\n this.logger.info(` Type: ${span.type}`);\n this.logger.info(` Name: ${span.name}`);\n this.logger.info(` ID: ${span.id}`);\n this.logger.info(` Duration: ${duration}`);\n this.logger.info(` Trace ID: ${span.traceId}`);\n if (span.input !== undefined) {\n this.logger.info(` Input: ${formatAttributes(span.input)}`);\n }\n if (span.output !== undefined) {\n this.logger.info(` Output: ${formatAttributes(span.output)}`);\n }\n if (span.errorInfo) {\n this.logger.info(` Error: ${formatAttributes(span.errorInfo)}`);\n }\n this.logger.info(` Attributes: ${formatAttributes(span.attributes)}`);\n this.logger.info('─'.repeat(80));\n break;\n\n case TracingEventType.SPAN_UPDATED:\n this.logger.info(`📝 SPAN_UPDATED`);\n this.logger.info(` Type: ${span.type}`);\n this.logger.info(` Name: ${span.name}`);\n this.logger.info(` ID: ${span.id}`);\n this.logger.info(` Trace ID: ${span.traceId}`);\n if (span.input !== undefined) {\n this.logger.info(` Input: ${formatAttributes(span.input)}`);\n }\n if (span.output !== undefined) {\n this.logger.info(` Output: ${formatAttributes(span.output)}`);\n }\n if (span.errorInfo) {\n this.logger.info(` Error: ${formatAttributes(span.errorInfo)}`);\n }\n this.logger.info(` Updated Attributes: ${formatAttributes(span.attributes)}`);\n this.logger.info('─'.repeat(80));\n break;\n\n default:\n this.logger.warn(`Tracing event type not implemented: ${(event as any).type}`);\n }\n }\n\n async shutdown(): Promise<void> {\n this.logger.info('ConsoleExporter shutdown');\n }\n}\n","import { TracingEventType } from '@mastra/core/observability';\nimport type { AnyExportedSpan, ObservabilityEvent } from '@mastra/core/observability';\nimport type { CreateSpanRecord, ObservabilityStorageStrategy, UpdateSpanRecord } from '@mastra/core/storage';\n\n/** Mixin interface that tracks how many times a buffered event has been retried. */\nexport interface RetryCount {\n retryCount: number;\n}\n\n/** A partial span update record keyed by trace and span ID. */\nexport interface UpdateSpanPartial {\n traceId: string;\n spanId: string;\n updates: Partial<UpdateSpanRecord>;\n}\n\n/** An observability event augmented with retry tracking for the buffer. */\nexport type BufferedEvent = ObservabilityEvent & RetryCount;\n\n/**\n * Buffers observability events (creates and updates) for batch flushing.\n * Handles strategy-aware routing of tracing events and tracks created spans\n * so updates can be deferred until their parent create has been flushed.\n */\nexport class EventBuffer {\n #preInit: BufferedEvent[] = [];\n #creates: BufferedEvent[] = [];\n #updates: BufferedEvent[] = [];\n #allCreatedSpans: Set<string> = new Set();\n #firstEventTime?: Date;\n #storageStrategy?: ObservabilityStorageStrategy;\n #maxRetries: number;\n\n constructor(args: { maxRetries: number }) {\n this.#maxRetries = args.maxRetries;\n }\n\n /** Initialize with a storage strategy and replay any pre-init events. */\n init(args: { strategy: ObservabilityStorageStrategy }): void {\n if (!this.#storageStrategy) {\n this.#storageStrategy = args.strategy;\n for (const event of this.#preInit) {\n this.addEvent(event);\n }\n this.#preInit = [];\n }\n }\n\n /** Clear the create and update buffers and reset the event timer. */\n reset() {\n this.#creates = [];\n this.#updates = [];\n this.#firstEventTime = undefined;\n }\n\n private setFirstEventTime(): void {\n if (!this.#firstEventTime) {\n this.#firstEventTime = new Date();\n }\n }\n\n private pushCreate(event: ObservabilityEvent): void {\n this.setFirstEventTime();\n this.#creates.push({ ...event, retryCount: 0 });\n }\n\n private pushUpdate(event: ObservabilityEvent): void {\n this.setFirstEventTime();\n this.#updates.push({ ...event, retryCount: 0 });\n }\n\n /** Route an event to the create or update buffer based on its type and the storage strategy. */\n addEvent(event: ObservabilityEvent) {\n if (!this.#storageStrategy) {\n this.#preInit.push({ ...event, retryCount: 0 });\n return;\n }\n\n switch (event.type) {\n case TracingEventType.SPAN_STARTED:\n // Strategy 'insert-only' ignores SPAN_STARTED events\n switch (this.#storageStrategy) {\n case 'realtime':\n case 'event-sourced':\n case 'batch-with-updates':\n this.pushCreate(event);\n break;\n }\n break;\n\n case TracingEventType.SPAN_UPDATED:\n // Strategies 'insert-only' and 'event-sourced' ignore SPAN_UPDATED events\n switch (this.#storageStrategy) {\n case 'realtime':\n case 'batch-with-updates':\n this.pushUpdate(event);\n break;\n }\n break;\n\n case TracingEventType.SPAN_ENDED:\n if (event.exportedSpan.isEvent) {\n this.pushCreate(event);\n } else {\n switch (this.#storageStrategy) {\n case 'realtime':\n case 'batch-with-updates':\n this.pushUpdate(event);\n break;\n default:\n this.pushCreate(event);\n break;\n }\n }\n break;\n\n default:\n // Non-tracing signals (metric, log, score, feedback) → creates\n this.pushCreate(event);\n break;\n }\n }\n\n /** Re-add failed create events to the buffer, returning events that exceed max retries. */\n reAddCreates(events: BufferedEvent[]): BufferedEvent[] {\n const retryable: BufferedEvent[] = [];\n const dropped: BufferedEvent[] = [];\n\n for (const e of events) {\n if (++e.retryCount <= this.#maxRetries) {\n retryable.push(e);\n } else {\n dropped.push(e);\n }\n }\n\n if (retryable.length > 0) {\n this.setFirstEventTime();\n this.#creates.push(...retryable);\n }\n\n return dropped;\n }\n\n /** Re-add failed update events to the buffer, returning events that exceed max retries. */\n reAddUpdates(events: BufferedEvent[]): BufferedEvent[] {\n const retryable: BufferedEvent[] = [];\n const dropped: BufferedEvent[] = [];\n\n for (const e of events) {\n if (++e.retryCount <= this.#maxRetries) {\n retryable.push(e);\n } else {\n dropped.push(e);\n }\n }\n\n if (retryable.length > 0) {\n this.setFirstEventTime();\n this.#updates.push(...retryable);\n }\n\n return dropped;\n }\n\n /** Snapshot of buffered create events. */\n get creates(): BufferedEvent[] {\n return [...this.#creates];\n }\n\n /** Snapshot of buffered update events. */\n get updates(): BufferedEvent[] {\n return [...this.#updates];\n }\n\n /** Total number of buffered events (creates + updates). */\n get totalSize(): number {\n return this.#creates.length + this.#updates.length;\n }\n\n /** Milliseconds since the first event was buffered in the current batch. */\n get elapsed(): number {\n if (!this.#firstEventTime) {\n return 0;\n }\n return Date.now() - this.#firstEventTime.getTime();\n }\n\n /**\n * Builds a unique span key for tracking\n */\n private buildSpanKey(span: CreateSpanRecord | UpdateSpanPartial | { traceId: string; spanId: string }): string {\n return `${span.traceId}:${span.spanId}`;\n }\n\n /** Track successfully created spans so updates can verify span existence before flushing. */\n addCreatedSpans(args: { records: CreateSpanRecord[] }): void {\n if (this.#storageStrategy === 'event-sourced' || this.#storageStrategy === 'insert-only') {\n // no need to track spans if strategy is 'insert-only' or 'event-sourced'\n return;\n }\n\n for (const createRecord of args.records) {\n // no need to track event spans\n if (!createRecord.isEvent) {\n this.#allCreatedSpans.add(this.buildSpanKey(createRecord));\n }\n }\n }\n\n /** Check whether a span's create record has already been flushed to storage. */\n spanExists(span: AnyExportedSpan): boolean {\n return this.#allCreatedSpans?.has(this.buildSpanKey({ traceId: span.traceId, spanId: span.id }));\n }\n\n /** Remove completed spans from tracking after their SPAN_ENDED updates are flushed. */\n endFinishedSpans(args: { records: UpdateSpanPartial[] }): void {\n if (this.#storageStrategy === 'event-sourced' || this.#storageStrategy === 'insert-only') {\n // no need to track spans if strategy is 'insert-only' or 'event-sourced'\n return;\n }\n args.records.forEach(r => {\n this.#allCreatedSpans.delete(this.buildSpanKey(r));\n });\n }\n}\n","import { MastraError, ErrorDomain } from '@mastra/core/error';\nimport type { IMastraLogger } from '@mastra/core/logger';\nimport type {\n TracingEvent,\n InitExporterOptions,\n MetricEvent,\n LogEvent,\n ScoreEvent,\n FeedbackEvent,\n ObservabilityDropEvent,\n ObservabilityDropReason,\n ObservabilityDropSignal,\n} from '@mastra/core/observability';\nimport { TracingEventType } from '@mastra/core/observability';\nimport type { ObservabilityStorage, TracingStorageStrategy, MastraCompositeStore } from '@mastra/core/storage';\nimport {\n buildCreateSpanRecord,\n buildUpdateSpanRecord,\n buildMetricRecord,\n buildLogRecord,\n buildScoreRecord,\n buildFeedbackRecord,\n} from '@mastra/core/storage';\nimport type { BaseExporterConfig } from './base';\nimport { BaseExporter } from './base';\nimport { EventBuffer } from './event-buffer';\nimport type { BufferedEvent, RetryCount, UpdateSpanPartial } from './event-buffer';\n\n/**\n * Configuration for the DefaultExporter's batching, retry, and strategy behavior.\n *\n * @deprecated Use `MastraStorageExporterConfig` from `@mastra/observability` instead.\n * This interface is kept for backward compatibility and will be removed in a\n * future major version.\n */\ninterface DefaultExporterConfig extends BaseExporterConfig {\n maxBatchSize?: number; // Default: 1000 spans\n maxBufferSize?: number; // Default: 10000 spans\n maxBatchWaitMs?: number; // Default: 5000ms\n maxRetries?: number; // Default: 4\n retryDelayMs?: number; // Default: 500ms (base delay for exponential backoff)\n\n // Strategy selection (optional)\n strategy?: TracingStorageStrategy | 'auto';\n}\n\n/**\n * Resolves the final tracing storage strategy based on config and observability store hints\n */\nfunction resolveTracingStorageStrategy(\n config: DefaultExporterConfig,\n observabilityStorage: ObservabilityStorage,\n storageName: string,\n logger: IMastraLogger,\n): TracingStorageStrategy {\n const observabilityStrategy = observabilityStorage.observabilityStrategy;\n if (config.strategy && config.strategy !== 'auto') {\n if (observabilityStrategy.supported.includes(config.strategy)) {\n return config.strategy;\n }\n // Log warning and fall through to auto-selection\n logger.warn('User-specified tracing strategy not supported by storage adapter, falling back to auto-selection', {\n userStrategy: config.strategy,\n storageAdapter: storageName,\n supportedStrategies: observabilityStrategy.supported,\n fallbackStrategy: observabilityStrategy.preferred,\n });\n }\n return observabilityStrategy.preferred;\n}\n\ntype Resolve = (value: void | PromiseLike<void>) => void;\n\n/**\n * @deprecated Use `MastraStorageExporter` from `@mastra/observability` instead.\n * This class is preserved unchanged so existing integrations (including code\n * that matches on the `mastra-default-observability-exporter` exporter name)\n * keep working. It will be removed in a future major version.\n *\n * Default storage-backed exporter. Buffers observability events and flushes them\n * in batches to the configured ObservabilityStorage backend with retry support.\n */\nexport class DefaultExporter extends BaseExporter {\n name = 'mastra-default-observability-exporter';\n\n #config: DefaultExporterConfig;\n #isInitializing = false;\n #initPromises: Set<Resolve> = new Set();\n #eventBuffer: EventBuffer;\n\n #storage?: MastraCompositeStore;\n #observabilityStorage?: ObservabilityStorage;\n #resolvedStrategy?: TracingStorageStrategy;\n #flushTimer?: NodeJS.Timeout;\n #emitDropEvent?: (event: ObservabilityDropEvent) => void;\n\n // Signals whose storage methods threw \"not implemented\" — skip on future flushes\n #unsupportedSignals: Set<ObservabilityDropSignal> = new Set();\n\n constructor(config: DefaultExporterConfig = {}) {\n super(config);\n\n // Set default configuration\n this.#config = {\n ...config,\n maxBatchSize: config.maxBatchSize ?? 1000,\n maxBufferSize: config.maxBufferSize ?? 10000,\n maxBatchWaitMs: config.maxBatchWaitMs ?? 5000,\n maxRetries: config.maxRetries ?? 4,\n retryDelayMs: config.retryDelayMs ?? 500,\n strategy: config.strategy ?? 'auto',\n };\n\n this.#eventBuffer = new EventBuffer({ maxRetries: this.#config.maxRetries ?? 4 });\n }\n\n /**\n * Initialize the exporter (called after all dependencies are ready)\n */\n async init(options: InitExporterOptions): Promise<void> {\n try {\n this.#isInitializing = true;\n this.#emitDropEvent = options.emitDropEvent;\n\n this.#storage = options.mastra?.getStorage();\n if (!this.#storage) {\n this.logger.warn('DefaultExporter disabled: Storage not available. Traces will not be persisted.');\n return;\n }\n\n this.#observabilityStorage = await this.#storage.getStore('observability');\n if (!this.#observabilityStorage) {\n this.logger.warn(\n 'DefaultExporter disabled: Observability storage not available. Traces will not be persisted.',\n );\n return;\n }\n\n // Initialize the resolved strategy once observability store is available\n if (!this.#resolvedStrategy) {\n this.#resolvedStrategy = resolveTracingStorageStrategy(\n this.#config,\n this.#observabilityStorage,\n this.#storage.constructor.name,\n this.logger,\n );\n\n this.logger.debug('tracing storage exporter initialized', {\n strategy: this.#resolvedStrategy,\n source: this.#config.strategy !== 'auto' ? 'user' : 'auto',\n storageAdapter: this.#storage.constructor.name,\n maxBatchSize: this.#config.maxBatchSize,\n maxBatchWaitMs: this.#config.maxBatchWaitMs,\n });\n }\n\n if (this.#resolvedStrategy) {\n this.#eventBuffer.init({ strategy: this.#resolvedStrategy });\n }\n } finally {\n this.#isInitializing = false;\n /**\n * Assumes caller waits until export of a parent span is completed before calling\n * export for child spans , order is not relevant for resolve\n */\n this.#initPromises.forEach(resolve => {\n resolve();\n });\n this.#initPromises.clear();\n }\n }\n\n /**\n * Checks if buffer should be flushed based on size or time triggers\n */\n private shouldFlush(): boolean {\n if (this.#resolvedStrategy === 'realtime') {\n return true;\n }\n\n // Emergency flush - buffer overflow\n if (this.#eventBuffer.totalSize >= this.#config.maxBufferSize!) {\n return true;\n }\n\n // Size-based flush\n if (this.#eventBuffer.totalSize >= this.#config.maxBatchSize!) {\n return true;\n }\n\n // Time-based flush\n if (this.#eventBuffer.totalSize > 0) {\n if (this.#eventBuffer.elapsed >= this.#config.maxBatchWaitMs!) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Schedules a flush using setTimeout\n */\n private scheduleFlush(): void {\n if (this.#flushTimer) {\n clearTimeout(this.#flushTimer);\n }\n this.#flushTimer = setTimeout(() => {\n this.flushBuffer().catch(error => {\n this.logger.error('Scheduled flush failed', {\n error: error instanceof Error ? error.message : String(error),\n });\n });\n }, this.#config.maxBatchWaitMs);\n }\n\n /**\n * Checks flush triggers and schedules/triggers flush as needed.\n * Called after adding any event to the buffer.\n * Returns the flush promise when flushing so callers can await it.\n */\n private async handleBatchedFlush(): Promise<void> {\n if (this.shouldFlush()) {\n await this.flushBuffer();\n } else if (this.#eventBuffer.totalSize === 1) {\n this.scheduleFlush();\n }\n }\n\n private sanitizeDropError(error: unknown): ObservabilityDropEvent['error'] {\n if (error instanceof MastraError) {\n return {\n id: error.id,\n domain: String(error.domain),\n message: error.message,\n };\n }\n\n if (error instanceof Error) {\n return { message: error.message };\n }\n\n return { message: String(error) };\n }\n\n private emitDrop(\n signal: ObservabilityDropSignal,\n reason: ObservabilityDropReason,\n count: number,\n error?: unknown,\n ): void {\n if (count === 0) return;\n\n const dropEvent: ObservabilityDropEvent = {\n type: 'drop',\n signal,\n reason,\n count,\n timestamp: new Date(),\n exporterName: this.name,\n ...(this.#observabilityStorage ? { storageName: this.#observabilityStorage.constructor.name } : {}),\n ...(error === undefined ? {} : { error: this.sanitizeDropError(error) }),\n };\n\n this.#emitDropEvent?.(dropEvent);\n }\n\n /**\n * Flush a batch of create events for a single signal type.\n * On \"not implemented\" errors, disables the signal for future flushes.\n * On other errors, re-adds events to the buffer for retry.\n */\n private async flushCreates<T extends BufferedEvent>(\n signal: ObservabilityDropSignal,\n events: T[],\n storageCall: (events: T[]) => Promise<void>,\n ): Promise<void> {\n if (events.length === 0) return;\n if (this.#unsupportedSignals.has(signal)) {\n this.emitDrop(signal, 'unsupported-storage', events.length);\n return;\n }\n\n try {\n await storageCall(events);\n } catch (error) {\n if (\n error instanceof MastraError &&\n error.domain === ErrorDomain.MASTRA_OBSERVABILITY &&\n error.id.endsWith('_NOT_IMPLEMENTED')\n ) {\n this.logger.warn(error.message);\n this.#unsupportedSignals.add(signal);\n this.emitDrop(signal, 'unsupported-storage', events.length, error);\n } else {\n const dropped = this.#eventBuffer.reAddCreates(events);\n this.emitDrop(signal, 'retry-exhausted', dropped.length, error);\n }\n }\n }\n\n /**\n * Flush span update/end events, deferring any whose span hasn't been created yet.\n * When `isEnd` is true, successfully flushed spans are removed from tracking.\n */\n private async flushSpanUpdates(\n events: (TracingEvent & RetryCount)[],\n deferredUpdates: BufferedEvent[],\n isEnd: boolean,\n ): Promise<void> {\n const deferredCountAtEntry = deferredUpdates.length;\n if (events.length === 0) return;\n if (this.#unsupportedSignals.has('tracing')) {\n this.emitDrop('tracing', 'unsupported-storage', events.length);\n return;\n }\n\n const partials: UpdateSpanPartial[] = [];\n for (const event of events) {\n const span = event.exportedSpan;\n if (this.#eventBuffer.spanExists(span)) {\n partials.push({\n traceId: span.traceId,\n spanId: span.id,\n updates: buildUpdateSpanRecord(span),\n });\n } else {\n deferredUpdates.push(event);\n }\n }\n\n if (partials.length === 0) return;\n\n try {\n await this.#observabilityStorage!.batchUpdateSpans({ records: partials });\n if (isEnd) {\n this.#eventBuffer.endFinishedSpans({ records: partials });\n }\n } catch (error) {\n if (\n error instanceof MastraError &&\n error.domain === ErrorDomain.MASTRA_OBSERVABILITY &&\n error.id.endsWith('_NOT_IMPLEMENTED')\n ) {\n this.logger.warn(error.message);\n this.#unsupportedSignals.add('tracing');\n deferredUpdates.length = 0;\n this.emitDrop('tracing', 'unsupported-storage', events.length + deferredCountAtEntry, error);\n } else {\n // `events` includes both partials-bound and newly-deferred entries, so\n // re-adding it would double-add the newly-deferred ones if they stayed\n // in deferredUpdates. Splice off only what this call appended — entries\n // from a prior flushSpanUpdates call must survive.\n const newlyDeferred = deferredUpdates.length - deferredCountAtEntry;\n if (newlyDeferred > 0) {\n deferredUpdates.splice(deferredUpdates.length - newlyDeferred, newlyDeferred);\n }\n const dropped = this.#eventBuffer.reAddUpdates(events);\n this.emitDrop('tracing', 'retry-exhausted', dropped.length, error);\n }\n }\n }\n\n /**\n * Flushes the current buffer to storage.\n *\n * Creates are flushed first, then their span keys are added to allCreatedSpans.\n * Updates are checked against allCreatedSpans — those whose span hasn't been\n * created yet are re-inserted into the live buffer for the next flush.\n * Completed spans (SPAN_ENDED) are cleaned up from allCreatedSpans after success.\n */\n private async flushBuffer(): Promise<void> {\n if (!this.#observabilityStorage) {\n this.logger.debug('Cannot flush. Observability storage is not initialized');\n return;\n }\n if (!this.#resolvedStrategy) {\n this.logger.debug('Cannot flush. Observability strategy is not resolved');\n return;\n }\n\n // Clear timer since we're flushing\n if (this.#flushTimer) {\n clearTimeout(this.#flushTimer);\n this.#flushTimer = undefined;\n }\n\n if (this.#eventBuffer.totalSize === 0) {\n return;\n }\n\n const startTime = Date.now();\n const batchSize = this.#eventBuffer.totalSize;\n\n // Snapshot and reset buffer so new events can accumulate during flush\n const creates = this.#eventBuffer.creates;\n const updates = this.#eventBuffer.updates;\n this.#eventBuffer.reset();\n\n const createFeedbackEvents: (FeedbackEvent & RetryCount)[] = [];\n const createLogEvents: (LogEvent & RetryCount)[] = [];\n const createMetricEvents: (MetricEvent & RetryCount)[] = [];\n const createScoreEvents: (ScoreEvent & RetryCount)[] = [];\n const createSpanEvents: (TracingEvent & RetryCount)[] = [];\n\n const updateSpanEvents: (TracingEvent & RetryCount)[] = [];\n const endSpanEvents: (TracingEvent & RetryCount)[] = [];\n\n for (const createEvent of creates) {\n switch (createEvent.type) {\n case 'feedback':\n createFeedbackEvents.push(createEvent);\n break;\n case 'log':\n createLogEvents.push(createEvent);\n break;\n case 'metric':\n createMetricEvents.push(createEvent);\n break;\n case 'score':\n createScoreEvents.push(createEvent);\n break;\n default:\n createSpanEvents.push(createEvent);\n break;\n }\n }\n\n for (const updateEvent of updates) {\n switch (updateEvent.type) {\n case TracingEventType.SPAN_UPDATED:\n updateSpanEvents.push(updateEvent);\n break;\n case TracingEventType.SPAN_ENDED:\n endSpanEvents.push(updateEvent);\n break;\n }\n }\n\n // Flush all creates in parallel — signals are independent\n await Promise.all([\n this.flushCreates('feedback', createFeedbackEvents, events =>\n this.#observabilityStorage!.batchCreateFeedback({ feedbacks: events.map(f => buildFeedbackRecord(f)) }),\n ),\n this.flushCreates('log', createLogEvents, events =>\n this.#observabilityStorage!.batchCreateLogs({ logs: events.map(l => buildLogRecord(l)) }),\n ),\n this.flushCreates('metric', createMetricEvents, events =>\n this.#observabilityStorage!.batchCreateMetrics({ metrics: events.map(m => buildMetricRecord(m)) }),\n ),\n this.flushCreates('score', createScoreEvents, events =>\n this.#observabilityStorage!.batchCreateScores({ scores: events.map(s => buildScoreRecord(s)) }),\n ),\n this.flushCreates('tracing', createSpanEvents, async events => {\n const records = events.map(t => buildCreateSpanRecord(t.exportedSpan));\n await this.#observabilityStorage!.batchCreateSpans({ records });\n this.#eventBuffer.addCreatedSpans({ records });\n }),\n ]);\n\n // Flush span updates and ends — check span existence, defer if not yet created\n const deferredUpdates: BufferedEvent[] = [];\n\n await this.flushSpanUpdates(updateSpanEvents, deferredUpdates, false);\n await this.flushSpanUpdates(endSpanEvents, deferredUpdates, true);\n\n if (deferredUpdates.length > 0) {\n if (this.#unsupportedSignals.has('tracing')) {\n this.emitDrop('tracing', 'unsupported-storage', deferredUpdates.length);\n deferredUpdates.length = 0;\n } else {\n const dropped = this.#eventBuffer.reAddUpdates(deferredUpdates);\n this.emitDrop('tracing', 'retry-exhausted', dropped.length);\n }\n }\n\n const elapsed = Date.now() - startTime;\n this.logger.debug('Batch flushed', {\n strategy: this.#resolvedStrategy,\n batchSize,\n durationMs: elapsed,\n deferredUpdates: deferredUpdates.length > 0 ? deferredUpdates.length : undefined,\n });\n return; // Success\n }\n\n async _exportTracingEvent(event: TracingEvent): Promise<void> {\n await this.waitForInit();\n if (!this.#observabilityStorage) {\n this.logger.debug('Cannot store traces. Observability storage is not initialized');\n return;\n }\n\n this.#eventBuffer.addEvent(event);\n await this.handleBatchedFlush();\n }\n\n /**\n * Resolves when an ongoing init call is finished\n * Doesn't wait for the caller to call init\n * @returns\n */\n private async waitForInit(): Promise<void> {\n if (!this.#isInitializing) return;\n return new Promise(resolve => {\n this.#initPromises.add(resolve);\n });\n }\n\n /**\n * Handle metric events — buffer for batch flush.\n */\n async onMetricEvent(event: MetricEvent): Promise<void> {\n await this.waitForInit();\n if (!this.#observabilityStorage) return;\n\n this.#eventBuffer.addEvent(event);\n await this.handleBatchedFlush();\n }\n\n /**\n * Handle log events — buffer for batch flush.\n */\n async onLogEvent(event: LogEvent): Promise<void> {\n await this.waitForInit();\n if (!this.#observabilityStorage) return;\n\n this.#eventBuffer.addEvent(event);\n await this.handleBatchedFlush();\n }\n\n /**\n * Handle score events — buffer for batch flush.\n */\n async onScoreEvent(event: ScoreEvent): Promise<void> {\n await this.waitForInit();\n if (!this.#observabilityStorage) return;\n\n this.#eventBuffer.addEvent(event);\n await this.handleBatchedFlush();\n }\n\n /**\n * Handle feedback events — buffer for batch flush.\n */\n async onFeedbackEvent(event: FeedbackEvent): Promise<void> {\n await this.waitForInit();\n if (!this.#observabilityStorage) return;\n\n this.#eventBuffer.addEvent(event);\n await this.handleBatchedFlush();\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.#eventBuffer.totalSize > 0) {\n this.logger.debug('Flushing buffered events', {\n bufferedEvents: this.#eventBuffer.totalSize,\n });\n await this.flushBuffer();\n }\n }\n\n async shutdown(): Promise<void> {\n // Clear any pending timer\n if (this.#flushTimer) {\n clearTimeout(this.#flushTimer);\n this.#flushTimer = undefined;\n }\n\n // Flush any remaining events\n await this.flush();\n\n this.logger.info('DefaultExporter shutdown complete');\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { LogLevel } from '@mastra/core/logger';\nimport { SpanType, TracingEventType } from '@mastra/core/observability';\nimport type {\n TracingEvent,\n AnyExportedSpan,\n LogEvent,\n MetricEvent,\n ScoreEvent,\n FeedbackEvent,\n} from '@mastra/core/observability';\nimport { AuthFailureCooldown, fetchWithAuthFailureHandling, isAuthFailureError } from './auth-failure-cooldown';\nimport { BaseExporter } from './base';\nimport type { BaseExporterConfig } from './base';\n\nexport interface MastraPlatformExporterConfig extends BaseExporterConfig {\n maxBatchSize?: number; // Default: 1000 spans\n maxBatchWaitMs?: number; // Default: 5000ms\n maxRetries?: number; // Default: 3\n\n accessToken?: string; // Mastra Observability access token (from env or config)\n projectId?: string; // Project ID for project-scoped collector routes\n endpoint?: string; // Base observability endpoint\n tracesEndpoint?: string; // Explicit traces endpoint override\n logsEndpoint?: string; // Explicit logs endpoint override\n metricsEndpoint?: string; // Explicit metrics endpoint override\n scoresEndpoint?: string; // Explicit scores endpoint override\n feedbackEndpoint?: string; // Explicit feedback endpoint override\n}\n\ntype PlatformSignal = 'traces' | 'logs' | 'metrics' | 'scores' | 'feedback';\n\nconst SIGNAL_PUBLISH_SUFFIXES: Record<PlatformSignal, string> = {\n traces: '/spans/publish',\n logs: '/logs/publish',\n metrics: '/metrics/publish',\n scores: '/scores/publish',\n feedback: '/feedback/publish',\n};\n\nconst DEFAULT_PLATFORM_SPAN_FILTER = (span: AnyExportedSpan): boolean => span.type !== SpanType.MODEL_CHUNK;\n\nconst SIGNAL_PUBLISH_SEGMENTS: Record<PlatformSignal, string> = {\n traces: 'spans',\n logs: 'logs',\n metrics: 'metrics',\n scores: 'scores',\n feedback: 'feedback',\n};\n\nfunction trimTrailingSlashes(value: string): string {\n let end = value.length;\n while (end > 0 && value.charCodeAt(end - 1) === 47) {\n end--;\n }\n return end === value.length ? value : value.slice(0, end);\n}\n\nfunction createInvalidEndpointError(endpoint: string, text: string, cause?: unknown): MastraError {\n return new MastraError(\n {\n id: `MASTRA_PLATFORM_EXPORTER_INVALID_ENDPOINT`,\n text,\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.USER,\n details: {\n endpoint,\n },\n },\n cause,\n );\n}\n\nconst VALID_PROJECT_ID = /^[a-zA-Z0-9_-]+$/;\n\nfunction createInvalidProjectIdError(projectId: string): MastraError {\n return new MastraError({\n id: `MASTRA_PLATFORM_EXPORTER_INVALID_PROJECT_ID`,\n text: 'MastraPlatformExporter projectId must only contain letters, numbers, hyphens, and underscores.',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.USER,\n details: {\n projectId,\n },\n });\n}\n\nfunction resolveBaseEndpoint(baseEndpoint: string): string {\n const normalizedEndpoint = trimTrailingSlashes(baseEndpoint);\n const invalidText =\n 'MastraPlatformExporter endpoint must be a base origin like \"https://collector.example.com\" with no path, search, or hash.';\n\n try {\n const parsedEndpoint = new URL(normalizedEndpoint);\n if (parsedEndpoint.pathname !== '/' || parsedEndpoint.search || parsedEndpoint.hash) {\n throw createInvalidEndpointError(baseEndpoint, invalidText);\n }\n return trimTrailingSlashes(parsedEndpoint.origin);\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n\n throw createInvalidEndpointError(baseEndpoint, invalidText, error);\n }\n}\n\nfunction buildSignalPath(signal: PlatformSignal, projectId?: string): string {\n const signalSegment = SIGNAL_PUBLISH_SEGMENTS[signal];\n if (!projectId) {\n return `/ai/${signalSegment}/publish`;\n }\n\n return `/projects/${projectId}/ai/${signalSegment}/publish`;\n}\n\nfunction buildSignalEndpoint(baseEndpoint: string, signal: PlatformSignal, projectId?: string): string {\n return `${baseEndpoint}${buildSignalPath(signal, projectId)}`;\n}\n\nfunction resolveExplicitSignalEndpoint(signal: PlatformSignal, endpoint: string, projectId?: string): string {\n const normalizedEndpoint = trimTrailingSlashes(endpoint);\n const invalidText = `MastraPlatformExporter ${signal}Endpoint must be a base origin like \"https://collector.example.com\" or a full ${signal} publish URL ending in \"${SIGNAL_PUBLISH_SUFFIXES[signal]}\".`;\n\n try {\n const parsedEndpoint = new URL(normalizedEndpoint);\n if (parsedEndpoint.search || parsedEndpoint.hash) {\n throw createInvalidEndpointError(endpoint, invalidText);\n }\n\n const normalizedOrigin = trimTrailingSlashes(parsedEndpoint.origin);\n const normalizedPathname = trimTrailingSlashes(parsedEndpoint.pathname);\n\n if (!normalizedPathname || normalizedPathname === '/') {\n return buildSignalEndpoint(normalizedOrigin, signal, projectId);\n }\n\n if (normalizedPathname.endsWith(SIGNAL_PUBLISH_SUFFIXES[signal])) {\n return `${normalizedOrigin}${normalizedPathname}`;\n }\n\n throw createInvalidEndpointError(endpoint, invalidText);\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n\n throw createInvalidEndpointError(endpoint, invalidText, error);\n }\n}\n\nfunction deriveSignalEndpointFromTracesEndpoint(signal: PlatformSignal, tracesEndpoint: string): string {\n if (signal === 'traces') {\n return tracesEndpoint;\n }\n\n const normalizedTracesEndpoint = trimTrailingSlashes(tracesEndpoint);\n const invalidText =\n 'MastraPlatformExporter tracesEndpoint must be a base origin like \"https://collector.example.com\" or a full traces publish URL ending in \"/spans/publish\".';\n\n try {\n const parsedEndpoint = new URL(normalizedTracesEndpoint);\n const normalizedOrigin = trimTrailingSlashes(parsedEndpoint.origin);\n const normalizedPathname = trimTrailingSlashes(parsedEndpoint.pathname);\n\n if (!normalizedPathname.endsWith(SIGNAL_PUBLISH_SUFFIXES.traces)) {\n throw createInvalidEndpointError(tracesEndpoint, invalidText);\n }\n\n const basePath = normalizedPathname.slice(0, -SIGNAL_PUBLISH_SUFFIXES.traces.length);\n return `${normalizedOrigin}${basePath}${SIGNAL_PUBLISH_SUFFIXES[signal]}`;\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n\n throw createInvalidEndpointError(tracesEndpoint, invalidText, error);\n }\n}\n\ninterface MastraPlatformBuffer {\n spans: MastraPlatformSpanRecord[];\n logs: MastraPlatformLogRecord[];\n metrics: MastraPlatformMetricRecord[];\n scores: MastraPlatformScoreRecord[];\n feedback: MastraPlatformFeedbackRecord[];\n firstEventTime?: Date;\n totalSize: number;\n}\n\ntype MastraPlatformSpanRecord = AnyExportedSpan & {\n spanId: string;\n spanType: string;\n startedAt: Date;\n endedAt: Date | null;\n error: AnyExportedSpan['errorInfo'] | null;\n createdAt: Date;\n updatedAt: Date | null;\n};\n\ntype MastraPlatformLogRecord = LogEvent['log'];\ntype MastraPlatformMetricRecord = MetricEvent['metric'];\ntype MastraPlatformScoreRecord = ScoreEvent['score'];\ntype MastraPlatformFeedbackRecord = FeedbackEvent['feedback'];\n\ntype ResolvedPlatformConfig = {\n logger: BaseExporterConfig['logger'];\n logLevel: NonNullable<BaseExporterConfig['logLevel']>;\n maxBatchSize: number;\n maxBatchWaitMs: number;\n maxRetries: number;\n accessToken: string;\n tracesEndpoint: string;\n logsEndpoint: string;\n metricsEndpoint: string;\n scoresEndpoint: string;\n feedbackEndpoint: string;\n};\n\nexport class MastraPlatformExporter extends BaseExporter {\n name = 'mastra-platform-exporter';\n\n private readonly platformConfig: Readonly<ResolvedPlatformConfig>;\n private readonly authFailureCooldown: AuthFailureCooldown;\n private buffer: MastraPlatformBuffer;\n private flushTimer: NodeJS.Timeout | null = null;\n private inFlightFlushes = new Set<Promise<void>>();\n\n constructor(config: MastraPlatformExporterConfig = {}) {\n super(config);\n\n if (config.projectId !== undefined && !VALID_PROJECT_ID.test(config.projectId)) {\n throw createInvalidProjectIdError(config.projectId);\n }\n\n const accessToken =\n config.accessToken || process.env.MASTRA_PLATFORM_ACCESS_TOKEN || process.env.MASTRA_CLOUD_ACCESS_TOKEN;\n // Treat an empty MASTRA_PROJECT_ID as unset so deployments that always\n // export the variable (e.g. CI templates) don't have to special-case it.\n const envProjectId = process.env.MASTRA_PROJECT_ID === '' ? undefined : process.env.MASTRA_PROJECT_ID;\n const rawProjectId = config.projectId ?? envProjectId;\n if (rawProjectId !== undefined && !VALID_PROJECT_ID.test(rawProjectId)) {\n throw createInvalidProjectIdError(rawProjectId);\n }\n const projectId = rawProjectId;\n if (!accessToken) {\n this.setDisabled('MASTRA_PLATFORM_ACCESS_TOKEN environment variable not set.', 'debug');\n }\n\n const tracesEndpointOverride = config.tracesEndpoint ?? process.env.MASTRA_CLOUD_TRACES_ENDPOINT;\n let baseEndpoint: string | undefined;\n let tracesEndpoint: string;\n\n if (tracesEndpointOverride) {\n tracesEndpoint = resolveExplicitSignalEndpoint('traces', tracesEndpointOverride, projectId);\n } else {\n baseEndpoint = resolveBaseEndpoint(config.endpoint ?? 'https://observability.mastra.ai');\n tracesEndpoint = buildSignalEndpoint(baseEndpoint, 'traces', projectId);\n }\n\n const resolveConfiguredSignalEndpoint = (\n signal: Exclude<PlatformSignal, 'traces'>,\n explicitEndpoint?: string,\n ): string => {\n if (explicitEndpoint) {\n return resolveExplicitSignalEndpoint(signal, explicitEndpoint, projectId);\n }\n\n if (tracesEndpointOverride) {\n return deriveSignalEndpointFromTracesEndpoint(signal, tracesEndpoint);\n }\n\n return buildSignalEndpoint(baseEndpoint!, signal, projectId);\n };\n\n this.platformConfig = {\n logger: this.logger,\n logLevel: config.logLevel ?? LogLevel.INFO,\n maxBatchSize: config.maxBatchSize ?? 1000,\n maxBatchWaitMs: config.maxBatchWaitMs ?? 5000,\n maxRetries: config.maxRetries ?? 3,\n accessToken: accessToken || '',\n tracesEndpoint,\n logsEndpoint: resolveConfiguredSignalEndpoint('logs', config.logsEndpoint),\n metricsEndpoint: resolveConfiguredSignalEndpoint('metrics', config.metricsEndpoint),\n scoresEndpoint: resolveConfiguredSignalEndpoint('scores', config.scoresEndpoint),\n feedbackEndpoint: resolveConfiguredSignalEndpoint('feedback', config.feedbackEndpoint),\n };\n\n this.authFailureCooldown = new AuthFailureCooldown('MastraPlatformExporter', () => this.logger);\n\n this.buffer = {\n spans: [],\n logs: [],\n metrics: [],\n scores: [],\n feedback: [],\n totalSize: 0,\n };\n }\n\n protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n if (event.type !== TracingEventType.SPAN_ENDED) {\n return;\n }\n\n if (!DEFAULT_PLATFORM_SPAN_FILTER(event.exportedSpan)) {\n return;\n }\n\n if (this.authFailureCooldown.dropEventIfCoolingDown()) {\n return;\n }\n\n this.addToBuffer(event);\n\n await this.handleBufferedEvent();\n }\n\n async onLogEvent(event: LogEvent): Promise<void> {\n if (this.isDisabled) {\n return;\n }\n\n if (this.authFailureCooldown.dropEventIfCoolingDown()) {\n return;\n }\n\n this.addLogToBuffer(event);\n await this.handleBufferedEvent();\n }\n\n async onMetricEvent(event: MetricEvent): Promise<void> {\n if (this.isDisabled) {\n return;\n }\n\n if (this.authFailureCooldown.dropEventIfCoolingDown()) {\n return;\n }\n\n this.addMetricToBuffer(event);\n await this.handleBufferedEvent();\n }\n\n async onScoreEvent(event: ScoreEvent): Promise<void> {\n if (this.isDisabled) {\n return;\n }\n\n if (this.authFailureCooldown.dropEventIfCoolingDown()) {\n return;\n }\n\n this.addScoreToBuffer(event);\n await this.handleBufferedEvent();\n }\n\n async onFeedbackEvent(event: FeedbackEvent): Promise<void> {\n if (this.isDisabled) {\n return;\n }\n\n if (this.authFailureCooldown.dropEventIfCoolingDown()) {\n return;\n }\n\n this.addFeedbackToBuffer(event);\n await this.handleBufferedEvent();\n }\n\n private addToBuffer(event: TracingEvent): void {\n this.markBufferStart();\n\n const spanRecord = this.formatSpan(event.exportedSpan);\n this.buffer.spans.push(spanRecord);\n this.buffer.totalSize++;\n }\n\n private addLogToBuffer(event: LogEvent): void {\n this.markBufferStart();\n\n this.buffer.logs.push(this.formatLog(event.log));\n this.buffer.totalSize++;\n }\n\n private addMetricToBuffer(event: MetricEvent): void {\n this.markBufferStart();\n\n this.buffer.metrics.push(this.formatMetric(event.metric));\n this.buffer.totalSize++;\n }\n\n private addScoreToBuffer(event: ScoreEvent): void {\n this.markBufferStart();\n\n this.buffer.scores.push(this.formatScore(event.score));\n this.buffer.totalSize++;\n }\n\n private addFeedbackToBuffer(event: FeedbackEvent): void {\n this.markBufferStart();\n\n this.buffer.feedback.push(this.formatFeedback(event.feedback));\n this.buffer.totalSize++;\n }\n\n private markBufferStart(): void {\n if (this.buffer.totalSize === 0) {\n this.buffer.firstEventTime = new Date();\n }\n }\n\n private formatSpan(span: AnyExportedSpan): MastraPlatformSpanRecord {\n const spanRecord: MastraPlatformSpanRecord = {\n ...span,\n spanId: span.id,\n spanType: span.type,\n startedAt: span.startTime,\n endedAt: span.endTime ?? null,\n error: span.errorInfo ?? null,\n createdAt: new Date(),\n updatedAt: null,\n };\n\n return spanRecord;\n }\n\n private formatLog(log: LogEvent['log']): MastraPlatformLogRecord {\n return {\n ...log,\n };\n }\n\n private formatMetric(metric: MetricEvent['metric']): MastraPlatformMetricRecord {\n return {\n ...metric,\n };\n }\n\n private formatScore(score: ScoreEvent['score']): MastraPlatformScoreRecord {\n return {\n ...score,\n };\n }\n\n private formatFeedback(feedback: FeedbackEvent['feedback']): MastraPlatformFeedbackRecord {\n return {\n ...feedback,\n };\n }\n\n private async handleBufferedEvent(): Promise<void> {\n if (this.shouldFlush()) {\n void this.flush().catch(error => {\n this.logger.error('Batch flush failed', {\n error: error instanceof Error ? error.message : String(error),\n });\n });\n } else if (this.buffer.totalSize === 1) {\n this.scheduleFlush();\n }\n }\n\n private shouldFlush(): boolean {\n if (this.buffer.totalSize >= this.platformConfig.maxBatchSize) {\n return true;\n }\n\n if (this.buffer.firstEventTime && this.buffer.totalSize > 0) {\n const elapsed = Date.now() - this.buffer.firstEventTime.getTime();\n if (elapsed >= this.platformConfig.maxBatchWaitMs) {\n return true;\n }\n }\n\n return false;\n }\n\n private scheduleFlush(): void {\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n }\n this.flushTimer = setTimeout(() => {\n void this.flush().catch(error => {\n const mastraError = new MastraError(\n {\n id: `MASTRA_PLATFORM_EXPORTER_FAILED_TO_SCHEDULE_FLUSH`,\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.USER,\n },\n error,\n );\n this.logger.trackException(mastraError);\n this.logger.error('Scheduled flush failed', mastraError);\n });\n }, this.platformConfig.maxBatchWaitMs);\n }\n\n private async flushBuffer(): Promise<void> {\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n this.flushTimer = null;\n }\n\n if (this.buffer.totalSize === 0) {\n return;\n }\n\n if (this.authFailureCooldown.dropEventsIfCoolingDown(this.buffer.totalSize)) {\n this.resetBuffer();\n return;\n }\n\n const startTime = Date.now();\n const spansCopy = [...this.buffer.spans];\n const logsCopy = [...this.buffer.logs];\n const metricsCopy = [...this.buffer.metrics];\n const scoresCopy = [...this.buffer.scores];\n const feedbackCopy = [...this.buffer.feedback];\n const batchSize = this.buffer.totalSize;\n const flushReason = this.buffer.totalSize >= this.platformConfig.maxBatchSize ? 'size' : 'time';\n\n this.resetBuffer();\n\n const results = await Promise.all([\n this.flushSignalBatch('traces', spansCopy),\n this.flushSignalBatch('logs', logsCopy),\n this.flushSignalBatch('metrics', metricsCopy),\n this.flushSignalBatch('scores', scoresCopy),\n this.flushSignalBatch('feedback', feedbackCopy),\n ]);\n\n const failedSignals = results.filter(result => !result.succeeded).map(result => result.signal);\n const authFailure = results.find(result => result.authFailureStatus !== undefined);\n\n const elapsed = Date.now() - startTime;\n\n if (failedSignals.length === 0) {\n const droppedEventsDuringAuthCooldown = this.authFailureCooldown.reset();\n const logData: Record<string, number | string> = {\n batchSize,\n flushReason,\n durationMs: elapsed,\n };\n\n if (droppedEventsDuringAuthCooldown > 0) {\n logData.droppedEventsDuringAuthCooldown = droppedEventsDuringAuthCooldown;\n }\n\n this.logger.debug('Batch flushed successfully', logData);\n return;\n }\n\n if (authFailure?.authFailureStatus !== undefined) {\n this.authFailureCooldown.recordFailure({\n status: authFailure.authFailureStatus,\n failedSignals,\n droppedBatchSize: batchSize,\n });\n }\n\n this.logger.warn('Batch flush completed with dropped signal batches', {\n batchSize,\n flushReason,\n durationMs: elapsed,\n failedSignals,\n });\n }\n\n /**\n * Uploads a signal batch to the configured Mastra Observability API using fetchWithRetry.\n */\n private async batchUpload<T>(signal: PlatformSignal, records: T[]): Promise<void> {\n const headers = {\n Authorization: `Bearer ${this.platformConfig.accessToken}`,\n 'Content-Type': 'application/json',\n };\n\n const endpointMap: Record<PlatformSignal, string> = {\n traces: this.platformConfig.tracesEndpoint,\n logs: this.platformConfig.logsEndpoint,\n metrics: this.platformConfig.metricsEndpoint,\n scores: this.platformConfig.scoresEndpoint,\n feedback: this.platformConfig.feedbackEndpoint,\n };\n\n const options: RequestInit = {\n method: 'POST',\n headers,\n body: JSON.stringify({ [SIGNAL_PUBLISH_SEGMENTS[signal]]: records }),\n };\n\n await fetchWithAuthFailureHandling(endpointMap[signal], options, this.platformConfig.maxRetries);\n }\n\n private async flushSignalBatch<T>(\n signal: PlatformSignal,\n records: T[],\n ): Promise<{ signal: PlatformSignal; succeeded: boolean; authFailureStatus?: number }> {\n if (records.length === 0) {\n return { signal, succeeded: true };\n }\n\n try {\n await this.batchUpload(signal, records);\n return { signal, succeeded: true };\n } catch (error) {\n if (isAuthFailureError(error)) {\n return { signal, succeeded: false, authFailureStatus: error.status };\n }\n\n const errorId = `MASTRA_PLATFORM_EXPORTER_FAILED_TO_BATCH_UPLOAD_${signal.toUpperCase()}` as Uppercase<string>;\n const mastraError = new MastraError(\n {\n id: errorId,\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.USER,\n details: {\n signal,\n droppedBatchSize: records.length,\n },\n },\n error,\n );\n this.logger.trackException(mastraError);\n this.logger.error('Batch upload failed after all retries, dropping batch', mastraError);\n return { signal, succeeded: false };\n }\n }\n\n private resetBuffer(): void {\n this.buffer.spans = [];\n this.buffer.logs = [];\n this.buffer.metrics = [];\n this.buffer.scores = [];\n this.buffer.feedback = [];\n this.buffer.firstEventTime = undefined;\n this.buffer.totalSize = 0;\n }\n\n /**\n * Force flush any buffered events without shutting down the exporter.\n * This is useful in serverless environments where you need to ensure events\n * are exported before the runtime instance is terminated.\n */\n async flush(): Promise<void> {\n if (this.isDisabled) {\n return;\n }\n\n while (this.buffer.totalSize > 0 || this.inFlightFlushes.size > 0) {\n if (this.buffer.totalSize > 0) {\n this.logger.debug('Flushing buffered events', {\n bufferedEvents: this.buffer.totalSize,\n });\n\n const flushPromise = this.flushBuffer();\n this.inFlightFlushes.add(flushPromise);\n\n try {\n await flushPromise;\n } finally {\n this.inFlightFlushes.delete(flushPromise);\n }\n\n continue;\n }\n\n await Promise.allSettled([...this.inFlightFlushes]);\n }\n }\n\n async shutdown(): Promise<void> {\n if (this.isDisabled) {\n return;\n }\n\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n this.flushTimer = null;\n }\n\n try {\n await this.flush();\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: `MASTRA_PLATFORM_EXPORTER_FAILED_TO_FLUSH_REMAINING_EVENTS_DURING_SHUTDOWN`,\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.USER,\n details: {\n remainingEvents: this.buffer.totalSize,\n },\n },\n error,\n );\n\n this.logger.trackException(mastraError);\n this.logger.error('Failed to flush remaining events during shutdown', mastraError);\n }\n\n this.logger.info('MastraPlatformExporter shutdown complete');\n }\n}\n","import { MastraError, ErrorDomain } from '@mastra/core/error';\nimport type { IMastraLogger } from '@mastra/core/logger';\nimport type {\n TracingEvent,\n InitExporterOptions,\n MetricEvent,\n LogEvent,\n ScoreEvent,\n FeedbackEvent,\n ObservabilityDropEvent,\n ObservabilityDropReason,\n ObservabilityDropSignal,\n} from '@mastra/core/observability';\nimport { TracingEventType } from '@mastra/core/observability';\nimport type { ObservabilityStorage, TracingStorageStrategy, MastraCompositeStore } from '@mastra/core/storage';\nimport {\n buildCreateSpanRecord,\n buildUpdateSpanRecord,\n buildMetricRecord,\n buildLogRecord,\n buildScoreRecord,\n buildFeedbackRecord,\n} from '@mastra/core/storage';\nimport type { BaseExporterConfig } from './base';\nimport { BaseExporter } from './base';\nimport { EventBuffer } from './event-buffer';\nimport type { BufferedEvent, RetryCount, UpdateSpanPartial } from './event-buffer';\n\n/** Configuration for the MastraStorageExporter's batching, retry, and strategy behavior. */\nexport interface MastraStorageExporterConfig extends BaseExporterConfig {\n maxBatchSize?: number; // Default: 1000 spans\n maxBufferSize?: number; // Default: 10000 spans\n maxBatchWaitMs?: number; // Default: 5000ms\n maxRetries?: number; // Default: 4\n retryDelayMs?: number; // Default: 500ms (base delay for exponential backoff)\n\n // Strategy selection (optional)\n strategy?: TracingStorageStrategy | 'auto';\n}\n\n/**\n * Resolves the final tracing storage strategy based on config and observability store hints\n */\nfunction resolveTracingStorageStrategy(\n config: MastraStorageExporterConfig,\n observabilityStorage: ObservabilityStorage,\n storageName: string,\n logger: IMastraLogger,\n): TracingStorageStrategy {\n const observabilityStrategy = observabilityStorage.observabilityStrategy;\n if (config.strategy && config.strategy !== 'auto') {\n if (observabilityStrategy.supported.includes(config.strategy)) {\n return config.strategy;\n }\n // Log warning and fall through to auto-selection\n logger.warn('User-specified tracing strategy not supported by storage adapter, falling back to auto-selection', {\n userStrategy: config.strategy,\n storageAdapter: storageName,\n supportedStrategies: observabilityStrategy.supported,\n fallbackStrategy: observabilityStrategy.preferred,\n });\n }\n return observabilityStrategy.preferred;\n}\n\ntype Resolve = (value: void | PromiseLike<void>) => void;\n\n/**\n * Storage-backed exporter. Buffers observability events and flushes them in\n * batches to the configured ObservabilityStorage backend with retry support.\n */\nexport class MastraStorageExporter extends BaseExporter {\n name = 'mastra-storage-exporter';\n\n #config: MastraStorageExporterConfig;\n #isInitializing = false;\n #initPromises: Set<Resolve> = new Set();\n #eventBuffer: EventBuffer;\n\n #storage?: MastraCompositeStore;\n #observabilityStorage?: ObservabilityStorage;\n #resolvedStrategy?: TracingStorageStrategy;\n #flushTimer?: NodeJS.Timeout;\n #emitDropEvent?: (event: ObservabilityDropEvent) => void;\n\n // Signals whose storage methods threw \"not implemented\" — skip on future flushes\n #unsupportedSignals: Set<ObservabilityDropSignal> = new Set();\n\n constructor(config: MastraStorageExporterConfig = {}) {\n super(config);\n\n // Set default configuration\n this.#config = {\n ...config,\n maxBatchSize: config.maxBatchSize ?? 1000,\n maxBufferSize: config.maxBufferSize ?? 10000,\n maxBatchWaitMs: config.maxBatchWaitMs ?? 5000,\n maxRetries: config.maxRetries ?? 4,\n retryDelayMs: config.retryDelayMs ?? 500,\n strategy: config.strategy ?? 'auto',\n };\n\n this.#eventBuffer = new EventBuffer({ maxRetries: this.#config.maxRetries ?? 4 });\n }\n\n /**\n * Initialize the exporter (called after all dependencies are ready)\n */\n async init(options: InitExporterOptions): Promise<void> {\n try {\n this.#isInitializing = true;\n this.#emitDropEvent = options.emitDropEvent;\n\n this.#storage = options.mastra?.getStorage();\n if (!this.#storage) {\n this.logger.warn('MastraStorageExporter disabled: Storage not available. Traces will not be persisted.');\n return;\n }\n\n this.#observabilityStorage = await this.#storage.getStore('observability');\n if (!this.#observabilityStorage) {\n this.logger.warn(\n 'MastraStorageExporter disabled: Observability storage not available. Traces will not be persisted.',\n );\n return;\n }\n\n // Initialize the resolved strategy once observability store is available\n if (!this.#resolvedStrategy) {\n this.#resolvedStrategy = resolveTracingStorageStrategy(\n this.#config,\n this.#observabilityStorage,\n this.#storage.constructor.name,\n this.logger,\n );\n\n this.logger.debug('tracing storage exporter initialized', {\n strategy: this.#resolvedStrategy,\n source: this.#config.strategy !== 'auto' ? 'user' : 'auto',\n storageAdapter: this.#storage.constructor.name,\n maxBatchSize: this.#config.maxBatchSize,\n maxBatchWaitMs: this.#config.maxBatchWaitMs,\n });\n }\n\n if (this.#resolvedStrategy) {\n this.#eventBuffer.init({ strategy: this.#resolvedStrategy });\n }\n } finally {\n this.#isInitializing = false;\n /**\n * Assumes caller waits until export of a parent span is completed before calling\n * export for child spans , order is not relevant for resolve\n */\n this.#initPromises.forEach(resolve => {\n resolve();\n });\n this.#initPromises.clear();\n }\n }\n\n /**\n * Checks if buffer should be flushed based on size or time triggers\n */\n private shouldFlush(): boolean {\n if (this.#resolvedStrategy === 'realtime') {\n return true;\n }\n\n // Emergency flush - buffer overflow\n if (this.#eventBuffer.totalSize >= this.#config.maxBufferSize!) {\n return true;\n }\n\n // Size-based flush\n if (this.#eventBuffer.totalSize >= this.#config.maxBatchSize!) {\n return true;\n }\n\n // Time-based flush\n if (this.#eventBuffer.totalSize > 0) {\n if (this.#eventBuffer.elapsed >= this.#config.maxBatchWaitMs!) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Schedules a flush using setTimeout\n */\n private scheduleFlush(): void {\n if (this.#flushTimer) {\n clearTimeout(this.#flushTimer);\n }\n this.#flushTimer = setTimeout(() => {\n this.flushBuffer().catch(error => {\n this.logger.error('Scheduled flush failed', {\n error: error instanceof Error ? error.message : String(error),\n });\n });\n }, this.#config.maxBatchWaitMs);\n }\n\n /**\n * Checks flush triggers and schedules/triggers flush as needed.\n * Called after adding any event to the buffer.\n * Returns the flush promise when flushing so callers can await it.\n */\n private async handleBatchedFlush(): Promise<void> {\n if (this.shouldFlush()) {\n await this.flushBuffer();\n } else if (this.#eventBuffer.totalSize === 1) {\n this.scheduleFlush();\n }\n }\n\n private sanitizeDropError(error: unknown): ObservabilityDropEvent['error'] {\n if (error instanceof MastraError) {\n return {\n id: error.id,\n domain: String(error.domain),\n message: error.message,\n };\n }\n\n if (error instanceof Error) {\n return { message: error.message };\n }\n\n return { message: String(error) };\n }\n\n private emitDrop(\n signal: ObservabilityDropSignal,\n reason: ObservabilityDropReason,\n count: number,\n error?: unknown,\n ): void {\n if (count === 0) return;\n\n const dropEvent: ObservabilityDropEvent = {\n type: 'drop',\n signal,\n reason,\n count,\n timestamp: new Date(),\n exporterName: this.name,\n ...(this.#observabilityStorage ? { storageName: this.#observabilityStorage.constructor.name } : {}),\n ...(error === undefined ? {} : { error: this.sanitizeDropError(error) }),\n };\n\n this.#emitDropEvent?.(dropEvent);\n }\n\n /**\n * Flush a batch of create events for a single signal type.\n * On \"not implemented\" errors, disables the signal for future flushes.\n * On other errors, re-adds events to the buffer for retry.\n */\n private async flushCreates<T extends BufferedEvent>(\n signal: ObservabilityDropSignal,\n events: T[],\n storageCall: (events: T[]) => Promise<void>,\n ): Promise<void> {\n if (events.length === 0) return;\n if (this.#unsupportedSignals.has(signal)) {\n this.emitDrop(signal, 'unsupported-storage', events.length);\n return;\n }\n\n try {\n await storageCall(events);\n } catch (error) {\n if (\n error instanceof MastraError &&\n error.domain === ErrorDomain.MASTRA_OBSERVABILITY &&\n error.id.endsWith('_NOT_IMPLEMENTED')\n ) {\n this.logger.warn(error.message);\n this.#unsupportedSignals.add(signal);\n this.emitDrop(signal, 'unsupported-storage', events.length, error);\n } else {\n const dropped = this.#eventBuffer.reAddCreates(events);\n this.emitDrop(signal, 'retry-exhausted', dropped.length, error);\n }\n }\n }\n\n /**\n * Flush span update/end events, deferring any whose span hasn't been created yet.\n * When `isEnd` is true, successfully flushed spans are removed from tracking.\n */\n private async flushSpanUpdates(\n events: (TracingEvent & RetryCount)[],\n deferredUpdates: BufferedEvent[],\n isEnd: boolean,\n ): Promise<void> {\n const deferredCountAtEntry = deferredUpdates.length;\n if (events.length === 0) return;\n if (this.#unsupportedSignals.has('tracing')) {\n this.emitDrop('tracing', 'unsupported-storage', events.length);\n return;\n }\n\n const partials: UpdateSpanPartial[] = [];\n for (const event of events) {\n const span = event.exportedSpan;\n if (this.#eventBuffer.spanExists(span)) {\n partials.push({\n traceId: span.traceId,\n spanId: span.id,\n updates: buildUpdateSpanRecord(span),\n });\n } else {\n deferredUpdates.push(event);\n }\n }\n\n if (partials.length === 0) return;\n\n try {\n await this.#observabilityStorage!.batchUpdateSpans({ records: partials });\n if (isEnd) {\n this.#eventBuffer.endFinishedSpans({ records: partials });\n }\n } catch (error) {\n if (\n error instanceof MastraError &&\n error.domain === ErrorDomain.MASTRA_OBSERVABILITY &&\n error.id.endsWith('_NOT_IMPLEMENTED')\n ) {\n this.logger.warn(error.message);\n this.#unsupportedSignals.add('tracing');\n deferredUpdates.length = 0;\n this.emitDrop('tracing', 'unsupported-storage', events.length + deferredCountAtEntry, error);\n } else {\n // `events` includes both partials-bound and newly-deferred entries, so\n // re-adding it would double-add the newly-deferred ones if they stayed\n // in deferredUpdates. Splice off only what this call appended — entries\n // from a prior flushSpanUpdates call must survive.\n const newlyDeferred = deferredUpdates.length - deferredCountAtEntry;\n if (newlyDeferred > 0) {\n deferredUpdates.splice(deferredUpdates.length - newlyDeferred, newlyDeferred);\n }\n const dropped = this.#eventBuffer.reAddUpdates(events);\n this.emitDrop('tracing', 'retry-exhausted', dropped.length, error);\n }\n }\n }\n\n /**\n * Flushes the current buffer to storage.\n *\n * Creates are flushed first, then their span keys are added to allCreatedSpans.\n * Updates are checked against allCreatedSpans — those whose span hasn't been\n * created yet are re-inserted into the live buffer for the next flush.\n * Completed spans (SPAN_ENDED) are cleaned up from allCreatedSpans after success.\n */\n private async flushBuffer(): Promise<void> {\n if (!this.#observabilityStorage) {\n this.logger.debug('Cannot flush. Observability storage is not initialized');\n return;\n }\n if (!this.#resolvedStrategy) {\n this.logger.debug('Cannot flush. Observability strategy is not resolved');\n return;\n }\n\n // Clear timer since we're flushing\n if (this.#flushTimer) {\n clearTimeout(this.#flushTimer);\n this.#flushTimer = undefined;\n }\n\n if (this.#eventBuffer.totalSize === 0) {\n return;\n }\n\n const startTime = Date.now();\n const batchSize = this.#eventBuffer.totalSize;\n\n // Snapshot and reset buffer so new events can accumulate during flush\n const creates = this.#eventBuffer.creates;\n const updates = this.#eventBuffer.updates;\n this.#eventBuffer.reset();\n\n const createFeedbackEvents: (FeedbackEvent & RetryCount)[] = [];\n const createLogEvents: (LogEvent & RetryCount)[] = [];\n const createMetricEvents: (MetricEvent & RetryCount)[] = [];\n const createScoreEvents: (ScoreEvent & RetryCount)[] = [];\n const createSpanEvents: (TracingEvent & RetryCount)[] = [];\n\n const updateSpanEvents: (TracingEvent & RetryCount)[] = [];\n const endSpanEvents: (TracingEvent & RetryCount)[] = [];\n\n for (const createEvent of creates) {\n switch (createEvent.type) {\n case 'feedback':\n createFeedbackEvents.push(createEvent);\n break;\n case 'log':\n createLogEvents.push(createEvent);\n break;\n case 'metric':\n createMetricEvents.push(createEvent);\n break;\n case 'score':\n createScoreEvents.push(createEvent);\n break;\n default:\n createSpanEvents.push(createEvent);\n break;\n }\n }\n\n for (const updateEvent of updates) {\n switch (updateEvent.type) {\n case TracingEventType.SPAN_UPDATED:\n updateSpanEvents.push(updateEvent);\n break;\n case TracingEventType.SPAN_ENDED:\n endSpanEvents.push(updateEvent);\n break;\n }\n }\n\n // Flush all creates in parallel — signals are independent\n await Promise.all([\n this.flushCreates('feedback', createFeedbackEvents, events =>\n this.#observabilityStorage!.batchCreateFeedback({ feedbacks: events.map(f => buildFeedbackRecord(f)) }),\n ),\n this.flushCreates('log', createLogEvents, events =>\n this.#observabilityStorage!.batchCreateLogs({ logs: events.map(l => buildLogRecord(l)) }),\n ),\n this.flushCreates('metric', createMetricEvents, events =>\n this.#observabilityStorage!.batchCreateMetrics({ metrics: events.map(m => buildMetricRecord(m)) }),\n ),\n this.flushCreates('score', createScoreEvents, events =>\n this.#observabilityStorage!.batchCreateScores({ scores: events.map(s => buildScoreRecord(s)) }),\n ),\n this.flushCreates('tracing', createSpanEvents, async events => {\n const records = events.map(t => buildCreateSpanRecord(t.exportedSpan));\n await this.#observabilityStorage!.batchCreateSpans({ records });\n this.#eventBuffer.addCreatedSpans({ records });\n }),\n ]);\n\n // Flush span updates and ends — check span existence, defer if not yet created\n const deferredUpdates: BufferedEvent[] = [];\n\n await this.flushSpanUpdates(updateSpanEvents, deferredUpdates, false);\n await this.flushSpanUpdates(endSpanEvents, deferredUpdates, true);\n\n if (deferredUpdates.length > 0) {\n if (this.#unsupportedSignals.has('tracing')) {\n this.emitDrop('tracing', 'unsupported-storage', deferredUpdates.length);\n deferredUpdates.length = 0;\n } else {\n const dropped = this.#eventBuffer.reAddUpdates(deferredUpdates);\n this.emitDrop('tracing', 'retry-exhausted', dropped.length);\n }\n }\n\n const elapsed = Date.now() - startTime;\n this.logger.debug('Batch flushed', {\n strategy: this.#resolvedStrategy,\n batchSize,\n durationMs: elapsed,\n deferredUpdates: deferredUpdates.length > 0 ? deferredUpdates.length : undefined,\n });\n return; // Success\n }\n\n async _exportTracingEvent(event: TracingEvent): Promise<void> {\n await this.waitForInit();\n if (!this.#observabilityStorage) {\n this.logger.debug('Cannot store traces. Observability storage is not initialized');\n return;\n }\n\n this.#eventBuffer.addEvent(event);\n await this.handleBatchedFlush();\n }\n\n /**\n * Resolves when an ongoing init call is finished\n * Doesn't wait for the caller to call init\n * @returns\n */\n private async waitForInit(): Promise<void> {\n if (!this.#isInitializing) return;\n return new Promise(resolve => {\n this.#initPromises.add(resolve);\n });\n }\n\n /**\n * Handle metric events — buffer for batch flush.\n */\n async onMetricEvent(event: MetricEvent): Promise<void> {\n await this.waitForInit();\n if (!this.#observabilityStorage) return;\n\n this.#eventBuffer.addEvent(event);\n await this.handleBatchedFlush();\n }\n\n /**\n * Handle log events — buffer for batch flush.\n */\n async onLogEvent(event: LogEvent): Promise<void> {\n await this.waitForInit();\n if (!this.#observabilityStorage) return;\n\n this.#eventBuffer.addEvent(event);\n await this.handleBatchedFlush();\n }\n\n /**\n * Handle score events — buffer for batch flush.\n */\n async onScoreEvent(event: ScoreEvent): Promise<void> {\n await this.waitForInit();\n if (!this.#observabilityStorage) return;\n\n this.#eventBuffer.addEvent(event);\n await this.handleBatchedFlush();\n }\n\n /**\n * Handle feedback events — buffer for batch flush.\n */\n async onFeedbackEvent(event: FeedbackEvent): Promise<void> {\n await this.waitForInit();\n if (!this.#observabilityStorage) return;\n\n this.#eventBuffer.addEvent(event);\n await this.handleBatchedFlush();\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.#eventBuffer.totalSize > 0) {\n this.logger.debug('Flushing buffered events', {\n bufferedEvents: this.#eventBuffer.totalSize,\n });\n await this.flushBuffer();\n }\n }\n\n async shutdown(): Promise<void> {\n // Clear any pending timer\n if (this.#flushTimer) {\n clearTimeout(this.#flushTimer);\n this.#flushTimer = undefined;\n }\n\n // Flush any remaining events\n await this.flush();\n\n this.logger.info('MastraStorageExporter shutdown complete');\n }\n}\n","/**\n * Test Exporter for Observability\n *\n * A full-featured exporter primarily designed for testing purposes that provides:\n * - In-memory event collection for ALL signals (Traces, Metrics, Logs, Scores, Feedback)\n * - File output support\n * - Span lifecycle tracking and validation\n * - Query methods for filtering spans by type, trace ID, span ID, etc.\n * - Query methods for filtering logs, metrics, scores, and feedback\n * - Statistics and analytics on all collected signals\n * - Internal metrics collection with summary on flush()\n */\n\n/**\n * Lazily compute the snapshots directory.\n * Node.js-only: uses dynamic imports so the module can be loaded in edge runtimes\n * without failing at import time.\n */\nlet _snapshotsDir: string | undefined;\nasync function getSnapshotsDir(): Promise<string> {\n if (!_snapshotsDir) {\n if (typeof import.meta.url !== 'string') {\n throw new Error(\n 'Snapshot functionality requires a Node.js environment. ' + 'import.meta.url is not available in this runtime.',\n );\n }\n const { fileURLToPath } = await import('node:url');\n const { dirname, join } = await import('node:path');\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n _snapshotsDir = join(__dirname, '..', '__snapshots__');\n }\n return _snapshotsDir;\n}\n\nimport type {\n TracingEvent,\n TracingEventType,\n AnyExportedSpan,\n ExportedSpan,\n SpanType,\n LogEvent,\n MetricEvent,\n ScoreEvent,\n FeedbackEvent,\n ExportedLog,\n ExportedMetric,\n ExportedScore,\n ExportedFeedback,\n LogLevel,\n} from '@mastra/core/observability';\nimport { TracingEventType as EventType } from '@mastra/core/observability';\n\nimport { BaseExporter } from './base';\nimport type { BaseExporterConfig } from './base';\n\n/**\n * Span state tracking for lifecycle validation\n */\ninterface SpanState {\n /** Whether SPAN_STARTED was received */\n hasStart: boolean;\n /** Whether SPAN_ENDED was received */\n hasEnd: boolean;\n /** Whether SPAN_UPDATED was received */\n hasUpdate: boolean;\n /** All events for this span in order */\n events: TracingEvent[];\n /** Whether this is an event span (zero duration) */\n isEventSpan?: boolean;\n}\n\n/**\n * Statistics about all collected signals\n */\nexport interface TestExporterStats {\n /** Total number of tracing events collected */\n totalTracingEvents: number;\n /** Number of unique spans */\n totalSpans: number;\n /** Number of unique traces */\n totalTraces: number;\n /** Number of completed spans */\n completedSpans: number;\n /** Number of incomplete spans (started but not ended) */\n incompleteSpans: number;\n /** Breakdown by tracing event type */\n byEventType: {\n started: number;\n updated: number;\n ended: number;\n };\n /** Breakdown by span type */\n bySpanType: Record<string, number>;\n /** Total number of log events collected */\n totalLogs: number;\n /** Breakdown of logs by level */\n logsByLevel: Record<string, number>;\n /** Total number of metric events collected */\n totalMetrics: number;\n /** Breakdown of metrics by name */\n metricsByName: Record<string, number>;\n /** Total number of score events collected */\n totalScores: number;\n /** Breakdown of scores by scorer name */\n scoresByScorer: Record<string, number>;\n /** Total number of feedback events collected */\n totalFeedback: number;\n /** Breakdown of feedback by type */\n feedbackByType: Record<string, number>;\n /** @deprecated Use totalTracingEvents instead */\n totalEvents: number;\n}\n\n/**\n * Internal metrics collected by the TestExporter while running.\n * Dumped as a summary on flush().\n */\nexport interface TestExporterInternalMetrics {\n /** Timestamp when the exporter was created */\n startedAt: Date;\n /** Timestamp of the last event received */\n lastEventAt: Date | null;\n /** Total events received across all signal types */\n totalEventsReceived: number;\n /** Breakdown by signal type */\n bySignal: {\n tracing: number;\n log: number;\n metric: number;\n score: number;\n feedback: number;\n };\n /** Number of flush() calls */\n flushCount: number;\n /** Total bytes of JSON output produced (estimated from toJSON) */\n estimatedJsonBytes: number;\n}\n\n/**\n * Span node in a tree structure with nested children\n */\nexport interface SpanTreeNode {\n /** The span data */\n span: AnyExportedSpan;\n /** Child spans nested under this span */\n children: SpanTreeNode[];\n}\n\n/**\n * Normalized span data for snapshot testing.\n * Dynamic fields (IDs, timestamps) are replaced with stable values.\n */\nexport interface NormalizedSpan {\n /** Stable ID like <span-1>, <span-2> */\n id: string;\n /** Normalized trace ID like <trace-1>, <trace-2> */\n traceId: string;\n /** Normalized parent ID, or undefined for root */\n parentId?: string;\n /** Span name */\n name: string;\n /** Span type */\n type: string;\n /** Entity type */\n entityType?: string;\n /** Entity ID */\n entityId?: string;\n /** Whether the span completed (had an endTime) */\n completed: boolean;\n /** Span attributes */\n attributes?: Record<string, unknown>;\n /** Span metadata */\n metadata?: Record<string, unknown>;\n /** Input data */\n input?: unknown;\n /** Output data */\n output?: unknown;\n /** Error info if span failed */\n errorInfo?: unknown;\n /** Is an event span */\n isEvent: boolean;\n /** Is root span */\n isRootSpan: boolean;\n /** Tags */\n tags?: string[];\n}\n\n/**\n * Normalized tree node for snapshot testing\n */\nexport interface NormalizedTreeNode {\n /** Normalized span data */\n span: NormalizedSpan;\n /** Child nodes (omitted if empty) */\n children?: NormalizedTreeNode[];\n}\n\n/**\n * Incomplete span information for debugging\n */\nexport interface IncompleteSpanInfo {\n spanId: string;\n span: AnyExportedSpan | undefined;\n state: {\n hasStart: boolean;\n hasUpdate: boolean;\n hasEnd: boolean;\n };\n}\n\n/**\n * Configuration for TestExporter\n */\nexport interface TestExporterConfig extends BaseExporterConfig {\n /**\n * Whether to validate span lifecycles in real-time.\n * When true, will log warnings for lifecycle violations.\n * @default true\n */\n validateLifecycle?: boolean;\n /**\n * Whether to store verbose logs for debugging.\n * @default true\n */\n storeLogs?: boolean;\n /**\n * Indentation for JSON output (number of spaces, or undefined for compact).\n * @default 2\n */\n jsonIndent?: number;\n /**\n * Whether to log a summary of internal metrics on flush().\n * @default true\n */\n logMetricsOnFlush?: boolean;\n}\n\n/**\n * Test Exporter for observability testing and debugging.\n *\n * Provides comprehensive in-memory event collection, querying, and JSON output\n * capabilities designed primarily for testing purposes but useful for debugging as well.\n *\n * @example\n * ```typescript\n * const exporter = new TestExporter();\n *\n * // Use with Mastra\n * const mastra = new Mastra({\n * observability: {\n * configs: {\n * test: {\n * serviceName: 'test',\n * exporters: [exporter],\n * },\n * },\n * },\n * });\n *\n * // Run some operations...\n *\n * // Query spans\n * const agentSpans = exporter.getSpansByType('agent_run');\n * const traceSpans = exporter.getByTraceId('abc123');\n *\n * // Get statistics\n * const stats = exporter.getStatistics();\n *\n * // Export to JSON\n * await exporter.writeToFile('./traces.json');\n * const jsonString = exporter.toJSON();\n * ```\n */\nexport class TestExporter extends BaseExporter {\n name = 'test-exporter';\n\n /** All collected tracing events */\n #tracingEvents: TracingEvent[] = [];\n\n /** Per-span state tracking */\n #spanStates = new Map<string, SpanState>();\n\n /** All collected log events */\n #logEvents: LogEvent[] = [];\n\n /** All collected metric events */\n #metricEvents: MetricEvent[] = [];\n\n /** All collected score events */\n #scoreEvents: ScoreEvent[] = [];\n\n /** All collected feedback events */\n #feedbackEvents: FeedbackEvent[] = [];\n\n /** Debug logs for the exporter itself */\n #debugLogs: string[] = [];\n\n /** Configuration */\n readonly #config: TestExporterConfig;\n\n /** Internal metrics tracking */\n #internalMetrics: {\n startedAt: Date;\n lastEventAt: Date | null;\n totalEventsReceived: number;\n bySignal: { tracing: number; log: number; metric: number; score: number; feedback: number };\n flushCount: number;\n };\n\n constructor(config: TestExporterConfig = {}) {\n super(config);\n this.#config = {\n validateLifecycle: true,\n storeLogs: true,\n jsonIndent: 2,\n logMetricsOnFlush: true,\n ...config,\n };\n this.#internalMetrics = {\n startedAt: new Date(),\n lastEventAt: null,\n totalEventsReceived: 0,\n bySignal: { tracing: 0, log: 0, metric: 0, score: 0, feedback: 0 },\n flushCount: 0,\n };\n }\n\n /**\n * Process incoming tracing events with lifecycle tracking\n */\n protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n const span = event.exportedSpan;\n const spanId = span.id;\n\n // Track internal metrics\n this.#trackEvent('tracing');\n\n // Generate log message\n const logMessage = `[TestExporter] ${event.type}: ${span.type} \"${span.name}\" (entity: ${span.entityName ?? span.entityId ?? 'unknown'}, trace: ${span.traceId.slice(-8)}, span: ${spanId.slice(-8)})`;\n\n if (this.#config.storeLogs) {\n this.#debugLogs.push(logMessage);\n }\n\n // Get or create span state\n const state = this.#spanStates.get(spanId) || {\n hasStart: false,\n hasEnd: false,\n hasUpdate: false,\n events: [],\n };\n\n // Lifecycle validation\n if (this.#config.validateLifecycle) {\n this.#validateLifecycle(event, state, spanId);\n }\n\n // Update state based on event type\n if (event.type === EventType.SPAN_STARTED) {\n state.hasStart = true;\n } else if (event.type === EventType.SPAN_ENDED) {\n state.hasEnd = true;\n if (span.isEvent) {\n state.isEventSpan = true;\n }\n } else if (event.type === EventType.SPAN_UPDATED) {\n state.hasUpdate = true;\n }\n\n state.events.push(event);\n this.#spanStates.set(spanId, state);\n this.#tracingEvents.push(event);\n }\n\n // ============================================================================\n // Signal Handlers (Logs, Metrics, Scores, Feedback)\n // ============================================================================\n\n /**\n * Process incoming log events\n */\n async onLogEvent(event: LogEvent): Promise<void> {\n this.#trackEvent('log');\n\n if (this.#config.storeLogs) {\n const log = event.log;\n const traceId = log.traceId;\n const logMessage = `[TestExporter] log.${log.level}: \"${log.message}\"${traceId ? ` (trace: ${traceId.slice(-8)})` : ''}`;\n this.#debugLogs.push(logMessage);\n }\n\n this.#logEvents.push(event);\n }\n\n /**\n * Process incoming metric events\n */\n async onMetricEvent(event: MetricEvent): Promise<void> {\n this.#trackEvent('metric');\n\n if (this.#config.storeLogs) {\n const metric = event.metric;\n const labelsStr = Object.entries(metric.labels)\n .map(([k, v]) => `${k}=${v}`)\n .join(', ');\n const logMessage = `[TestExporter] metric: ${metric.name}=${metric.value}${labelsStr ? ` {${labelsStr}}` : ''}`;\n this.#debugLogs.push(logMessage);\n }\n\n this.#metricEvents.push(event);\n }\n\n /**\n * Process incoming score events\n */\n async onScoreEvent(event: ScoreEvent): Promise<void> {\n this.#trackEvent('score');\n\n if (this.#config.storeLogs) {\n const score = event.score;\n const traceLabel = score.traceId ? score.traceId.slice(-8) : 'unanchored';\n const logMessage = `[TestExporter] score: ${score.scorerId}=${score.score} (trace: ${traceLabel}${score.spanId ? `, span: ${score.spanId.slice(-8)}` : ''})`;\n this.#debugLogs.push(logMessage);\n }\n\n this.#scoreEvents.push(event);\n }\n\n /**\n * Process incoming feedback events\n */\n async onFeedbackEvent(event: FeedbackEvent): Promise<void> {\n this.#trackEvent('feedback');\n\n if (this.#config.storeLogs) {\n const fb = event.feedback;\n const traceLabel = fb.traceId ? fb.traceId.slice(-8) : 'unanchored';\n const feedbackSource = fb.feedbackSource ?? fb.source;\n const logMessage = `[TestExporter] feedback: ${fb.feedbackType} from ${feedbackSource}=${fb.value} (trace: ${traceLabel}${fb.spanId ? `, span: ${fb.spanId.slice(-8)}` : ''})`;\n this.#debugLogs.push(logMessage);\n }\n\n this.#feedbackEvents.push(event);\n }\n\n /**\n * Track an event for internal metrics\n */\n #trackEvent(signal: 'tracing' | 'log' | 'metric' | 'score' | 'feedback'): void {\n this.#internalMetrics.lastEventAt = new Date();\n this.#internalMetrics.totalEventsReceived++;\n this.#internalMetrics.bySignal[signal]++;\n }\n\n /**\n * Validate span lifecycle rules\n */\n #validateLifecycle(event: TracingEvent, state: SpanState, spanId: string): void {\n const span = event.exportedSpan;\n\n if (event.type === EventType.SPAN_STARTED) {\n if (state.hasStart) {\n this.logger.warn(`Span ${spanId} (${span.type} \"${span.name}\") started twice`);\n }\n } else if (event.type === EventType.SPAN_ENDED) {\n if (span.isEvent) {\n // Event spans should only emit SPAN_ENDED\n if (state.hasStart) {\n this.logger.warn(`Event span ${spanId} (${span.type} \"${span.name}\") incorrectly received SPAN_STARTED`);\n }\n if (state.hasUpdate) {\n this.logger.warn(`Event span ${spanId} (${span.type} \"${span.name}\") incorrectly received SPAN_UPDATED`);\n }\n } else {\n // Normal spans should have started before ending\n if (!state.hasStart) {\n this.logger.warn(`Normal span ${spanId} (${span.type} \"${span.name}\") ended without starting`);\n }\n }\n }\n }\n\n // ============================================================================\n // Tracing Query Methods\n // ============================================================================\n\n /**\n * Get all collected tracing events\n */\n get events(): TracingEvent[] {\n return [...this.#tracingEvents];\n }\n\n /**\n * Get completed spans by SpanType (e.g., 'agent_run', 'tool_call')\n *\n * @param type - The SpanType to filter by\n * @returns Array of completed exported spans of the specified type\n */\n getSpansByType<T extends SpanType>(type: T): ExportedSpan<T>[] {\n return Array.from(this.#spanStates.values())\n .filter(state => {\n if (!state.hasEnd) return false;\n const endEvent = state.events.find(e => e.type === EventType.SPAN_ENDED);\n return endEvent?.exportedSpan.type === type;\n })\n .map(state => {\n const endEvent = state.events.find(e => e.type === EventType.SPAN_ENDED);\n return endEvent?.exportedSpan;\n })\n .filter((span): span is ExportedSpan<T> => span !== undefined);\n }\n\n /**\n * Get events by TracingEventType (SPAN_STARTED, SPAN_UPDATED, SPAN_ENDED)\n *\n * @param type - The TracingEventType to filter by\n * @returns Array of events of the specified type\n */\n getByEventType(type: TracingEventType): TracingEvent[] {\n return this.#tracingEvents.filter(e => e.type === type);\n }\n\n /**\n * Get all events and spans for a specific trace\n *\n * @param traceId - The trace ID to filter by\n * @returns Object containing tracing events, final spans, plus logs/scores/feedback for the trace\n */\n getByTraceId(traceId: string): {\n events: TracingEvent[];\n spans: AnyExportedSpan[];\n logs: ExportedLog[];\n scores: ExportedScore[];\n feedback: ExportedFeedback[];\n } {\n const events = this.#tracingEvents.filter(e => e.exportedSpan.traceId === traceId);\n const spans = this.#getUniqueSpansFromEvents(events);\n const logs = this.#logEvents.filter(e => e.log.traceId === traceId).map(e => e.log);\n const scores = this.#scoreEvents.filter(e => e.score.traceId === traceId).map(e => e.score);\n const feedback = this.#feedbackEvents.filter(e => e.feedback.traceId === traceId).map(e => e.feedback);\n return { events, spans, logs, scores, feedback };\n }\n\n /**\n * Get all events for a specific span\n *\n * @param spanId - The span ID to filter by\n * @returns Object containing events and final span state\n */\n getBySpanId(spanId: string): {\n events: TracingEvent[];\n span: AnyExportedSpan | undefined;\n state: SpanState | undefined;\n } {\n const state = this.#spanStates.get(spanId);\n if (!state) {\n return { events: [], span: undefined, state: undefined };\n }\n\n const endEvent = state.events.find(e => e.type === EventType.SPAN_ENDED);\n const span = endEvent?.exportedSpan ?? state.events[state.events.length - 1]?.exportedSpan;\n\n return { events: state.events, span, state };\n }\n\n /**\n * Get all unique spans (returns the final state of each span)\n */\n getAllSpans(): AnyExportedSpan[] {\n return Array.from(this.#spanStates.values())\n .map(state => {\n const endEvent = state.events.find(e => e.type === EventType.SPAN_ENDED);\n return endEvent?.exportedSpan ?? state.events[state.events.length - 1]?.exportedSpan;\n })\n .filter((span): span is AnyExportedSpan => span !== undefined);\n }\n\n /**\n * Get only completed spans (those that have received SPAN_ENDED)\n */\n getCompletedSpans(): AnyExportedSpan[] {\n return Array.from(this.#spanStates.values())\n .filter(state => state.hasEnd)\n .map(state => {\n const endEvent = state.events.find(e => e.type === EventType.SPAN_ENDED);\n return endEvent!.exportedSpan;\n });\n }\n\n /**\n * Get root spans only (spans with no parent)\n */\n getRootSpans(): AnyExportedSpan[] {\n return this.getAllSpans().filter(span => span.isRootSpan);\n }\n\n /**\n * Get incomplete spans (started but not yet ended)\n */\n getIncompleteSpans(): IncompleteSpanInfo[] {\n return Array.from(this.#spanStates.entries())\n .filter(([_, state]) => !state.hasEnd)\n .map(([spanId, state]) => ({\n spanId,\n span: state.events[0]?.exportedSpan,\n state: {\n hasStart: state.hasStart,\n hasUpdate: state.hasUpdate,\n hasEnd: state.hasEnd,\n },\n }));\n }\n\n /**\n * Get unique trace IDs from all collected signals\n */\n getTraceIds(): string[] {\n const traceIds = new Set<string>();\n for (const event of this.#tracingEvents) {\n traceIds.add(event.exportedSpan.traceId);\n }\n for (const event of this.#logEvents) {\n if (event.log.traceId) traceIds.add(event.log.traceId);\n }\n for (const event of this.#scoreEvents) {\n if (event.score.traceId) {\n traceIds.add(event.score.traceId);\n }\n }\n for (const event of this.#feedbackEvents) {\n if (event.feedback.traceId) {\n traceIds.add(event.feedback.traceId);\n }\n }\n return Array.from(traceIds);\n }\n\n // ============================================================================\n // Log Query Methods\n // ============================================================================\n\n /**\n * Get all collected log events\n */\n getLogEvents(): LogEvent[] {\n return [...this.#logEvents];\n }\n\n /**\n * Get all collected logs (unwrapped from events)\n */\n getAllLogs(): ExportedLog[] {\n return this.#logEvents.map(e => e.log);\n }\n\n /**\n * Get logs filtered by level\n */\n getLogsByLevel(level: LogLevel): ExportedLog[] {\n return this.#logEvents.filter(e => e.log.level === level).map(e => e.log);\n }\n\n /**\n * Get logs for a specific trace\n */\n getLogsByTraceId(traceId: string): ExportedLog[] {\n return this.#logEvents.filter(e => e.log.traceId === traceId).map(e => e.log);\n }\n\n // ============================================================================\n // Metric Query Methods\n // ============================================================================\n\n /**\n * Get all collected metric events\n */\n getMetricEvents(): MetricEvent[] {\n return [...this.#metricEvents];\n }\n\n /**\n * Get all collected metrics (unwrapped from events)\n */\n getAllMetrics(): ExportedMetric[] {\n return this.#metricEvents.map(e => e.metric);\n }\n\n /**\n * Get metrics filtered by name\n */\n getMetricsByName(name: string): ExportedMetric[] {\n return this.#metricEvents.filter(e => e.metric.name === name).map(e => e.metric);\n }\n\n /**\n * @deprecated MetricType is no longer stored. Use getMetricsByName() instead.\n */\n getMetricsByType(_metricType: string): ExportedMetric[] {\n throw new Error(\n 'getMetricsByType() has been removed: metricType is no longer stored. ' +\n 'Use getMetricsByName(metricName) instead to filter metrics by name.',\n );\n }\n\n // ============================================================================\n // Score Query Methods\n // ============================================================================\n\n /**\n * Get all collected score events\n */\n getScoreEvents(): ScoreEvent[] {\n return [...this.#scoreEvents];\n }\n\n /**\n * Get all collected scores (unwrapped from events)\n */\n getAllScores(): ExportedScore[] {\n return this.#scoreEvents.map(e => e.score);\n }\n\n /**\n * Get scores filtered by scorer id\n */\n getScoresByScorer(scorerId: string): ExportedScore[] {\n return this.#scoreEvents.filter(e => e.score.scorerId === scorerId).map(e => e.score);\n }\n\n /**\n * Get scores for a specific trace\n */\n getScoresByTraceId(traceId: string): ExportedScore[] {\n return this.#scoreEvents.filter(e => e.score.traceId === traceId).map(e => e.score);\n }\n\n // ============================================================================\n // Feedback Query Methods\n // ============================================================================\n\n /**\n * Get all collected feedback events\n */\n getFeedbackEvents(): FeedbackEvent[] {\n return [...this.#feedbackEvents];\n }\n\n /**\n * Get all collected feedback (unwrapped from events)\n */\n getAllFeedback(): ExportedFeedback[] {\n return this.#feedbackEvents.map(e => e.feedback);\n }\n\n /**\n * Get feedback filtered by type\n */\n getFeedbackByType(feedbackType: string): ExportedFeedback[] {\n return this.#feedbackEvents.filter(e => e.feedback.feedbackType === feedbackType).map(e => e.feedback);\n }\n\n /**\n * Get feedback for a specific trace\n */\n getFeedbackByTraceId(traceId: string): ExportedFeedback[] {\n return this.#feedbackEvents.filter(e => e.feedback.traceId === traceId).map(e => e.feedback);\n }\n\n // ============================================================================\n // Statistics\n // ============================================================================\n\n /**\n * Get comprehensive statistics about all collected signals\n */\n getStatistics(): TestExporterStats {\n const bySpanType: Record<string, number> = {};\n let completedSpans = 0;\n let incompleteSpans = 0;\n\n for (const state of this.#spanStates.values()) {\n if (state.hasEnd) {\n completedSpans++;\n const endEvent = state.events.find(e => e.type === EventType.SPAN_ENDED);\n const spanType = endEvent?.exportedSpan.type;\n if (spanType) {\n bySpanType[spanType] = (bySpanType[spanType] || 0) + 1;\n }\n } else {\n incompleteSpans++;\n }\n }\n\n // Log level breakdown\n const logsByLevel: Record<string, number> = {};\n for (const event of this.#logEvents) {\n const level = event.log.level;\n logsByLevel[level] = (logsByLevel[level] || 0) + 1;\n }\n\n // Metric breakdowns\n const metricsByName: Record<string, number> = {};\n for (const event of this.#metricEvents) {\n const mName = event.metric.name;\n metricsByName[mName] = (metricsByName[mName] || 0) + 1;\n }\n\n // Score breakdown by scorer\n const scoresByScorer: Record<string, number> = {};\n for (const event of this.#scoreEvents) {\n const scorer = event.score.scorerId;\n scoresByScorer[scorer] = (scoresByScorer[scorer] || 0) + 1;\n }\n\n // Feedback breakdown by type\n const feedbackByType: Record<string, number> = {};\n for (const event of this.#feedbackEvents) {\n const fbType = event.feedback.feedbackType;\n feedbackByType[fbType] = (feedbackByType[fbType] || 0) + 1;\n }\n\n return {\n totalTracingEvents: this.#tracingEvents.length,\n totalEvents: this.#tracingEvents.length, // deprecated alias\n totalSpans: this.#spanStates.size,\n totalTraces: this.getTraceIds().length,\n completedSpans,\n incompleteSpans,\n byEventType: {\n started: this.#tracingEvents.filter(e => e.type === EventType.SPAN_STARTED).length,\n updated: this.#tracingEvents.filter(e => e.type === EventType.SPAN_UPDATED).length,\n ended: this.#tracingEvents.filter(e => e.type === EventType.SPAN_ENDED).length,\n },\n bySpanType,\n totalLogs: this.#logEvents.length,\n logsByLevel,\n totalMetrics: this.#metricEvents.length,\n metricsByName,\n totalScores: this.#scoreEvents.length,\n scoresByScorer,\n totalFeedback: this.#feedbackEvents.length,\n feedbackByType,\n };\n }\n\n // ============================================================================\n // JSON Output\n // ============================================================================\n\n /**\n * Serialize all collected data to JSON string\n *\n * @param options - Serialization options\n * @returns JSON string of all collected data\n */\n toJSON(options?: { indent?: number; includeEvents?: boolean; includeStats?: boolean }): string {\n const indent = options?.indent ?? this.#config.jsonIndent;\n const includeEvents = options?.includeEvents ?? true;\n const includeStats = options?.includeStats ?? true;\n\n const data: Record<string, unknown> = {\n spans: this.getAllSpans(),\n };\n\n // Include log/metric/score/feedback data\n if (this.#logEvents.length > 0) {\n data.logs = this.getAllLogs();\n }\n if (this.#metricEvents.length > 0) {\n data.metrics = this.getAllMetrics();\n }\n if (this.#scoreEvents.length > 0) {\n data.scores = this.getAllScores();\n }\n if (this.#feedbackEvents.length > 0) {\n data.feedback = this.getAllFeedback();\n }\n\n if (includeEvents) {\n data.events = this.#tracingEvents;\n }\n\n if (includeStats) {\n data.statistics = this.getStatistics();\n }\n\n return JSON.stringify(data, this.#jsonReplacer, indent);\n }\n\n /**\n * Build a tree structure from spans, nesting children under their parents\n *\n * @returns Array of root span tree nodes (spans with no parent)\n */\n buildSpanTree(): SpanTreeNode[] {\n const spans = this.getAllSpans();\n const nodeMap = new Map<string, SpanTreeNode>();\n const roots: SpanTreeNode[] = [];\n\n // First pass: create nodes for all spans\n for (const span of spans) {\n nodeMap.set(span.id, { span, children: [] });\n }\n\n // Second pass: build parent-child relationships\n for (const span of spans) {\n const node = nodeMap.get(span.id)!;\n if (span.parentSpanId && nodeMap.has(span.parentSpanId)) {\n // Has a parent in our collection - add as child\n nodeMap.get(span.parentSpanId)!.children.push(node);\n } else {\n // No parent or parent not in collection - this is a root\n roots.push(node);\n }\n }\n\n // Sort children by startTime for consistent ordering\n const sortChildren = (node: SpanTreeNode) => {\n node.children.sort((a, b) => new Date(a.span.startTime).getTime() - new Date(b.span.startTime).getTime());\n node.children.forEach(sortChildren);\n };\n roots.forEach(sortChildren);\n\n return roots;\n }\n\n /**\n * Serialize spans as a tree structure to JSON string\n *\n * @param options - Serialization options\n * @returns JSON string with spans nested in tree format\n */\n toTreeJSON(options?: { indent?: number; includeStats?: boolean }): string {\n const indent = options?.indent ?? this.#config.jsonIndent;\n const includeStats = options?.includeStats ?? true;\n\n const data: Record<string, unknown> = {\n tree: this.buildSpanTree(),\n };\n\n if (includeStats) {\n data.statistics = this.getStatistics();\n }\n\n return JSON.stringify(data, this.#jsonReplacer, indent);\n }\n\n /**\n * Build a normalized tree structure suitable for snapshot testing.\n *\n * Normalizations applied:\n * - Span IDs replaced with stable placeholders (<span-1>, <span-2>, etc.)\n * - Trace IDs replaced with stable placeholders (<trace-1>, <trace-2>, etc.)\n * - parentSpanId replaced with normalized parent ID\n * - Timestamps replaced with durationMs (or null if not ended)\n * - Empty children arrays are omitted\n *\n * @returns Array of normalized root tree nodes\n */\n buildNormalizedTree(): NormalizedTreeNode[] {\n const tree = this.buildSpanTree();\n const spanIdMap = new Map<string, string>();\n const traceIdMap = new Map<string, string>();\n // Key-specific UUID maps: key -> (uuid -> placeholder)\n const uuidMapsByKey = new Map<string, Map<string, string>>();\n // Key-specific counters\n const uuidCountersByKey = new Map<string, number>();\n let spanIdCounter = 1;\n let traceIdCounter = 1;\n\n // UUID regex pattern (8-4-4-4-12 hex chars)\n const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n // 32-character hex string (traceId format without hyphens)\n const hexId32Regex = /^[0-9a-f]{32}$/i;\n // Prefixed UUID pattern (e.g., mapping_<uuid>, dowhile_<uuid>) - for exact match\n const prefixedUuidRegex = /^([a-z_]+)_([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$/i;\n // Prefixed UUID pattern for embedded matches — non-global for test(), global for replace()\n const embeddedPrefixedUuidTest = /([a-z_]+)_([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})/i;\n const embeddedPrefixedUuidRegex = /([a-z_]+)_([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})/gi;\n\n // Helper to normalize a UUID with key-specific placeholders\n const normalizeUuid = (uuid: string, key: string): string => {\n if (!uuidMapsByKey.has(key)) {\n uuidMapsByKey.set(key, new Map());\n uuidCountersByKey.set(key, 1);\n }\n const keyMap = uuidMapsByKey.get(key)!;\n if (!keyMap.has(uuid)) {\n const counter = uuidCountersByKey.get(key)!;\n keyMap.set(uuid, `<${key}-${counter}>`);\n uuidCountersByKey.set(key, counter + 1);\n }\n return keyMap.get(uuid)!;\n };\n\n // Helper to normalize a value, replacing UUIDs and Dates with stable placeholders\n // The key parameter is used to create key-specific UUID placeholders\n const normalizeValue = (value: unknown, key?: string): unknown => {\n // Handle Date objects - just indicate a date exists, don't track specific values\n if (value instanceof Date) {\n return '<date>';\n }\n if (key === 'createdAt' && typeof value === 'number') {\n return '<date>';\n }\n if (typeof value === 'string') {\n // Special handling for traceId - use the shared traceIdMap (handles both UUID and 32-char hex formats)\n if (key === 'traceId' && (uuidRegex.test(value) || hexId32Regex.test(value))) {\n if (!traceIdMap.has(value)) {\n traceIdMap.set(value, `<trace-${traceIdCounter++}>`);\n }\n return traceIdMap.get(value)!;\n }\n // Check for pure UUID (exact match)\n if (uuidRegex.test(value)) {\n // Use key-specific placeholder if key is provided, otherwise generic 'uuid'\n return normalizeUuid(value, key ?? 'uuid');\n }\n // Check for prefixed UUID (e.g., mapping_<uuid>) - exact match\n const prefixMatch = prefixedUuidRegex.exec(value);\n if (prefixMatch && prefixMatch[1] && prefixMatch[2]) {\n const prefix = prefixMatch[1];\n const uuid = prefixMatch[2];\n return `${prefix}_${normalizeUuid(uuid, prefix)}`;\n }\n // Check for embedded prefixed UUIDs (e.g., \"workflow step: 'mapping_<uuid>'\")\n if (embeddedPrefixedUuidTest.test(value)) {\n return value.replace(embeddedPrefixedUuidRegex, (_match, prefix, uuid) => {\n return `${prefix}_${normalizeUuid(uuid, prefix)}`;\n });\n }\n }\n if (Array.isArray(value)) {\n return value.map(v => normalizeValue(v, key));\n }\n if (value && typeof value === 'object') {\n const normalized: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n if (key === 'providerOptions' && k === 'mastra' && v && typeof v === 'object') {\n const mastraOptions = v as Record<string, unknown>;\n const remainingMastraOptions = Object.fromEntries(\n Object.entries(mastraOptions).filter(([mastraKey]) => mastraKey !== 'createdAt'),\n );\n if (Object.keys(remainingMastraOptions).length > 0) {\n normalized[k] = normalizeValue(remainingMastraOptions, k);\n }\n continue;\n }\n\n const normalizedValue = normalizeValue(v, k);\n if (normalizedValue !== undefined) {\n normalized[k] = normalizedValue;\n }\n }\n\n if (key === 'providerOptions' && Object.keys(normalized).length === 0) {\n return undefined;\n }\n\n return normalized;\n }\n return value;\n };\n\n // First pass: assign stable IDs in tree traversal order\n const assignIds = (nodes: SpanTreeNode[]) => {\n for (const node of nodes) {\n spanIdMap.set(node.span.id, `<span-${spanIdCounter++}>`);\n // Assign trace ID if not seen before\n if (!traceIdMap.has(node.span.traceId)) {\n traceIdMap.set(node.span.traceId, `<trace-${traceIdCounter++}>`);\n }\n assignIds(node.children);\n }\n };\n assignIds(tree);\n\n // Second pass: build normalized tree\n const normalizeNode = (node: SpanTreeNode): NormalizedTreeNode => {\n const span = node.span;\n const completed = span.endTime !== undefined && span.endTime !== null;\n\n const normalizedSpan: NormalizedSpan = {\n id: spanIdMap.get(span.id)!,\n traceId: traceIdMap.get(span.traceId)!,\n name: normalizeValue(span.name, 'name') as string,\n type: span.type,\n completed,\n isEvent: span.isEvent,\n isRootSpan: span.isRootSpan,\n };\n\n // Only include optional fields if they have values\n if (span.parentSpanId && spanIdMap.has(span.parentSpanId)) {\n normalizedSpan.parentId = spanIdMap.get(span.parentSpanId);\n }\n if (span.entityType) {\n normalizedSpan.entityType = span.entityType;\n }\n if (span.entityId) {\n normalizedSpan.entityId = normalizeValue(span.entityId, 'entityId') as string;\n }\n if (span.attributes && Object.keys(span.attributes).length > 0) {\n normalizedSpan.attributes = normalizeValue(span.attributes) as Record<string, unknown>;\n }\n if (span.metadata && Object.keys(span.metadata).length > 0) {\n normalizedSpan.metadata = normalizeValue(span.metadata) as Record<string, unknown>;\n }\n if (span.input !== undefined) {\n normalizedSpan.input = normalizeValue(span.input);\n }\n if (span.output !== undefined) {\n normalizedSpan.output = normalizeValue(span.output);\n }\n if (span.errorInfo) {\n normalizedSpan.errorInfo = normalizeValue(span.errorInfo) as typeof span.errorInfo;\n }\n if (span.tags && span.tags.length > 0) {\n normalizedSpan.tags = span.tags;\n }\n\n const result: NormalizedTreeNode = { span: normalizedSpan };\n\n // Only include children if non-empty\n if (node.children.length > 0) {\n result.children = node.children.map(normalizeNode);\n }\n\n return result;\n };\n\n return tree.map(normalizeNode);\n }\n\n /**\n * Generate an ASCII tree structure graph for debugging.\n * Shows span type and name in a hierarchical format.\n *\n * @param nodes - Normalized tree nodes (defaults to current normalized tree)\n * @returns Array of strings representing the tree structure\n *\n * @example\n * ```\n * agent_run: \"agent run: 'test-agent'\"\n * ├── processor_run: \"input processor: validator\"\n * │ └── agent_run: \"agent run: 'validator-agent'\"\n * └── model_generation: \"llm: 'mock-model-id'\"\n * ```\n */\n generateStructureGraph(nodes?: NormalizedTreeNode[]): string[] {\n const tree = nodes ?? this.buildNormalizedTree();\n const lines: string[] = [];\n\n const buildLines = (node: NormalizedTreeNode, prefix: string, isLast: boolean, isRoot: boolean): void => {\n // Build the current line\n const connector = isRoot ? '' : isLast ? '└── ' : '├── ';\n const line = `${prefix}${connector}${node.span.type}: \"${node.span.name}\"`;\n lines.push(line);\n\n // Build lines for children\n const children = node.children ?? [];\n const childPrefix = isRoot ? '' : prefix + (isLast ? ' ' : '│ ');\n children.forEach((child, index) => {\n const childIsLast = index === children.length - 1;\n buildLines(child, childPrefix, childIsLast, false);\n });\n };\n\n // Process each root node\n tree.forEach((rootNode, index) => {\n if (index > 0) {\n lines.push(''); // Add blank line between multiple roots\n }\n buildLines(rootNode, '', true, true);\n });\n\n return lines;\n }\n\n /**\n * Serialize spans as a normalized tree structure for snapshot testing.\n * Includes a __structure__ field with an ASCII tree graph for readability.\n *\n * @param options - Serialization options\n * @returns JSON string with normalized spans in tree format\n */\n toNormalizedTreeJSON(options?: { indent?: number; includeStructure?: boolean }): string {\n const indent = options?.indent ?? this.#config.jsonIndent;\n const includeStructure = options?.includeStructure ?? true;\n const normalizedTree = this.buildNormalizedTree();\n\n if (includeStructure) {\n const structureGraph = this.generateStructureGraph(normalizedTree);\n const data = {\n __structure__: structureGraph,\n spans: normalizedTree,\n };\n return JSON.stringify(data, null, indent);\n }\n\n return JSON.stringify(normalizedTree, null, indent);\n }\n\n /**\n * Write collected data to a JSON file\n *\n * @param filePath - Path to write the JSON file\n * @param options - Serialization options\n */\n async writeToFile(\n filePath: string,\n options?: {\n indent?: number;\n includeEvents?: boolean;\n includeStats?: boolean;\n format?: 'flat' | 'tree' | 'normalized';\n },\n ): Promise<void> {\n const format = options?.format ?? 'flat';\n let json: string;\n\n if (format === 'normalized') {\n json = this.toNormalizedTreeJSON({ indent: options?.indent });\n } else if (format === 'tree') {\n json = this.toTreeJSON({ indent: options?.indent, includeStats: options?.includeStats });\n } else {\n json = this.toJSON(options);\n }\n\n const { writeFile } = await import('node:fs/promises');\n await writeFile(filePath, json, 'utf-8');\n this.logger.info(`TestExporter: wrote ${this.#tracingEvents.length} tracing events to ${filePath}`);\n }\n\n /**\n * Assert that the current normalized tree matches a snapshot file.\n * Throws an error with a diff if they don't match.\n *\n * The snapshot format includes:\n * - `__structure__`: ASCII tree graph (compared first for quick validation)\n * - `spans`: The normalized span tree (detailed comparison)\n *\n * Supports special markers in the snapshot:\n * - `{\"__or__\": [\"value1\", \"value2\"]}` - matches if actual equals any listed value\n * - `{\"__any__\": \"string\"}` - matches any string value\n * - `{\"__any__\": \"number\"}` - matches any number value\n * - `{\"__any__\": \"boolean\"}` - matches any boolean value\n * - `{\"__any__\": \"object\"}` - matches any object value\n * - `{\"__any__\": \"array\"}` - matches any array value\n * - `{\"__any__\": true}` - matches any non-null/undefined value\n *\n * Environment variables:\n * Use `{ updateSnapshot: true }` option to update the snapshot instead of comparing\n *\n * @param snapshotName - Name of the snapshot file (resolved relative to __snapshots__ directory)\n * @param options - Options for snapshot comparison\n * @param options.updateSnapshot - If true, update the snapshot file instead of comparing\n * @throws Error if the snapshot doesn't match (and updateSnapshot is false)\n */\n async assertMatchesSnapshot(snapshotName: string, options?: { updateSnapshot?: boolean }): Promise<void> {\n // Resolve snapshot path relative to the __snapshots__ directory\n const { join } = await import('node:path');\n const snapshotPath = join(await getSnapshotsDir(), snapshotName);\n const normalizedTree = this.buildNormalizedTree();\n const structureGraph = this.generateStructureGraph(normalizedTree);\n\n // Build current data with structure\n const currentData = {\n __structure__: structureGraph,\n spans: normalizedTree,\n };\n const currentJson = JSON.stringify(currentData, null, this.#config.jsonIndent);\n\n // Check option to update snapshot\n const shouldUpdate = options?.updateSnapshot;\n\n // If updating snapshot, write and return\n if (shouldUpdate) {\n const { writeFile } = await import('node:fs/promises');\n await writeFile(snapshotPath, currentJson, 'utf-8');\n this.logger.info(`TestExporter: updated snapshot ${snapshotPath}`);\n return;\n }\n\n let snapshotData: { __structure__?: string[]; spans?: unknown } | unknown[];\n let snapshotContent: string;\n try {\n const { readFile } = await import('node:fs/promises');\n snapshotContent = await readFile(snapshotPath, 'utf-8');\n } catch (err: unknown) {\n if (err && typeof err === 'object' && 'code' in err && (err as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new Error(\n `Snapshot file not found: ${snapshotPath}\\n` + `Run with { updateSnapshot: true } to create it.`,\n );\n }\n throw err;\n }\n try {\n snapshotData = JSON.parse(snapshotContent);\n } catch (err: unknown) {\n throw new Error(`Failed to parse snapshot ${snapshotPath}: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Handle both old format (array) and new format (object with __structure__ and spans)\n let expectedSpans: unknown;\n let expectedStructure: string[] | undefined;\n\n if (Array.isArray(snapshotData)) {\n // Old format: just the spans array\n expectedSpans = snapshotData;\n } else if (snapshotData && typeof snapshotData === 'object' && 'spans' in snapshotData) {\n // New format: { __structure__, spans }\n expectedSpans = snapshotData.spans;\n expectedStructure = snapshotData.__structure__;\n } else {\n throw new Error(\n `Invalid snapshot format in ${snapshotPath}.\\n` + `Expected an array or object with 'spans' property.`,\n );\n }\n\n // Compare structure first (quick validation)\n if (expectedStructure) {\n const structureMismatches = this.#compareStructure(structureGraph, expectedStructure);\n if (structureMismatches.length > 0) {\n throw new Error(\n `Structure mismatch in snapshot:\\n\\n` +\n `Expected:\\n${expectedStructure.join('\\n')}\\n\\n` +\n `Actual:\\n${structureGraph.join('\\n')}\\n\\n` +\n `Differences:\\n${structureMismatches.join('\\n')}\\n\\n` +\n `Snapshot: ${snapshotPath}\\n` +\n `Run with { updateSnapshot: true } to update.`,\n );\n }\n }\n\n // Deep compare spans\n const mismatches: { path: string; expected: unknown; actual: unknown }[] = [];\n this.#deepCompareWithMarkers(normalizedTree, expectedSpans, '$.spans', mismatches);\n\n if (mismatches.length > 0) {\n const mismatchDetails = mismatches\n .map(\n (m, i) =>\n `${i + 1}. ${m.path}\\n Expected: ${JSON.stringify(m.expected)}\\n Actual: ${JSON.stringify(m.actual)}`,\n )\n .join('\\n\\n');\n throw new Error(\n `Snapshot has ${mismatches.length} mismatch${mismatches.length > 1 ? 'es' : ''}:\\n\\n` +\n `${mismatchDetails}\\n\\n` +\n `Snapshot: ${snapshotPath}\\n` +\n `Run with { updateSnapshot: true } to update.`,\n );\n }\n }\n\n /**\n * Compare two structure graphs and return differences\n */\n #compareStructure(actual: string[], expected: string[]): string[] {\n const diffs: string[] = [];\n\n const maxLen = Math.max(actual.length, expected.length);\n for (let i = 0; i < maxLen; i++) {\n const actualLine = actual[i];\n const expectedLine = expected[i];\n\n if (actualLine !== expectedLine) {\n if (actualLine === undefined) {\n diffs.push(`Line ${i + 1}: Missing in actual`);\n diffs.push(` Expected: ${expectedLine}`);\n } else if (expectedLine === undefined) {\n diffs.push(`Line ${i + 1}: Extra in actual`);\n diffs.push(` Actual: ${actualLine}`);\n } else {\n diffs.push(`Line ${i + 1}:`);\n diffs.push(` Expected: ${expectedLine}`);\n diffs.push(` Actual: ${actualLine}`);\n }\n }\n }\n\n return diffs;\n }\n\n /**\n * Deep compare two values, supporting special markers like __or__ and __any__.\n * Collects all mismatches into the provided array.\n */\n #deepCompareWithMarkers(\n actual: unknown,\n expected: unknown,\n path: string,\n mismatches: { path: string; expected: unknown; actual: unknown }[],\n ): void {\n // Handle __or__ marker\n if (this.#isOrMarker(expected)) {\n const allowedValues = (expected as { __or__: unknown[] }).__or__;\n const matches = allowedValues.some(allowed => {\n const tempMismatches: { path: string; expected: unknown; actual: unknown }[] = [];\n this.#deepCompareWithMarkers(actual, allowed, path, tempMismatches);\n return tempMismatches.length === 0;\n });\n if (!matches) {\n mismatches.push({ path, expected: { __or__: allowedValues }, actual });\n }\n return;\n }\n\n // Handle __any__ marker\n if (this.#isAnyMarker(expected)) {\n const typeConstraint = (expected as { __any__: string | boolean }).__any__;\n\n // Check for null/undefined\n if (actual === null || actual === undefined) {\n mismatches.push({ path, expected: { __any__: typeConstraint }, actual });\n return;\n }\n\n // If typeConstraint is true, any non-null value matches\n if (typeConstraint === true) {\n return;\n }\n\n // Check type constraint\n const actualType = Array.isArray(actual) ? 'array' : typeof actual;\n if (actualType !== typeConstraint) {\n mismatches.push({\n path,\n expected: { __any__: typeConstraint },\n actual: `(${actualType}) ${JSON.stringify(actual).slice(0, 50)}...`,\n });\n }\n return;\n }\n\n // Handle arrays\n if (Array.isArray(expected)) {\n if (!Array.isArray(actual)) {\n mismatches.push({ path, expected, actual });\n return;\n }\n if (actual.length !== expected.length) {\n mismatches.push({ path: `${path}.length`, expected: expected.length, actual: actual.length });\n return;\n }\n for (let i = 0; i < expected.length; i++) {\n this.#deepCompareWithMarkers(actual[i], expected[i], `${path}[${i}]`, mismatches);\n }\n return;\n }\n\n // Handle objects\n if (expected !== null && typeof expected === 'object') {\n if (actual === null || typeof actual !== 'object' || Array.isArray(actual)) {\n mismatches.push({ path, expected, actual });\n return;\n }\n const expectedObj = expected as Record<string, unknown>;\n const actualObj = actual as Record<string, unknown>;\n\n // Check all expected keys exist and match (skip metadata keys like __placeholder__)\n for (const key of Object.keys(expectedObj)) {\n // Skip metadata keys (e.g., __placeholder__, __structure__)\n if (this.#isMetadataKey(key)) {\n continue;\n }\n if (!(key in actualObj)) {\n // Only report if expected value is not undefined\n if (expectedObj[key] !== undefined) {\n mismatches.push({ path: `${path}.${key}`, expected: expectedObj[key], actual: undefined });\n }\n continue;\n }\n this.#deepCompareWithMarkers(actualObj[key], expectedObj[key], `${path}.${key}`, mismatches);\n }\n\n // Check for extra keys in actual (skip metadata keys)\n for (const key of Object.keys(actualObj)) {\n if (this.#isMetadataKey(key)) {\n continue;\n }\n if (!(key in expectedObj)) {\n // Only report if actual value is not undefined\n if (actualObj[key] !== undefined) {\n mismatches.push({ path: `${path}.${key}`, expected: undefined, actual: actualObj[key] });\n }\n }\n }\n return;\n }\n\n // Handle primitives\n if (actual !== expected) {\n mismatches.push({ path, expected, actual });\n }\n }\n\n /**\n * Check if a value is an __or__ marker object\n */\n #isOrMarker(value: unknown): boolean {\n return (\n value !== null &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n '__or__' in value &&\n Array.isArray((value as { __or__: unknown }).__or__)\n );\n }\n\n /**\n * Check if a value is an __any__ marker object\n */\n #isAnyMarker(value: unknown): boolean {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n return false;\n }\n if (!('__any__' in value)) {\n return false;\n }\n const constraint = (value as { __any__: unknown }).__any__;\n // Valid constraints: true, or type strings\n return constraint === true || ['string', 'number', 'boolean', 'object', 'array'].includes(constraint as string);\n }\n\n /**\n * Check if a key should be skipped during comparison (metadata keys like __structure__)\n */\n #isMetadataKey(key: string): boolean {\n return key.startsWith('__') && key.endsWith('__');\n }\n\n /**\n * Custom JSON replacer to handle Date objects and other special types\n */\n #jsonReplacer = (_key: string, value: unknown): unknown => {\n if (value instanceof Date) {\n return value.toISOString();\n }\n return value;\n };\n\n // ============================================================================\n // Debugging Helpers\n // ============================================================================\n\n /**\n * Get all stored debug logs (internal exporter logging, not signal logs)\n */\n getLogs(): string[] {\n return [...this.#debugLogs];\n }\n\n /**\n * Dump debug logs to console for debugging (uses console.error for visibility in test output)\n */\n dumpLogs(): void {\n console.error('\\n=== TestExporter Logs ===');\n this.#debugLogs.forEach(log => {\n console.error(log);\n });\n console.error('=== End Logs ===\\n');\n }\n\n /**\n * Validate final state - useful for test assertions\n *\n * @returns Object with validation results\n */\n validateFinalState(): {\n valid: boolean;\n singleTraceId: boolean;\n allSpansComplete: boolean;\n traceIds: string[];\n incompleteSpans: IncompleteSpanInfo[];\n } {\n const traceIds = this.getTraceIds();\n const incompleteSpans = this.getIncompleteSpans();\n\n const singleTraceId = traceIds.length === 1;\n const allSpansComplete = incompleteSpans.length === 0;\n\n return {\n valid: singleTraceId && allSpansComplete,\n singleTraceId,\n allSpansComplete,\n traceIds,\n incompleteSpans,\n };\n }\n\n // ============================================================================\n // Reset & Lifecycle\n // ============================================================================\n\n /**\n * Clear all collected events and state across all signals\n */\n clearEvents(): void {\n this.#tracingEvents = [];\n this.#spanStates.clear();\n this.#logEvents = [];\n this.#metricEvents = [];\n this.#scoreEvents = [];\n this.#feedbackEvents = [];\n this.#debugLogs = [];\n // Note: #internalMetrics is intentionally NOT reset here —\n // it tracks cumulative lifetime stats across clearEvents/reset calls.\n }\n\n /**\n * Alias for clearEvents (compatibility with TestExporter)\n */\n reset(): void {\n this.clearEvents();\n }\n\n /**\n * Get internal metrics about the exporter's own activity.\n */\n getInternalMetrics(): TestExporterInternalMetrics {\n const json = this.toJSON({ includeEvents: false, includeStats: false });\n return {\n startedAt: this.#internalMetrics.startedAt,\n lastEventAt: this.#internalMetrics.lastEventAt,\n totalEventsReceived: this.#internalMetrics.totalEventsReceived,\n bySignal: { ...this.#internalMetrics.bySignal },\n flushCount: this.#internalMetrics.flushCount,\n estimatedJsonBytes: new TextEncoder().encode(json).byteLength,\n };\n }\n\n /**\n * Flush buffered data and log internal metrics summary.\n */\n async flush(): Promise<void> {\n this.#internalMetrics.flushCount++;\n\n if (this.#config.logMetricsOnFlush) {\n const metrics = this.getInternalMetrics();\n const uptimeMs = Date.now() - metrics.startedAt.getTime();\n const summary = [\n `[TestExporter] flush #${metrics.flushCount} summary:`,\n ` uptime: ${(uptimeMs / 1000).toFixed(1)}s`,\n ` total events received: ${metrics.totalEventsReceived}`,\n ` by signal: tracing=${metrics.bySignal.tracing}, log=${metrics.bySignal.log}, metric=${metrics.bySignal.metric}, score=${metrics.bySignal.score}, feedback=${metrics.bySignal.feedback}`,\n ` buffered: spans=${this.#spanStates.size}, logs=${this.#logEvents.length}, metrics=${this.#metricEvents.length}, scores=${this.#scoreEvents.length}, feedback=${this.#feedbackEvents.length}`,\n ` estimated JSON size: ${(metrics.estimatedJsonBytes / 1024).toFixed(1)}KB`,\n ].join('\\n');\n this.logger.info(summary);\n }\n }\n\n async shutdown(): Promise<void> {\n await this.flush();\n this.logger.info('TestExporter shutdown');\n }\n\n // ============================================================================\n // Private Helpers\n // ============================================================================\n\n /**\n * Extract unique spans from a list of events\n */\n #getUniqueSpansFromEvents(events: TracingEvent[]): AnyExportedSpan[] {\n const spanMap = new Map<string, AnyExportedSpan>();\n\n for (const event of events) {\n const span = event.exportedSpan;\n // Prefer SPAN_ENDED events as they contain the final state\n if (event.type === EventType.SPAN_ENDED || !spanMap.has(span.id)) {\n spanMap.set(span.id, span);\n }\n }\n\n return Array.from(spanMap.values());\n }\n}\n\n// ============================================================================\n// Deprecated Aliases\n// ============================================================================\n\n/**\n * @deprecated Use `TestExporter` instead. This alias will be removed in a future version.\n */\nexport const JsonExporter = TestExporter;\n/**\n * @deprecated Use `TestExporter` instead. This is a type alias for backward compatibility.\n */\nexport type JsonExporter = TestExporter;\n\n/**\n * @deprecated Use `TestExporterConfig` instead.\n */\nexport type JsonExporterConfig = TestExporterConfig;\n\n/**\n * @deprecated Use `TestExporterStats` instead.\n */\nexport type JsonExporterStats = TestExporterStats;\n\n/**\n * @deprecated Use `TestExporterInternalMetrics` instead.\n */\nexport type JsonExporterInternalMetrics = TestExporterInternalMetrics;\n","import type { SpanType, Span, CreateSpanOptions } from '@mastra/core/observability';\nimport type { ObservabilityInstanceConfig } from '../config';\nimport { DefaultSpan } from '../spans';\nimport { BaseObservabilityInstance } from './base';\n\nexport class DefaultObservabilityInstance extends BaseObservabilityInstance {\n constructor(config: ObservabilityInstanceConfig) {\n super(config);\n }\n\n protected createSpan<TType extends SpanType>(options: CreateSpanOptions<TType>): Span<TType> {\n // Simple span creation - base class handles all tracing lifecycle automatically\n return new DefaultSpan<TType>(options, this);\n }\n}\n","import { generateSignalId } from '@mastra/core/observability';\nimport type {\n AnyRecordedSpan,\n CorrelationContext,\n FeedbackEvent,\n FeedbackInput,\n RecordedSpan,\n RecordedTrace,\n ScoreEvent,\n ScoreInput,\n SpanType,\n SpanTypeMap,\n} from '@mastra/core/observability';\nimport type { GetTraceResponse, SpanRecord } from '@mastra/core/storage';\n\ntype RecordedAnnotationEvent = ScoreEvent | FeedbackEvent;\ntype EmitRecordedEvent = (event: RecordedAnnotationEvent) => void | Promise<void>;\ntype CanEmitRecordedEvent = () => boolean;\ntype DebugRecordedAnnotationUnavailable = (args: {\n kind: 'score' | 'feedback';\n traceId: string;\n spanId?: string;\n}) => void;\ntype RecordedErrorInfo = AnyRecordedSpan['errorInfo'];\ntype CorrelationParent = Pick<SpanRecord, 'entityType' | 'entityId' | 'entityName'> | AnyRecordedSpan | undefined;\n\nfunction nullToUndefined<T>(value: T | null | undefined): T | undefined {\n return value ?? undefined;\n}\n\nfunction mergeMetadata(\n base: Record<string, any> | null | undefined,\n extra: Record<string, unknown> | undefined,\n): Record<string, unknown> | undefined {\n if (!base && !extra) return undefined;\n return {\n ...(base ?? {}),\n ...(extra ?? {}),\n };\n}\n\nfunction normalizeErrorInfo(error: SpanRecord['error']): RecordedErrorInfo {\n if (!error || typeof error !== 'object' || !('message' in error) || typeof error.message !== 'string') {\n return undefined;\n }\n\n return {\n message: error.message,\n id: 'id' in error && typeof error.id === 'string' ? error.id : undefined,\n name: 'name' in error && typeof error.name === 'string' ? error.name : undefined,\n stack: 'stack' in error && typeof error.stack === 'string' ? error.stack : undefined,\n domain: 'domain' in error && typeof error.domain === 'string' ? error.domain : undefined,\n category: 'category' in error && typeof error.category === 'string' ? error.category : undefined,\n details:\n 'details' in error && error.details && typeof error.details === 'object'\n ? (error.details as Record<string, any>)\n : undefined,\n };\n}\n\nfunction buildCorrelationContext(\n span: SpanRecord,\n rootSpan: SpanRecord,\n parent?: CorrelationParent,\n): CorrelationContext {\n return {\n tags: rootSpan.tags ?? undefined,\n entityType: nullToUndefined(span.entityType),\n entityId: nullToUndefined(span.entityId),\n entityName: nullToUndefined(span.entityName),\n parentEntityType: parent?.entityType ?? undefined,\n parentEntityId: parent?.entityId ?? undefined,\n parentEntityName: parent?.entityName ?? undefined,\n rootEntityType: nullToUndefined(rootSpan.entityType),\n rootEntityId: nullToUndefined(rootSpan.entityId),\n rootEntityName: nullToUndefined(rootSpan.entityName),\n userId: nullToUndefined(span.userId),\n organizationId: nullToUndefined(span.organizationId),\n resourceId: nullToUndefined(span.resourceId),\n runId: nullToUndefined(span.runId),\n sessionId: nullToUndefined(span.sessionId),\n threadId: nullToUndefined(span.threadId),\n requestId: nullToUndefined(span.requestId),\n environment: nullToUndefined(span.environment),\n source: nullToUndefined(span.source),\n serviceName: nullToUndefined(span.serviceName),\n experimentId: nullToUndefined(span.experimentId),\n };\n}\n\nexport function buildScoreEvent(args: {\n traceId?: string;\n spanId?: string;\n correlationContext?: CorrelationContext;\n score: ScoreInput;\n inheritedMetadata?: Record<string, any> | null;\n}): ScoreEvent {\n const { traceId, spanId, correlationContext, score, inheritedMetadata } = args;\n\n return {\n type: 'score',\n score: {\n scoreId: generateSignalId(),\n timestamp: new Date(),\n traceId,\n spanId,\n scorerId: score.scorerId,\n scorerName: score.scorerName,\n scorerVersion: score.scorerVersion,\n source: score.source,\n scoreSource: score.scoreSource,\n score: score.score,\n reason: score.reason,\n experimentId: score.experimentId,\n scoreTraceId: score.scoreTraceId,\n targetEntityType: score.targetEntityType,\n correlationContext,\n metadata: mergeMetadata(inheritedMetadata, score.metadata),\n },\n };\n}\n\nexport function buildFeedbackEvent(args: {\n traceId?: string;\n spanId?: string;\n correlationContext?: CorrelationContext;\n feedback: FeedbackInput;\n inheritedMetadata?: Record<string, any> | null;\n}): FeedbackEvent {\n const { traceId, spanId, correlationContext, feedback, inheritedMetadata } = args;\n\n return {\n type: 'feedback',\n feedback: {\n feedbackId: generateSignalId(),\n timestamp: new Date(),\n traceId,\n spanId,\n source: feedback.source,\n feedbackSource: feedback.feedbackSource,\n feedbackType: feedback.feedbackType,\n value: feedback.value,\n userId: feedback.userId,\n feedbackUserId: feedback.feedbackUserId,\n comment: feedback.comment,\n sourceId: feedback.sourceId,\n experimentId: feedback.experimentId,\n correlationContext,\n metadata: mergeMetadata(inheritedMetadata, feedback.metadata),\n },\n };\n}\n\nfunction findSpanById(spans: SpanRecord[], spanId: string | undefined): SpanRecord | undefined {\n if (!spanId) return undefined;\n return spans.find(span => span.spanId === spanId);\n}\n\nexport function buildRecordedScoreEventFromTrace(args: {\n trace: GetTraceResponse;\n score: ScoreInput;\n spanId?: string;\n}): ScoreEvent | null {\n const rootSpan = findRootSpan(args.trace.spans);\n if (!rootSpan) return null;\n\n const span = args.spanId ? findSpanById(args.trace.spans, args.spanId) : rootSpan;\n if (!span) return null;\n\n const parent = span.parentSpanId ? findSpanById(args.trace.spans, span.parentSpanId) : undefined;\n\n return buildScoreEvent({\n traceId: span.traceId,\n spanId: args.spanId,\n correlationContext: buildCorrelationContext(span, rootSpan, parent),\n score: args.score,\n inheritedMetadata: span.metadata,\n });\n}\n\nexport function buildRecordedFeedbackEventFromTrace(args: {\n trace: GetTraceResponse;\n feedback: FeedbackInput;\n spanId?: string;\n}): FeedbackEvent | null {\n const rootSpan = findRootSpan(args.trace.spans);\n if (!rootSpan) return null;\n\n const span = args.spanId ? findSpanById(args.trace.spans, args.spanId) : rootSpan;\n if (!span) return null;\n\n const parent = span.parentSpanId ? findSpanById(args.trace.spans, span.parentSpanId) : undefined;\n\n return buildFeedbackEvent({\n traceId: span.traceId,\n spanId: args.spanId,\n correlationContext: buildCorrelationContext(span, rootSpan, parent),\n feedback: args.feedback,\n inheritedMetadata: span.metadata,\n });\n}\n\nclass RecordedSpanImpl<TType extends SpanType = SpanType> implements RecordedSpan<TType> {\n public readonly id: string;\n public readonly traceId: string;\n public readonly name: string;\n public readonly type: TType;\n public readonly entityType?: RecordedSpan<TType>['entityType'];\n public readonly entityId?: string;\n public readonly entityName?: string;\n public readonly startTime: Date;\n public readonly endTime?: Date;\n public readonly attributes?: SpanTypeMap[TType];\n public readonly metadata?: Record<string, any>;\n public readonly tags?: string[];\n public readonly input?: any;\n public readonly output?: any;\n public readonly errorInfo?: {\n message: string;\n id?: string;\n name?: string;\n stack?: string;\n domain?: string;\n category?: string;\n details?: Record<string, any>;\n };\n public readonly requestContext?: Record<string, any>;\n public readonly isEvent: boolean;\n public readonly isRootSpan: boolean;\n public readonly parentSpanId?: string;\n public parent?: RecordedSpanImpl;\n public readonly children: RecordedSpanImpl[] = [];\n\n readonly #raw: SpanRecord;\n readonly #rootSpan: SpanRecord;\n readonly #emitRecordedEvent: EmitRecordedEvent;\n readonly #canEmitRecordedEvent: CanEmitRecordedEvent;\n readonly #debugRecordedAnnotationUnavailable: DebugRecordedAnnotationUnavailable;\n\n constructor(args: {\n raw: SpanRecord;\n rootSpan: SpanRecord;\n emitRecordedEvent: EmitRecordedEvent;\n canEmitRecordedEvent: CanEmitRecordedEvent;\n debugRecordedAnnotationUnavailable: DebugRecordedAnnotationUnavailable;\n }) {\n const { raw, rootSpan, emitRecordedEvent, canEmitRecordedEvent, debugRecordedAnnotationUnavailable } = args;\n\n this.#raw = raw;\n this.#rootSpan = rootSpan;\n this.#emitRecordedEvent = emitRecordedEvent;\n this.#canEmitRecordedEvent = canEmitRecordedEvent;\n this.#debugRecordedAnnotationUnavailable = debugRecordedAnnotationUnavailable;\n\n this.id = raw.spanId;\n this.traceId = raw.traceId;\n this.name = raw.name;\n this.type = raw.spanType as TType;\n this.entityType = raw.entityType ?? undefined;\n this.entityId = raw.entityId ?? undefined;\n this.entityName = raw.entityName ?? undefined;\n this.startTime = raw.startedAt;\n this.endTime = raw.endedAt ?? undefined;\n this.attributes = (raw.attributes ?? undefined) as SpanTypeMap[TType] | undefined;\n this.metadata = raw.metadata ?? undefined;\n this.tags = raw.tags ?? undefined;\n this.input = raw.input ?? undefined;\n this.output = raw.output ?? undefined;\n this.errorInfo = normalizeErrorInfo(raw.error);\n this.requestContext = raw.requestContext ?? undefined;\n this.isEvent = raw.isEvent;\n this.isRootSpan = !raw.parentSpanId;\n this.parentSpanId = raw.parentSpanId ?? undefined;\n }\n\n async addScore(score: ScoreInput): Promise<void> {\n if (!this.#canEmitRecordedEvent()) {\n this.#debugRecordedAnnotationUnavailable({ kind: 'score', traceId: this.traceId, spanId: this.id });\n return;\n }\n\n await this.#emitRecordedEvent(\n buildScoreEvent({\n traceId: this.#raw.traceId,\n spanId: this.id,\n correlationContext: buildCorrelationContext(this.#raw, this.#rootSpan, this.parent),\n score,\n inheritedMetadata: this.#raw.metadata,\n }),\n );\n }\n\n async addFeedback(feedback: FeedbackInput): Promise<void> {\n if (!this.#canEmitRecordedEvent()) {\n this.#debugRecordedAnnotationUnavailable({ kind: 'feedback', traceId: this.traceId, spanId: this.id });\n return;\n }\n\n await this.#emitRecordedEvent(\n buildFeedbackEvent({\n traceId: this.#raw.traceId,\n spanId: this.id,\n correlationContext: buildCorrelationContext(this.#raw, this.#rootSpan, this.parent),\n feedback,\n inheritedMetadata: this.#raw.metadata,\n }),\n );\n }\n}\n\nclass RecordedTraceImpl implements RecordedTrace {\n public readonly traceId: string;\n public readonly rootSpan: AnyRecordedSpan;\n public readonly spans: ReadonlyArray<AnyRecordedSpan>;\n\n readonly #rootRecord: SpanRecord;\n readonly #emitRecordedEvent: EmitRecordedEvent;\n readonly #spanMap: Map<string, AnyRecordedSpan>;\n readonly #canEmitRecordedEvent: CanEmitRecordedEvent;\n readonly #debugRecordedAnnotationUnavailable: DebugRecordedAnnotationUnavailable;\n\n constructor(args: {\n traceId: string;\n rootSpan: AnyRecordedSpan;\n rootRecord: SpanRecord;\n spans: AnyRecordedSpan[];\n emitRecordedEvent: EmitRecordedEvent;\n canEmitRecordedEvent: CanEmitRecordedEvent;\n debugRecordedAnnotationUnavailable: DebugRecordedAnnotationUnavailable;\n }) {\n this.traceId = args.traceId;\n this.rootSpan = args.rootSpan;\n this.#rootRecord = args.rootRecord;\n this.spans = args.spans;\n this.#emitRecordedEvent = args.emitRecordedEvent;\n this.#spanMap = new Map(args.spans.map(span => [span.id, span]));\n this.#canEmitRecordedEvent = args.canEmitRecordedEvent;\n this.#debugRecordedAnnotationUnavailable = args.debugRecordedAnnotationUnavailable;\n }\n\n getSpan(spanId: string): AnyRecordedSpan | null {\n return this.#spanMap.get(spanId) ?? null;\n }\n\n async addScore(score: ScoreInput): Promise<void> {\n if (!this.#canEmitRecordedEvent()) {\n this.#debugRecordedAnnotationUnavailable({ kind: 'score', traceId: this.traceId });\n return;\n }\n\n await this.#emitRecordedEvent(\n buildScoreEvent({\n traceId: this.#rootRecord.traceId,\n correlationContext: buildCorrelationContext(this.#rootRecord, this.#rootRecord),\n score,\n inheritedMetadata: this.#rootRecord.metadata,\n }),\n );\n }\n\n async addFeedback(feedback: FeedbackInput): Promise<void> {\n if (!this.#canEmitRecordedEvent()) {\n this.#debugRecordedAnnotationUnavailable({ kind: 'feedback', traceId: this.traceId });\n return;\n }\n\n await this.#emitRecordedEvent(\n buildFeedbackEvent({\n traceId: this.#rootRecord.traceId,\n correlationContext: buildCorrelationContext(this.#rootRecord, this.#rootRecord),\n feedback,\n inheritedMetadata: this.#rootRecord.metadata,\n }),\n );\n }\n}\n\nfunction findRootSpan(spans: SpanRecord[]): SpanRecord | undefined {\n const spanIds = new Set(spans.map(span => span.spanId));\n return spans.find(span => !span.parentSpanId || !spanIds.has(span.parentSpanId)) ?? spans[0];\n}\n\nexport function hydrateRecordedTrace(args: {\n trace: GetTraceResponse;\n emitRecordedEvent: EmitRecordedEvent;\n canEmitRecordedEvent?: CanEmitRecordedEvent;\n debugRecordedAnnotationUnavailable?: DebugRecordedAnnotationUnavailable;\n}): RecordedTrace | null {\n const {\n trace,\n emitRecordedEvent,\n canEmitRecordedEvent = () => true,\n debugRecordedAnnotationUnavailable = () => {},\n } = args;\n const rootSpan = findRootSpan(trace.spans);\n\n if (!rootSpan) {\n return null;\n }\n\n const recordedSpans = trace.spans.map(\n raw =>\n new RecordedSpanImpl({\n raw,\n rootSpan,\n emitRecordedEvent,\n canEmitRecordedEvent,\n debugRecordedAnnotationUnavailable,\n }),\n );\n const spanMap = new Map(recordedSpans.map(span => [span.id, span]));\n\n for (const span of recordedSpans) {\n if (!span.parentSpanId) continue;\n const parent = spanMap.get(span.parentSpanId);\n if (!parent) continue;\n\n span.parent = parent;\n parent.children.push(span);\n }\n\n const hydratedRootSpan = spanMap.get(rootSpan.spanId);\n if (!hydratedRootSpan) {\n return null;\n }\n\n return new RecordedTraceImpl({\n traceId: trace.traceId,\n rootSpan: hydratedRootSpan,\n rootRecord: rootSpan,\n spans: recordedSpans,\n emitRecordedEvent,\n canEmitRecordedEvent,\n debugRecordedAnnotationUnavailable,\n });\n}\n","/**\n * Observability Registry for Mastra\n *\n * Provides registry for Observability instances.\n */\n\nimport type { ObservabilityInstance, ConfigSelectorOptions, ConfigSelector } from '@mastra/core/observability';\n\n// ============================================================================\n// Observability Registry\n// ============================================================================\n\n/**\n * Registry for Observability instances.\n */\nexport class ObservabilityRegistry {\n #instances = new Map<string, ObservabilityInstance>();\n #defaultInstance?: ObservabilityInstance;\n #configSelector?: ConfigSelector;\n\n /**\n * Register a tracing instance\n */\n register(name: string, instance: ObservabilityInstance, isDefault = false): void {\n if (this.#instances.has(name)) {\n throw new Error(`Tracing instance '${name}' already registered`);\n }\n\n this.#instances.set(name, instance);\n\n // Set as default if explicitly marked or if it's the first instance\n if (isDefault || !this.#defaultInstance) {\n this.#defaultInstance = instance;\n }\n }\n\n /**\n * Get a tracing instance by name\n */\n get(name: string): ObservabilityInstance | undefined {\n return this.#instances.get(name);\n }\n\n /**\n * Get the default tracing instance\n */\n getDefault(): ObservabilityInstance | undefined {\n return this.#defaultInstance;\n }\n\n /**\n * Set the tracing selector function\n */\n setSelector(selector: ConfigSelector): void {\n this.#configSelector = selector;\n }\n\n /**\n * Get the selected tracing instance based on context\n */\n getSelected(options: ConfigSelectorOptions): ObservabilityInstance | undefined {\n // 1. Try selector function if provided\n if (this.#configSelector) {\n const selected = this.#configSelector(options, this.#instances);\n if (selected && this.#instances.has(selected)) {\n return this.#instances.get(selected);\n }\n }\n\n // 2. Fall back to default\n return this.#defaultInstance;\n }\n\n /**\n * Unregister a tracing instance\n */\n unregister(name: string): boolean {\n const instance = this.#instances.get(name);\n const deleted = this.#instances.delete(name);\n\n if (deleted && instance === this.#defaultInstance) {\n const next = this.#instances.values().next();\n this.#defaultInstance = next.done ? undefined : next.value;\n }\n\n return deleted;\n }\n\n /**\n * Shutdown all instances and clear the registry\n */\n async shutdown(): Promise<void> {\n const shutdownPromises = Array.from(this.#instances.values()).map(instance => instance.shutdown());\n\n await Promise.allSettled(shutdownPromises);\n this.#instances.clear();\n this.#instances.clear();\n this.#defaultInstance = undefined;\n this.#configSelector = undefined;\n }\n\n /**\n * Clear all instances without shutdown\n */\n clear(): void {\n this.#instances.clear();\n this.#defaultInstance = undefined;\n this.#configSelector = undefined;\n }\n\n /**\n * list all registered instances\n */\n list(): ReadonlyMap<string, ObservabilityInstance> {\n return new Map(this.#instances);\n }\n}\n","import type { SpanOutputProcessor, AnySpan } from '@mastra/core/observability';\n\nexport type RedactionStyle = 'full' | 'partial';\n\n/**\n * Options for configuring the SensitiveDataFilter.\n */\nexport interface SensitiveDataFilterOptions {\n /**\n * List of sensitive field names to redact.\n * Matching is case-insensitive and normalizes separators (`api-key`, `api_key`, `Api Key` → `apikey`).\n *\n * Defaults include: password, token, secret, key, apikey, auth, authorization,\n * bearer, bearertoken, jwt, credential, clientsecret, privatekey, refresh, ssn.\n */\n sensitiveFields?: string[];\n\n /**\n * The token used for full redaction.\n * Default: \"[REDACTED]\"\n */\n redactionToken?: string;\n\n /**\n * Style of redaction to use:\n * - \"full\": always replace with redactionToken.\n * - \"partial\": show 3 characters from the start and end, redact the middle.\n *\n * Default: \"full\"\n */\n redactionStyle?: RedactionStyle;\n}\n\n/**\n * SensitiveDataFilter\n *\n * An SpanOutputProcessor that redacts sensitive information from span fields.\n *\n * - Sensitive keys are matched case-insensitively, normalized to remove separators.\n * - Sensitive values are redacted using either full or partial redaction.\n * - Partial redaction always keeps 3 chars at the start and end.\n * - JSON strings containing sensitive fields are parsed and redacted.\n * - If filtering a field fails, the field is replaced with:\n * `{ error: { processor: \"sensitive-data-filter\" } }`\n */\nexport class SensitiveDataFilter implements SpanOutputProcessor {\n name = 'sensitive-data-filter';\n private sensitiveFields: string[];\n private redactionToken: string;\n private redactionStyle: RedactionStyle;\n\n constructor(options: SensitiveDataFilterOptions = {}) {\n this.sensitiveFields = (\n options.sensitiveFields || [\n 'password',\n 'token',\n 'secret',\n 'key',\n 'apikey',\n 'auth',\n 'authorization',\n 'bearer',\n 'bearertoken',\n 'jwt',\n 'credential',\n 'clientsecret',\n 'privatekey',\n 'refresh',\n 'ssn',\n ]\n ).map(f => this.normalizeKey(f));\n\n this.redactionToken = options.redactionToken ?? '[REDACTED]';\n this.redactionStyle = options.redactionStyle ?? 'full';\n }\n\n /**\n * Process a span by filtering sensitive data across its key fields.\n * Fields processed: attributes, metadata, input, output, errorInfo.\n *\n * @param span - The input span to filter\n * @returns A new span with sensitive values redacted\n */\n process(span: AnySpan): AnySpan {\n span.attributes = this.tryFilter(span.attributes);\n span.metadata = this.tryFilter(span.metadata);\n span.input = this.tryFilter(span.input);\n span.output = this.tryFilter(span.output);\n span.errorInfo = this.tryFilter(span.errorInfo);\n return span;\n }\n\n /**\n * Recursively filter objects/arrays for sensitive keys.\n * Handles circular references by replacing with a marker.\n * Also attempts to parse and redact JSON strings.\n */\n private deepFilter(obj: any, seen = new WeakSet()): any {\n if (obj === null || typeof obj !== 'object') {\n // Handle string values - check if they contain JSON that needs redacting\n if (typeof obj === 'string') {\n // Quick check - JSON objects/arrays start with { or [\n const trimmed = obj.trim();\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n return this.redactJsonString(obj);\n }\n }\n return obj;\n }\n\n if (seen.has(obj)) {\n return '[Circular Reference]';\n }\n seen.add(obj);\n\n // Preserve Date objects - they have no enumerable keys\n // and Object.keys() returns [], which would incorrectly convert them to {}\n if (obj instanceof Date) {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => this.deepFilter(item, seen));\n }\n\n const filtered: any = {};\n for (const key of Object.keys(obj)) {\n const normKey = this.normalizeKey(key);\n\n if (this.isSensitive(normKey)) {\n if (obj[key] && typeof obj[key] === 'object') {\n filtered[key] = this.deepFilter(obj[key], seen);\n } else {\n filtered[key] = this.redactValue(obj[key]);\n }\n } else {\n filtered[key] = this.deepFilter(obj[key], seen);\n }\n }\n\n return filtered;\n }\n\n private tryFilter(value: any): any {\n try {\n return this.deepFilter(value);\n } catch {\n return { error: { processor: this.name } };\n }\n }\n\n /**\n * Normalize keys by lowercasing and stripping non-alphanumeric characters.\n * Ensures consistent matching for variants like \"api-key\", \"api_key\", \"Api Key\".\n */\n private normalizeKey(key: string): string {\n return key.toLowerCase().replace(/[^a-z0-9]/g, '');\n }\n\n /**\n * Check whether a normalized key exactly matches any sensitive field.\n * Both key and sensitive fields are normalized by removing all non-alphanumeric\n * characters and converting to lowercase before comparison.\n *\n * Examples:\n * - \"api_key\", \"api-key\", \"ApiKey\" all normalize to \"apikey\" → MATCHES \"apikey\"\n * - \"promptTokens\", \"prompt_tokens\" normalize to \"prompttokens\" → DOES NOT MATCH \"token\"\n */\n private isSensitive(normalizedKey: string): boolean {\n return this.sensitiveFields.some(sensitiveField => {\n // Simple case-insensitive match after normalization\n return normalizedKey === sensitiveField;\n });\n }\n\n /**\n * Attempt to parse a string as JSON and redact sensitive fields within it.\n * If parsing fails or no sensitive data is found, returns the original string.\n */\n private redactJsonString(str: string): string {\n try {\n // Try to parse as JSON\n const parsed = JSON.parse(str);\n\n // If it's an object, filter it and serialize back\n if (parsed && typeof parsed === 'object') {\n const filtered = this.deepFilter(parsed, new WeakSet());\n return JSON.stringify(filtered);\n }\n\n // If not an object, return original\n return str;\n } catch {\n // Not valid JSON, return original string\n return str;\n }\n }\n\n /**\n * Redact a sensitive value.\n * - Full style: replaces with a fixed token.\n * - Partial style: shows 3 chars at start and end, hides the middle.\n *\n * Non-string values are converted to strings before partial redaction.\n */\n private redactValue(value: any): string {\n if (this.redactionStyle === 'full') {\n return this.redactionToken;\n }\n\n const str = String(value);\n const len = str.length;\n if (len <= 6) {\n return this.redactionToken; // too short, redact fully\n }\n return str.slice(0, 3) + '…' + str.slice(len - 3);\n }\n\n async shutdown(): Promise<void> {\n // No cleanup needed\n }\n}\n","import type { Mastra } from '@mastra/core';\nimport { MastraBase } from '@mastra/core/base';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { RegisteredLogger } from '@mastra/core/logger';\nimport type { IMastraLogger } from '@mastra/core/logger';\nimport type {\n ClientObservabilityProxy,\n CorrelationContext,\n ConfigSelector,\n ConfigSelectorOptions,\n FeedbackInput,\n FeedbackEvent,\n ObservabilityEntrypoint,\n ObservabilityDropEvent,\n ObservabilityInstance,\n RecordedTrace,\n ScoreInput,\n ScoreEvent,\n} from '@mastra/core/observability';\nimport type { ObservabilityStorage } from '@mastra/core/storage';\nimport { routeToHandler } from './bus/route-event';\nimport { createClientObservabilityProxy } from './client';\nimport { SamplingStrategyType, observabilityRegistryConfigSchema, observabilityConfigValueSchema } from './config';\nimport type { ObservabilityInstanceConfig, ObservabilityRegistryConfig } from './config';\nimport { MastraPlatformExporter, MastraStorageExporter } from './exporters';\nimport { BaseObservabilityInstance, DefaultObservabilityInstance } from './instances';\nimport {\n buildFeedbackEvent,\n buildScoreEvent,\n buildRecordedFeedbackEventFromTrace,\n buildRecordedScoreEventFromTrace,\n hydrateRecordedTrace,\n} from './recorded';\nimport { ObservabilityRegistry } from './registry';\nimport { SensitiveDataFilter } from './span_processors';\nimport type { SensitiveDataFilterOptions } from './span_processors';\n\n/**\n * Type guard to check if an object is a BaseObservability instance\n */\nfunction isInstance(\n obj: Omit<ObservabilityInstanceConfig, 'name'> | ObservabilityInstance,\n): obj is ObservabilityInstance {\n return obj instanceof BaseObservabilityInstance;\n}\n\n/**\n * Top-level observability entrypoint. Manages a registry of ObservabilityInstance\n * configurations and provides instance selection via config selectors.\n */\nexport class Observability extends MastraBase implements ObservabilityEntrypoint {\n #registry = new ObservabilityRegistry();\n #mastra?: Mastra;\n #clientObservabilityProxy?: ClientObservabilityProxy;\n\n constructor(config: ObservabilityRegistryConfig) {\n super({\n component: RegisteredLogger.OBSERVABILITY,\n name: 'Observability',\n });\n\n if (config === undefined) {\n config = {};\n }\n\n // Validate config with Zod\n const validationResult = observabilityRegistryConfigSchema.safeParse(config);\n if (!validationResult.success) {\n const errorMessages = validationResult.error.issues\n .map(\n (err: { path: (string | number | symbol)[]; message: string }) =>\n `${err.path.join('.') || 'config'}: ${err.message}`,\n )\n .join('; ');\n throw new MastraError({\n id: 'OBSERVABILITY_INVALID_CONFIG',\n text: `Invalid observability configuration: ${errorMessages}`,\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.USER,\n details: {\n validationErrors: errorMessages,\n },\n });\n }\n\n // Validate individual configs if they are plain objects (not instances)\n if (config.configs) {\n for (const [name, configValue] of Object.entries(config.configs)) {\n if (!isInstance(configValue)) {\n const configValidation = observabilityConfigValueSchema.safeParse(configValue);\n if (!configValidation.success) {\n const errorMessages = configValidation.error.issues\n .map(\n (err: { path: (string | number | symbol)[]; message: string }) =>\n `${err.path.join('.')}: ${err.message}`,\n )\n .join('; ');\n throw new MastraError({\n id: 'OBSERVABILITY_INVALID_INSTANCE_CONFIG',\n text: `Invalid configuration for observability instance '${name}': ${errorMessages}`,\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.USER,\n details: {\n instanceName: name,\n validationErrors: errorMessages,\n },\n });\n }\n }\n }\n }\n\n // Resolve sensitive data filter setting (defaults to enabled).\n const sensitiveDataFilterSetting = config.sensitiveDataFilter ?? true;\n const shouldAutoApplySensitiveFilter = sensitiveDataFilterSetting !== false;\n const sensitiveDataFilterOptions: SensitiveDataFilterOptions | undefined =\n typeof sensitiveDataFilterSetting === 'object' && sensitiveDataFilterSetting !== null\n ? sensitiveDataFilterSetting\n : undefined;\n\n const buildAutoSensitiveFilter = (): SensitiveDataFilter | undefined => {\n if (!shouldAutoApplySensitiveFilter) {\n return undefined;\n }\n return new SensitiveDataFilter(sensitiveDataFilterOptions);\n };\n\n // Setup default config if enabled (deprecated)\n if (config.default?.enabled) {\n console.warn(\n '[Mastra Observability] The \"default: { enabled: true }\" configuration is deprecated and will be removed in a future version. ' +\n 'Please use explicit configs with MastraStorageExporter and MastraPlatformExporter instead. ' +\n 'Sensitive data filtering is applied by default and can be controlled via the top-level \"sensitiveDataFilter\" option. ' +\n 'See https://mastra.ai/docs/observability/tracing/overview for the recommended configuration.',\n );\n\n const autoFilter = buildAutoSensitiveFilter();\n const defaultInstance = new DefaultObservabilityInstance({\n serviceName: 'mastra',\n name: 'default',\n sampling: { type: SamplingStrategyType.ALWAYS },\n exporters: [new MastraStorageExporter(), new MastraPlatformExporter()],\n spanOutputProcessors: autoFilter ? [autoFilter] : [],\n });\n\n // Register as default with high priority\n this.#registry.register('default', defaultInstance, true);\n }\n\n if (config.configs) {\n // Process user-provided configs\n const instances = Object.entries(config.configs);\n\n instances.forEach(([name, tracingDef], index) => {\n let instance: ObservabilityInstance;\n if (isInstance(tracingDef)) {\n // Pre-instantiated custom implementation. We don't mutate it since\n // the caller already owns it; warn if no SensitiveDataFilter is\n // present and auto-apply is enabled.\n instance = tracingDef;\n if (shouldAutoApplySensitiveFilter) {\n const processors = instance.getSpanOutputProcessors?.() ?? [];\n const hasFilter = processors.some(p => p instanceof SensitiveDataFilter);\n if (!hasFilter) {\n this.logger?.warn(\n '[Mastra Observability] Pre-instantiated observability instance does not include a SensitiveDataFilter. ' +\n 'Auto-applied filtering is skipped for pre-instantiated instances. ' +\n 'Add a SensitiveDataFilter to spanOutputProcessors when constructing the instance to redact sensitive data.',\n { instanceName: name },\n );\n }\n }\n } else {\n const userProcessors = tracingDef.spanOutputProcessors ?? [];\n const hasFilter = userProcessors.some(p => p instanceof SensitiveDataFilter);\n const autoFilter = !hasFilter ? buildAutoSensitiveFilter() : undefined;\n // Auto-applied filter runs LAST so any sensitive data introduced by\n // user processors (e.g. enrichment that copies headers/config into\n // attributes) is still redacted before export.\n const spanOutputProcessors = autoFilter ? [...userProcessors, autoFilter] : userProcessors;\n instance = new DefaultObservabilityInstance({\n ...tracingDef,\n name,\n spanOutputProcessors,\n });\n }\n\n // First user-provided instance becomes default only if no default config\n const isDefault = !config.default?.enabled && index === 0;\n this.#registry.register(name, instance, isDefault);\n });\n }\n\n // Set selector function if provided\n if (config.configSelector) {\n this.#registry.setSelector(config.configSelector);\n }\n }\n\n /** Initialize all exporter instances with the Mastra context (storage, config, etc.). */\n setMastraContext(options: { mastra: Mastra }): void {\n const instances = this.listInstances();\n const { mastra } = options;\n this.#mastra = mastra;\n\n const mastraEnvironment = mastra.getEnvironment?.();\n\n instances.forEach(instance => {\n // Propagate the Mastra-level environment so spans can fall back to it\n // when `metadata.environment` isn't set on a specific span.\n instance.__setMastraEnvironment?.(mastraEnvironment);\n\n const config = instance.getConfig();\n const exporters = instance.getExporters();\n const emitDropEvent =\n instance instanceof BaseObservabilityInstance\n ? (event: ObservabilityDropEvent) => instance.getObservabilityBus().emitDropEvent(event)\n : undefined;\n exporters.forEach(exporter => {\n // Initialize exporter if it has an init method\n if ('init' in exporter && typeof exporter.init === 'function') {\n try {\n exporter.init({ mastra, config, emitDropEvent });\n } catch (error) {\n this.logger?.warn('Failed to initialize observability exporter', {\n exporterName: exporter.name,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n });\n });\n }\n\n /** Propagate a logger to this instance and all registered observability instances. */\n setLogger(options: { logger: IMastraLogger }): void {\n super.__setLogger(options.logger);\n this.listInstances().forEach(instance => {\n instance.__setLogger(options.logger);\n });\n }\n\n /** Get the observability instance chosen by the config selector for the given options. */\n getSelectedInstance(options: ConfigSelectorOptions): ObservabilityInstance | undefined {\n return this.#registry.getSelected(options);\n }\n\n async getRecordedTrace(args: { traceId: string }): Promise<RecordedTrace | null> {\n const observabilityStorage = await this.#getObservabilityStorage();\n if (!observabilityStorage) {\n return null;\n }\n\n const trace = await observabilityStorage.getTrace({ traceId: args.traceId });\n if (!trace) {\n return null;\n }\n\n return hydrateRecordedTrace({\n trace,\n emitRecordedEvent: event => this.#emitRecordedEvent(event),\n canEmitRecordedEvent: () => !!this.#getRecordedTraceInstance(),\n debugRecordedAnnotationUnavailable: ({ kind, traceId, spanId }) => {\n this.logger?.debug(\n kind === 'score'\n ? 'addScore() is unavailable; rehydrate the trace before calling addScore()'\n : 'addFeedback() is unavailable; rehydrate the trace before calling addFeedback()',\n {\n traceId,\n spanId,\n },\n );\n },\n });\n }\n\n async addScore(args: {\n traceId?: string;\n spanId?: string;\n correlationContext?: CorrelationContext;\n score: ScoreInput;\n }): Promise<void> {\n const targetTraceId = args.traceId ?? args.correlationContext?.traceId;\n const targetSpanId = args.spanId ?? args.correlationContext?.spanId;\n\n if (args.correlationContext) {\n await this.#emitRecordedEvent(\n buildScoreEvent({\n ...(targetTraceId ? { traceId: targetTraceId } : {}),\n ...(targetSpanId ? { spanId: targetSpanId } : {}),\n correlationContext: args.correlationContext,\n score: args.score,\n }),\n );\n return;\n }\n\n if (!args.traceId) {\n return;\n }\n\n const trace = await this.#getStoredTrace(args.traceId);\n if (!trace) {\n return;\n }\n\n const event = buildRecordedScoreEventFromTrace({\n trace,\n spanId: args.spanId,\n score: args.score,\n });\n\n if (!event) {\n return;\n }\n\n await this.#emitRecordedEvent(event);\n }\n\n async addFeedback(args: {\n traceId?: string;\n spanId?: string;\n correlationContext?: CorrelationContext;\n feedback: FeedbackInput;\n }): Promise<void> {\n const targetTraceId = args.traceId ?? args.correlationContext?.traceId;\n const targetSpanId = args.spanId ?? args.correlationContext?.spanId;\n\n if (args.correlationContext) {\n await this.#emitRecordedEvent(\n buildFeedbackEvent({\n ...(targetTraceId ? { traceId: targetTraceId } : {}),\n ...(targetSpanId ? { spanId: targetSpanId } : {}),\n correlationContext: args.correlationContext,\n feedback: args.feedback,\n }),\n );\n return;\n }\n\n if (!args.traceId) {\n return;\n }\n\n const trace = await this.#getStoredTrace(args.traceId);\n if (!trace) {\n return;\n }\n\n const event = buildRecordedFeedbackEventFromTrace({\n trace,\n spanId: args.spanId,\n feedback: args.feedback,\n });\n\n if (!event) {\n return;\n }\n\n await this.#emitRecordedEvent(event);\n }\n\n /** Register a named observability instance, optionally marking it as default. */\n registerInstance(name: string, instance: ObservabilityInstance, isDefault = false): void {\n this.#registry.register(name, instance, isDefault);\n\n // If Mastra context has already been set, propagate the environment to\n // this late-registered instance so it auto-tags spans like instances\n // registered before setMastraContext.\n if (this.#mastra) {\n instance.__setMastraEnvironment?.(this.#mastra.getEnvironment?.());\n }\n }\n\n /** Get a registered instance by name. */\n getInstance(name: string): ObservabilityInstance | undefined {\n return this.#registry.get(name);\n }\n\n /** Get the default observability instance. */\n getDefaultInstance(): ObservabilityInstance | undefined {\n return this.#registry.getDefault();\n }\n\n /** List all registered observability instances. */\n listInstances(): ReadonlyMap<string, ObservabilityInstance> {\n return this.#registry.list();\n }\n\n /** Unregister an instance by name. Returns true if it was found and removed. */\n unregisterInstance(name: string): boolean {\n return this.#registry.unregister(name);\n }\n\n /** Check whether an instance with the given name is registered. */\n hasInstance(name: string): boolean {\n return !!this.#registry.get(name);\n }\n\n /** Set the config selector used to choose an instance at runtime. */\n setConfigSelector(selector: ConfigSelector): void {\n this.#registry.setSelector(selector);\n }\n\n /** Remove all registered instances and reset the registry. */\n clear(): void {\n this.#registry.clear();\n }\n\n /** Shut down all registered instances, flushing any pending data. */\n async shutdown(): Promise<void> {\n await this.#registry.shutdown();\n }\n\n /**\n * Returns the proxy responsible for client observability (W3C trace\n * context injection + OTLP/JSON payload reception for spans/logs\n * returned from client-side execution).\n *\n * Lazily constructed on first call. Resolves the target observability\n * instance per receive call so config selection works the same way\n * as for server-side spans.\n */\n getClientObservabilityProxy(): ClientObservabilityProxy | undefined {\n if (!this.#clientObservabilityProxy) {\n this.#clientObservabilityProxy = createClientObservabilityProxy({\n resolveInstance: () => this.getDefaultInstance(),\n logger: this.logger,\n });\n }\n return this.#clientObservabilityProxy;\n }\n\n async #getObservabilityStorage(): Promise<ObservabilityStorage | null> {\n const storage = this.#mastra?.getStorage();\n if (!storage) {\n return null;\n }\n\n return (await storage.getStore('observability')) ?? null;\n }\n\n async #getStoredTrace(traceId: string) {\n const observabilityStorage = await this.#getObservabilityStorage();\n if (!observabilityStorage) {\n return null;\n }\n\n return observabilityStorage.getTrace({ traceId });\n }\n\n #getRecordedTraceInstance(): ObservabilityInstance | undefined {\n return this.getDefaultInstance() ?? Array.from(this.listInstances().values())[0];\n }\n\n async #emitRecordedEvent(event: ScoreEvent | FeedbackEvent): Promise<void> {\n const instance = this.#getRecordedTraceInstance();\n if (!instance) {\n this.logger?.debug(\n event.type === 'score'\n ? 'Score event was dropped because no observability instance is registered'\n : 'Feedback event was dropped because no observability instance is registered',\n { eventType: event.type },\n );\n return;\n }\n\n if (instance instanceof BaseObservabilityInstance) {\n instance.__emitRecordedEvent(event);\n return;\n }\n\n const bridge = instance.getBridge();\n const handlerResults = [\n ...instance.getExporters().map(exporter => routeToHandler(exporter, event, this.logger)),\n ...(bridge ? [routeToHandler(bridge, event, this.logger)] : []),\n ].filter((result): result is Promise<void> => !!result && typeof result.then === 'function');\n\n if (handlerResults.length > 0) {\n await Promise.allSettled(handlerResults);\n }\n }\n}\n","/**\n * Feature flags for @mastra/observability\n *\n * Tracks which features are available in the current version of\n * @mastra/observability. Downstream exporter packages (e.g.\n * @mastra/datadog, @mastra/laminar) can check for feature availability\n * before relying on a span shape, attribute, or hierarchy that this\n * package may not yet emit.\n *\n * Pair these checks with `coreFeatures` from `@mastra/core/features` so a\n * consumer only opts in when BOTH packages support the feature.\n *\n * @example Old-version-safe usage\n *\n * A static named import of `observabilityFeatures` will throw a link-time\n * `SyntaxError` in strict Node ESM when paired with an `@mastra/observability`\n * that predates this export. Use a dynamic import so the exporter degrades\n * gracefully against any version of `@mastra/observability`:\n *\n * ```ts\n * import { coreFeatures } from \"@mastra/core/features\"\n *\n * let observabilityFeatures: Set<string> | undefined\n * try {\n * ({ observabilityFeatures } = await import(\"@mastra/observability\"))\n * } catch {\n * // older @mastra/observability that does not export this symbol\n * }\n *\n * if (\n * observabilityFeatures?.has(\"model-inference-span\") &&\n * coreFeatures.has(\"model-inference-span\")\n * ) {\n * // safe\n * }\n * ```\n */\n// Add feature flags here as new features are introduced\nexport const observabilityFeatures: ReadonlySet<string> = new Set(['model-inference-span', 'internal-usage-rollup']);\n","/**\n * Composable Tracing Options Builder\n */\n\nimport type { TracingOptions } from '@mastra/core/observability';\n\n/**\n * A function that updates TracingOptions.\n */\nexport type TracingOptionsUpdater = (options: TracingOptions) => TracingOptions;\n\n/**\n * Builds TracingOptions by composing one or more updater functions.\n *\n * @example\n * ```typescript\n * import { buildTracingOptions } from '@mastra/observability';\n * import { withLangfusePrompt } from '@mastra/langfuse';\n *\n * const prompt = await langfuse.getPrompt('my-prompt');\n *\n * const agent = new Agent({\n * defaultGenerateOptions: {\n * tracingOptions: buildTracingOptions(withLangfusePrompt(prompt)),\n * },\n * });\n * ```\n */\nexport function buildTracingOptions(...updaters: TracingOptionsUpdater[]): TracingOptions {\n return updaters.reduce((opts, updater) => updater(opts), {} as TracingOptions);\n}\n"]}
1
+ {"version":3,"sources":["../src/bus/route-event.ts","../src/bus/base.ts","../src/spans/serialization.ts","../src/bus/observability-bus.ts","../src/config.ts","../src/context/logger.ts","../src/context/metrics.ts","../src/metrics/pricing-model.ts","../src/metrics/pricing-registry.ts","../src/metrics/types.ts","../src/metrics/usage-metrics.ts","../src/metrics/estimator.ts","../src/metrics/auto-extract.ts","../src/metrics/cardinality.ts","../src/usage.ts","../src/model-tracing.ts","../src/spans/base.ts","../src/spans/default.ts","../src/spans/no-op.ts","../src/instances/base.ts","../src/client/id.ts","../src/client/otlp.ts","../src/client/w3c.ts","../src/client/proxy.ts","../src/exporters/base.ts","../src/exporters/tracking.ts","../src/exporters/span-formatters.ts","../src/exporters/auth-failure-cooldown.ts","../src/exporters/cloud.ts","../src/exporters/console.ts","../src/exporters/event-buffer.ts","../src/exporters/default.ts","../src/exporters/mastra-platform.ts","../src/exporters/mastra-storage.ts","../src/exporters/test.ts","../src/instances/default.ts","../src/recorded.ts","../src/registry.ts","../src/span_processors/sensitive-data-filter.ts","../src/default.ts","../src/features.ts","../src/tracing-options.ts"],"names":["TracingEventType","MastraBase","RegisteredLogger","cleaned","SamplingStrategyType","z","SpanType","generateSignalId","fs","path","require","createRequire","DEFAULT_BLOCKED_LABELS","coreFeatures","TransformStream","InternalSpans","error","MastraError","noOpLoggerContext","getNestedValue","setNestedValue","EntityType","ConsoleLogger","LogLevel","fetchWithRetry","ErrorDomain","ErrorCategory","buildUpdateSpanRecord","buildFeedbackRecord","buildLogRecord","buildMetricRecord","buildScoreRecord","buildCreateSpanRecord","SIGNAL_PUBLISH_SUFFIXES","SIGNAL_PUBLISH_SEGMENTS","trimTrailingSlashes","createInvalidEndpointError","VALID_PROJECT_ID","createInvalidProjectIdError","resolveBaseEndpoint","buildSignalPath","buildSignalEndpoint","resolveExplicitSignalEndpoint","deriveSignalEndpointFromTracesEndpoint","resolveTracingStorageStrategy","EventType"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Shared event routing logic for observability handlers (exporters and bridges).\n *\n * Both ObservabilityExporter and ObservabilityBridge implement the same optional\n * signal handlers (onTracingEvent, onLogEvent, onMetricEvent, onScoreEvent,\n * onFeedbackEvent). This module provides a single routing function used by both\n * the ObservabilityBus (for exporters) and BaseObservabilityInstance (for bridges).\n */\n\nimport type { IMastraLogger } from '@mastra/core/logger';\nimport type {\n ObservabilityEvents,\n TracingEvent,\n LogEvent,\n MetricEvent,\n ScoreEvent,\n FeedbackEvent,\n ObservabilityEvent,\n ObservabilityDropEvent,\n} from '@mastra/core/observability';\nimport { TracingEventType } from '@mastra/core/observability';\n\n/**\n * Any handler that can receive routed observability events.\n * Both ObservabilityExporter and ObservabilityBridge extend\n * ObservabilityEvents, so this matches either.\n */\nexport type ObservabilityHandler = ObservabilityEvents & { name: string };\n\ntype LegacyScoreHandler = ObservabilityHandler & {\n addScoreToTrace?: (args: {\n traceId: string;\n spanId?: string;\n score: number;\n reason?: string;\n scorerName: string;\n metadata?: Record<string, any>;\n }) => void | Promise<void>;\n};\n\n/**\n * Route a single event to the appropriate method on a handler.\n *\n * For tracing events, prefers onTracingEvent when present and falls back\n * to exportTracingEvent. For all other signals, calls the corresponding\n * optional handler method if the handler implements it.\n *\n * Returns the handler promise (if async) so callers can track it for flush().\n * Async rejections are caught to prevent unhandled rejections.\n * Sync throws are caught so one failing handler doesn't break others.\n */\nexport function routeToHandler(\n handler: ObservabilityHandler,\n event: ObservabilityEvent,\n logger: IMastraLogger,\n): void | Promise<void> {\n try {\n switch (event.type) {\n case TracingEventType.SPAN_STARTED:\n case TracingEventType.SPAN_UPDATED:\n case TracingEventType.SPAN_ENDED: {\n const fn = handler.onTracingEvent\n ? handler.onTracingEvent.bind(handler)\n : handler.exportTracingEvent.bind(handler);\n return catchAsyncResult(fn(event as TracingEvent), handler.name, 'tracing', logger);\n }\n\n case 'log':\n if (handler.onLogEvent) {\n return catchAsyncResult(handler.onLogEvent(event as LogEvent), handler.name, 'log', logger);\n }\n break;\n\n case 'metric':\n if (handler.onMetricEvent) {\n return catchAsyncResult(handler.onMetricEvent(event as MetricEvent), handler.name, 'metric', logger);\n }\n break;\n\n case 'score':\n if (handler.onScoreEvent) {\n return catchAsyncResult(handler.onScoreEvent(event as ScoreEvent), handler.name, 'score', logger);\n }\n if ((handler as LegacyScoreHandler).addScoreToTrace) {\n const score = (event as ScoreEvent).score;\n if (!score.traceId) break;\n return catchAsyncResult(\n (handler as LegacyScoreHandler).addScoreToTrace!({\n traceId: score.traceId,\n ...(score.spanId ? { spanId: score.spanId } : {}),\n score: score.score,\n ...(score.reason ? { reason: score.reason } : {}),\n scorerName: score.scorerName ?? score.scorerId,\n ...(score.metadata ? { metadata: score.metadata as Record<string, any> } : {}),\n }),\n handler.name,\n 'score',\n logger,\n );\n }\n break;\n\n case 'feedback':\n if (handler.onFeedbackEvent) {\n return catchAsyncResult(handler.onFeedbackEvent(event as FeedbackEvent), handler.name, 'feedback', logger);\n }\n break;\n }\n } catch (err) {\n logger.error(`[Observability] Handler error [handler=${handler.name}]:`, err);\n }\n}\n\n/**\n * Route exporter pipeline drop events to a handler.\n *\n * Drop events are meta-events for alerting and health reporting, so they use a\n * dedicated hook instead of the normal observability signal router.\n */\nexport function routeDropToHandler(\n handler: ObservabilityHandler,\n event: ObservabilityDropEvent,\n logger: IMastraLogger,\n): void | Promise<void> {\n try {\n if (handler.onDroppedEvent) {\n return catchAsyncResult(handler.onDroppedEvent(event), handler.name, 'drop', logger);\n }\n } catch (err) {\n logger.error(`[Observability] Handler error [handler=${handler.name}]:`, err);\n }\n}\n\n/**\n * Catch rejected promises from async handlers and return the tracked promise.\n * The returned promise always resolves (never rejects) — errors are logged.\n */\nfunction catchAsyncResult(\n result: void | Promise<void>,\n handlerName: string,\n signal: string,\n logger: IMastraLogger,\n): void | Promise<void> {\n if (result && typeof (result as Promise<void>).then === 'function') {\n return (result as Promise<void>).catch(err => {\n logger.error(`[Observability] ${signal} handler error [handler=${handlerName}]:`, err);\n });\n }\n}\n","/**\n * BaseObservabilityEventBus - Generic event bus for observability events.\n *\n * Provides a synchronous pub/sub mechanism:\n * - Events are dispatched to subscribers immediately on emit()\n * - Graceful error handling (handler errors don't break other handlers)\n * - flush() awaits any in-flight async subscriber promises\n * - Clean shutdown flushes then clears subscribers\n *\n * Buffering/batching is intentionally NOT done here — individual exporters\n * own their own batching strategy.\n */\n\nimport { MastraBase } from '@mastra/core/base';\nimport { RegisteredLogger } from '@mastra/core/logger';\nimport type { ObservabilityEventBus } from '@mastra/core/observability';\n\nexport class BaseObservabilityEventBus<TEvent> extends MastraBase implements ObservabilityEventBus<TEvent> {\n private subscribers: Set<(event: TEvent) => void> = new Set();\n\n /** In-flight async subscriber promises. Self-cleaning via .finally(). */\n private pendingSubscribers: Set<Promise<void>> = new Set();\n\n constructor({ name }: { name?: string } = {}) {\n super({ component: RegisteredLogger.OBSERVABILITY, name: name ?? 'EventBus' });\n }\n\n /**\n * Dispatch an event to all subscribers synchronously.\n * Async handler promises are tracked internally and drained by {@link flush}.\n *\n * @param event - The event to broadcast to subscribers.\n */\n emit(event: TEvent): void {\n for (const handler of this.subscribers) {\n try {\n // Handler is typed as () => void, but at runtime an async fn returns a Promise.\n // Defensively catch rejected promises so they don't become unhandled rejections.\n const result: unknown = handler(event);\n if (result && typeof (result as Promise<void>).then === 'function') {\n const promise = (result as Promise<void>).catch(err => {\n this.logger.error('[ObservabilityEventBus] Handler error:', err);\n });\n this.pendingSubscribers.add(promise);\n void promise.finally(() => this.pendingSubscribers.delete(promise));\n }\n } catch (err) {\n this.logger.error('[ObservabilityEventBus] Handler error:', err);\n }\n }\n }\n\n /**\n * Register a handler to receive future events.\n *\n * @param handler - Callback invoked synchronously on each {@link emit}.\n * @returns An unsubscribe function that removes the handler.\n */\n subscribe(handler: (event: TEvent) => void): () => void {\n this.subscribers.add(handler);\n return () => {\n this.subscribers.delete(handler);\n };\n }\n\n /** Max flush drain iterations before bailing — prevents infinite loops when handlers re-emit. */\n private static readonly MAX_FLUSH_ITERATIONS = 3;\n\n /** Await all in-flight async subscriber promises, draining until empty. */\n async flush(): Promise<void> {\n let iterations = 0;\n while (this.pendingSubscribers.size > 0) {\n await Promise.allSettled([...this.pendingSubscribers]);\n iterations++;\n if (iterations >= BaseObservabilityEventBus.MAX_FLUSH_ITERATIONS) {\n this.logger.error(\n `[ObservabilityEventBus] flush() exceeded ${BaseObservabilityEventBus.MAX_FLUSH_ITERATIONS} drain iterations — ` +\n `${this.pendingSubscribers.size} promises still pending. Handlers may be re-emitting during flush.`,\n );\n break;\n }\n }\n }\n\n /** Flush pending promises, then clear all subscribers. */\n async shutdown(): Promise<void> {\n await this.flush();\n this.subscribers.clear();\n }\n}\n","/**\n * Bounded serialization utilities for AI tracing.\n *\n * These utilities prevent memory issues by enforcing strict limits on\n * string lengths, array sizes, object depths, and total output size.\n * They are designed to be used across all tracing/telemetry systems.\n *\n * ## Custom Span Serialization\n *\n * Classes can implement a `serializeForSpan()` method to provide a custom\n * representation when serialized for tracing spans. This is useful for:\n * - Excluding internal state and implementation details\n * - Removing functions and circular references\n * - Providing a clean, readable representation for observability\n *\n * @example\n * ```typescript\n * class MyClass {\n * private internalState = new Map();\n * public data: string[];\n *\n * serializeForSpan() {\n * return { data: this.data };\n * }\n * }\n * ```\n */\n\n/**\n * Default keys to strip from objects during deep cleaning.\n * These are typically internal/sensitive fields that shouldn't be traced.\n */\nexport const DEFAULT_KEYS_TO_STRIP = new Set([\n 'logger',\n 'experimental_providerMetadata',\n 'providerMetadata',\n 'steps',\n 'tracingContext',\n 'execute', // Tool execute functions\n 'validate', // Schema validate functions\n]);\n\nexport interface DeepCleanOptions {\n keysToStrip: Set<string> | string[] | Record<string, unknown>;\n maxDepth: number;\n maxStringLength: number;\n maxArrayLength: number;\n maxObjectKeys: number;\n}\n\nexport const DEFAULT_DEEP_CLEAN_OPTIONS: DeepCleanOptions = Object.freeze({\n keysToStrip: DEFAULT_KEYS_TO_STRIP,\n maxDepth: 8,\n maxStringLength: 128 * 1024, // 128KB - sufficient for large LLM prompts/responses\n maxArrayLength: 50,\n maxObjectKeys: 50,\n});\n\n/**\n * Merge user-provided serialization options with defaults.\n * Returns a complete DeepCleanOptions object.\n */\nexport function mergeSerializationOptions(userOptions?: {\n maxStringLength?: number;\n maxDepth?: number;\n maxArrayLength?: number;\n maxObjectKeys?: number;\n}): DeepCleanOptions {\n if (!userOptions) {\n return DEFAULT_DEEP_CLEAN_OPTIONS;\n }\n return {\n keysToStrip: DEFAULT_KEYS_TO_STRIP,\n maxDepth: userOptions.maxDepth ?? DEFAULT_DEEP_CLEAN_OPTIONS.maxDepth,\n maxStringLength: userOptions.maxStringLength ?? DEFAULT_DEEP_CLEAN_OPTIONS.maxStringLength,\n maxArrayLength: userOptions.maxArrayLength ?? DEFAULT_DEEP_CLEAN_OPTIONS.maxArrayLength,\n maxObjectKeys: userOptions.maxObjectKeys ?? DEFAULT_DEEP_CLEAN_OPTIONS.maxObjectKeys,\n };\n}\n\n/**\n * Hard-cap any string to prevent unbounded growth.\n */\nexport function truncateString(s: string, maxChars: number): string {\n if (s.length <= maxChars) {\n return s;\n }\n\n return s.slice(0, maxChars) + '…[truncated]';\n}\n\nexport type SerializedMapEntry = [keyType: string, key: any, value: any];\n\nexport interface SerializedMap {\n __type: 'Map';\n __map_entries: SerializedMapEntry[];\n __truncated?: string;\n}\n\nfunction formatSerializationError(error: unknown): string {\n return `[${error instanceof Error ? truncateString(error.message, 256) : 'unknown error'}]`;\n}\n\nfunction getMapKeyType(key: unknown): string {\n if (key === null) {\n return 'null';\n }\n if (key instanceof Date) {\n return 'date';\n }\n if (Array.isArray(key)) {\n return 'array';\n }\n if (key instanceof Map) {\n return 'map';\n }\n if (key instanceof Set) {\n return 'set';\n }\n if (key instanceof Error) {\n return 'error';\n }\n\n return typeof key;\n}\n\nfunction restoreSerializedMapKey(keyType: string, key: any): unknown {\n switch (keyType) {\n case 'undefined':\n return undefined;\n case 'null':\n return null;\n case 'bigint':\n return typeof key === 'string' && key.endsWith('n') ? BigInt(key.slice(0, -1)) : key;\n case 'date':\n return typeof key === 'string' ? new Date(key) : key;\n default:\n return key;\n }\n}\n\nexport function isSerializedMap(value: unknown): value is SerializedMap {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as SerializedMap).__type === 'Map' &&\n Array.isArray((value as SerializedMap).__map_entries)\n );\n}\n\nexport function reconstructSerializedMap(value: SerializedMap): Map<unknown, unknown> {\n return new Map(\n value.__map_entries.map(([keyType, key, mapValue]) => [restoreSerializedMapKey(keyType, key), mapValue]),\n );\n}\n\n/**\n * Detect if an object is a JSON Schema.\n * Looks for typical JSON Schema markers like $schema, type with properties, etc.\n */\nfunction isJsonSchema(val: any): boolean {\n if (typeof val !== 'object' || val === null) return false;\n\n // Has explicit $schema property\n if (val.$schema && typeof val.$schema === 'string' && val.$schema.includes('json-schema')) {\n return true;\n }\n\n // Has type: \"object\" with properties (common pattern)\n if (val.type === 'object' && val.properties && typeof val.properties === 'object') {\n return true;\n }\n\n return false;\n}\n\n/**\n * Recursively cleans a value by removing circular references, stripping problematic keys,\n * and enforcing size limits on strings, arrays, and objects.\n *\n * This is used by AI tracing spans to sanitize input/output data before storing.\n *\n * @param value - The value to clean (object, array, primitive, etc.)\n * @param options - Optional configuration for cleaning behavior\n * @returns A cleaned version of the input with size limits enforced\n */\nexport function deepClean(value: any, options: DeepCleanOptions = DEFAULT_DEEP_CLEAN_OPTIONS): any {\n const { keysToStrip, maxDepth, maxStringLength, maxArrayLength, maxObjectKeys } = options;\n\n // Normalize to a Set once so lookups are always O(1).\n // Bundlers can transform `new Set([...])` into a plain object or array,\n // so we accept all three forms and coerce up front.\n const stripSet =\n keysToStrip instanceof Set\n ? keysToStrip\n : new Set(Array.isArray(keysToStrip) ? keysToStrip : Object.keys(keysToStrip));\n\n // Track objects on the current ancestor path to detect true circular\n // references (A → B → A) without false-flagging shared references\n // (A → X, B → X). A shared (non-circular) reference is simply\n // serialized again in each location where it appears.\n const ancestors = new WeakSet<any>();\n\n function helper(val: any, depth: number): any {\n if (depth > maxDepth) {\n return '[MaxDepth]';\n }\n\n // Handle primitives\n if (val === null || val === undefined) {\n return val;\n }\n\n // Handle strings - enforce length limit\n if (typeof val === 'string') {\n return truncateString(val, maxStringLength);\n }\n\n // Handle other non-object primitives explicitly\n if (typeof val === 'number' || typeof val === 'boolean') {\n return val;\n }\n if (typeof val === 'bigint') {\n return `${val}n`;\n }\n if (typeof val === 'function') {\n return '[Function]';\n }\n if (typeof val === 'symbol') {\n return val.description ? `[Symbol(${val.description})]` : '[Symbol]';\n }\n\n // Handle Date objects - preserve as-is\n if (val instanceof Date) {\n return val;\n }\n\n // Handle circular references — only flag when the same object is an\n // ancestor of the current node (true cycle), not merely seen elsewhere.\n if (typeof val === 'object') {\n if (ancestors.has(val)) {\n return '[Circular]';\n }\n ancestors.add(val);\n }\n\n try {\n // Handle Errors specially - preserve name, message, stack, and cause.\n // Done inside the try so the ancestor set is cleaned up in finally,\n // which also means cycles via `cause` are caught.\n if (val instanceof Error) {\n let errorName: unknown;\n let errorMessage: unknown;\n let errorStack: unknown;\n let rawCause: unknown;\n let causeReadFailed = false;\n\n try {\n errorName = val.name;\n } catch (error) {\n errorName = formatSerializationError(error);\n }\n\n try {\n errorMessage = val.message;\n } catch (error) {\n errorMessage = formatSerializationError(error);\n }\n\n try {\n errorStack = val.stack;\n } catch (error) {\n errorStack = formatSerializationError(error);\n }\n\n try {\n rawCause = (val as any).cause;\n } catch (error) {\n causeReadFailed = true;\n rawCause = formatSerializationError(error);\n }\n\n const cleanedError: Record<string, any> = {\n name: typeof errorName === 'string' ? truncateString(errorName, maxStringLength) : errorName,\n message: typeof errorMessage === 'string' ? truncateString(errorMessage, maxStringLength) : errorMessage,\n };\n if (typeof errorStack === 'string') {\n cleanedError.stack = truncateString(errorStack, maxStringLength);\n } else if (errorStack !== undefined) {\n cleanedError.stack = errorStack;\n }\n if (causeReadFailed) {\n cleanedError.cause = rawCause;\n } else if (rawCause !== undefined) {\n try {\n cleanedError.cause = helper(rawCause, depth + 1);\n } catch (error) {\n cleanedError.cause = formatSerializationError(error);\n }\n }\n return cleanedError;\n }\n\n // Handle Map - emit a tagged wrapper so key type/value identity is preserved.\n if (val instanceof Map) {\n const cleanedMap: SerializedMap = { __type: 'Map', __map_entries: [] };\n let mapKeyCount = 0;\n let omittedMapEntries = 0;\n for (const [mapKey, mapVal] of val) {\n if (typeof mapKey === 'string' && stripSet.has(mapKey)) {\n continue;\n }\n\n if (mapKeyCount >= maxObjectKeys) {\n omittedMapEntries++;\n continue;\n }\n\n const mapKeyType = getMapKeyType(mapKey);\n let cleanedMapKey: any;\n let cleanedMapValue: any;\n\n try {\n cleanedMapKey = helper(mapKey, depth + 1);\n } catch (error) {\n cleanedMapKey = formatSerializationError(error);\n }\n\n try {\n cleanedMapValue = helper(mapVal, depth + 1);\n } catch (error) {\n cleanedMapValue = formatSerializationError(error);\n }\n\n cleanedMap.__map_entries.push([mapKeyType, cleanedMapKey, cleanedMapValue]);\n mapKeyCount++;\n }\n if (omittedMapEntries > 0) {\n cleanedMap.__truncated = `${omittedMapEntries} more keys omitted`;\n }\n return cleanedMap;\n }\n\n // Handle Set - convert to an array.\n if (val instanceof Set) {\n const cleanedSet: any[] = [];\n let i = 0;\n const totalSetSize = val.size;\n for (const item of val) {\n if (i >= maxArrayLength) break;\n try {\n cleanedSet.push(helper(item, depth + 1));\n } catch (error) {\n cleanedSet.push(formatSerializationError(error));\n }\n i++;\n }\n if (totalSetSize > maxArrayLength) {\n cleanedSet.push(`[…${totalSetSize - maxArrayLength} more items]`);\n }\n return cleanedSet;\n }\n\n // Handle arrays - enforce length limit\n if (Array.isArray(val)) {\n const cleaned = [];\n\n for (let i = 0; i < Math.min(val.length, maxArrayLength); i++) {\n try {\n cleaned.push(helper(val[i], depth + 1));\n } catch (error) {\n cleaned.push(formatSerializationError(error));\n }\n }\n\n if (val.length > maxArrayLength) {\n cleaned.push(`[…${val.length - maxArrayLength} more items]`);\n }\n return cleaned;\n }\n\n // Handle Buffer and typed arrays - don't serialize large binary data\n if (typeof Buffer !== 'undefined' && Buffer.isBuffer(val)) {\n return `[Buffer length=${val.length}]`;\n }\n\n if (ArrayBuffer.isView(val)) {\n const ctor = (val as any).constructor?.name ?? 'TypedArray';\n const byteLength = (val as any).byteLength ?? '?';\n return `[${ctor} byteLength=${byteLength}]`;\n }\n\n if (val instanceof ArrayBuffer) {\n return `[ArrayBuffer byteLength=${val.byteLength}]`;\n }\n\n // Handle objects with serializeForSpan() method - use their custom trace serialization\n let serializeForSpan;\n try {\n serializeForSpan = val.serializeForSpan;\n } catch (error) {\n return `[serializeForSpan failed: ${error instanceof Error ? truncateString(error.message, 256) : 'unknown error'}]`;\n }\n\n if (typeof serializeForSpan === 'function') {\n try {\n return helper(serializeForSpan.call(val), depth);\n } catch (error) {\n return `[serializeForSpan failed: ${error instanceof Error ? truncateString(error.message, 256) : 'unknown error'}]`;\n }\n }\n\n // Handle JSON Schema objects - return as-is to preserve raw schemas for debugging.\n // JSON schemas are plain serializable objects (no circular refs, functions, etc.)\n // so we skip recursive traversal for performance.\n let looksLikeJsonSchema = false;\n try {\n looksLikeJsonSchema = isJsonSchema(val);\n } catch {\n looksLikeJsonSchema = false;\n }\n\n if (looksLikeJsonSchema) {\n return val;\n }\n\n // Handle objects - enforce key limit\n const cleaned: Record<string, any> = {};\n const keys = Object.keys(val).filter(key => !stripSet.has(key));\n let keyCount = 0;\n\n for (const key of keys) {\n if (keyCount >= maxObjectKeys) {\n cleaned['__truncated'] = `${keys.length - keyCount} more keys omitted`;\n break;\n }\n\n try {\n cleaned[key] = helper((val as Record<string, unknown>)[key], depth + 1);\n keyCount++;\n } catch (error) {\n cleaned[key] = formatSerializationError(error);\n keyCount++;\n }\n }\n\n return cleaned;\n } finally {\n // Remove from ancestor set when leaving this node so parallel\n // branches can serialize the same shared reference independently.\n if (typeof val === 'object' && val !== null) {\n ancestors.delete(val);\n }\n }\n }\n\n return helper(value, 0);\n}\n","/**\n * ObservabilityBus - Unified event bus for all observability signals.\n *\n * Routes events to registered exporters and an optional bridge based on event\n * type. Each handler declares which signals it supports by implementing the\n * corresponding method (onTracingEvent, onLogEvent, onMetricEvent,\n * onScoreEvent, onFeedbackEvent).\n *\n * Handler presence = signal support. If a handler does not implement a method,\n * events of that type are silently skipped for that handler.\n */\n\nimport type {\n ObservabilityExporter,\n ObservabilityBridge,\n ObservabilityEvent,\n ObservabilityDropEvent,\n SerializationOptions,\n} from '@mastra/core/observability';\n\nimport type { DeepCleanOptions } from '../spans/serialization';\nimport { deepClean, mergeSerializationOptions } from '../spans/serialization';\nimport { BaseObservabilityEventBus } from './base';\nimport { routeDropToHandler, routeToHandler } from './route-event';\n\n/**\n * Apply deepClean() to non-tracing observability events. Tracing events are\n * already deep-cleaned at span construction time (see spans/base.ts and\n * spans/default.ts), so they pass through unchanged.\n *\n * For log/metric/score/feedback we clean the entire exported payload object\n * (not just the freeform sub-fields) so every user-supplied field — top-level\n * strings like `message`/`reason`/`comment`, arrays like `tags`, nested\n * `metadata`/`data`/`costMetadata`, and any future fields — is bounded,\n * stripped of circular refs/functions/symbols, and safe for JSON.stringify\n * before exporters or bridges see it.\n *\n * Identity scalars (timestamps, numeric score/value, IDs) are passed through\n * by deepClean unchanged, so the cleaned object is structurally identical to\n * the input for well-formed events.\n */\nfunction cleanEvent(event: ObservabilityEvent, options: DeepCleanOptions): ObservabilityEvent {\n switch (event.type) {\n case 'log':\n return { type: 'log', log: deepClean(event.log, options) };\n case 'metric':\n return { type: 'metric', metric: deepClean(event.metric, options) };\n case 'score':\n return { type: 'score', score: deepClean(event.score, options) };\n case 'feedback':\n return { type: 'feedback', feedback: deepClean(event.feedback, options) };\n default:\n // Tracing events are already cleaned at span construction.\n return event;\n }\n}\n\n/** Max flush drain iterations before bailing — prevents infinite loops when handlers re-emit. */\nconst MAX_FLUSH_ITERATIONS = 3;\n\n/**\n * Unified event bus for all observability signals (tracing, logs, metrics, scores, feedback).\n * Routes events to registered exporters and an optional bridge.\n */\nexport class ObservabilityBus extends BaseObservabilityEventBus<ObservabilityEvent> {\n private exporters: ObservabilityExporter[] = [];\n private bridge?: ObservabilityBridge;\n\n /** In-flight handler promises from routeToHandler. Self-cleaning via .finally(). */\n private pendingHandlers: Set<Promise<void>> = new Set();\n\n private handlerBufferFlushDepth = 0;\n private dropEventsEmittedDuringHandlerFlush = 0;\n\n /** Resolved deepClean options applied to non-tracing events before fan-out. */\n private deepCleanOptions: DeepCleanOptions;\n\n constructor(opts?: { serializationOptions?: SerializationOptions }) {\n super({ name: 'ObservabilityBus' });\n this.deepCleanOptions = mergeSerializationOptions(opts?.serializationOptions);\n }\n\n /**\n * Register an exporter to receive routed events.\n * Duplicate registrations (same instance) are silently ignored.\n *\n * @param exporter - The exporter to register.\n */\n registerExporter(exporter: ObservabilityExporter): void {\n if (this.exporters.includes(exporter)) {\n return;\n }\n this.exporters.push(exporter);\n }\n\n /**\n * Unregister an exporter.\n *\n * @param exporter - The exporter instance to remove.\n * @returns `true` if the exporter was found and removed, `false` otherwise.\n */\n unregisterExporter(exporter: ObservabilityExporter): boolean {\n const index = this.exporters.indexOf(exporter);\n if (index !== -1) {\n this.exporters.splice(index, 1);\n return true;\n }\n return false;\n }\n\n /**\n * Get registered exporters (read-only snapshot).\n */\n getExporters(): readonly ObservabilityExporter[] {\n return [...this.exporters];\n }\n\n /**\n * Register a bridge to receive all routed events alongside exporters.\n * Only one bridge can be registered at a time; replacing an existing bridge\n * logs a warning.\n *\n * @param bridge - The bridge to register.\n */\n registerBridge(bridge: ObservabilityBridge): void {\n if (this.bridge) {\n this.logger.warn(`[ObservabilityBus] Replacing existing bridge with new bridge`);\n }\n this.bridge = bridge;\n }\n\n /**\n * Unregister the bridge.\n *\n * @returns `true` if a bridge was registered and removed, `false` otherwise.\n */\n unregisterBridge(): boolean {\n if (this.bridge) {\n this.bridge = undefined;\n return true;\n }\n return false;\n }\n\n /**\n * Get the registered bridge, if any.\n */\n getBridge(): ObservabilityBridge | undefined {\n return this.bridge;\n }\n\n /**\n * Emit an event: route to exporter/bridge handlers, then forward to base\n * class for subscriber delivery.\n *\n * emit() is synchronous — async handler promises are tracked internally\n * and can be drained via flush().\n */\n emit(event: ObservabilityEvent): void {\n // Sanitize free-form payload fields on non-tracing signals before\n // fanning out. Tracing events are already deep-cleaned at span\n // construction, so cleanEvent() returns them unchanged.\n const cleaned = cleanEvent(event, this.deepCleanOptions);\n\n // Route to appropriate handler on each registered exporter\n for (const exporter of this.exporters) {\n this.trackPromise(routeToHandler(exporter, cleaned, this.logger));\n }\n\n // Route to bridge (same routing logic as exporters)\n if (this.bridge) {\n this.trackPromise(routeToHandler(this.bridge, cleaned, this.logger));\n }\n\n // Deliver to subscribers (base class tracks its own pending promises)\n super.emit(cleaned);\n }\n\n /**\n * Emit exporter pipeline drop events to exporters and the bridge.\n *\n * Drop events describe exporter health, not user observability data, so they\n * are intentionally not delivered to generic event-bus subscribers.\n */\n emitDropEvent(event: ObservabilityDropEvent): void {\n if (this.handlerBufferFlushDepth > 0) {\n this.dropEventsEmittedDuringHandlerFlush++;\n }\n\n for (const exporter of this.exporters) {\n this.trackPromise(routeDropToHandler(exporter, event, this.logger));\n }\n\n if (this.bridge) {\n this.trackPromise(routeDropToHandler(this.bridge, event, this.logger));\n }\n }\n\n /**\n * Track an async handler promise so flush() can await it.\n * No-ops for sync (void) results.\n */\n private trackPromise(result: void | Promise<void>): void {\n if (result && typeof (result as Promise<void>).then === 'function') {\n const promise = result as Promise<void>;\n this.pendingHandlers.add(promise);\n void promise.finally(() => this.pendingHandlers.delete(promise));\n }\n }\n\n /** Await in-flight routed handler promises, draining until empty. */\n private async drainPendingHandlers(): Promise<void> {\n let iterations = 0;\n while (this.pendingHandlers.size > 0) {\n await Promise.allSettled([...this.pendingHandlers]);\n iterations++;\n if (iterations >= MAX_FLUSH_ITERATIONS) {\n this.logger.error(\n `[ObservabilityBus] flush() exceeded ${MAX_FLUSH_ITERATIONS} drain iterations — ` +\n `${this.pendingHandlers.size} promises still pending. Handlers may be re-emitting during flush.`,\n );\n // Final settlement pass: ensure every remaining promise has settled\n // before moving on, even if new promises keep appearing.\n if (this.pendingHandlers.size > 0) {\n await Promise.allSettled([...this.pendingHandlers]);\n }\n break;\n }\n }\n }\n\n /** Drain exporter and bridge SDK-internal buffers. */\n private async flushHandlerBuffers(): Promise<boolean> {\n const initialDropCount = this.dropEventsEmittedDuringHandlerFlush;\n this.handlerBufferFlushDepth++;\n try {\n const bufferFlushPromises: Promise<void>[] = this.exporters.map(e => e.flush());\n if (this.bridge) {\n bufferFlushPromises.push(this.bridge.flush());\n }\n if (bufferFlushPromises.length > 0) {\n await Promise.allSettled(bufferFlushPromises);\n }\n return this.dropEventsEmittedDuringHandlerFlush > initialDropCount;\n } finally {\n this.handlerBufferFlushDepth--;\n }\n }\n\n /**\n * Multi-phase flush to ensure all observability data is fully exported.\n *\n * **Phase 1 — Delivery:** Await all in-flight handler promises (exporters,\n * bridge, and base-class subscribers). After this resolves, all event data\n * has been delivered to handler methods.\n *\n * **Phase 2 — Buffer drain:** Call flush() on each exporter and bridge to\n * drain their SDK-internal buffers (e.g., OTEL BatchSpanProcessor, Langfuse\n * client queue). Phases are sequential — buffer drains must not start until\n * delivery completes, otherwise exporters would flush empty buffers.\n *\n * Exporter flushes can emit drop events. When that happens, flush loops\n * through delivery and buffer drain again so alerting integrations that buffer\n * drop notifications are drained before returning.\n */\n async flush(): Promise<void> {\n // Phase 1: Await in-flight handler delivery promises, draining until empty.\n await this.drainPendingHandlers();\n await super.flush();\n\n for (let iterations = 0; iterations < MAX_FLUSH_ITERATIONS; iterations++) {\n const emittedDropEvents = await this.flushHandlerBuffers();\n if (!emittedDropEvents && this.pendingHandlers.size === 0) {\n return;\n }\n\n await this.drainPendingHandlers();\n await super.flush();\n }\n\n this.logger.error(\n `[ObservabilityBus] flush() exceeded ${MAX_FLUSH_ITERATIONS} buffer drain iterations. ` +\n `Handlers may be emitting drop events during every flush.`,\n );\n }\n\n /** Flush all pending events and exporter buffers, then clear subscribers. */\n async shutdown(): Promise<void> {\n await this.flush();\n await super.shutdown();\n }\n}\n","/**\n * Configuration types for Mastra Observability\n *\n * These types define the configuration structure for observability,\n * including tracing configs, sampling strategies, and registry setup.\n */\n\nimport type { RequestContext } from '@mastra/core/di';\nimport type {\n ObservabilityInstance,\n ObservabilityExporter,\n ObservabilityBridge,\n SpanOutputProcessor,\n ConfigSelector,\n SerializationOptions,\n CardinalityConfig,\n LogLevel,\n AnyExportedSpan,\n} from '@mastra/core/observability';\nimport { SpanType } from '@mastra/core/observability';\nimport { z } from 'zod/v4';\nimport type { SensitiveDataFilterOptions } from './span_processors';\n\n// ============================================================================\n// Sampling Strategy Types\n// ============================================================================\n\n/**\n * Sampling strategy types\n */\nexport enum SamplingStrategyType {\n ALWAYS = 'always',\n NEVER = 'never',\n RATIO = 'ratio',\n CUSTOM = 'custom',\n}\n\nconst functionSchema = z.custom<(...args: any[]) => unknown>(value => typeof value === 'function', {\n message: 'Expected function',\n});\n\n/**\n * Options passed when using a custom sampler strategy\n */\nexport interface CustomSamplerOptions {\n requestContext?: RequestContext;\n metadata?: Record<string, any>;\n}\n\n/**\n * Sampling strategy configuration\n */\nexport type SamplingStrategy =\n | { type: SamplingStrategyType.ALWAYS }\n | { type: SamplingStrategyType.NEVER }\n | { type: SamplingStrategyType.RATIO; probability: number }\n | { type: SamplingStrategyType.CUSTOM; sampler: (options?: CustomSamplerOptions) => boolean };\n\n// ============================================================================\n// Observability Configuration Types\n// ============================================================================\n\n/**\n * Configuration for a single observability instance\n */\nexport interface ObservabilityInstanceConfig {\n /** Unique identifier for this config in the tracing registry */\n name: string;\n /** Service name for tracing */\n serviceName: string;\n /** Sampling strategy - controls whether tracing is collected (defaults to ALWAYS) */\n sampling?: SamplingStrategy;\n /** Custom exporters */\n exporters?: ObservabilityExporter[];\n /** Observability bridge (e.g., OpenTelemetry bridge for context extraction) */\n bridge?: ObservabilityBridge;\n /** Custom span output processors */\n spanOutputProcessors?: SpanOutputProcessor[];\n /** Set to `true` if you want to see spans internal to the operation of mastra */\n includeInternalSpans?: boolean;\n /**\n * Span types to exclude from export. Spans of these types are silently dropped\n * before reaching exporters. This is useful for reducing noise and costs in\n * observability platforms that charge per-span (e.g., Langfuse).\n *\n * @example\n * ```typescript\n * excludeSpanTypes: [SpanType.MODEL_CHUNK, SpanType.MODEL_STEP]\n * ```\n */\n excludeSpanTypes?: SpanType[];\n /**\n * Filter function to control which spans are exported. Return `true` to keep\n * the span, `false` to drop it. This runs after `excludeSpanTypes` and\n * `spanOutputProcessors`, giving you access to the final exported span data\n * for fine-grained filtering by type, attributes, entity, metadata, or any\n * combination.\n *\n * @example\n * ```typescript\n * spanFilter: (span) => {\n * // Drop all model chunks\n * if (span.type === SpanType.MODEL_CHUNK) return false;\n * // Only keep tool calls that failed\n * if (span.type === SpanType.TOOL_CALL && span.attributes?.success) return false;\n * return true;\n * }\n * ```\n */\n spanFilter?: (span: AnyExportedSpan) => boolean;\n /**\n * RequestContext keys to automatically extract as metadata for all spans\n * created with this tracing configuration.\n * Supports dot notation for nested values.\n */\n requestContextKeys?: string[];\n /**\n * Options for controlling serialization of span data (input/output/attributes).\n * Use these to customize truncation limits for large payloads.\n */\n serializationOptions?: SerializationOptions;\n /**\n * Cardinality protection settings for metrics.\n * Controls which labels are blocked and whether UUID-like values are filtered.\n * Applied to all metrics (auto-extracted and user-defined).\n */\n cardinality?: CardinalityConfig;\n /**\n * Configuration for the observability logger (loggerVNext).\n * Controls log level filtering and whether dual-write logging is enabled.\n */\n logging?: {\n /** Set to `false` to disable dual-write logging to observability storage. Defaults to `true`. */\n enabled?: boolean;\n /** Minimum log level to write to observability storage. Defaults to `'warn'`. */\n level?: LogLevel;\n };\n}\n\n/**\n * Complete Observability registry configuration\n */\nexport interface ObservabilityRegistryConfig {\n /**\n * Enables default exporters, with sampling: always, and sensitive data filtering\n * @deprecated Use explicit `configs` with MastraStorageExporter, MastraPlatformExporter, and SensitiveDataFilter instead.\n * This option will be removed in a future version.\n */\n default?: {\n enabled?: boolean;\n };\n /** Map of tracing instance names to their configurations or pre-instantiated instances */\n configs?: Record<string, Omit<ObservabilityInstanceConfig, 'name'> | ObservabilityInstance>;\n /** Optional selector function to choose which tracing instance to use */\n configSelector?: ConfigSelector;\n /**\n * Controls whether a `SensitiveDataFilter` span output processor is automatically\n * applied to every configured observability instance. This protects against\n * accidentally exporting secrets (API keys, tokens, passwords, etc.) to\n * exporters such as the Mastra cloud exporter.\n *\n * - `true` (default): apply `SensitiveDataFilter` with default options.\n * - `false`: do not auto-apply the filter. You can still add it manually via\n * `spanOutputProcessors` on a specific config.\n * - an object: apply `SensitiveDataFilter` with the provided options.\n *\n * If a config already includes a `SensitiveDataFilter` in\n * `spanOutputProcessors`, the auto-applied filter is skipped to avoid\n * double redaction. The auto-applied filter runs last (after any\n * user-provided processors) so that sensitive data introduced or\n * surfaced by upstream processors is still redacted before export.\n * Pre-instantiated `ObservabilityInstance` values are not modified.\n */\n sensitiveDataFilter?: boolean | SensitiveDataFilterOptions;\n}\n\n// ============================================================================\n// Zod Schemas for Validation\n// ============================================================================\n\n/**\n * Zod schema for SamplingStrategy\n */\nexport const samplingStrategySchema = z.discriminatedUnion('type', [\n z.object({\n type: z.literal(SamplingStrategyType.ALWAYS),\n }),\n z.object({\n type: z.literal(SamplingStrategyType.NEVER),\n }),\n z.object({\n type: z.literal(SamplingStrategyType.RATIO),\n probability: z.number().min(0, 'Probability must be between 0 and 1').max(1, 'Probability must be between 0 and 1'),\n }),\n z.object({\n type: z.literal(SamplingStrategyType.CUSTOM),\n sampler: functionSchema,\n }),\n]);\n\n/**\n * Zod schema for SerializationOptions\n */\nexport const serializationOptionsSchema = z\n .object({\n maxStringLength: z.number().int().positive().optional(),\n maxDepth: z.number().int().positive().optional(),\n maxArrayLength: z.number().int().positive().optional(),\n maxObjectKeys: z.number().int().positive().optional(),\n })\n .optional();\n\nconst LOG_LEVELS = ['debug', 'info', 'warn', 'error', 'fatal'] as const;\n\nconst cardinalityConfigSchema = z\n .object({\n blockedLabels: z.array(z.string()).optional(),\n blockUUIDs: z.boolean().optional(),\n })\n .optional();\n\nconst loggingConfigSchema = z\n .object({\n enabled: z.boolean().optional(),\n level: z.enum(LOG_LEVELS).optional(),\n })\n .optional();\n\nconst spanFilterSchema = functionSchema.optional();\n\nconst observabilityInstanceConfigFields = {\n serviceName: z.string().min(1, 'Service name is required'),\n sampling: samplingStrategySchema.optional(),\n exporters: z.array(z.any()).optional(),\n bridge: z.any().optional(),\n spanOutputProcessors: z.array(z.any()).optional(),\n includeInternalSpans: z.boolean().optional(),\n excludeSpanTypes: z.array(z.nativeEnum(SpanType)).optional(),\n spanFilter: spanFilterSchema,\n requestContextKeys: z.array(z.string()).optional(),\n serializationOptions: serializationOptionsSchema,\n cardinality: cardinalityConfigSchema,\n logging: loggingConfigSchema,\n};\n\n/**\n * Zod schema for ObservabilityInstanceConfig\n * Note: exporters, spanOutputProcessors, bridge, and configSelector are validated as any\n * since they're complex runtime objects\n */\nexport const observabilityInstanceConfigSchema = z\n .object({\n name: z.string().min(1, 'Name is required'),\n ...observabilityInstanceConfigFields,\n })\n .refine(\n data => {\n // At least one exporter or a bridge must be provided\n const hasExporters = data.exporters && data.exporters.length > 0;\n const hasBridge = !!data.bridge;\n return hasExporters || hasBridge;\n },\n {\n message: 'At least one exporter or a bridge is required',\n },\n );\n\n/**\n * Zod schema for config values in the configs map\n * This is the config object without the name field\n */\nexport const observabilityConfigValueSchema = z.object(observabilityInstanceConfigFields).refine(\n data => {\n // At least one exporter or a bridge must be provided\n const hasExporters = data.exporters && data.exporters.length > 0;\n const hasBridge = !!data.bridge;\n return hasExporters || hasBridge;\n },\n {\n message: 'At least one exporter or a bridge is required',\n },\n);\n\n/**\n * Zod schema for ObservabilityRegistryConfig\n * Note: Individual configs are validated separately in the constructor to allow for\n * both plain config objects and pre-instantiated ObservabilityInstance objects.\n * The schema is permissive to handle edge cases gracefully (arrays, null values).\n */\nconst sensitiveDataFilterOptionsSchema = z\n .object({\n sensitiveFields: z.array(z.string()).optional(),\n redactionToken: z.string().optional(),\n redactionStyle: z.enum(['full', 'partial']).optional(),\n })\n .strict();\n\nexport const observabilityRegistryConfigSchema = z\n .object({\n default: z\n .object({\n enabled: z.boolean().optional(),\n })\n .optional()\n .nullable(),\n configs: z.union([z.record(z.string(), z.any()), z.array(z.any()), z.null()]).optional(),\n configSelector: functionSchema.optional(),\n sensitiveDataFilter: z.union([z.boolean(), sensitiveDataFilterOptionsSchema]).optional(),\n })\n .passthrough() // Allow additional properties\n .refine(\n data => {\n // Validate that default (when enabled) and configs are mutually exclusive\n const isDefaultEnabled = data.default?.enabled === true;\n // Check if configs has any entries (only if it's actually an object)\n const hasConfigs =\n data.configs && typeof data.configs === 'object' && !Array.isArray(data.configs)\n ? Object.keys(data.configs).length > 0\n : false;\n\n // Cannot have both default enabled and any configs\n return !(isDefaultEnabled && hasConfigs);\n },\n {\n message:\n 'Cannot specify both \"default\" (when enabled) and \"configs\". Use either default observability or custom configs, but not both.',\n },\n )\n .refine(\n data => {\n // Validate that configSelector is required when there are multiple configs\n const configCount =\n data.configs && typeof data.configs === 'object' && !Array.isArray(data.configs)\n ? Object.keys(data.configs).length\n : 0;\n\n // If there are 2 or more configs, configSelector must be provided\n if (configCount > 1 && !data.configSelector) {\n return false;\n }\n\n return true;\n },\n {\n message:\n 'A \"configSelector\" function is required when multiple configs are specified to determine which config to use.',\n },\n )\n .refine(\n data => {\n // Validate that if configSelector is provided, there must be configs or default\n if (data.configSelector) {\n const isDefaultEnabled = data.default?.enabled === true;\n const hasConfigs =\n data.configs && typeof data.configs === 'object' && !Array.isArray(data.configs)\n ? Object.keys(data.configs).length > 0\n : false;\n\n // If configSelector is provided, must have either default enabled or configs\n return isDefaultEnabled || hasConfigs;\n }\n\n return true;\n },\n {\n message: 'A \"configSelector\" requires at least one config or default observability to be configured.',\n },\n );\n","/**\n * LoggerContextImpl - Structured logging with automatic trace correlation.\n *\n * Emits LogEvent to the ObservabilityBus. All context (correlationContext,\n * metadata) is snapshotted at construction time.\n */\n\nimport { generateSignalId } from '@mastra/core/observability';\nimport type { LogLevel, LoggerContext, ExportedLog, LogEvent, CorrelationContext } from '@mastra/core/observability';\n\nimport type { ObservabilityBus } from '../bus';\n\nexport interface LoggerContextConfig {\n /** Top-level trace identity for emitted log events */\n traceId?: string;\n\n /** Top-level span identity for emitted log events */\n spanId?: string;\n\n /** Canonical correlation context for log correlation */\n correlationContext?: CorrelationContext;\n\n /** Metadata (entity context, runId, environment, serviceName, etc.) */\n metadata?: Record<string, unknown>;\n\n /** Bus for event emission */\n observabilityBus: ObservabilityBus;\n\n /** Minimum log level (logs below this are discarded) */\n minLevel?: LogLevel;\n}\n\n/** Numeric priority used to compare log levels against the configured minimum. */\nconst LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n fatal: 4,\n};\n\nexport class LoggerContextImpl implements LoggerContext {\n private config: LoggerContextConfig;\n\n /**\n * Create a logger context. Context and metadata are defensively copied so\n * mutations after construction do not affect emitted logs.\n */\n constructor(config: LoggerContextConfig) {\n const correlationContext = config.correlationContext ? { ...config.correlationContext } : undefined;\n\n this.config = {\n ...config,\n traceId: config.traceId ?? correlationContext?.traceId,\n spanId: config.spanId ?? correlationContext?.spanId,\n correlationContext,\n metadata: config.metadata ? structuredClone(config.metadata) : undefined,\n };\n }\n\n /** Log at DEBUG level. */\n debug(message: string, data?: Record<string, unknown>): void {\n this.log('debug', message, data);\n }\n\n /** Log at INFO level. */\n info(message: string, data?: Record<string, unknown>): void {\n this.log('info', message, data);\n }\n\n /** Log at WARN level. */\n warn(message: string, data?: Record<string, unknown>): void {\n this.log('warn', message, data);\n }\n\n /** Log at ERROR level. */\n error(message: string, data?: Record<string, unknown>): void {\n this.log('error', message, data);\n }\n\n /** Log at FATAL level. */\n fatal(message: string, data?: Record<string, unknown>): void {\n this.log('fatal', message, data);\n }\n\n /**\n * Build an ExportedLog, check against the minimum level, and emit it through the bus.\n */\n private log(level: LogLevel, message: string, data?: Record<string, unknown>): void {\n const minLevel = this.config.minLevel ?? 'warn';\n if (LOG_LEVEL_PRIORITY[level] < LOG_LEVEL_PRIORITY[minLevel]) {\n return;\n }\n\n const exportedLog: ExportedLog = {\n logId: generateSignalId(),\n timestamp: new Date(),\n level,\n message,\n data,\n traceId: this.config.traceId,\n spanId: this.config.spanId,\n correlationContext: this.config.correlationContext,\n metadata: this.config.metadata,\n };\n\n const event: LogEvent = { type: 'log', log: exportedLog };\n this.config.observabilityBus.emit(event);\n }\n}\n","/**\n * MetricsContextImpl - User-facing metric emission API.\n *\n * All metrics are validated, cardinality-filtered, and constructed here\n * before being routed through ObservabilityBus.emit().\n * CorrelationContext and metadata are snapshotted at construction time.\n */\n\nimport { generateSignalId } from '@mastra/core/observability';\nimport type {\n MetricsContext,\n Counter,\n Gauge,\n Histogram,\n CorrelationContext,\n CostContext,\n ExportedMetric,\n MetricEvent,\n MetricEmitOptions,\n} from '@mastra/core/observability';\n\nimport type { ObservabilityBus } from '../bus';\nimport type { CardinalityFilter } from '../metrics/cardinality';\n\n/** Configuration for creating a MetricsContextImpl. */\nexport interface MetricsContextConfig {\n /** Top-level trace identity for emitted metric events */\n traceId?: string;\n\n /** Top-level span identity for emitted metric events */\n spanId?: string;\n\n /** Canonical correlation context derived from the current span */\n correlationContext?: CorrelationContext;\n\n /** Non-canonical metadata to attach to emitted metric events */\n metadata?: Record<string, unknown>;\n\n /** Cardinality filter applied to emitted metric labels */\n cardinalityFilter: CardinalityFilter;\n\n /** Bus for event emission */\n observabilityBus: ObservabilityBus;\n}\n\n/**\n * User-facing metric emission API. All metrics are routed through\n * ObservabilityBus.emit() after validation and cardinality filtering.\n */\nexport class MetricsContextImpl implements MetricsContext {\n private traceId?: string;\n private spanId?: string;\n private correlationContext?: CorrelationContext;\n private metadata?: Record<string, unknown>;\n private cardinalityFilter: CardinalityFilter;\n private observabilityBus: ObservabilityBus;\n\n /**\n * Create a metrics context. Correlation context and metadata are defensively\n * copied so mutations after construction do not affect emitted metrics.\n */\n constructor(config: MetricsContextConfig) {\n this.correlationContext = config.correlationContext ? { ...config.correlationContext } : undefined;\n this.traceId = config.traceId ?? this.correlationContext?.traceId;\n this.spanId = config.spanId ?? this.correlationContext?.spanId;\n this.metadata = config.metadata ? structuredClone(config.metadata) : undefined;\n this.cardinalityFilter = config.cardinalityFilter;\n this.observabilityBus = config.observabilityBus;\n }\n\n /** Emit a metric observation. */\n emit(name: string, value: number, labels?: Record<string, string>, options?: MetricEmitOptions): void {\n if (!Number.isFinite(value) || value < 0) {\n return;\n }\n\n const filteredLabels = labels ? this.cardinalityFilter.filterLabels(labels) : {};\n const costContext = options?.costContext ? cloneCostContext(options.costContext) : undefined;\n\n const exportedMetric: ExportedMetric = {\n metricId: generateSignalId(),\n timestamp: new Date(),\n traceId: this.traceId,\n spanId: this.spanId,\n name,\n value,\n labels: filteredLabels,\n correlationContext: this.correlationContext,\n costContext,\n metadata: this.metadata,\n };\n\n const event: MetricEvent = { type: 'metric', metric: exportedMetric };\n this.observabilityBus.emit(event);\n }\n\n /** @deprecated Use `emit()` instead. */\n counter(name: string): Counter {\n return {\n add: (value: number, additionalLabels?: Record<string, string>) => {\n this.emit(name, value, additionalLabels);\n },\n };\n }\n\n /** @deprecated Use `emit()` instead. */\n gauge(name: string): Gauge {\n return {\n set: (value: number, additionalLabels?: Record<string, string>) => {\n this.emit(name, value, additionalLabels);\n },\n };\n }\n\n /** @deprecated Use `emit()` instead. */\n histogram(name: string): Histogram {\n return {\n record: (value: number, additionalLabels?: Record<string, string>) => {\n this.emit(name, value, additionalLabels);\n },\n };\n }\n}\n\nfunction cloneCostContext(costContext: CostContext): CostContext {\n return {\n provider: costContext.provider,\n model: costContext.model,\n estimatedCost: costContext.estimatedCost,\n costUnit: costContext.costUnit,\n costMetadata: costContext.costMetadata ? structuredClone(costContext.costMetadata) : undefined,\n };\n}\n","import type { UsageStats } from '@mastra/core/observability';\nimport type { PricingMeter, PricingConditionOperator, PricingConditionField } from './types';\n\nexport class PricingTier {\n readonly index: number;\n readonly when?: Array<{ field: PricingConditionField; op: PricingConditionOperator; value: number }>;\n readonly rates: Partial<Record<PricingMeter, number>>;\n\n constructor(args: {\n index: number;\n when?: Array<{ field: PricingConditionField; op: PricingConditionOperator; value: number }>;\n rates: Partial<Record<PricingMeter, number>>;\n }) {\n this.index = args.index;\n this.when = args.when;\n this.rates = args.rates;\n }\n\n matchesUsage(usage: UsageStats): boolean {\n if (!this.when || this.when.length === 0) {\n return true;\n }\n\n return this.when.every(condition => this.matchesCondition(condition, usage));\n }\n\n hasMatchingMeterForUsage(meter: PricingMeter): boolean {\n return Boolean(meter && typeof this.rates[meter] === 'number');\n }\n\n private matchesCondition(\n condition: { field: PricingConditionField; op: PricingConditionOperator; value: number },\n usage: UsageStats,\n ): boolean {\n const left = this.getConditionFieldValue(condition.field, usage);\n if (left == null) {\n return false;\n }\n\n switch (condition.op) {\n case 'gt':\n return left > condition.value;\n case 'gte':\n return left >= condition.value;\n case 'lt':\n return left < condition.value;\n case 'lte':\n return left <= condition.value;\n case 'eq':\n return left === condition.value;\n case 'neq':\n return left !== condition.value;\n default:\n return false;\n }\n }\n\n private getConditionFieldValue(field: PricingConditionField, usage: UsageStats): number | null {\n switch (field) {\n case 'total_input_tokens':\n return typeof usage.inputTokens === 'number' ? usage.inputTokens : null;\n default:\n return null;\n }\n }\n}\n\nexport class PricingModel {\n readonly id: string;\n readonly provider: string;\n readonly model: string;\n readonly schema: string;\n readonly currency: string;\n readonly tiers: PricingTier[];\n\n constructor(args: {\n id: string;\n provider: string;\n model: string;\n schema: string;\n currency: string;\n tiers: PricingTier[];\n }) {\n this.id = args.id;\n this.provider = args.provider;\n this.model = args.model;\n this.schema = args.schema;\n this.currency = args.currency;\n this.tiers = args.tiers;\n }\n\n getPricingTierForUsage(usage: UsageStats): PricingTier | null {\n for (const tier of this.tiers) {\n if (tier.when && tier.when.length > 0 && tier.matchesUsage(usage)) {\n return tier;\n }\n }\n\n return this.getBasePricingTier();\n }\n\n getBasePricingTier(): PricingTier | null {\n return this.tiers[0] ?? null;\n }\n}\n","import fs from 'node:fs';\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\nimport { PricingModel, PricingTier } from './pricing-model';\nimport type { PricingMeter, PricingConditionOperator, PricingConditionField } from './types';\n\nconst DATA_FILE_NAME = 'pricing-data.jsonl';\n\ntype MinifiedMeterKey = 'it' | 'ot' | 'icrt' | 'icwt' | 'iat' | 'oat' | 'ort';\ntype MinifiedConditionFieldKey = 'tit';\n\ninterface MinifiedCondition {\n f: MinifiedConditionFieldKey;\n op: PricingConditionOperator;\n value: number;\n}\n\ninterface MinifiedTier {\n w?: MinifiedCondition[];\n r: Partial<Record<MinifiedMeterKey, { c: number }>>;\n}\n\ninterface MinifiedPricingModelRow {\n i: string;\n p: string;\n m: string;\n s: {\n v: string;\n d: {\n u: string;\n t: MinifiedTier[];\n };\n };\n}\n\nconst MINIFIED_METER_TO_CANONICAL: Record<MinifiedMeterKey, PricingMeter> = {\n it: 'input_tokens',\n ot: 'output_tokens',\n icrt: 'input_cache_read_tokens',\n icwt: 'input_cache_write_tokens',\n iat: 'input_audio_tokens',\n oat: 'output_audio_tokens',\n ort: 'output_reasoning_tokens',\n};\n\nconst MINIFIED_CONDITION_FIELD_TO_CANONICAL: Record<MinifiedConditionFieldKey, PricingConditionField> = {\n tit: 'total_input_tokens',\n};\n\nlet cachedLoadError: string | null = null;\n\nexport class PricingRegistry {\n private static globalRegistry: PricingRegistry | null = null;\n\n constructor(private readonly pricingModels: Map<string, PricingModel>) {}\n\n static fromText(pricingModelText: string): PricingRegistry {\n return new PricingRegistry(parsePricingModelText(pricingModelText));\n }\n\n static getGlobal(): PricingRegistry | null {\n if (PricingRegistry.globalRegistry) {\n return PricingRegistry.globalRegistry;\n }\n\n const pricingModels = loadPricingModels();\n if (!pricingModels) {\n return null;\n }\n\n PricingRegistry.globalRegistry = new PricingRegistry(pricingModels);\n return PricingRegistry.globalRegistry;\n }\n\n get(args: { provider: string; model: string }): PricingModel | null {\n // Try all model name variants in order of preference\n const variants = getModelVariants(args.model);\n for (const variant of variants) {\n const key = makePricingKey({ provider: args.provider, model: variant });\n const match = this.pricingModels.get(key);\n if (match) return match;\n }\n return null;\n }\n}\n\nfunction loadPricingModels(): Map<string, PricingModel> | null {\n if (cachedLoadError) {\n return null;\n }\n\n try {\n const content = fs.readFileSync(resolvePricingModelPath(), 'utf-8');\n return parsePricingModelText(content);\n } catch (error) {\n cachedLoadError = error instanceof Error ? error.message : String(error);\n return null;\n }\n}\n\nfunction parsePricingModelText(content: string): Map<string, PricingModel> {\n const pricingModels = new Map<string, PricingModel>();\n\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed) {\n continue;\n }\n\n const parsed = JSON.parse(trimmed) as MinifiedPricingModelRow;\n const pricingModel = expandPricingModelRow(parsed);\n pricingModels.set(makePricingKey(pricingModel), pricingModel);\n }\n\n return pricingModels;\n}\n\nfunction expandPricingModelRow(row: MinifiedPricingModelRow): PricingModel {\n return new PricingModel({\n id: row.i,\n provider: row.p,\n model: row.m,\n schema: row.s.v,\n currency: row.s.d.u,\n tiers: row.s.d.t.map(\n (tier, index) =>\n new PricingTier({\n index,\n when: tier.w?.map(condition => ({\n field: MINIFIED_CONDITION_FIELD_TO_CANONICAL[condition.f],\n op: condition.op,\n value: condition.value,\n })),\n rates: Object.fromEntries(\n Object.entries(tier.r).map(([meter, value]) => [\n MINIFIED_METER_TO_CANONICAL[meter as MinifiedMeterKey],\n value!.c,\n ]),\n ) as Partial<Record<PricingMeter, number>>,\n }),\n ),\n });\n}\n\nfunction resolvePricingModelPath(): string {\n const packageRoot = getPackageRoot();\n const candidates = [\n path.join(packageRoot, 'dist', 'metrics', DATA_FILE_NAME),\n path.join(packageRoot, 'src', 'metrics', DATA_FILE_NAME),\n path.join(process.cwd(), 'observability', 'mastra', 'src', 'metrics', DATA_FILE_NAME),\n path.join(process.cwd(), 'src', 'metrics', DATA_FILE_NAME),\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n }\n\n throw new Error(`Unable to locate pricing data JSONL at any known path: ${candidates.join(', ')}`);\n}\n\nfunction getPackageRoot(): string {\n try {\n const require = createRequire(import.meta.url || 'file://');\n const packageJsonPath = require.resolve('@mastra/observability/package.json');\n return path.dirname(packageJsonPath);\n } catch {\n return process.cwd();\n }\n}\n\nfunction makePricingKey(args: { provider: string; model: string }): string {\n return `${normalizeProvider(args.provider)}::${normalizeKeyPart(args.model)}`;\n}\n\nfunction normalizeKeyPart(value: string): string {\n return value.trim().toLowerCase();\n}\n\n/**\n * Normalize a provider string by stripping AI SDK capability suffixes\n * (e.g. \"openai.chat\" → \"openai\", \"anthropic.messages\" → \"anthropic\").\n * The pricing data uses bare provider names without these suffixes.\n */\nfunction normalizeProvider(provider: string): string {\n const normalized = provider.trim().toLowerCase();\n const dotIndex = normalized.indexOf('.');\n return dotIndex !== -1 ? normalized.substring(0, dotIndex) : normalized;\n}\n\n/**\n * Generate model name variants to try during lookup, in priority order:\n * 1. Original (and date-stripped original)\n * 2. Dots → dashes, e.g. \"gpt-5.4\" → \"gpt-5-4\" (and date-stripped)\n * 3. Dots and slashes → dashes, e.g. \"xiaomi/mimo-v2-pro\" → \"xiaomi-mimo-v2-pro\"\n * (covers OpenRouter entries that keep the vendor prefix flattened with a dash)\n * 4. Vendor prefix dropped, e.g. \"openai/gpt-5-mini\" → \"gpt-5-mini\", and the\n * same with dots flattened, e.g. \"google/gemini-2.5-flash\" → \"gemini-2-5-flash\"\n * (covers OpenRouter entries stored without the vendor prefix, including\n * dotted versions)\n *\n * Each variant is also tried with its date suffix stripped.\n * The Set dedupes so non-prefixed inputs do not pay for redundant lookups.\n */\nfunction getModelVariants(model: string): string[] {\n const variants = new Set<string>();\n const add = (v: string) => {\n variants.add(v);\n variants.add(stripDateSuffix(v));\n };\n\n add(model);\n add(model.replace(/\\./g, '-'));\n add(model.replace(/[./]/g, '-'));\n\n const slashIndex = model.indexOf('/');\n if (slashIndex !== -1) {\n // Vendor-prefixed routes (e.g. OpenRouter's `google/gemini-2.5-flash`) need the\n // same dot-flattening as the full id; otherwise the stripped suffix keeps its dots\n // (`gemini-2.5-flash`) and never matches a flattened pricing key (`gemini-2-5-flash`).\n const withoutVendor = model.substring(slashIndex + 1);\n add(withoutVendor);\n add(withoutVendor.replace(/\\./g, '-'));\n }\n\n return [...variants];\n}\n\n/**\n * Strip date suffix from model names.\n * Handles multiple date formats used by different providers:\n * - OpenAI: YYYY-MM-DD at end (e.g., \"gpt-5-4-mini-2026-03-17\" → \"gpt-5-4-mini\")\n * - Anthropic: YYYYMMDD with optional suffix (e.g., \"claude-sonnet-4-5-20250929-thinking\" → \"claude-sonnet-4-5-thinking\")\n * - Cohere/Gemini: MM-YYYY at end (e.g., \"command-r-08-2024\" → \"command-r\")\n */\nfunction stripDateSuffix(model: string): string {\n // OpenAI format: -YYYY-MM-DD at end\n let stripped = model.replace(/-20\\d{2}-\\d{2}-\\d{2}$/, '');\n if (stripped !== model) return stripped;\n\n // Anthropic format: -YYYYMMDD, possibly followed by suffix like -thinking\n stripped = model.replace(/-20\\d{6}(-[a-z]+)?$/, '$1');\n if (stripped !== model) return stripped;\n\n // Cohere/Gemini format: -MM-YYYY at end\n stripped = model.replace(/-\\d{2}-20\\d{2}$/, '');\n return stripped;\n}\n","export type PricingConditionField = 'total_input_tokens';\nexport type PricingConditionOperator = 'gt' | 'gte' | 'lt' | 'lte' | 'eq' | 'neq';\n\nexport const PricingMeter = {\n INPUT_TOKENS: 'input_tokens',\n INPUT_AUDIO_TOKENS: 'input_audio_tokens',\n INPUT_CACHE_READ_TOKENS: 'input_cache_read_tokens',\n INPUT_CACHE_WRITE_TOKENS: 'input_cache_write_tokens',\n INPUT_IMAGE_TOKENS: 'input_image_tokens',\n\n OUTPUT_TOKENS: 'output_tokens',\n OUTPUT_AUDIO_TOKENS: 'output_audio_tokens',\n OUTPUT_IMAGE_TOKENS: 'output_image_tokens',\n OUTPUT_REASONING_TOKENS: 'output_reasoning_tokens',\n} as const;\n\nexport type PricingMeter = (typeof PricingMeter)[keyof typeof PricingMeter];\n\nexport const TokenMetrics = {\n TOTAL_INPUT: 'mastra_model_total_input_tokens',\n TOTAL_OUTPUT: 'mastra_model_total_output_tokens',\n INPUT_TEXT: 'mastra_model_input_text_tokens',\n INPUT_CACHE_READ: 'mastra_model_input_cache_read_tokens',\n INPUT_CACHE_WRITE: 'mastra_model_input_cache_write_tokens',\n INPUT_AUDIO: 'mastra_model_input_audio_tokens',\n INPUT_IMAGE: 'mastra_model_input_image_tokens',\n OUTPUT_TEXT: 'mastra_model_output_text_tokens',\n OUTPUT_REASONING: 'mastra_model_output_reasoning_tokens',\n OUTPUT_AUDIO: 'mastra_model_output_audio_tokens',\n OUTPUT_IMAGE: 'mastra_model_output_image_tokens',\n} as const;\n\nexport type TokenMetrics = (typeof TokenMetrics)[keyof typeof TokenMetrics];\n","import type { UsageStats } from '@mastra/core/observability';\nimport { TokenMetrics } from './types';\n\nexport interface TokenMetricSample {\n name: TokenMetrics;\n value: number;\n}\n\nexport function getTokenMetricSamples(usage: UsageStats): TokenMetricSample[] {\n const samples: TokenMetricSample[] = [];\n const pushIfDefined = (name: TokenMetrics, value: number | undefined) => {\n if (value != null) {\n samples.push({ name, value });\n }\n };\n const pushIfPositive = (name: TokenMetrics, value: number | undefined) => {\n if (value != null && value > 0) {\n samples.push({ name, value });\n }\n };\n\n pushIfDefined(TokenMetrics.TOTAL_INPUT, usage.inputTokens);\n pushIfDefined(TokenMetrics.TOTAL_OUTPUT, usage.outputTokens);\n\n if (usage.inputDetails) {\n pushIfPositive(TokenMetrics.INPUT_TEXT, usage.inputDetails.text);\n pushIfPositive(TokenMetrics.INPUT_CACHE_READ, usage.inputDetails.cacheRead);\n pushIfPositive(TokenMetrics.INPUT_CACHE_WRITE, usage.inputDetails.cacheWrite);\n pushIfPositive(TokenMetrics.INPUT_AUDIO, usage.inputDetails.audio);\n pushIfPositive(TokenMetrics.INPUT_IMAGE, usage.inputDetails.image);\n }\n\n if (usage.outputDetails) {\n pushIfPositive(TokenMetrics.OUTPUT_TEXT, usage.outputDetails.text);\n pushIfPositive(TokenMetrics.OUTPUT_REASONING, usage.outputDetails.reasoning);\n pushIfPositive(TokenMetrics.OUTPUT_AUDIO, usage.outputDetails.audio);\n pushIfPositive(TokenMetrics.OUTPUT_IMAGE, usage.outputDetails.image);\n }\n\n return samples;\n}\n","import type { CostContext, UsageStats } from '@mastra/core/observability';\nimport type { PricingTier, PricingModel } from './pricing-model';\nimport { PricingRegistry } from './pricing-registry';\nimport { TokenMetrics, PricingMeter } from './types';\nimport { getTokenMetricSamples } from './usage-metrics';\n\nexport function estimateCosts(\n args: {\n provider: string;\n model: string;\n usage: UsageStats;\n },\n pricingRegistry: PricingRegistry | null = PricingRegistry.getGlobal(),\n): Map<TokenMetrics, CostContext> {\n const { provider, model, usage } = args;\n const results = new Map<TokenMetrics, CostContext>();\n\n const pricingModel = pricingRegistry?.get({ provider, model });\n if (!pricingModel) {\n const errorContext: CostContext = { costMetadata: { error: 'no_matching_model' }, provider, model };\n applyErrorContextForUsage(results, usage, errorContext);\n return results;\n }\n const costMetadata: Record<string, unknown> = { pricing_id: pricingModel.id };\n\n const pricingTier = pricingModel.getPricingTierForUsage(usage);\n if (!pricingTier) {\n const errorContext: CostContext = { costMetadata: { ...costMetadata, error: 'no_matching_tier' }, provider, model };\n applyErrorContextForUsage(results, usage, errorContext);\n return results;\n }\n costMetadata['tier_index'] = pricingTier.index;\n\n const estimateFields = {\n pricingModel,\n pricingTier,\n costMetadata,\n };\n\n const inputDetailResults: Array<{ success: boolean; costContext: CostContext }> = [];\n if (usage.inputDetails?.audio) {\n const result = estimateCostForMeter({\n meter: PricingMeter.INPUT_AUDIO_TOKENS,\n tokenCount: usage.inputDetails.audio,\n ...estimateFields,\n });\n results.set(TokenMetrics.INPUT_AUDIO, result.costContext);\n inputDetailResults.push(result);\n }\n\n if (usage.inputDetails?.cacheRead) {\n const result = estimateCostForMeter({\n meter: PricingMeter.INPUT_CACHE_READ_TOKENS,\n tokenCount: usage.inputDetails.cacheRead,\n ...estimateFields,\n });\n results.set(TokenMetrics.INPUT_CACHE_READ, result.costContext);\n inputDetailResults.push(result);\n }\n\n if (usage.inputDetails?.cacheWrite) {\n const result = estimateCostForMeter({\n meter: PricingMeter.INPUT_CACHE_WRITE_TOKENS,\n tokenCount: usage.inputDetails.cacheWrite,\n ...estimateFields,\n });\n results.set(TokenMetrics.INPUT_CACHE_WRITE, result.costContext);\n inputDetailResults.push(result);\n }\n\n if (usage.inputDetails?.image) {\n const result = estimateCostForMeter({\n meter: PricingMeter.INPUT_IMAGE_TOKENS,\n tokenCount: usage.inputDetails.image,\n ...estimateFields,\n });\n results.set(TokenMetrics.INPUT_IMAGE, result.costContext);\n inputDetailResults.push(result);\n }\n\n if (usage.inputDetails?.text) {\n const result = estimateCostForMeter({\n meter: PricingMeter.INPUT_TOKENS,\n tokenCount: usage.inputDetails.text,\n ...estimateFields,\n });\n results.set(TokenMetrics.INPUT_TEXT, result.costContext);\n inputDetailResults.push(result);\n }\n\n setAggregateCostContext({\n results,\n totalMetric: TokenMetrics.TOTAL_INPUT,\n fallbackMeter: PricingMeter.INPUT_TOKENS,\n totalTokenCount: usage.inputTokens,\n detailResults: inputDetailResults,\n ...estimateFields,\n });\n\n const outputDetailResults: Array<{ success: boolean; costContext: CostContext }> = [];\n if (usage.outputDetails?.audio) {\n const result = estimateCostForMeter({\n meter: PricingMeter.OUTPUT_AUDIO_TOKENS,\n tokenCount: usage.outputDetails.audio,\n ...estimateFields,\n });\n results.set(TokenMetrics.OUTPUT_AUDIO, result.costContext);\n outputDetailResults.push(result);\n }\n\n if (usage.outputDetails?.image) {\n const result = estimateCostForMeter({\n meter: PricingMeter.OUTPUT_IMAGE_TOKENS,\n tokenCount: usage.outputDetails.image,\n ...estimateFields,\n });\n results.set(TokenMetrics.OUTPUT_IMAGE, result.costContext);\n outputDetailResults.push(result);\n }\n\n if (usage.outputDetails?.reasoning) {\n const result = estimateCostForMeter({\n meter: PricingMeter.OUTPUT_REASONING_TOKENS,\n tokenCount: usage.outputDetails.reasoning,\n ...estimateFields,\n });\n results.set(TokenMetrics.OUTPUT_REASONING, result.costContext);\n outputDetailResults.push(result);\n }\n\n if (usage.outputDetails?.text) {\n const result = estimateCostForMeter({\n meter: PricingMeter.OUTPUT_TOKENS,\n tokenCount: usage.outputDetails.text,\n ...estimateFields,\n });\n results.set(TokenMetrics.OUTPUT_TEXT, result.costContext);\n outputDetailResults.push(result);\n }\n\n setAggregateCostContext({\n results,\n totalMetric: TokenMetrics.TOTAL_OUTPUT,\n fallbackMeter: PricingMeter.OUTPUT_TOKENS,\n totalTokenCount: usage.outputTokens,\n detailResults: outputDetailResults,\n ...estimateFields,\n });\n\n return results;\n}\n\nfunction applyErrorContextForUsage(\n results: Map<TokenMetrics, CostContext>,\n usage: UsageStats,\n errorContext: CostContext,\n): void {\n for (const sample of getTokenMetricSamples(usage)) {\n results.set(sample.name, errorContext);\n }\n}\n\nfunction setAggregateCostContext(args: {\n results: Map<TokenMetrics, CostContext>;\n totalMetric: TokenMetrics;\n fallbackMeter: PricingMeter;\n totalTokenCount: number | undefined;\n detailResults: Array<{ success: boolean; costContext: CostContext }>;\n pricingModel: PricingModel;\n pricingTier: PricingTier;\n costMetadata: Record<string, unknown>;\n}): void {\n const {\n results,\n totalMetric,\n fallbackMeter,\n totalTokenCount,\n detailResults,\n pricingModel,\n pricingTier,\n costMetadata,\n } = args;\n if (totalTokenCount == null) {\n return;\n }\n\n const successfulDetailCosts = detailResults\n .filter(result => result.success)\n .map(result => result.costContext.estimatedCost)\n .filter((value): value is number => typeof value === 'number');\n\n if (successfulDetailCosts.length > 0) {\n const hasFailedDetailCost = detailResults.some(result => !result.success);\n results.set(totalMetric, {\n provider: pricingModel.provider,\n model: pricingModel.model,\n estimatedCost: successfulDetailCosts.reduce((sum, value) => sum + value, 0),\n costUnit: pricingModel.currency,\n costMetadata: hasFailedDetailCost ? { ...costMetadata, error: 'partial_cost' } : { ...costMetadata },\n });\n return;\n }\n\n const fallbackResult = estimateCostForMeter({\n meter: fallbackMeter,\n tokenCount: totalTokenCount,\n pricingModel,\n pricingTier,\n costMetadata,\n });\n results.set(totalMetric, fallbackResult.costContext);\n}\n\nfunction estimateCostForMeter(args: {\n pricingModel: PricingModel;\n pricingTier: PricingTier;\n meter: PricingMeter;\n tokenCount: number;\n costMetadata: Record<string, unknown>;\n}): {\n success: boolean;\n costContext: CostContext;\n} {\n const { pricingModel, pricingTier, meter, tokenCount, costMetadata } = args;\n const costContext: CostContext = {\n provider: pricingModel.provider,\n model: pricingModel.model,\n };\n const pricePerUnit = pricingTier.rates[meter];\n if (typeof pricePerUnit !== 'number') {\n return {\n success: false,\n costContext: {\n ...costContext,\n costMetadata: { ...costMetadata, error: 'no_pricing_for_usage_type' },\n },\n };\n }\n\n return {\n success: true,\n costContext: {\n ...costContext,\n estimatedCost: tokenCount * pricePerUnit,\n costUnit: pricingModel.currency,\n costMetadata: { ...costMetadata },\n },\n };\n}\n","/**\n * Emits metrics derived from live spans.\n */\n\nimport { SpanType } from '@mastra/core/observability';\nimport type {\n AnySpan,\n CostContext,\n MetricsContext,\n ModelGenerationAttributes,\n UsageStats,\n} from '@mastra/core/observability';\nimport { estimateCosts } from './estimator';\nimport { TokenMetrics } from './types';\nimport { getTokenMetricSamples } from './usage-metrics';\n\n/** Emit duration metrics for a live span. */\nexport function emitDurationMetrics(span: AnySpan, metrics: MetricsContext): void {\n const durationMetricName = getDurationMetricName(span);\n if (!durationMetricName || !span.startTime || !span.endTime) {\n return;\n }\n\n const durationMs = span.endTime.getTime() - span.startTime.getTime();\n metrics.emit(durationMetricName, durationMs, {\n status: span.errorInfo ? 'error' : 'ok',\n });\n}\n\n/** Emit token usage metrics for a model-generation span. */\nexport function emitTokenMetrics(span: AnySpan, metrics: MetricsContext): void {\n if (span.type !== SpanType.MODEL_GENERATION) {\n return;\n }\n\n const attrs = span.attributes as ModelGenerationAttributes | undefined;\n if (!attrs?.usage) {\n return;\n }\n\n emitUsageMetrics(attrs, attrs.usage, metrics);\n}\n\n/**\n * Emit token usage metrics from an explicit usage payload, using the supplied\n * metrics context (which carries entity / parent / root labels) and the\n * supplied provider+model for cost lookup.\n *\n * Used when an internal MODEL_GENERATION's usage is rolled up to a visible\n * ancestor span: the metric labels come from the ancestor's context, the\n * cost calculation still uses the original model that incurred the tokens.\n */\nexport function emitTokenMetricsForUsage(\n usage: UsageStats,\n provider: string | undefined,\n model: string | undefined,\n metrics: MetricsContext,\n): void {\n emitUsageMetrics({ provider, model } as ModelGenerationAttributes, usage, metrics);\n}\n\n/** Emit all auto-extracted metrics for a live span end. */\nexport function emitAutoExtractedMetrics(span: AnySpan, metrics: MetricsContext): void {\n emitDurationMetrics(span, metrics);\n emitTokenMetrics(span, metrics);\n}\n\nfunction emitUsageMetrics(\n attrs: ModelGenerationAttributes,\n usage: NonNullable<ModelGenerationAttributes['usage']>,\n metrics: MetricsContext,\n): void {\n let metricCosts = new Map<TokenMetrics, CostContext>();\n const providedCostContext = getProvidedCostContext(attrs, usage);\n if (providedCostContext) {\n metricCosts = providedCostContext;\n } else {\n try {\n const provider = attrs.provider;\n const model = attrs.responseModel ?? attrs.model;\n\n if (provider && model) {\n metricCosts = estimateCosts({\n provider,\n model,\n usage,\n });\n }\n } catch {\n metricCosts = new Map();\n }\n }\n\n const emit = (name: TokenMetrics, value: number) => {\n const costContext = metricCosts.get(name);\n if (!costContext) {\n metrics.emit(name, value);\n return;\n }\n\n metrics.emit(name, value, undefined, { costContext });\n };\n\n for (const sample of getTokenMetricSamples(usage)) {\n emit(sample.name, sample.value);\n }\n}\n\nfunction getProvidedCostContext(\n attrs: ModelGenerationAttributes,\n usage: NonNullable<ModelGenerationAttributes['usage']>,\n): Map<TokenMetrics, CostContext> | undefined {\n const costContext = attrs.costContext;\n if (typeof costContext?.estimatedCost !== 'number') {\n return undefined;\n }\n\n const carrierMetric = usage.inputTokens !== undefined ? TokenMetrics.TOTAL_INPUT : TokenMetrics.TOTAL_OUTPUT;\n const provider = costContext.provider ?? attrs.provider;\n const model = costContext.model ?? attrs.responseModel ?? attrs.model;\n const contexts = new Map<TokenMetrics, CostContext>();\n\n for (const sample of getTokenMetricSamples(usage)) {\n contexts.set(sample.name, {\n provider,\n model,\n });\n }\n\n contexts.set(carrierMetric, {\n ...costContext,\n provider,\n model,\n costMetadata: {\n ...costContext.costMetadata,\n allocation: 'query_total',\n },\n });\n\n return contexts;\n}\n\nfunction getDurationMetricName(span: AnySpan): string | null {\n switch (span.type) {\n case SpanType.AGENT_RUN:\n return 'mastra_agent_duration_ms';\n case SpanType.TOOL_CALL:\n case SpanType.MCP_TOOL_CALL:\n return 'mastra_tool_duration_ms';\n case SpanType.CLIENT_TOOL_CALL:\n // The CLIENT_TOOL_CALL server span measures only carrier emission\n // and args capture. The actual client execution duration is\n // emitted by the client observability proxy using the wall-clock\n // duration measured in @mastra/client-js.\n return null;\n case SpanType.WORKFLOW_RUN:\n return 'mastra_workflow_duration_ms';\n case SpanType.MODEL_GENERATION:\n return 'mastra_model_duration_ms';\n case SpanType.PROCESSOR_RUN:\n return 'mastra_processor_duration_ms';\n default:\n return null;\n }\n}\n","/**\n * CardinalityFilter - Prevents metric cardinality explosion.\n *\n * Filters out high-cardinality labels (like trace_id, user_id) and\n * optionally blocks UUID-like values in labels.\n */\n\nimport type { CardinalityConfig } from '@mastra/core/observability';\nimport { DEFAULT_BLOCKED_LABELS } from '@mastra/core/observability';\n\n/** Matches standard UUID v4 strings (case-insensitive). */\nconst UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nexport class CardinalityFilter {\n private blockedLabels: Set<string>;\n private blockUUIDs: boolean;\n\n /**\n * @param config - Optional configuration. When omitted, uses\n * {@link DEFAULT_BLOCKED_LABELS} and blocks UUID-valued labels.\n */\n constructor(config?: CardinalityConfig) {\n const blocked = config?.blockedLabels ?? [...DEFAULT_BLOCKED_LABELS];\n this.blockedLabels = new Set(blocked.map(l => l.toLowerCase()));\n this.blockUUIDs = config?.blockUUIDs ?? true;\n }\n\n /**\n * Return a copy of `labels` with blocked keys and UUID values removed.\n *\n * @param labels - Raw metric labels to filter.\n * @returns A new object containing only the allowed labels.\n */\n filterLabels(labels: Record<string, string>): Record<string, string> {\n const filtered: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(labels)) {\n if (this.blockedLabels.has(key.toLowerCase())) {\n continue;\n }\n\n if (this.blockUUIDs && UUID_REGEX.test(value)) {\n continue;\n }\n\n filtered[key] = value;\n }\n\n return filtered;\n }\n}\n","/**\n * Usage extraction utilities for converting AI SDK usage to Mastra UsageStats\n */\n\nimport type { InputTokenDetails, OutputTokenDetails, UsageStats } from '@mastra/core/observability';\nimport type { LanguageModelUsage, ProviderMetadata } from '@mastra/core/stream';\n\n/**\n * Provider-specific metadata shapes for type-safe access.\n * These match the actual shapes from AI SDK providers.\n */\ninterface AnthropicMetadata {\n cacheReadInputTokens?: number;\n cacheCreationInputTokens?: number;\n}\n\ninterface GoogleUsageMetadata {\n cachedContentTokenCount?: number;\n thoughtsTokenCount?: number;\n}\n\ninterface GoogleMetadata {\n usageMetadata?: GoogleUsageMetadata;\n}\n\ninterface V3InputUsage {\n total?: number;\n noCache?: number;\n cacheRead?: number;\n cacheWrite?: number;\n}\n\ninterface V3RawUsage {\n inputTokens?: V3InputUsage;\n}\n\nfunction isV3RawUsage(raw: unknown): raw is V3RawUsage {\n return typeof raw === 'object' && raw !== null && 'inputTokens' in raw;\n}\n\n/**\n * AI SDK aggregated input token details.\n * Available on totalUsage in multi-step runs - properly summed across all steps.\n */\ninterface AISdkInputTokenDetails {\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n}\n\n/**\n * Null-safe check: returns true if value is a number (including 0).\n */\nfunction isDefined(value: unknown): value is number {\n return value != null;\n}\n\n/**\n * Extracts and normalizes token usage from AI SDK response, including\n * provider-specific cache tokens from providerMetadata.\n *\n * Cache token extraction priority (highest to lowest):\n * 1. AI SDK aggregated inputTokenDetails (properly summed across all steps in multi-step runs)\n * 2. Mastra-aggregated top-level usage fields (usage.cachedInputTokens, usage.cacheCreationInputTokens) -\n * summed across steps by RunOutput, so they are correct for multi-step runs.\n * 3. Provider-specific providerMetadata (accurate for single-step, LAST STEP ONLY in multi-step).\n *\n * Handles:\n * - OpenAI: cachedInputTokens in usage object\n * - Anthropic: cacheCreationInputTokens, cacheReadInputTokens in providerMetadata.anthropic\n * - Google/Gemini: cachedContentTokenCount, thoughtsTokenCount in providerMetadata.google.usageMetadata\n * - OpenRouter: Uses OpenAI-compatible structure (cache tokens in usage)\n *\n * @param usage - The LanguageModelV2Usage from AI SDK response\n * @param providerMetadata - Optional provider-specific metadata\n * @returns UsageStats with inputDetails and outputDetails\n */\nexport function extractUsageMetrics(usage?: LanguageModelUsage, providerMetadata?: ProviderMetadata): UsageStats {\n if (!usage) {\n return {};\n }\n\n const inputDetails: InputTokenDetails = {};\n const outputDetails: OutputTokenDetails = {};\n\n let inputTokens = usage.inputTokens;\n const outputTokens = usage.outputTokens;\n\n // ===== AI SDK aggregated format (inputTokenDetails) =====\n // In multi-step runs, providerMetadata only reflects the LAST step.\n // AI SDK's inputTokenDetails is properly aggregated across all steps,\n // so we prefer it as the primary source for cache tokens.\n const aiSdkDetails = (usage as { inputTokenDetails?: AISdkInputTokenDetails }).inputTokenDetails;\n\n if (isDefined(aiSdkDetails?.cacheReadTokens)) {\n inputDetails.cacheRead = aiSdkDetails.cacheReadTokens;\n }\n if (isDefined(aiSdkDetails?.cacheWriteTokens)) {\n inputDetails.cacheWrite = aiSdkDetails.cacheWriteTokens;\n }\n\n // Mastra-aggregated fields — summed across steps by RunOutput; prefer over per-step providerMetadata.\n if (!isDefined(inputDetails.cacheRead) && isDefined(usage.cachedInputTokens)) {\n inputDetails.cacheRead = usage.cachedInputTokens;\n }\n if (!isDefined(inputDetails.cacheWrite) && isDefined(usage.cacheCreationInputTokens)) {\n inputDetails.cacheWrite = usage.cacheCreationInputTokens;\n }\n\n // reasoningTokens from usage (OpenAI o1 models)\n if (isDefined(usage.reasoningTokens)) {\n outputDetails.reasoning = usage.reasoningTokens;\n }\n\n // ===== Anthropic =====\n // Cache tokens are in providerMetadata.anthropic\n // inputTokens does NOT include cache tokens - need to sum them\n const anthropic = providerMetadata?.anthropic as AnthropicMetadata | undefined;\n\n if (anthropic) {\n const rawV3InputUsage = isV3RawUsage(usage.raw) ? usage.raw.inputTokens : undefined;\n const hasV3CachedTotals =\n rawV3InputUsage?.total !== undefined &&\n (rawV3InputUsage.cacheRead !== undefined || rawV3InputUsage.cacheWrite !== undefined);\n\n if (!isDefined(inputDetails.cacheRead) && isDefined(anthropic.cacheReadInputTokens)) {\n inputDetails.cacheRead = anthropic.cacheReadInputTokens;\n }\n if (!isDefined(inputDetails.cacheWrite) && isDefined(anthropic.cacheCreationInputTokens)) {\n inputDetails.cacheWrite = anthropic.cacheCreationInputTokens;\n }\n\n // Skip adjustment when inputTokens already includes cache tokens (V3 raw or any positive Mastra-aggregated cache field).\n const inputAlreadyIncludesCache =\n hasV3CachedTotals ||\n (isDefined(usage.cachedInputTokens) && usage.cachedInputTokens > 0) ||\n (isDefined(usage.cacheCreationInputTokens) && usage.cacheCreationInputTokens > 0);\n\n if (!inputAlreadyIncludesCache && (isDefined(inputDetails.cacheRead) || isDefined(inputDetails.cacheWrite))) {\n inputTokens = (usage.inputTokens ?? 0) + (inputDetails.cacheRead ?? 0) + (inputDetails.cacheWrite ?? 0);\n }\n }\n\n // ===== Google/Gemini =====\n // Cache tokens and thoughts are in providerMetadata.google.usageMetadata\n const google = providerMetadata?.google as GoogleMetadata | undefined;\n\n if (google?.usageMetadata) {\n if (!isDefined(inputDetails.cacheRead) && isDefined(google.usageMetadata.cachedContentTokenCount)) {\n inputDetails.cacheRead = google.usageMetadata.cachedContentTokenCount;\n }\n // Gemini \"thoughts\" are similar to reasoning tokens\n if (isDefined(google.usageMetadata.thoughtsTokenCount)) {\n outputDetails.reasoning = google.usageMetadata.thoughtsTokenCount;\n }\n }\n\n if (isDefined(inputTokens)) {\n inputDetails.text = Math.max(\n 0,\n inputTokens - sumDefinedValues(inputDetails, ['cacheRead', 'cacheWrite', 'audio', 'image']),\n );\n }\n\n if (isDefined(outputTokens)) {\n outputDetails.text = Math.max(0, outputTokens - sumDefinedValues(outputDetails, ['reasoning', 'audio', 'image']));\n }\n\n // Build the final UsageStats object\n const result: UsageStats = {\n inputTokens,\n outputTokens,\n };\n\n // Only include details if there's data\n if (Object.keys(inputDetails).length > 0) {\n result.inputDetails = inputDetails;\n }\n if (Object.keys(outputDetails).length > 0) {\n result.outputDetails = outputDetails;\n }\n\n return result;\n}\n\nfunction sumDefinedValues<T extends object, K extends keyof T>(obj: T, keys: K[]): number {\n return keys.reduce((sum, key) => sum + ((obj[key] as number | undefined) ?? 0), 0);\n}\n\nfunction addOptional(a: number | undefined, b: number | undefined): number | undefined {\n if (a === undefined && b === undefined) return undefined;\n return (a ?? 0) + (b ?? 0);\n}\n\nfunction mergeInputDetails(\n a: InputTokenDetails | undefined,\n b: InputTokenDetails | undefined,\n): InputTokenDetails | undefined {\n if (!a) return b ? { ...b } : undefined;\n if (!b) return { ...a };\n return {\n text: addOptional(a.text, b.text),\n cacheRead: addOptional(a.cacheRead, b.cacheRead),\n cacheWrite: addOptional(a.cacheWrite, b.cacheWrite),\n audio: addOptional(a.audio, b.audio),\n image: addOptional(a.image, b.image),\n };\n}\n\nfunction mergeOutputDetails(\n a: OutputTokenDetails | undefined,\n b: OutputTokenDetails | undefined,\n): OutputTokenDetails | undefined {\n if (!a) return b ? { ...b } : undefined;\n if (!b) return { ...a };\n return {\n text: addOptional(a.text, b.text),\n reasoning: addOptional(a.reasoning, b.reasoning),\n audio: addOptional(a.audio, b.audio),\n image: addOptional(a.image, b.image),\n };\n}\n\n/**\n * Sum two UsageStats into a new one. Treats undefined fields as zero when\n * the other side has a value, and preserves undefined when both are absent.\n * Used to roll up internal model-generation usage onto a visible ancestor\n * span so cost / token attribution survives internal-span filtering.\n */\nexport function addUsageStats(a: UsageStats | undefined, b: UsageStats): UsageStats {\n if (!a) {\n return {\n ...b,\n inputDetails: b.inputDetails ? { ...b.inputDetails } : undefined,\n outputDetails: b.outputDetails ? { ...b.outputDetails } : undefined,\n };\n }\n return {\n inputTokens: addOptional(a.inputTokens, b.inputTokens),\n outputTokens: addOptional(a.outputTokens, b.outputTokens),\n inputDetails: mergeInputDetails(a.inputDetails, b.inputDetails),\n outputDetails: mergeOutputDetails(a.outputDetails, b.outputDetails),\n };\n}\n","/**\n * Model Span Tracing\n *\n * Provides span tracking for Model generations, including:\n * - MODEL_STEP spans (one per Model API call - includes processors and tool executions)\n * - MODEL_INFERENCE spans (the provider call itself - model latency only)\n * - MODEL_CHUNK spans (individual streaming chunks within an inference)\n *\n * Hierarchy: MODEL_GENERATION -> MODEL_STEP -> MODEL_INFERENCE -> MODEL_CHUNK\n *\n * Processors and tool executions remain children of MODEL_STEP (siblings of\n * MODEL_INFERENCE), so MODEL_INFERENCE measures pure model time.\n */\n\nimport { TransformStream } from 'node:stream/web';\nimport { coreFeatures } from '@mastra/core/features';\nimport { SpanType } from '@mastra/core/observability';\nimport type {\n Span,\n EndGenerationOptions,\n ErrorSpanOptions,\n ModelInferenceContext,\n TracingContext,\n UpdateSpanOptions,\n} from '@mastra/core/observability';\nimport type { ChunkType, StepStartPayload, StepFinishPayload } from '@mastra/core/stream';\n\n/**\n * Feature gate for MODEL_INFERENCE spans. When the installed @mastra/core\n * predates the feature flag, `SpanType.MODEL_INFERENCE` resolves to undefined\n * at runtime; in that case the tracker falls back to parenting MODEL_CHUNK\n * spans directly under MODEL_STEP (the pre-MODEL_INFERENCE behavior).\n *\n * Read at every call so tests can toggle the flag between cases. The set\n * lookup is O(1) and not on a hot path.\n */\nfunction supportsModelInference(): boolean {\n return coreFeatures.has('model-inference-span');\n}\n\nimport { extractUsageMetrics } from './usage';\n\ntype StepInputPreview = Array<{ role: string; content: string }> | Record<string, unknown> | string | undefined;\n\nfunction formatPreviewLabel(label: unknown, fallback: string): string {\n return typeof label === 'string' && label.length > 0 ? label : fallback;\n}\n\nfunction summarizePart(part: unknown): string {\n if (typeof part === 'string') {\n return part;\n }\n\n if (!part || typeof part !== 'object') {\n return '';\n }\n\n if ('text' in part && typeof part.text === 'string') {\n return part.text;\n }\n\n if ('parts' in part && Array.isArray(part.parts)) {\n return part.parts.map(summarizePart).filter(Boolean).join('');\n }\n\n if ('inlineData' in part && part.inlineData && typeof part.inlineData === 'object') {\n return `[${formatPreviewLabel((part.inlineData as { mimeType?: unknown }).mimeType, 'binary')}]`;\n }\n\n if ('image_url' in part) {\n return '[image]';\n }\n\n if ('functionCall' in part && part.functionCall && typeof part.functionCall === 'object') {\n return `[tool: ${formatPreviewLabel((part.functionCall as { name?: unknown }).name, 'unknown')}]`;\n }\n\n if ('function_call' in part && part.function_call && typeof part.function_call === 'object') {\n return `[tool: ${formatPreviewLabel((part.function_call as { name?: unknown }).name, 'unknown')}]`;\n }\n\n if ('function' in part && part.function && typeof part.function === 'object') {\n return `[tool: ${formatPreviewLabel((part.function as { name?: unknown }).name, 'unknown')}]`;\n }\n\n if ('toolName' in part) {\n return `[tool: ${formatPreviewLabel((part as { toolName?: unknown }).toolName, 'unknown')}]`;\n }\n\n if ('type' in part && typeof part.type === 'string') {\n switch (part.type) {\n case 'image':\n return '[image]';\n case 'file':\n return '[file]';\n case 'reasoning':\n return '[reasoning]';\n case 'tool-call':\n return `[tool: ${formatPreviewLabel((part as { toolName?: unknown }).toolName, 'unknown')}]`;\n case 'tool-result':\n return '[tool-result]';\n default:\n return `[${part.type}]`;\n }\n }\n\n if ('content' in part && typeof part.content === 'string') {\n return part.content;\n }\n\n return '[object]';\n}\n\nfunction summarizeMessageContent(content: unknown): string {\n if (typeof content === 'string') {\n return content;\n }\n\n if (Array.isArray(content)) {\n return content.map(summarizePart).filter(Boolean).join('');\n }\n\n if (content && typeof content === 'object') {\n if ('parts' in content && Array.isArray(content.parts)) {\n return content.parts.map(summarizePart).filter(Boolean).join('');\n }\n\n return summarizePart(content);\n }\n\n if (content == null) {\n return '';\n }\n\n return String(content);\n}\n\nfunction appendToolPreview(preview: string, toolCalls: unknown): string {\n if (!Array.isArray(toolCalls) || toolCalls.length === 0) {\n return preview;\n }\n\n const toolPreview = toolCalls\n .map(toolCall => summarizePart(toolCall))\n .filter(Boolean)\n .join(' ');\n\n if (!toolPreview) {\n return preview;\n }\n\n return preview ? `${preview} ${toolPreview}` : toolPreview;\n}\n\nfunction appendPreview(preview: string, addition: string): string {\n if (!addition) {\n return preview;\n }\n\n return preview ? `${preview} ${addition}` : addition;\n}\n\nfunction normalizeMessages(messages: unknown[]): Array<{ role: string; content: string }> {\n return messages.map(message => {\n if (!message || typeof message !== 'object') {\n return { role: 'user', content: summarizeMessageContent(message) };\n }\n\n const role = typeof (message as { role?: unknown }).role === 'string' ? (message as { role: string }).role : 'user';\n\n const baseContent = summarizeMessageContent((message as { content?: unknown }).content);\n const contentWithToolArrays = appendToolPreview(\n appendToolPreview(baseContent, (message as { toolCalls?: unknown }).toolCalls),\n (message as { tool_calls?: unknown }).tool_calls,\n );\n const functionCall = (message as { functionCall?: unknown }).functionCall;\n const functionCallPreview = functionCall === undefined ? '' : summarizePart({ functionCall });\n const functionCallSnakeCase = (message as { function_call?: unknown }).function_call;\n const functionCallSnakeCasePreview =\n functionCallSnakeCase === undefined ? '' : summarizePart({ function_call: functionCallSnakeCase });\n const contentWithFunctionCall = appendPreview(\n appendPreview(contentWithToolArrays, functionCallPreview),\n functionCallSnakeCasePreview,\n );\n\n return { role, content: contentWithFunctionCall };\n });\n}\n\nfunction summarizeRequestBody(body: unknown): StepInputPreview {\n if (body == null) {\n return undefined;\n }\n\n if (typeof body !== 'object') {\n return typeof body === 'string' ? body : String(body);\n }\n\n if (Array.isArray((body as { messages?: unknown }).messages)) {\n return normalizeMessages((body as { messages: unknown[] }).messages);\n }\n\n if (Array.isArray((body as { input?: unknown }).input)) {\n return normalizeMessages((body as { input: unknown[] }).input);\n }\n\n if (Array.isArray((body as { contents?: unknown }).contents)) {\n return (body as { contents: Array<{ role?: unknown; parts?: unknown[] }> }).contents.map(item => ({\n role: typeof item?.role === 'string' ? item.role : 'user',\n content: Array.isArray(item?.parts) ? item.parts.map(summarizePart).filter(Boolean).join('') : '',\n }));\n }\n\n const summary: Record<string, unknown> = {};\n\n if (typeof (body as { model?: unknown }).model === 'string') {\n summary.model = (body as { model: string }).model;\n }\n\n const bodyKeys = Object.keys(body as Record<string, unknown>).filter(key => key !== 'body');\n if (bodyKeys.length > 0) {\n summary.keys = bodyKeys;\n }\n\n return Object.keys(summary).length > 0 ? summary : '[request body]';\n}\n\n/**\n * Extract a shallow conversation preview for model_step span input.\n */\nfunction extractStepInput(payload?: StepStartPayload): StepInputPreview {\n if (Array.isArray(payload?.inputMessages)) {\n return normalizeMessages(payload.inputMessages);\n }\n\n const request = payload?.request;\n if (!request) return undefined;\n\n const { body } = request;\n if (body == null) return request;\n\n try {\n const parsed = typeof body === 'string' ? JSON.parse(body) : body;\n return summarizeRequestBody(parsed);\n } catch {\n // body was not valid JSON; return as-is\n return request;\n }\n}\n\n/**\n * Manages MODEL_STEP and MODEL_CHUNK span tracking for streaming Model responses.\n *\n * Should be instantiated once per MODEL_GENERATION span and shared across\n * all streaming steps (including after tool calls).\n */\nexport class ModelSpanTracker {\n #modelSpan?: Span<SpanType.MODEL_GENERATION>;\n #currentStepSpan?: Span<SpanType.MODEL_STEP>;\n #currentInferenceSpan?: Span<SpanType.MODEL_INFERENCE>;\n #currentChunkSpan?: Span<SpanType.MODEL_CHUNK>;\n #currentChunkType?: string;\n #accumulator: Record<string, any> = {};\n #stepIndex: number = 0;\n #chunkSequence: number = 0;\n #completionStartTime?: Date;\n #currentStepInputIsFinal: boolean = false;\n /** When true, step-finish chunks don't auto-close the step span (for durable execution) */\n #deferStepClose: boolean = false;\n /** Stored step-finish payload when defer mode is enabled */\n #pendingStepFinishPayload?: StepFinishPayload<any, any>;\n /** Static request-side context applied to every MODEL_INFERENCE span */\n #inferenceContext?: ModelInferenceContext;\n\n constructor(modelSpan?: Span<SpanType.MODEL_GENERATION>) {\n this.#modelSpan = modelSpan;\n }\n\n /**\n * Set request-side context applied to subsequent MODEL_INFERENCE spans.\n * No-op when paired with an older @mastra/core that lacks the feature flag.\n */\n setInferenceContext(context: ModelInferenceContext): void {\n this.#inferenceContext = context;\n }\n\n /**\n * Capture the completion start time (time to first token) when the first content chunk arrives.\n */\n #captureCompletionStartTime(): void {\n if (this.#completionStartTime) {\n return;\n }\n this.#completionStartTime = new Date();\n }\n\n /**\n * Get the tracing context for creating child spans.\n * Returns the current step span if active, otherwise the model span.\n */\n getTracingContext(): TracingContext {\n return {\n currentSpan: this.#currentStepSpan ?? this.#modelSpan,\n };\n }\n\n /**\n * Report an error on the generation span\n */\n reportGenerationError(options: ErrorSpanOptions<SpanType.MODEL_GENERATION>): void {\n this.#modelSpan?.error(options);\n }\n\n /**\n * End the generation span with optional raw usage data.\n * If usage is provided, it will be converted to UsageStats with cache token details.\n */\n endGeneration(options?: EndGenerationOptions): void {\n const { usage, providerMetadata, ...spanOptions } = options ?? {};\n\n if (spanOptions.attributes) {\n spanOptions.attributes.completionStartTime = this.#completionStartTime;\n spanOptions.attributes.usage = extractUsageMetrics(usage, providerMetadata);\n }\n\n this.#modelSpan?.end(spanOptions);\n }\n\n /**\n * Update the generation span\n */\n updateGeneration(options: UpdateSpanOptions<SpanType.MODEL_GENERATION>): void {\n this.#modelSpan?.update(options);\n }\n\n /**\n * Enable or disable deferred step closing for durable execution.\n * When enabled, step-finish chunks won't automatically close the step span.\n * Use exportCurrentStep() to get the span data, then close it manually later.\n */\n setDeferStepClose(defer: boolean): void {\n this.#deferStepClose = defer;\n }\n\n /**\n * Export the current step span for later rebuilding (durable execution).\n * Returns undefined if no step span is active.\n */\n exportCurrentStep(): ReturnType<Span<SpanType.MODEL_STEP>['exportSpan']> | undefined {\n return this.#currentStepSpan?.exportSpan();\n }\n\n /**\n * Get the pending step finish payload (captured when defer mode is enabled).\n * This contains usage, finishReason, etc. for closing the step later.\n */\n getPendingStepFinishPayload(): StepFinishPayload<any, any> | undefined {\n return this.#pendingStepFinishPayload;\n }\n\n /**\n * Set the starting step index for durable execution.\n * Used when resuming across agentic loop iterations to maintain step continuity.\n */\n setStepIndex(index: number): void {\n this.#stepIndex = index;\n }\n\n /**\n * Get the current step index.\n */\n getStepIndex(): number {\n return this.#stepIndex;\n }\n\n /**\n * Start a new Model execution step.\n * This should be called at the beginning of LLM execution to capture accurate startTime.\n * The step-start chunk payload can be passed later via updateStep() if needed.\n *\n * Note: this only opens MODEL_STEP. The MODEL_INFERENCE child span is opened\n * separately via startInference() so its duration excludes input processor work.\n * Callers that don't call startInference() explicitly will get one auto-created\n * when the first model chunk arrives.\n */\n startStep(payload?: StepStartPayload): void {\n // Don't create duplicate step spans\n if (this.#currentStepSpan) {\n return;\n }\n\n const input = extractStepInput(payload);\n this.#currentStepSpan = this.#modelSpan?.createChildSpan({\n name: `step: ${this.#stepIndex}`,\n type: SpanType.MODEL_STEP,\n attributes: {\n stepIndex: this.#stepIndex,\n ...(payload?.messageId ? { messageId: payload.messageId } : {}),\n ...(payload?.warnings?.length ? { warnings: payload.warnings } : {}),\n },\n input,\n tracingPolicy: this.#modelSpan?.tracingPolicy,\n });\n this.#currentStepInputIsFinal = Array.isArray(payload?.inputMessages);\n // Reset chunk sequence for new step\n this.#chunkSequence = 0;\n }\n\n /**\n * End the current MODEL_INFERENCE span when the provider stream finishes.\n * Fields are duplicated onto MODEL_STEP (in #endStepSpan) so existing\n * integrations that read usage/finishReason from the step span continue\n * to work unchanged.\n *\n * Safe to call multiple times - no-ops if the span is already closed.\n */\n #endInferenceSpan<OUTPUT>(payload: StepFinishPayload<any, OUTPUT>): void {\n if (!this.#currentInferenceSpan) return;\n\n const { usage: rawUsage, ...otherOutput } = payload.output;\n const usage = extractUsageMetrics(rawUsage, payload.metadata?.providerMetadata);\n\n this.#currentInferenceSpan.end({\n output: otherOutput,\n attributes: {\n usage,\n finishReason: payload.stepResult.reason,\n warnings: payload.stepResult.warnings,\n completionStartTime: this.#completionStartTime,\n },\n });\n this.#currentInferenceSpan = undefined;\n }\n\n /**\n * Open the MODEL_INFERENCE span for the current step. Chunks (including tool-call\n * chunks emitted by the model) parent under this span so its duration reflects\n * pure model latency.\n *\n * Should be called immediately before invoking the model — after any input\n * processors / `prepareStep` work has completed — so the span's startTime\n * does not include processor time. The latest `#inferenceContext` (set via\n * setInferenceContext) is snapshotted onto the span at creation.\n *\n * No-ops when the installed @mastra/core lacks the `model-inference-span`\n * feature flag, or when called without an active step span. Auto-invoked from\n * chunk handlers as a safety net; explicit callers get the most accurate\n * start time.\n */\n startInference(payload?: StepStartPayload): void {\n if (!supportsModelInference()) {\n return;\n }\n if (!this.#currentStepSpan || this.#currentInferenceSpan) {\n return;\n }\n\n const input = extractStepInput(payload);\n const generationAttrs = this.#modelSpan?.attributes;\n const ctx = this.#inferenceContext;\n this.#currentInferenceSpan = this.#currentStepSpan.createChildSpan({\n name: `inference: ${this.#stepIndex}`,\n type: SpanType.MODEL_INFERENCE,\n attributes: {\n stepIndex: this.#stepIndex,\n model: generationAttrs?.model,\n provider: generationAttrs?.provider,\n streaming: generationAttrs?.streaming,\n ...(ctx?.parameters !== undefined ? { parameters: ctx.parameters } : {}),\n ...(ctx?.providerOptions !== undefined ? { providerOptions: ctx.providerOptions } : {}),\n ...(ctx?.availableTools !== undefined ? { availableTools: ctx.availableTools } : {}),\n ...(ctx?.toolChoice !== undefined ? { toolChoice: ctx.toolChoice } : {}),\n ...(ctx?.responseFormat !== undefined ? { responseFormat: ctx.responseFormat } : {}),\n },\n input,\n tracingPolicy: this.#modelSpan?.tracingPolicy,\n });\n }\n\n /**\n * Update the current step span with additional payload data.\n * Called when step-start chunk arrives with request/warnings info.\n */\n updateStep(payload?: StepStartPayload): void {\n if (!this.#currentStepSpan || !payload) {\n return;\n }\n\n const hasFinalInput = Array.isArray(payload.inputMessages);\n const input = hasFinalInput || !this.#currentStepInputIsFinal ? extractStepInput(payload) : undefined;\n\n // Update span with request/warnings from the step-start chunk\n this.#currentStepSpan.update({\n ...(input !== undefined ? { input } : {}),\n attributes: {\n ...(payload.messageId ? { messageId: payload.messageId } : {}),\n ...(payload.warnings?.length ? { warnings: payload.warnings } : {}),\n },\n });\n if (hasFinalInput) {\n this.#currentStepInputIsFinal = true;\n }\n }\n\n /**\n * End the current Model execution step with token usage, finish reason, output, and metadata\n */\n #endStepSpan<OUTPUT>(payload: StepFinishPayload<any, OUTPUT>) {\n // Flush any pending chunk span before ending the step\n // (handles case where text-delta arrives without text-end)\n this.#endChunkSpan();\n\n if (!this.#currentStepSpan) return;\n\n // Extract all data from step-finish chunk\n const output = payload.output;\n const { usage: rawUsage, ...otherOutput } = output;\n const stepResult = payload.stepResult;\n const metadata = payload.metadata;\n\n // Convert raw usage to UsageStats with cache token details\n const usage = extractUsageMetrics(rawUsage, metadata?.providerMetadata);\n\n // Remove verbose/redundant fields from metadata:\n // - request: too verbose\n // - id/timestamp: chunk-level data, not step-related\n // - modelId/modelVersion/modelProvider: duplicates of modelMetadata\n const cleanMetadata = metadata ? { ...metadata } : undefined;\n if (cleanMetadata) {\n for (const key of ['request', 'id', 'timestamp', 'modelId', 'modelVersion', 'modelProvider']) {\n delete cleanMetadata[key];\n }\n }\n\n // Inference may already be closed (closed eagerly on step-finish in defer\n // mode so its duration reflects pure model latency, not subsequent tool\n // execution). Close it here for the non-deferred path.\n this.#endInferenceSpan(payload);\n\n this.#currentStepSpan.end({\n output: otherOutput,\n attributes: {\n usage,\n isContinued: stepResult.isContinued,\n finishReason: stepResult.reason,\n warnings: stepResult.warnings,\n },\n metadata: {\n ...cleanMetadata,\n },\n });\n this.#currentStepSpan = undefined;\n this.#currentStepInputIsFinal = false;\n this.#stepIndex++;\n }\n\n /**\n * Returns the parent span for chunks. Chunks parent under MODEL_INFERENCE\n * (the provider call) when available, falling back to MODEL_STEP only if\n * startStep() was bypassed.\n */\n #chunkParent(): Span<SpanType.MODEL_INFERENCE> | Span<SpanType.MODEL_STEP> | undefined {\n return this.#currentInferenceSpan ?? this.#currentStepSpan;\n }\n\n /**\n * Safety-net invoked from chunk handlers: auto-create MODEL_STEP and\n * MODEL_INFERENCE if a chunk arrives before the loop has explicitly opened\n * them, so chunks parent under MODEL_INFERENCE rather than falling through\n * to MODEL_STEP. Idempotent — each public start* method is itself a no-op\n * when its span is already live.\n */\n #ensureStepAndInference(): void {\n if (!this.#currentStepSpan) {\n this.startStep();\n }\n if (!this.#currentInferenceSpan) {\n this.startInference();\n }\n }\n\n /**\n * Create a new chunk span (for multi-part chunks like text-start/delta/end)\n */\n #startChunkSpan(chunkType: string, initialData?: Record<string, any>) {\n // End any existing chunk span before starting a new one\n // (handles transitions like text-delta → tool-call without text-end)\n this.#endChunkSpan();\n\n this.#ensureStepAndInference();\n\n this.#currentChunkSpan = this.#chunkParent()?.createChildSpan({\n name: `chunk: '${chunkType}'`,\n type: SpanType.MODEL_CHUNK,\n attributes: {\n chunkType,\n sequenceNumber: this.#chunkSequence,\n },\n tracingPolicy: this.#modelSpan?.tracingPolicy,\n });\n this.#currentChunkType = chunkType;\n this.#accumulator = initialData || {};\n }\n\n /**\n * Append string content to a specific field in the accumulator\n */\n #appendToAccumulator(field: string, text: string) {\n if (this.#accumulator[field] === undefined) {\n this.#accumulator[field] = text;\n } else {\n this.#accumulator[field] += text;\n }\n }\n\n /**\n * End the current chunk span.\n * Safe to call multiple times - will no-op if span already ended.\n */\n #endChunkSpan(output?: any) {\n if (!this.#currentChunkSpan) return;\n\n this.#currentChunkSpan.end({\n output: output !== undefined ? output : this.#accumulator,\n });\n this.#currentChunkSpan = undefined;\n this.#currentChunkType = undefined;\n this.#accumulator = {};\n this.#chunkSequence++;\n }\n\n /**\n * Create an event span (for single chunks like tool-call)\n */\n #createEventSpan(\n chunkType: string,\n output: any,\n options?: { attributes?: Record<string, any>; metadata?: Record<string, any> },\n ) {\n this.#ensureStepAndInference();\n\n const span = this.#chunkParent()?.createEventSpan({\n name: `chunk: '${chunkType}'`,\n type: SpanType.MODEL_CHUNK,\n attributes: {\n chunkType,\n sequenceNumber: this.#chunkSequence,\n ...options?.attributes,\n },\n metadata: options?.metadata,\n output,\n tracingPolicy: this.#modelSpan?.tracingPolicy,\n });\n\n if (span) {\n this.#chunkSequence++;\n }\n }\n\n /**\n * Check if there is currently an active chunk span\n */\n #hasActiveChunkSpan(): boolean {\n return !!this.#currentChunkSpan;\n }\n\n /**\n * Get the current accumulator value\n */\n #getAccumulator(): Record<string, any> {\n return this.#accumulator;\n }\n\n /**\n * Handle text chunk spans (text-start/delta/end)\n */\n #handleTextChunk<OUTPUT>(chunk: ChunkType<OUTPUT>) {\n switch (chunk.type) {\n case 'text-start':\n this.#startChunkSpan('text');\n break;\n\n case 'text-delta':\n // Auto-create span if we receive text-delta without text-start\n // (AI SDK streaming doesn't always emit wrapper events)\n // Allow transition from any other chunk type\n if (this.#currentChunkType !== 'text') {\n this.#startChunkSpan('text');\n }\n this.#appendToAccumulator('text', chunk.payload.text);\n break;\n\n case 'text-end': {\n this.#endChunkSpan();\n break;\n }\n }\n }\n\n /**\n * Handle reasoning chunk spans (reasoning-start/delta/end)\n */\n #handleReasoningChunk<OUTPUT>(chunk: ChunkType<OUTPUT>) {\n switch (chunk.type) {\n case 'reasoning-start':\n this.#startChunkSpan('reasoning');\n break;\n\n case 'reasoning-delta':\n // Auto-create span if we receive reasoning-delta without reasoning-start\n // (AI SDK streaming doesn't always emit wrapper events)\n // Allow transition from any other chunk type\n if (this.#currentChunkType !== 'reasoning') {\n this.#startChunkSpan('reasoning');\n }\n this.#appendToAccumulator('text', chunk.payload.text);\n break;\n\n case 'reasoning-end': {\n this.#endChunkSpan();\n break;\n }\n }\n }\n\n /**\n * Handle tool call chunk spans (tool-call-input-streaming-start/delta/end, tool-call)\n */\n #handleToolCallChunk<OUTPUT>(chunk: ChunkType<OUTPUT>) {\n switch (chunk.type) {\n case 'tool-call-input-streaming-start':\n this.#startChunkSpan('tool-call', {\n toolName: chunk.payload.toolName,\n toolCallId: chunk.payload.toolCallId,\n });\n break;\n\n case 'tool-call-delta':\n this.#appendToAccumulator('toolInput', chunk.payload.argsTextDelta);\n break;\n\n case 'tool-call-input-streaming-end':\n case 'tool-call': {\n // Build output with toolName, toolCallId, and parsed toolInput\n const acc = this.#getAccumulator();\n let toolInput;\n try {\n toolInput = acc.toolInput ? JSON.parse(acc.toolInput) : {};\n } catch {\n toolInput = acc.toolInput; // Keep as string if parsing fails\n }\n this.#endChunkSpan({\n toolName: acc.toolName,\n toolCallId: acc.toolCallId,\n toolInput,\n });\n break;\n }\n }\n }\n\n /**\n * Handle object chunk spans (object, object-result)\n */\n #handleObjectChunk<OUTPUT>(chunk: ChunkType<OUTPUT>) {\n switch (chunk.type) {\n case 'object':\n // Start span on first partial object chunk (only if not already started)\n // Multiple object chunks may arrive as the object is being generated\n // Check specifically for object chunk type to allow transitioning from other types\n if (this.#currentChunkType !== 'object') {\n this.#startChunkSpan('object');\n }\n break;\n\n case 'object-result':\n // End the span with the final complete object as output\n this.#endChunkSpan(chunk.object);\n break;\n }\n }\n\n /**\n * Handle tool-call-approval chunks.\n * Creates a span for approval requests so they can be seen in traces for debugging.\n */\n #handleToolApprovalChunk<OUTPUT>(chunk: ChunkType<OUTPUT>) {\n if (chunk.type !== 'tool-call-approval') return;\n const payload = chunk.payload;\n\n this.#ensureStepAndInference();\n\n // Create an event span for the approval request\n // Using createEventSpan since approvals are point-in-time events (not time ranges)\n const span = this.#chunkParent()?.createEventSpan({\n name: `chunk: 'tool-call-approval'`,\n type: SpanType.MODEL_CHUNK,\n attributes: {\n chunkType: 'tool-call-approval',\n sequenceNumber: this.#chunkSequence,\n },\n output: payload,\n tracingPolicy: this.#modelSpan?.tracingPolicy,\n });\n\n if (span) {\n this.#chunkSequence++;\n }\n }\n /**\n * Wraps a stream with model tracing transform to track MODEL_STEP and MODEL_CHUNK spans.\n *\n * This should be added to the stream pipeline to automatically\n * create MODEL_STEP and MODEL_CHUNK spans for each semantic unit in the stream.\n */\n wrapStream<T extends { pipeThrough: Function }>(stream: T): T {\n return stream.pipeThrough(\n new TransformStream({\n transform: (chunk, controller) => {\n // Capture completion start time on first actual content (for time-to-first-token)\n switch (chunk.type) {\n case 'text-delta':\n case 'tool-call-delta':\n case 'reasoning-delta':\n this.#captureCompletionStartTime();\n break;\n }\n\n controller.enqueue(chunk);\n\n // Handle chunk span tracking based on chunk type\n switch (chunk.type) {\n case 'text-start':\n case 'text-delta':\n case 'text-end':\n this.#handleTextChunk(chunk);\n break;\n\n case 'tool-call-input-streaming-start':\n case 'tool-call-delta':\n case 'tool-call-input-streaming-end':\n case 'tool-call':\n this.#handleToolCallChunk(chunk);\n break;\n\n case 'reasoning-start':\n case 'reasoning-delta':\n case 'reasoning-end':\n this.#handleReasoningChunk(chunk);\n break;\n\n case 'object':\n case 'object-result':\n this.#handleObjectChunk(chunk);\n break;\n\n case 'step-start':\n // If step already started (via startStep()), just update with payload data\n // Otherwise start a new step (for backwards compatibility)\n if (this.#currentStepSpan) {\n this.updateStep(chunk.payload);\n } else {\n this.startStep(chunk.payload);\n }\n // step-start fires when the provider stream has begun. Open the\n // inference span here as a safety net for callers that don't\n // explicitly call startInference() before invoking the model —\n // chunks that follow will parent under MODEL_INFERENCE.\n if (!this.#currentInferenceSpan) {\n this.startInference(chunk.payload);\n }\n break;\n\n case 'step-finish':\n if (this.#deferStepClose) {\n // Durable mode: save payload for later, don't close the step.\n // Close MODEL_INFERENCE eagerly though - the provider stream is\n // done, and any subsequent tool execution under the step should\n // not inflate inference duration.\n this.#pendingStepFinishPayload = chunk.payload;\n this.#endChunkSpan();\n this.#endInferenceSpan(chunk.payload);\n } else {\n // Normal mode: close the step immediately\n this.#endStepSpan(chunk.payload);\n }\n break;\n\n // Infrastructure chunks - skip creating spans for these\n // They are either redundant, metadata-only, or error/control flow\n case 'raw': // Redundant raw data\n case 'start': // Stream start marker\n case 'finish': // Stream finish marker (step-finish already captures this)\n case 'response-metadata': // Response metadata (not semantic content)\n case 'source': // Source references (metadata)\n case 'file': // Binary file data (too large/not semantic)\n case 'error': // Error handling\n case 'abort': // Abort signal\n case 'tripwire': // Processor rejection\n case 'watch': // Internal watch event\n case 'tool-error': // Tool error handling\n case 'tool-call-suspended': // Suspension (not content)\n case 'reasoning-signature': // Signature metadata\n case 'redacted-reasoning': // Redacted content metadata\n case 'step-output': // Step output wrapper (content is nested)\n // Don't create spans for these chunks\n break;\n\n case 'tool-call-approval': // Approval request - create span for debugging\n this.#handleToolApprovalChunk(chunk);\n break;\n\n case 'tool-output':\n // tool-output chunks are streaming progress from tools (e.g., sub-agents)\n // No span created - the final tool-result event captures the result\n break;\n\n case 'tool-result': {\n // tool-result is always a point-in-time event span\n // (tool execution duration is captured by the parent tool_call span)\n const {\n // Metadata - tool call context (unique to tool-result chunks)\n toolCallId,\n toolName,\n isError,\n dynamic,\n providerExecuted,\n providerMetadata,\n // Keep provider-executed results on MODEL_CHUNK because they come\n // from the model/provider stream and may not have a sibling TOOL_CALL span.\n // For locally executed tools, the canonical payload lives on TOOL_CALL.\n result,\n // Stripped - redundant (already on TOOL_CALL span input)\n args: _args,\n } = (chunk.payload as Record<string, any>) || {};\n\n // All tool-result specific fields go in metadata\n const metadata: Record<string, any> = { toolCallId, toolName };\n if (isError !== undefined) metadata.isError = isError;\n if (dynamic !== undefined) metadata.dynamic = dynamic;\n if (providerExecuted !== undefined) metadata.providerExecuted = providerExecuted;\n if (providerMetadata !== undefined) metadata.providerMetadata = providerMetadata;\n\n this.#createEventSpan(chunk.type, providerExecuted ? result : undefined, { metadata });\n break;\n }\n\n // Default: skip creating spans for unrecognized chunk types\n // All semantic content chunks should be explicitly handled above\n // Unknown chunks are likely infrastructure or custom chunks that don't need tracing\n default:\n // No span created - reduces trace noise\n break;\n }\n },\n }),\n ) as T;\n }\n}\n","import { SpanType, InternalSpans } from '@mastra/core/observability';\nimport type {\n Span,\n SpanTypeMap,\n AnySpan,\n ChildSpanOptions,\n ChildEventOptions,\n EndSpanOptions,\n ErrorSpanOptions,\n UpdateSpanOptions,\n CreateSpanOptions,\n ObservabilityInstance,\n ExportedSpan,\n TraceState,\n IModelSpanTracker,\n AIModelGenerationSpan,\n EntityType,\n TracingPolicy,\n CorrelationContext,\n} from '@mastra/core/observability';\n\nimport { ModelSpanTracker } from '../model-tracing';\nimport { deepClean, mergeSerializationOptions } from './serialization';\nimport type { DeepCleanOptions } from './serialization';\n\n/** Extended span type that includes getParentSpan method available on BaseSpan instances */\ntype AnyBaseSpan = AnySpan & { getParentSpan(includeInternalSpans?: boolean): AnySpan | undefined };\n\n/**\n * Determines if a span type should be considered internal based on flags.\n * Returns false if flags are undefined.\n */\nfunction isSpanInternal(spanType: SpanType, flags?: InternalSpans): boolean {\n if (flags === undefined || flags === InternalSpans.NONE) {\n return false;\n }\n\n switch (spanType) {\n // Workflow-related spans\n case SpanType.WORKFLOW_RUN:\n case SpanType.WORKFLOW_STEP:\n case SpanType.WORKFLOW_CONDITIONAL:\n case SpanType.WORKFLOW_CONDITIONAL_EVAL:\n case SpanType.WORKFLOW_PARALLEL:\n case SpanType.WORKFLOW_LOOP:\n case SpanType.WORKFLOW_SLEEP:\n case SpanType.WORKFLOW_WAIT_EVENT:\n return (flags & InternalSpans.WORKFLOW) !== 0;\n\n // Agent-related spans\n case SpanType.AGENT_RUN:\n return (flags & InternalSpans.AGENT) !== 0;\n\n // Tool-related spans\n case SpanType.TOOL_CALL:\n case SpanType.MCP_TOOL_CALL:\n return (flags & InternalSpans.TOOL) !== 0;\n\n // Model-related spans\n case SpanType.MODEL_GENERATION:\n case SpanType.MODEL_STEP:\n case SpanType.MODEL_INFERENCE:\n case SpanType.MODEL_CHUNK:\n return (flags & InternalSpans.MODEL) !== 0;\n\n // Default: never internal\n default:\n return false;\n }\n}\n\n/**\n * Get the external parent span ID from CreateSpanOptions.\n *\n * If the parent is internal, walks up the parent chain to find\n * the closest external ancestor. If the parent is already external,\n * returns its ID directly.\n *\n * This is useful when exporting spans to external observability systems\n * that shouldn't include internal framework spans.\n *\n * @param options - Span creation options\n * @returns The external parent span ID, or undefined if no external parent exists\n *\n * @example\n * ```typescript\n * // Parent is external - returns parent.id\n * const externalParent = { id: 'span-123', isInternal: false };\n * const options = { parent: externalParent, ... };\n * getExternalParentId(options); // 'span-123'\n *\n * // Parent is internal - walks up to find external ancestor\n * const externalGrandparent = { id: 'span-456', isInternal: false };\n * const internalParent = { id: 'span-123', isInternal: true, parent: externalGrandparent };\n * const options = { parent: internalParent, ... };\n * getExternalParentId(options); // 'span-456'\n * ```\n */\nexport function getExternalParentId(options: CreateSpanOptions<any>): string | undefined {\n if (!options.parent) {\n return undefined;\n }\n\n if (options.parent.isInternal) {\n // Parent is internal, find its external ancestor\n return options.parent.getParentSpanId(false);\n } else {\n // Parent is already external, use it directly\n return options.parent.id;\n }\n}\n\nexport abstract class BaseSpan<TType extends SpanType = any> implements Span<TType> {\n public abstract id: string;\n public abstract traceId: string;\n\n public name: string;\n public type: TType;\n public attributes: SpanTypeMap[TType];\n public parent?: AnySpan;\n public startTime: Date;\n public endTime?: Date;\n public isEvent: boolean;\n public isInternal: boolean;\n public tracingPolicy?: TracingPolicy;\n public observabilityInstance: ObservabilityInstance;\n public input?: any;\n public output?: any;\n public errorInfo?: {\n message: string;\n id?: string;\n name?: string;\n stack?: string;\n domain?: string;\n category?: string;\n details?: Record<string, any>;\n };\n public metadata?: Record<string, any>;\n public requestContext?: Record<string, any>;\n public tags?: string[];\n public traceState?: TraceState;\n /** Entity type that created the span (e.g., agent, workflow) */\n public entityType?: EntityType;\n /** Entity ID that created the span */\n public entityId?: string;\n /** Entity name that created the span */\n public entityName?: string;\n /** Parent span ID (for root spans that are children of external spans) */\n protected parentSpanId?: string;\n /** Deep clean options for serialization */\n protected deepCleanOptions: DeepCleanOptions;\n /**\n * Whether this span is filtered out before export. When true, BaseSpan/\n * DefaultSpan skip attaching attributes/input/output/errorInfo/requestContext\n * entirely -- they are never read on excluded spans, and skipping avoids\n * both the deepClean cost and holding references to large payloads for\n * the lifetime of the span. Set when excludeSpanTypes drops the type,\n * when the span is internal and includeInternalSpans is false, or when\n * the subclass is always excluded (e.g., NoOpSpan).\n *\n * Note: metadata is still attached and deepCleaned because it is read in\n * process by getCorrelationContext() and by getLoggerContext() /\n * getMetricsContext() (which structuredClone it).\n */\n protected isExcluded: boolean;\n /** Cached canonical correlation context for this live span */\n protected correlationContext?: CorrelationContext;\n\n /**\n * Subclasses can override to unconditionally mark the span as excluded.\n * NoOpSpan uses this because it is never exported regardless of config.\n */\n protected get alwaysExcluded(): boolean {\n return false;\n }\n\n constructor(options: CreateSpanOptions<TType>, observabilityInstance: ObservabilityInstance) {\n // Get serialization options from observability instance config\n const observabilityConfig = observabilityInstance.getConfig();\n this.deepCleanOptions = mergeSerializationOptions(observabilityConfig.serializationOptions);\n\n this.name = options.name;\n this.type = options.type;\n this.isInternal = isSpanInternal(this.type, options.tracingPolicy?.internal);\n\n // Determine up front whether this span will ever reach exporters.\n // getSpanForExport() drops these same spans before export, so we can\n // skip both the deepClean cost and the retention of large payload\n // references for the lifetime of the span (notably per-chunk\n // MODEL_CHUNK spans when excludeSpanTypes: [MODEL_CHUNK] is set).\n this.isExcluded =\n this.alwaysExcluded ||\n observabilityConfig.excludeSpanTypes?.includes(this.type) === true ||\n (this.isInternal && !observabilityConfig.includeInternalSpans);\n\n // Metadata is always attached and deepCleaned: it is read in-process\n // by getCorrelationContext() and by getLoggerContext() /\n // getMetricsContext() (which structuredClone it), and non-filtered\n // child spans inherit it via options.parent?.metadata.\n this.metadata = deepClean(\n options.parent?.metadata || options.metadata ? { ...options.parent?.metadata, ...options.metadata } : undefined,\n this.deepCleanOptions,\n );\n\n if (options.requestContext && options.requestContext.size() > 0) {\n this.requestContext = deepClean(options.requestContext.all, this.deepCleanOptions);\n }\n\n this.parent = options.parent;\n this.startTime = options.startTime ?? new Date();\n this.observabilityInstance = observabilityInstance;\n this.isEvent = options.isEvent ?? false;\n this.tracingPolicy = options.tracingPolicy;\n this.traceState = options.traceState;\n // Tags are only set for root spans (spans without a parent)\n this.tags = !options.parent && options.tags?.length ? options.tags : undefined;\n // Entity identification - inherit from closest non-internal parent if not explicitly provided\n const entityParent = this.getParentSpan(false);\n this.entityType = options.entityType ?? entityParent?.entityType;\n this.entityId = options.entityId ?? entityParent?.entityId;\n this.entityName = options.entityName ?? entityParent?.entityName;\n\n if (this.isExcluded) {\n // Keep the shape of attributes stable for any live-span reader.\n // input/output/errorInfo/requestContext stay undefined.\n this.attributes = {} as SpanTypeMap[TType];\n return;\n }\n\n this.attributes = deepClean(options.attributes, this.deepCleanOptions) || ({} as SpanTypeMap[TType]);\n if (options.requestContext && options.requestContext.size() > 0) {\n this.requestContext = deepClean(options.requestContext.all, this.deepCleanOptions);\n }\n\n if (this.isEvent) {\n // Event spans don't have endTime or input.\n // Event spans are immediately emitted by the BaseObservability class via the end() event.\n this.output = deepClean(options.output, this.deepCleanOptions);\n } else {\n this.input = deepClean(options.input, this.deepCleanOptions);\n }\n }\n\n // Methods for span lifecycle\n /** End the span */\n abstract end(options?: EndSpanOptions<TType>): void;\n\n /** Record an error for the span, optionally end the span as well */\n abstract error(options: ErrorSpanOptions<TType>): void;\n\n /** Update span attributes */\n abstract update(options: UpdateSpanOptions<TType>): void;\n\n createChildSpan(options: ChildSpanOptions<SpanType.MODEL_GENERATION>): AIModelGenerationSpan;\n createChildSpan<TChildType extends SpanType>(options: ChildSpanOptions<TChildType>): Span<TChildType> {\n return this.observabilityInstance.startSpan<TChildType>({ ...options, parent: this, isEvent: false });\n }\n\n createEventSpan<TChildType extends SpanType>(options: ChildEventOptions<TChildType>): Span<TChildType> {\n return this.observabilityInstance.startSpan<TChildType>({ ...options, parent: this, isEvent: true });\n }\n\n /**\n * Create a ModelSpanTracker for this span (only works if this is a MODEL_GENERATION span)\n * Returns undefined for non-MODEL_GENERATION spans\n */\n createTracker(): IModelSpanTracker | undefined {\n // Only create tracker for MODEL_GENERATION spans\n if (this.type !== SpanType.MODEL_GENERATION) {\n return undefined;\n }\n\n return new ModelSpanTracker(this as Span<SpanType.MODEL_GENERATION>);\n }\n\n /** Returns `TRUE` if the span is the root span of a trace */\n get isRootSpan(): boolean {\n return !this.parent;\n }\n\n /** Returns `TRUE` if the span is a valid span (not a NO-OP Span) */\n abstract get isValid(): boolean;\n\n /** Get the closest parent span, optionally skipping internal spans */\n public getParentSpan(includeInternalSpans?: boolean): AnySpan | undefined {\n if (!this.parent) {\n return undefined;\n }\n if (includeInternalSpans) return this.parent;\n if (this.parent.isInternal) return (this.parent as AnyBaseSpan).getParentSpan(includeInternalSpans);\n return this.parent;\n }\n\n /** Get the closest parent spanId that isn't an internal span */\n public getParentSpanId(includeInternalSpans?: boolean): string | undefined {\n if (!this.parent) {\n // Return parent span ID if available (for root spans with external parent)\n return this.parentSpanId;\n }\n const parentSpan = this.getParentSpan(includeInternalSpans);\n if (parentSpan) {\n return parentSpan.id;\n }\n // All ancestors are internal, recurse to get root's parentSpanId\n return this.parent.getParentSpanId(includeInternalSpans);\n }\n\n /** Find the closest parent span of a specific type by walking up the parent chain */\n public findParent<T extends SpanType>(spanType: T): Span<T> | undefined {\n let current: AnySpan | undefined = this.parent;\n\n while (current) {\n if (current.type === spanType) {\n return current as Span<T>;\n }\n current = current.parent;\n }\n\n return undefined;\n }\n\n /** Build and cache the canonical correlation context for this live span. */\n public getCorrelationContext(): CorrelationContext {\n if (this.correlationContext) {\n return this.correlationContext;\n }\n\n const metadata = this.metadata ?? {};\n const getMetadataString = (key: string): string | undefined =>\n typeof metadata[key] === 'string' ? metadata[key] : undefined;\n const getSpanMetadataString = (span: AnySpan | null | undefined, key: string): string | undefined => {\n const m = span?.metadata;\n return m && typeof m[key] === 'string' ? m[key] : undefined;\n };\n const parentSpan = this.getParentSpan(false);\n\n let rootSpan: AnySpan = this;\n while (rootSpan.parent) {\n rootSpan = rootSpan.parent;\n }\n\n const rootTags = rootSpan.tags?.length ? [...rootSpan.tags] : undefined;\n\n this.correlationContext = {\n traceId: this.traceId,\n spanId: this.id,\n tags: rootTags,\n entityType: this.entityType,\n entityId: this.entityId,\n entityName: this.entityName,\n entityVersionId: getMetadataString('entityVersionId'),\n parentEntityType: parentSpan?.entityType,\n parentEntityId: parentSpan?.entityId,\n parentEntityName: parentSpan?.entityName,\n parentEntityVersionId: getSpanMetadataString(parentSpan, 'entityVersionId'),\n rootEntityType: rootSpan.entityType,\n rootEntityId: rootSpan.entityId,\n rootEntityName: rootSpan.entityName,\n rootEntityVersionId: getSpanMetadataString(rootSpan, 'entityVersionId'),\n userId: getMetadataString('userId'),\n organizationId: getMetadataString('organizationId'),\n resourceId: getMetadataString('resourceId'),\n runId: getMetadataString('runId'),\n sessionId: getMetadataString('sessionId'),\n threadId: getMetadataString('threadId'),\n requestId: getMetadataString('requestId'),\n environment: getMetadataString('environment') ?? this.observabilityInstance.getMastraEnvironment?.(),\n source: getMetadataString('source'),\n serviceName: getMetadataString('serviceName') ?? this.observabilityInstance.getConfig().serviceName,\n experimentId: getMetadataString('experimentId'),\n };\n\n return this.correlationContext;\n }\n\n /** Returns a lightweight span ready for export */\n public exportSpan(includeInternalSpans?: boolean): ExportedSpan<TType> {\n // Check if input/output should be hidden based on traceState\n const hideInput = this.traceState?.hideInput ?? false;\n const hideOutput = this.traceState?.hideOutput ?? false;\n\n return {\n id: this.id,\n traceId: this.traceId,\n name: this.name,\n type: this.type,\n entityType: this.entityType,\n entityId: this.entityId,\n entityName: this.entityName,\n attributes: this.attributes,\n metadata: this.metadata,\n startTime: this.startTime,\n endTime: this.endTime,\n input: hideInput ? undefined : this.input,\n output: hideOutput ? undefined : this.output,\n errorInfo: this.errorInfo,\n requestContext: this.requestContext,\n isEvent: this.isEvent,\n isRootSpan: this.isRootSpan,\n parentSpanId: this.getParentSpanId(includeInternalSpans),\n // Tags are only included for root spans\n ...(this.isRootSpan && this.tags?.length ? { tags: this.tags } : {}),\n };\n }\n\n get externalTraceId(): string | undefined {\n return this.isValid ? this.traceId : undefined;\n }\n\n /**\n * Execute an async function within this span's tracing context.\n * Delegates to the bridge if available.\n */\n async executeInContext<T>(fn: () => Promise<T>): Promise<T> {\n const bridge = this.observabilityInstance.getBridge();\n\n if (bridge?.executeInContext) {\n const bridgeContextSpan = this.isInternal ? this.getParentSpan(false) : this;\n return bridge.executeInContext(bridgeContextSpan?.id ?? this.id, fn);\n }\n\n return fn();\n }\n\n /**\n * Execute a synchronous function within this span's tracing context.\n * Delegates to the bridge if available.\n */\n executeInContextSync<T>(fn: () => T): T {\n const bridge = this.observabilityInstance.getBridge();\n\n if (bridge?.executeInContextSync) {\n const bridgeContextSpan = this.isInternal ? this.getParentSpan(false) : this;\n return bridge.executeInContextSync(bridgeContextSpan?.id ?? this.id, fn);\n }\n\n return fn();\n }\n}\n","import { MastraError } from '@mastra/core/error';\nimport type {\n SpanType,\n ObservabilityInstance,\n EndSpanOptions,\n ErrorSpanOptions,\n UpdateSpanOptions,\n CreateSpanOptions,\n} from '@mastra/core/observability';\nimport { BaseSpan } from './base';\nimport { deepClean } from './serialization';\n\nexport class DefaultSpan<TType extends SpanType> extends BaseSpan<TType> {\n public id: string;\n public traceId: string;\n\n constructor(options: CreateSpanOptions<TType>, observabilityInstance: ObservabilityInstance) {\n super(options, observabilityInstance);\n\n // If spanId and traceId are provided, this is a rebuilt span - use provided IDs directly\n if (options.spanId && options.traceId) {\n this.id = options.spanId;\n this.traceId = options.traceId;\n if (options.parentSpanId) {\n this.parentSpanId = options.parentSpanId;\n }\n return;\n }\n\n // If bridge and not internal span, use bridge to init span\n const bridge = observabilityInstance.getBridge();\n if (bridge && !this.isInternal) {\n const bridgeIds = bridge.createSpan(options);\n if (bridgeIds) {\n this.id = bridgeIds.spanId;\n this.traceId = bridgeIds.traceId;\n this.parentSpanId = bridgeIds.parentSpanId;\n return;\n }\n }\n\n // No bridge or bridge failed - generate IDs ourselves\n if (options.parent) {\n this.traceId = options.parent.traceId;\n this.parentSpanId = options.parent.id;\n this.id = generateSpanId();\n return;\n }\n\n this.traceId = getOrCreateTraceId(options);\n this.id = generateSpanId();\n\n if (options.parentSpanId) {\n if (isValidSpanId(options.parentSpanId)) {\n this.parentSpanId = options.parentSpanId;\n } else {\n console.error(\n `[Mastra Tracing] Invalid parentSpanId: must be 1-16 hexadecimal characters, got \"${options.parentSpanId}\". Ignoring.`,\n );\n }\n }\n }\n\n end(options?: EndSpanOptions<TType>): void {\n if (this.isEvent) {\n return;\n }\n this.endTime = new Date();\n // Metadata is always updated (read by correlation/logger/metrics contexts).\n if (options?.metadata) {\n this.metadata = { ...this.metadata, ...deepClean(options.metadata, this.deepCleanOptions) };\n }\n if (this.isExcluded) {\n // Span is filtered before export; skip attaching heavy fields.\n return;\n }\n if (options?.output !== undefined) {\n this.output = deepClean(options.output, this.deepCleanOptions);\n }\n if (options?.attributes) {\n this.attributes = { ...this.attributes, ...deepClean(options.attributes, this.deepCleanOptions) };\n }\n // Tracing events automatically handled by base class\n }\n\n error(options: ErrorSpanOptions<TType>): void {\n if (this.isEvent) {\n return;\n }\n\n const { error, endSpan = true, attributes, metadata } = options;\n\n if (metadata) {\n this.metadata = { ...this.metadata, ...deepClean(metadata, this.deepCleanOptions) };\n }\n\n if (!this.isExcluded) {\n this.errorInfo = deepClean(\n error instanceof MastraError\n ? {\n id: error.id,\n details: error.details,\n category: error.category,\n domain: error.domain,\n message: error.message,\n name: error.name,\n // Prefer the original cause's stack when available. MastraError wraps\n // thrown errors, so its own stack points to the wrapping site rather\n // than where the underlying error was thrown.\n stack: (error.cause instanceof Error && error.cause.stack) || error.stack,\n }\n : {\n message: error.message,\n name: error.name,\n stack: error.stack,\n },\n this.deepCleanOptions,\n );\n\n if (attributes) {\n this.attributes = { ...this.attributes, ...deepClean(attributes, this.deepCleanOptions) };\n }\n }\n\n if (endSpan) {\n this.end();\n } else {\n // Trigger span update event when not ending the span\n this.update({});\n }\n }\n\n update(options: UpdateSpanOptions<TType>): void {\n if (this.isEvent) {\n return;\n }\n\n if (options.name !== undefined) {\n this.name = options.name;\n }\n // Metadata is always updated (read by correlation/logger/metrics contexts).\n if (options.metadata) {\n this.metadata = { ...this.metadata, ...deepClean(options.metadata, this.deepCleanOptions) };\n }\n if (this.isExcluded) {\n return;\n }\n if (options.input !== undefined) {\n this.input = deepClean(options.input, this.deepCleanOptions);\n }\n if (options.output !== undefined) {\n this.output = deepClean(options.output, this.deepCleanOptions);\n }\n if (options.attributes) {\n this.attributes = { ...this.attributes, ...deepClean(options.attributes, this.deepCleanOptions) };\n }\n // Tracing events automatically handled by base class\n }\n\n get isValid(): boolean {\n return true;\n }\n\n async export(): Promise<string> {\n return JSON.stringify({\n spanId: this.id,\n traceId: this.traceId,\n startTime: this.startTime,\n endTime: this.endTime,\n attributes: this.attributes,\n metadata: this.metadata,\n });\n }\n}\n\n/**\n * Generate OpenTelemetry-compatible span ID (64-bit, 16 hex chars)\n */\nfunction fillRandomBytes(bytes: Uint8Array): void {\n try {\n // Use Web Crypto API with proper this binding\n const webCrypto = globalThis.crypto;\n if (webCrypto?.getRandomValues) {\n webCrypto.getRandomValues.call(webCrypto, bytes);\n return;\n }\n } catch {\n // Fall through to fallback\n }\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = Math.floor(Math.random() * 256);\n }\n}\n\nfunction generateSpanId(): string {\n const bytes = new Uint8Array(8);\n fillRandomBytes(bytes);\n return Array.from(bytes, byte => byte.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Generate OpenTelemetry-compatible trace ID (128-bit, 32 hex chars)\n */\nfunction generateTraceId(): string {\n const bytes = new Uint8Array(16);\n fillRandomBytes(bytes);\n return Array.from(bytes, byte => byte.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Validate OpenTelemetry-compatible trace ID (1-32 hex characters)\n */\nfunction isValidTraceId(traceId: string): boolean {\n return /^[0-9a-f]{1,32}$/i.test(traceId);\n}\n\n/**\n * Validate OpenTelemetry-compatible span ID (1-16 hex characters)\n */\nfunction isValidSpanId(spanId: string): boolean {\n return /^[0-9a-f]{1,16}$/i.test(spanId);\n}\n\nfunction getOrCreateTraceId(options: CreateSpanOptions<SpanType>): string {\n if (options.traceId) {\n if (isValidTraceId(options.traceId)) {\n return options.traceId;\n } else {\n console.error(\n `[Mastra Tracing] Invalid traceId: must be 1-32 hexadecimal characters, got \"${options.traceId}\". Generating new trace ID.`,\n );\n }\n }\n return generateTraceId();\n}\n","/**\n * NoOpSpan Implementation for Mastra Observability\n */\n\nimport type {\n ObservabilityInstance,\n SpanType,\n CreateSpanOptions,\n EndSpanOptions,\n UpdateSpanOptions,\n ErrorSpanOptions,\n} from '@mastra/core/observability';\nimport { BaseSpan } from './base';\n\nexport class NoOpSpan<TType extends SpanType = any> extends BaseSpan<TType> {\n public id: string;\n public traceId: string;\n\n constructor(options: CreateSpanOptions<TType>, observabilityInstance: ObservabilityInstance) {\n super(options, observabilityInstance);\n this.id = 'no-op';\n this.traceId = 'no-op-trace';\n }\n\n end(_options?: EndSpanOptions<TType>): void {}\n\n error(_options: ErrorSpanOptions<TType>): void {}\n\n update(_options: UpdateSpanOptions<TType>): void {}\n\n get isValid(): boolean {\n return false;\n }\n\n // NoOpSpan is never exported, so treat it as always excluded.\n protected override get alwaysExcluded(): boolean {\n return true;\n }\n}\n","/**\n * BaseObservability - Abstract base class for Observability implementations\n */\n\nimport { MastraBase } from '@mastra/core/base';\nimport type { RequestContext } from '@mastra/core/di';\nimport type { IMastraLogger } from '@mastra/core/logger';\nimport { RegisteredLogger } from '@mastra/core/logger';\nimport { SpanType, TracingEventType, noOpLoggerContext } from '@mastra/core/observability';\nimport type {\n Span,\n ObservabilityExporter,\n ObservabilityBridge,\n SpanOutputProcessor,\n TracingEvent,\n AnySpan,\n EndSpanOptions,\n UpdateSpanOptions,\n StartSpanOptions,\n CreateSpanOptions,\n ObservabilityInstance,\n CustomSamplerOptions,\n ExportedSpan,\n AnyExportedSpan,\n TraceState,\n TracingOptions,\n LoggerContext,\n MetricsContext,\n ObservabilityEvent,\n ModelGenerationAttributes,\n UsageStats,\n} from '@mastra/core/observability';\nimport { getNestedValue, setNestedValue } from '@mastra/core/utils';\nimport { ObservabilityBus } from '../bus';\nimport type { ObservabilityInstanceConfig } from '../config';\nimport { SamplingStrategyType } from '../config';\nimport { LoggerContextImpl } from '../context/logger';\nimport { MetricsContextImpl } from '../context/metrics';\nimport { emitAutoExtractedMetrics, emitTokenMetricsForUsage } from '../metrics/auto-extract';\nimport { CardinalityFilter } from '../metrics/cardinality';\nimport { NoOpSpan } from '../spans';\nimport { addUsageStats } from '../usage';\n\n// ============================================================================\n// Abstract Base Class\n// ============================================================================\n\n/**\n * Abstract base class for all Observability implementations in Mastra.\n */\nexport abstract class BaseObservabilityInstance extends MastraBase implements ObservabilityInstance {\n protected config: ObservabilityInstanceConfig;\n\n /**\n * Unified event bus for all observability signals.\n * Routes events to registered exporters based on event type.\n */\n protected observabilityBus: ObservabilityBus;\n\n /**\n * Cardinality filter for metrics label protection.\n */\n protected cardinalityFilter: CardinalityFilter;\n\n /**\n * Deployment environment propagated from the parent Mastra instance.\n * Set by `Observability.setMastraContext`, read by spans as a fallback when\n * a span's `metadata.environment` isn't set.\n */\n #mastraEnvironment?: string;\n\n constructor(config: ObservabilityInstanceConfig) {\n super({ component: RegisteredLogger.OBSERVABILITY, name: config.serviceName });\n\n // Apply defaults for optional fields\n this.config = {\n serviceName: config.serviceName,\n name: config.name,\n sampling: config.sampling ?? { type: SamplingStrategyType.ALWAYS },\n exporters: config.exporters ?? [],\n spanOutputProcessors: config.spanOutputProcessors ?? [],\n bridge: config.bridge ?? undefined,\n includeInternalSpans: config.includeInternalSpans ?? false,\n excludeSpanTypes: config.excludeSpanTypes,\n spanFilter: config.spanFilter,\n requestContextKeys: config.requestContextKeys ?? [],\n serializationOptions: config.serializationOptions,\n logging: config.logging,\n };\n\n // Initialize cardinality filter for metrics (uses user config or defaults)\n this.cardinalityFilter = new CardinalityFilter(config.cardinality);\n\n // Initialize the unified ObservabilityBus\n this.observabilityBus = new ObservabilityBus({\n serializationOptions: this.config.serializationOptions,\n });\n\n for (const exporter of this.exporters) {\n this.observabilityBus.registerExporter(exporter);\n }\n\n // Register bridge on the bus so it receives all signals (tracing + non-tracing)\n if (this.config.bridge) {\n this.observabilityBus.registerBridge(this.config.bridge);\n }\n\n // Initialize bridge if present\n if (this.config.bridge?.init) {\n this.config.bridge.init({ config: this.config });\n }\n }\n\n /**\n * Override setLogger to add Observability specific initialization log\n * and propagate logger to exporters and bridge\n */\n __setLogger(logger: IMastraLogger) {\n super.__setLogger(logger);\n\n // Propagate logger to all exporters that support it\n this.exporters.forEach(exporter => {\n if (typeof exporter.__setLogger === 'function') {\n exporter.__setLogger(logger);\n }\n });\n\n // Propagate logger to bridge if present\n if (this.config.bridge?.__setLogger) {\n this.config.bridge.__setLogger(logger);\n }\n\n // Log Observability initialization details after logger is properly set\n this.logger.debug(\n `[Observability] Initialized [service=${this.config.serviceName}] [instance=${this.config.name}] [sampling=${this.config.sampling?.type}] [bridge=${!!this.config.bridge}]`,\n );\n }\n\n // ============================================================================\n // Protected getters for clean config access\n // ============================================================================\n\n protected get exporters(): ObservabilityExporter[] {\n return this.config.exporters || [];\n }\n\n protected get spanOutputProcessors(): SpanOutputProcessor[] {\n return this.config.spanOutputProcessors || [];\n }\n\n // ============================================================================\n // Public API - Single type-safe span creation method\n // ============================================================================\n\n /**\n * Start a new span of a specific SpanType\n *\n * Sampling Decision:\n * - For root spans (no parent): Perform sampling check using the configured strategy\n * - For child spans: Inherit the sampling decision from the parent\n * - If parent is a NoOpSpan (not sampled), child is also a NoOpSpan\n * - If parent is a valid span (sampled), child is also sampled\n *\n * This ensures trace-level sampling: either all spans in a trace are sampled or none are.\n * See: https://github.com/mastra-ai/mastra/issues/11504\n */\n startSpan<TType extends SpanType>(options: StartSpanOptions<TType>): Span<TType> {\n const { customSamplerOptions, requestContext, metadata, tracingOptions, ...rest } = options;\n\n // Determine sampling: inherit from parent or make new decision for root spans\n if (options.parent) {\n // Child span: inherit sampling decision from parent\n // If parent is a NoOpSpan (not sampled), child should also be a NoOpSpan\n if (!options.parent.isValid) {\n return new NoOpSpan<TType>({ ...rest, metadata }, this);\n }\n // Parent is valid (sampled), so child will also be sampled - continue to create actual span\n } else {\n // Root span: perform sampling check\n if (!this.shouldSample(customSamplerOptions)) {\n return new NoOpSpan<TType>({ ...rest, metadata }, this);\n }\n }\n\n // Compute or inherit TraceState\n let traceState: TraceState | undefined;\n\n if (options.parent) {\n // Child span: inherit from parent\n traceState = options.parent.traceState;\n } else {\n // Root span: compute new TraceState\n traceState = this.computeTraceState(tracingOptions);\n }\n\n // Merge tracingOptions.metadata with span metadata (tracingOptions.metadata takes precedence for root spans)\n const tracingMetadata = !options.parent ? tracingOptions?.metadata : undefined;\n const mergedMetadata = metadata || tracingMetadata ? { ...metadata, ...tracingMetadata } : undefined;\n\n // Extract metadata from RequestContext\n const enrichedMetadata = this.extractMetadataFromRequestContext(requestContext, mergedMetadata, traceState);\n\n // Inject the Mastra-level environment into root-span metadata when nothing\n // upstream provided one. Root-only is sufficient because BaseSpan inherits\n // parent metadata, so descendants pick the value up automatically.\n // Persisting it on metadata (rather than only computing it in\n // getCorrelationContext) is what lets the storage record-builders populate\n // the `environment` column on SpanRecord, which is then read by stored\n // score/feedback events via RecordedSpan / RecordedTrace.addScore.\n const finalMetadata =\n !options.parent &&\n this.#mastraEnvironment !== undefined &&\n (enrichedMetadata === undefined || enrichedMetadata.environment === undefined)\n ? { ...(enrichedMetadata ?? {}), environment: this.#mastraEnvironment }\n : enrichedMetadata;\n\n // Tags are only passed for root spans (no parent)\n const tags = !options.parent ? tracingOptions?.tags : undefined;\n\n // Extract traceId and parentSpanId from tracingOptions for root spans (no parent)\n // These allow nested workflows to join the parent workflow's trace\n const traceId = !options.parent ? (options.traceId ?? tracingOptions?.traceId) : options.traceId;\n const parentSpanId = !options.parent\n ? (options.parentSpanId ?? tracingOptions?.parentSpanId)\n : options.parentSpanId;\n\n const span = this.createSpan<TType>({\n ...rest,\n traceId,\n parentSpanId,\n metadata: finalMetadata,\n traceState,\n tags,\n requestContext,\n });\n\n if (span.isEvent) {\n this.emitSpanEnded(span);\n } else {\n // Automatically wire up tracing lifecycle\n this.wireSpanLifecycle(span);\n\n // Emit span started event\n this.emitSpanStarted(span);\n }\n\n return span;\n }\n\n /**\n * Rebuild a span from exported data for lifecycle operations.\n * Used by durable execution engines (e.g., Inngest) to end/update spans\n * that were created in a previous durable operation.\n *\n * The rebuilt span:\n * - Does NOT emit SPAN_STARTED (assumes original span already did)\n * - Can have end(), update(), error() called on it\n * - Will emit SPAN_ENDED or SPAN_UPDATED when those methods are called\n *\n * @param cached - The exported span data to rebuild from\n * @returns A span that can have lifecycle methods called on it\n */\n rebuildSpan<TType extends SpanType>(cached: ExportedSpan<TType>): Span<TType> {\n // Create span with existing IDs from cached data\n const span = this.createSpan<TType>({\n name: cached.name,\n type: cached.type,\n traceId: cached.traceId,\n spanId: cached.id,\n parentSpanId: cached.parentSpanId,\n startTime: cached.startTime instanceof Date ? cached.startTime : new Date(cached.startTime),\n input: cached.input,\n attributes: cached.attributes,\n metadata: cached.metadata,\n entityType: cached.entityType,\n entityId: cached.entityId,\n entityName: cached.entityName,\n });\n\n // Wire up lifecycle events (but skip SPAN_STARTED since it was already emitted)\n this.wireSpanLifecycle(span);\n\n return span;\n }\n\n // ============================================================================\n // Abstract Methods - Must be implemented by concrete classes\n // ============================================================================\n\n /**\n * Create a new span (called after sampling)\n *\n * Implementations should:\n * 1. Create a plain span with the provided attributes\n * 2. Return the span - base class handles all tracing lifecycle automatically\n *\n * The base class will automatically:\n * - Set trace relationships\n * - Wire span lifecycle callbacks\n * - Emit span_started event\n */\n protected abstract createSpan<TType extends SpanType>(options: CreateSpanOptions<TType>): Span<TType>;\n\n // ============================================================================\n // Configuration Management\n // ============================================================================\n\n /**\n * Get current configuration\n */\n getConfig(): Readonly<ObservabilityInstanceConfig> {\n return { ...this.config };\n }\n\n /**\n * Returns the deployment environment propagated from the parent Mastra instance.\n * Spans use this as a fallback when `metadata.environment` isn't set.\n */\n getMastraEnvironment(): string | undefined {\n return this.#mastraEnvironment;\n }\n\n /**\n * Internal hook used by `Observability.setMastraContext` to push the\n * resolved Mastra-level environment into this instance.\n */\n __setMastraEnvironment(environment: string | undefined): void {\n this.#mastraEnvironment = environment;\n }\n\n // ============================================================================\n // Plugin Access\n // ============================================================================\n\n /**\n * Get all exporters\n */\n getExporters(): readonly ObservabilityExporter[] {\n return [...this.exporters];\n }\n\n /**\n * Register an additional exporter at runtime.\n * Adds to both the bus (for event routing) and the config (for getExporters).\n */\n registerExporter(exporter: ObservabilityExporter): void {\n this.observabilityBus.registerExporter(exporter);\n this.config.exporters ??= [];\n if (this.config.exporters.includes(exporter)) {\n return;\n }\n this.config.exporters.push(exporter);\n\n if (typeof exporter.__setLogger === 'function') {\n exporter.__setLogger(this.logger);\n }\n }\n\n /**\n * Get all span output processors\n */\n getSpanOutputProcessors(): readonly SpanOutputProcessor[] {\n return [...this.spanOutputProcessors];\n }\n\n /**\n * Get the bridge instance if configured\n */\n getBridge(): ObservabilityBridge | undefined {\n return this.config.bridge;\n }\n\n /**\n * Get the logger instance (for exporters and other components)\n */\n getLogger() {\n return this.logger;\n }\n\n /**\n * Get the ObservabilityBus for this instance.\n * The bus routes all observability events (tracing, logs, metrics, scores, feedback)\n * to registered exporters based on event type.\n */\n getObservabilityBus(): ObservabilityBus {\n return this.observabilityBus;\n }\n\n // ============================================================================\n // Context-factory bridge methods\n // ============================================================================\n\n /**\n * Get a LoggerContext correlated to a span.\n * Called by the context-factory in core (deriveLoggerContext) so that\n * `observabilityContext.loggerVNext` is a real logger instead of no-op.\n */\n getLoggerContext(span?: AnySpan): LoggerContext {\n if (this.config.logging?.enabled === false) {\n return noOpLoggerContext;\n }\n\n const correlationContext = span?.getCorrelationContext?.();\n const metadata: Record<string, unknown> | undefined = span?.metadata ? structuredClone(span.metadata) : undefined;\n\n return new LoggerContextImpl({\n traceId: span?.traceId,\n spanId: span?.id,\n correlationContext,\n metadata,\n observabilityBus: this.observabilityBus,\n minLevel: this.config.logging?.level,\n });\n }\n\n /**\n * Get a MetricsContext correlated to a span.\n * Called by the context-factory in core (deriveMetricsContext) so that\n * `observabilityContext.metrics` is a real metrics context instead of no-op.\n */\n getMetricsContext(span?: AnySpan): MetricsContext {\n const correlationContext = span?.getCorrelationContext?.();\n const metadata: Record<string, unknown> | undefined = span?.metadata ? structuredClone(span.metadata) : undefined;\n\n return new MetricsContextImpl({\n traceId: span?.traceId,\n spanId: span?.id,\n correlationContext,\n metadata,\n cardinalityFilter: this.cardinalityFilter,\n observabilityBus: this.observabilityBus,\n });\n }\n\n /**\n * Emit any observability event through the bus.\n * The bus routes the event to the appropriate handler on each registered exporter,\n * and for tracing events triggers auto-extracted metrics.\n */\n protected emitObservabilityEvent(event: ObservabilityEvent): void {\n this.observabilityBus.emit(event);\n }\n\n /**\n * Internal hook used by RecordedTrace/RecordedSpan hydration to route\n * non-tracing annotation events back through the normal exporter pipeline.\n */\n __emitRecordedEvent(event: ObservabilityEvent): void {\n this.emitObservabilityEvent(event);\n }\n\n /**\n * Internal hook used by the client observability proxy (`client/`)\n * to route already-validated events through the normal bus without\n * going through the live span lifecycle. The caller is responsible\n * for constructing well-formed `ExportedSpan`s/`ExportedLog`s and\n * for any validation needed.\n */\n __receiveExternalEvent(event: ObservabilityEvent): void {\n this.emitObservabilityEvent(event);\n }\n\n // ============================================================================\n // Span Lifecycle Management\n // ============================================================================\n\n /**\n * Automatically wires up Observability lifecycle events for any span\n * This ensures all spans emit events regardless of implementation\n */\n private wireSpanLifecycle<TType extends SpanType>(span: Span<TType>): void {\n // Skip wiring for filtered internal spans, except MODEL_GENERATION —\n // those need the wrap so captureModelUsageRollup can intercept usage\n // before originalEnd discards it. Other internal types (AGENT_RUN,\n // WORKFLOW_RUN, MODEL_STEP, MODEL_CHUNK, …) carry nothing to roll up,\n // and skipping the closure-per-span cost matters in streaming hot\n // paths like per-chunk MODEL_CHUNK spans.\n if (!this.config.includeInternalSpans && span.isInternal && span.type !== SpanType.MODEL_GENERATION) {\n return;\n }\n\n // Store original methods\n const originalEnd = span.end.bind(span);\n const originalUpdate = span.update.bind(span);\n\n // Wrap methods to automatically emit tracing events\n span.end = (options?: EndSpanOptions<TType>) => {\n if (span.isEvent) {\n this.logger.warn(`End event is not available on event spans`);\n return;\n }\n\n // Capture rollup usage BEFORE originalEnd runs: excluded spans\n // drop end-time attributes (see DefaultSpan#end), so the only\n // place to read MODEL_GENERATION usage for a filtered span is the\n // end() options being passed in right now.\n const rollupTarget = this.captureModelUsageRollup(span, options);\n\n originalEnd(options);\n\n if (rollupTarget) {\n this.applyUsageRollup(rollupTarget);\n }\n\n this.emitSpanEnded(span);\n };\n\n span.update = (options: UpdateSpanOptions<TType>) => {\n if (span.isEvent) {\n this.logger.warn(`Update() is not available on event spans`);\n return;\n }\n originalUpdate(options);\n this.emitSpanUpdated(span);\n };\n }\n\n // ============================================================================\n // Utility Methods\n // ============================================================================\n\n /**\n * Check if a trace should be sampled\n */\n protected shouldSample(options?: CustomSamplerOptions): boolean {\n // Check built-in sampling strategy\n const { sampling } = this.config;\n\n switch (sampling?.type) {\n case undefined:\n return true;\n case SamplingStrategyType.ALWAYS:\n return true;\n case SamplingStrategyType.NEVER:\n return false;\n case SamplingStrategyType.RATIO:\n if (sampling.probability === undefined || sampling.probability < 0 || sampling.probability > 1) {\n this.logger.warn(\n `Invalid sampling probability: ${sampling.probability}. Expected value between 0 and 1. Defaulting to no sampling.`,\n );\n return false;\n }\n return Math.random() < sampling.probability;\n case SamplingStrategyType.CUSTOM:\n return sampling.sampler(options);\n default:\n throw new Error(`Sampling strategy type not implemented: ${(sampling as any).type}`);\n }\n }\n\n /**\n * Compute TraceState for a new trace based on configured and per-request keys\n */\n protected computeTraceState(tracingOptions?: TracingOptions): TraceState | undefined {\n const configuredKeys = this.config.requestContextKeys ?? [];\n const additionalKeys = tracingOptions?.requestContextKeys ?? [];\n\n // Merge: configured + additional\n const allKeys = [...configuredKeys, ...additionalKeys];\n\n const hideInput = tracingOptions?.hideInput;\n const hideOutput = tracingOptions?.hideOutput;\n\n // Return undefined if no TraceState properties are needed\n if (allKeys.length === 0 && !hideInput && !hideOutput) {\n return undefined;\n }\n\n return {\n requestContextKeys: allKeys,\n ...(hideInput !== undefined && { hideInput }),\n ...(hideOutput !== undefined && { hideOutput }),\n };\n }\n\n /**\n * Extract metadata from RequestContext using TraceState\n */\n protected extractMetadataFromRequestContext(\n requestContext: RequestContext | undefined,\n explicitMetadata: Record<string, any> | undefined,\n traceState: TraceState | undefined,\n ): Record<string, any> | undefined {\n if (!requestContext || !traceState || traceState.requestContextKeys.length === 0) {\n return explicitMetadata;\n }\n\n const extracted = this.extractKeys(requestContext, traceState.requestContextKeys);\n\n // Only return an object if we have extracted or explicit metadata\n if (Object.keys(extracted).length === 0 && !explicitMetadata) {\n return undefined;\n }\n\n return {\n ...extracted,\n ...explicitMetadata, // Explicit metadata always wins\n };\n }\n\n /**\n * Extract specific keys from RequestContext\n */\n protected extractKeys(requestContext: RequestContext, keys: string[]): Record<string, any> {\n const result: Record<string, any> = {};\n\n for (const key of keys) {\n // Handle dot notation: get first part from RequestContext, then navigate nested properties\n const parts = key.split('.');\n const rootKey = parts[0]!; // parts[0] always exists since key is a non-empty string\n const value = requestContext.get(rootKey);\n\n if (value !== undefined) {\n // If there are nested parts, extract them from the value\n if (parts.length > 1) {\n const nestedPath = parts.slice(1).join('.');\n const nestedValue = getNestedValue(value, nestedPath);\n if (nestedValue !== undefined) {\n setNestedValue(result, key, nestedValue);\n }\n } else {\n // Simple key, set directly\n setNestedValue(result, key, value);\n }\n }\n }\n\n return result;\n }\n\n /**\n * Process a span through all output processors\n */\n private processSpan(span?: AnySpan): AnySpan | undefined {\n for (const processor of this.spanOutputProcessors) {\n if (!span) {\n break;\n }\n\n try {\n span = processor.process(span);\n } catch (error) {\n this.logger.error(`[Observability] Processor error [name=${processor.name}]`, error);\n // Continue with other processors\n }\n }\n\n return span;\n }\n\n // ============================================================================\n // Event-driven Export Methods\n // ============================================================================\n\n /** Process a span through output processors and export it, returning undefined if filtered out. */\n getSpanForExport(span: AnySpan): AnyExportedSpan | undefined {\n if (!span.isValid) return undefined;\n if (span.isInternal && !this.config.includeInternalSpans) return undefined;\n\n // Check excludeSpanTypes before processing\n if (this.config.excludeSpanTypes?.includes(span.type)) return undefined;\n\n const processedSpan = this.processSpan(span);\n const exportedSpan = processedSpan?.exportSpan(this.config.includeInternalSpans);\n if (!exportedSpan) return undefined;\n\n // Apply spanFilter on the exported span data\n if (this.config.spanFilter) {\n try {\n if (!this.config.spanFilter(exportedSpan)) return undefined;\n } catch (error) {\n this.logger.error(`[Observability] spanFilter error`, error);\n // On filter error, keep the span to avoid silent data loss\n }\n }\n\n return exportedSpan;\n }\n\n /**\n * Emit a span started event.\n * Routes through the ObservabilityBus so exporters receive it via onTracingEvent.\n */\n protected emitSpanStarted(span: AnySpan): void {\n const exportedSpan = this.getSpanForExport(span);\n if (exportedSpan) {\n const event: TracingEvent = { type: TracingEventType.SPAN_STARTED, exportedSpan };\n this.emitTracingEvent(event);\n }\n }\n\n /**\n * Emit a span ended event (called automatically when spans end).\n * Emits any auto-extracted metrics while the live span tree is still available,\n * then routes the exported tracing event through the ObservabilityBus.\n */\n protected emitSpanEnded(span: AnySpan): void {\n const exportedSpan = this.getSpanForExport(span);\n\n if (exportedSpan) {\n try {\n // TODO: We intentionally export first so auto-extracted metrics are skipped\n // when the span is filtered out by processors. Metrics still use the live\n // span for correlation and parent traversal, but current span processors\n // mutate spans in place during export, so those mutations can still affect\n // the live span before metrics run. Future options to explore:\n // 1. Make span processors pure/non-mutating.\n // 2. Split trace processors from metric-specific processors/enrichers.\n // 3. Revisit whether auto-extracted metrics should run before export.\n emitAutoExtractedMetrics(span, this.getMetricsContext(span));\n } catch (err) {\n this.logger.error('[Observability] Auto-extraction error:', err);\n }\n\n const event: TracingEvent = { type: TracingEventType.SPAN_ENDED, exportedSpan };\n this.emitTracingEvent(event);\n }\n }\n\n /**\n * Emit a span updated event.\n * Routes through the ObservabilityBus so exporters receive it via onTracingEvent.\n */\n protected emitSpanUpdated(span: AnySpan): void {\n const exportedSpan = this.getSpanForExport(span);\n if (exportedSpan) {\n const event: TracingEvent = { type: TracingEventType.SPAN_UPDATED, exportedSpan };\n this.emitTracingEvent(event);\n }\n }\n\n /**\n * When an internal MODEL_GENERATION span ends, capture the rollup payload\n * (usage, provider, model, target ancestor) needed to attribute its cost\n * to the closest exported ancestor span. Returns undefined when no rollup\n * applies — non-MODEL_GENERATION spans, spans that will be exported, or\n * spans whose usage isn't available at end time.\n */\n private captureModelUsageRollup<TType extends SpanType>(\n span: Span<TType>,\n endOptions: EndSpanOptions<TType> | undefined,\n ): { ancestor: AnySpan; usage: UsageStats; provider?: string; model?: string } | undefined {\n if (span.type !== SpanType.MODEL_GENERATION) return undefined;\n // If the span itself will be exported, the existing auto-extract pipeline\n // emits its metrics; nothing to roll up.\n if (!span.isInternal || this.config.includeInternalSpans) return undefined;\n\n // For excluded spans, end() options carry the only copy of attributes —\n // the live span discards them in DefaultSpan#end. The liveAttrs fallback\n // is dead for the default implementation but kept for non-DefaultSpan\n // Span implementations that might preserve attributes on excluded spans.\n const endAttrs = (endOptions?.attributes as ModelGenerationAttributes | undefined) ?? undefined;\n const liveAttrs = span.attributes as ModelGenerationAttributes | undefined;\n const usage = endAttrs?.usage ?? liveAttrs?.usage;\n if (!usage) return undefined;\n\n const ancestor = this.findExportedAncestor(span);\n if (!ancestor) return undefined;\n\n const provider = endAttrs?.provider ?? liveAttrs?.provider;\n const model = endAttrs?.responseModel ?? endAttrs?.model ?? liveAttrs?.responseModel ?? liveAttrs?.model;\n\n return { ancestor, usage, provider, model };\n }\n\n /**\n * Accumulate usage onto the ancestor's `internalUsage` attribute (for trace\n * UI visibility) and emit auto-extracted token metrics now, using the\n * ancestor's metrics context so cost / token labels point at the visible\n * span instead of the hidden agent that incurred them.\n */\n private applyUsageRollup(target: { ancestor: AnySpan; usage: UsageStats; provider?: string; model?: string }): void {\n const { ancestor, usage, provider, model } = target;\n\n // Mutate the live ancestor's attributes directly. BaseSpan's constructor\n // guarantees `attributes` is always at least `{}` (see spans/base.ts),\n // and the ancestor hasn't ended yet (we're inside a descendant's end()),\n // so the export will pick up the mutated field.\n const attrs = ancestor.attributes as { internalUsage?: UsageStats };\n attrs.internalUsage = addUsageStats(attrs.internalUsage, usage);\n\n try {\n emitTokenMetricsForUsage(usage, provider, model, this.getMetricsContext(ancestor));\n } catch (err) {\n this.logger.error('[Observability] Usage rollup metric emission error:', err);\n }\n }\n\n /**\n * Walk up the parent chain to find the closest ancestor that will actually\n * reach exporters. Skips both internal-filtered ancestors and ancestors\n * whose type matches `excludeSpanTypes`, so the rollup target is one whose\n * mutated `internalUsage` attribute is visible in exported traces.\n *\n * Note: this does not preemptively run `spanFilter` — that filter can be\n * async and have side effects, so the rare case of a `spanFilter`-dropped\n * ancestor falls through.\n */\n private findExportedAncestor(span: AnySpan): AnySpan | undefined {\n let ancestor: AnySpan | undefined = span.parent;\n while (ancestor && this.isFilteredFromExport(ancestor)) {\n ancestor = ancestor.parent;\n }\n return ancestor;\n }\n\n /**\n * Returns true when a span would be dropped by `getSpanForExport` for a\n * reason cheap to check up-front (internal-span filtering or\n * `excludeSpanTypes`). Used by `findExportedAncestor` to skip rollup\n * targets that would silently lose their `internalUsage` attribute.\n */\n private isFilteredFromExport(span: AnySpan): boolean {\n if (span.isInternal && !this.config.includeInternalSpans) return true;\n if (this.config.excludeSpanTypes?.includes(span.type)) return true;\n return false;\n }\n\n /**\n * Emit a tracing event through the bus.\n *\n * The bus routes the event to each registered exporter's and bridge's\n * onTracingEvent handler.\n */\n private emitTracingEvent(event: TracingEvent): void {\n this.observabilityBus.emit(event);\n }\n\n /**\n * Export tracing event through all exporters and bridge.\n *\n * @deprecated Prefer emitTracingEvent() which routes through the bus.\n * Kept for backward compatibility with subclasses that may override it.\n */\n protected async exportTracingEvent(event: TracingEvent): Promise<void> {\n // Collect all export targets\n const targets: Array<{ name: string; exportTracingEvent: (event: TracingEvent) => Promise<void> }> = [\n ...this.exporters,\n ];\n\n // Add bridge if present\n if (this.config.bridge) {\n targets.push(this.config.bridge);\n }\n\n // Export to all targets\n const exportPromises = targets.map(async target => {\n try {\n await target.exportTracingEvent(event);\n this.logger.debug(`[Observability] Event exported [target=${target.name}] [type=${event.type}]`);\n } catch (error) {\n this.logger.error(`[Observability] Export error [target=${target.name}]`, error);\n // Don't rethrow - continue with other targets\n }\n });\n\n await Promise.allSettled(exportPromises);\n }\n\n // ============================================================================\n // Lifecycle Management\n // ============================================================================\n\n /**\n * Initialize Observability (called by Mastra during component registration)\n */\n init(): void {\n this.logger.debug(`[Observability] Initialization started [name=${this.name}]`);\n\n // Any initialization logic for the Observability system\n // This could include setting up queues, starting background processes, etc.\n\n this.logger.info(`[Observability] Initialized successfully [name=${this.name}]`);\n }\n\n /**\n * Flush all observability data: awaits in-flight handler promises, then\n * drains exporter and bridge SDK-internal buffers.\n *\n * Delegates to ObservabilityBus.flush() which owns the two-phase logic.\n *\n * This is critical for durable execution engines (e.g., Inngest) where\n * the process may be interrupted after a step completes. Calling flush()\n * outside the durable step ensures all span data reaches external systems.\n */\n async flush(): Promise<void> {\n this.logger.debug(`[Observability] Flush started [name=${this.name}]`);\n await this.observabilityBus.flush();\n this.logger.debug(`[Observability] Flush completed [name=${this.name}]`);\n }\n\n /**\n * Shutdown Observability and clean up resources\n */\n async shutdown(): Promise<void> {\n this.logger.debug(`[Observability] Shutdown started [name=${this.name}]`);\n\n // Phase 1: Shutdown the ObservabilityBus first (flushes remaining events, clears subscribers)\n await this.observabilityBus.shutdown();\n\n // Phase 2: Shutdown exporters, processors, and bridge after bus has flushed\n const shutdownPromises: Promise<void>[] = [\n ...this.exporters.map(e => e.shutdown()),\n ...this.spanOutputProcessors.map(p => p.shutdown()),\n ];\n if (this.config.bridge) {\n shutdownPromises.push(this.config.bridge.shutdown());\n }\n if (shutdownPromises.length > 0) {\n const results = await Promise.allSettled(shutdownPromises);\n for (const result of results) {\n if (result.status === 'rejected') {\n this.logger.error(`[Observability] Component shutdown failed [name=${this.name}]:`, result.reason);\n }\n }\n }\n\n this.logger.info(`[Observability] Shutdown completed [name=${this.name}]`);\n }\n}\n","export function generateClientSignalId(): string {\n return globalThis.crypto.randomUUID();\n}\n","/**\n * Hand-rolled OTLP/JSON decoder for the subset we need to ingest from\n * client-side tool execution.\n *\n * The full OTLP/JSON spec is defined in\n * https://opentelemetry.io/docs/specs/otlp/#otlphttp and the\n * opentelemetry-proto repo. We only consume `ResourceSpans` (for spans)\n * and `ResourceLogs` (for logs). The full message types are large and\n * include backwards-compat fields we never need; this walker reads the\n * fields we care about and ignores the rest.\n *\n * Using `@opentelemetry/otlp-transformer` would pull in the full proto\n * dependency tree (~hundreds of KB) for what amounts to a 100-line walker.\n */\n\nimport { SpanType } from '@mastra/core/observability';\nimport type { AnyExportedSpan, EntityType, ExportedLog, LogLevel } from '@mastra/core/observability';\n\nimport { generateClientSignalId } from './id';\n\n/**\n * Convert an OTLP nanosecond timestamp (string or number) to a JS Date.\n *\n * OTLP timestamps are uint64 nanoseconds since Unix epoch. JSON\n * marshalers serialize them as either decimal strings (recommended for\n * uint64 to avoid JS number precision loss) or numbers.\n */\nfunction nanosToDate(value: unknown): Date {\n if (typeof value === 'number') {\n return new Date(Math.round(value / 1e6));\n }\n if (typeof value === 'string') {\n // Avoid BigInt in hot path; just take the millisecond portion of the\n // decimal string. ns=19 chars max, ms=last 6 chars before the cut.\n if (value.length <= 6) return new Date(0);\n const ms = Number(value.slice(0, -6));\n return Number.isFinite(ms) ? new Date(ms) : new Date(0);\n }\n return new Date(0);\n}\n\n/**\n * OTLP attribute values are tagged unions:\n * `{ stringValue: \"...\" } | { intValue: 1 } | { boolValue: true } | ...`\n * Flatten to a plain `Record<string, unknown>` for our internal shape.\n */\nfunction flattenAttributes(otlpAttrs: unknown): Record<string, unknown> | undefined {\n if (!Array.isArray(otlpAttrs)) return undefined;\n const out: Record<string, unknown> = {};\n for (const attr of otlpAttrs) {\n if (!attr || typeof attr !== 'object') continue;\n const key = (attr as { key?: unknown }).key;\n if (typeof key !== 'string') continue;\n const v = (attr as { value?: unknown }).value;\n if (!v || typeof v !== 'object') continue;\n const value = v as Record<string, unknown>;\n if ('stringValue' in value) out[key] = value.stringValue;\n else if ('intValue' in value) out[key] = Number(value.intValue);\n else if ('doubleValue' in value) out[key] = value.doubleValue;\n else if ('boolValue' in value) out[key] = value.boolValue;\n else if ('arrayValue' in value || 'kvlistValue' in value) {\n // Nested values are uncommon for our use case; preserve raw shape.\n out[key] = value;\n }\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\n/**\n * Decoded shape of one span pulled out of an OTLP/JSON ResourceSpans\n * payload. Just enough fields to construct an ExportedSpan and forward\n * it through the bus.\n */\nexport interface DecodedOtlpSpan {\n traceId: string;\n spanId: string;\n parentSpanId?: string;\n name: string;\n startTime: Date;\n endTime?: Date;\n attributes?: Record<string, unknown>;\n /** OTLP status code: 0 unset, 1 ok, 2 error */\n statusCode?: number;\n statusMessage?: string;\n}\n\nexport interface DecodedOtlpLog {\n traceId: string;\n spanId?: string;\n timestamp: Date;\n /** OTLP severityText: \"INFO\", \"WARN\", etc. */\n severityText?: string;\n /** OTLP severityNumber: 1-24 */\n severityNumber?: number;\n body?: unknown;\n attributes?: Record<string, unknown>;\n}\n\n/**\n * Walk an OTLP/JSON ResourceSpans payload and return a flat list of\n * decoded spans. Returns an empty array (and never throws) if the\n * payload is malformed.\n */\nexport function decodeResourceSpans(payload: unknown): DecodedOtlpSpan[] {\n const out: DecodedOtlpSpan[] = [];\n const resourceSpans = (payload as { resourceSpans?: unknown[] } | undefined)?.resourceSpans;\n if (!Array.isArray(resourceSpans)) return out;\n\n for (const rs of resourceSpans) {\n const scopeSpans = (rs as { scopeSpans?: unknown[] } | undefined)?.scopeSpans;\n if (!Array.isArray(scopeSpans)) continue;\n for (const ss of scopeSpans) {\n const spans = (ss as { spans?: unknown[] } | undefined)?.spans;\n if (!Array.isArray(spans)) continue;\n for (const span of spans) {\n if (!span || typeof span !== 'object') continue;\n const s = span as Record<string, unknown>;\n const traceId = typeof s.traceId === 'string' ? s.traceId : undefined;\n const spanId = typeof s.spanId === 'string' ? s.spanId : undefined;\n const name = typeof s.name === 'string' ? s.name : undefined;\n if (!traceId || !spanId || !name) continue;\n const decoded: DecodedOtlpSpan = {\n traceId,\n spanId,\n parentSpanId: typeof s.parentSpanId === 'string' && s.parentSpanId ? s.parentSpanId : undefined,\n name,\n startTime: nanosToDate(s.startTimeUnixNano),\n endTime: s.endTimeUnixNano !== undefined ? nanosToDate(s.endTimeUnixNano) : undefined,\n attributes: flattenAttributes(s.attributes),\n };\n const status = s.status as Record<string, unknown> | undefined;\n if (status && typeof status === 'object') {\n if (typeof status.code === 'number') decoded.statusCode = status.code;\n if (typeof status.message === 'string') decoded.statusMessage = status.message;\n }\n out.push(decoded);\n }\n }\n }\n return out;\n}\n\nexport function decodeResourceLogs(payload: unknown): DecodedOtlpLog[] {\n const out: DecodedOtlpLog[] = [];\n const resourceLogs = (payload as { resourceLogs?: unknown[] } | undefined)?.resourceLogs;\n if (!Array.isArray(resourceLogs)) return out;\n\n for (const rl of resourceLogs) {\n const scopeLogs = (rl as { scopeLogs?: unknown[] } | undefined)?.scopeLogs;\n if (!Array.isArray(scopeLogs)) continue;\n for (const sl of scopeLogs) {\n const logRecords = (sl as { logRecords?: unknown[] } | undefined)?.logRecords;\n if (!Array.isArray(logRecords)) continue;\n for (const record of logRecords) {\n if (!record || typeof record !== 'object') continue;\n const r = record as Record<string, unknown>;\n const traceId = typeof r.traceId === 'string' ? r.traceId : undefined;\n if (!traceId) continue;\n // OTLP log body is a tagged union like attributes; we accept the\n // common stringValue case and otherwise pass through.\n let body: unknown = r.body;\n if (body && typeof body === 'object' && 'stringValue' in (body as Record<string, unknown>)) {\n body = (body as Record<string, unknown>).stringValue;\n }\n out.push({\n traceId,\n spanId: typeof r.spanId === 'string' && r.spanId ? r.spanId : undefined,\n timestamp: r.timeUnixNano !== undefined ? nanosToDate(r.timeUnixNano) : nanosToDate(r.observedTimeUnixNano),\n severityText: typeof r.severityText === 'string' ? r.severityText : undefined,\n severityNumber: typeof r.severityNumber === 'number' ? r.severityNumber : undefined,\n body,\n attributes: flattenAttributes(r.attributes),\n });\n }\n }\n }\n return out;\n}\n\n/**\n * Translate an OTLP severity (text or number) to a Mastra LogLevel.\n *\n * OTEL severity numbers per spec:\n * 1-4 trace, 5-8 debug, 9-12 info, 13-16 warn, 17-20 error, 21-24 fatal.\n */\nexport function otlpSeverityToLogLevel(text: string | undefined, num: number | undefined): LogLevel {\n if (text) {\n const lc = text.toLowerCase();\n if (lc.startsWith('trace') || lc.startsWith('debug')) return 'debug';\n if (lc.startsWith('info')) return 'info';\n if (lc.startsWith('warn')) return 'warn';\n if (lc.startsWith('error')) return 'error';\n if (lc.startsWith('fatal')) return 'fatal';\n }\n if (typeof num === 'number') {\n if (num <= 8) return 'debug';\n if (num <= 12) return 'info';\n if (num <= 16) return 'warn';\n if (num <= 20) return 'error';\n return 'fatal';\n }\n return 'info';\n}\n\n/**\n * Convert a decoded OTLP span into the Mastra ExportedSpan shape so it\n * can be emitted via the observability bus.\n *\n * All ingested spans use SpanType.GENERIC because we don't know what\n * the user instrumented inside their client tool. The original span\n * name and attributes are preserved.\n */\nexport function buildExportedSpan(\n decoded: DecodedOtlpSpan,\n options: { entityType?: EntityType; entityName?: string; isInternal?: boolean } = {},\n): AnyExportedSpan {\n const errorInfo =\n decoded.statusCode === 2\n ? {\n message: decoded.statusMessage ?? 'Client tool span reported error status',\n // SpanErrorInfo allows extra fields; keep the minimum.\n }\n : undefined;\n return {\n id: decoded.spanId,\n traceId: decoded.traceId,\n name: decoded.name,\n type: SpanType.GENERIC,\n parentSpanId: decoded.parentSpanId,\n isRootSpan: !decoded.parentSpanId,\n startTime: decoded.startTime,\n endTime: decoded.endTime,\n attributes: decoded.attributes,\n entityType: options.entityType,\n entityName: options.entityName,\n isEvent: false,\n ...(errorInfo ? { errorInfo: errorInfo as any } : {}),\n } as AnyExportedSpan;\n}\n\nexport function buildExportedLog(decoded: DecodedOtlpLog): ExportedLog {\n return {\n logId: generateClientSignalId(),\n timestamp: decoded.timestamp,\n traceId: decoded.traceId,\n spanId: decoded.spanId,\n level: otlpSeverityToLogLevel(decoded.severityText, decoded.severityNumber),\n message: typeof decoded.body === 'string' ? decoded.body : decoded.body !== undefined ? String(decoded.body) : '',\n data: decoded.attributes,\n };\n}\n","/**\n * Hand-rolled W3C Trace Context and Baggage propagation.\n *\n * The full propagators in `@opentelemetry/core` weigh ~27KB gzipped.\n * The W3C specs (https://www.w3.org/TR/trace-context/, https://www.w3.org/TR/baggage/)\n * are simple text formats; for the small subset we need (parse and\n * format `traceparent`, parse and format `baggage`), hand-rolling is\n * cheaper and avoids adding an OTEL dependency to @mastra/observability.\n */\n\nconst TRACEPARENT_RE = /^([0-9a-f]{2})-([0-9a-f]{32})-([0-9a-f]{16})-([0-9a-f]{2})$/;\n\nexport interface TraceparentParts {\n /** Version, currently always \"00\". */\n version: string;\n /** 32 hex chars. */\n traceId: string;\n /** 16 hex chars. Refers to the parent span this carrier identifies. */\n spanId: string;\n /** 2 hex chars. Bit 0 is the sampled flag. */\n flags: string;\n}\n\nexport function parseTraceparent(value: string | undefined): TraceparentParts | null {\n if (!value) return null;\n const m = TRACEPARENT_RE.exec(value.trim());\n if (!m) return null;\n if (m[1] === 'ff') return null;\n if (m[2] === '00000000000000000000000000000000') return null;\n if (m[3] === '0000000000000000') return null;\n return { version: m[1]!, traceId: m[2]!, spanId: m[3]!, flags: m[4]! };\n}\n\nexport function formatTraceparent(traceId: string, spanId: string, sampled: boolean): string {\n return `00-${traceId}-${spanId}-${sampled ? '01' : '00'}`;\n}\n\n/**\n * Parse a W3C Baggage header value into a Map.\n *\n * Format: `key=value,key2=value2;property=...`\n * Properties (after `;`) are ignored — we don't use them.\n * Values are percent-decoded per the spec.\n */\nexport function parseBaggage(value: string | undefined): Map<string, string> {\n const out = new Map<string, string>();\n if (!value) return out;\n for (const entry of value.split(',')) {\n const trimmed = entry.trim();\n if (!trimmed) continue;\n // Strip optional `;property=...` suffix\n const semi = trimmed.indexOf(';');\n const head = semi === -1 ? trimmed : trimmed.slice(0, semi);\n const eq = head.indexOf('=');\n if (eq === -1) continue;\n const key = head.slice(0, eq).trim();\n const rawValue = head.slice(eq + 1).trim();\n if (!key) continue;\n let decoded: string;\n try {\n decoded = decodeURIComponent(rawValue);\n } catch {\n decoded = rawValue;\n }\n out.set(key, decoded);\n }\n return out;\n}\n\n/**\n * Format a Map into a W3C Baggage header value.\n * Values are percent-encoded.\n */\nexport function formatBaggage(entries: Map<string, string> | Record<string, string>): string {\n const iter = entries instanceof Map ? entries.entries() : Object.entries(entries);\n const parts: string[] = [];\n for (const [key, value] of iter) {\n if (!key) continue;\n parts.push(`${key}=${encodeURIComponent(value)}`);\n }\n return parts.join(',');\n}\n","/**\n * ClientObservabilityProxy implementation for @mastra/observability.\n *\n * Handles the two halves of the client observability flow:\n *\n * - `inject(parentSpan)` (called from request 1) — produces the W3C\n * carrier the server attaches to the outgoing chunk so the client\n * SDK can extract it and parent its child spans/logs correctly.\n *\n * - `receive(payload, parentContext)` (called from request 2 when the\n * client returns) — decodes the OTLP/JSON payload the client sent\n * back, validates that it actually belongs to the parent trace\n * identified by `parentContext`, and forwards each span/log into\n * the observability bus so existing exporters pick them up.\n */\n\nimport type { IMastraLogger } from '@mastra/core/logger';\nimport { EntityType, TracingEventType } from '@mastra/core/observability';\nimport type {\n AnySpan,\n ClientObservabilityCarrier,\n ClientObservabilityProxy,\n ClientObservabilityPayload,\n LogEvent,\n MetricEvent,\n ObservabilityInstance,\n TracingEvent,\n} from '@mastra/core/observability';\n\nimport { BaseObservabilityInstance } from '../instances/base';\nimport { generateClientSignalId } from './id';\nimport { buildExportedLog, buildExportedSpan, decodeResourceLogs, decodeResourceSpans } from './otlp';\nimport type { DecodedOtlpLog, DecodedOtlpSpan } from './otlp';\nimport { formatTraceparent, parseTraceparent } from './w3c';\n\n/**\n * Hard caps. A misbehaving client could ship arbitrary OTLP; reject\n * payloads that blow past these limits to keep the server safe.\n */\nexport interface ClientObservabilityProxyLimits {\n /** Maximum number of spans accepted per receive call. */\n maxSpans: number;\n /** Maximum number of log records accepted per receive call. */\n maxLogs: number;\n /** Maximum total payload size in bytes (JSON.stringify length). */\n maxPayloadBytes: number;\n}\n\nexport const DEFAULT_LIMITS: ClientObservabilityProxyLimits = {\n maxSpans: 10,\n maxLogs: 10,\n maxPayloadBytes: 1024 * 1024,\n};\n\nexport interface CreateClientObservabilityProxyOptions {\n /**\n * Resolves the observability instance to forward into. Called per\n * `receive()` so config selection works the same way as for\n * server-side spans. Returning `undefined` causes the payload to be\n * dropped silently.\n */\n resolveInstance: () => ObservabilityInstance | undefined;\n /** Logger for warnings about dropped/rejected payloads. */\n logger?: IMastraLogger;\n limits?: Partial<ClientObservabilityProxyLimits>;\n}\n\nclass ClientObservabilityProxyImpl implements ClientObservabilityProxy {\n readonly #resolveInstance: () => ObservabilityInstance | undefined;\n readonly #logger?: IMastraLogger;\n readonly #limits: ClientObservabilityProxyLimits;\n\n constructor(options: CreateClientObservabilityProxyOptions) {\n this.#resolveInstance = options.resolveInstance;\n this.#logger = options.logger;\n this.#limits = { ...DEFAULT_LIMITS, ...options.limits };\n }\n\n inject(parentSpan: AnySpan): ClientObservabilityCarrier {\n return {\n // Mastra spans use OTel-compatible 32-hex traceIds and 16-hex\n // spanIds, so they drop straight into the W3C format. Sampled\n // flag is always 1: if the parent span exists at all, the trace\n // is being recorded server-side, so the client should record too.\n traceparent: formatTraceparent(parentSpan.traceId, parentSpan.id, true),\n };\n }\n\n receive(payload: ClientObservabilityPayload, parentContext: ClientObservabilityCarrier): void {\n if (!payload || (!payload.spans && !payload.logs && payload.executionDurationMs === undefined)) {\n return;\n }\n\n // Size cap before decoding so a hostile payload can't OOM us.\n let payloadBytes = 0;\n try {\n payloadBytes = JSON.stringify(payload).length;\n } catch {\n this.#warn('Client observability payload is not JSON-serializable; dropping.');\n return;\n }\n if (payloadBytes > this.#limits.maxPayloadBytes) {\n this.#warn('Client observability payload exceeds size limit; dropping.', {\n bytes: payloadBytes,\n limit: this.#limits.maxPayloadBytes,\n });\n return;\n }\n\n const parent = parseTraceparent(parentContext.traceparent);\n if (!parent) {\n this.#warn('Client observability parentContext.traceparent is malformed; dropping payload.');\n return;\n }\n\n const instance = this.#resolveInstance();\n if (!instance || !(instance instanceof BaseObservabilityInstance)) {\n // No instance to forward into; silently drop. This is normal in\n // tests and in setups without a default instance configured.\n return;\n }\n\n const decodedSpans = payload.spans ? decodeResourceSpans(payload.spans) : [];\n const decodedLogs = payload.logs ? decodeResourceLogs(payload.logs) : [];\n\n if (decodedSpans.length > this.#limits.maxSpans) {\n this.#warn('Client observability payload exceeds span count limit; dropping.', {\n spans: decodedSpans.length,\n limit: this.#limits.maxSpans,\n });\n return;\n }\n if (decodedLogs.length > this.#limits.maxLogs) {\n this.#warn('Client observability payload exceeds log count limit; dropping.', {\n logs: decodedLogs.length,\n limit: this.#limits.maxLogs,\n });\n return;\n }\n\n // Validation: every span/log traceId must match the parent\n // traceparent. This prevents a hostile client from injecting spans\n // into traces it doesn't own.\n if (!validateTraceIds(decodedSpans, decodedLogs, parent.traceId)) {\n this.#warn('Client observability payload contains spans or logs from a foreign trace; dropping.');\n return;\n }\n\n // Validation: every span's parentSpanId must resolve to the parent\n // span identified by parentContext, or to another span present in\n // this payload. Forbidding orphans prevents broken trees and bounds\n // the trust we place in client input.\n if (!validateParentLinks(decodedSpans, parent.spanId)) {\n this.#warn('Client observability payload contains spans with orphan parents; dropping.');\n return;\n }\n\n // All validation passed; emit through the bus.\n for (const decoded of decodedSpans) {\n const exported = buildExportedSpan(decoded);\n const startedEvent: TracingEvent = { type: TracingEventType.SPAN_STARTED, exportedSpan: exported };\n instance.__receiveExternalEvent(startedEvent);\n // If the span has an end time, also emit the ended event so\n // exporters that only care about completed spans see it.\n if (exported.endTime) {\n const endedEvent: TracingEvent = { type: TracingEventType.SPAN_ENDED, exportedSpan: exported };\n instance.__receiveExternalEvent(endedEvent);\n }\n }\n for (const decoded of decodedLogs) {\n const log = buildExportedLog(decoded);\n const event: LogEvent = { type: 'log', log };\n instance.__receiveExternalEvent(event);\n }\n\n // Emit the actual client-side execution duration. The server-side\n // CLIENT_TOOL_CALL span only measures carrier emission and args\n // capture, not the browser work performed inside execute().\n if (typeof payload.executionDurationMs === 'number') {\n const hasError = decodedSpans.some(s => s.statusCode === 2);\n const metricEvent: MetricEvent = {\n type: 'metric',\n metric: {\n metricId: generateClientSignalId(),\n timestamp: new Date(),\n traceId: parent.traceId,\n spanId: parent.spanId,\n name: 'mastra_tool_duration_ms',\n value: payload.executionDurationMs,\n labels: { status: hasError ? 'error' : 'ok', toolType: 'client' },\n correlationContext: {\n traceId: parent.traceId,\n spanId: parent.spanId,\n entityType: EntityType.TOOL,\n ...(payload.toolName ? { entityName: payload.toolName } : {}),\n },\n },\n };\n instance.__receiveExternalEvent(metricEvent);\n }\n }\n\n #warn(message: string, data?: Record<string, unknown>): void {\n if (this.#logger) {\n this.#logger.warn(`[ClientObservabilityProxy] ${message}`, data);\n }\n }\n}\n\nfunction validateTraceIds(spans: DecodedOtlpSpan[], logs: DecodedOtlpLog[], expected: string): boolean {\n for (const s of spans) if (s.traceId !== expected) return false;\n for (const l of logs) if (l.traceId !== expected) return false;\n return true;\n}\n\nfunction validateParentLinks(spans: DecodedOtlpSpan[], rootParent: string): boolean {\n if (spans.length === 0) return true;\n const known = new Set<string>([rootParent]);\n for (const s of spans) known.add(s.spanId);\n for (const s of spans) {\n if (!s.parentSpanId) {\n return false;\n }\n if (!known.has(s.parentSpanId)) {\n return false;\n }\n }\n return true;\n}\n\nexport function createClientObservabilityProxy(\n options: CreateClientObservabilityProxyOptions,\n): ClientObservabilityProxy {\n return new ClientObservabilityProxyImpl(options);\n}\n","/**\n * Base Exporter for Observability\n *\n * Provides common functionality shared by all observability exporters:\n * - Logger initialization with proper Mastra logger support\n * - Disabled state management\n * - Graceful shutdown lifecycle\n */\n\nimport { ConsoleLogger, LogLevel } from '@mastra/core/logger';\nimport type { IMastraLogger } from '@mastra/core/logger';\nimport type {\n TracingEvent,\n ObservabilityExporter,\n InitExporterOptions,\n CustomSpanFormatter,\n} from '@mastra/core/observability';\n\n/**\n * Base configuration that all exporters should support\n */\nexport interface BaseExporterConfig {\n /** Optional Mastra logger instance */\n logger?: IMastraLogger;\n /** Log level for the exporter (defaults to INFO) - accepts both enum and string */\n logLevel?: LogLevel | 'debug' | 'info' | 'warn' | 'error';\n /**\n * Custom span formatter function to transform exported spans before they are\n * processed by the exporter. This allows customization of how spans appear\n * in vendor-specific observability platforms.\n *\n * Use cases:\n * - Extract plain text from structured AI SDK messages for better readability\n * - Transform input/output format for specific vendor requirements\n * - Add or remove fields based on the target platform\n *\n * @example\n * ```typescript\n * const exporter = new BraintrustExporter({\n * customSpanFormatter: (span) => {\n * // Extract plain text user message for AGENT_RUN spans\n * if (span.type === SpanType.AGENT_RUN && Array.isArray(span.input)) {\n * const userMsg = span.input.find(m => m.role === 'user');\n * return { ...span, input: userMsg?.content ?? span.input };\n * }\n * return span;\n * },\n * });\n * ```\n */\n customSpanFormatter?: CustomSpanFormatter;\n}\n\n/**\n * Abstract base class for observability exporters\n *\n * Handles common concerns:\n * - Logger setup with proper Mastra logger\n * - Disabled state management\n * - Basic lifecycle methods\n *\n * @example\n * ```typescript\n * class MyExporter extends BaseExporter {\n * name = 'my-exporter';\n *\n * constructor(config: MyExporterConfig) {\n * super(config);\n *\n * if (!config.apiKey) {\n * this.setDisabled('Missing API key');\n * return;\n * }\n *\n * // Initialize exporter-specific logic\n * }\n *\n * async _exportEvent(event: TracingEvent): Promise<void> {\n * // Export logic\n * }\n * }\n * ```\n */\nexport abstract class BaseExporter implements ObservabilityExporter {\n /** Exporter name - must be implemented by subclasses */\n abstract name: string;\n\n /** Mastra logger instance */\n protected logger: IMastraLogger;\n\n /** Base configuration (accessible by subclasses) */\n protected readonly baseConfig: BaseExporterConfig;\n\n /** Whether this exporter is disabled */\n #disabled: boolean = false;\n\n /** Public getter for disabled state */\n get isDisabled(): boolean {\n return this.#disabled;\n }\n\n /**\n * Initialize the base exporter with logger\n */\n constructor(config: BaseExporterConfig = {}) {\n this.baseConfig = config;\n // Map string log level to LogLevel enum if needed\n const logLevel = this.resolveLogLevel(config.logLevel);\n // Use constructor name as fallback since this.name isn't set yet (subclass initializes it)\n this.logger = config.logger ?? new ConsoleLogger({ level: logLevel, name: this.constructor.name });\n }\n\n /**\n * Set the logger for the exporter (called by Mastra/ObservabilityInstance during initialization)\n */\n __setLogger(logger: IMastraLogger): void {\n this.logger = logger;\n // Use this.name here since it's guaranteed to be set by the subclass at this point\n this.logger.debug(`Logger updated for exporter [name=${this.name}]`);\n }\n\n /**\n * Convert string log level to LogLevel enum\n */\n private resolveLogLevel(logLevel?: LogLevel | 'debug' | 'info' | 'warn' | 'error'): LogLevel {\n if (!logLevel) {\n return LogLevel.INFO;\n }\n\n // If already a LogLevel enum, return as-is\n if (typeof logLevel === 'number') {\n return logLevel;\n }\n\n // Map string to enum\n const logLevelMap: Record<string, LogLevel> = {\n debug: LogLevel.DEBUG,\n info: LogLevel.INFO,\n warn: LogLevel.WARN,\n error: LogLevel.ERROR,\n };\n\n return logLevelMap[logLevel] ?? LogLevel.INFO;\n }\n\n /**\n * Mark the exporter as disabled and log a message\n *\n * @param reason - Reason why the exporter is disabled\n */\n protected setDisabled(reason: string, level: 'warn' | 'debug' = 'warn'): void {\n this.#disabled = true;\n this.logger[level](`${this.name} disabled: ${reason}`);\n }\n\n /**\n * Apply the customSpanFormatter if configured.\n * This is called automatically by exportTracingEvent before _exportTracingEvent.\n *\n * Supports both synchronous and asynchronous formatters. If the formatter\n * returns a Promise, it will be awaited.\n *\n * @param event - The incoming tracing event\n * @returns The (possibly modified) event to process\n */\n protected async applySpanFormatter(event: TracingEvent): Promise<TracingEvent> {\n if (this.baseConfig.customSpanFormatter) {\n try {\n const formattedSpan = await this.baseConfig.customSpanFormatter(event.exportedSpan);\n return {\n ...event,\n exportedSpan: formattedSpan,\n };\n } catch (error) {\n this.logger.error(`${this.name}: Error in customSpanFormatter`, {\n error,\n spanId: event.exportedSpan.id,\n traceId: event.exportedSpan.traceId,\n });\n // Fall through to return original event if formatter fails\n }\n }\n return event;\n }\n\n /**\n * Default onTracingEvent handler that delegates to exportTracingEvent.\n *\n * This provides backward compatibility: existing exporters that only implement\n * _exportTracingEvent will automatically receive tracing events routed through\n * the ObservabilityBus. Subclasses can override this if they need different\n * routing behavior for bus-delivered events.\n *\n * Handler presence on ObservabilityExporter = signal support.\n */\n onTracingEvent(event: TracingEvent): void | Promise<void> {\n return this.exportTracingEvent(event);\n }\n\n /**\n * Export a tracing event\n *\n * This method checks if the exporter is disabled, applies the customSpanFormatter,\n * then calls _exportTracingEvent.\n * Subclasses should implement _exportTracingEvent instead of overriding this method.\n */\n async exportTracingEvent(event: TracingEvent): Promise<void> {\n if (this.isDisabled) {\n return;\n }\n const processedEvent = await this.applySpanFormatter(event);\n await this._exportTracingEvent(processedEvent);\n }\n\n /**\n * Export a tracing event - must be implemented by subclasses\n *\n * This method is called by exportTracingEvent after checking if the exporter is disabled.\n */\n protected abstract _exportTracingEvent(event: TracingEvent): Promise<void>;\n\n /**\n * Optional initialization hook called after Mastra is fully configured\n */\n init?(_options: InitExporterOptions): void;\n\n /**\n * Optional method to add scores to traces\n */\n 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\n /**\n * Force flush any buffered/queued spans without shutting down the exporter.\n *\n * This is useful in serverless environments where you need to ensure spans\n * are exported before the runtime instance is terminated, while keeping\n * the exporter active for future requests.\n *\n * Default implementation is a no-op. Override to add flush logic.\n */\n async flush(): Promise<void> {\n this.logger.debug(`${this.name} flush called (no-op in base class)`);\n }\n\n /**\n * Shutdown the exporter and clean up resources\n *\n * Default implementation just logs. Override to add custom cleanup.\n */\n async shutdown(): Promise<void> {\n this.logger.info(`${this.name} shutdown complete`);\n }\n}\n","/**\n * TrackingExporter base class for vendor-specific observability exporters.\n *\n * Provides common functionality for caching trace data in memory, handling\n * out-of-order span arrival via queuing, delayed cleanup, and memory management.\n */\n\nimport { TracingEventType } from '@mastra/core/observability';\nimport type { TracingEvent, AnyExportedSpan, SpanErrorInfo } from '@mastra/core/observability';\nimport type { BaseExporterConfig } from './base';\nimport { BaseExporter } from './base';\n\n/**\n * Represents an event waiting in the early queue for its dependencies.\n */\nexport interface QueuedEvent {\n /** The original tracing event */\n event: TracingEvent;\n /** What this event is waiting for: 'root' or a specific parentSpanId */\n waitingFor: 'root' | string;\n /** Number of times we've attempted to process this event */\n attempts: number;\n /** When this event was queued */\n queuedAt: Date;\n}\n\nexport interface TrackingExporterConfig extends BaseExporterConfig {\n /**\n * Maximum number of attempts to process a queued event before dropping it.\n * @default 5\n */\n earlyQueueMaxAttempts?: number;\n\n /**\n * Time-to-live in milliseconds for queued events. Events older than this are dropped.\n * @default 30000 (30 seconds)\n */\n earlyQueueTTLMs?: number;\n\n /**\n * Delay in milliseconds before cleaning up trace data after all spans have ended.\n * This allows late-arriving data to still be processed.\n * @default 30000 (30 seconds)\n */\n traceCleanupDelayMs?: number;\n\n /**\n * Soft cap on number of traces with activeSpanCount == 0 awaiting cleanup.\n * When exceeded, oldest pending traces are force-cleaned.\n * @default 100\n */\n maxPendingCleanupTraces?: number;\n\n /**\n * Hard cap on total number of traces (including active ones).\n * When exceeded, oldest traces are killed (active spans aborted).\n * Safety valve for memory leaks.\n * @default 500\n */\n maxTotalTraces?: number;\n}\n\n/**\n * Per-trace data container that stores vendor-specific span/event objects and\n * manages the waiting queue for out-of-order event processing.\n *\n * @typeParam TRootData - Vendor-specific root/trace object type (e.g., Langfuse trace, Braintrust logger)\n * @typeParam TSpanData - Vendor-specific span object type (e.g., LangSmith RunTree, Braintrust Span)\n * @typeParam TEventData - Vendor-specific event object type\n * @typeParam TMetadata - Vendor-specific metadata type for spans\n */\nexport class TraceData<TRootData, TSpanData, TEventData, TMetadata> {\n /** The vendor-specific root/trace object */\n #rootSpan?: TRootData;\n /** The span ID of the root span */\n #rootSpanId?: string;\n /** Whether a span with isRootSpan=true has been successfully processed */\n #rootSpanProcessed: boolean;\n /** Maps eventId to vendor-specific event objects */\n #events: Map<string, TEventData>;\n /** Maps spanId to vendor-specific span objects */\n #spans: Map<string, TSpanData>;\n /** Maps spanId to parentSpanId, representing the span hierarchy */\n #tree: Map<string, string | undefined>;\n /** Set of span IDs that have started but not yet ended */\n #activeSpanIds: Set<string>;\n /** Maps spanId to vendor-specific metadata */\n #metadata: Map<string, TMetadata>;\n /** Arbitrary key-value storage for per-trace data */\n #extraData: Map<string, unknown>;\n /** Events waiting for the root span to be processed */\n #waitingForRoot: QueuedEvent[];\n /** Events waiting for specific parent spans, keyed by parentSpanId */\n #waitingForParent: Map<string, QueuedEvent[]>;\n\n /** When this trace data was created, used for cap enforcement */\n readonly createdAt: Date;\n\n constructor() {\n this.#events = new Map();\n this.#spans = new Map();\n this.#activeSpanIds = new Set();\n this.#tree = new Map();\n this.#metadata = new Map();\n this.#extraData = new Map();\n this.#rootSpanProcessed = false;\n this.#waitingForRoot = [];\n this.#waitingForParent = new Map();\n this.createdAt = new Date();\n }\n\n /**\n * Check if this trace has a root span registered.\n * @returns True if addRoot() has been called\n */\n hasRoot(): boolean {\n return !!this.#rootSpanId;\n }\n\n /**\n * Register the root span for this trace.\n * @param args.rootId - The span ID of the root span\n * @param args.rootData - The vendor-specific root object\n */\n addRoot(args: { rootId: string; rootData: TRootData }): void {\n this.#rootSpanId = args.rootId;\n this.#rootSpan = args.rootData;\n this.#rootSpanProcessed = true;\n }\n\n /**\n * Get the vendor-specific root object.\n * @returns The root object, or undefined if not yet set\n */\n getRoot(): TRootData | undefined {\n return this.#rootSpan;\n }\n\n /**\n * Check if a span with isRootSpan=true has been successfully processed.\n * Set via addRoot() or markRootSpanProcessed().\n * @returns True if the root span has been processed\n */\n isRootProcessed(): boolean {\n return this.#rootSpanProcessed;\n }\n\n /**\n * Mark that the root span has been processed.\n * Used by exporters with skipBuildRootTask=true where root goes through _buildSpan\n * instead of _buildRoot.\n */\n markRootSpanProcessed(): void {\n this.#rootSpanProcessed = true;\n }\n\n /**\n * Store an arbitrary value in per-trace storage.\n * @param key - Storage key\n * @param value - Value to store\n */\n setExtraValue(key: string, value: unknown): void {\n this.#extraData.set(key, value);\n }\n\n /**\n * Check if a key exists in per-trace storage.\n * @param key - Storage key\n * @returns True if the key exists\n */\n hasExtraValue(key: string): boolean {\n return this.#extraData.has(key);\n }\n\n /**\n * Get a value from per-trace storage.\n * @param key - Storage key\n * @returns The stored value, or undefined if not found\n */\n getExtraValue(key: string): unknown {\n return this.#extraData.get(key);\n }\n\n // ============================================================================\n // Early Queue Methods\n // ============================================================================\n\n /**\n * Add an event to the waiting queue.\n * @param args.event - The tracing event to queue\n * @param args.waitingFor - 'root' or a specific parentSpanId\n * @param args.attempts - Optional: preserve attempts count when re-queuing\n * @param args.queuedAt - Optional: preserve original queue time when re-queuing\n */\n addToWaitingQueue(args: {\n event: TracingEvent;\n waitingFor: 'root' | string;\n attempts?: number;\n queuedAt?: Date;\n }): void {\n const queuedEvent: QueuedEvent = {\n event: args.event,\n waitingFor: args.waitingFor,\n attempts: args.attempts ?? 0,\n queuedAt: args.queuedAt ?? new Date(),\n };\n\n if (args.waitingFor === 'root') {\n this.#waitingForRoot.push(queuedEvent);\n } else {\n const queue = this.#waitingForParent.get(args.waitingFor) ?? [];\n queue.push(queuedEvent);\n this.#waitingForParent.set(args.waitingFor, queue);\n }\n }\n\n /**\n * Get all events waiting for the root span.\n * Returns a copy of the internal array.\n */\n getEventsWaitingForRoot(): QueuedEvent[] {\n return [...this.#waitingForRoot];\n }\n\n /**\n * Get all events waiting for a specific parent span.\n * Returns a copy of the internal array.\n */\n getEventsWaitingFor(args: { spanId: string }): QueuedEvent[] {\n return [...(this.#waitingForParent.get(args.spanId) ?? [])];\n }\n\n /**\n * Clear the waiting-for-root queue.\n */\n clearWaitingForRoot(): void {\n this.#waitingForRoot = [];\n }\n\n /**\n * Clear the waiting queue for a specific parent span.\n */\n clearWaitingFor(args: { spanId: string }): void {\n this.#waitingForParent.delete(args.spanId);\n }\n\n /**\n * Get total count of events in all waiting queues.\n */\n waitingQueueSize(): number {\n let count = this.#waitingForRoot.length;\n for (const queue of this.#waitingForParent.values()) {\n count += queue.length;\n }\n return count;\n }\n\n /**\n * Get all queued events across all waiting queues.\n * Used for cleanup and logging orphaned events.\n * @returns Array of all queued events\n */\n getAllQueuedEvents(): QueuedEvent[] {\n const all: QueuedEvent[] = [...this.#waitingForRoot];\n for (const queue of this.#waitingForParent.values()) {\n all.push(...queue);\n }\n return all;\n }\n\n // ============================================================================\n // Span Tree Methods\n // ============================================================================\n\n /**\n * Record the parent-child relationship for a span.\n * @param args.spanId - The child span ID\n * @param args.parentSpanId - The parent span ID, or undefined for root spans\n */\n addBranch(args: { spanId: string; parentSpanId: string | undefined }): void {\n this.#tree.set(args.spanId, args.parentSpanId);\n }\n\n /**\n * Get the parent span ID for a given span.\n * @param args.spanId - The span ID to look up\n * @returns The parent span ID, or undefined if root or not found\n */\n getParentId(args: { spanId: string }): string | undefined {\n return this.#tree.get(args.spanId);\n }\n\n // ============================================================================\n // Span Management Methods\n // ============================================================================\n\n /**\n * Register a span and mark it as active.\n * @param args.spanId - The span ID\n * @param args.spanData - The vendor-specific span object\n */\n addSpan(args: { spanId: string; spanData: TSpanData }): void {\n this.#spans.set(args.spanId, args.spanData);\n this.#activeSpanIds.add(args.spanId);\n }\n\n /**\n * Check if a span exists (regardless of active state).\n * @param args.spanId - The span ID to check\n * @returns True if the span exists\n */\n hasSpan(args: { spanId: string }): boolean {\n return this.#spans.has(args.spanId);\n }\n\n /**\n * Get a span by ID.\n * @param args.spanId - The span ID to look up\n * @returns The vendor-specific span object, or undefined if not found\n */\n getSpan(args: { spanId: string }): TSpanData | undefined {\n return this.#spans.get(args.spanId);\n }\n\n /**\n * Mark a span as ended (no longer active).\n * @param args.spanId - The span ID to mark as ended\n */\n endSpan(args: { spanId: string }): void {\n this.#activeSpanIds.delete(args.spanId);\n }\n\n /**\n * Check if a span is currently active (started but not ended).\n * @param args.spanId - The span ID to check\n * @returns True if the span is active\n */\n isActiveSpan(args: { spanId: string }): boolean {\n return this.#activeSpanIds.has(args.spanId);\n }\n\n /**\n * Get the count of currently active spans.\n * @returns Number of active spans\n */\n activeSpanCount(): number {\n return this.#activeSpanIds.size;\n }\n\n /**\n * Get all active span IDs.\n * @returns Array of active span IDs\n */\n get activeSpanIds(): string[] {\n return [...this.#activeSpanIds];\n }\n\n // ============================================================================\n // Event Management Methods\n // ============================================================================\n\n /**\n * Register an event.\n * @param args.eventId - The event ID\n * @param args.eventData - The vendor-specific event object\n */\n addEvent(args: { eventId: string; eventData: TEventData }): void {\n this.#events.set(args.eventId, args.eventData);\n }\n\n // ============================================================================\n // Metadata Methods\n // ============================================================================\n\n /**\n * Store vendor-specific metadata for a span.\n * Note: This overwrites any existing metadata for the span.\n * @param args.spanId - The span ID\n * @param args.metadata - The vendor-specific metadata\n */\n addMetadata(args: { spanId: string; metadata: TMetadata }): void {\n this.#metadata.set(args.spanId, args.metadata);\n }\n\n /**\n * Get vendor-specific metadata for a span.\n * @param args.spanId - The span ID\n * @returns The metadata, or undefined if not found\n */\n getMetadata(args: { spanId: string }): TMetadata | undefined {\n return this.#metadata.get(args.spanId);\n }\n\n // ============================================================================\n // Parent Lookup Methods\n // ============================================================================\n\n /**\n * Get the parent span or event for a given span.\n * Looks up in both spans and events maps.\n * @param args.span - The span to find the parent for\n * @returns The parent span/event object, or undefined if root or not found\n */\n getParent(args: { span: AnyExportedSpan }): TSpanData | TEventData | undefined {\n const parentId = args.span.parentSpanId;\n if (parentId) {\n if (this.#spans.has(parentId)) {\n return this.#spans.get(parentId);\n }\n if (this.#events.has(parentId)) {\n return this.#events.get(parentId);\n }\n }\n return undefined;\n }\n\n /**\n * Get the parent span/event or fall back to the root object.\n * Useful for vendors that attach child spans to either parent spans or the trace root.\n * @param args.span - The span to find the parent for\n * @returns The parent span/event, the root object, or undefined\n */\n getParentOrRoot(args: { span: AnyExportedSpan }): TRootData | TSpanData | TEventData | undefined {\n return this.getParent(args) ?? this.getRoot();\n }\n}\n\n// Default configuration values\nconst DEFAULT_EARLY_QUEUE_MAX_ATTEMPTS = 5;\nconst DEFAULT_EARLY_QUEUE_TTL_MS = 30000; // 30 seconds\nconst DEFAULT_TRACE_CLEANUP_DELAY_MS = 30000; // 30 seconds\nconst DEFAULT_MAX_PENDING_CLEANUP_TRACES = 100;\nconst DEFAULT_MAX_TOTAL_TRACES = 500;\n\n/**\n * Abstract base class for vendor-specific observability exporters that need to\n * track trace and span state in memory.\n *\n * This class provides:\n * - Per-trace data caching via TraceData instances\n * - Out-of-order span handling via waiting queues (for when children arrive before parents)\n * - Delayed cleanup to handle late-arriving data\n * - Memory management via configurable soft/hard caps on trace count\n * - Graceful shutdown with span abortion\n *\n * Subclasses must implement the abstract methods to handle vendor-specific\n * span/event creation and lifecycle.\n *\n * @typeParam TRootData - Vendor-specific root/trace object type\n * @typeParam TSpanData - Vendor-specific span object type\n * @typeParam TEventData - Vendor-specific event object type\n * @typeParam TMetadata - Vendor-specific metadata type\n * @typeParam TConfig - Configuration type (must extend TrackingExporterConfig)\n *\n * @example\n * ```typescript\n * class MyExporter extends TrackingExporter<MyRoot, MySpan, MyEvent, MyMeta, MyConfig> {\n * name = 'my-exporter';\n *\n * protected async _buildRoot(args) { ... }\n * protected async _buildSpan(args) { ... }\n * protected async _buildEvent(args) { ... }\n * protected async _updateSpan(args) { ... }\n * protected async _finishSpan(args) { ... }\n * protected async _abortSpan(args) { ... }\n * }\n * ```\n */\nexport abstract class TrackingExporter<\n TRootData,\n TSpanData,\n TEventData,\n TMetadata,\n TConfig extends TrackingExporterConfig,\n> extends BaseExporter {\n /** Map of traceId to per-trace data container */\n #traceMap = new Map<string, TraceData<TRootData, TSpanData, TEventData, TMetadata>>();\n /** Flag to prevent processing during shutdown */\n #shutdownStarted = false;\n /** Flag to prevent concurrent hard cap enforcement */\n #hardCapEnforcementInProgress = false;\n /** Map of traceId to scheduled cleanup timeout */\n #pendingCleanups = new Map<string, ReturnType<typeof setTimeout>>();\n // Note: #traceMap maintains insertion order (JS Map spec), so we use\n // #traceMap.keys() to iterate traces oldest-first for cap enforcement.\n\n /** Subclass configuration with resolved values */\n protected readonly config: TConfig;\n\n /** Maximum attempts to process a queued event before dropping */\n readonly #earlyQueueMaxAttempts: number;\n /** TTL in milliseconds for queued events */\n readonly #earlyQueueTTLMs: number;\n /** Delay before cleaning up completed traces */\n readonly #traceCleanupDelayMs: number;\n /** Soft cap on traces awaiting cleanup */\n readonly #maxPendingCleanupTraces: number;\n /** Hard cap on total traces (will abort active spans if exceeded) */\n readonly #maxTotalTraces: number;\n\n constructor(config: TConfig) {\n super(config);\n this.config = config;\n\n this.#earlyQueueMaxAttempts = config.earlyQueueMaxAttempts ?? DEFAULT_EARLY_QUEUE_MAX_ATTEMPTS;\n this.#earlyQueueTTLMs = config.earlyQueueTTLMs ?? DEFAULT_EARLY_QUEUE_TTL_MS;\n this.#traceCleanupDelayMs = config.traceCleanupDelayMs ?? DEFAULT_TRACE_CLEANUP_DELAY_MS;\n this.#maxPendingCleanupTraces = config.maxPendingCleanupTraces ?? DEFAULT_MAX_PENDING_CLEANUP_TRACES;\n this.#maxTotalTraces = config.maxTotalTraces ?? DEFAULT_MAX_TOTAL_TRACES;\n }\n\n // ============================================================================\n // Early Queue Processing\n // ============================================================================\n\n /**\n * Schedule async processing of events waiting for root span.\n * Called after root span is successfully processed.\n */\n #scheduleProcessWaitingForRoot(traceId: string): void {\n setImmediate(() => {\n this.#processWaitingForRoot(traceId).catch(error => {\n this.logger.error(`${this.name}: Error processing waiting-for-root queue`, { error, traceId });\n });\n });\n }\n\n /**\n * Schedule async processing of events waiting for a specific parent span.\n * Called after a span/event is successfully created.\n */\n #scheduleProcessWaitingFor(traceId: string, spanId: string): void {\n setImmediate(() => {\n this.#processWaitingFor(traceId, spanId).catch(error => {\n this.logger.error(`${this.name}: Error processing waiting queue`, { error, traceId, spanId });\n });\n });\n }\n\n /**\n * Process all events waiting for root span.\n */\n async #processWaitingForRoot(traceId: string): Promise<void> {\n if (this.#shutdownStarted) return;\n\n const traceData = this.#traceMap.get(traceId);\n if (!traceData) return;\n\n const queue = traceData.getEventsWaitingForRoot();\n if (queue.length === 0) return;\n\n this.logger.debug(`${this.name}: Processing ${queue.length} events waiting for root`, { traceId });\n\n // Process events, collecting ones to keep\n const toKeep: QueuedEvent[] = [];\n const now = Date.now();\n\n for (const queuedEvent of queue) {\n // Check TTL\n if (now - queuedEvent.queuedAt.getTime() > this.#earlyQueueTTLMs) {\n this.logger.warn(`${this.name}: Dropping event due to TTL expiry`, {\n traceId,\n spanId: queuedEvent.event.exportedSpan.id,\n waitingFor: queuedEvent.waitingFor,\n queuedAt: queuedEvent.queuedAt,\n attempts: queuedEvent.attempts,\n });\n continue;\n }\n\n // Check max attempts\n if (queuedEvent.attempts >= this.#earlyQueueMaxAttempts) {\n this.logger.warn(`${this.name}: Dropping event due to max attempts`, {\n traceId,\n spanId: queuedEvent.event.exportedSpan.id,\n waitingFor: queuedEvent.waitingFor,\n attempts: queuedEvent.attempts,\n });\n continue;\n }\n\n // Try to process\n queuedEvent.attempts++;\n const processed = await this.#tryProcessQueuedEvent(queuedEvent, traceData);\n\n if (!processed) {\n // Move to waiting-for-parent if we now know the parent\n const parentId = queuedEvent.event.exportedSpan.parentSpanId;\n if (parentId && traceData.isRootProcessed()) {\n // Preserve attempts and queuedAt when moving between queues\n traceData.addToWaitingQueue({\n event: queuedEvent.event,\n waitingFor: parentId,\n attempts: queuedEvent.attempts,\n queuedAt: queuedEvent.queuedAt,\n });\n } else {\n toKeep.push(queuedEvent);\n }\n }\n }\n\n // Update the queue with remaining events\n traceData.clearWaitingForRoot();\n for (const event of toKeep) {\n // Preserve attempts and queuedAt when re-adding to queue\n traceData.addToWaitingQueue({\n event: event.event,\n waitingFor: 'root',\n attempts: event.attempts,\n queuedAt: event.queuedAt,\n });\n }\n }\n\n /**\n * Process events waiting for a specific parent span.\n */\n async #processWaitingFor(traceId: string, spanId: string): Promise<void> {\n if (this.#shutdownStarted) return;\n\n const traceData = this.#traceMap.get(traceId);\n if (!traceData) return;\n\n const queue = traceData.getEventsWaitingFor({ spanId });\n if (queue.length === 0) return;\n\n this.logger.debug(`${this.name}: Processing ${queue.length} events waiting for span`, { traceId, spanId });\n\n const toKeep: QueuedEvent[] = [];\n const now = Date.now();\n\n for (const queuedEvent of queue) {\n // Check TTL\n if (now - queuedEvent.queuedAt.getTime() > this.#earlyQueueTTLMs) {\n this.logger.warn(`${this.name}: Dropping event due to TTL expiry`, {\n traceId,\n spanId: queuedEvent.event.exportedSpan.id,\n waitingFor: queuedEvent.waitingFor,\n queuedAt: queuedEvent.queuedAt,\n attempts: queuedEvent.attempts,\n });\n continue;\n }\n\n // Check max attempts\n if (queuedEvent.attempts >= this.#earlyQueueMaxAttempts) {\n this.logger.warn(`${this.name}: Dropping event due to max attempts`, {\n traceId,\n spanId: queuedEvent.event.exportedSpan.id,\n waitingFor: queuedEvent.waitingFor,\n attempts: queuedEvent.attempts,\n });\n continue;\n }\n\n // Try to process\n queuedEvent.attempts++;\n const processed = await this.#tryProcessQueuedEvent(queuedEvent, traceData);\n\n if (!processed) {\n toKeep.push(queuedEvent);\n }\n }\n\n // Update the queue\n traceData.clearWaitingFor({ spanId });\n for (const event of toKeep) {\n // Preserve attempts and queuedAt when re-adding to queue\n traceData.addToWaitingQueue({\n event: event.event,\n waitingFor: spanId,\n attempts: event.attempts,\n queuedAt: event.queuedAt,\n });\n }\n }\n\n /**\n * Try to process a queued event.\n * Returns true if successfully processed, false if still waiting for dependencies.\n */\n async #tryProcessQueuedEvent(\n queuedEvent: QueuedEvent,\n traceData: TraceData<TRootData, TSpanData, TEventData, TMetadata>,\n ): Promise<boolean> {\n const { event } = queuedEvent;\n const { exportedSpan } = event;\n\n // Determine method\n const method = this.getMethod(event);\n\n try {\n switch (method) {\n case 'handleEventSpan': {\n traceData.addBranch({ spanId: exportedSpan.id, parentSpanId: exportedSpan.parentSpanId });\n const eventData = await this._buildEvent({ span: exportedSpan, traceData });\n if (eventData) {\n if (!this.skipCachingEventSpans) {\n traceData.addEvent({ eventId: exportedSpan.id, eventData });\n }\n // Successfully processed - schedule processing of events waiting for this one\n this.#scheduleProcessWaitingFor(exportedSpan.traceId, exportedSpan.id);\n return true;\n }\n return false;\n }\n\n case 'handleSpanStart': {\n traceData.addBranch({ spanId: exportedSpan.id, parentSpanId: exportedSpan.parentSpanId });\n const spanData = await this._buildSpan({ span: exportedSpan, traceData });\n if (spanData) {\n traceData.addSpan({ spanId: exportedSpan.id, spanData });\n // Mark root as processed if this is the root span\n if (exportedSpan.isRootSpan) {\n traceData.markRootSpanProcessed();\n }\n // Successfully processed - schedule processing of events waiting for this one\n this.#scheduleProcessWaitingFor(exportedSpan.traceId, exportedSpan.id);\n return true;\n }\n return false;\n }\n\n case 'handleSpanUpdate': {\n await this._updateSpan({ span: exportedSpan, traceData });\n return true;\n }\n\n case 'handleSpanEnd': {\n traceData.endSpan({ spanId: exportedSpan.id });\n await this._finishSpan({ span: exportedSpan, traceData });\n // Check if we should schedule cleanup\n if (traceData.activeSpanCount() === 0) {\n this.#scheduleCleanup(exportedSpan.traceId);\n }\n return true;\n }\n default:\n // Should never happen - exhaustive switch\n return false;\n }\n } catch (error) {\n this.logger.error(`${this.name}: Error processing queued event`, { error, event, method });\n return false;\n }\n }\n\n // ============================================================================\n // Delayed Cleanup\n // ============================================================================\n\n /**\n * Schedule cleanup of trace data after a delay.\n * Allows late-arriving data to still be processed.\n */\n #scheduleCleanup(traceId: string): void {\n // Cancel any existing scheduled cleanup for this trace\n this.#cancelScheduledCleanup(traceId);\n\n this.logger.debug(`${this.name}: Scheduling cleanup in ${this.#traceCleanupDelayMs}ms`, { traceId });\n\n const timeout = setTimeout(() => {\n this.#pendingCleanups.delete(traceId);\n this.#performCleanup(traceId);\n }, this.#traceCleanupDelayMs);\n\n this.#pendingCleanups.set(traceId, timeout);\n\n // Enforce soft cap on pending cleanups\n this.#enforcePendingCleanupCap();\n }\n\n /**\n * Cancel a scheduled cleanup for a trace.\n */\n #cancelScheduledCleanup(traceId: string): void {\n const existingTimeout = this.#pendingCleanups.get(traceId);\n if (existingTimeout) {\n clearTimeout(existingTimeout);\n this.#pendingCleanups.delete(traceId);\n this.logger.debug(`${this.name}: Cancelled scheduled cleanup`, { traceId });\n }\n }\n\n /**\n * Perform the actual cleanup of trace data.\n */\n #performCleanup(traceId: string): void {\n const traceData = this.#traceMap.get(traceId);\n if (!traceData) return;\n\n // Log any orphaned events in the queue\n const orphanedEvents = traceData.getAllQueuedEvents();\n if (orphanedEvents.length > 0) {\n this.logger.warn(`${this.name}: Dropping ${orphanedEvents.length} orphaned events on cleanup`, {\n traceId,\n orphanedEvents: orphanedEvents.map(e => ({\n spanId: e.event.exportedSpan.id,\n waitingFor: e.waitingFor,\n attempts: e.attempts,\n queuedAt: e.queuedAt,\n })),\n });\n }\n\n // Remove from trace map (O(1) - Map maintains insertion order automatically)\n this.#traceMap.delete(traceId);\n\n this.logger.debug(`${this.name}: Cleaned up trace data`, { traceId });\n }\n\n // ============================================================================\n // Cap Enforcement\n // ============================================================================\n\n /**\n * Enforce soft cap on pending cleanup traces.\n * Only removes traces with activeSpanCount == 0.\n */\n #enforcePendingCleanupCap(): void {\n if (this.#pendingCleanups.size <= this.#maxPendingCleanupTraces) {\n return;\n }\n\n const toRemove = this.#pendingCleanups.size - this.#maxPendingCleanupTraces;\n this.logger.warn(`${this.name}: Pending cleanup cap exceeded, force-cleaning ${toRemove} traces`, {\n pendingCount: this.#pendingCleanups.size,\n cap: this.#maxPendingCleanupTraces,\n });\n\n // Remove oldest pending cleanups (Map.keys() iterates in insertion order)\n let removed = 0;\n for (const traceId of this.#traceMap.keys()) {\n if (removed >= toRemove) break;\n\n if (this.#pendingCleanups.has(traceId)) {\n this.#cancelScheduledCleanup(traceId);\n this.#performCleanup(traceId);\n removed++;\n }\n }\n }\n\n /**\n * Enforce hard cap on total traces.\n * Will kill even active traces if necessary.\n * Uses a flag to prevent concurrent executions when called fire-and-forget.\n */\n async #enforceHardCap(): Promise<void> {\n // Skip if already under cap or enforcement already in progress\n if (this.#traceMap.size <= this.#maxTotalTraces || this.#hardCapEnforcementInProgress) {\n return;\n }\n\n this.#hardCapEnforcementInProgress = true;\n try {\n // Re-check after acquiring the flag (another call may have just finished)\n if (this.#traceMap.size <= this.#maxTotalTraces) {\n return;\n }\n\n const toRemove = this.#traceMap.size - this.#maxTotalTraces;\n this.logger.warn(`${this.name}: Total trace cap exceeded, killing ${toRemove} oldest traces`, {\n traceCount: this.#traceMap.size,\n cap: this.#maxTotalTraces,\n });\n\n const reason: SpanErrorInfo = {\n id: 'TRACE_CAP_EXCEEDED',\n message: 'Trace killed due to memory cap enforcement.',\n domain: 'MASTRA_OBSERVABILITY',\n category: 'SYSTEM',\n };\n\n let removed = 0;\n // Use a copy of keys since we're modifying the map during iteration\n for (const traceId of [...this.#traceMap.keys()]) {\n if (removed >= toRemove) break;\n\n const traceData = this.#traceMap.get(traceId);\n if (traceData) {\n // Abort any active spans\n for (const spanId of traceData.activeSpanIds) {\n const span = traceData.getSpan({ spanId });\n if (span) {\n await this._abortSpan({ span, traceData, reason });\n }\n }\n\n // Cancel any pending cleanup and remove\n this.#cancelScheduledCleanup(traceId);\n this.#performCleanup(traceId);\n removed++;\n }\n }\n } finally {\n this.#hardCapEnforcementInProgress = false;\n }\n }\n\n // ============================================================================\n // Lifecycle Hooks (Override in subclass)\n // ============================================================================\n\n /**\n * Hook called before processing each tracing event.\n * Override to transform or enrich the event before processing.\n *\n * Note: The customSpanFormatter is applied at the BaseExporter level before this hook.\n * Subclasses can override this to add additional pre-processing logic.\n *\n * @param event - The incoming tracing event\n * @returns The (possibly modified) event to process\n */\n protected async _preExportTracingEvent(event: TracingEvent): Promise<TracingEvent> {\n return event;\n }\n\n /**\n * Hook called after processing each tracing event.\n * Override to perform post-processing actions like flushing.\n */\n protected async _postExportTracingEvent(): Promise<void> {}\n\n // ============================================================================\n // Abstract Methods (Must implement in subclass)\n // ============================================================================\n\n /**\n * Build the vendor-specific root/trace object for a new trace.\n * Called when the first span of a trace arrives (if skipBuildRootTask is false).\n *\n * @param args.span - The root span data\n * @param args.traceData - The trace data container\n * @returns The vendor-specific root object, or undefined if unable to create\n */\n protected abstract _buildRoot(args: {\n span: AnyExportedSpan;\n traceData: TraceData<TRootData, TSpanData, TEventData, TMetadata>;\n }): Promise<TRootData | undefined>;\n\n /**\n * Build a vendor-specific event object.\n * Events are zero-duration spans used for logging discrete occurrences.\n *\n * @param args.span - The event span data\n * @param args.traceData - The trace data container\n * @returns The vendor-specific event object, or undefined if parent not ready\n */\n protected abstract _buildEvent(args: {\n span: AnyExportedSpan;\n traceData: TraceData<TRootData, TSpanData, TEventData, TMetadata>;\n }): Promise<TEventData | undefined>;\n\n /**\n * Build a vendor-specific span object when a span starts.\n * Should create the span in the vendor system and return the SDK object.\n *\n * @param args.span - The span data\n * @param args.traceData - The trace data container\n * @returns The vendor-specific span object, or undefined if parent not ready\n */\n protected abstract _buildSpan(args: {\n span: AnyExportedSpan;\n traceData: TraceData<TRootData, TSpanData, TEventData, TMetadata>;\n }): Promise<TSpanData | undefined>;\n\n /**\n * Update a span with new data (called on span_updated events).\n * Should update the vendor span with any new attributes, metrics, etc.\n *\n * @param args.span - The updated span data\n * @param args.traceData - The trace data container\n */\n protected abstract _updateSpan(args: {\n span: AnyExportedSpan;\n traceData: TraceData<TRootData, TSpanData, TEventData, TMetadata>;\n }): Promise<void>;\n\n /**\n * Finish a span (called on span_ended events).\n * Should close/end the span in the vendor system with final data.\n *\n * @param args.span - The ended span data\n * @param args.traceData - The trace data container\n */\n protected abstract _finishSpan(args: {\n span: AnyExportedSpan;\n traceData: TraceData<TRootData, TSpanData, TEventData, TMetadata>;\n }): Promise<void>;\n\n /**\n * Abort a span due to shutdown or memory cap enforcement.\n * Should mark the span as failed/aborted in the vendor system.\n *\n * @param args.span - The vendor-specific span object to abort\n * @param args.traceData - The trace data container\n * @param args.reason - Error info describing why the span was aborted\n */\n protected abstract _abortSpan(args: {\n span: TSpanData;\n traceData: TraceData<TRootData, TSpanData, TEventData, TMetadata>;\n reason: SpanErrorInfo;\n }): Promise<void>;\n\n // ============================================================================\n // Behavior Flags (Override in subclass as needed)\n // ============================================================================\n\n /**\n * If true, skip calling _buildRoot and let root spans go through _buildSpan.\n * Use when the vendor doesn't have a separate trace/root concept.\n * @default false\n */\n protected skipBuildRootTask = false;\n\n /**\n * If true, skip processing span_updated events entirely.\n * Use when the vendor doesn't support incremental span updates.\n * @default false\n */\n protected skipSpanUpdateEvents = false;\n\n /**\n * If true, don't cache event spans in TraceData.\n * Use when events can't be parents of other spans.\n * @default false\n */\n protected skipCachingEventSpans = false;\n\n private getMethod(event: TracingEvent): 'handleEventSpan' | 'handleSpanStart' | 'handleSpanUpdate' | 'handleSpanEnd' {\n if (event.exportedSpan.isEvent) {\n return 'handleEventSpan';\n }\n const eventType = event.type;\n switch (eventType) {\n case TracingEventType.SPAN_STARTED:\n return 'handleSpanStart';\n case TracingEventType.SPAN_UPDATED:\n return 'handleSpanUpdate';\n case TracingEventType.SPAN_ENDED:\n return 'handleSpanEnd';\n default: {\n // Exhaustive check - TypeScript will error if new TracingEventType values are added\n const _exhaustiveCheck: never = eventType;\n throw new Error(`Unhandled event type: ${_exhaustiveCheck}`);\n }\n }\n }\n\n protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n if (this.#shutdownStarted) {\n return;\n }\n\n const method = this.getMethod(event);\n if (method == 'handleSpanUpdate' && this.skipSpanUpdateEvents) {\n return;\n }\n\n const traceId = event.exportedSpan.traceId;\n const traceData = this.getTraceData({ traceId, method });\n\n const { exportedSpan } = await this._preExportTracingEvent(event);\n\n // Handle root span building for exporters that need it\n if (!this.skipBuildRootTask && !traceData.hasRoot()) {\n if (exportedSpan.isRootSpan) {\n this.logger.debug(`${this.name}: Building root`, {\n traceId: exportedSpan.traceId,\n spanId: exportedSpan.id,\n });\n const rootData = await this._buildRoot({ span: exportedSpan, traceData });\n if (rootData) {\n this.logger.debug(`${this.name}: Adding root`, {\n traceId: exportedSpan.traceId,\n spanId: exportedSpan.id,\n });\n traceData.addRoot({ rootId: exportedSpan.id, rootData });\n // Root is now processed, trigger async processing of waiting events\n this.#scheduleProcessWaitingForRoot(traceId);\n }\n // Note: Root span still continues to handleSpanStart below to track\n // the span as active and call _buildSpan for vendor-specific handling\n } else {\n this.logger.debug(`${this.name}: Root does not exist, adding span to waiting queue.`, {\n traceId: exportedSpan.traceId,\n spanId: exportedSpan.id,\n });\n traceData.addToWaitingQueue({ event, waitingFor: 'root' });\n return;\n }\n }\n\n if (exportedSpan.metadata && this.name in exportedSpan.metadata) {\n const metadata = exportedSpan.metadata[this.name] as TMetadata;\n this.logger.debug(`${this.name}: Found provider metadata in span`, {\n traceId: exportedSpan.traceId,\n spanId: exportedSpan.id,\n metadata,\n });\n traceData.addMetadata({ spanId: exportedSpan.id, metadata });\n }\n\n try {\n switch (method) {\n case 'handleEventSpan': {\n this.logger.debug(`${this.name}: handling event`, {\n traceId: exportedSpan.traceId,\n spanId: exportedSpan.id,\n });\n traceData.addBranch({ spanId: exportedSpan.id, parentSpanId: exportedSpan.parentSpanId });\n const eventData = await this._buildEvent({ span: exportedSpan, traceData });\n if (eventData) {\n if (!this.skipCachingEventSpans) {\n this.logger.debug(`${this.name}: adding event to traceData`, {\n traceId: exportedSpan.traceId,\n spanId: exportedSpan.id,\n });\n traceData.addEvent({ eventId: exportedSpan.id, eventData });\n }\n // Event created successfully, trigger processing of any waiting events\n this.#scheduleProcessWaitingFor(traceId, exportedSpan.id);\n } else {\n // Parent doesn't exist, queue for later\n const parentId = exportedSpan.parentSpanId;\n this.logger.debug(`${this.name}: adding event to waiting queue`, {\n traceId: exportedSpan.traceId,\n spanId: exportedSpan.id,\n waitingFor: parentId ?? 'root',\n });\n traceData.addToWaitingQueue({ event, waitingFor: parentId ?? 'root' });\n }\n break;\n }\n case 'handleSpanStart': {\n this.logger.debug(`${this.name}: handling span start`, {\n traceId: exportedSpan.traceId,\n spanId: exportedSpan.id,\n });\n traceData.addBranch({ spanId: exportedSpan.id, parentSpanId: exportedSpan.parentSpanId });\n const spanData = await this._buildSpan({ span: exportedSpan, traceData });\n if (spanData) {\n this.logger.debug(`${this.name}: adding span to traceData`, {\n traceId: exportedSpan.traceId,\n spanId: exportedSpan.id,\n });\n traceData.addSpan({ spanId: exportedSpan.id, spanData });\n // Mark root as processed for skipBuildRootTask exporters\n if (exportedSpan.isRootSpan) {\n traceData.markRootSpanProcessed();\n this.#scheduleProcessWaitingForRoot(traceId);\n }\n // Span created successfully, trigger processing of any waiting events\n this.#scheduleProcessWaitingFor(traceId, exportedSpan.id);\n } else {\n // Parent doesn't exist, queue for later\n const parentId = exportedSpan.parentSpanId;\n this.logger.debug(`${this.name}: adding span to waiting queue`, {\n traceId: exportedSpan.traceId,\n waitingFor: parentId ?? 'root',\n });\n traceData.addToWaitingQueue({ event, waitingFor: parentId ?? 'root' });\n }\n break;\n }\n case 'handleSpanUpdate':\n this.logger.debug(`${this.name}: handling span update`, {\n traceId: exportedSpan.traceId,\n spanId: exportedSpan.id,\n });\n await this._updateSpan({ span: exportedSpan, traceData });\n break;\n case 'handleSpanEnd':\n this.logger.debug(`${this.name}: handling span end`, {\n traceId: exportedSpan.traceId,\n spanId: exportedSpan.id,\n });\n traceData.endSpan({ spanId: exportedSpan.id });\n await this._finishSpan({ span: exportedSpan, traceData });\n // Schedule cleanup when all spans have ended\n if (traceData.activeSpanCount() === 0) {\n this.#scheduleCleanup(traceId);\n }\n break;\n }\n } catch (error) {\n this.logger.error(`${this.name}: exporter error`, { error, event, method });\n }\n\n // Reschedule cleanup if all spans have ended\n // This handles the case where late data arrives after all spans ended\n // (getTraceData cancels any existing cleanup, so we need to reschedule)\n if (traceData.activeSpanCount() === 0) {\n this.#scheduleCleanup(traceId);\n }\n\n await this._postExportTracingEvent();\n }\n\n // ============================================================================\n // Protected Helpers\n // ============================================================================\n\n /**\n * Get or create the TraceData container for a trace.\n * Also cancels any pending cleanup since new data has arrived.\n *\n * @param args.traceId - The trace ID\n * @param args.method - The calling method name (for logging)\n * @returns The TraceData container for this trace\n */\n protected getTraceData(args: {\n traceId: string;\n method: string;\n }): TraceData<TRootData, TSpanData, TEventData, TMetadata> {\n const { traceId, method } = args;\n\n // Cancel any scheduled cleanup - new data has arrived\n this.#cancelScheduledCleanup(traceId);\n\n if (!this.#traceMap.has(traceId)) {\n this.#traceMap.set(traceId, new TraceData());\n // Note: Map.set() maintains insertion order automatically\n this.logger.debug(`${this.name}: Created new trace data cache`, {\n traceId,\n method,\n });\n\n // Enforce hard cap on total traces\n this.#enforceHardCap().catch(error => {\n this.logger.error(`${this.name}: Error enforcing hard cap`, { error });\n });\n }\n return this.#traceMap.get(traceId)!;\n }\n\n /**\n * Get the current number of traces being tracked.\n * @returns The trace count\n */\n protected traceMapSize(): number {\n return this.#traceMap.size;\n }\n\n // ============================================================================\n // Flush and Shutdown Hooks (Override in subclass as needed)\n // ============================================================================\n\n /**\n * Hook called by flush() to perform vendor-specific flush logic.\n * Override to send buffered data to the vendor's API.\n *\n * Unlike _postShutdown(), this method should NOT release resources,\n * as the exporter will continue to be used after flushing.\n */\n protected async _flush(): Promise<void> {}\n\n /**\n * Force flush any buffered data 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 * Subclasses should override _flush() to implement vendor-specific flush logic.\n */\n async flush(): Promise<void> {\n if (this.isDisabled) {\n return;\n }\n\n this.logger.debug(`${this.name}: Flushing`);\n await this._flush();\n }\n\n /**\n * Hook called at the start of shutdown, before cancelling timers and aborting spans.\n * Override to perform vendor-specific pre-shutdown tasks.\n */\n protected async _preShutdown(): Promise<void> {}\n\n /**\n * Hook called at the end of shutdown, after all spans are aborted.\n * Override to perform vendor-specific cleanup (e.g., flushing).\n */\n protected async _postShutdown(): Promise<void> {}\n\n /**\n * Gracefully shut down the exporter.\n * Cancels all pending cleanup timers, aborts all active spans, and clears state.\n */\n async shutdown(): Promise<void> {\n if (this.isDisabled) {\n return;\n }\n\n this.#shutdownStarted = true;\n await this._preShutdown();\n\n // Cancel all pending cleanup timers\n for (const [traceId, timeout] of this.#pendingCleanups) {\n clearTimeout(timeout);\n this.logger.debug(`${this.name}: Cancelled pending cleanup on shutdown`, { traceId });\n }\n this.#pendingCleanups.clear();\n\n // End all active spans\n const reason: SpanErrorInfo = {\n id: 'SHUTDOWN',\n message: 'Observability is shutting down.',\n domain: 'MASTRA_OBSERVABILITY',\n category: 'SYSTEM',\n };\n\n for (const [traceId, traceData] of this.#traceMap) {\n // Log any orphaned events\n const orphanedEvents = traceData.getAllQueuedEvents();\n if (orphanedEvents.length > 0) {\n this.logger.warn(`${this.name}: Dropping ${orphanedEvents.length} orphaned events on shutdown`, {\n traceId,\n orphanedEvents: orphanedEvents.map(e => ({\n spanId: e.event.exportedSpan.id,\n waitingFor: e.waitingFor,\n attempts: e.attempts,\n })),\n });\n }\n\n // Abort active spans\n for (const spanId of traceData.activeSpanIds) {\n const span = traceData.getSpan({ spanId });\n if (span) {\n await this._abortSpan({ span, traceData, reason });\n }\n }\n }\n\n this.#traceMap.clear();\n await this._postShutdown();\n await super.shutdown();\n }\n}\n","/**\n * Utility functions for working with custom span formatters.\n */\n\nimport type { AnyExportedSpan, CustomSpanFormatter } from '@mastra/core/observability';\n\n/**\n * Chains multiple span formatters into a single formatter.\n *\n * Formatters are applied in order, with each receiving the output of the previous.\n * Supports both synchronous and asynchronous formatters - if any formatter returns\n * a Promise, the entire chain will return a Promise.\n *\n * @param formatters - Array of formatters to chain (can be sync or async)\n * @returns A single formatter that applies all formatters in sequence\n *\n * @example\n * ```typescript\n * // Chain sync formatters\n * const chainedFormatter = chainFormatters([\n * myPlainTextFormatter,\n * myRedactionFormatter,\n * ]);\n *\n * // Chain mixed sync and async formatters\n * const asyncChainedFormatter = chainFormatters([\n * myPlainTextFormatter, // sync\n * myAsyncEnrichmentFormatter, // async\n * ]);\n *\n * const exporter = new BraintrustExporter({\n * customSpanFormatter: chainedFormatter,\n * });\n * ```\n */\nexport function chainFormatters(formatters: CustomSpanFormatter[]): CustomSpanFormatter {\n return async (span: AnyExportedSpan): Promise<AnyExportedSpan> => {\n let currentSpan = span;\n for (const formatter of formatters) {\n currentSpan = await formatter(currentSpan);\n }\n return currentSpan;\n };\n}\n","import type { IMastraLogger } from '@mastra/core/logger';\nimport { fetchWithRetry } from '@mastra/core/utils';\n\nconst AUTH_FAILURE_STATUSES = new Set([401, 403]);\nconst AUTH_COOLDOWN_BASE_MS = 60_000;\n// Target cap before jitter; positive jitter can exceed this to avoid synchronized retry probes.\nconst AUTH_COOLDOWN_MAX_MS = 15 * 60_000;\nconst AUTH_COOLDOWN_JITTER_RATIO = 0.1;\n\nexport class AuthFailureError extends Error {\n readonly status: number;\n\n constructor(status: number, cause?: unknown) {\n super(`Request failed with authentication status: ${status}`, { cause });\n this.name = 'AuthFailureError';\n this.status = status;\n }\n}\n\nexport function isAuthFailureError(error: unknown): error is AuthFailureError {\n return error instanceof AuthFailureError;\n}\n\nfunction isAuthFailureStatus(status: number): boolean {\n return AUTH_FAILURE_STATUSES.has(status);\n}\n\nexport async function fetchWithAuthFailureHandling(\n url: string,\n options: RequestInit,\n maxRetries: number,\n): Promise<void> {\n let authFailureStatus: number | undefined;\n\n try {\n await fetchWithRetry(url, options, maxRetries, {\n shouldRetryResponse: response => {\n if (isAuthFailureStatus(response.status)) {\n authFailureStatus = response.status;\n return false;\n }\n\n return true;\n },\n });\n } catch (error) {\n if (authFailureStatus !== undefined) {\n throw new AuthFailureError(authFailureStatus, error);\n }\n\n throw error;\n }\n}\n\nexport class AuthFailureCooldown {\n private failureCount = 0;\n private cooldownUntilMs = 0;\n private droppedEventsDuringCooldown = 0;\n\n constructor(\n private readonly exporterName: string,\n private readonly getLogger: () => IMastraLogger,\n ) {}\n\n private shouldDropEvents(): boolean {\n return Date.now() < this.cooldownUntilMs;\n }\n\n dropEventIfCoolingDown(): boolean {\n return this.dropEventsIfCoolingDown(1);\n }\n\n dropEventsIfCoolingDown(count: number): boolean {\n if (!this.shouldDropEvents()) {\n return false;\n }\n\n this.droppedEventsDuringCooldown += count;\n return true;\n }\n\n reset(): number {\n const droppedEventsDuringCooldown = this.droppedEventsDuringCooldown;\n\n this.failureCount = 0;\n this.cooldownUntilMs = 0;\n this.droppedEventsDuringCooldown = 0;\n\n return droppedEventsDuringCooldown;\n }\n\n recordFailure(args: { status: number; failedSignals: string[]; droppedBatchSize: number }): void {\n this.failureCount++;\n const droppedEventsDuringCooldown = this.droppedEventsDuringCooldown;\n this.droppedEventsDuringCooldown = 0;\n\n const targetCooldownMs = Math.min(AUTH_COOLDOWN_BASE_MS * Math.pow(2, this.failureCount - 1), AUTH_COOLDOWN_MAX_MS);\n const jitterMs = Math.floor(targetCooldownMs * AUTH_COOLDOWN_JITTER_RATIO * (Math.random() - 0.5) * 2);\n const cooldownMs = Math.max(AUTH_COOLDOWN_BASE_MS, targetCooldownMs + jitterMs);\n const cooldownSeconds = Math.ceil(cooldownMs / 1000);\n\n this.cooldownUntilMs = Date.now() + cooldownMs;\n\n this.getLogger().warn(\n `${this.exporterName} received an authentication failure; pausing uploads for ${cooldownSeconds}s`,\n {\n status: args.status,\n failedSignals: args.failedSignals,\n droppedBatchSize: args.droppedBatchSize,\n droppedEventsDuringCooldown,\n authFailureCount: this.failureCount,\n cooldownMs,\n },\n );\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { LogLevel } from '@mastra/core/logger';\nimport { SpanType, TracingEventType } from '@mastra/core/observability';\nimport type {\n TracingEvent,\n AnyExportedSpan,\n LogEvent,\n MetricEvent,\n ScoreEvent,\n FeedbackEvent,\n} from '@mastra/core/observability';\nimport { AuthFailureCooldown, fetchWithAuthFailureHandling, isAuthFailureError } from './auth-failure-cooldown';\nimport { BaseExporter } from './base';\nimport type { BaseExporterConfig } from './base';\n\n/**\n * @deprecated Use `MastraPlatformExporterConfig` from `@mastra/observability`\n * instead. This type is kept for backward compatibility and will be removed in\n * a future major version.\n */\nexport interface CloudExporterConfig extends BaseExporterConfig {\n maxBatchSize?: number; // Default: 1000 spans\n maxBatchWaitMs?: number; // Default: 5000ms\n maxRetries?: number; // Default: 3\n\n // Cloud-specific configuration\n accessToken?: string; // Cloud access token (from env or config)\n projectId?: string; // Project ID for project-scoped collector routes\n endpoint?: string; // Base cloud endpoint\n tracesEndpoint?: string; // Explicit cloud traces endpoint override\n logsEndpoint?: string; // Explicit cloud logs endpoint override\n metricsEndpoint?: string; // Explicit cloud metrics endpoint override\n scoresEndpoint?: string; // Explicit cloud scores endpoint override\n feedbackEndpoint?: string; // Explicit cloud feedback endpoint override\n}\n\ntype CloudSignal = 'traces' | 'logs' | 'metrics' | 'scores' | 'feedback';\n\nconst SIGNAL_PUBLISH_SUFFIXES: Record<CloudSignal, string> = {\n traces: '/spans/publish',\n logs: '/logs/publish',\n metrics: '/metrics/publish',\n scores: '/scores/publish',\n feedback: '/feedback/publish',\n};\n\nconst DEFAULT_CLOUD_SPAN_FILTER = (span: AnyExportedSpan): boolean => span.type !== SpanType.MODEL_CHUNK;\n\nconst SIGNAL_PUBLISH_SEGMENTS: Record<CloudSignal, string> = {\n traces: 'spans',\n logs: 'logs',\n metrics: 'metrics',\n scores: 'scores',\n feedback: 'feedback',\n};\n\nfunction trimTrailingSlashes(value: string): string {\n let end = value.length;\n while (end > 0 && value.charCodeAt(end - 1) === 47) {\n end--;\n }\n return end === value.length ? value : value.slice(0, end);\n}\n\nfunction createInvalidEndpointError(endpoint: string, text: string, cause?: unknown): MastraError {\n return new MastraError(\n {\n id: `CLOUD_EXPORTER_INVALID_ENDPOINT`,\n text,\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.USER,\n details: {\n endpoint,\n },\n },\n cause,\n );\n}\n\nconst VALID_PROJECT_ID = /^[a-zA-Z0-9_-]+$/;\n\nfunction createInvalidProjectIdError(projectId: string): MastraError {\n return new MastraError({\n id: `CLOUD_EXPORTER_INVALID_PROJECT_ID`,\n text: 'CloudExporter projectId must only contain letters, numbers, hyphens, and underscores.',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.USER,\n details: {\n projectId,\n },\n });\n}\n\nfunction resolveBaseEndpoint(baseEndpoint: string): string {\n const normalizedEndpoint = trimTrailingSlashes(baseEndpoint);\n const invalidText =\n 'CloudExporter endpoint must be a base origin like \"https://collector.example.com\" with no path, search, or hash.';\n\n try {\n const parsedEndpoint = new URL(normalizedEndpoint);\n if (parsedEndpoint.pathname !== '/' || parsedEndpoint.search || parsedEndpoint.hash) {\n throw createInvalidEndpointError(baseEndpoint, invalidText);\n }\n return trimTrailingSlashes(parsedEndpoint.origin);\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n\n throw createInvalidEndpointError(baseEndpoint, invalidText, error);\n }\n}\n\nfunction buildSignalPath(signal: CloudSignal, projectId?: string): string {\n const signalSegment = SIGNAL_PUBLISH_SEGMENTS[signal];\n if (!projectId) {\n return `/ai/${signalSegment}/publish`;\n }\n\n return `/projects/${projectId}/ai/${signalSegment}/publish`;\n}\n\nfunction buildSignalEndpoint(baseEndpoint: string, signal: CloudSignal, projectId?: string): string {\n return `${baseEndpoint}${buildSignalPath(signal, projectId)}`;\n}\n\nfunction resolveExplicitSignalEndpoint(signal: CloudSignal, endpoint: string, projectId?: string): string {\n const normalizedEndpoint = trimTrailingSlashes(endpoint);\n const invalidText = `CloudExporter ${signal}Endpoint must be a base origin like \"https://collector.example.com\" or a full ${signal} publish URL ending in \"${SIGNAL_PUBLISH_SUFFIXES[signal]}\".`;\n\n try {\n const parsedEndpoint = new URL(normalizedEndpoint);\n if (parsedEndpoint.search || parsedEndpoint.hash) {\n throw createInvalidEndpointError(endpoint, invalidText);\n }\n\n const normalizedOrigin = trimTrailingSlashes(parsedEndpoint.origin);\n const normalizedPathname = trimTrailingSlashes(parsedEndpoint.pathname);\n\n if (!normalizedPathname || normalizedPathname === '/') {\n return buildSignalEndpoint(normalizedOrigin, signal, projectId);\n }\n\n if (normalizedPathname.endsWith(SIGNAL_PUBLISH_SUFFIXES[signal])) {\n return `${normalizedOrigin}${normalizedPathname}`;\n }\n\n throw createInvalidEndpointError(endpoint, invalidText);\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n\n throw createInvalidEndpointError(endpoint, invalidText, error);\n }\n}\n\nfunction deriveSignalEndpointFromTracesEndpoint(signal: CloudSignal, tracesEndpoint: string): string {\n if (signal === 'traces') {\n return tracesEndpoint;\n }\n\n const normalizedTracesEndpoint = trimTrailingSlashes(tracesEndpoint);\n const invalidText =\n 'CloudExporter tracesEndpoint must be a base origin like \"https://collector.example.com\" or a full traces publish URL ending in \"/spans/publish\".';\n\n try {\n const parsedEndpoint = new URL(normalizedTracesEndpoint);\n const normalizedOrigin = trimTrailingSlashes(parsedEndpoint.origin);\n const normalizedPathname = trimTrailingSlashes(parsedEndpoint.pathname);\n\n if (!normalizedPathname.endsWith(SIGNAL_PUBLISH_SUFFIXES.traces)) {\n throw createInvalidEndpointError(tracesEndpoint, invalidText);\n }\n\n const basePath = normalizedPathname.slice(0, -SIGNAL_PUBLISH_SUFFIXES.traces.length);\n return `${normalizedOrigin}${basePath}${SIGNAL_PUBLISH_SUFFIXES[signal]}`;\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n\n throw createInvalidEndpointError(tracesEndpoint, invalidText, error);\n }\n}\n\ninterface MastraCloudBuffer {\n spans: MastraCloudSpanRecord[];\n logs: MastraCloudLogRecord[];\n metrics: MastraCloudMetricRecord[];\n scores: MastraCloudScoreRecord[];\n feedback: MastraCloudFeedbackRecord[];\n firstEventTime?: Date;\n totalSize: number;\n}\n\ntype MastraCloudSpanRecord = AnyExportedSpan & {\n spanId: string;\n spanType: string;\n startedAt: Date;\n endedAt: Date | null;\n error: AnyExportedSpan['errorInfo'] | null;\n createdAt: Date;\n updatedAt: Date | null;\n};\n\ntype MastraCloudLogRecord = LogEvent['log'];\ntype MastraCloudMetricRecord = MetricEvent['metric'];\ntype MastraCloudScoreRecord = ScoreEvent['score'];\ntype MastraCloudFeedbackRecord = FeedbackEvent['feedback'];\n\ntype ResolvedCloudConfig = {\n logger: BaseExporterConfig['logger'];\n logLevel: NonNullable<BaseExporterConfig['logLevel']>;\n maxBatchSize: number;\n maxBatchWaitMs: number;\n maxRetries: number;\n accessToken: string;\n tracesEndpoint: string;\n logsEndpoint: string;\n metricsEndpoint: string;\n scoresEndpoint: string;\n feedbackEndpoint: string;\n};\n\n/**\n * @deprecated Use `MastraPlatformExporter` from `@mastra/observability` instead.\n * This class is preserved unchanged so existing integrations (including code\n * that matches on the `CLOUD_EXPORTER_*` error IDs or the\n * `mastra-cloud-observability-exporter` exporter name) keep working. It will\n * be removed in a future major version.\n */\nexport class CloudExporter extends BaseExporter {\n name = 'mastra-cloud-observability-exporter';\n\n private readonly cloudConfig: Readonly<ResolvedCloudConfig>;\n private readonly authFailureCooldown: AuthFailureCooldown;\n private buffer: MastraCloudBuffer;\n private flushTimer: NodeJS.Timeout | null = null;\n private inFlightFlushes = new Set<Promise<void>>();\n\n constructor(config: CloudExporterConfig = {}) {\n super(config);\n\n if (config.projectId !== undefined && !VALID_PROJECT_ID.test(config.projectId)) {\n throw createInvalidProjectIdError(config.projectId);\n }\n\n const accessToken = config.accessToken ?? process.env.MASTRA_CLOUD_ACCESS_TOKEN;\n const rawProjectId = config.projectId ?? process.env.MASTRA_PROJECT_ID;\n const projectId = rawProjectId && VALID_PROJECT_ID.test(rawProjectId) ? rawProjectId : undefined;\n if (!accessToken) {\n this.setDisabled('MASTRA_CLOUD_ACCESS_TOKEN environment variable not set.', 'debug');\n }\n\n const tracesEndpointOverride = config.tracesEndpoint ?? process.env.MASTRA_CLOUD_TRACES_ENDPOINT;\n let baseEndpoint: string | undefined;\n let tracesEndpoint: string;\n\n if (tracesEndpointOverride) {\n tracesEndpoint = resolveExplicitSignalEndpoint('traces', tracesEndpointOverride, projectId);\n } else {\n baseEndpoint = resolveBaseEndpoint(config.endpoint ?? 'https://observability.mastra.ai');\n tracesEndpoint = buildSignalEndpoint(baseEndpoint, 'traces', projectId);\n }\n\n const resolveConfiguredSignalEndpoint = (\n signal: Exclude<CloudSignal, 'traces'>,\n explicitEndpoint?: string,\n ): string => {\n if (explicitEndpoint) {\n return resolveExplicitSignalEndpoint(signal, explicitEndpoint, projectId);\n }\n\n if (tracesEndpointOverride) {\n return deriveSignalEndpointFromTracesEndpoint(signal, tracesEndpoint);\n }\n\n return buildSignalEndpoint(baseEndpoint!, signal, projectId);\n };\n\n this.cloudConfig = {\n logger: this.logger,\n logLevel: config.logLevel ?? LogLevel.INFO,\n maxBatchSize: config.maxBatchSize ?? 1000,\n maxBatchWaitMs: config.maxBatchWaitMs ?? 5000,\n maxRetries: config.maxRetries ?? 3,\n accessToken: accessToken || '',\n tracesEndpoint,\n logsEndpoint: resolveConfiguredSignalEndpoint('logs', config.logsEndpoint),\n metricsEndpoint: resolveConfiguredSignalEndpoint('metrics', config.metricsEndpoint),\n scoresEndpoint: resolveConfiguredSignalEndpoint('scores', config.scoresEndpoint),\n feedbackEndpoint: resolveConfiguredSignalEndpoint('feedback', config.feedbackEndpoint),\n };\n\n this.authFailureCooldown = new AuthFailureCooldown('CloudExporter', () => this.logger);\n\n this.buffer = {\n spans: [],\n logs: [],\n metrics: [],\n scores: [],\n feedback: [],\n totalSize: 0,\n };\n }\n\n protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n // Cloud Observability only process SPAN_ENDED events\n if (event.type !== TracingEventType.SPAN_ENDED) {\n return;\n }\n\n if (!DEFAULT_CLOUD_SPAN_FILTER(event.exportedSpan)) {\n return;\n }\n\n if (this.authFailureCooldown.dropEventIfCoolingDown()) {\n return;\n }\n\n this.addToBuffer(event);\n\n await this.handleBufferedEvent();\n }\n\n async onLogEvent(event: LogEvent): Promise<void> {\n if (this.isDisabled) {\n return;\n }\n\n if (this.authFailureCooldown.dropEventIfCoolingDown()) {\n return;\n }\n\n this.addLogToBuffer(event);\n await this.handleBufferedEvent();\n }\n\n async onMetricEvent(event: MetricEvent): Promise<void> {\n if (this.isDisabled) {\n return;\n }\n\n if (this.authFailureCooldown.dropEventIfCoolingDown()) {\n return;\n }\n\n this.addMetricToBuffer(event);\n await this.handleBufferedEvent();\n }\n\n async onScoreEvent(event: ScoreEvent): Promise<void> {\n if (this.isDisabled) {\n return;\n }\n\n if (this.authFailureCooldown.dropEventIfCoolingDown()) {\n return;\n }\n\n this.addScoreToBuffer(event);\n await this.handleBufferedEvent();\n }\n\n async onFeedbackEvent(event: FeedbackEvent): Promise<void> {\n if (this.isDisabled) {\n return;\n }\n\n if (this.authFailureCooldown.dropEventIfCoolingDown()) {\n return;\n }\n\n this.addFeedbackToBuffer(event);\n await this.handleBufferedEvent();\n }\n\n private addToBuffer(event: TracingEvent): void {\n this.markBufferStart();\n\n const spanRecord = this.formatSpan(event.exportedSpan);\n this.buffer.spans.push(spanRecord);\n this.buffer.totalSize++;\n }\n\n private addLogToBuffer(event: LogEvent): void {\n this.markBufferStart();\n\n this.buffer.logs.push(this.formatLog(event.log));\n this.buffer.totalSize++;\n }\n\n private addMetricToBuffer(event: MetricEvent): void {\n this.markBufferStart();\n\n this.buffer.metrics.push(this.formatMetric(event.metric));\n this.buffer.totalSize++;\n }\n\n private addScoreToBuffer(event: ScoreEvent): void {\n this.markBufferStart();\n\n this.buffer.scores.push(this.formatScore(event.score));\n this.buffer.totalSize++;\n }\n\n private addFeedbackToBuffer(event: FeedbackEvent): void {\n this.markBufferStart();\n\n this.buffer.feedback.push(this.formatFeedback(event.feedback));\n this.buffer.totalSize++;\n }\n\n private markBufferStart(): void {\n if (this.buffer.totalSize === 0) {\n this.buffer.firstEventTime = new Date();\n }\n }\n\n private formatSpan(span: AnyExportedSpan): MastraCloudSpanRecord {\n const spanRecord: MastraCloudSpanRecord = {\n ...span,\n spanId: span.id,\n spanType: span.type,\n startedAt: span.startTime,\n endedAt: span.endTime ?? null,\n error: span.errorInfo ?? null,\n createdAt: new Date(),\n updatedAt: null,\n };\n\n return spanRecord;\n }\n\n private formatLog(log: LogEvent['log']): MastraCloudLogRecord {\n return {\n ...log,\n };\n }\n\n private formatMetric(metric: MetricEvent['metric']): MastraCloudMetricRecord {\n return {\n ...metric,\n };\n }\n\n private formatScore(score: ScoreEvent['score']): MastraCloudScoreRecord {\n return {\n ...score,\n };\n }\n\n private formatFeedback(feedback: FeedbackEvent['feedback']): MastraCloudFeedbackRecord {\n return {\n ...feedback,\n };\n }\n\n private async handleBufferedEvent(): Promise<void> {\n if (this.shouldFlush()) {\n void this.flush().catch(error => {\n this.logger.error('Batch flush failed', {\n error: error instanceof Error ? error.message : String(error),\n });\n });\n } else if (this.buffer.totalSize === 1) {\n this.scheduleFlush();\n }\n }\n\n private shouldFlush(): boolean {\n // Size-based flush\n if (this.buffer.totalSize >= this.cloudConfig.maxBatchSize) {\n return true;\n }\n\n // Time-based flush\n if (this.buffer.firstEventTime && this.buffer.totalSize > 0) {\n const elapsed = Date.now() - this.buffer.firstEventTime.getTime();\n if (elapsed >= this.cloudConfig.maxBatchWaitMs) {\n return true;\n }\n }\n\n return false;\n }\n\n private scheduleFlush(): void {\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n }\n this.flushTimer = setTimeout(() => {\n void this.flush().catch(error => {\n const mastraError = new MastraError(\n {\n id: `CLOUD_EXPORTER_FAILED_TO_SCHEDULE_FLUSH`,\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.USER,\n },\n error,\n );\n this.logger.trackException(mastraError);\n this.logger.error('Scheduled flush failed', mastraError);\n });\n }, this.cloudConfig.maxBatchWaitMs);\n }\n\n private async flushBuffer(): Promise<void> {\n // Clear timer since we're flushing\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n this.flushTimer = null;\n }\n\n if (this.buffer.totalSize === 0) {\n return; // Nothing to flush\n }\n\n if (this.authFailureCooldown.dropEventsIfCoolingDown(this.buffer.totalSize)) {\n this.resetBuffer();\n return;\n }\n\n const startTime = Date.now();\n const spansCopy = [...this.buffer.spans];\n const logsCopy = [...this.buffer.logs];\n const metricsCopy = [...this.buffer.metrics];\n const scoresCopy = [...this.buffer.scores];\n const feedbackCopy = [...this.buffer.feedback];\n const batchSize = this.buffer.totalSize;\n const flushReason = this.buffer.totalSize >= this.cloudConfig.maxBatchSize ? 'size' : 'time';\n\n // Reset buffer immediately to prevent blocking new events\n this.resetBuffer();\n\n const results = await Promise.all([\n this.flushSignalBatch('traces', spansCopy),\n this.flushSignalBatch('logs', logsCopy),\n this.flushSignalBatch('metrics', metricsCopy),\n this.flushSignalBatch('scores', scoresCopy),\n this.flushSignalBatch('feedback', feedbackCopy),\n ]);\n\n const failedSignals = results.filter(result => !result.succeeded).map(result => result.signal);\n const authFailure = results.find(result => result.authFailureStatus !== undefined);\n\n const elapsed = Date.now() - startTime;\n\n if (failedSignals.length === 0) {\n const droppedEventsDuringAuthCooldown = this.authFailureCooldown.reset();\n const logData: Record<string, number | string> = {\n batchSize,\n flushReason,\n durationMs: elapsed,\n };\n\n if (droppedEventsDuringAuthCooldown > 0) {\n logData.droppedEventsDuringAuthCooldown = droppedEventsDuringAuthCooldown;\n }\n\n this.logger.debug('Batch flushed successfully', logData);\n return;\n }\n\n if (authFailure?.authFailureStatus !== undefined) {\n this.authFailureCooldown.recordFailure({\n status: authFailure.authFailureStatus,\n failedSignals,\n droppedBatchSize: batchSize,\n });\n }\n\n this.logger.warn('Batch flush completed with dropped signal batches', {\n batchSize,\n flushReason,\n durationMs: elapsed,\n failedSignals,\n });\n }\n\n /**\n * Uploads a signal batch to the configured cloud API using fetchWithRetry.\n */\n private async batchUpload<T>(signal: CloudSignal, records: T[]): Promise<void> {\n const headers = {\n Authorization: `Bearer ${this.cloudConfig.accessToken}`,\n 'Content-Type': 'application/json',\n };\n\n const endpointMap: Record<CloudSignal, string> = {\n traces: this.cloudConfig.tracesEndpoint,\n logs: this.cloudConfig.logsEndpoint,\n metrics: this.cloudConfig.metricsEndpoint,\n scores: this.cloudConfig.scoresEndpoint,\n feedback: this.cloudConfig.feedbackEndpoint,\n };\n\n const options: RequestInit = {\n method: 'POST',\n headers,\n body: JSON.stringify({ [SIGNAL_PUBLISH_SEGMENTS[signal]]: records }),\n };\n\n await fetchWithAuthFailureHandling(endpointMap[signal], options, this.cloudConfig.maxRetries);\n }\n\n private async flushSignalBatch<T>(\n signal: CloudSignal,\n records: T[],\n ): Promise<{ signal: CloudSignal; succeeded: boolean; authFailureStatus?: number }> {\n if (records.length === 0) {\n return { signal, succeeded: true };\n }\n\n try {\n await this.batchUpload(signal, records);\n return { signal, succeeded: true };\n } catch (error) {\n if (isAuthFailureError(error)) {\n return { signal, succeeded: false, authFailureStatus: error.status };\n }\n\n const errorId = `CLOUD_EXPORTER_FAILED_TO_BATCH_UPLOAD_${signal.toUpperCase()}` as Uppercase<string>;\n const mastraError = new MastraError(\n {\n id: errorId,\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.USER,\n details: {\n signal,\n droppedBatchSize: records.length,\n },\n },\n error,\n );\n this.logger.trackException(mastraError);\n this.logger.error('Batch upload failed after all retries, dropping batch', mastraError);\n return { signal, succeeded: false };\n }\n }\n\n private resetBuffer(): void {\n this.buffer.spans = [];\n this.buffer.logs = [];\n this.buffer.metrics = [];\n this.buffer.scores = [];\n this.buffer.feedback = [];\n this.buffer.firstEventTime = undefined;\n this.buffer.totalSize = 0;\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 // Skip if disabled\n if (this.isDisabled) {\n return;\n }\n\n while (this.buffer.totalSize > 0 || this.inFlightFlushes.size > 0) {\n if (this.buffer.totalSize > 0) {\n this.logger.debug('Flushing buffered events', {\n bufferedEvents: this.buffer.totalSize,\n });\n\n const flushPromise = this.flushBuffer();\n this.inFlightFlushes.add(flushPromise);\n\n try {\n await flushPromise;\n } finally {\n this.inFlightFlushes.delete(flushPromise);\n }\n\n continue;\n }\n\n await Promise.allSettled([...this.inFlightFlushes]);\n }\n }\n\n async shutdown(): Promise<void> {\n // Skip if disabled\n if (this.isDisabled) {\n return;\n }\n\n // Clear any pending timer\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n this.flushTimer = null;\n }\n\n try {\n await this.flush();\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: `CLOUD_EXPORTER_FAILED_TO_FLUSH_REMAINING_EVENTS_DURING_SHUTDOWN`,\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.USER,\n details: {\n remainingEvents: this.buffer.totalSize,\n },\n },\n error,\n );\n\n this.logger.trackException(mastraError);\n this.logger.error('Failed to flush remaining events during shutdown', mastraError);\n }\n\n this.logger.info('CloudExporter shutdown complete');\n }\n}\n","import { TracingEventType } from '@mastra/core/observability';\nimport type { TracingEvent } from '@mastra/core/observability';\nimport { BaseExporter } from './base';\nimport type { BaseExporterConfig } from './base';\n\nexport class ConsoleExporter extends BaseExporter {\n name = 'tracing-console-exporter';\n\n constructor(config: BaseExporterConfig = {}) {\n super(config);\n }\n\n protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n const span = event.exportedSpan;\n\n // Helper to safely stringify attributes (filtering already done by processor)\n const formatAttributes = (attributes: any) => {\n try {\n return JSON.stringify(attributes, null, 2);\n } catch (error) {\n const errMsg = error instanceof Error ? error.message : 'Unknown formatting error';\n return `[Unable to serialize attributes: ${errMsg}]`;\n }\n };\n\n // Helper to format duration\n const formatDuration = (startTime: Date, endTime?: Date) => {\n if (!endTime) return 'N/A';\n const duration = endTime.getTime() - startTime.getTime();\n return `${duration}ms`;\n };\n\n switch (event.type) {\n case TracingEventType.SPAN_STARTED:\n this.logger.info(`🚀 SPAN_STARTED`);\n this.logger.info(` Type: ${span.type}`);\n this.logger.info(` Name: ${span.name}`);\n this.logger.info(` ID: ${span.id}`);\n this.logger.info(` Trace ID: ${span.traceId}`);\n if (span.input !== undefined) {\n this.logger.info(` Input: ${formatAttributes(span.input)}`);\n }\n this.logger.info(` Attributes: ${formatAttributes(span.attributes)}`);\n this.logger.info('─'.repeat(80));\n break;\n\n case TracingEventType.SPAN_ENDED:\n const duration = formatDuration(span.startTime, span.endTime);\n this.logger.info(`✅ SPAN_ENDED`);\n this.logger.info(` Type: ${span.type}`);\n this.logger.info(` Name: ${span.name}`);\n this.logger.info(` ID: ${span.id}`);\n this.logger.info(` Duration: ${duration}`);\n this.logger.info(` Trace ID: ${span.traceId}`);\n if (span.input !== undefined) {\n this.logger.info(` Input: ${formatAttributes(span.input)}`);\n }\n if (span.output !== undefined) {\n this.logger.info(` Output: ${formatAttributes(span.output)}`);\n }\n if (span.errorInfo) {\n this.logger.info(` Error: ${formatAttributes(span.errorInfo)}`);\n }\n this.logger.info(` Attributes: ${formatAttributes(span.attributes)}`);\n this.logger.info('─'.repeat(80));\n break;\n\n case TracingEventType.SPAN_UPDATED:\n this.logger.info(`📝 SPAN_UPDATED`);\n this.logger.info(` Type: ${span.type}`);\n this.logger.info(` Name: ${span.name}`);\n this.logger.info(` ID: ${span.id}`);\n this.logger.info(` Trace ID: ${span.traceId}`);\n if (span.input !== undefined) {\n this.logger.info(` Input: ${formatAttributes(span.input)}`);\n }\n if (span.output !== undefined) {\n this.logger.info(` Output: ${formatAttributes(span.output)}`);\n }\n if (span.errorInfo) {\n this.logger.info(` Error: ${formatAttributes(span.errorInfo)}`);\n }\n this.logger.info(` Updated Attributes: ${formatAttributes(span.attributes)}`);\n this.logger.info('─'.repeat(80));\n break;\n\n default:\n this.logger.warn(`Tracing event type not implemented: ${(event as any).type}`);\n }\n }\n\n async shutdown(): Promise<void> {\n this.logger.info('ConsoleExporter shutdown');\n }\n}\n","import { TracingEventType } from '@mastra/core/observability';\nimport type { AnyExportedSpan, ObservabilityEvent } from '@mastra/core/observability';\nimport type { CreateSpanRecord, ObservabilityStorageStrategy, UpdateSpanRecord } from '@mastra/core/storage';\n\n/** Mixin interface that tracks how many times a buffered event has been retried. */\nexport interface RetryCount {\n retryCount: number;\n}\n\n/** A partial span update record keyed by trace and span ID. */\nexport interface UpdateSpanPartial {\n traceId: string;\n spanId: string;\n updates: Partial<UpdateSpanRecord>;\n}\n\n/** An observability event augmented with retry tracking for the buffer. */\nexport type BufferedEvent = ObservabilityEvent & RetryCount;\n\n/**\n * Buffers observability events (creates and updates) for batch flushing.\n * Handles strategy-aware routing of tracing events and tracks created spans\n * so updates can be deferred until their parent create has been flushed.\n */\nexport class EventBuffer {\n #preInit: BufferedEvent[] = [];\n #creates: BufferedEvent[] = [];\n #updates: BufferedEvent[] = [];\n #allCreatedSpans: Set<string> = new Set();\n #firstEventTime?: Date;\n #storageStrategy?: ObservabilityStorageStrategy;\n #maxRetries: number;\n\n constructor(args: { maxRetries: number }) {\n this.#maxRetries = args.maxRetries;\n }\n\n /** Initialize with a storage strategy and replay any pre-init events. */\n init(args: { strategy: ObservabilityStorageStrategy }): void {\n if (!this.#storageStrategy) {\n this.#storageStrategy = args.strategy;\n for (const event of this.#preInit) {\n this.addEvent(event);\n }\n this.#preInit = [];\n }\n }\n\n /** Clear the create and update buffers and reset the event timer. */\n reset() {\n this.#creates = [];\n this.#updates = [];\n this.#firstEventTime = undefined;\n }\n\n private setFirstEventTime(): void {\n if (!this.#firstEventTime) {\n this.#firstEventTime = new Date();\n }\n }\n\n private pushCreate(event: ObservabilityEvent): void {\n this.setFirstEventTime();\n this.#creates.push({ ...event, retryCount: 0 });\n }\n\n private pushUpdate(event: ObservabilityEvent): void {\n this.setFirstEventTime();\n this.#updates.push({ ...event, retryCount: 0 });\n }\n\n /** Route an event to the create or update buffer based on its type and the storage strategy. */\n addEvent(event: ObservabilityEvent) {\n if (!this.#storageStrategy) {\n this.#preInit.push({ ...event, retryCount: 0 });\n return;\n }\n\n switch (event.type) {\n case TracingEventType.SPAN_STARTED:\n // Strategy 'insert-only' ignores SPAN_STARTED events\n switch (this.#storageStrategy) {\n case 'realtime':\n case 'event-sourced':\n case 'batch-with-updates':\n this.pushCreate(event);\n break;\n }\n break;\n\n case TracingEventType.SPAN_UPDATED:\n // Strategies 'insert-only' and 'event-sourced' ignore SPAN_UPDATED events\n switch (this.#storageStrategy) {\n case 'realtime':\n case 'batch-with-updates':\n this.pushUpdate(event);\n break;\n }\n break;\n\n case TracingEventType.SPAN_ENDED:\n if (event.exportedSpan.isEvent) {\n this.pushCreate(event);\n } else {\n switch (this.#storageStrategy) {\n case 'realtime':\n case 'batch-with-updates':\n this.pushUpdate(event);\n break;\n default:\n this.pushCreate(event);\n break;\n }\n }\n break;\n\n default:\n // Non-tracing signals (metric, log, score, feedback) → creates\n this.pushCreate(event);\n break;\n }\n }\n\n /** Re-add failed create events to the buffer, returning events that exceed max retries. */\n reAddCreates(events: BufferedEvent[]): BufferedEvent[] {\n const retryable: BufferedEvent[] = [];\n const dropped: BufferedEvent[] = [];\n\n for (const e of events) {\n if (++e.retryCount <= this.#maxRetries) {\n retryable.push(e);\n } else {\n dropped.push(e);\n }\n }\n\n if (retryable.length > 0) {\n this.setFirstEventTime();\n this.#creates.push(...retryable);\n }\n\n return dropped;\n }\n\n /** Re-add failed update events to the buffer, returning events that exceed max retries. */\n reAddUpdates(events: BufferedEvent[]): BufferedEvent[] {\n const retryable: BufferedEvent[] = [];\n const dropped: BufferedEvent[] = [];\n\n for (const e of events) {\n if (++e.retryCount <= this.#maxRetries) {\n retryable.push(e);\n } else {\n dropped.push(e);\n }\n }\n\n if (retryable.length > 0) {\n this.setFirstEventTime();\n this.#updates.push(...retryable);\n }\n\n return dropped;\n }\n\n /** Snapshot of buffered create events. */\n get creates(): BufferedEvent[] {\n return [...this.#creates];\n }\n\n /** Snapshot of buffered update events. */\n get updates(): BufferedEvent[] {\n return [...this.#updates];\n }\n\n /** Total number of buffered events (creates + updates). */\n get totalSize(): number {\n return this.#creates.length + this.#updates.length;\n }\n\n /** Milliseconds since the first event was buffered in the current batch. */\n get elapsed(): number {\n if (!this.#firstEventTime) {\n return 0;\n }\n return Date.now() - this.#firstEventTime.getTime();\n }\n\n /**\n * Builds a unique span key for tracking\n */\n private buildSpanKey(span: CreateSpanRecord | UpdateSpanPartial | { traceId: string; spanId: string }): string {\n return `${span.traceId}:${span.spanId}`;\n }\n\n /** Track successfully created spans so updates can verify span existence before flushing. */\n addCreatedSpans(args: { records: CreateSpanRecord[] }): void {\n if (this.#storageStrategy === 'event-sourced' || this.#storageStrategy === 'insert-only') {\n // no need to track spans if strategy is 'insert-only' or 'event-sourced'\n return;\n }\n\n for (const createRecord of args.records) {\n // no need to track event spans\n if (!createRecord.isEvent) {\n this.#allCreatedSpans.add(this.buildSpanKey(createRecord));\n }\n }\n }\n\n /** Check whether a span's create record has already been flushed to storage. */\n spanExists(span: AnyExportedSpan): boolean {\n return this.#allCreatedSpans?.has(this.buildSpanKey({ traceId: span.traceId, spanId: span.id }));\n }\n\n /** Remove completed spans from tracking after their SPAN_ENDED updates are flushed. */\n endFinishedSpans(args: { records: UpdateSpanPartial[] }): void {\n if (this.#storageStrategy === 'event-sourced' || this.#storageStrategy === 'insert-only') {\n // no need to track spans if strategy is 'insert-only' or 'event-sourced'\n return;\n }\n args.records.forEach(r => {\n this.#allCreatedSpans.delete(this.buildSpanKey(r));\n });\n }\n}\n","import { MastraError, ErrorDomain } from '@mastra/core/error';\nimport type { IMastraLogger } from '@mastra/core/logger';\nimport type {\n TracingEvent,\n InitExporterOptions,\n MetricEvent,\n LogEvent,\n ScoreEvent,\n FeedbackEvent,\n ObservabilityDropEvent,\n ObservabilityDropReason,\n ObservabilityDropSignal,\n} from '@mastra/core/observability';\nimport { TracingEventType } from '@mastra/core/observability';\nimport type { ObservabilityStorage, TracingStorageStrategy, MastraCompositeStore } from '@mastra/core/storage';\nimport {\n buildCreateSpanRecord,\n buildUpdateSpanRecord,\n buildMetricRecord,\n buildLogRecord,\n buildScoreRecord,\n buildFeedbackRecord,\n} from '@mastra/core/storage';\nimport type { BaseExporterConfig } from './base';\nimport { BaseExporter } from './base';\nimport { EventBuffer } from './event-buffer';\nimport type { BufferedEvent, RetryCount, UpdateSpanPartial } from './event-buffer';\n\n/**\n * Configuration for the DefaultExporter's batching, retry, and strategy behavior.\n *\n * @deprecated Use `MastraStorageExporterConfig` from `@mastra/observability` instead.\n * This interface is kept for backward compatibility and will be removed in a\n * future major version.\n */\ninterface DefaultExporterConfig extends BaseExporterConfig {\n maxBatchSize?: number; // Default: 1000 spans\n maxBufferSize?: number; // Default: 10000 spans\n maxBatchWaitMs?: number; // Default: 5000ms\n maxRetries?: number; // Default: 4\n retryDelayMs?: number; // Default: 500ms (base delay for exponential backoff)\n\n // Strategy selection (optional)\n strategy?: TracingStorageStrategy | 'auto';\n}\n\n/**\n * Resolves the final tracing storage strategy based on config and observability store hints\n */\nfunction resolveTracingStorageStrategy(\n config: DefaultExporterConfig,\n observabilityStorage: ObservabilityStorage,\n storageName: string,\n logger: IMastraLogger,\n): TracingStorageStrategy {\n const observabilityStrategy = observabilityStorage.observabilityStrategy;\n if (config.strategy && config.strategy !== 'auto') {\n if (observabilityStrategy.supported.includes(config.strategy)) {\n return config.strategy;\n }\n // Log warning and fall through to auto-selection\n logger.warn('User-specified tracing strategy not supported by storage adapter, falling back to auto-selection', {\n userStrategy: config.strategy,\n storageAdapter: storageName,\n supportedStrategies: observabilityStrategy.supported,\n fallbackStrategy: observabilityStrategy.preferred,\n });\n }\n return observabilityStrategy.preferred;\n}\n\ntype Resolve = (value: void | PromiseLike<void>) => void;\n\n/**\n * @deprecated Use `MastraStorageExporter` from `@mastra/observability` instead.\n * This class is preserved unchanged so existing integrations (including code\n * that matches on the `mastra-default-observability-exporter` exporter name)\n * keep working. It will be removed in a future major version.\n *\n * Default storage-backed exporter. Buffers observability events and flushes them\n * in batches to the configured ObservabilityStorage backend with retry support.\n */\nexport class DefaultExporter extends BaseExporter {\n name = 'mastra-default-observability-exporter';\n\n #config: DefaultExporterConfig;\n #isInitializing = false;\n #initPromises: Set<Resolve> = new Set();\n #eventBuffer: EventBuffer;\n\n #storage?: MastraCompositeStore;\n #observabilityStorage?: ObservabilityStorage;\n #resolvedStrategy?: TracingStorageStrategy;\n #flushTimer?: NodeJS.Timeout;\n #emitDropEvent?: (event: ObservabilityDropEvent) => void;\n\n // Signals whose storage methods threw \"not implemented\" — skip on future flushes\n #unsupportedSignals: Set<ObservabilityDropSignal> = new Set();\n\n constructor(config: DefaultExporterConfig = {}) {\n super(config);\n\n // Set default configuration\n this.#config = {\n ...config,\n maxBatchSize: config.maxBatchSize ?? 1000,\n maxBufferSize: config.maxBufferSize ?? 10000,\n maxBatchWaitMs: config.maxBatchWaitMs ?? 5000,\n maxRetries: config.maxRetries ?? 4,\n retryDelayMs: config.retryDelayMs ?? 500,\n strategy: config.strategy ?? 'auto',\n };\n\n this.#eventBuffer = new EventBuffer({ maxRetries: this.#config.maxRetries ?? 4 });\n }\n\n /**\n * Initialize the exporter (called after all dependencies are ready)\n */\n async init(options: InitExporterOptions): Promise<void> {\n try {\n this.#isInitializing = true;\n this.#emitDropEvent = options.emitDropEvent;\n\n this.#storage = options.mastra?.getStorage();\n if (!this.#storage) {\n this.logger.warn('DefaultExporter disabled: Storage not available. Traces will not be persisted.');\n return;\n }\n\n this.#observabilityStorage = await this.#storage.getStore('observability');\n if (!this.#observabilityStorage) {\n this.logger.warn(\n 'DefaultExporter disabled: Observability storage not available. Traces will not be persisted.',\n );\n return;\n }\n\n // Initialize the resolved strategy once observability store is available\n if (!this.#resolvedStrategy) {\n this.#resolvedStrategy = resolveTracingStorageStrategy(\n this.#config,\n this.#observabilityStorage,\n this.#storage.constructor.name,\n this.logger,\n );\n\n this.logger.debug('tracing storage exporter initialized', {\n strategy: this.#resolvedStrategy,\n source: this.#config.strategy !== 'auto' ? 'user' : 'auto',\n storageAdapter: this.#storage.constructor.name,\n maxBatchSize: this.#config.maxBatchSize,\n maxBatchWaitMs: this.#config.maxBatchWaitMs,\n });\n }\n\n if (this.#resolvedStrategy) {\n this.#eventBuffer.init({ strategy: this.#resolvedStrategy });\n }\n } finally {\n this.#isInitializing = false;\n /**\n * Assumes caller waits until export of a parent span is completed before calling\n * export for child spans , order is not relevant for resolve\n */\n this.#initPromises.forEach(resolve => {\n resolve();\n });\n this.#initPromises.clear();\n }\n }\n\n /**\n * Checks if buffer should be flushed based on size or time triggers\n */\n private shouldFlush(): boolean {\n if (this.#resolvedStrategy === 'realtime') {\n return true;\n }\n\n // Emergency flush - buffer overflow\n if (this.#eventBuffer.totalSize >= this.#config.maxBufferSize!) {\n return true;\n }\n\n // Size-based flush\n if (this.#eventBuffer.totalSize >= this.#config.maxBatchSize!) {\n return true;\n }\n\n // Time-based flush\n if (this.#eventBuffer.totalSize > 0) {\n if (this.#eventBuffer.elapsed >= this.#config.maxBatchWaitMs!) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Schedules a flush using setTimeout\n */\n private scheduleFlush(): void {\n if (this.#flushTimer) {\n clearTimeout(this.#flushTimer);\n }\n this.#flushTimer = setTimeout(() => {\n this.flushBuffer().catch(error => {\n this.logger.error('Scheduled flush failed', {\n error: error instanceof Error ? error.message : String(error),\n });\n });\n }, this.#config.maxBatchWaitMs);\n }\n\n /**\n * Checks flush triggers and schedules/triggers flush as needed.\n * Called after adding any event to the buffer.\n * Returns the flush promise when flushing so callers can await it.\n */\n private async handleBatchedFlush(): Promise<void> {\n if (this.shouldFlush()) {\n await this.flushBuffer();\n } else if (this.#eventBuffer.totalSize === 1) {\n this.scheduleFlush();\n }\n }\n\n private sanitizeDropError(error: unknown): ObservabilityDropEvent['error'] {\n if (error instanceof MastraError) {\n return {\n id: error.id,\n domain: String(error.domain),\n message: error.message,\n };\n }\n\n if (error instanceof Error) {\n return { message: error.message };\n }\n\n return { message: String(error) };\n }\n\n private emitDrop(\n signal: ObservabilityDropSignal,\n reason: ObservabilityDropReason,\n count: number,\n error?: unknown,\n ): void {\n if (count === 0) return;\n\n const dropEvent: ObservabilityDropEvent = {\n type: 'drop',\n signal,\n reason,\n count,\n timestamp: new Date(),\n exporterName: this.name,\n ...(this.#observabilityStorage ? { storageName: this.#observabilityStorage.constructor.name } : {}),\n ...(error === undefined ? {} : { error: this.sanitizeDropError(error) }),\n };\n\n this.#emitDropEvent?.(dropEvent);\n }\n\n /**\n * Flush a batch of create events for a single signal type.\n * On \"not implemented\" errors, disables the signal for future flushes.\n * On other errors, re-adds events to the buffer for retry.\n */\n private async flushCreates<T extends BufferedEvent>(\n signal: ObservabilityDropSignal,\n events: T[],\n storageCall: (events: T[]) => Promise<void>,\n ): Promise<void> {\n if (events.length === 0) return;\n if (this.#unsupportedSignals.has(signal)) {\n this.emitDrop(signal, 'unsupported-storage', events.length);\n return;\n }\n\n try {\n await storageCall(events);\n } catch (error) {\n if (\n error instanceof MastraError &&\n error.domain === ErrorDomain.MASTRA_OBSERVABILITY &&\n error.id.endsWith('_NOT_IMPLEMENTED')\n ) {\n this.logger.warn(error.message);\n this.#unsupportedSignals.add(signal);\n this.emitDrop(signal, 'unsupported-storage', events.length, error);\n } else {\n const dropped = this.#eventBuffer.reAddCreates(events);\n this.emitDrop(signal, 'retry-exhausted', dropped.length, error);\n }\n }\n }\n\n /**\n * Flush span update/end events, deferring any whose span hasn't been created yet.\n * When `isEnd` is true, successfully flushed spans are removed from tracking.\n */\n private async flushSpanUpdates(\n events: (TracingEvent & RetryCount)[],\n deferredUpdates: BufferedEvent[],\n isEnd: boolean,\n ): Promise<void> {\n const deferredCountAtEntry = deferredUpdates.length;\n if (events.length === 0) return;\n if (this.#unsupportedSignals.has('tracing')) {\n this.emitDrop('tracing', 'unsupported-storage', events.length);\n return;\n }\n\n const partials: UpdateSpanPartial[] = [];\n for (const event of events) {\n const span = event.exportedSpan;\n if (this.#eventBuffer.spanExists(span)) {\n partials.push({\n traceId: span.traceId,\n spanId: span.id,\n updates: buildUpdateSpanRecord(span),\n });\n } else {\n deferredUpdates.push(event);\n }\n }\n\n if (partials.length === 0) return;\n\n try {\n await this.#observabilityStorage!.batchUpdateSpans({ records: partials });\n if (isEnd) {\n this.#eventBuffer.endFinishedSpans({ records: partials });\n }\n } catch (error) {\n if (\n error instanceof MastraError &&\n error.domain === ErrorDomain.MASTRA_OBSERVABILITY &&\n error.id.endsWith('_NOT_IMPLEMENTED')\n ) {\n this.logger.warn(error.message);\n this.#unsupportedSignals.add('tracing');\n deferredUpdates.length = 0;\n this.emitDrop('tracing', 'unsupported-storage', events.length + deferredCountAtEntry, error);\n } else {\n // `events` includes both partials-bound and newly-deferred entries, so\n // re-adding it would double-add the newly-deferred ones if they stayed\n // in deferredUpdates. Splice off only what this call appended — entries\n // from a prior flushSpanUpdates call must survive.\n const newlyDeferred = deferredUpdates.length - deferredCountAtEntry;\n if (newlyDeferred > 0) {\n deferredUpdates.splice(deferredUpdates.length - newlyDeferred, newlyDeferred);\n }\n const dropped = this.#eventBuffer.reAddUpdates(events);\n this.emitDrop('tracing', 'retry-exhausted', dropped.length, error);\n }\n }\n }\n\n /**\n * Flushes the current buffer to storage.\n *\n * Creates are flushed first, then their span keys are added to allCreatedSpans.\n * Updates are checked against allCreatedSpans — those whose span hasn't been\n * created yet are re-inserted into the live buffer for the next flush.\n * Completed spans (SPAN_ENDED) are cleaned up from allCreatedSpans after success.\n */\n private async flushBuffer(): Promise<void> {\n if (!this.#observabilityStorage) {\n this.logger.debug('Cannot flush. Observability storage is not initialized');\n return;\n }\n if (!this.#resolvedStrategy) {\n this.logger.debug('Cannot flush. Observability strategy is not resolved');\n return;\n }\n\n // Clear timer since we're flushing\n if (this.#flushTimer) {\n clearTimeout(this.#flushTimer);\n this.#flushTimer = undefined;\n }\n\n if (this.#eventBuffer.totalSize === 0) {\n return;\n }\n\n const startTime = Date.now();\n const batchSize = this.#eventBuffer.totalSize;\n\n // Snapshot and reset buffer so new events can accumulate during flush\n const creates = this.#eventBuffer.creates;\n const updates = this.#eventBuffer.updates;\n this.#eventBuffer.reset();\n\n const createFeedbackEvents: (FeedbackEvent & RetryCount)[] = [];\n const createLogEvents: (LogEvent & RetryCount)[] = [];\n const createMetricEvents: (MetricEvent & RetryCount)[] = [];\n const createScoreEvents: (ScoreEvent & RetryCount)[] = [];\n const createSpanEvents: (TracingEvent & RetryCount)[] = [];\n\n const updateSpanEvents: (TracingEvent & RetryCount)[] = [];\n const endSpanEvents: (TracingEvent & RetryCount)[] = [];\n\n for (const createEvent of creates) {\n switch (createEvent.type) {\n case 'feedback':\n createFeedbackEvents.push(createEvent);\n break;\n case 'log':\n createLogEvents.push(createEvent);\n break;\n case 'metric':\n createMetricEvents.push(createEvent);\n break;\n case 'score':\n createScoreEvents.push(createEvent);\n break;\n default:\n createSpanEvents.push(createEvent);\n break;\n }\n }\n\n for (const updateEvent of updates) {\n switch (updateEvent.type) {\n case TracingEventType.SPAN_UPDATED:\n updateSpanEvents.push(updateEvent);\n break;\n case TracingEventType.SPAN_ENDED:\n endSpanEvents.push(updateEvent);\n break;\n }\n }\n\n // Flush all creates in parallel — signals are independent\n await Promise.all([\n this.flushCreates('feedback', createFeedbackEvents, events =>\n this.#observabilityStorage!.batchCreateFeedback({ feedbacks: events.map(f => buildFeedbackRecord(f)) }),\n ),\n this.flushCreates('log', createLogEvents, events =>\n this.#observabilityStorage!.batchCreateLogs({ logs: events.map(l => buildLogRecord(l)) }),\n ),\n this.flushCreates('metric', createMetricEvents, events =>\n this.#observabilityStorage!.batchCreateMetrics({ metrics: events.map(m => buildMetricRecord(m)) }),\n ),\n this.flushCreates('score', createScoreEvents, events =>\n this.#observabilityStorage!.batchCreateScores({ scores: events.map(s => buildScoreRecord(s)) }),\n ),\n this.flushCreates('tracing', createSpanEvents, async events => {\n const records = events.map(t => buildCreateSpanRecord(t.exportedSpan));\n await this.#observabilityStorage!.batchCreateSpans({ records });\n this.#eventBuffer.addCreatedSpans({ records });\n }),\n ]);\n\n // Flush span updates and ends — check span existence, defer if not yet created\n const deferredUpdates: BufferedEvent[] = [];\n\n await this.flushSpanUpdates(updateSpanEvents, deferredUpdates, false);\n await this.flushSpanUpdates(endSpanEvents, deferredUpdates, true);\n\n if (deferredUpdates.length > 0) {\n if (this.#unsupportedSignals.has('tracing')) {\n this.emitDrop('tracing', 'unsupported-storage', deferredUpdates.length);\n deferredUpdates.length = 0;\n } else {\n const dropped = this.#eventBuffer.reAddUpdates(deferredUpdates);\n this.emitDrop('tracing', 'retry-exhausted', dropped.length);\n }\n }\n\n const elapsed = Date.now() - startTime;\n this.logger.debug('Batch flushed', {\n strategy: this.#resolvedStrategy,\n batchSize,\n durationMs: elapsed,\n deferredUpdates: deferredUpdates.length > 0 ? deferredUpdates.length : undefined,\n });\n return; // Success\n }\n\n async _exportTracingEvent(event: TracingEvent): Promise<void> {\n await this.waitForInit();\n if (!this.#observabilityStorage) {\n this.logger.debug('Cannot store traces. Observability storage is not initialized');\n return;\n }\n\n this.#eventBuffer.addEvent(event);\n await this.handleBatchedFlush();\n }\n\n /**\n * Resolves when an ongoing init call is finished\n * Doesn't wait for the caller to call init\n * @returns\n */\n private async waitForInit(): Promise<void> {\n if (!this.#isInitializing) return;\n return new Promise(resolve => {\n this.#initPromises.add(resolve);\n });\n }\n\n /**\n * Handle metric events — buffer for batch flush.\n */\n async onMetricEvent(event: MetricEvent): Promise<void> {\n await this.waitForInit();\n if (!this.#observabilityStorage) return;\n\n this.#eventBuffer.addEvent(event);\n await this.handleBatchedFlush();\n }\n\n /**\n * Handle log events — buffer for batch flush.\n */\n async onLogEvent(event: LogEvent): Promise<void> {\n await this.waitForInit();\n if (!this.#observabilityStorage) return;\n\n this.#eventBuffer.addEvent(event);\n await this.handleBatchedFlush();\n }\n\n /**\n * Handle score events — buffer for batch flush.\n */\n async onScoreEvent(event: ScoreEvent): Promise<void> {\n await this.waitForInit();\n if (!this.#observabilityStorage) return;\n\n this.#eventBuffer.addEvent(event);\n await this.handleBatchedFlush();\n }\n\n /**\n * Handle feedback events — buffer for batch flush.\n */\n async onFeedbackEvent(event: FeedbackEvent): Promise<void> {\n await this.waitForInit();\n if (!this.#observabilityStorage) return;\n\n this.#eventBuffer.addEvent(event);\n await this.handleBatchedFlush();\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.#eventBuffer.totalSize > 0) {\n this.logger.debug('Flushing buffered events', {\n bufferedEvents: this.#eventBuffer.totalSize,\n });\n await this.flushBuffer();\n }\n }\n\n async shutdown(): Promise<void> {\n // Clear any pending timer\n if (this.#flushTimer) {\n clearTimeout(this.#flushTimer);\n this.#flushTimer = undefined;\n }\n\n // Flush any remaining events\n await this.flush();\n\n this.logger.info('DefaultExporter shutdown complete');\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { LogLevel } from '@mastra/core/logger';\nimport { SpanType, TracingEventType } from '@mastra/core/observability';\nimport type {\n TracingEvent,\n AnyExportedSpan,\n LogEvent,\n MetricEvent,\n ScoreEvent,\n FeedbackEvent,\n} from '@mastra/core/observability';\nimport { AuthFailureCooldown, fetchWithAuthFailureHandling, isAuthFailureError } from './auth-failure-cooldown';\nimport { BaseExporter } from './base';\nimport type { BaseExporterConfig } from './base';\n\nexport interface MastraPlatformExporterConfig extends BaseExporterConfig {\n maxBatchSize?: number; // Default: 1000 spans\n maxBatchWaitMs?: number; // Default: 5000ms\n maxRetries?: number; // Default: 3\n\n accessToken?: string; // Mastra Observability access token (from env or config)\n projectId?: string; // Project ID for project-scoped collector routes\n endpoint?: string; // Base observability endpoint\n tracesEndpoint?: string; // Explicit traces endpoint override\n logsEndpoint?: string; // Explicit logs endpoint override\n metricsEndpoint?: string; // Explicit metrics endpoint override\n scoresEndpoint?: string; // Explicit scores endpoint override\n feedbackEndpoint?: string; // Explicit feedback endpoint override\n}\n\ntype PlatformSignal = 'traces' | 'logs' | 'metrics' | 'scores' | 'feedback';\n\nconst SIGNAL_PUBLISH_SUFFIXES: Record<PlatformSignal, string> = {\n traces: '/spans/publish',\n logs: '/logs/publish',\n metrics: '/metrics/publish',\n scores: '/scores/publish',\n feedback: '/feedback/publish',\n};\n\nconst DEFAULT_PLATFORM_SPAN_FILTER = (span: AnyExportedSpan): boolean => span.type !== SpanType.MODEL_CHUNK;\n\nconst SIGNAL_PUBLISH_SEGMENTS: Record<PlatformSignal, string> = {\n traces: 'spans',\n logs: 'logs',\n metrics: 'metrics',\n scores: 'scores',\n feedback: 'feedback',\n};\n\nfunction trimTrailingSlashes(value: string): string {\n let end = value.length;\n while (end > 0 && value.charCodeAt(end - 1) === 47) {\n end--;\n }\n return end === value.length ? value : value.slice(0, end);\n}\n\nfunction createInvalidEndpointError(endpoint: string, text: string, cause?: unknown): MastraError {\n return new MastraError(\n {\n id: `MASTRA_PLATFORM_EXPORTER_INVALID_ENDPOINT`,\n text,\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.USER,\n details: {\n endpoint,\n },\n },\n cause,\n );\n}\n\nconst VALID_PROJECT_ID = /^[a-zA-Z0-9_-]+$/;\n\nfunction createInvalidProjectIdError(projectId: string): MastraError {\n return new MastraError({\n id: `MASTRA_PLATFORM_EXPORTER_INVALID_PROJECT_ID`,\n text: 'MastraPlatformExporter projectId must only contain letters, numbers, hyphens, and underscores.',\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.USER,\n details: {\n projectId,\n },\n });\n}\n\nfunction resolveBaseEndpoint(baseEndpoint: string): string {\n const normalizedEndpoint = trimTrailingSlashes(baseEndpoint);\n const invalidText =\n 'MastraPlatformExporter endpoint must be a base origin like \"https://collector.example.com\" with no path, search, or hash.';\n\n try {\n const parsedEndpoint = new URL(normalizedEndpoint);\n if (parsedEndpoint.pathname !== '/' || parsedEndpoint.search || parsedEndpoint.hash) {\n throw createInvalidEndpointError(baseEndpoint, invalidText);\n }\n return trimTrailingSlashes(parsedEndpoint.origin);\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n\n throw createInvalidEndpointError(baseEndpoint, invalidText, error);\n }\n}\n\nfunction buildSignalPath(signal: PlatformSignal, projectId?: string): string {\n const signalSegment = SIGNAL_PUBLISH_SEGMENTS[signal];\n if (!projectId) {\n return `/ai/${signalSegment}/publish`;\n }\n\n return `/projects/${projectId}/ai/${signalSegment}/publish`;\n}\n\nfunction buildSignalEndpoint(baseEndpoint: string, signal: PlatformSignal, projectId?: string): string {\n return `${baseEndpoint}${buildSignalPath(signal, projectId)}`;\n}\n\nfunction resolveExplicitSignalEndpoint(signal: PlatformSignal, endpoint: string, projectId?: string): string {\n const normalizedEndpoint = trimTrailingSlashes(endpoint);\n const invalidText = `MastraPlatformExporter ${signal}Endpoint must be a base origin like \"https://collector.example.com\" or a full ${signal} publish URL ending in \"${SIGNAL_PUBLISH_SUFFIXES[signal]}\".`;\n\n try {\n const parsedEndpoint = new URL(normalizedEndpoint);\n if (parsedEndpoint.search || parsedEndpoint.hash) {\n throw createInvalidEndpointError(endpoint, invalidText);\n }\n\n const normalizedOrigin = trimTrailingSlashes(parsedEndpoint.origin);\n const normalizedPathname = trimTrailingSlashes(parsedEndpoint.pathname);\n\n if (!normalizedPathname || normalizedPathname === '/') {\n return buildSignalEndpoint(normalizedOrigin, signal, projectId);\n }\n\n if (normalizedPathname.endsWith(SIGNAL_PUBLISH_SUFFIXES[signal])) {\n return `${normalizedOrigin}${normalizedPathname}`;\n }\n\n throw createInvalidEndpointError(endpoint, invalidText);\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n\n throw createInvalidEndpointError(endpoint, invalidText, error);\n }\n}\n\nfunction deriveSignalEndpointFromTracesEndpoint(signal: PlatformSignal, tracesEndpoint: string): string {\n if (signal === 'traces') {\n return tracesEndpoint;\n }\n\n const normalizedTracesEndpoint = trimTrailingSlashes(tracesEndpoint);\n const invalidText =\n 'MastraPlatformExporter tracesEndpoint must be a base origin like \"https://collector.example.com\" or a full traces publish URL ending in \"/spans/publish\".';\n\n try {\n const parsedEndpoint = new URL(normalizedTracesEndpoint);\n const normalizedOrigin = trimTrailingSlashes(parsedEndpoint.origin);\n const normalizedPathname = trimTrailingSlashes(parsedEndpoint.pathname);\n\n if (!normalizedPathname.endsWith(SIGNAL_PUBLISH_SUFFIXES.traces)) {\n throw createInvalidEndpointError(tracesEndpoint, invalidText);\n }\n\n const basePath = normalizedPathname.slice(0, -SIGNAL_PUBLISH_SUFFIXES.traces.length);\n return `${normalizedOrigin}${basePath}${SIGNAL_PUBLISH_SUFFIXES[signal]}`;\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n\n throw createInvalidEndpointError(tracesEndpoint, invalidText, error);\n }\n}\n\ninterface MastraPlatformBuffer {\n spans: MastraPlatformSpanRecord[];\n logs: MastraPlatformLogRecord[];\n metrics: MastraPlatformMetricRecord[];\n scores: MastraPlatformScoreRecord[];\n feedback: MastraPlatformFeedbackRecord[];\n firstEventTime?: Date;\n totalSize: number;\n}\n\ntype MastraPlatformSpanRecord = AnyExportedSpan & {\n spanId: string;\n spanType: string;\n startedAt: Date;\n endedAt: Date | null;\n error: AnyExportedSpan['errorInfo'] | null;\n createdAt: Date;\n updatedAt: Date | null;\n};\n\ntype MastraPlatformLogRecord = LogEvent['log'];\ntype MastraPlatformMetricRecord = MetricEvent['metric'];\ntype MastraPlatformScoreRecord = ScoreEvent['score'];\ntype MastraPlatformFeedbackRecord = FeedbackEvent['feedback'];\n\ntype ResolvedPlatformConfig = {\n logger: BaseExporterConfig['logger'];\n logLevel: NonNullable<BaseExporterConfig['logLevel']>;\n maxBatchSize: number;\n maxBatchWaitMs: number;\n maxRetries: number;\n accessToken: string;\n tracesEndpoint: string;\n logsEndpoint: string;\n metricsEndpoint: string;\n scoresEndpoint: string;\n feedbackEndpoint: string;\n};\n\nexport class MastraPlatformExporter extends BaseExporter {\n name = 'mastra-platform-exporter';\n\n private readonly platformConfig: Readonly<ResolvedPlatformConfig>;\n private readonly authFailureCooldown: AuthFailureCooldown;\n private buffer: MastraPlatformBuffer;\n private flushTimer: NodeJS.Timeout | null = null;\n private inFlightFlushes = new Set<Promise<void>>();\n\n constructor(config: MastraPlatformExporterConfig = {}) {\n super(config);\n\n if (config.projectId !== undefined && !VALID_PROJECT_ID.test(config.projectId)) {\n throw createInvalidProjectIdError(config.projectId);\n }\n\n const accessToken =\n config.accessToken || process.env.MASTRA_PLATFORM_ACCESS_TOKEN || process.env.MASTRA_CLOUD_ACCESS_TOKEN;\n // Treat an empty MASTRA_PROJECT_ID as unset so deployments that always\n // export the variable (e.g. CI templates) don't have to special-case it.\n const envProjectId = process.env.MASTRA_PROJECT_ID === '' ? undefined : process.env.MASTRA_PROJECT_ID;\n const rawProjectId = config.projectId ?? envProjectId;\n if (rawProjectId !== undefined && !VALID_PROJECT_ID.test(rawProjectId)) {\n throw createInvalidProjectIdError(rawProjectId);\n }\n const projectId = rawProjectId;\n if (!accessToken) {\n this.setDisabled('MASTRA_PLATFORM_ACCESS_TOKEN environment variable not set.', 'debug');\n }\n\n const tracesEndpointOverride = config.tracesEndpoint ?? process.env.MASTRA_CLOUD_TRACES_ENDPOINT;\n let baseEndpoint: string | undefined;\n let tracesEndpoint: string;\n\n if (tracesEndpointOverride) {\n tracesEndpoint = resolveExplicitSignalEndpoint('traces', tracesEndpointOverride, projectId);\n } else {\n baseEndpoint = resolveBaseEndpoint(config.endpoint ?? 'https://observability.mastra.ai');\n tracesEndpoint = buildSignalEndpoint(baseEndpoint, 'traces', projectId);\n }\n\n const resolveConfiguredSignalEndpoint = (\n signal: Exclude<PlatformSignal, 'traces'>,\n explicitEndpoint?: string,\n ): string => {\n if (explicitEndpoint) {\n return resolveExplicitSignalEndpoint(signal, explicitEndpoint, projectId);\n }\n\n if (tracesEndpointOverride) {\n return deriveSignalEndpointFromTracesEndpoint(signal, tracesEndpoint);\n }\n\n return buildSignalEndpoint(baseEndpoint!, signal, projectId);\n };\n\n this.platformConfig = {\n logger: this.logger,\n logLevel: config.logLevel ?? LogLevel.INFO,\n maxBatchSize: config.maxBatchSize ?? 1000,\n maxBatchWaitMs: config.maxBatchWaitMs ?? 5000,\n maxRetries: config.maxRetries ?? 3,\n accessToken: accessToken || '',\n tracesEndpoint,\n logsEndpoint: resolveConfiguredSignalEndpoint('logs', config.logsEndpoint),\n metricsEndpoint: resolveConfiguredSignalEndpoint('metrics', config.metricsEndpoint),\n scoresEndpoint: resolveConfiguredSignalEndpoint('scores', config.scoresEndpoint),\n feedbackEndpoint: resolveConfiguredSignalEndpoint('feedback', config.feedbackEndpoint),\n };\n\n this.authFailureCooldown = new AuthFailureCooldown('MastraPlatformExporter', () => this.logger);\n\n this.buffer = {\n spans: [],\n logs: [],\n metrics: [],\n scores: [],\n feedback: [],\n totalSize: 0,\n };\n }\n\n protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n if (event.type !== TracingEventType.SPAN_ENDED) {\n return;\n }\n\n if (!DEFAULT_PLATFORM_SPAN_FILTER(event.exportedSpan)) {\n return;\n }\n\n if (this.authFailureCooldown.dropEventIfCoolingDown()) {\n return;\n }\n\n this.addToBuffer(event);\n\n await this.handleBufferedEvent();\n }\n\n async onLogEvent(event: LogEvent): Promise<void> {\n if (this.isDisabled) {\n return;\n }\n\n if (this.authFailureCooldown.dropEventIfCoolingDown()) {\n return;\n }\n\n this.addLogToBuffer(event);\n await this.handleBufferedEvent();\n }\n\n async onMetricEvent(event: MetricEvent): Promise<void> {\n if (this.isDisabled) {\n return;\n }\n\n if (this.authFailureCooldown.dropEventIfCoolingDown()) {\n return;\n }\n\n this.addMetricToBuffer(event);\n await this.handleBufferedEvent();\n }\n\n async onScoreEvent(event: ScoreEvent): Promise<void> {\n if (this.isDisabled) {\n return;\n }\n\n if (this.authFailureCooldown.dropEventIfCoolingDown()) {\n return;\n }\n\n this.addScoreToBuffer(event);\n await this.handleBufferedEvent();\n }\n\n async onFeedbackEvent(event: FeedbackEvent): Promise<void> {\n if (this.isDisabled) {\n return;\n }\n\n if (this.authFailureCooldown.dropEventIfCoolingDown()) {\n return;\n }\n\n this.addFeedbackToBuffer(event);\n await this.handleBufferedEvent();\n }\n\n private addToBuffer(event: TracingEvent): void {\n this.markBufferStart();\n\n const spanRecord = this.formatSpan(event.exportedSpan);\n this.buffer.spans.push(spanRecord);\n this.buffer.totalSize++;\n }\n\n private addLogToBuffer(event: LogEvent): void {\n this.markBufferStart();\n\n this.buffer.logs.push(this.formatLog(event.log));\n this.buffer.totalSize++;\n }\n\n private addMetricToBuffer(event: MetricEvent): void {\n this.markBufferStart();\n\n this.buffer.metrics.push(this.formatMetric(event.metric));\n this.buffer.totalSize++;\n }\n\n private addScoreToBuffer(event: ScoreEvent): void {\n this.markBufferStart();\n\n this.buffer.scores.push(this.formatScore(event.score));\n this.buffer.totalSize++;\n }\n\n private addFeedbackToBuffer(event: FeedbackEvent): void {\n this.markBufferStart();\n\n this.buffer.feedback.push(this.formatFeedback(event.feedback));\n this.buffer.totalSize++;\n }\n\n private markBufferStart(): void {\n if (this.buffer.totalSize === 0) {\n this.buffer.firstEventTime = new Date();\n }\n }\n\n private formatSpan(span: AnyExportedSpan): MastraPlatformSpanRecord {\n const spanRecord: MastraPlatformSpanRecord = {\n ...span,\n spanId: span.id,\n spanType: span.type,\n startedAt: span.startTime,\n endedAt: span.endTime ?? null,\n error: span.errorInfo ?? null,\n createdAt: new Date(),\n updatedAt: null,\n };\n\n return spanRecord;\n }\n\n private formatLog(log: LogEvent['log']): MastraPlatformLogRecord {\n return {\n ...log,\n };\n }\n\n private formatMetric(metric: MetricEvent['metric']): MastraPlatformMetricRecord {\n return {\n ...metric,\n };\n }\n\n private formatScore(score: ScoreEvent['score']): MastraPlatformScoreRecord {\n return {\n ...score,\n };\n }\n\n private formatFeedback(feedback: FeedbackEvent['feedback']): MastraPlatformFeedbackRecord {\n return {\n ...feedback,\n };\n }\n\n private async handleBufferedEvent(): Promise<void> {\n if (this.shouldFlush()) {\n void this.flush().catch(error => {\n this.logger.error('Batch flush failed', {\n error: error instanceof Error ? error.message : String(error),\n });\n });\n } else if (this.buffer.totalSize === 1) {\n this.scheduleFlush();\n }\n }\n\n private shouldFlush(): boolean {\n if (this.buffer.totalSize >= this.platformConfig.maxBatchSize) {\n return true;\n }\n\n if (this.buffer.firstEventTime && this.buffer.totalSize > 0) {\n const elapsed = Date.now() - this.buffer.firstEventTime.getTime();\n if (elapsed >= this.platformConfig.maxBatchWaitMs) {\n return true;\n }\n }\n\n return false;\n }\n\n private scheduleFlush(): void {\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n }\n this.flushTimer = setTimeout(() => {\n void this.flush().catch(error => {\n const mastraError = new MastraError(\n {\n id: `MASTRA_PLATFORM_EXPORTER_FAILED_TO_SCHEDULE_FLUSH`,\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.USER,\n },\n error,\n );\n this.logger.trackException(mastraError);\n this.logger.error('Scheduled flush failed', mastraError);\n });\n }, this.platformConfig.maxBatchWaitMs);\n }\n\n private async flushBuffer(): Promise<void> {\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n this.flushTimer = null;\n }\n\n if (this.buffer.totalSize === 0) {\n return;\n }\n\n if (this.authFailureCooldown.dropEventsIfCoolingDown(this.buffer.totalSize)) {\n this.resetBuffer();\n return;\n }\n\n const startTime = Date.now();\n const spansCopy = [...this.buffer.spans];\n const logsCopy = [...this.buffer.logs];\n const metricsCopy = [...this.buffer.metrics];\n const scoresCopy = [...this.buffer.scores];\n const feedbackCopy = [...this.buffer.feedback];\n const batchSize = this.buffer.totalSize;\n const flushReason = this.buffer.totalSize >= this.platformConfig.maxBatchSize ? 'size' : 'time';\n\n this.resetBuffer();\n\n const results = await Promise.all([\n this.flushSignalBatch('traces', spansCopy),\n this.flushSignalBatch('logs', logsCopy),\n this.flushSignalBatch('metrics', metricsCopy),\n this.flushSignalBatch('scores', scoresCopy),\n this.flushSignalBatch('feedback', feedbackCopy),\n ]);\n\n const failedSignals = results.filter(result => !result.succeeded).map(result => result.signal);\n const authFailure = results.find(result => result.authFailureStatus !== undefined);\n\n const elapsed = Date.now() - startTime;\n\n if (failedSignals.length === 0) {\n const droppedEventsDuringAuthCooldown = this.authFailureCooldown.reset();\n const logData: Record<string, number | string> = {\n batchSize,\n flushReason,\n durationMs: elapsed,\n };\n\n if (droppedEventsDuringAuthCooldown > 0) {\n logData.droppedEventsDuringAuthCooldown = droppedEventsDuringAuthCooldown;\n }\n\n this.logger.debug('Batch flushed successfully', logData);\n return;\n }\n\n if (authFailure?.authFailureStatus !== undefined) {\n this.authFailureCooldown.recordFailure({\n status: authFailure.authFailureStatus,\n failedSignals,\n droppedBatchSize: batchSize,\n });\n }\n\n this.logger.warn('Batch flush completed with dropped signal batches', {\n batchSize,\n flushReason,\n durationMs: elapsed,\n failedSignals,\n });\n }\n\n /**\n * Uploads a signal batch to the configured Mastra Observability API using fetchWithRetry.\n */\n private async batchUpload<T>(signal: PlatformSignal, records: T[]): Promise<void> {\n const headers = {\n Authorization: `Bearer ${this.platformConfig.accessToken}`,\n 'Content-Type': 'application/json',\n };\n\n const endpointMap: Record<PlatformSignal, string> = {\n traces: this.platformConfig.tracesEndpoint,\n logs: this.platformConfig.logsEndpoint,\n metrics: this.platformConfig.metricsEndpoint,\n scores: this.platformConfig.scoresEndpoint,\n feedback: this.platformConfig.feedbackEndpoint,\n };\n\n const options: RequestInit = {\n method: 'POST',\n headers,\n body: JSON.stringify({ [SIGNAL_PUBLISH_SEGMENTS[signal]]: records }),\n };\n\n await fetchWithAuthFailureHandling(endpointMap[signal], options, this.platformConfig.maxRetries);\n }\n\n private async flushSignalBatch<T>(\n signal: PlatformSignal,\n records: T[],\n ): Promise<{ signal: PlatformSignal; succeeded: boolean; authFailureStatus?: number }> {\n if (records.length === 0) {\n return { signal, succeeded: true };\n }\n\n try {\n await this.batchUpload(signal, records);\n return { signal, succeeded: true };\n } catch (error) {\n if (isAuthFailureError(error)) {\n return { signal, succeeded: false, authFailureStatus: error.status };\n }\n\n const errorId = `MASTRA_PLATFORM_EXPORTER_FAILED_TO_BATCH_UPLOAD_${signal.toUpperCase()}` as Uppercase<string>;\n const mastraError = new MastraError(\n {\n id: errorId,\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.USER,\n details: {\n signal,\n droppedBatchSize: records.length,\n },\n },\n error,\n );\n this.logger.trackException(mastraError);\n this.logger.error('Batch upload failed after all retries, dropping batch', mastraError);\n return { signal, succeeded: false };\n }\n }\n\n private resetBuffer(): void {\n this.buffer.spans = [];\n this.buffer.logs = [];\n this.buffer.metrics = [];\n this.buffer.scores = [];\n this.buffer.feedback = [];\n this.buffer.firstEventTime = undefined;\n this.buffer.totalSize = 0;\n }\n\n /**\n * Force flush any buffered events without shutting down the exporter.\n * This is useful in serverless environments where you need to ensure events\n * are exported before the runtime instance is terminated.\n */\n async flush(): Promise<void> {\n if (this.isDisabled) {\n return;\n }\n\n while (this.buffer.totalSize > 0 || this.inFlightFlushes.size > 0) {\n if (this.buffer.totalSize > 0) {\n this.logger.debug('Flushing buffered events', {\n bufferedEvents: this.buffer.totalSize,\n });\n\n const flushPromise = this.flushBuffer();\n this.inFlightFlushes.add(flushPromise);\n\n try {\n await flushPromise;\n } finally {\n this.inFlightFlushes.delete(flushPromise);\n }\n\n continue;\n }\n\n await Promise.allSettled([...this.inFlightFlushes]);\n }\n }\n\n async shutdown(): Promise<void> {\n if (this.isDisabled) {\n return;\n }\n\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n this.flushTimer = null;\n }\n\n try {\n await this.flush();\n } catch (error) {\n const mastraError = new MastraError(\n {\n id: `MASTRA_PLATFORM_EXPORTER_FAILED_TO_FLUSH_REMAINING_EVENTS_DURING_SHUTDOWN`,\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.USER,\n details: {\n remainingEvents: this.buffer.totalSize,\n },\n },\n error,\n );\n\n this.logger.trackException(mastraError);\n this.logger.error('Failed to flush remaining events during shutdown', mastraError);\n }\n\n this.logger.info('MastraPlatformExporter shutdown complete');\n }\n}\n","import { MastraError, ErrorDomain } from '@mastra/core/error';\nimport type { IMastraLogger } from '@mastra/core/logger';\nimport type {\n TracingEvent,\n InitExporterOptions,\n MetricEvent,\n LogEvent,\n ScoreEvent,\n FeedbackEvent,\n ObservabilityDropEvent,\n ObservabilityDropReason,\n ObservabilityDropSignal,\n} from '@mastra/core/observability';\nimport { TracingEventType } from '@mastra/core/observability';\nimport type { ObservabilityStorage, TracingStorageStrategy, MastraCompositeStore } from '@mastra/core/storage';\nimport {\n buildCreateSpanRecord,\n buildUpdateSpanRecord,\n buildMetricRecord,\n buildLogRecord,\n buildScoreRecord,\n buildFeedbackRecord,\n} from '@mastra/core/storage';\nimport type { BaseExporterConfig } from './base';\nimport { BaseExporter } from './base';\nimport { EventBuffer } from './event-buffer';\nimport type { BufferedEvent, RetryCount, UpdateSpanPartial } from './event-buffer';\n\n/** Configuration for the MastraStorageExporter's batching, retry, and strategy behavior. */\nexport interface MastraStorageExporterConfig extends BaseExporterConfig {\n maxBatchSize?: number; // Default: 1000 spans\n maxBufferSize?: number; // Default: 10000 spans\n maxBatchWaitMs?: number; // Default: 5000ms\n maxRetries?: number; // Default: 4\n retryDelayMs?: number; // Default: 500ms (base delay for exponential backoff)\n\n // Strategy selection (optional)\n strategy?: TracingStorageStrategy | 'auto';\n}\n\n/**\n * Resolves the final tracing storage strategy based on config and observability store hints\n */\nfunction resolveTracingStorageStrategy(\n config: MastraStorageExporterConfig,\n observabilityStorage: ObservabilityStorage,\n storageName: string,\n logger: IMastraLogger,\n): TracingStorageStrategy {\n const observabilityStrategy = observabilityStorage.observabilityStrategy;\n if (config.strategy && config.strategy !== 'auto') {\n if (observabilityStrategy.supported.includes(config.strategy)) {\n return config.strategy;\n }\n // Log warning and fall through to auto-selection\n logger.warn('User-specified tracing strategy not supported by storage adapter, falling back to auto-selection', {\n userStrategy: config.strategy,\n storageAdapter: storageName,\n supportedStrategies: observabilityStrategy.supported,\n fallbackStrategy: observabilityStrategy.preferred,\n });\n }\n return observabilityStrategy.preferred;\n}\n\ntype Resolve = (value: void | PromiseLike<void>) => void;\n\n/**\n * Storage-backed exporter. Buffers observability events and flushes them in\n * batches to the configured ObservabilityStorage backend with retry support.\n */\nexport class MastraStorageExporter extends BaseExporter {\n name = 'mastra-storage-exporter';\n\n #config: MastraStorageExporterConfig;\n #isInitializing = false;\n #initPromises: Set<Resolve> = new Set();\n #eventBuffer: EventBuffer;\n\n #storage?: MastraCompositeStore;\n #observabilityStorage?: ObservabilityStorage;\n #resolvedStrategy?: TracingStorageStrategy;\n #flushTimer?: NodeJS.Timeout;\n #emitDropEvent?: (event: ObservabilityDropEvent) => void;\n\n // Signals whose storage methods threw \"not implemented\" — skip on future flushes\n #unsupportedSignals: Set<ObservabilityDropSignal> = new Set();\n\n constructor(config: MastraStorageExporterConfig = {}) {\n super(config);\n\n // Set default configuration\n this.#config = {\n ...config,\n maxBatchSize: config.maxBatchSize ?? 1000,\n maxBufferSize: config.maxBufferSize ?? 10000,\n maxBatchWaitMs: config.maxBatchWaitMs ?? 5000,\n maxRetries: config.maxRetries ?? 4,\n retryDelayMs: config.retryDelayMs ?? 500,\n strategy: config.strategy ?? 'auto',\n };\n\n this.#eventBuffer = new EventBuffer({ maxRetries: this.#config.maxRetries ?? 4 });\n }\n\n /**\n * Initialize the exporter (called after all dependencies are ready)\n */\n async init(options: InitExporterOptions): Promise<void> {\n try {\n this.#isInitializing = true;\n this.#emitDropEvent = options.emitDropEvent;\n\n this.#storage = options.mastra?.getStorage();\n if (!this.#storage) {\n this.logger.warn('MastraStorageExporter disabled: Storage not available. Traces will not be persisted.');\n return;\n }\n\n this.#observabilityStorage = await this.#storage.getStore('observability');\n if (!this.#observabilityStorage) {\n this.logger.warn(\n 'MastraStorageExporter disabled: Observability storage not available. Traces will not be persisted.',\n );\n return;\n }\n\n // Initialize the resolved strategy once observability store is available\n if (!this.#resolvedStrategy) {\n this.#resolvedStrategy = resolveTracingStorageStrategy(\n this.#config,\n this.#observabilityStorage,\n this.#storage.constructor.name,\n this.logger,\n );\n\n this.logger.debug('tracing storage exporter initialized', {\n strategy: this.#resolvedStrategy,\n source: this.#config.strategy !== 'auto' ? 'user' : 'auto',\n storageAdapter: this.#storage.constructor.name,\n maxBatchSize: this.#config.maxBatchSize,\n maxBatchWaitMs: this.#config.maxBatchWaitMs,\n });\n }\n\n if (this.#resolvedStrategy) {\n this.#eventBuffer.init({ strategy: this.#resolvedStrategy });\n }\n } finally {\n this.#isInitializing = false;\n /**\n * Assumes caller waits until export of a parent span is completed before calling\n * export for child spans , order is not relevant for resolve\n */\n this.#initPromises.forEach(resolve => {\n resolve();\n });\n this.#initPromises.clear();\n }\n }\n\n /**\n * Checks if buffer should be flushed based on size or time triggers\n */\n private shouldFlush(): boolean {\n if (this.#resolvedStrategy === 'realtime') {\n return true;\n }\n\n // Emergency flush - buffer overflow\n if (this.#eventBuffer.totalSize >= this.#config.maxBufferSize!) {\n return true;\n }\n\n // Size-based flush\n if (this.#eventBuffer.totalSize >= this.#config.maxBatchSize!) {\n return true;\n }\n\n // Time-based flush\n if (this.#eventBuffer.totalSize > 0) {\n if (this.#eventBuffer.elapsed >= this.#config.maxBatchWaitMs!) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Schedules a flush using setTimeout\n */\n private scheduleFlush(): void {\n if (this.#flushTimer) {\n clearTimeout(this.#flushTimer);\n }\n this.#flushTimer = setTimeout(() => {\n this.flushBuffer().catch(error => {\n this.logger.error('Scheduled flush failed', {\n error: error instanceof Error ? error.message : String(error),\n });\n });\n }, this.#config.maxBatchWaitMs);\n }\n\n /**\n * Checks flush triggers and schedules/triggers flush as needed.\n * Called after adding any event to the buffer.\n * Returns the flush promise when flushing so callers can await it.\n */\n private async handleBatchedFlush(): Promise<void> {\n if (this.shouldFlush()) {\n await this.flushBuffer();\n } else if (this.#eventBuffer.totalSize === 1) {\n this.scheduleFlush();\n }\n }\n\n private sanitizeDropError(error: unknown): ObservabilityDropEvent['error'] {\n if (error instanceof MastraError) {\n return {\n id: error.id,\n domain: String(error.domain),\n message: error.message,\n };\n }\n\n if (error instanceof Error) {\n return { message: error.message };\n }\n\n return { message: String(error) };\n }\n\n private emitDrop(\n signal: ObservabilityDropSignal,\n reason: ObservabilityDropReason,\n count: number,\n error?: unknown,\n ): void {\n if (count === 0) return;\n\n const dropEvent: ObservabilityDropEvent = {\n type: 'drop',\n signal,\n reason,\n count,\n timestamp: new Date(),\n exporterName: this.name,\n ...(this.#observabilityStorage ? { storageName: this.#observabilityStorage.constructor.name } : {}),\n ...(error === undefined ? {} : { error: this.sanitizeDropError(error) }),\n };\n\n this.#emitDropEvent?.(dropEvent);\n }\n\n /**\n * Flush a batch of create events for a single signal type.\n * On \"not implemented\" errors, disables the signal for future flushes.\n * On other errors, re-adds events to the buffer for retry.\n */\n private async flushCreates<T extends BufferedEvent>(\n signal: ObservabilityDropSignal,\n events: T[],\n storageCall: (events: T[]) => Promise<void>,\n ): Promise<void> {\n if (events.length === 0) return;\n if (this.#unsupportedSignals.has(signal)) {\n this.emitDrop(signal, 'unsupported-storage', events.length);\n return;\n }\n\n try {\n await storageCall(events);\n } catch (error) {\n if (\n error instanceof MastraError &&\n error.domain === ErrorDomain.MASTRA_OBSERVABILITY &&\n error.id.endsWith('_NOT_IMPLEMENTED')\n ) {\n this.logger.warn(error.message);\n this.#unsupportedSignals.add(signal);\n this.emitDrop(signal, 'unsupported-storage', events.length, error);\n } else {\n const dropped = this.#eventBuffer.reAddCreates(events);\n this.emitDrop(signal, 'retry-exhausted', dropped.length, error);\n }\n }\n }\n\n /**\n * Flush span update/end events, deferring any whose span hasn't been created yet.\n * When `isEnd` is true, successfully flushed spans are removed from tracking.\n */\n private async flushSpanUpdates(\n events: (TracingEvent & RetryCount)[],\n deferredUpdates: BufferedEvent[],\n isEnd: boolean,\n ): Promise<void> {\n const deferredCountAtEntry = deferredUpdates.length;\n if (events.length === 0) return;\n if (this.#unsupportedSignals.has('tracing')) {\n this.emitDrop('tracing', 'unsupported-storage', events.length);\n return;\n }\n\n const partials: UpdateSpanPartial[] = [];\n for (const event of events) {\n const span = event.exportedSpan;\n if (this.#eventBuffer.spanExists(span)) {\n partials.push({\n traceId: span.traceId,\n spanId: span.id,\n updates: buildUpdateSpanRecord(span),\n });\n } else {\n deferredUpdates.push(event);\n }\n }\n\n if (partials.length === 0) return;\n\n try {\n await this.#observabilityStorage!.batchUpdateSpans({ records: partials });\n if (isEnd) {\n this.#eventBuffer.endFinishedSpans({ records: partials });\n }\n } catch (error) {\n if (\n error instanceof MastraError &&\n error.domain === ErrorDomain.MASTRA_OBSERVABILITY &&\n error.id.endsWith('_NOT_IMPLEMENTED')\n ) {\n this.logger.warn(error.message);\n this.#unsupportedSignals.add('tracing');\n deferredUpdates.length = 0;\n this.emitDrop('tracing', 'unsupported-storage', events.length + deferredCountAtEntry, error);\n } else {\n // `events` includes both partials-bound and newly-deferred entries, so\n // re-adding it would double-add the newly-deferred ones if they stayed\n // in deferredUpdates. Splice off only what this call appended — entries\n // from a prior flushSpanUpdates call must survive.\n const newlyDeferred = deferredUpdates.length - deferredCountAtEntry;\n if (newlyDeferred > 0) {\n deferredUpdates.splice(deferredUpdates.length - newlyDeferred, newlyDeferred);\n }\n const dropped = this.#eventBuffer.reAddUpdates(events);\n this.emitDrop('tracing', 'retry-exhausted', dropped.length, error);\n }\n }\n }\n\n /**\n * Flushes the current buffer to storage.\n *\n * Creates are flushed first, then their span keys are added to allCreatedSpans.\n * Updates are checked against allCreatedSpans — those whose span hasn't been\n * created yet are re-inserted into the live buffer for the next flush.\n * Completed spans (SPAN_ENDED) are cleaned up from allCreatedSpans after success.\n */\n private async flushBuffer(): Promise<void> {\n if (!this.#observabilityStorage) {\n this.logger.debug('Cannot flush. Observability storage is not initialized');\n return;\n }\n if (!this.#resolvedStrategy) {\n this.logger.debug('Cannot flush. Observability strategy is not resolved');\n return;\n }\n\n // Clear timer since we're flushing\n if (this.#flushTimer) {\n clearTimeout(this.#flushTimer);\n this.#flushTimer = undefined;\n }\n\n if (this.#eventBuffer.totalSize === 0) {\n return;\n }\n\n const startTime = Date.now();\n const batchSize = this.#eventBuffer.totalSize;\n\n // Snapshot and reset buffer so new events can accumulate during flush\n const creates = this.#eventBuffer.creates;\n const updates = this.#eventBuffer.updates;\n this.#eventBuffer.reset();\n\n const createFeedbackEvents: (FeedbackEvent & RetryCount)[] = [];\n const createLogEvents: (LogEvent & RetryCount)[] = [];\n const createMetricEvents: (MetricEvent & RetryCount)[] = [];\n const createScoreEvents: (ScoreEvent & RetryCount)[] = [];\n const createSpanEvents: (TracingEvent & RetryCount)[] = [];\n\n const updateSpanEvents: (TracingEvent & RetryCount)[] = [];\n const endSpanEvents: (TracingEvent & RetryCount)[] = [];\n\n for (const createEvent of creates) {\n switch (createEvent.type) {\n case 'feedback':\n createFeedbackEvents.push(createEvent);\n break;\n case 'log':\n createLogEvents.push(createEvent);\n break;\n case 'metric':\n createMetricEvents.push(createEvent);\n break;\n case 'score':\n createScoreEvents.push(createEvent);\n break;\n default:\n createSpanEvents.push(createEvent);\n break;\n }\n }\n\n for (const updateEvent of updates) {\n switch (updateEvent.type) {\n case TracingEventType.SPAN_UPDATED:\n updateSpanEvents.push(updateEvent);\n break;\n case TracingEventType.SPAN_ENDED:\n endSpanEvents.push(updateEvent);\n break;\n }\n }\n\n // Flush all creates in parallel — signals are independent\n await Promise.all([\n this.flushCreates('feedback', createFeedbackEvents, events =>\n this.#observabilityStorage!.batchCreateFeedback({ feedbacks: events.map(f => buildFeedbackRecord(f)) }),\n ),\n this.flushCreates('log', createLogEvents, events =>\n this.#observabilityStorage!.batchCreateLogs({ logs: events.map(l => buildLogRecord(l)) }),\n ),\n this.flushCreates('metric', createMetricEvents, events =>\n this.#observabilityStorage!.batchCreateMetrics({ metrics: events.map(m => buildMetricRecord(m)) }),\n ),\n this.flushCreates('score', createScoreEvents, events =>\n this.#observabilityStorage!.batchCreateScores({ scores: events.map(s => buildScoreRecord(s)) }),\n ),\n this.flushCreates('tracing', createSpanEvents, async events => {\n const records = events.map(t => buildCreateSpanRecord(t.exportedSpan));\n await this.#observabilityStorage!.batchCreateSpans({ records });\n this.#eventBuffer.addCreatedSpans({ records });\n }),\n ]);\n\n // Flush span updates and ends — check span existence, defer if not yet created\n const deferredUpdates: BufferedEvent[] = [];\n\n await this.flushSpanUpdates(updateSpanEvents, deferredUpdates, false);\n await this.flushSpanUpdates(endSpanEvents, deferredUpdates, true);\n\n if (deferredUpdates.length > 0) {\n if (this.#unsupportedSignals.has('tracing')) {\n this.emitDrop('tracing', 'unsupported-storage', deferredUpdates.length);\n deferredUpdates.length = 0;\n } else {\n const dropped = this.#eventBuffer.reAddUpdates(deferredUpdates);\n this.emitDrop('tracing', 'retry-exhausted', dropped.length);\n }\n }\n\n const elapsed = Date.now() - startTime;\n this.logger.debug('Batch flushed', {\n strategy: this.#resolvedStrategy,\n batchSize,\n durationMs: elapsed,\n deferredUpdates: deferredUpdates.length > 0 ? deferredUpdates.length : undefined,\n });\n return; // Success\n }\n\n async _exportTracingEvent(event: TracingEvent): Promise<void> {\n await this.waitForInit();\n if (!this.#observabilityStorage) {\n this.logger.debug('Cannot store traces. Observability storage is not initialized');\n return;\n }\n\n this.#eventBuffer.addEvent(event);\n await this.handleBatchedFlush();\n }\n\n /**\n * Resolves when an ongoing init call is finished\n * Doesn't wait for the caller to call init\n * @returns\n */\n private async waitForInit(): Promise<void> {\n if (!this.#isInitializing) return;\n return new Promise(resolve => {\n this.#initPromises.add(resolve);\n });\n }\n\n /**\n * Handle metric events — buffer for batch flush.\n */\n async onMetricEvent(event: MetricEvent): Promise<void> {\n await this.waitForInit();\n if (!this.#observabilityStorage) return;\n\n this.#eventBuffer.addEvent(event);\n await this.handleBatchedFlush();\n }\n\n /**\n * Handle log events — buffer for batch flush.\n */\n async onLogEvent(event: LogEvent): Promise<void> {\n await this.waitForInit();\n if (!this.#observabilityStorage) return;\n\n this.#eventBuffer.addEvent(event);\n await this.handleBatchedFlush();\n }\n\n /**\n * Handle score events — buffer for batch flush.\n */\n async onScoreEvent(event: ScoreEvent): Promise<void> {\n await this.waitForInit();\n if (!this.#observabilityStorage) return;\n\n this.#eventBuffer.addEvent(event);\n await this.handleBatchedFlush();\n }\n\n /**\n * Handle feedback events — buffer for batch flush.\n */\n async onFeedbackEvent(event: FeedbackEvent): Promise<void> {\n await this.waitForInit();\n if (!this.#observabilityStorage) return;\n\n this.#eventBuffer.addEvent(event);\n await this.handleBatchedFlush();\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.#eventBuffer.totalSize > 0) {\n this.logger.debug('Flushing buffered events', {\n bufferedEvents: this.#eventBuffer.totalSize,\n });\n await this.flushBuffer();\n }\n }\n\n async shutdown(): Promise<void> {\n // Clear any pending timer\n if (this.#flushTimer) {\n clearTimeout(this.#flushTimer);\n this.#flushTimer = undefined;\n }\n\n // Flush any remaining events\n await this.flush();\n\n this.logger.info('MastraStorageExporter shutdown complete');\n }\n}\n","/**\n * Test Exporter for Observability\n *\n * A full-featured exporter primarily designed for testing purposes that provides:\n * - In-memory event collection for ALL signals (Traces, Metrics, Logs, Scores, Feedback)\n * - File output support\n * - Span lifecycle tracking and validation\n * - Query methods for filtering spans by type, trace ID, span ID, etc.\n * - Query methods for filtering logs, metrics, scores, and feedback\n * - Statistics and analytics on all collected signals\n * - Internal metrics collection with summary on flush()\n */\n\n/**\n * Lazily compute the snapshots directory.\n * Node.js-only: uses dynamic imports so the module can be loaded in edge runtimes\n * without failing at import time.\n */\nlet _snapshotsDir: string | undefined;\nasync function getSnapshotsDir(): Promise<string> {\n if (!_snapshotsDir) {\n if (typeof import.meta.url !== 'string') {\n throw new Error(\n 'Snapshot functionality requires a Node.js environment. ' + 'import.meta.url is not available in this runtime.',\n );\n }\n const { fileURLToPath } = await import('node:url');\n const { dirname, join } = await import('node:path');\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n _snapshotsDir = join(__dirname, '..', '__snapshots__');\n }\n return _snapshotsDir;\n}\n\nimport type {\n TracingEvent,\n TracingEventType,\n AnyExportedSpan,\n ExportedSpan,\n SpanType,\n LogEvent,\n MetricEvent,\n ScoreEvent,\n FeedbackEvent,\n ExportedLog,\n ExportedMetric,\n ExportedScore,\n ExportedFeedback,\n LogLevel,\n} from '@mastra/core/observability';\nimport { TracingEventType as EventType } from '@mastra/core/observability';\n\nimport { BaseExporter } from './base';\nimport type { BaseExporterConfig } from './base';\n\n/**\n * Span state tracking for lifecycle validation\n */\ninterface SpanState {\n /** Whether SPAN_STARTED was received */\n hasStart: boolean;\n /** Whether SPAN_ENDED was received */\n hasEnd: boolean;\n /** Whether SPAN_UPDATED was received */\n hasUpdate: boolean;\n /** All events for this span in order */\n events: TracingEvent[];\n /** Whether this is an event span (zero duration) */\n isEventSpan?: boolean;\n}\n\n/**\n * Statistics about all collected signals\n */\nexport interface TestExporterStats {\n /** Total number of tracing events collected */\n totalTracingEvents: number;\n /** Number of unique spans */\n totalSpans: number;\n /** Number of unique traces */\n totalTraces: number;\n /** Number of completed spans */\n completedSpans: number;\n /** Number of incomplete spans (started but not ended) */\n incompleteSpans: number;\n /** Breakdown by tracing event type */\n byEventType: {\n started: number;\n updated: number;\n ended: number;\n };\n /** Breakdown by span type */\n bySpanType: Record<string, number>;\n /** Total number of log events collected */\n totalLogs: number;\n /** Breakdown of logs by level */\n logsByLevel: Record<string, number>;\n /** Total number of metric events collected */\n totalMetrics: number;\n /** Breakdown of metrics by name */\n metricsByName: Record<string, number>;\n /** Total number of score events collected */\n totalScores: number;\n /** Breakdown of scores by scorer name */\n scoresByScorer: Record<string, number>;\n /** Total number of feedback events collected */\n totalFeedback: number;\n /** Breakdown of feedback by type */\n feedbackByType: Record<string, number>;\n /** @deprecated Use totalTracingEvents instead */\n totalEvents: number;\n}\n\n/**\n * Internal metrics collected by the TestExporter while running.\n * Dumped as a summary on flush().\n */\nexport interface TestExporterInternalMetrics {\n /** Timestamp when the exporter was created */\n startedAt: Date;\n /** Timestamp of the last event received */\n lastEventAt: Date | null;\n /** Total events received across all signal types */\n totalEventsReceived: number;\n /** Breakdown by signal type */\n bySignal: {\n tracing: number;\n log: number;\n metric: number;\n score: number;\n feedback: number;\n };\n /** Number of flush() calls */\n flushCount: number;\n /** Total bytes of JSON output produced (estimated from toJSON) */\n estimatedJsonBytes: number;\n}\n\n/**\n * Span node in a tree structure with nested children\n */\nexport interface SpanTreeNode {\n /** The span data */\n span: AnyExportedSpan;\n /** Child spans nested under this span */\n children: SpanTreeNode[];\n}\n\n/**\n * Normalized span data for snapshot testing.\n * Dynamic fields (IDs, timestamps) are replaced with stable values.\n */\nexport interface NormalizedSpan {\n /** Stable ID like <span-1>, <span-2> */\n id: string;\n /** Normalized trace ID like <trace-1>, <trace-2> */\n traceId: string;\n /** Normalized parent ID, or undefined for root */\n parentId?: string;\n /** Span name */\n name: string;\n /** Span type */\n type: string;\n /** Entity type */\n entityType?: string;\n /** Entity ID */\n entityId?: string;\n /** Whether the span completed (had an endTime) */\n completed: boolean;\n /** Span attributes */\n attributes?: Record<string, unknown>;\n /** Span metadata */\n metadata?: Record<string, unknown>;\n /** Input data */\n input?: unknown;\n /** Output data */\n output?: unknown;\n /** Error info if span failed */\n errorInfo?: unknown;\n /** Is an event span */\n isEvent: boolean;\n /** Is root span */\n isRootSpan: boolean;\n /** Tags */\n tags?: string[];\n}\n\n/**\n * Normalized tree node for snapshot testing\n */\nexport interface NormalizedTreeNode {\n /** Normalized span data */\n span: NormalizedSpan;\n /** Child nodes (omitted if empty) */\n children?: NormalizedTreeNode[];\n}\n\n/**\n * Incomplete span information for debugging\n */\nexport interface IncompleteSpanInfo {\n spanId: string;\n span: AnyExportedSpan | undefined;\n state: {\n hasStart: boolean;\n hasUpdate: boolean;\n hasEnd: boolean;\n };\n}\n\n/**\n * Configuration for TestExporter\n */\nexport interface TestExporterConfig extends BaseExporterConfig {\n /**\n * Whether to validate span lifecycles in real-time.\n * When true, will log warnings for lifecycle violations.\n * @default true\n */\n validateLifecycle?: boolean;\n /**\n * Whether to store verbose logs for debugging.\n * @default true\n */\n storeLogs?: boolean;\n /**\n * Indentation for JSON output (number of spaces, or undefined for compact).\n * @default 2\n */\n jsonIndent?: number;\n /**\n * Whether to log a summary of internal metrics on flush().\n * @default true\n */\n logMetricsOnFlush?: boolean;\n}\n\n/**\n * Test Exporter for observability testing and debugging.\n *\n * Provides comprehensive in-memory event collection, querying, and JSON output\n * capabilities designed primarily for testing purposes but useful for debugging as well.\n *\n * @example\n * ```typescript\n * const exporter = new TestExporter();\n *\n * // Use with Mastra\n * const mastra = new Mastra({\n * observability: {\n * configs: {\n * test: {\n * serviceName: 'test',\n * exporters: [exporter],\n * },\n * },\n * },\n * });\n *\n * // Run some operations...\n *\n * // Query spans\n * const agentSpans = exporter.getSpansByType('agent_run');\n * const traceSpans = exporter.getByTraceId('abc123');\n *\n * // Get statistics\n * const stats = exporter.getStatistics();\n *\n * // Export to JSON\n * await exporter.writeToFile('./traces.json');\n * const jsonString = exporter.toJSON();\n * ```\n */\nexport class TestExporter extends BaseExporter {\n name = 'test-exporter';\n\n /** All collected tracing events */\n #tracingEvents: TracingEvent[] = [];\n\n /** Per-span state tracking */\n #spanStates = new Map<string, SpanState>();\n\n /** All collected log events */\n #logEvents: LogEvent[] = [];\n\n /** All collected metric events */\n #metricEvents: MetricEvent[] = [];\n\n /** All collected score events */\n #scoreEvents: ScoreEvent[] = [];\n\n /** All collected feedback events */\n #feedbackEvents: FeedbackEvent[] = [];\n\n /** Debug logs for the exporter itself */\n #debugLogs: string[] = [];\n\n /** Configuration */\n readonly #config: TestExporterConfig;\n\n /** Internal metrics tracking */\n #internalMetrics: {\n startedAt: Date;\n lastEventAt: Date | null;\n totalEventsReceived: number;\n bySignal: { tracing: number; log: number; metric: number; score: number; feedback: number };\n flushCount: number;\n };\n\n constructor(config: TestExporterConfig = {}) {\n super(config);\n this.#config = {\n validateLifecycle: true,\n storeLogs: true,\n jsonIndent: 2,\n logMetricsOnFlush: true,\n ...config,\n };\n this.#internalMetrics = {\n startedAt: new Date(),\n lastEventAt: null,\n totalEventsReceived: 0,\n bySignal: { tracing: 0, log: 0, metric: 0, score: 0, feedback: 0 },\n flushCount: 0,\n };\n }\n\n /**\n * Process incoming tracing events with lifecycle tracking\n */\n protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n const span = event.exportedSpan;\n const spanId = span.id;\n\n // Track internal metrics\n this.#trackEvent('tracing');\n\n // Generate log message\n const logMessage = `[TestExporter] ${event.type}: ${span.type} \"${span.name}\" (entity: ${span.entityName ?? span.entityId ?? 'unknown'}, trace: ${span.traceId.slice(-8)}, span: ${spanId.slice(-8)})`;\n\n if (this.#config.storeLogs) {\n this.#debugLogs.push(logMessage);\n }\n\n // Get or create span state\n const state = this.#spanStates.get(spanId) || {\n hasStart: false,\n hasEnd: false,\n hasUpdate: false,\n events: [],\n };\n\n // Lifecycle validation\n if (this.#config.validateLifecycle) {\n this.#validateLifecycle(event, state, spanId);\n }\n\n // Update state based on event type\n if (event.type === EventType.SPAN_STARTED) {\n state.hasStart = true;\n } else if (event.type === EventType.SPAN_ENDED) {\n state.hasEnd = true;\n if (span.isEvent) {\n state.isEventSpan = true;\n }\n } else if (event.type === EventType.SPAN_UPDATED) {\n state.hasUpdate = true;\n }\n\n state.events.push(event);\n this.#spanStates.set(spanId, state);\n this.#tracingEvents.push(event);\n }\n\n // ============================================================================\n // Signal Handlers (Logs, Metrics, Scores, Feedback)\n // ============================================================================\n\n /**\n * Process incoming log events\n */\n async onLogEvent(event: LogEvent): Promise<void> {\n this.#trackEvent('log');\n\n if (this.#config.storeLogs) {\n const log = event.log;\n const traceId = log.traceId;\n const logMessage = `[TestExporter] log.${log.level}: \"${log.message}\"${traceId ? ` (trace: ${traceId.slice(-8)})` : ''}`;\n this.#debugLogs.push(logMessage);\n }\n\n this.#logEvents.push(event);\n }\n\n /**\n * Process incoming metric events\n */\n async onMetricEvent(event: MetricEvent): Promise<void> {\n this.#trackEvent('metric');\n\n if (this.#config.storeLogs) {\n const metric = event.metric;\n const labelsStr = Object.entries(metric.labels)\n .map(([k, v]) => `${k}=${v}`)\n .join(', ');\n const logMessage = `[TestExporter] metric: ${metric.name}=${metric.value}${labelsStr ? ` {${labelsStr}}` : ''}`;\n this.#debugLogs.push(logMessage);\n }\n\n this.#metricEvents.push(event);\n }\n\n /**\n * Process incoming score events\n */\n async onScoreEvent(event: ScoreEvent): Promise<void> {\n this.#trackEvent('score');\n\n if (this.#config.storeLogs) {\n const score = event.score;\n const traceLabel = score.traceId ? score.traceId.slice(-8) : 'unanchored';\n const logMessage = `[TestExporter] score: ${score.scorerId}=${score.score} (trace: ${traceLabel}${score.spanId ? `, span: ${score.spanId.slice(-8)}` : ''})`;\n this.#debugLogs.push(logMessage);\n }\n\n this.#scoreEvents.push(event);\n }\n\n /**\n * Process incoming feedback events\n */\n async onFeedbackEvent(event: FeedbackEvent): Promise<void> {\n this.#trackEvent('feedback');\n\n if (this.#config.storeLogs) {\n const fb = event.feedback;\n const traceLabel = fb.traceId ? fb.traceId.slice(-8) : 'unanchored';\n const feedbackSource = fb.feedbackSource ?? fb.source;\n const logMessage = `[TestExporter] feedback: ${fb.feedbackType} from ${feedbackSource}=${fb.value} (trace: ${traceLabel}${fb.spanId ? `, span: ${fb.spanId.slice(-8)}` : ''})`;\n this.#debugLogs.push(logMessage);\n }\n\n this.#feedbackEvents.push(event);\n }\n\n /**\n * Track an event for internal metrics\n */\n #trackEvent(signal: 'tracing' | 'log' | 'metric' | 'score' | 'feedback'): void {\n this.#internalMetrics.lastEventAt = new Date();\n this.#internalMetrics.totalEventsReceived++;\n this.#internalMetrics.bySignal[signal]++;\n }\n\n /**\n * Validate span lifecycle rules\n */\n #validateLifecycle(event: TracingEvent, state: SpanState, spanId: string): void {\n const span = event.exportedSpan;\n\n if (event.type === EventType.SPAN_STARTED) {\n if (state.hasStart) {\n this.logger.warn(`Span ${spanId} (${span.type} \"${span.name}\") started twice`);\n }\n } else if (event.type === EventType.SPAN_ENDED) {\n if (span.isEvent) {\n // Event spans should only emit SPAN_ENDED\n if (state.hasStart) {\n this.logger.warn(`Event span ${spanId} (${span.type} \"${span.name}\") incorrectly received SPAN_STARTED`);\n }\n if (state.hasUpdate) {\n this.logger.warn(`Event span ${spanId} (${span.type} \"${span.name}\") incorrectly received SPAN_UPDATED`);\n }\n } else {\n // Normal spans should have started before ending\n if (!state.hasStart) {\n this.logger.warn(`Normal span ${spanId} (${span.type} \"${span.name}\") ended without starting`);\n }\n }\n }\n }\n\n // ============================================================================\n // Tracing Query Methods\n // ============================================================================\n\n /**\n * Get all collected tracing events\n */\n get events(): TracingEvent[] {\n return [...this.#tracingEvents];\n }\n\n /**\n * Get completed spans by SpanType (e.g., 'agent_run', 'tool_call')\n *\n * @param type - The SpanType to filter by\n * @returns Array of completed exported spans of the specified type\n */\n getSpansByType<T extends SpanType>(type: T): ExportedSpan<T>[] {\n return Array.from(this.#spanStates.values())\n .filter(state => {\n if (!state.hasEnd) return false;\n const endEvent = state.events.find(e => e.type === EventType.SPAN_ENDED);\n return endEvent?.exportedSpan.type === type;\n })\n .map(state => {\n const endEvent = state.events.find(e => e.type === EventType.SPAN_ENDED);\n return endEvent?.exportedSpan;\n })\n .filter((span): span is ExportedSpan<T> => span !== undefined);\n }\n\n /**\n * Get events by TracingEventType (SPAN_STARTED, SPAN_UPDATED, SPAN_ENDED)\n *\n * @param type - The TracingEventType to filter by\n * @returns Array of events of the specified type\n */\n getByEventType(type: TracingEventType): TracingEvent[] {\n return this.#tracingEvents.filter(e => e.type === type);\n }\n\n /**\n * Get all events and spans for a specific trace\n *\n * @param traceId - The trace ID to filter by\n * @returns Object containing tracing events, final spans, plus logs/scores/feedback for the trace\n */\n getByTraceId(traceId: string): {\n events: TracingEvent[];\n spans: AnyExportedSpan[];\n logs: ExportedLog[];\n scores: ExportedScore[];\n feedback: ExportedFeedback[];\n } {\n const events = this.#tracingEvents.filter(e => e.exportedSpan.traceId === traceId);\n const spans = this.#getUniqueSpansFromEvents(events);\n const logs = this.#logEvents.filter(e => e.log.traceId === traceId).map(e => e.log);\n const scores = this.#scoreEvents.filter(e => e.score.traceId === traceId).map(e => e.score);\n const feedback = this.#feedbackEvents.filter(e => e.feedback.traceId === traceId).map(e => e.feedback);\n return { events, spans, logs, scores, feedback };\n }\n\n /**\n * Get all events for a specific span\n *\n * @param spanId - The span ID to filter by\n * @returns Object containing events and final span state\n */\n getBySpanId(spanId: string): {\n events: TracingEvent[];\n span: AnyExportedSpan | undefined;\n state: SpanState | undefined;\n } {\n const state = this.#spanStates.get(spanId);\n if (!state) {\n return { events: [], span: undefined, state: undefined };\n }\n\n const endEvent = state.events.find(e => e.type === EventType.SPAN_ENDED);\n const span = endEvent?.exportedSpan ?? state.events[state.events.length - 1]?.exportedSpan;\n\n return { events: state.events, span, state };\n }\n\n /**\n * Get all unique spans (returns the final state of each span)\n */\n getAllSpans(): AnyExportedSpan[] {\n return Array.from(this.#spanStates.values())\n .map(state => {\n const endEvent = state.events.find(e => e.type === EventType.SPAN_ENDED);\n return endEvent?.exportedSpan ?? state.events[state.events.length - 1]?.exportedSpan;\n })\n .filter((span): span is AnyExportedSpan => span !== undefined);\n }\n\n /**\n * Get only completed spans (those that have received SPAN_ENDED)\n */\n getCompletedSpans(): AnyExportedSpan[] {\n return Array.from(this.#spanStates.values())\n .filter(state => state.hasEnd)\n .map(state => {\n const endEvent = state.events.find(e => e.type === EventType.SPAN_ENDED);\n return endEvent!.exportedSpan;\n });\n }\n\n /**\n * Get root spans only (spans with no parent)\n */\n getRootSpans(): AnyExportedSpan[] {\n return this.getAllSpans().filter(span => span.isRootSpan);\n }\n\n /**\n * Get incomplete spans (started but not yet ended)\n */\n getIncompleteSpans(): IncompleteSpanInfo[] {\n return Array.from(this.#spanStates.entries())\n .filter(([_, state]) => !state.hasEnd)\n .map(([spanId, state]) => ({\n spanId,\n span: state.events[0]?.exportedSpan,\n state: {\n hasStart: state.hasStart,\n hasUpdate: state.hasUpdate,\n hasEnd: state.hasEnd,\n },\n }));\n }\n\n /**\n * Get unique trace IDs from all collected signals\n */\n getTraceIds(): string[] {\n const traceIds = new Set<string>();\n for (const event of this.#tracingEvents) {\n traceIds.add(event.exportedSpan.traceId);\n }\n for (const event of this.#logEvents) {\n if (event.log.traceId) traceIds.add(event.log.traceId);\n }\n for (const event of this.#scoreEvents) {\n if (event.score.traceId) {\n traceIds.add(event.score.traceId);\n }\n }\n for (const event of this.#feedbackEvents) {\n if (event.feedback.traceId) {\n traceIds.add(event.feedback.traceId);\n }\n }\n return Array.from(traceIds);\n }\n\n // ============================================================================\n // Log Query Methods\n // ============================================================================\n\n /**\n * Get all collected log events\n */\n getLogEvents(): LogEvent[] {\n return [...this.#logEvents];\n }\n\n /**\n * Get all collected logs (unwrapped from events)\n */\n getAllLogs(): ExportedLog[] {\n return this.#logEvents.map(e => e.log);\n }\n\n /**\n * Get logs filtered by level\n */\n getLogsByLevel(level: LogLevel): ExportedLog[] {\n return this.#logEvents.filter(e => e.log.level === level).map(e => e.log);\n }\n\n /**\n * Get logs for a specific trace\n */\n getLogsByTraceId(traceId: string): ExportedLog[] {\n return this.#logEvents.filter(e => e.log.traceId === traceId).map(e => e.log);\n }\n\n // ============================================================================\n // Metric Query Methods\n // ============================================================================\n\n /**\n * Get all collected metric events\n */\n getMetricEvents(): MetricEvent[] {\n return [...this.#metricEvents];\n }\n\n /**\n * Get all collected metrics (unwrapped from events)\n */\n getAllMetrics(): ExportedMetric[] {\n return this.#metricEvents.map(e => e.metric);\n }\n\n /**\n * Get metrics filtered by name\n */\n getMetricsByName(name: string): ExportedMetric[] {\n return this.#metricEvents.filter(e => e.metric.name === name).map(e => e.metric);\n }\n\n /**\n * @deprecated MetricType is no longer stored. Use getMetricsByName() instead.\n */\n getMetricsByType(_metricType: string): ExportedMetric[] {\n throw new Error(\n 'getMetricsByType() has been removed: metricType is no longer stored. ' +\n 'Use getMetricsByName(metricName) instead to filter metrics by name.',\n );\n }\n\n // ============================================================================\n // Score Query Methods\n // ============================================================================\n\n /**\n * Get all collected score events\n */\n getScoreEvents(): ScoreEvent[] {\n return [...this.#scoreEvents];\n }\n\n /**\n * Get all collected scores (unwrapped from events)\n */\n getAllScores(): ExportedScore[] {\n return this.#scoreEvents.map(e => e.score);\n }\n\n /**\n * Get scores filtered by scorer id\n */\n getScoresByScorer(scorerId: string): ExportedScore[] {\n return this.#scoreEvents.filter(e => e.score.scorerId === scorerId).map(e => e.score);\n }\n\n /**\n * Get scores for a specific trace\n */\n getScoresByTraceId(traceId: string): ExportedScore[] {\n return this.#scoreEvents.filter(e => e.score.traceId === traceId).map(e => e.score);\n }\n\n // ============================================================================\n // Feedback Query Methods\n // ============================================================================\n\n /**\n * Get all collected feedback events\n */\n getFeedbackEvents(): FeedbackEvent[] {\n return [...this.#feedbackEvents];\n }\n\n /**\n * Get all collected feedback (unwrapped from events)\n */\n getAllFeedback(): ExportedFeedback[] {\n return this.#feedbackEvents.map(e => e.feedback);\n }\n\n /**\n * Get feedback filtered by type\n */\n getFeedbackByType(feedbackType: string): ExportedFeedback[] {\n return this.#feedbackEvents.filter(e => e.feedback.feedbackType === feedbackType).map(e => e.feedback);\n }\n\n /**\n * Get feedback for a specific trace\n */\n getFeedbackByTraceId(traceId: string): ExportedFeedback[] {\n return this.#feedbackEvents.filter(e => e.feedback.traceId === traceId).map(e => e.feedback);\n }\n\n // ============================================================================\n // Statistics\n // ============================================================================\n\n /**\n * Get comprehensive statistics about all collected signals\n */\n getStatistics(): TestExporterStats {\n const bySpanType: Record<string, number> = {};\n let completedSpans = 0;\n let incompleteSpans = 0;\n\n for (const state of this.#spanStates.values()) {\n if (state.hasEnd) {\n completedSpans++;\n const endEvent = state.events.find(e => e.type === EventType.SPAN_ENDED);\n const spanType = endEvent?.exportedSpan.type;\n if (spanType) {\n bySpanType[spanType] = (bySpanType[spanType] || 0) + 1;\n }\n } else {\n incompleteSpans++;\n }\n }\n\n // Log level breakdown\n const logsByLevel: Record<string, number> = {};\n for (const event of this.#logEvents) {\n const level = event.log.level;\n logsByLevel[level] = (logsByLevel[level] || 0) + 1;\n }\n\n // Metric breakdowns\n const metricsByName: Record<string, number> = {};\n for (const event of this.#metricEvents) {\n const mName = event.metric.name;\n metricsByName[mName] = (metricsByName[mName] || 0) + 1;\n }\n\n // Score breakdown by scorer\n const scoresByScorer: Record<string, number> = {};\n for (const event of this.#scoreEvents) {\n const scorer = event.score.scorerId;\n scoresByScorer[scorer] = (scoresByScorer[scorer] || 0) + 1;\n }\n\n // Feedback breakdown by type\n const feedbackByType: Record<string, number> = {};\n for (const event of this.#feedbackEvents) {\n const fbType = event.feedback.feedbackType;\n feedbackByType[fbType] = (feedbackByType[fbType] || 0) + 1;\n }\n\n return {\n totalTracingEvents: this.#tracingEvents.length,\n totalEvents: this.#tracingEvents.length, // deprecated alias\n totalSpans: this.#spanStates.size,\n totalTraces: this.getTraceIds().length,\n completedSpans,\n incompleteSpans,\n byEventType: {\n started: this.#tracingEvents.filter(e => e.type === EventType.SPAN_STARTED).length,\n updated: this.#tracingEvents.filter(e => e.type === EventType.SPAN_UPDATED).length,\n ended: this.#tracingEvents.filter(e => e.type === EventType.SPAN_ENDED).length,\n },\n bySpanType,\n totalLogs: this.#logEvents.length,\n logsByLevel,\n totalMetrics: this.#metricEvents.length,\n metricsByName,\n totalScores: this.#scoreEvents.length,\n scoresByScorer,\n totalFeedback: this.#feedbackEvents.length,\n feedbackByType,\n };\n }\n\n // ============================================================================\n // JSON Output\n // ============================================================================\n\n /**\n * Serialize all collected data to JSON string\n *\n * @param options - Serialization options\n * @returns JSON string of all collected data\n */\n toJSON(options?: { indent?: number; includeEvents?: boolean; includeStats?: boolean }): string {\n const indent = options?.indent ?? this.#config.jsonIndent;\n const includeEvents = options?.includeEvents ?? true;\n const includeStats = options?.includeStats ?? true;\n\n const data: Record<string, unknown> = {\n spans: this.getAllSpans(),\n };\n\n // Include log/metric/score/feedback data\n if (this.#logEvents.length > 0) {\n data.logs = this.getAllLogs();\n }\n if (this.#metricEvents.length > 0) {\n data.metrics = this.getAllMetrics();\n }\n if (this.#scoreEvents.length > 0) {\n data.scores = this.getAllScores();\n }\n if (this.#feedbackEvents.length > 0) {\n data.feedback = this.getAllFeedback();\n }\n\n if (includeEvents) {\n data.events = this.#tracingEvents;\n }\n\n if (includeStats) {\n data.statistics = this.getStatistics();\n }\n\n return JSON.stringify(data, this.#jsonReplacer, indent);\n }\n\n /**\n * Build a tree structure from spans, nesting children under their parents\n *\n * @returns Array of root span tree nodes (spans with no parent)\n */\n buildSpanTree(): SpanTreeNode[] {\n const spans = this.getAllSpans();\n const nodeMap = new Map<string, SpanTreeNode>();\n const roots: SpanTreeNode[] = [];\n\n // First pass: create nodes for all spans\n for (const span of spans) {\n nodeMap.set(span.id, { span, children: [] });\n }\n\n // Second pass: build parent-child relationships\n for (const span of spans) {\n const node = nodeMap.get(span.id)!;\n if (span.parentSpanId && nodeMap.has(span.parentSpanId)) {\n // Has a parent in our collection - add as child\n nodeMap.get(span.parentSpanId)!.children.push(node);\n } else {\n // No parent or parent not in collection - this is a root\n roots.push(node);\n }\n }\n\n // Sort children by startTime for consistent ordering\n const sortChildren = (node: SpanTreeNode) => {\n node.children.sort((a, b) => new Date(a.span.startTime).getTime() - new Date(b.span.startTime).getTime());\n node.children.forEach(sortChildren);\n };\n roots.forEach(sortChildren);\n\n return roots;\n }\n\n /**\n * Serialize spans as a tree structure to JSON string\n *\n * @param options - Serialization options\n * @returns JSON string with spans nested in tree format\n */\n toTreeJSON(options?: { indent?: number; includeStats?: boolean }): string {\n const indent = options?.indent ?? this.#config.jsonIndent;\n const includeStats = options?.includeStats ?? true;\n\n const data: Record<string, unknown> = {\n tree: this.buildSpanTree(),\n };\n\n if (includeStats) {\n data.statistics = this.getStatistics();\n }\n\n return JSON.stringify(data, this.#jsonReplacer, indent);\n }\n\n /**\n * Build a normalized tree structure suitable for snapshot testing.\n *\n * Normalizations applied:\n * - Span IDs replaced with stable placeholders (<span-1>, <span-2>, etc.)\n * - Trace IDs replaced with stable placeholders (<trace-1>, <trace-2>, etc.)\n * - parentSpanId replaced with normalized parent ID\n * - Timestamps replaced with durationMs (or null if not ended)\n * - Empty children arrays are omitted\n *\n * @returns Array of normalized root tree nodes\n */\n buildNormalizedTree(): NormalizedTreeNode[] {\n const tree = this.buildSpanTree();\n const spanIdMap = new Map<string, string>();\n const traceIdMap = new Map<string, string>();\n // Key-specific UUID maps: key -> (uuid -> placeholder)\n const uuidMapsByKey = new Map<string, Map<string, string>>();\n // Key-specific counters\n const uuidCountersByKey = new Map<string, number>();\n let spanIdCounter = 1;\n let traceIdCounter = 1;\n\n // UUID regex pattern (8-4-4-4-12 hex chars)\n const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n // 32-character hex string (traceId format without hyphens)\n const hexId32Regex = /^[0-9a-f]{32}$/i;\n // Prefixed UUID pattern (e.g., mapping_<uuid>, dowhile_<uuid>) - for exact match\n const prefixedUuidRegex = /^([a-z_]+)_([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$/i;\n // Prefixed UUID pattern for embedded matches — non-global for test(), global for replace()\n const embeddedPrefixedUuidTest = /([a-z_]+)_([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})/i;\n const embeddedPrefixedUuidRegex = /([a-z_]+)_([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})/gi;\n\n // Helper to normalize a UUID with key-specific placeholders\n const normalizeUuid = (uuid: string, key: string): string => {\n if (!uuidMapsByKey.has(key)) {\n uuidMapsByKey.set(key, new Map());\n uuidCountersByKey.set(key, 1);\n }\n const keyMap = uuidMapsByKey.get(key)!;\n if (!keyMap.has(uuid)) {\n const counter = uuidCountersByKey.get(key)!;\n keyMap.set(uuid, `<${key}-${counter}>`);\n uuidCountersByKey.set(key, counter + 1);\n }\n return keyMap.get(uuid)!;\n };\n\n // Helper to normalize a value, replacing UUIDs and Dates with stable placeholders\n // The key parameter is used to create key-specific UUID placeholders\n const normalizeValue = (value: unknown, key?: string): unknown => {\n // Handle Date objects - just indicate a date exists, don't track specific values\n if (value instanceof Date) {\n return '<date>';\n }\n if (key === 'createdAt' && typeof value === 'number') {\n return '<date>';\n }\n if (typeof value === 'string') {\n // Special handling for traceId - use the shared traceIdMap (handles both UUID and 32-char hex formats)\n if (key === 'traceId' && (uuidRegex.test(value) || hexId32Regex.test(value))) {\n if (!traceIdMap.has(value)) {\n traceIdMap.set(value, `<trace-${traceIdCounter++}>`);\n }\n return traceIdMap.get(value)!;\n }\n // Check for pure UUID (exact match)\n if (uuidRegex.test(value)) {\n // Use key-specific placeholder if key is provided, otherwise generic 'uuid'\n return normalizeUuid(value, key ?? 'uuid');\n }\n // Check for prefixed UUID (e.g., mapping_<uuid>) - exact match\n const prefixMatch = prefixedUuidRegex.exec(value);\n if (prefixMatch && prefixMatch[1] && prefixMatch[2]) {\n const prefix = prefixMatch[1];\n const uuid = prefixMatch[2];\n return `${prefix}_${normalizeUuid(uuid, prefix)}`;\n }\n // Check for embedded prefixed UUIDs (e.g., \"workflow step: 'mapping_<uuid>'\")\n if (embeddedPrefixedUuidTest.test(value)) {\n return value.replace(embeddedPrefixedUuidRegex, (_match, prefix, uuid) => {\n return `${prefix}_${normalizeUuid(uuid, prefix)}`;\n });\n }\n }\n if (Array.isArray(value)) {\n return value.map(v => normalizeValue(v, key));\n }\n if (value && typeof value === 'object') {\n const normalized: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n if (key === 'providerOptions' && k === 'mastra' && v && typeof v === 'object') {\n const mastraOptions = v as Record<string, unknown>;\n const remainingMastraOptions = Object.fromEntries(\n Object.entries(mastraOptions).filter(([mastraKey]) => mastraKey !== 'createdAt'),\n );\n if (Object.keys(remainingMastraOptions).length > 0) {\n normalized[k] = normalizeValue(remainingMastraOptions, k);\n }\n continue;\n }\n\n const normalizedValue = normalizeValue(v, k);\n if (normalizedValue !== undefined) {\n normalized[k] = normalizedValue;\n }\n }\n\n if (key === 'providerOptions' && Object.keys(normalized).length === 0) {\n return undefined;\n }\n\n return normalized;\n }\n return value;\n };\n\n // First pass: assign stable IDs in tree traversal order\n const assignIds = (nodes: SpanTreeNode[]) => {\n for (const node of nodes) {\n spanIdMap.set(node.span.id, `<span-${spanIdCounter++}>`);\n // Assign trace ID if not seen before\n if (!traceIdMap.has(node.span.traceId)) {\n traceIdMap.set(node.span.traceId, `<trace-${traceIdCounter++}>`);\n }\n assignIds(node.children);\n }\n };\n assignIds(tree);\n\n // Second pass: build normalized tree\n const normalizeNode = (node: SpanTreeNode): NormalizedTreeNode => {\n const span = node.span;\n const completed = span.endTime !== undefined && span.endTime !== null;\n\n const normalizedSpan: NormalizedSpan = {\n id: spanIdMap.get(span.id)!,\n traceId: traceIdMap.get(span.traceId)!,\n name: normalizeValue(span.name, 'name') as string,\n type: span.type,\n completed,\n isEvent: span.isEvent,\n isRootSpan: span.isRootSpan,\n };\n\n // Only include optional fields if they have values\n if (span.parentSpanId && spanIdMap.has(span.parentSpanId)) {\n normalizedSpan.parentId = spanIdMap.get(span.parentSpanId);\n }\n if (span.entityType) {\n normalizedSpan.entityType = span.entityType;\n }\n if (span.entityId) {\n normalizedSpan.entityId = normalizeValue(span.entityId, 'entityId') as string;\n }\n if (span.attributes && Object.keys(span.attributes).length > 0) {\n normalizedSpan.attributes = normalizeValue(span.attributes) as Record<string, unknown>;\n }\n if (span.metadata && Object.keys(span.metadata).length > 0) {\n normalizedSpan.metadata = normalizeValue(span.metadata) as Record<string, unknown>;\n }\n if (span.input !== undefined) {\n normalizedSpan.input = normalizeValue(span.input);\n }\n if (span.output !== undefined) {\n normalizedSpan.output = normalizeValue(span.output);\n }\n if (span.errorInfo) {\n normalizedSpan.errorInfo = normalizeValue(span.errorInfo) as typeof span.errorInfo;\n }\n if (span.tags && span.tags.length > 0) {\n normalizedSpan.tags = span.tags;\n }\n\n const result: NormalizedTreeNode = { span: normalizedSpan };\n\n // Only include children if non-empty\n if (node.children.length > 0) {\n result.children = node.children.map(normalizeNode);\n }\n\n return result;\n };\n\n return tree.map(normalizeNode);\n }\n\n /**\n * Generate an ASCII tree structure graph for debugging.\n * Shows span type and name in a hierarchical format.\n *\n * @param nodes - Normalized tree nodes (defaults to current normalized tree)\n * @returns Array of strings representing the tree structure\n *\n * @example\n * ```\n * agent_run: \"agent run: 'test-agent'\"\n * ├── processor_run: \"input processor: validator\"\n * │ └── agent_run: \"agent run: 'validator-agent'\"\n * └── model_generation: \"llm: 'mock-model-id'\"\n * ```\n */\n generateStructureGraph(nodes?: NormalizedTreeNode[]): string[] {\n const tree = nodes ?? this.buildNormalizedTree();\n const lines: string[] = [];\n\n const buildLines = (node: NormalizedTreeNode, prefix: string, isLast: boolean, isRoot: boolean): void => {\n // Build the current line\n const connector = isRoot ? '' : isLast ? '└── ' : '├── ';\n const line = `${prefix}${connector}${node.span.type}: \"${node.span.name}\"`;\n lines.push(line);\n\n // Build lines for children\n const children = node.children ?? [];\n const childPrefix = isRoot ? '' : prefix + (isLast ? ' ' : '│ ');\n children.forEach((child, index) => {\n const childIsLast = index === children.length - 1;\n buildLines(child, childPrefix, childIsLast, false);\n });\n };\n\n // Process each root node\n tree.forEach((rootNode, index) => {\n if (index > 0) {\n lines.push(''); // Add blank line between multiple roots\n }\n buildLines(rootNode, '', true, true);\n });\n\n return lines;\n }\n\n /**\n * Serialize spans as a normalized tree structure for snapshot testing.\n * Includes a __structure__ field with an ASCII tree graph for readability.\n *\n * @param options - Serialization options\n * @returns JSON string with normalized spans in tree format\n */\n toNormalizedTreeJSON(options?: { indent?: number; includeStructure?: boolean }): string {\n const indent = options?.indent ?? this.#config.jsonIndent;\n const includeStructure = options?.includeStructure ?? true;\n const normalizedTree = this.buildNormalizedTree();\n\n if (includeStructure) {\n const structureGraph = this.generateStructureGraph(normalizedTree);\n const data = {\n __structure__: structureGraph,\n spans: normalizedTree,\n };\n return JSON.stringify(data, null, indent);\n }\n\n return JSON.stringify(normalizedTree, null, indent);\n }\n\n /**\n * Write collected data to a JSON file\n *\n * @param filePath - Path to write the JSON file\n * @param options - Serialization options\n */\n async writeToFile(\n filePath: string,\n options?: {\n indent?: number;\n includeEvents?: boolean;\n includeStats?: boolean;\n format?: 'flat' | 'tree' | 'normalized';\n },\n ): Promise<void> {\n const format = options?.format ?? 'flat';\n let json: string;\n\n if (format === 'normalized') {\n json = this.toNormalizedTreeJSON({ indent: options?.indent });\n } else if (format === 'tree') {\n json = this.toTreeJSON({ indent: options?.indent, includeStats: options?.includeStats });\n } else {\n json = this.toJSON(options);\n }\n\n const { writeFile } = await import('node:fs/promises');\n await writeFile(filePath, json, 'utf-8');\n this.logger.info(`TestExporter: wrote ${this.#tracingEvents.length} tracing events to ${filePath}`);\n }\n\n /**\n * Assert that the current normalized tree matches a snapshot file.\n * Throws an error with a diff if they don't match.\n *\n * The snapshot format includes:\n * - `__structure__`: ASCII tree graph (compared first for quick validation)\n * - `spans`: The normalized span tree (detailed comparison)\n *\n * Supports special markers in the snapshot:\n * - `{\"__or__\": [\"value1\", \"value2\"]}` - matches if actual equals any listed value\n * - `{\"__any__\": \"string\"}` - matches any string value\n * - `{\"__any__\": \"number\"}` - matches any number value\n * - `{\"__any__\": \"boolean\"}` - matches any boolean value\n * - `{\"__any__\": \"object\"}` - matches any object value\n * - `{\"__any__\": \"array\"}` - matches any array value\n * - `{\"__any__\": true}` - matches any non-null/undefined value\n *\n * Environment variables:\n * Use `{ updateSnapshot: true }` option to update the snapshot instead of comparing\n *\n * @param snapshotName - Name of the snapshot file (resolved relative to __snapshots__ directory)\n * @param options - Options for snapshot comparison\n * @param options.updateSnapshot - If true, update the snapshot file instead of comparing\n * @throws Error if the snapshot doesn't match (and updateSnapshot is false)\n */\n async assertMatchesSnapshot(snapshotName: string, options?: { updateSnapshot?: boolean }): Promise<void> {\n // Resolve snapshot path relative to the __snapshots__ directory\n const { join } = await import('node:path');\n const snapshotPath = join(await getSnapshotsDir(), snapshotName);\n const normalizedTree = this.buildNormalizedTree();\n const structureGraph = this.generateStructureGraph(normalizedTree);\n\n // Build current data with structure\n const currentData = {\n __structure__: structureGraph,\n spans: normalizedTree,\n };\n const currentJson = JSON.stringify(currentData, null, this.#config.jsonIndent);\n\n // Check option to update snapshot\n const shouldUpdate = options?.updateSnapshot;\n\n // If updating snapshot, write and return\n if (shouldUpdate) {\n const { writeFile } = await import('node:fs/promises');\n await writeFile(snapshotPath, currentJson, 'utf-8');\n this.logger.info(`TestExporter: updated snapshot ${snapshotPath}`);\n return;\n }\n\n let snapshotData: { __structure__?: string[]; spans?: unknown } | unknown[];\n let snapshotContent: string;\n try {\n const { readFile } = await import('node:fs/promises');\n snapshotContent = await readFile(snapshotPath, 'utf-8');\n } catch (err: unknown) {\n if (err && typeof err === 'object' && 'code' in err && (err as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new Error(\n `Snapshot file not found: ${snapshotPath}\\n` + `Run with { updateSnapshot: true } to create it.`,\n );\n }\n throw err;\n }\n try {\n snapshotData = JSON.parse(snapshotContent);\n } catch (err: unknown) {\n throw new Error(`Failed to parse snapshot ${snapshotPath}: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Handle both old format (array) and new format (object with __structure__ and spans)\n let expectedSpans: unknown;\n let expectedStructure: string[] | undefined;\n\n if (Array.isArray(snapshotData)) {\n // Old format: just the spans array\n expectedSpans = snapshotData;\n } else if (snapshotData && typeof snapshotData === 'object' && 'spans' in snapshotData) {\n // New format: { __structure__, spans }\n expectedSpans = snapshotData.spans;\n expectedStructure = snapshotData.__structure__;\n } else {\n throw new Error(\n `Invalid snapshot format in ${snapshotPath}.\\n` + `Expected an array or object with 'spans' property.`,\n );\n }\n\n // Compare structure first (quick validation)\n if (expectedStructure) {\n const structureMismatches = this.#compareStructure(structureGraph, expectedStructure);\n if (structureMismatches.length > 0) {\n throw new Error(\n `Structure mismatch in snapshot:\\n\\n` +\n `Expected:\\n${expectedStructure.join('\\n')}\\n\\n` +\n `Actual:\\n${structureGraph.join('\\n')}\\n\\n` +\n `Differences:\\n${structureMismatches.join('\\n')}\\n\\n` +\n `Snapshot: ${snapshotPath}\\n` +\n `Run with { updateSnapshot: true } to update.`,\n );\n }\n }\n\n // Deep compare spans\n const mismatches: { path: string; expected: unknown; actual: unknown }[] = [];\n this.#deepCompareWithMarkers(normalizedTree, expectedSpans, '$.spans', mismatches);\n\n if (mismatches.length > 0) {\n const mismatchDetails = mismatches\n .map(\n (m, i) =>\n `${i + 1}. ${m.path}\\n Expected: ${JSON.stringify(m.expected)}\\n Actual: ${JSON.stringify(m.actual)}`,\n )\n .join('\\n\\n');\n throw new Error(\n `Snapshot has ${mismatches.length} mismatch${mismatches.length > 1 ? 'es' : ''}:\\n\\n` +\n `${mismatchDetails}\\n\\n` +\n `Snapshot: ${snapshotPath}\\n` +\n `Run with { updateSnapshot: true } to update.`,\n );\n }\n }\n\n /**\n * Compare two structure graphs and return differences\n */\n #compareStructure(actual: string[], expected: string[]): string[] {\n const diffs: string[] = [];\n\n const maxLen = Math.max(actual.length, expected.length);\n for (let i = 0; i < maxLen; i++) {\n const actualLine = actual[i];\n const expectedLine = expected[i];\n\n if (actualLine !== expectedLine) {\n if (actualLine === undefined) {\n diffs.push(`Line ${i + 1}: Missing in actual`);\n diffs.push(` Expected: ${expectedLine}`);\n } else if (expectedLine === undefined) {\n diffs.push(`Line ${i + 1}: Extra in actual`);\n diffs.push(` Actual: ${actualLine}`);\n } else {\n diffs.push(`Line ${i + 1}:`);\n diffs.push(` Expected: ${expectedLine}`);\n diffs.push(` Actual: ${actualLine}`);\n }\n }\n }\n\n return diffs;\n }\n\n /**\n * Deep compare two values, supporting special markers like __or__ and __any__.\n * Collects all mismatches into the provided array.\n */\n #deepCompareWithMarkers(\n actual: unknown,\n expected: unknown,\n path: string,\n mismatches: { path: string; expected: unknown; actual: unknown }[],\n ): void {\n // Handle __or__ marker\n if (this.#isOrMarker(expected)) {\n const allowedValues = (expected as { __or__: unknown[] }).__or__;\n const matches = allowedValues.some(allowed => {\n const tempMismatches: { path: string; expected: unknown; actual: unknown }[] = [];\n this.#deepCompareWithMarkers(actual, allowed, path, tempMismatches);\n return tempMismatches.length === 0;\n });\n if (!matches) {\n mismatches.push({ path, expected: { __or__: allowedValues }, actual });\n }\n return;\n }\n\n // Handle __any__ marker\n if (this.#isAnyMarker(expected)) {\n const typeConstraint = (expected as { __any__: string | boolean }).__any__;\n\n // Check for null/undefined\n if (actual === null || actual === undefined) {\n mismatches.push({ path, expected: { __any__: typeConstraint }, actual });\n return;\n }\n\n // If typeConstraint is true, any non-null value matches\n if (typeConstraint === true) {\n return;\n }\n\n // Check type constraint\n const actualType = Array.isArray(actual) ? 'array' : typeof actual;\n if (actualType !== typeConstraint) {\n mismatches.push({\n path,\n expected: { __any__: typeConstraint },\n actual: `(${actualType}) ${JSON.stringify(actual).slice(0, 50)}...`,\n });\n }\n return;\n }\n\n // Handle arrays\n if (Array.isArray(expected)) {\n if (!Array.isArray(actual)) {\n mismatches.push({ path, expected, actual });\n return;\n }\n if (actual.length !== expected.length) {\n mismatches.push({ path: `${path}.length`, expected: expected.length, actual: actual.length });\n return;\n }\n for (let i = 0; i < expected.length; i++) {\n this.#deepCompareWithMarkers(actual[i], expected[i], `${path}[${i}]`, mismatches);\n }\n return;\n }\n\n // Handle objects\n if (expected !== null && typeof expected === 'object') {\n if (actual === null || typeof actual !== 'object' || Array.isArray(actual)) {\n mismatches.push({ path, expected, actual });\n return;\n }\n const expectedObj = expected as Record<string, unknown>;\n const actualObj = actual as Record<string, unknown>;\n\n // Check all expected keys exist and match (skip metadata keys like __placeholder__)\n for (const key of Object.keys(expectedObj)) {\n // Skip metadata keys (e.g., __placeholder__, __structure__)\n if (this.#isMetadataKey(key)) {\n continue;\n }\n if (!(key in actualObj)) {\n // Only report if expected value is not undefined\n if (expectedObj[key] !== undefined) {\n mismatches.push({ path: `${path}.${key}`, expected: expectedObj[key], actual: undefined });\n }\n continue;\n }\n this.#deepCompareWithMarkers(actualObj[key], expectedObj[key], `${path}.${key}`, mismatches);\n }\n\n // Check for extra keys in actual (skip metadata keys)\n for (const key of Object.keys(actualObj)) {\n if (this.#isMetadataKey(key)) {\n continue;\n }\n if (!(key in expectedObj)) {\n // Only report if actual value is not undefined\n if (actualObj[key] !== undefined) {\n mismatches.push({ path: `${path}.${key}`, expected: undefined, actual: actualObj[key] });\n }\n }\n }\n return;\n }\n\n // Handle primitives\n if (actual !== expected) {\n mismatches.push({ path, expected, actual });\n }\n }\n\n /**\n * Check if a value is an __or__ marker object\n */\n #isOrMarker(value: unknown): boolean {\n return (\n value !== null &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n '__or__' in value &&\n Array.isArray((value as { __or__: unknown }).__or__)\n );\n }\n\n /**\n * Check if a value is an __any__ marker object\n */\n #isAnyMarker(value: unknown): boolean {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n return false;\n }\n if (!('__any__' in value)) {\n return false;\n }\n const constraint = (value as { __any__: unknown }).__any__;\n // Valid constraints: true, or type strings\n return constraint === true || ['string', 'number', 'boolean', 'object', 'array'].includes(constraint as string);\n }\n\n /**\n * Check if a key should be skipped during comparison (metadata keys like __structure__)\n */\n #isMetadataKey(key: string): boolean {\n return key.startsWith('__') && key.endsWith('__');\n }\n\n /**\n * Custom JSON replacer to handle Date objects and other special types\n */\n #jsonReplacer = (_key: string, value: unknown): unknown => {\n if (value instanceof Date) {\n return value.toISOString();\n }\n return value;\n };\n\n // ============================================================================\n // Debugging Helpers\n // ============================================================================\n\n /**\n * Get all stored debug logs (internal exporter logging, not signal logs)\n */\n getLogs(): string[] {\n return [...this.#debugLogs];\n }\n\n /**\n * Dump debug logs to console for debugging (uses console.error for visibility in test output)\n */\n dumpLogs(): void {\n console.error('\\n=== TestExporter Logs ===');\n this.#debugLogs.forEach(log => {\n console.error(log);\n });\n console.error('=== End Logs ===\\n');\n }\n\n /**\n * Validate final state - useful for test assertions\n *\n * @returns Object with validation results\n */\n validateFinalState(): {\n valid: boolean;\n singleTraceId: boolean;\n allSpansComplete: boolean;\n traceIds: string[];\n incompleteSpans: IncompleteSpanInfo[];\n } {\n const traceIds = this.getTraceIds();\n const incompleteSpans = this.getIncompleteSpans();\n\n const singleTraceId = traceIds.length === 1;\n const allSpansComplete = incompleteSpans.length === 0;\n\n return {\n valid: singleTraceId && allSpansComplete,\n singleTraceId,\n allSpansComplete,\n traceIds,\n incompleteSpans,\n };\n }\n\n // ============================================================================\n // Reset & Lifecycle\n // ============================================================================\n\n /**\n * Clear all collected events and state across all signals\n */\n clearEvents(): void {\n this.#tracingEvents = [];\n this.#spanStates.clear();\n this.#logEvents = [];\n this.#metricEvents = [];\n this.#scoreEvents = [];\n this.#feedbackEvents = [];\n this.#debugLogs = [];\n // Note: #internalMetrics is intentionally NOT reset here —\n // it tracks cumulative lifetime stats across clearEvents/reset calls.\n }\n\n /**\n * Alias for clearEvents (compatibility with TestExporter)\n */\n reset(): void {\n this.clearEvents();\n }\n\n /**\n * Get internal metrics about the exporter's own activity.\n */\n getInternalMetrics(): TestExporterInternalMetrics {\n const json = this.toJSON({ includeEvents: false, includeStats: false });\n return {\n startedAt: this.#internalMetrics.startedAt,\n lastEventAt: this.#internalMetrics.lastEventAt,\n totalEventsReceived: this.#internalMetrics.totalEventsReceived,\n bySignal: { ...this.#internalMetrics.bySignal },\n flushCount: this.#internalMetrics.flushCount,\n estimatedJsonBytes: new TextEncoder().encode(json).byteLength,\n };\n }\n\n /**\n * Flush buffered data and log internal metrics summary.\n */\n async flush(): Promise<void> {\n this.#internalMetrics.flushCount++;\n\n if (this.#config.logMetricsOnFlush) {\n const metrics = this.getInternalMetrics();\n const uptimeMs = Date.now() - metrics.startedAt.getTime();\n const summary = [\n `[TestExporter] flush #${metrics.flushCount} summary:`,\n ` uptime: ${(uptimeMs / 1000).toFixed(1)}s`,\n ` total events received: ${metrics.totalEventsReceived}`,\n ` by signal: tracing=${metrics.bySignal.tracing}, log=${metrics.bySignal.log}, metric=${metrics.bySignal.metric}, score=${metrics.bySignal.score}, feedback=${metrics.bySignal.feedback}`,\n ` buffered: spans=${this.#spanStates.size}, logs=${this.#logEvents.length}, metrics=${this.#metricEvents.length}, scores=${this.#scoreEvents.length}, feedback=${this.#feedbackEvents.length}`,\n ` estimated JSON size: ${(metrics.estimatedJsonBytes / 1024).toFixed(1)}KB`,\n ].join('\\n');\n this.logger.info(summary);\n }\n }\n\n async shutdown(): Promise<void> {\n await this.flush();\n this.logger.info('TestExporter shutdown');\n }\n\n // ============================================================================\n // Private Helpers\n // ============================================================================\n\n /**\n * Extract unique spans from a list of events\n */\n #getUniqueSpansFromEvents(events: TracingEvent[]): AnyExportedSpan[] {\n const spanMap = new Map<string, AnyExportedSpan>();\n\n for (const event of events) {\n const span = event.exportedSpan;\n // Prefer SPAN_ENDED events as they contain the final state\n if (event.type === EventType.SPAN_ENDED || !spanMap.has(span.id)) {\n spanMap.set(span.id, span);\n }\n }\n\n return Array.from(spanMap.values());\n }\n}\n\n// ============================================================================\n// Deprecated Aliases\n// ============================================================================\n\n/**\n * @deprecated Use `TestExporter` instead. This alias will be removed in a future version.\n */\nexport const JsonExporter = TestExporter;\n/**\n * @deprecated Use `TestExporter` instead. This is a type alias for backward compatibility.\n */\nexport type JsonExporter = TestExporter;\n\n/**\n * @deprecated Use `TestExporterConfig` instead.\n */\nexport type JsonExporterConfig = TestExporterConfig;\n\n/**\n * @deprecated Use `TestExporterStats` instead.\n */\nexport type JsonExporterStats = TestExporterStats;\n\n/**\n * @deprecated Use `TestExporterInternalMetrics` instead.\n */\nexport type JsonExporterInternalMetrics = TestExporterInternalMetrics;\n","import type { SpanType, Span, CreateSpanOptions } from '@mastra/core/observability';\nimport type { ObservabilityInstanceConfig } from '../config';\nimport { DefaultSpan } from '../spans';\nimport { BaseObservabilityInstance } from './base';\n\nexport class DefaultObservabilityInstance extends BaseObservabilityInstance {\n constructor(config: ObservabilityInstanceConfig) {\n super(config);\n }\n\n protected createSpan<TType extends SpanType>(options: CreateSpanOptions<TType>): Span<TType> {\n // Simple span creation - base class handles all tracing lifecycle automatically\n return new DefaultSpan<TType>(options, this);\n }\n}\n","import { generateSignalId } from '@mastra/core/observability';\nimport type {\n AnyRecordedSpan,\n CorrelationContext,\n FeedbackEvent,\n FeedbackInput,\n RecordedSpan,\n RecordedTrace,\n ScoreEvent,\n ScoreInput,\n SpanType,\n SpanTypeMap,\n} from '@mastra/core/observability';\nimport type { GetTraceResponse, SpanRecord } from '@mastra/core/storage';\n\ntype RecordedAnnotationEvent = ScoreEvent | FeedbackEvent;\ntype EmitRecordedEvent = (event: RecordedAnnotationEvent) => void | Promise<void>;\ntype CanEmitRecordedEvent = () => boolean;\ntype DebugRecordedAnnotationUnavailable = (args: {\n kind: 'score' | 'feedback';\n traceId: string;\n spanId?: string;\n}) => void;\ntype RecordedErrorInfo = AnyRecordedSpan['errorInfo'];\ntype CorrelationParent = Pick<SpanRecord, 'entityType' | 'entityId' | 'entityName'> | AnyRecordedSpan | undefined;\n\nfunction nullToUndefined<T>(value: T | null | undefined): T | undefined {\n return value ?? undefined;\n}\n\nfunction mergeMetadata(\n base: Record<string, any> | null | undefined,\n extra: Record<string, unknown> | undefined,\n): Record<string, unknown> | undefined {\n if (!base && !extra) return undefined;\n return {\n ...(base ?? {}),\n ...(extra ?? {}),\n };\n}\n\nfunction normalizeErrorInfo(error: SpanRecord['error']): RecordedErrorInfo {\n if (!error || typeof error !== 'object' || !('message' in error) || typeof error.message !== 'string') {\n return undefined;\n }\n\n return {\n message: error.message,\n id: 'id' in error && typeof error.id === 'string' ? error.id : undefined,\n name: 'name' in error && typeof error.name === 'string' ? error.name : undefined,\n stack: 'stack' in error && typeof error.stack === 'string' ? error.stack : undefined,\n domain: 'domain' in error && typeof error.domain === 'string' ? error.domain : undefined,\n category: 'category' in error && typeof error.category === 'string' ? error.category : undefined,\n details:\n 'details' in error && error.details && typeof error.details === 'object'\n ? (error.details as Record<string, any>)\n : undefined,\n };\n}\n\nfunction buildCorrelationContext(\n span: SpanRecord,\n rootSpan: SpanRecord,\n parent?: CorrelationParent,\n): CorrelationContext {\n return {\n tags: rootSpan.tags ?? undefined,\n entityType: nullToUndefined(span.entityType),\n entityId: nullToUndefined(span.entityId),\n entityName: nullToUndefined(span.entityName),\n parentEntityType: parent?.entityType ?? undefined,\n parentEntityId: parent?.entityId ?? undefined,\n parentEntityName: parent?.entityName ?? undefined,\n rootEntityType: nullToUndefined(rootSpan.entityType),\n rootEntityId: nullToUndefined(rootSpan.entityId),\n rootEntityName: nullToUndefined(rootSpan.entityName),\n userId: nullToUndefined(span.userId),\n organizationId: nullToUndefined(span.organizationId),\n resourceId: nullToUndefined(span.resourceId),\n runId: nullToUndefined(span.runId),\n sessionId: nullToUndefined(span.sessionId),\n threadId: nullToUndefined(span.threadId),\n requestId: nullToUndefined(span.requestId),\n environment: nullToUndefined(span.environment),\n source: nullToUndefined(span.source),\n serviceName: nullToUndefined(span.serviceName),\n experimentId: nullToUndefined(span.experimentId),\n };\n}\n\nexport function buildScoreEvent(args: {\n traceId?: string;\n spanId?: string;\n correlationContext?: CorrelationContext;\n score: ScoreInput;\n inheritedMetadata?: Record<string, any> | null;\n}): ScoreEvent {\n const { traceId, spanId, correlationContext, score, inheritedMetadata } = args;\n\n return {\n type: 'score',\n score: {\n scoreId: generateSignalId(),\n timestamp: new Date(),\n traceId,\n spanId,\n scorerId: score.scorerId,\n scorerName: score.scorerName,\n scorerVersion: score.scorerVersion,\n source: score.source,\n scoreSource: score.scoreSource,\n score: score.score,\n reason: score.reason,\n experimentId: score.experimentId,\n scoreTraceId: score.scoreTraceId,\n targetEntityType: score.targetEntityType,\n correlationContext,\n metadata: mergeMetadata(inheritedMetadata, score.metadata),\n },\n };\n}\n\nexport function buildFeedbackEvent(args: {\n traceId?: string;\n spanId?: string;\n correlationContext?: CorrelationContext;\n feedback: FeedbackInput;\n inheritedMetadata?: Record<string, any> | null;\n}): FeedbackEvent {\n const { traceId, spanId, correlationContext, feedback, inheritedMetadata } = args;\n\n return {\n type: 'feedback',\n feedback: {\n feedbackId: generateSignalId(),\n timestamp: new Date(),\n traceId,\n spanId,\n source: feedback.source,\n feedbackSource: feedback.feedbackSource,\n feedbackType: feedback.feedbackType,\n value: feedback.value,\n userId: feedback.userId,\n feedbackUserId: feedback.feedbackUserId,\n comment: feedback.comment,\n sourceId: feedback.sourceId,\n experimentId: feedback.experimentId,\n correlationContext,\n metadata: mergeMetadata(inheritedMetadata, feedback.metadata),\n },\n };\n}\n\nfunction findSpanById(spans: SpanRecord[], spanId: string | undefined): SpanRecord | undefined {\n if (!spanId) return undefined;\n return spans.find(span => span.spanId === spanId);\n}\n\nexport function buildRecordedScoreEventFromTrace(args: {\n trace: GetTraceResponse;\n score: ScoreInput;\n spanId?: string;\n}): ScoreEvent | null {\n const rootSpan = findRootSpan(args.trace.spans);\n if (!rootSpan) return null;\n\n const span = args.spanId ? findSpanById(args.trace.spans, args.spanId) : rootSpan;\n if (!span) return null;\n\n const parent = span.parentSpanId ? findSpanById(args.trace.spans, span.parentSpanId) : undefined;\n\n return buildScoreEvent({\n traceId: span.traceId,\n spanId: args.spanId,\n correlationContext: buildCorrelationContext(span, rootSpan, parent),\n score: args.score,\n inheritedMetadata: span.metadata,\n });\n}\n\nexport function buildRecordedFeedbackEventFromTrace(args: {\n trace: GetTraceResponse;\n feedback: FeedbackInput;\n spanId?: string;\n}): FeedbackEvent | null {\n const rootSpan = findRootSpan(args.trace.spans);\n if (!rootSpan) return null;\n\n const span = args.spanId ? findSpanById(args.trace.spans, args.spanId) : rootSpan;\n if (!span) return null;\n\n const parent = span.parentSpanId ? findSpanById(args.trace.spans, span.parentSpanId) : undefined;\n\n return buildFeedbackEvent({\n traceId: span.traceId,\n spanId: args.spanId,\n correlationContext: buildCorrelationContext(span, rootSpan, parent),\n feedback: args.feedback,\n inheritedMetadata: span.metadata,\n });\n}\n\nclass RecordedSpanImpl<TType extends SpanType = SpanType> implements RecordedSpan<TType> {\n public readonly id: string;\n public readonly traceId: string;\n public readonly name: string;\n public readonly type: TType;\n public readonly entityType?: RecordedSpan<TType>['entityType'];\n public readonly entityId?: string;\n public readonly entityName?: string;\n public readonly startTime: Date;\n public readonly endTime?: Date;\n public readonly attributes?: SpanTypeMap[TType];\n public readonly metadata?: Record<string, any>;\n public readonly tags?: string[];\n public readonly input?: any;\n public readonly output?: any;\n public readonly errorInfo?: {\n message: string;\n id?: string;\n name?: string;\n stack?: string;\n domain?: string;\n category?: string;\n details?: Record<string, any>;\n };\n public readonly requestContext?: Record<string, any>;\n public readonly isEvent: boolean;\n public readonly isRootSpan: boolean;\n public readonly parentSpanId?: string;\n public parent?: RecordedSpanImpl;\n public readonly children: RecordedSpanImpl[] = [];\n\n readonly #raw: SpanRecord;\n readonly #rootSpan: SpanRecord;\n readonly #emitRecordedEvent: EmitRecordedEvent;\n readonly #canEmitRecordedEvent: CanEmitRecordedEvent;\n readonly #debugRecordedAnnotationUnavailable: DebugRecordedAnnotationUnavailable;\n\n constructor(args: {\n raw: SpanRecord;\n rootSpan: SpanRecord;\n emitRecordedEvent: EmitRecordedEvent;\n canEmitRecordedEvent: CanEmitRecordedEvent;\n debugRecordedAnnotationUnavailable: DebugRecordedAnnotationUnavailable;\n }) {\n const { raw, rootSpan, emitRecordedEvent, canEmitRecordedEvent, debugRecordedAnnotationUnavailable } = args;\n\n this.#raw = raw;\n this.#rootSpan = rootSpan;\n this.#emitRecordedEvent = emitRecordedEvent;\n this.#canEmitRecordedEvent = canEmitRecordedEvent;\n this.#debugRecordedAnnotationUnavailable = debugRecordedAnnotationUnavailable;\n\n this.id = raw.spanId;\n this.traceId = raw.traceId;\n this.name = raw.name;\n this.type = raw.spanType as TType;\n this.entityType = raw.entityType ?? undefined;\n this.entityId = raw.entityId ?? undefined;\n this.entityName = raw.entityName ?? undefined;\n this.startTime = raw.startedAt;\n this.endTime = raw.endedAt ?? undefined;\n this.attributes = (raw.attributes ?? undefined) as SpanTypeMap[TType] | undefined;\n this.metadata = raw.metadata ?? undefined;\n this.tags = raw.tags ?? undefined;\n this.input = raw.input ?? undefined;\n this.output = raw.output ?? undefined;\n this.errorInfo = normalizeErrorInfo(raw.error);\n this.requestContext = raw.requestContext ?? undefined;\n this.isEvent = raw.isEvent;\n this.isRootSpan = !raw.parentSpanId;\n this.parentSpanId = raw.parentSpanId ?? undefined;\n }\n\n async addScore(score: ScoreInput): Promise<void> {\n if (!this.#canEmitRecordedEvent()) {\n this.#debugRecordedAnnotationUnavailable({ kind: 'score', traceId: this.traceId, spanId: this.id });\n return;\n }\n\n await this.#emitRecordedEvent(\n buildScoreEvent({\n traceId: this.#raw.traceId,\n spanId: this.id,\n correlationContext: buildCorrelationContext(this.#raw, this.#rootSpan, this.parent),\n score,\n inheritedMetadata: this.#raw.metadata,\n }),\n );\n }\n\n async addFeedback(feedback: FeedbackInput): Promise<void> {\n if (!this.#canEmitRecordedEvent()) {\n this.#debugRecordedAnnotationUnavailable({ kind: 'feedback', traceId: this.traceId, spanId: this.id });\n return;\n }\n\n await this.#emitRecordedEvent(\n buildFeedbackEvent({\n traceId: this.#raw.traceId,\n spanId: this.id,\n correlationContext: buildCorrelationContext(this.#raw, this.#rootSpan, this.parent),\n feedback,\n inheritedMetadata: this.#raw.metadata,\n }),\n );\n }\n}\n\nclass RecordedTraceImpl implements RecordedTrace {\n public readonly traceId: string;\n public readonly rootSpan: AnyRecordedSpan;\n public readonly spans: ReadonlyArray<AnyRecordedSpan>;\n\n readonly #rootRecord: SpanRecord;\n readonly #emitRecordedEvent: EmitRecordedEvent;\n readonly #spanMap: Map<string, AnyRecordedSpan>;\n readonly #canEmitRecordedEvent: CanEmitRecordedEvent;\n readonly #debugRecordedAnnotationUnavailable: DebugRecordedAnnotationUnavailable;\n\n constructor(args: {\n traceId: string;\n rootSpan: AnyRecordedSpan;\n rootRecord: SpanRecord;\n spans: AnyRecordedSpan[];\n emitRecordedEvent: EmitRecordedEvent;\n canEmitRecordedEvent: CanEmitRecordedEvent;\n debugRecordedAnnotationUnavailable: DebugRecordedAnnotationUnavailable;\n }) {\n this.traceId = args.traceId;\n this.rootSpan = args.rootSpan;\n this.#rootRecord = args.rootRecord;\n this.spans = args.spans;\n this.#emitRecordedEvent = args.emitRecordedEvent;\n this.#spanMap = new Map(args.spans.map(span => [span.id, span]));\n this.#canEmitRecordedEvent = args.canEmitRecordedEvent;\n this.#debugRecordedAnnotationUnavailable = args.debugRecordedAnnotationUnavailable;\n }\n\n getSpan(spanId: string): AnyRecordedSpan | null {\n return this.#spanMap.get(spanId) ?? null;\n }\n\n async addScore(score: ScoreInput): Promise<void> {\n if (!this.#canEmitRecordedEvent()) {\n this.#debugRecordedAnnotationUnavailable({ kind: 'score', traceId: this.traceId });\n return;\n }\n\n await this.#emitRecordedEvent(\n buildScoreEvent({\n traceId: this.#rootRecord.traceId,\n correlationContext: buildCorrelationContext(this.#rootRecord, this.#rootRecord),\n score,\n inheritedMetadata: this.#rootRecord.metadata,\n }),\n );\n }\n\n async addFeedback(feedback: FeedbackInput): Promise<void> {\n if (!this.#canEmitRecordedEvent()) {\n this.#debugRecordedAnnotationUnavailable({ kind: 'feedback', traceId: this.traceId });\n return;\n }\n\n await this.#emitRecordedEvent(\n buildFeedbackEvent({\n traceId: this.#rootRecord.traceId,\n correlationContext: buildCorrelationContext(this.#rootRecord, this.#rootRecord),\n feedback,\n inheritedMetadata: this.#rootRecord.metadata,\n }),\n );\n }\n}\n\nfunction findRootSpan(spans: SpanRecord[]): SpanRecord | undefined {\n const spanIds = new Set(spans.map(span => span.spanId));\n return spans.find(span => !span.parentSpanId || !spanIds.has(span.parentSpanId)) ?? spans[0];\n}\n\nexport function hydrateRecordedTrace(args: {\n trace: GetTraceResponse;\n emitRecordedEvent: EmitRecordedEvent;\n canEmitRecordedEvent?: CanEmitRecordedEvent;\n debugRecordedAnnotationUnavailable?: DebugRecordedAnnotationUnavailable;\n}): RecordedTrace | null {\n const {\n trace,\n emitRecordedEvent,\n canEmitRecordedEvent = () => true,\n debugRecordedAnnotationUnavailable = () => {},\n } = args;\n const rootSpan = findRootSpan(trace.spans);\n\n if (!rootSpan) {\n return null;\n }\n\n const recordedSpans = trace.spans.map(\n raw =>\n new RecordedSpanImpl({\n raw,\n rootSpan,\n emitRecordedEvent,\n canEmitRecordedEvent,\n debugRecordedAnnotationUnavailable,\n }),\n );\n const spanMap = new Map(recordedSpans.map(span => [span.id, span]));\n\n for (const span of recordedSpans) {\n if (!span.parentSpanId) continue;\n const parent = spanMap.get(span.parentSpanId);\n if (!parent) continue;\n\n span.parent = parent;\n parent.children.push(span);\n }\n\n const hydratedRootSpan = spanMap.get(rootSpan.spanId);\n if (!hydratedRootSpan) {\n return null;\n }\n\n return new RecordedTraceImpl({\n traceId: trace.traceId,\n rootSpan: hydratedRootSpan,\n rootRecord: rootSpan,\n spans: recordedSpans,\n emitRecordedEvent,\n canEmitRecordedEvent,\n debugRecordedAnnotationUnavailable,\n });\n}\n","/**\n * Observability Registry for Mastra\n *\n * Provides registry for Observability instances.\n */\n\nimport type { ObservabilityInstance, ConfigSelectorOptions, ConfigSelector } from '@mastra/core/observability';\n\n// ============================================================================\n// Observability Registry\n// ============================================================================\n\n/**\n * Registry for Observability instances.\n */\nexport class ObservabilityRegistry {\n #instances = new Map<string, ObservabilityInstance>();\n #defaultInstance?: ObservabilityInstance;\n #configSelector?: ConfigSelector;\n\n /**\n * Register a tracing instance\n */\n register(name: string, instance: ObservabilityInstance, isDefault = false): void {\n if (this.#instances.has(name)) {\n throw new Error(`Tracing instance '${name}' already registered`);\n }\n\n this.#instances.set(name, instance);\n\n // Set as default if explicitly marked or if it's the first instance\n if (isDefault || !this.#defaultInstance) {\n this.#defaultInstance = instance;\n }\n }\n\n /**\n * Get a tracing instance by name\n */\n get(name: string): ObservabilityInstance | undefined {\n return this.#instances.get(name);\n }\n\n /**\n * Get the default tracing instance\n */\n getDefault(): ObservabilityInstance | undefined {\n return this.#defaultInstance;\n }\n\n /**\n * Set the tracing selector function\n */\n setSelector(selector: ConfigSelector): void {\n this.#configSelector = selector;\n }\n\n /**\n * Get the selected tracing instance based on context\n */\n getSelected(options: ConfigSelectorOptions): ObservabilityInstance | undefined {\n // 1. Try selector function if provided\n if (this.#configSelector) {\n const selected = this.#configSelector(options, this.#instances);\n if (selected && this.#instances.has(selected)) {\n return this.#instances.get(selected);\n }\n }\n\n // 2. Fall back to default\n return this.#defaultInstance;\n }\n\n /**\n * Unregister a tracing instance\n */\n unregister(name: string): boolean {\n const instance = this.#instances.get(name);\n const deleted = this.#instances.delete(name);\n\n if (deleted && instance === this.#defaultInstance) {\n const next = this.#instances.values().next();\n this.#defaultInstance = next.done ? undefined : next.value;\n }\n\n return deleted;\n }\n\n /**\n * Shutdown all instances and clear the registry\n */\n async shutdown(): Promise<void> {\n const shutdownPromises = Array.from(this.#instances.values()).map(instance => instance.shutdown());\n\n await Promise.allSettled(shutdownPromises);\n this.#instances.clear();\n this.#instances.clear();\n this.#defaultInstance = undefined;\n this.#configSelector = undefined;\n }\n\n /**\n * Clear all instances without shutdown\n */\n clear(): void {\n this.#instances.clear();\n this.#defaultInstance = undefined;\n this.#configSelector = undefined;\n }\n\n /**\n * list all registered instances\n */\n list(): ReadonlyMap<string, ObservabilityInstance> {\n return new Map(this.#instances);\n }\n}\n","import type { SpanOutputProcessor, AnySpan } from '@mastra/core/observability';\n\nexport type RedactionStyle = 'full' | 'partial';\n\n/**\n * Options for configuring the SensitiveDataFilter.\n */\nexport interface SensitiveDataFilterOptions {\n /**\n * List of sensitive field names to redact.\n * Matching is case-insensitive and normalizes separators (`api-key`, `api_key`, `Api Key` → `apikey`).\n *\n * Defaults include: password, token, secret, key, apikey, auth, authorization,\n * bearer, bearertoken, jwt, credential, clientsecret, privatekey, refresh, ssn.\n */\n sensitiveFields?: string[];\n\n /**\n * The token used for full redaction.\n * Default: \"[REDACTED]\"\n */\n redactionToken?: string;\n\n /**\n * Style of redaction to use:\n * - \"full\": always replace with redactionToken.\n * - \"partial\": show 3 characters from the start and end, redact the middle.\n *\n * Default: \"full\"\n */\n redactionStyle?: RedactionStyle;\n}\n\n/**\n * SensitiveDataFilter\n *\n * An SpanOutputProcessor that redacts sensitive information from span fields.\n *\n * - Sensitive keys are matched case-insensitively, normalized to remove separators.\n * - Sensitive values are redacted using either full or partial redaction.\n * - Partial redaction always keeps 3 chars at the start and end.\n * - JSON strings containing sensitive fields are parsed and redacted.\n * - If filtering a field fails, the field is replaced with:\n * `{ error: { processor: \"sensitive-data-filter\" } }`\n */\nexport class SensitiveDataFilter implements SpanOutputProcessor {\n name = 'sensitive-data-filter';\n private sensitiveFields: string[];\n private redactionToken: string;\n private redactionStyle: RedactionStyle;\n\n constructor(options: SensitiveDataFilterOptions = {}) {\n this.sensitiveFields = (\n options.sensitiveFields || [\n 'password',\n 'token',\n 'secret',\n 'key',\n 'apikey',\n 'auth',\n 'authorization',\n 'bearer',\n 'bearertoken',\n 'jwt',\n 'credential',\n 'clientsecret',\n 'privatekey',\n 'refresh',\n 'ssn',\n ]\n ).map(f => this.normalizeKey(f));\n\n this.redactionToken = options.redactionToken ?? '[REDACTED]';\n this.redactionStyle = options.redactionStyle ?? 'full';\n }\n\n /**\n * Process a span by filtering sensitive data across its key fields.\n * Fields processed: attributes, metadata, input, output, errorInfo.\n *\n * @param span - The input span to filter\n * @returns A new span with sensitive values redacted\n */\n process(span: AnySpan): AnySpan {\n span.attributes = this.tryFilter(span.attributes);\n span.metadata = this.tryFilter(span.metadata);\n span.input = this.tryFilter(span.input);\n span.output = this.tryFilter(span.output);\n span.errorInfo = this.tryFilter(span.errorInfo);\n return span;\n }\n\n /**\n * Recursively filter objects/arrays for sensitive keys.\n * Handles circular references by replacing with a marker.\n * Also attempts to parse and redact JSON strings.\n */\n private deepFilter(obj: any, seen = new WeakSet()): any {\n if (obj === null || typeof obj !== 'object') {\n // Handle string values - check if they contain JSON that needs redacting\n if (typeof obj === 'string') {\n // Quick check - JSON objects/arrays start with { or [\n const trimmed = obj.trim();\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n return this.redactJsonString(obj);\n }\n }\n return obj;\n }\n\n if (seen.has(obj)) {\n return '[Circular Reference]';\n }\n seen.add(obj);\n\n // Preserve Date objects - they have no enumerable keys\n // and Object.keys() returns [], which would incorrectly convert them to {}\n if (obj instanceof Date) {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => this.deepFilter(item, seen));\n }\n\n const filtered: any = {};\n for (const key of Object.keys(obj)) {\n const normKey = this.normalizeKey(key);\n\n if (this.isSensitive(normKey)) {\n if (obj[key] && typeof obj[key] === 'object') {\n filtered[key] = this.deepFilter(obj[key], seen);\n } else {\n filtered[key] = this.redactValue(obj[key]);\n }\n } else {\n filtered[key] = this.deepFilter(obj[key], seen);\n }\n }\n\n return filtered;\n }\n\n private tryFilter(value: any): any {\n try {\n return this.deepFilter(value);\n } catch {\n return { error: { processor: this.name } };\n }\n }\n\n /**\n * Normalize keys by lowercasing and stripping non-alphanumeric characters.\n * Ensures consistent matching for variants like \"api-key\", \"api_key\", \"Api Key\".\n */\n private normalizeKey(key: string): string {\n return key.toLowerCase().replace(/[^a-z0-9]/g, '');\n }\n\n /**\n * Check whether a normalized key exactly matches any sensitive field.\n * Both key and sensitive fields are normalized by removing all non-alphanumeric\n * characters and converting to lowercase before comparison.\n *\n * Examples:\n * - \"api_key\", \"api-key\", \"ApiKey\" all normalize to \"apikey\" → MATCHES \"apikey\"\n * - \"promptTokens\", \"prompt_tokens\" normalize to \"prompttokens\" → DOES NOT MATCH \"token\"\n */\n private isSensitive(normalizedKey: string): boolean {\n return this.sensitiveFields.some(sensitiveField => {\n // Simple case-insensitive match after normalization\n return normalizedKey === sensitiveField;\n });\n }\n\n /**\n * Attempt to parse a string as JSON and redact sensitive fields within it.\n * If parsing fails or no sensitive data is found, returns the original string.\n */\n private redactJsonString(str: string): string {\n try {\n // Try to parse as JSON\n const parsed = JSON.parse(str);\n\n // If it's an object, filter it and serialize back\n if (parsed && typeof parsed === 'object') {\n const filtered = this.deepFilter(parsed, new WeakSet());\n return JSON.stringify(filtered);\n }\n\n // If not an object, return original\n return str;\n } catch {\n // Not valid JSON, return original string\n return str;\n }\n }\n\n /**\n * Redact a sensitive value.\n * - Full style: replaces with a fixed token.\n * - Partial style: shows 3 chars at start and end, hides the middle.\n *\n * Non-string values are converted to strings before partial redaction.\n */\n private redactValue(value: any): string {\n if (this.redactionStyle === 'full') {\n return this.redactionToken;\n }\n\n const str = String(value);\n const len = str.length;\n if (len <= 6) {\n return this.redactionToken; // too short, redact fully\n }\n return str.slice(0, 3) + '…' + str.slice(len - 3);\n }\n\n async shutdown(): Promise<void> {\n // No cleanup needed\n }\n}\n","import type { Mastra } from '@mastra/core';\nimport { MastraBase } from '@mastra/core/base';\nimport { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport { RegisteredLogger } from '@mastra/core/logger';\nimport type { IMastraLogger } from '@mastra/core/logger';\nimport type {\n ClientObservabilityProxy,\n CorrelationContext,\n ConfigSelector,\n ConfigSelectorOptions,\n FeedbackInput,\n FeedbackEvent,\n ObservabilityEntrypoint,\n ObservabilityDropEvent,\n ObservabilityInstance,\n RecordedTrace,\n ScoreInput,\n ScoreEvent,\n} from '@mastra/core/observability';\nimport type { ObservabilityStorage } from '@mastra/core/storage';\nimport { routeToHandler } from './bus/route-event';\nimport { createClientObservabilityProxy } from './client';\nimport { SamplingStrategyType, observabilityRegistryConfigSchema, observabilityConfigValueSchema } from './config';\nimport type { ObservabilityInstanceConfig, ObservabilityRegistryConfig } from './config';\nimport { MastraPlatformExporter, MastraStorageExporter } from './exporters';\nimport { BaseObservabilityInstance, DefaultObservabilityInstance } from './instances';\nimport {\n buildFeedbackEvent,\n buildScoreEvent,\n buildRecordedFeedbackEventFromTrace,\n buildRecordedScoreEventFromTrace,\n hydrateRecordedTrace,\n} from './recorded';\nimport { ObservabilityRegistry } from './registry';\nimport { SensitiveDataFilter } from './span_processors';\nimport type { SensitiveDataFilterOptions } from './span_processors';\n\n/**\n * Type guard to check if an object is a BaseObservability instance\n */\nfunction isInstance(\n obj: Omit<ObservabilityInstanceConfig, 'name'> | ObservabilityInstance,\n): obj is ObservabilityInstance {\n return obj instanceof BaseObservabilityInstance;\n}\n\n/**\n * Top-level observability entrypoint. Manages a registry of ObservabilityInstance\n * configurations and provides instance selection via config selectors.\n */\nexport class Observability extends MastraBase implements ObservabilityEntrypoint {\n #registry = new ObservabilityRegistry();\n #mastra?: Mastra;\n #clientObservabilityProxy?: ClientObservabilityProxy;\n\n constructor(config: ObservabilityRegistryConfig) {\n super({\n component: RegisteredLogger.OBSERVABILITY,\n name: 'Observability',\n });\n\n if (config === undefined) {\n config = {};\n }\n\n // Validate config with Zod\n const validationResult = observabilityRegistryConfigSchema.safeParse(config);\n if (!validationResult.success) {\n const errorMessages = validationResult.error.issues\n .map(\n (err: { path: (string | number | symbol)[]; message: string }) =>\n `${err.path.join('.') || 'config'}: ${err.message}`,\n )\n .join('; ');\n throw new MastraError({\n id: 'OBSERVABILITY_INVALID_CONFIG',\n text: `Invalid observability configuration: ${errorMessages}`,\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.USER,\n details: {\n validationErrors: errorMessages,\n },\n });\n }\n\n // Validate individual configs if they are plain objects (not instances)\n if (config.configs) {\n for (const [name, configValue] of Object.entries(config.configs)) {\n if (!isInstance(configValue)) {\n const configValidation = observabilityConfigValueSchema.safeParse(configValue);\n if (!configValidation.success) {\n const errorMessages = configValidation.error.issues\n .map(\n (err: { path: (string | number | symbol)[]; message: string }) =>\n `${err.path.join('.')}: ${err.message}`,\n )\n .join('; ');\n throw new MastraError({\n id: 'OBSERVABILITY_INVALID_INSTANCE_CONFIG',\n text: `Invalid configuration for observability instance '${name}': ${errorMessages}`,\n domain: ErrorDomain.MASTRA_OBSERVABILITY,\n category: ErrorCategory.USER,\n details: {\n instanceName: name,\n validationErrors: errorMessages,\n },\n });\n }\n }\n }\n }\n\n // Resolve sensitive data filter setting (defaults to enabled).\n const sensitiveDataFilterSetting = config.sensitiveDataFilter ?? true;\n const shouldAutoApplySensitiveFilter = sensitiveDataFilterSetting !== false;\n const sensitiveDataFilterOptions: SensitiveDataFilterOptions | undefined =\n typeof sensitiveDataFilterSetting === 'object' && sensitiveDataFilterSetting !== null\n ? sensitiveDataFilterSetting\n : undefined;\n\n const buildAutoSensitiveFilter = (): SensitiveDataFilter | undefined => {\n if (!shouldAutoApplySensitiveFilter) {\n return undefined;\n }\n return new SensitiveDataFilter(sensitiveDataFilterOptions);\n };\n\n // Setup default config if enabled (deprecated)\n if (config.default?.enabled) {\n console.warn(\n '[Mastra Observability] The \"default: { enabled: true }\" configuration is deprecated and will be removed in a future version. ' +\n 'Please use explicit configs with MastraStorageExporter and MastraPlatformExporter instead. ' +\n 'Sensitive data filtering is applied by default and can be controlled via the top-level \"sensitiveDataFilter\" option. ' +\n 'See https://mastra.ai/docs/observability/tracing/overview for the recommended configuration.',\n );\n\n const autoFilter = buildAutoSensitiveFilter();\n const defaultInstance = new DefaultObservabilityInstance({\n serviceName: 'mastra',\n name: 'default',\n sampling: { type: SamplingStrategyType.ALWAYS },\n exporters: [new MastraStorageExporter(), new MastraPlatformExporter()],\n spanOutputProcessors: autoFilter ? [autoFilter] : [],\n });\n\n // Register as default with high priority\n this.#registry.register('default', defaultInstance, true);\n }\n\n if (config.configs) {\n // Process user-provided configs\n const instances = Object.entries(config.configs);\n\n instances.forEach(([name, tracingDef], index) => {\n let instance: ObservabilityInstance;\n if (isInstance(tracingDef)) {\n // Pre-instantiated custom implementation. We don't mutate it since\n // the caller already owns it; warn if no SensitiveDataFilter is\n // present and auto-apply is enabled.\n instance = tracingDef;\n if (shouldAutoApplySensitiveFilter) {\n const processors = instance.getSpanOutputProcessors?.() ?? [];\n const hasFilter = processors.some(p => p instanceof SensitiveDataFilter);\n if (!hasFilter) {\n this.logger?.warn(\n '[Mastra Observability] Pre-instantiated observability instance does not include a SensitiveDataFilter. ' +\n 'Auto-applied filtering is skipped for pre-instantiated instances. ' +\n 'Add a SensitiveDataFilter to spanOutputProcessors when constructing the instance to redact sensitive data.',\n { instanceName: name },\n );\n }\n }\n } else {\n const userProcessors = tracingDef.spanOutputProcessors ?? [];\n const hasFilter = userProcessors.some(p => p instanceof SensitiveDataFilter);\n const autoFilter = !hasFilter ? buildAutoSensitiveFilter() : undefined;\n // Auto-applied filter runs LAST so any sensitive data introduced by\n // user processors (e.g. enrichment that copies headers/config into\n // attributes) is still redacted before export.\n const spanOutputProcessors = autoFilter ? [...userProcessors, autoFilter] : userProcessors;\n instance = new DefaultObservabilityInstance({\n ...tracingDef,\n name,\n spanOutputProcessors,\n });\n }\n\n // First user-provided instance becomes default only if no default config\n const isDefault = !config.default?.enabled && index === 0;\n this.#registry.register(name, instance, isDefault);\n });\n }\n\n // Set selector function if provided\n if (config.configSelector) {\n this.#registry.setSelector(config.configSelector);\n }\n }\n\n /** Initialize all exporter instances with the Mastra context (storage, config, etc.). */\n setMastraContext(options: { mastra: Mastra }): void {\n const instances = this.listInstances();\n const { mastra } = options;\n this.#mastra = mastra;\n\n const mastraEnvironment = mastra.getEnvironment?.();\n\n instances.forEach(instance => {\n // Propagate the Mastra-level environment so spans can fall back to it\n // when `metadata.environment` isn't set on a specific span.\n instance.__setMastraEnvironment?.(mastraEnvironment);\n\n const config = instance.getConfig();\n const exporters = instance.getExporters();\n const emitDropEvent =\n instance instanceof BaseObservabilityInstance\n ? (event: ObservabilityDropEvent) => instance.getObservabilityBus().emitDropEvent(event)\n : undefined;\n exporters.forEach(exporter => {\n // Initialize exporter if it has an init method\n if ('init' in exporter && typeof exporter.init === 'function') {\n try {\n exporter.init({ mastra, config, emitDropEvent });\n } catch (error) {\n this.logger?.warn('Failed to initialize observability exporter', {\n exporterName: exporter.name,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n });\n });\n }\n\n /** Propagate a logger to this instance and all registered observability instances. */\n setLogger(options: { logger: IMastraLogger }): void {\n super.__setLogger(options.logger);\n this.listInstances().forEach(instance => {\n instance.__setLogger(options.logger);\n });\n }\n\n /** Get the observability instance chosen by the config selector for the given options. */\n getSelectedInstance(options: ConfigSelectorOptions): ObservabilityInstance | undefined {\n return this.#registry.getSelected(options);\n }\n\n async getRecordedTrace(args: { traceId: string }): Promise<RecordedTrace | null> {\n const observabilityStorage = await this.#getObservabilityStorage();\n if (!observabilityStorage) {\n return null;\n }\n\n const trace = await observabilityStorage.getTrace({ traceId: args.traceId });\n if (!trace) {\n return null;\n }\n\n return hydrateRecordedTrace({\n trace,\n emitRecordedEvent: event => this.#emitRecordedEvent(event),\n canEmitRecordedEvent: () => !!this.#getRecordedTraceInstance(),\n debugRecordedAnnotationUnavailable: ({ kind, traceId, spanId }) => {\n this.logger?.debug(\n kind === 'score'\n ? 'addScore() is unavailable; rehydrate the trace before calling addScore()'\n : 'addFeedback() is unavailable; rehydrate the trace before calling addFeedback()',\n {\n traceId,\n spanId,\n },\n );\n },\n });\n }\n\n async addScore(args: {\n traceId?: string;\n spanId?: string;\n correlationContext?: CorrelationContext;\n score: ScoreInput;\n }): Promise<void> {\n const targetTraceId = args.traceId ?? args.correlationContext?.traceId;\n const targetSpanId = args.spanId ?? args.correlationContext?.spanId;\n\n if (args.correlationContext) {\n await this.#emitRecordedEvent(\n buildScoreEvent({\n ...(targetTraceId ? { traceId: targetTraceId } : {}),\n ...(targetSpanId ? { spanId: targetSpanId } : {}),\n correlationContext: args.correlationContext,\n score: args.score,\n }),\n );\n return;\n }\n\n if (!args.traceId) {\n return;\n }\n\n const trace = await this.#getStoredTrace(args.traceId);\n if (!trace) {\n return;\n }\n\n const event = buildRecordedScoreEventFromTrace({\n trace,\n spanId: args.spanId,\n score: args.score,\n });\n\n if (!event) {\n return;\n }\n\n await this.#emitRecordedEvent(event);\n }\n\n async addFeedback(args: {\n traceId?: string;\n spanId?: string;\n correlationContext?: CorrelationContext;\n feedback: FeedbackInput;\n }): Promise<void> {\n const targetTraceId = args.traceId ?? args.correlationContext?.traceId;\n const targetSpanId = args.spanId ?? args.correlationContext?.spanId;\n\n if (args.correlationContext) {\n await this.#emitRecordedEvent(\n buildFeedbackEvent({\n ...(targetTraceId ? { traceId: targetTraceId } : {}),\n ...(targetSpanId ? { spanId: targetSpanId } : {}),\n correlationContext: args.correlationContext,\n feedback: args.feedback,\n }),\n );\n return;\n }\n\n if (!args.traceId) {\n return;\n }\n\n const trace = await this.#getStoredTrace(args.traceId);\n if (!trace) {\n return;\n }\n\n const event = buildRecordedFeedbackEventFromTrace({\n trace,\n spanId: args.spanId,\n feedback: args.feedback,\n });\n\n if (!event) {\n return;\n }\n\n await this.#emitRecordedEvent(event);\n }\n\n /** Register a named observability instance, optionally marking it as default. */\n registerInstance(name: string, instance: ObservabilityInstance, isDefault = false): void {\n this.#registry.register(name, instance, isDefault);\n\n // If Mastra context has already been set, propagate the environment to\n // this late-registered instance so it auto-tags spans like instances\n // registered before setMastraContext.\n if (this.#mastra) {\n instance.__setMastraEnvironment?.(this.#mastra.getEnvironment?.());\n }\n }\n\n /** Get a registered instance by name. */\n getInstance(name: string): ObservabilityInstance | undefined {\n return this.#registry.get(name);\n }\n\n /** Get the default observability instance. */\n getDefaultInstance(): ObservabilityInstance | undefined {\n return this.#registry.getDefault();\n }\n\n /** List all registered observability instances. */\n listInstances(): ReadonlyMap<string, ObservabilityInstance> {\n return this.#registry.list();\n }\n\n /** Unregister an instance by name. Returns true if it was found and removed. */\n unregisterInstance(name: string): boolean {\n return this.#registry.unregister(name);\n }\n\n /** Check whether an instance with the given name is registered. */\n hasInstance(name: string): boolean {\n return !!this.#registry.get(name);\n }\n\n /** Set the config selector used to choose an instance at runtime. */\n setConfigSelector(selector: ConfigSelector): void {\n this.#registry.setSelector(selector);\n }\n\n /** Remove all registered instances and reset the registry. */\n clear(): void {\n this.#registry.clear();\n }\n\n /** Shut down all registered instances, flushing any pending data. */\n async shutdown(): Promise<void> {\n await this.#registry.shutdown();\n }\n\n /**\n * Returns the proxy responsible for client observability (W3C trace\n * context injection + OTLP/JSON payload reception for spans/logs\n * returned from client-side execution).\n *\n * Lazily constructed on first call. Resolves the target observability\n * instance per receive call so config selection works the same way\n * as for server-side spans.\n */\n getClientObservabilityProxy(): ClientObservabilityProxy | undefined {\n if (!this.#clientObservabilityProxy) {\n this.#clientObservabilityProxy = createClientObservabilityProxy({\n resolveInstance: () => this.getDefaultInstance(),\n logger: this.logger,\n });\n }\n return this.#clientObservabilityProxy;\n }\n\n async #getObservabilityStorage(): Promise<ObservabilityStorage | null> {\n const storage = this.#mastra?.getStorage();\n if (!storage) {\n return null;\n }\n\n return (await storage.getStore('observability')) ?? null;\n }\n\n async #getStoredTrace(traceId: string) {\n const observabilityStorage = await this.#getObservabilityStorage();\n if (!observabilityStorage) {\n return null;\n }\n\n return observabilityStorage.getTrace({ traceId });\n }\n\n #getRecordedTraceInstance(): ObservabilityInstance | undefined {\n return this.getDefaultInstance() ?? Array.from(this.listInstances().values())[0];\n }\n\n async #emitRecordedEvent(event: ScoreEvent | FeedbackEvent): Promise<void> {\n const instance = this.#getRecordedTraceInstance();\n if (!instance) {\n this.logger?.debug(\n event.type === 'score'\n ? 'Score event was dropped because no observability instance is registered'\n : 'Feedback event was dropped because no observability instance is registered',\n { eventType: event.type },\n );\n return;\n }\n\n if (instance instanceof BaseObservabilityInstance) {\n instance.__emitRecordedEvent(event);\n return;\n }\n\n const bridge = instance.getBridge();\n const handlerResults = [\n ...instance.getExporters().map(exporter => routeToHandler(exporter, event, this.logger)),\n ...(bridge ? [routeToHandler(bridge, event, this.logger)] : []),\n ].filter((result): result is Promise<void> => !!result && typeof result.then === 'function');\n\n if (handlerResults.length > 0) {\n await Promise.allSettled(handlerResults);\n }\n }\n}\n","/**\n * Feature flags for @mastra/observability\n *\n * Tracks which features are available in the current version of\n * @mastra/observability. Downstream exporter packages (e.g.\n * @mastra/datadog, @mastra/laminar) can check for feature availability\n * before relying on a span shape, attribute, or hierarchy that this\n * package may not yet emit.\n *\n * Pair these checks with `coreFeatures` from `@mastra/core/features` so a\n * consumer only opts in when BOTH packages support the feature.\n *\n * @example Old-version-safe usage\n *\n * A static named import of `observabilityFeatures` will throw a link-time\n * `SyntaxError` in strict Node ESM when paired with an `@mastra/observability`\n * that predates this export. Use a dynamic import so the exporter degrades\n * gracefully against any version of `@mastra/observability`:\n *\n * ```ts\n * import { coreFeatures } from \"@mastra/core/features\"\n *\n * let observabilityFeatures: Set<string> | undefined\n * try {\n * ({ observabilityFeatures } = await import(\"@mastra/observability\"))\n * } catch {\n * // older @mastra/observability that does not export this symbol\n * }\n *\n * if (\n * observabilityFeatures?.has(\"model-inference-span\") &&\n * coreFeatures.has(\"model-inference-span\")\n * ) {\n * // safe\n * }\n * ```\n */\n// Add feature flags here as new features are introduced\nexport const observabilityFeatures: ReadonlySet<string> = new Set(['model-inference-span', 'internal-usage-rollup']);\n","/**\n * Composable Tracing Options Builder\n */\n\nimport type { TracingOptions } from '@mastra/core/observability';\n\n/**\n * A function that updates TracingOptions.\n */\nexport type TracingOptionsUpdater = (options: TracingOptions) => TracingOptions;\n\n/**\n * Builds TracingOptions by composing one or more updater functions.\n *\n * @example\n * ```typescript\n * import { buildTracingOptions } from '@mastra/observability';\n * import { withLangfusePrompt } from '@mastra/langfuse';\n *\n * const prompt = await langfuse.getPrompt('my-prompt');\n *\n * const agent = new Agent({\n * defaultGenerateOptions: {\n * tracingOptions: buildTracingOptions(withLangfusePrompt(prompt)),\n * },\n * });\n * ```\n */\nexport function buildTracingOptions(...updaters: TracingOptionsUpdater[]): TracingOptions {\n return updaters.reduce((opts, updater) => updater(opts), {} as TracingOptions);\n}\n"]}