@sentry/core 10.37.0 → 10.39.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/attributes.js.map +1 -1
- package/build/cjs/client.js +22 -12
- package/build/cjs/client.js.map +1 -1
- package/build/cjs/envelope.js +41 -7
- package/build/cjs/envelope.js.map +1 -1
- package/build/cjs/index.js +131 -79
- package/build/cjs/index.js.map +1 -1
- package/build/cjs/integration.js +12 -0
- package/build/cjs/integration.js.map +1 -1
- package/build/cjs/integrations/captureconsole.js +2 -2
- package/build/cjs/integrations/captureconsole.js.map +1 -1
- package/build/cjs/integrations/eventFilters.js +1 -1
- package/build/cjs/integrations/eventFilters.js.map +1 -1
- package/build/cjs/integrations/mcp-server/correlation.js +54 -10
- package/build/cjs/integrations/mcp-server/correlation.js.map +1 -1
- package/build/cjs/integrations/mcp-server/errorCapture.js +2 -2
- package/build/cjs/integrations/mcp-server/errorCapture.js.map +1 -1
- package/build/cjs/integrations/mcp-server/sessionManagement.js +50 -16
- package/build/cjs/integrations/mcp-server/sessionManagement.js.map +1 -1
- package/build/cjs/integrations/requestdata.js +72 -6
- package/build/cjs/integrations/requestdata.js.map +1 -1
- package/build/cjs/integrations/spanStreaming.js +54 -0
- package/build/cjs/integrations/spanStreaming.js.map +1 -0
- package/build/cjs/integrations/supabase.js +4 -4
- package/build/cjs/integrations/supabase.js.map +1 -1
- package/build/cjs/metrics/public-api.js +3 -3
- package/build/cjs/metrics/public-api.js.map +1 -1
- package/build/cjs/scope.js +1 -1
- package/build/cjs/scope.js.map +1 -1
- package/build/cjs/semanticAttributes.js +84 -0
- package/build/cjs/semanticAttributes.js.map +1 -1
- package/build/cjs/spans/captureSpan.js +104 -0
- package/build/cjs/spans/captureSpan.js.map +1 -0
- package/build/cjs/spans/spanBuffer.js +121 -0
- package/build/cjs/spans/spanBuffer.js.map +1 -0
- package/build/cjs/spans/spanFirstUtils.js +186 -0
- package/build/cjs/spans/spanFirstUtils.js.map +1 -0
- package/build/cjs/tracing/ai/gen-ai-attributes.js +6 -0
- package/build/cjs/tracing/ai/gen-ai-attributes.js.map +1 -1
- package/build/cjs/tracing/anthropic-ai/index.js +3 -3
- package/build/cjs/tracing/anthropic-ai/index.js.map +1 -1
- package/build/cjs/tracing/anthropic-ai/streaming.js +3 -3
- package/build/cjs/tracing/anthropic-ai/streaming.js.map +1 -1
- package/build/cjs/tracing/anthropic-ai/utils.js +2 -2
- package/build/cjs/tracing/anthropic-ai/utils.js.map +1 -1
- package/build/cjs/tracing/google-genai/index.js +3 -3
- package/build/cjs/tracing/google-genai/index.js.map +1 -1
- package/build/cjs/tracing/google-genai/streaming.js +2 -2
- package/build/cjs/tracing/google-genai/streaming.js.map +1 -1
- package/build/cjs/tracing/langchain/index.js +4 -4
- package/build/cjs/tracing/langchain/index.js.map +1 -1
- package/build/cjs/tracing/langgraph/index.js +3 -3
- package/build/cjs/tracing/langgraph/index.js.map +1 -1
- package/build/cjs/tracing/openai/index.js +136 -53
- package/build/cjs/tracing/openai/index.js.map +1 -1
- package/build/cjs/tracing/openai/streaming.js +2 -2
- package/build/cjs/tracing/openai/streaming.js.map +1 -1
- package/build/cjs/tracing/sentrySpan.js +32 -0
- package/build/cjs/tracing/sentrySpan.js.map +1 -1
- package/build/cjs/tracing/trace.js +1 -0
- package/build/cjs/tracing/trace.js.map +1 -1
- package/build/cjs/tracing/vercel-ai/constants.js +4 -0
- package/build/cjs/tracing/vercel-ai/constants.js.map +1 -1
- package/build/cjs/tracing/vercel-ai/index.js +14 -0
- package/build/cjs/tracing/vercel-ai/index.js.map +1 -1
- package/build/cjs/tracing/vercel-ai/utils.js +71 -22
- package/build/cjs/tracing/vercel-ai/utils.js.map +1 -1
- package/build/cjs/transports/base.js +18 -2
- package/build/cjs/transports/base.js.map +1 -1
- package/build/cjs/transports/offline.js +16 -17
- package/build/cjs/transports/offline.js.map +1 -1
- package/build/cjs/trpc.js +3 -3
- package/build/cjs/trpc.js.map +1 -1
- package/build/cjs/utils/aggregate-errors.js +13 -5
- package/build/cjs/utils/aggregate-errors.js.map +1 -1
- package/build/cjs/utils/beforeSendSpan.js +36 -0
- package/build/cjs/utils/beforeSendSpan.js.map +1 -0
- package/build/cjs/utils/envToBool.js +32 -0
- package/build/cjs/utils/envToBool.js.map +1 -0
- package/build/cjs/utils/exports.js +7 -7
- package/build/cjs/utils/exports.js.map +1 -1
- package/build/cjs/utils/featureFlags.js +1 -0
- package/build/cjs/utils/featureFlags.js.map +1 -1
- package/build/cjs/utils/flushIfServerless.js +2 -2
- package/build/cjs/utils/flushIfServerless.js.map +1 -1
- package/build/cjs/utils/hasSpanStreamingEnabled.js +21 -0
- package/build/cjs/utils/hasSpanStreamingEnabled.js.map +1 -0
- package/build/cjs/utils/prepareEvent.js +6 -1
- package/build/cjs/utils/prepareEvent.js.map +1 -1
- package/build/cjs/utils/promisebuffer.js +5 -3
- package/build/cjs/utils/promisebuffer.js.map +1 -1
- package/build/cjs/utils/scopeData.js +4 -0
- package/build/cjs/utils/scopeData.js.map +1 -1
- package/build/cjs/utils/sdkMetadata.js +7 -11
- package/build/cjs/utils/sdkMetadata.js.map +1 -1
- package/build/cjs/utils/should-ignore-span.js +31 -9
- package/build/cjs/utils/should-ignore-span.js.map +1 -1
- package/build/cjs/utils/spanUtils.js +90 -2
- package/build/cjs/utils/spanUtils.js.map +1 -1
- package/build/cjs/utils/timer.js +20 -0
- package/build/cjs/utils/timer.js.map +1 -0
- package/build/cjs/utils/traceData.js +2 -2
- package/build/cjs/utils/traceData.js.map +1 -1
- package/build/cjs/utils/tracePropagationTargets.js +38 -0
- package/build/cjs/utils/tracePropagationTargets.js.map +1 -0
- package/build/cjs/utils/version.js +1 -1
- package/build/cjs/utils/version.js.map +1 -1
- package/build/esm/attributes.js.map +1 -1
- package/build/esm/client.js +18 -8
- package/build/esm/client.js.map +1 -1
- package/build/esm/envelope.js +41 -8
- package/build/esm/envelope.js.map +1 -1
- package/build/esm/exports.js +2 -2
- package/build/esm/feedback.js +1 -1
- package/build/esm/index.js +12 -3
- package/build/esm/index.js.map +1 -1
- package/build/esm/integration.js +12 -1
- package/build/esm/integration.js.map +1 -1
- package/build/esm/integrations/eventFilters.js +1 -1
- package/build/esm/integrations/eventFilters.js.map +1 -1
- package/build/esm/integrations/mcp-server/correlation.js +54 -10
- package/build/esm/integrations/mcp-server/correlation.js.map +1 -1
- package/build/esm/integrations/mcp-server/sessionManagement.js +50 -16
- package/build/esm/integrations/mcp-server/sessionManagement.js.map +1 -1
- package/build/esm/integrations/moduleMetadata.js +1 -1
- package/build/esm/integrations/requestdata.js +72 -6
- package/build/esm/integrations/requestdata.js.map +1 -1
- package/build/esm/integrations/spanStreaming.js +52 -0
- package/build/esm/integrations/spanStreaming.js.map +1 -0
- package/build/esm/integrations/third-party-errors-filter.js +1 -1
- package/build/esm/logs/internal.js +1 -1
- package/build/esm/metrics/public-api.js +3 -3
- package/build/esm/metrics/public-api.js.map +1 -1
- package/build/esm/package.json +1 -1
- package/build/esm/scope.js +1 -1
- package/build/esm/scope.js.map +1 -1
- package/build/esm/semanticAttributes.js +57 -1
- package/build/esm/semanticAttributes.js.map +1 -1
- package/build/esm/spans/captureSpan.js +102 -0
- package/build/esm/spans/captureSpan.js.map +1 -0
- package/build/esm/spans/spanBuffer.js +119 -0
- package/build/esm/spans/spanBuffer.js.map +1 -0
- package/build/esm/spans/spanFirstUtils.js +182 -0
- package/build/esm/spans/spanFirstUtils.js.map +1 -0
- package/build/esm/tracing/ai/gen-ai-attributes.js +6 -1
- package/build/esm/tracing/ai/gen-ai-attributes.js.map +1 -1
- package/build/esm/tracing/measurement.js +1 -1
- package/build/esm/tracing/openai/index.js +134 -51
- package/build/esm/tracing/openai/index.js.map +1 -1
- package/build/esm/tracing/sentrySpan.js +33 -1
- package/build/esm/tracing/sentrySpan.js.map +1 -1
- package/build/esm/tracing/trace.js +4 -3
- package/build/esm/tracing/trace.js.map +1 -1
- package/build/esm/tracing/vercel-ai/constants.js +4 -1
- package/build/esm/tracing/vercel-ai/constants.js.map +1 -1
- package/build/esm/tracing/vercel-ai/index.js +15 -1
- package/build/esm/tracing/vercel-ai/index.js.map +1 -1
- package/build/esm/tracing/vercel-ai/utils.js +73 -24
- package/build/esm/tracing/vercel-ai/utils.js.map +1 -1
- package/build/esm/transports/base.js +18 -2
- package/build/esm/transports/base.js.map +1 -1
- package/build/esm/transports/offline.js +16 -17
- package/build/esm/transports/offline.js.map +1 -1
- package/build/esm/utils/aggregate-errors.js +13 -5
- package/build/esm/utils/aggregate-errors.js.map +1 -1
- package/build/esm/utils/beforeSendSpan.js +33 -0
- package/build/esm/utils/beforeSendSpan.js.map +1 -0
- package/build/esm/utils/envToBool.js +28 -0
- package/build/esm/utils/envToBool.js.map +1 -0
- package/build/esm/utils/exports.js +7 -7
- package/build/esm/utils/exports.js.map +1 -1
- package/build/esm/utils/featureFlags.js +1 -0
- package/build/esm/utils/featureFlags.js.map +1 -1
- package/build/esm/utils/flushIfServerless.js.map +1 -1
- package/build/esm/utils/hasSpanStreamingEnabled.js +19 -0
- package/build/esm/utils/hasSpanStreamingEnabled.js.map +1 -0
- package/build/esm/utils/prepareEvent.js +6 -1
- package/build/esm/utils/prepareEvent.js.map +1 -1
- package/build/esm/utils/promisebuffer.js +5 -3
- package/build/esm/utils/promisebuffer.js.map +1 -1
- package/build/esm/utils/scopeData.js +4 -0
- package/build/esm/utils/scopeData.js.map +1 -1
- package/build/esm/utils/sdkMetadata.js +7 -11
- package/build/esm/utils/sdkMetadata.js.map +1 -1
- package/build/esm/utils/should-ignore-span.js +31 -9
- package/build/esm/utils/should-ignore-span.js.map +1 -1
- package/build/esm/utils/spanUtils.js +87 -3
- package/build/esm/utils/spanUtils.js.map +1 -1
- package/build/esm/utils/timer.js +18 -0
- package/build/esm/utils/timer.js.map +1 -0
- package/build/esm/utils/tracePropagationTargets.js +36 -0
- package/build/esm/utils/tracePropagationTargets.js.map +1 -0
- package/build/esm/utils/version.js +1 -1
- package/build/esm/utils/version.js.map +1 -1
- package/build/types/attributes.d.ts +1 -1
- package/build/types/attributes.d.ts.map +1 -1
- package/build/types/client.d.ts +40 -2
- package/build/types/client.d.ts.map +1 -1
- package/build/types/envelope.d.ts +6 -1
- package/build/types/envelope.d.ts.map +1 -1
- package/build/types/index.d.ts +13 -4
- package/build/types/index.d.ts.map +1 -1
- package/build/types/integration.d.ts +4 -0
- package/build/types/integration.d.ts.map +1 -1
- package/build/types/integrations/mcp-server/correlation.d.ts +6 -2
- package/build/types/integrations/mcp-server/correlation.d.ts.map +1 -1
- package/build/types/integrations/mcp-server/sessionManagement.d.ts +8 -2
- package/build/types/integrations/mcp-server/sessionManagement.d.ts.map +1 -1
- package/build/types/integrations/requestdata.d.ts.map +1 -1
- package/build/types/integrations/spanStreaming.d.ts +11 -0
- package/build/types/integrations/spanStreaming.d.ts.map +1 -0
- package/build/types/metrics/public-api.d.ts +3 -3
- package/build/types/semanticAttributes.d.ts +38 -0
- package/build/types/semanticAttributes.d.ts.map +1 -1
- package/build/types/spans/captureSpan.d.ts +10 -0
- package/build/types/spans/captureSpan.d.ts.map +1 -0
- package/build/types/spans/spanBuffer.d.ts +35 -0
- package/build/types/spans/spanBuffer.d.ts.map +1 -0
- package/build/types/spans/spanFirstUtils.d.ts +20 -0
- package/build/types/spans/spanFirstUtils.d.ts.map +1 -0
- package/build/types/tracing/ai/gen-ai-attributes.d.ts +4 -0
- package/build/types/tracing/ai/gen-ai-attributes.d.ts.map +1 -1
- package/build/types/tracing/openai/index.d.ts.map +1 -1
- package/build/types/tracing/sentrySpan.d.ts +10 -1
- package/build/types/tracing/sentrySpan.d.ts.map +1 -1
- package/build/types/tracing/vercel-ai/constants.d.ts +1 -0
- package/build/types/tracing/vercel-ai/constants.d.ts.map +1 -1
- package/build/types/tracing/vercel-ai/index.d.ts.map +1 -1
- package/build/types/tracing/vercel-ai/utils.d.ts +2 -2
- package/build/types/tracing/vercel-ai/utils.d.ts.map +1 -1
- package/build/types/transports/base.d.ts.map +1 -1
- package/build/types/transports/offline.d.ts.map +1 -1
- package/build/types/types-hoist/attributes.d.ts +19 -0
- package/build/types/types-hoist/attributes.d.ts.map +1 -0
- package/build/types/types-hoist/envelope.d.ts +22 -2
- package/build/types/types-hoist/envelope.d.ts.map +1 -1
- package/build/types/types-hoist/feedback/index.d.ts.map +1 -1
- package/build/types/types-hoist/integration.d.ts +7 -0
- package/build/types/types-hoist/integration.d.ts.map +1 -1
- package/build/types/types-hoist/link.d.ts +2 -2
- package/build/types/types-hoist/link.d.ts.map +1 -1
- package/build/types/types-hoist/options.d.ts +18 -2
- package/build/types/types-hoist/options.d.ts.map +1 -1
- package/build/types/types-hoist/span.d.ts +27 -0
- package/build/types/types-hoist/span.d.ts.map +1 -1
- package/build/types/utils/beforeSendSpan.d.ts +22 -0
- package/build/types/utils/beforeSendSpan.d.ts.map +1 -0
- package/build/types/utils/envToBool.d.ts +13 -0
- package/build/types/utils/envToBool.d.ts.map +1 -0
- package/build/types/utils/featureFlags.d.ts.map +1 -1
- package/build/types/utils/flushIfServerless.d.ts.map +1 -1
- package/build/types/utils/hasSpanStreamingEnabled.d.ts +9 -0
- package/build/types/utils/hasSpanStreamingEnabled.d.ts.map +1 -0
- package/build/types/utils/prepareEvent.d.ts.map +1 -1
- package/build/types/utils/promisebuffer.d.ts.map +1 -1
- package/build/types/utils/scopeData.d.ts.map +1 -1
- package/build/types/utils/sdkMetadata.d.ts.map +1 -1
- package/build/types/utils/should-ignore-span.d.ts +3 -3
- package/build/types/utils/should-ignore-span.d.ts.map +1 -1
- package/build/types/utils/spanUtils.d.ts +22 -2
- package/build/types/utils/spanUtils.d.ts.map +1 -1
- package/build/types/utils/timer.d.ts +11 -0
- package/build/types/utils/timer.d.ts.map +1 -0
- package/build/types/utils/tracePropagationTargets.d.ts +9 -0
- package/build/types/utils/tracePropagationTargets.d.ts.map +1 -0
- package/build/types-ts3.8/attributes.d.ts +1 -1
- package/build/types-ts3.8/client.d.ts +40 -2
- package/build/types-ts3.8/envelope.d.ts +6 -1
- package/build/types-ts3.8/index.d.ts +13 -4
- package/build/types-ts3.8/integration.d.ts +4 -0
- package/build/types-ts3.8/integrations/mcp-server/correlation.d.ts +6 -2
- package/build/types-ts3.8/integrations/mcp-server/sessionManagement.d.ts +8 -2
- package/build/types-ts3.8/integrations/spanStreaming.d.ts +11 -0
- package/build/types-ts3.8/metrics/public-api.d.ts +3 -3
- package/build/types-ts3.8/semanticAttributes.d.ts +38 -0
- package/build/types-ts3.8/spans/captureSpan.d.ts +10 -0
- package/build/types-ts3.8/spans/spanBuffer.d.ts +35 -0
- package/build/types-ts3.8/spans/spanFirstUtils.d.ts +20 -0
- package/build/types-ts3.8/tracing/ai/gen-ai-attributes.d.ts +4 -0
- package/build/types-ts3.8/tracing/sentrySpan.d.ts +10 -1
- package/build/types-ts3.8/tracing/vercel-ai/constants.d.ts +1 -0
- package/build/types-ts3.8/tracing/vercel-ai/utils.d.ts +2 -2
- package/build/types-ts3.8/types-hoist/attributes.d.ts +19 -0
- package/build/types-ts3.8/types-hoist/envelope.d.ts +22 -2
- package/build/types-ts3.8/types-hoist/integration.d.ts +7 -0
- package/build/types-ts3.8/types-hoist/link.d.ts +2 -2
- package/build/types-ts3.8/types-hoist/options.d.ts +18 -2
- package/build/types-ts3.8/types-hoist/span.d.ts +27 -0
- package/build/types-ts3.8/utils/beforeSendSpan.d.ts +22 -0
- package/build/types-ts3.8/utils/envToBool.d.ts +13 -0
- package/build/types-ts3.8/utils/hasSpanStreamingEnabled.d.ts +9 -0
- package/build/types-ts3.8/utils/should-ignore-span.d.ts +3 -3
- package/build/types-ts3.8/utils/spanUtils.d.ts +22 -2
- package/build/types-ts3.8/utils/timer.d.ts +11 -0
- package/build/types-ts3.8/utils/tracePropagationTargets.d.ts +9 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace.js","sources":["../../../src/tracing/trace.ts"],"sourcesContent":["/* eslint-disable max-lines */\n\nimport { getAsyncContextStrategy } from '../asyncContext';\nimport type { AsyncContextStrategy } from '../asyncContext/types';\nimport { getMainCarrier } from '../carrier';\nimport { getClient, getCurrentScope, getIsolationScope, withScope } from '../currentScopes';\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { Scope } from '../scope';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from '../semanticAttributes';\nimport type { DynamicSamplingContext } from '../types-hoist/envelope';\nimport type { ClientOptions } from '../types-hoist/options';\nimport type { SentrySpanArguments, Span, SpanTimeInput } from '../types-hoist/span';\nimport type { StartSpanOptions } from '../types-hoist/startSpanOptions';\nimport { baggageHeaderToDynamicSamplingContext } from '../utils/baggage';\nimport { debug } from '../utils/debug-logger';\nimport { handleCallbackErrors } from '../utils/handleCallbackErrors';\nimport { hasSpansEnabled } from '../utils/hasSpansEnabled';\nimport { parseSampleRate } from '../utils/parseSampleRate';\nimport { generateTraceId } from '../utils/propagationContext';\nimport { safeMathRandom } from '../utils/randomSafeContext';\nimport { _getSpanForScope, _setSpanForScope } from '../utils/spanOnScope';\nimport { addChildSpanToSpan, getRootSpan, spanIsSampled, spanTimeInputToSeconds, spanToJSON } from '../utils/spanUtils';\nimport { propagationContextFromHeaders, shouldContinueTrace } from '../utils/tracing';\nimport { freezeDscOnSpan, getDynamicSamplingContextFromSpan } from './dynamicSamplingContext';\nimport { logSpanStart } from './logSpans';\nimport { sampleSpan } from './sampling';\nimport { SentryNonRecordingSpan } from './sentryNonRecordingSpan';\nimport { SentrySpan } from './sentrySpan';\nimport { SPAN_STATUS_ERROR } from './spanstatus';\nimport { setCapturedScopesOnSpan } from './utils';\n\nconst SUPPRESS_TRACING_KEY = '__SENTRY_SUPPRESS_TRACING__';\n\n/**\n * Wraps a function with a transaction/span and finishes the span after the function is done.\n * The created span is the active span and will be used as parent by other spans created inside the function\n * and can be accessed via `Sentry.getActiveSpan()`, as long as the function is executed while the scope is active.\n *\n * If you want to create a span that is not set as active, use {@link startInactiveSpan}.\n *\n * You'll always get a span passed to the callback,\n * it may just be a non-recording span if the span is not sampled or if tracing is disabled.\n */\nexport function startSpan<T>(options: StartSpanOptions, callback: (span: Span) => T): T {\n const acs = getAcs();\n if (acs.startSpan) {\n return acs.startSpan(options, callback);\n }\n\n const spanArguments = parseSentrySpanArguments(options);\n const { forceTransaction, parentSpan: customParentSpan, scope: customScope } = options;\n\n // We still need to fork a potentially passed scope, as we set the active span on it\n // and we need to ensure that it is cleaned up properly once the span ends.\n const customForkedScope = customScope?.clone();\n\n return withScope(customForkedScope, () => {\n // If `options.parentSpan` is defined, we want to wrap the callback in `withActiveSpan`\n const wrapper = getActiveSpanWrapper<T>(customParentSpan);\n\n return wrapper(() => {\n const scope = getCurrentScope();\n const parentSpan = getParentSpan(scope, customParentSpan);\n\n const shouldSkipSpan = options.onlyIfParent && !parentSpan;\n const activeSpan = shouldSkipSpan\n ? new SentryNonRecordingSpan()\n : createChildOrRootSpan({\n parentSpan,\n spanArguments,\n forceTransaction,\n scope,\n });\n\n _setSpanForScope(scope, activeSpan);\n\n return handleCallbackErrors(\n () => callback(activeSpan),\n () => {\n // Only update the span status if it hasn't been changed yet, and the span is not yet finished\n const { status } = spanToJSON(activeSpan);\n if (activeSpan.isRecording() && (!status || status === 'ok')) {\n activeSpan.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n }\n },\n () => {\n activeSpan.end();\n },\n );\n });\n });\n}\n\n/**\n * Similar to `Sentry.startSpan`. Wraps a function with a transaction/span, but does not finish the span\n * after the function is done automatically. Use `span.end()` to end the span.\n *\n * The created span is the active span and will be used as parent by other spans created inside the function\n * and can be accessed via `Sentry.getActiveSpan()`, as long as the function is executed while the scope is active.\n *\n * You'll always get a span passed to the callback,\n * it may just be a non-recording span if the span is not sampled or if tracing is disabled.\n */\nexport function startSpanManual<T>(options: StartSpanOptions, callback: (span: Span, finish: () => void) => T): T {\n const acs = getAcs();\n if (acs.startSpanManual) {\n return acs.startSpanManual(options, callback);\n }\n\n const spanArguments = parseSentrySpanArguments(options);\n const { forceTransaction, parentSpan: customParentSpan, scope: customScope } = options;\n\n const customForkedScope = customScope?.clone();\n\n return withScope(customForkedScope, () => {\n // If `options.parentSpan` is defined, we want to wrap the callback in `withActiveSpan`\n const wrapper = getActiveSpanWrapper<T>(customParentSpan);\n\n return wrapper(() => {\n const scope = getCurrentScope();\n const parentSpan = getParentSpan(scope, customParentSpan);\n\n const shouldSkipSpan = options.onlyIfParent && !parentSpan;\n const activeSpan = shouldSkipSpan\n ? new SentryNonRecordingSpan()\n : createChildOrRootSpan({\n parentSpan,\n spanArguments,\n forceTransaction,\n scope,\n });\n\n _setSpanForScope(scope, activeSpan);\n\n return handleCallbackErrors(\n // We pass the `finish` function to the callback, so the user can finish the span manually\n // this is mainly here for historic purposes because previously, we instructed users to call\n // `finish` instead of `span.end()` to also clean up the scope. Nowadays, calling `span.end()`\n // or `finish` has the same effect and we simply leave it here to avoid breaking user code.\n () => callback(activeSpan, () => activeSpan.end()),\n () => {\n // Only update the span status if it hasn't been changed yet, and the span is not yet finished\n const { status } = spanToJSON(activeSpan);\n if (activeSpan.isRecording() && (!status || status === 'ok')) {\n activeSpan.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n }\n },\n );\n });\n });\n}\n\n/**\n * Creates a span. This span is not set as active, so will not get automatic instrumentation spans\n * as children or be able to be accessed via `Sentry.getActiveSpan()`.\n *\n * If you want to create a span that is set as active, use {@link startSpan}.\n *\n * This function will always return a span,\n * it may just be a non-recording span if the span is not sampled or if tracing is disabled.\n */\nexport function startInactiveSpan(options: StartSpanOptions): Span {\n const acs = getAcs();\n if (acs.startInactiveSpan) {\n return acs.startInactiveSpan(options);\n }\n\n const spanArguments = parseSentrySpanArguments(options);\n const { forceTransaction, parentSpan: customParentSpan } = options;\n\n // If `options.scope` is defined, we use this as as a wrapper,\n // If `options.parentSpan` is defined, we want to wrap the callback in `withActiveSpan`\n const wrapper = options.scope\n ? (callback: () => Span) => withScope(options.scope, callback)\n : customParentSpan !== undefined\n ? (callback: () => Span) => withActiveSpan(customParentSpan, callback)\n : (callback: () => Span) => callback();\n\n return wrapper(() => {\n const scope = getCurrentScope();\n const parentSpan = getParentSpan(scope, customParentSpan);\n\n const shouldSkipSpan = options.onlyIfParent && !parentSpan;\n\n if (shouldSkipSpan) {\n return new SentryNonRecordingSpan();\n }\n\n return createChildOrRootSpan({\n parentSpan,\n spanArguments,\n forceTransaction,\n scope,\n });\n });\n}\n\n/**\n * Continue a trace from `sentry-trace` and `baggage` values.\n * These values can be obtained from incoming request headers, or in the browser from `<meta name=\"sentry-trace\">`\n * and `<meta name=\"baggage\">` HTML tags.\n *\n * Spans started with `startSpan`, `startSpanManual` and `startInactiveSpan`, within the callback will automatically\n * be attached to the incoming trace.\n */\nexport const continueTrace = <V>(\n options: {\n sentryTrace: Parameters<typeof propagationContextFromHeaders>[0];\n baggage: Parameters<typeof propagationContextFromHeaders>[1];\n },\n callback: () => V,\n): V => {\n const carrier = getMainCarrier();\n const acs = getAsyncContextStrategy(carrier);\n if (acs.continueTrace) {\n return acs.continueTrace(options, callback);\n }\n\n const { sentryTrace, baggage } = options;\n\n const client = getClient();\n const incomingDsc = baggageHeaderToDynamicSamplingContext(baggage);\n if (client && !shouldContinueTrace(client, incomingDsc?.org_id)) {\n return startNewTrace(callback);\n }\n\n return withScope(scope => {\n const propagationContext = propagationContextFromHeaders(sentryTrace, baggage);\n scope.setPropagationContext(propagationContext);\n _setSpanForScope(scope, undefined);\n return callback();\n });\n};\n\n/**\n * Forks the current scope and sets the provided span as active span in the context of the provided callback. Can be\n * passed `null` to start an entirely new span tree.\n *\n * @param span Spans started in the context of the provided callback will be children of this span. If `null` is passed,\n * spans started within the callback will not be attached to a parent span.\n * @param callback Execution context in which the provided span will be active. Is passed the newly forked scope.\n * @returns the value returned from the provided callback function.\n */\nexport function withActiveSpan<T>(span: Span | null, callback: (scope: Scope) => T): T {\n const acs = getAcs();\n if (acs.withActiveSpan) {\n return acs.withActiveSpan(span, callback);\n }\n\n return withScope(scope => {\n _setSpanForScope(scope, span || undefined);\n return callback(scope);\n });\n}\n\n/** Suppress tracing in the given callback, ensuring no spans are generated inside of it. */\nexport function suppressTracing<T>(callback: () => T): T {\n const acs = getAcs();\n\n if (acs.suppressTracing) {\n return acs.suppressTracing(callback);\n }\n\n return withScope(scope => {\n // Note: We do not wait for the callback to finish before we reset the metadata\n // the reason for this is that otherwise, in the browser this can lead to very weird behavior\n // as there is only a single top scope, if the callback takes longer to finish,\n // other, unrelated spans may also be suppressed, which we do not want\n // so instead, we only suppress tracing synchronoysly in the browser\n scope.setSDKProcessingMetadata({ [SUPPRESS_TRACING_KEY]: true });\n const res = callback();\n scope.setSDKProcessingMetadata({ [SUPPRESS_TRACING_KEY]: undefined });\n return res;\n });\n}\n\n/**\n * Starts a new trace for the duration of the provided callback. Spans started within the\n * callback will be part of the new trace instead of a potentially previously started trace.\n *\n * Important: Only use this function if you want to override the default trace lifetime and\n * propagation mechanism of the SDK for the duration and scope of the provided callback.\n * The newly created trace will also be the root of a new distributed trace, for example if\n * you make http requests within the callback.\n * This function might be useful if the operation you want to instrument should not be part\n * of a potentially ongoing trace.\n *\n * Default behavior:\n * - Server-side: A new trace is started for each incoming request.\n * - Browser: A new trace is started for each page our route. Navigating to a new route\n * or page will automatically create a new trace.\n */\nexport function startNewTrace<T>(callback: () => T): T {\n return withScope(scope => {\n scope.setPropagationContext({\n traceId: generateTraceId(),\n sampleRand: safeMathRandom(),\n });\n DEBUG_BUILD && debug.log(`Starting a new trace with id ${scope.getPropagationContext().traceId}`);\n return withActiveSpan(null, callback);\n });\n}\n\nfunction createChildOrRootSpan({\n parentSpan,\n spanArguments,\n forceTransaction,\n scope,\n}: {\n parentSpan: SentrySpan | undefined;\n spanArguments: SentrySpanArguments;\n forceTransaction?: boolean;\n scope: Scope;\n}): Span {\n if (!hasSpansEnabled()) {\n const span = new SentryNonRecordingSpan();\n\n // If this is a root span, we ensure to freeze a DSC\n // So we can have at least partial data here\n if (forceTransaction || !parentSpan) {\n const dsc = {\n sampled: 'false',\n sample_rate: '0',\n transaction: spanArguments.name,\n ...getDynamicSamplingContextFromSpan(span),\n } satisfies Partial<DynamicSamplingContext>;\n freezeDscOnSpan(span, dsc);\n }\n\n return span;\n }\n\n const isolationScope = getIsolationScope();\n\n let span: Span;\n if (parentSpan && !forceTransaction) {\n span = _startChildSpan(parentSpan, scope, spanArguments);\n addChildSpanToSpan(parentSpan, span);\n } else if (parentSpan) {\n // If we forced a transaction but have a parent span, make sure to continue from the parent span, not the scope\n const dsc = getDynamicSamplingContextFromSpan(parentSpan);\n const { traceId, spanId: parentSpanId } = parentSpan.spanContext();\n const parentSampled = spanIsSampled(parentSpan);\n\n span = _startRootSpan(\n {\n traceId,\n parentSpanId,\n ...spanArguments,\n },\n scope,\n parentSampled,\n );\n\n freezeDscOnSpan(span, dsc);\n } else {\n const {\n traceId,\n dsc,\n parentSpanId,\n sampled: parentSampled,\n } = {\n ...isolationScope.getPropagationContext(),\n ...scope.getPropagationContext(),\n };\n\n span = _startRootSpan(\n {\n traceId,\n parentSpanId,\n ...spanArguments,\n },\n scope,\n parentSampled,\n );\n\n if (dsc) {\n freezeDscOnSpan(span, dsc);\n }\n }\n\n logSpanStart(span);\n\n setCapturedScopesOnSpan(span, scope, isolationScope);\n\n return span;\n}\n\n/**\n * This converts StartSpanOptions to SentrySpanArguments.\n * For the most part (for now) we accept the same options,\n * but some of them need to be transformed.\n */\nfunction parseSentrySpanArguments(options: StartSpanOptions): SentrySpanArguments {\n const exp = options.experimental || {};\n const initialCtx: SentrySpanArguments = {\n isStandalone: exp.standalone,\n ...options,\n };\n\n if (options.startTime) {\n const ctx: SentrySpanArguments & { startTime?: SpanTimeInput } = { ...initialCtx };\n ctx.startTimestamp = spanTimeInputToSeconds(options.startTime);\n delete ctx.startTime;\n return ctx;\n }\n\n return initialCtx;\n}\n\nfunction getAcs(): AsyncContextStrategy {\n const carrier = getMainCarrier();\n return getAsyncContextStrategy(carrier);\n}\n\nfunction _startRootSpan(spanArguments: SentrySpanArguments, scope: Scope, parentSampled?: boolean): SentrySpan {\n const client = getClient();\n const options: Partial<ClientOptions> = client?.getOptions() || {};\n\n const { name = '' } = spanArguments;\n\n const mutableSpanSamplingData = { spanAttributes: { ...spanArguments.attributes }, spanName: name, parentSampled };\n\n // we don't care about the decision for the moment; this is just a placeholder\n client?.emit('beforeSampling', mutableSpanSamplingData, { decision: false });\n\n // If hook consumers override the parentSampled flag, we will use that value instead of the actual one\n const finalParentSampled = mutableSpanSamplingData.parentSampled ?? parentSampled;\n const finalAttributes = mutableSpanSamplingData.spanAttributes;\n\n const currentPropagationContext = scope.getPropagationContext();\n const [sampled, sampleRate, localSampleRateWasApplied] = scope.getScopeData().sdkProcessingMetadata[\n SUPPRESS_TRACING_KEY\n ]\n ? [false]\n : sampleSpan(\n options,\n {\n name,\n parentSampled: finalParentSampled,\n attributes: finalAttributes,\n parentSampleRate: parseSampleRate(currentPropagationContext.dsc?.sample_rate),\n },\n currentPropagationContext.sampleRand,\n );\n\n const rootSpan = new SentrySpan({\n ...spanArguments,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'custom',\n [SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE]:\n sampleRate !== undefined && localSampleRateWasApplied ? sampleRate : undefined,\n ...finalAttributes,\n },\n sampled,\n });\n\n if (!sampled && client) {\n DEBUG_BUILD && debug.log('[Tracing] Discarding root span because its trace was not chosen to be sampled.');\n client.recordDroppedEvent('sample_rate', 'transaction');\n }\n\n if (client) {\n client.emit('spanStart', rootSpan);\n }\n\n return rootSpan;\n}\n\n/**\n * Creates a new `Span` while setting the current `Span.id` as `parentSpanId`.\n * This inherits the sampling decision from the parent span.\n */\nfunction _startChildSpan(parentSpan: Span, scope: Scope, spanArguments: SentrySpanArguments): Span {\n const { spanId, traceId } = parentSpan.spanContext();\n const sampled = scope.getScopeData().sdkProcessingMetadata[SUPPRESS_TRACING_KEY] ? false : spanIsSampled(parentSpan);\n\n const childSpan = sampled\n ? new SentrySpan({\n ...spanArguments,\n parentSpanId: spanId,\n traceId,\n sampled,\n })\n : new SentryNonRecordingSpan({ traceId });\n\n addChildSpanToSpan(parentSpan, childSpan);\n\n const client = getClient();\n if (client) {\n client.emit('spanStart', childSpan);\n // If it has an endTimestamp, it's already ended\n if (spanArguments.endTimestamp) {\n client.emit('spanEnd', childSpan);\n }\n }\n\n return childSpan;\n}\n\nfunction getParentSpan(scope: Scope, customParentSpan: Span | null | undefined): SentrySpan | undefined {\n // always use the passed in span directly\n if (customParentSpan) {\n return customParentSpan as SentrySpan;\n }\n\n // This is different from `undefined` as it means the user explicitly wants no parent span\n if (customParentSpan === null) {\n return undefined;\n }\n\n const span = _getSpanForScope(scope) as SentrySpan | undefined;\n\n if (!span) {\n return undefined;\n }\n\n const client = getClient();\n const options: Partial<ClientOptions> = client ? client.getOptions() : {};\n if (options.parentSpanIsAlwaysRootSpan) {\n return getRootSpan(span) as SentrySpan;\n }\n\n return span;\n}\n\nfunction getActiveSpanWrapper<T>(parentSpan: Span | undefined | null): (callback: () => T) => T {\n return parentSpan !== undefined\n ? (callback: () => T) => {\n return withActiveSpan(parentSpan, callback);\n }\n : (callback: () => T) => callback();\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"trace.js","sources":["../../../src/tracing/trace.ts"],"sourcesContent":["/* eslint-disable max-lines */\n\nimport { getAsyncContextStrategy } from '../asyncContext';\nimport type { AsyncContextStrategy } from '../asyncContext/types';\nimport { getMainCarrier } from '../carrier';\nimport { getClient, getCurrentScope, getIsolationScope, withScope } from '../currentScopes';\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { Scope } from '../scope';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from '../semanticAttributes';\nimport type { DynamicSamplingContext } from '../types-hoist/envelope';\nimport type { ClientOptions } from '../types-hoist/options';\nimport type { SentrySpanArguments, Span, SpanTimeInput } from '../types-hoist/span';\nimport type { StartSpanOptions } from '../types-hoist/startSpanOptions';\nimport { baggageHeaderToDynamicSamplingContext } from '../utils/baggage';\nimport { debug } from '../utils/debug-logger';\nimport { handleCallbackErrors } from '../utils/handleCallbackErrors';\nimport { hasSpansEnabled } from '../utils/hasSpansEnabled';\nimport { parseSampleRate } from '../utils/parseSampleRate';\nimport { generateTraceId } from '../utils/propagationContext';\nimport { safeMathRandom } from '../utils/randomSafeContext';\nimport { _getSpanForScope, _setSpanForScope } from '../utils/spanOnScope';\nimport { addChildSpanToSpan, getRootSpan, spanIsSampled, spanTimeInputToSeconds, spanToJSON } from '../utils/spanUtils';\nimport { propagationContextFromHeaders, shouldContinueTrace } from '../utils/tracing';\nimport { freezeDscOnSpan, getDynamicSamplingContextFromSpan } from './dynamicSamplingContext';\nimport { logSpanStart } from './logSpans';\nimport { sampleSpan } from './sampling';\nimport { SentryNonRecordingSpan } from './sentryNonRecordingSpan';\nimport { SentrySpan } from './sentrySpan';\nimport { SPAN_STATUS_ERROR } from './spanstatus';\nimport { setCapturedScopesOnSpan } from './utils';\n\nconst SUPPRESS_TRACING_KEY = '__SENTRY_SUPPRESS_TRACING__';\n\n/**\n * Wraps a function with a transaction/span and finishes the span after the function is done.\n * The created span is the active span and will be used as parent by other spans created inside the function\n * and can be accessed via `Sentry.getActiveSpan()`, as long as the function is executed while the scope is active.\n *\n * If you want to create a span that is not set as active, use {@link startInactiveSpan}.\n *\n * You'll always get a span passed to the callback,\n * it may just be a non-recording span if the span is not sampled or if tracing is disabled.\n */\nexport function startSpan<T>(options: StartSpanOptions, callback: (span: Span) => T): T {\n const acs = getAcs();\n if (acs.startSpan) {\n return acs.startSpan(options, callback);\n }\n\n const spanArguments = parseSentrySpanArguments(options);\n const { forceTransaction, parentSpan: customParentSpan, scope: customScope } = options;\n\n // We still need to fork a potentially passed scope, as we set the active span on it\n // and we need to ensure that it is cleaned up properly once the span ends.\n const customForkedScope = customScope?.clone();\n\n return withScope(customForkedScope, () => {\n // If `options.parentSpan` is defined, we want to wrap the callback in `withActiveSpan`\n const wrapper = getActiveSpanWrapper<T>(customParentSpan);\n\n return wrapper(() => {\n const scope = getCurrentScope();\n const parentSpan = getParentSpan(scope, customParentSpan);\n\n const shouldSkipSpan = options.onlyIfParent && !parentSpan;\n const activeSpan = shouldSkipSpan\n ? new SentryNonRecordingSpan()\n : createChildOrRootSpan({\n parentSpan,\n spanArguments,\n forceTransaction,\n scope,\n });\n\n _setSpanForScope(scope, activeSpan);\n\n return handleCallbackErrors(\n () => callback(activeSpan),\n () => {\n // Only update the span status if it hasn't been changed yet, and the span is not yet finished\n const { status } = spanToJSON(activeSpan);\n if (activeSpan.isRecording() && (!status || status === 'ok')) {\n activeSpan.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n }\n },\n () => {\n activeSpan.end();\n },\n );\n });\n });\n}\n\n/**\n * Similar to `Sentry.startSpan`. Wraps a function with a transaction/span, but does not finish the span\n * after the function is done automatically. Use `span.end()` to end the span.\n *\n * The created span is the active span and will be used as parent by other spans created inside the function\n * and can be accessed via `Sentry.getActiveSpan()`, as long as the function is executed while the scope is active.\n *\n * You'll always get a span passed to the callback,\n * it may just be a non-recording span if the span is not sampled or if tracing is disabled.\n */\nexport function startSpanManual<T>(options: StartSpanOptions, callback: (span: Span, finish: () => void) => T): T {\n const acs = getAcs();\n if (acs.startSpanManual) {\n return acs.startSpanManual(options, callback);\n }\n\n const spanArguments = parseSentrySpanArguments(options);\n const { forceTransaction, parentSpan: customParentSpan, scope: customScope } = options;\n\n const customForkedScope = customScope?.clone();\n\n return withScope(customForkedScope, () => {\n // If `options.parentSpan` is defined, we want to wrap the callback in `withActiveSpan`\n const wrapper = getActiveSpanWrapper<T>(customParentSpan);\n\n return wrapper(() => {\n const scope = getCurrentScope();\n const parentSpan = getParentSpan(scope, customParentSpan);\n\n const shouldSkipSpan = options.onlyIfParent && !parentSpan;\n const activeSpan = shouldSkipSpan\n ? new SentryNonRecordingSpan()\n : createChildOrRootSpan({\n parentSpan,\n spanArguments,\n forceTransaction,\n scope,\n });\n\n _setSpanForScope(scope, activeSpan);\n\n return handleCallbackErrors(\n // We pass the `finish` function to the callback, so the user can finish the span manually\n // this is mainly here for historic purposes because previously, we instructed users to call\n // `finish` instead of `span.end()` to also clean up the scope. Nowadays, calling `span.end()`\n // or `finish` has the same effect and we simply leave it here to avoid breaking user code.\n () => callback(activeSpan, () => activeSpan.end()),\n () => {\n // Only update the span status if it hasn't been changed yet, and the span is not yet finished\n const { status } = spanToJSON(activeSpan);\n if (activeSpan.isRecording() && (!status || status === 'ok')) {\n activeSpan.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n }\n },\n );\n });\n });\n}\n\n/**\n * Creates a span. This span is not set as active, so will not get automatic instrumentation spans\n * as children or be able to be accessed via `Sentry.getActiveSpan()`.\n *\n * If you want to create a span that is set as active, use {@link startSpan}.\n *\n * This function will always return a span,\n * it may just be a non-recording span if the span is not sampled or if tracing is disabled.\n */\nexport function startInactiveSpan(options: StartSpanOptions): Span {\n const acs = getAcs();\n if (acs.startInactiveSpan) {\n return acs.startInactiveSpan(options);\n }\n\n const spanArguments = parseSentrySpanArguments(options);\n const { forceTransaction, parentSpan: customParentSpan } = options;\n\n // If `options.scope` is defined, we use this as as a wrapper,\n // If `options.parentSpan` is defined, we want to wrap the callback in `withActiveSpan`\n const wrapper = options.scope\n ? (callback: () => Span) => withScope(options.scope, callback)\n : customParentSpan !== undefined\n ? (callback: () => Span) => withActiveSpan(customParentSpan, callback)\n : (callback: () => Span) => callback();\n\n return wrapper(() => {\n const scope = getCurrentScope();\n const parentSpan = getParentSpan(scope, customParentSpan);\n\n const shouldSkipSpan = options.onlyIfParent && !parentSpan;\n\n if (shouldSkipSpan) {\n return new SentryNonRecordingSpan();\n }\n\n return createChildOrRootSpan({\n parentSpan,\n spanArguments,\n forceTransaction,\n scope,\n });\n });\n}\n\n/**\n * Continue a trace from `sentry-trace` and `baggage` values.\n * These values can be obtained from incoming request headers, or in the browser from `<meta name=\"sentry-trace\">`\n * and `<meta name=\"baggage\">` HTML tags.\n *\n * Spans started with `startSpan`, `startSpanManual` and `startInactiveSpan`, within the callback will automatically\n * be attached to the incoming trace.\n */\nexport const continueTrace = <V>(\n options: {\n sentryTrace: Parameters<typeof propagationContextFromHeaders>[0];\n baggage: Parameters<typeof propagationContextFromHeaders>[1];\n },\n callback: () => V,\n): V => {\n const carrier = getMainCarrier();\n const acs = getAsyncContextStrategy(carrier);\n if (acs.continueTrace) {\n return acs.continueTrace(options, callback);\n }\n\n const { sentryTrace, baggage } = options;\n\n const client = getClient();\n const incomingDsc = baggageHeaderToDynamicSamplingContext(baggage);\n if (client && !shouldContinueTrace(client, incomingDsc?.org_id)) {\n return startNewTrace(callback);\n }\n\n return withScope(scope => {\n const propagationContext = propagationContextFromHeaders(sentryTrace, baggage);\n scope.setPropagationContext(propagationContext);\n _setSpanForScope(scope, undefined);\n return callback();\n });\n};\n\n/**\n * Forks the current scope and sets the provided span as active span in the context of the provided callback. Can be\n * passed `null` to start an entirely new span tree.\n *\n * @param span Spans started in the context of the provided callback will be children of this span. If `null` is passed,\n * spans started within the callback will not be attached to a parent span.\n * @param callback Execution context in which the provided span will be active. Is passed the newly forked scope.\n * @returns the value returned from the provided callback function.\n */\nexport function withActiveSpan<T>(span: Span | null, callback: (scope: Scope) => T): T {\n const acs = getAcs();\n if (acs.withActiveSpan) {\n return acs.withActiveSpan(span, callback);\n }\n\n return withScope(scope => {\n _setSpanForScope(scope, span || undefined);\n return callback(scope);\n });\n}\n\n/** Suppress tracing in the given callback, ensuring no spans are generated inside of it. */\nexport function suppressTracing<T>(callback: () => T): T {\n const acs = getAcs();\n\n if (acs.suppressTracing) {\n return acs.suppressTracing(callback);\n }\n\n return withScope(scope => {\n // Note: We do not wait for the callback to finish before we reset the metadata\n // the reason for this is that otherwise, in the browser this can lead to very weird behavior\n // as there is only a single top scope, if the callback takes longer to finish,\n // other, unrelated spans may also be suppressed, which we do not want\n // so instead, we only suppress tracing synchronoysly in the browser\n scope.setSDKProcessingMetadata({ [SUPPRESS_TRACING_KEY]: true });\n const res = callback();\n scope.setSDKProcessingMetadata({ [SUPPRESS_TRACING_KEY]: undefined });\n return res;\n });\n}\n\n/**\n * Starts a new trace for the duration of the provided callback. Spans started within the\n * callback will be part of the new trace instead of a potentially previously started trace.\n *\n * Important: Only use this function if you want to override the default trace lifetime and\n * propagation mechanism of the SDK for the duration and scope of the provided callback.\n * The newly created trace will also be the root of a new distributed trace, for example if\n * you make http requests within the callback.\n * This function might be useful if the operation you want to instrument should not be part\n * of a potentially ongoing trace.\n *\n * Default behavior:\n * - Server-side: A new trace is started for each incoming request.\n * - Browser: A new trace is started for each page our route. Navigating to a new route\n * or page will automatically create a new trace.\n */\nexport function startNewTrace<T>(callback: () => T): T {\n return withScope(scope => {\n scope.setPropagationContext({\n traceId: generateTraceId(),\n sampleRand: safeMathRandom(),\n });\n DEBUG_BUILD && debug.log(`Starting a new trace with id ${scope.getPropagationContext().traceId}`);\n return withActiveSpan(null, callback);\n });\n}\n\nfunction createChildOrRootSpan({\n parentSpan,\n spanArguments,\n forceTransaction,\n scope,\n}: {\n parentSpan: SentrySpan | undefined;\n spanArguments: SentrySpanArguments;\n forceTransaction?: boolean;\n scope: Scope;\n}): Span {\n if (!hasSpansEnabled()) {\n const span = new SentryNonRecordingSpan();\n\n // If this is a root span, we ensure to freeze a DSC\n // So we can have at least partial data here\n if (forceTransaction || !parentSpan) {\n const dsc = {\n sampled: 'false',\n sample_rate: '0',\n transaction: spanArguments.name,\n ...getDynamicSamplingContextFromSpan(span),\n } satisfies Partial<DynamicSamplingContext>;\n freezeDscOnSpan(span, dsc);\n }\n\n return span;\n }\n\n const isolationScope = getIsolationScope();\n\n let span: Span;\n if (parentSpan && !forceTransaction) {\n span = _startChildSpan(parentSpan, scope, spanArguments);\n addChildSpanToSpan(parentSpan, span);\n } else if (parentSpan) {\n // If we forced a transaction but have a parent span, make sure to continue from the parent span, not the scope\n const dsc = getDynamicSamplingContextFromSpan(parentSpan);\n const { traceId, spanId: parentSpanId } = parentSpan.spanContext();\n const parentSampled = spanIsSampled(parentSpan);\n\n span = _startRootSpan(\n {\n traceId,\n parentSpanId,\n ...spanArguments,\n },\n scope,\n parentSampled,\n );\n\n freezeDscOnSpan(span, dsc);\n } else {\n const {\n traceId,\n dsc,\n parentSpanId,\n sampled: parentSampled,\n } = {\n ...isolationScope.getPropagationContext(),\n ...scope.getPropagationContext(),\n };\n\n span = _startRootSpan(\n {\n traceId,\n parentSpanId,\n ...spanArguments,\n },\n scope,\n parentSampled,\n );\n\n if (dsc) {\n freezeDscOnSpan(span, dsc);\n }\n }\n\n logSpanStart(span);\n\n setCapturedScopesOnSpan(span, scope, isolationScope);\n\n return span;\n}\n\n/**\n * This converts StartSpanOptions to SentrySpanArguments.\n * For the most part (for now) we accept the same options,\n * but some of them need to be transformed.\n */\nfunction parseSentrySpanArguments(options: StartSpanOptions): SentrySpanArguments {\n const exp = options.experimental || {};\n const initialCtx: SentrySpanArguments = {\n isStandalone: exp.standalone,\n ...options,\n };\n\n if (options.startTime) {\n const ctx: SentrySpanArguments & { startTime?: SpanTimeInput } = { ...initialCtx };\n ctx.startTimestamp = spanTimeInputToSeconds(options.startTime);\n delete ctx.startTime;\n return ctx;\n }\n\n return initialCtx;\n}\n\nfunction getAcs(): AsyncContextStrategy {\n const carrier = getMainCarrier();\n return getAsyncContextStrategy(carrier);\n}\n\nfunction _startRootSpan(spanArguments: SentrySpanArguments, scope: Scope, parentSampled?: boolean): SentrySpan {\n const client = getClient();\n const options: Partial<ClientOptions> = client?.getOptions() || {};\n\n const { name = '' } = spanArguments;\n\n const mutableSpanSamplingData = { spanAttributes: { ...spanArguments.attributes }, spanName: name, parentSampled };\n\n // we don't care about the decision for the moment; this is just a placeholder\n client?.emit('beforeSampling', mutableSpanSamplingData, { decision: false });\n\n // If hook consumers override the parentSampled flag, we will use that value instead of the actual one\n const finalParentSampled = mutableSpanSamplingData.parentSampled ?? parentSampled;\n const finalAttributes = mutableSpanSamplingData.spanAttributes;\n\n const currentPropagationContext = scope.getPropagationContext();\n const [sampled, sampleRate, localSampleRateWasApplied] = scope.getScopeData().sdkProcessingMetadata[\n SUPPRESS_TRACING_KEY\n ]\n ? [false]\n : sampleSpan(\n options,\n {\n name,\n parentSampled: finalParentSampled,\n attributes: finalAttributes,\n parentSampleRate: parseSampleRate(currentPropagationContext.dsc?.sample_rate),\n },\n currentPropagationContext.sampleRand,\n );\n\n const rootSpan = new SentrySpan({\n ...spanArguments,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'custom',\n [SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE]:\n sampleRate !== undefined && localSampleRateWasApplied ? sampleRate : undefined,\n ...finalAttributes,\n },\n sampled,\n });\n\n if (!sampled && client) {\n DEBUG_BUILD && debug.log('[Tracing] Discarding root span because its trace was not chosen to be sampled.');\n client.recordDroppedEvent('sample_rate', 'transaction');\n }\n\n if (client) {\n client.emit('spanStart', rootSpan);\n }\n\n return rootSpan;\n}\n\n/**\n * Creates a new `Span` while setting the current `Span.id` as `parentSpanId`.\n * This inherits the sampling decision from the parent span.\n */\nfunction _startChildSpan(parentSpan: Span, scope: Scope, spanArguments: SentrySpanArguments): Span {\n const { spanId, traceId } = parentSpan.spanContext();\n const sampled = scope.getScopeData().sdkProcessingMetadata[SUPPRESS_TRACING_KEY] ? false : spanIsSampled(parentSpan);\n\n const childSpan = sampled\n ? new SentrySpan({\n ...spanArguments,\n parentSpanId: spanId,\n traceId,\n sampled,\n })\n : new SentryNonRecordingSpan({ traceId });\n\n addChildSpanToSpan(parentSpan, childSpan);\n\n const client = getClient();\n if (client) {\n client.emit('spanStart', childSpan);\n // If it has an endTimestamp, it's already ended\n if (spanArguments.endTimestamp) {\n client.emit('spanEnd', childSpan);\n client.emit('afterSpanEnd', childSpan);\n }\n }\n\n return childSpan;\n}\n\nfunction getParentSpan(scope: Scope, customParentSpan: Span | null | undefined): SentrySpan | undefined {\n // always use the passed in span directly\n if (customParentSpan) {\n return customParentSpan as SentrySpan;\n }\n\n // This is different from `undefined` as it means the user explicitly wants no parent span\n if (customParentSpan === null) {\n return undefined;\n }\n\n const span = _getSpanForScope(scope) as SentrySpan | undefined;\n\n if (!span) {\n return undefined;\n }\n\n const client = getClient();\n const options: Partial<ClientOptions> = client ? client.getOptions() : {};\n if (options.parentSpanIsAlwaysRootSpan) {\n return getRootSpan(span) as SentrySpan;\n }\n\n return span;\n}\n\nfunction getActiveSpanWrapper<T>(parentSpan: Span | undefined | null): (callback: () => T) => T {\n return parentSpan !== undefined\n ? (callback: () => T) => {\n return withActiveSpan(parentSpan, callback);\n }\n : (callback: () => T) => callback();\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,7 @@ const INVOKE_AGENT_OPS = new Set([
|
|
|
10
10
|
'ai.streamObject',
|
|
11
11
|
'ai.embed',
|
|
12
12
|
'ai.embedMany',
|
|
13
|
+
'ai.rerank',
|
|
13
14
|
]);
|
|
14
15
|
|
|
15
16
|
const GENERATE_CONTENT_OPS = new Set([
|
|
@@ -21,5 +22,7 @@ const GENERATE_CONTENT_OPS = new Set([
|
|
|
21
22
|
|
|
22
23
|
const EMBEDDINGS_OPS = new Set(['ai.embed.doEmbed', 'ai.embedMany.doEmbed']);
|
|
23
24
|
|
|
24
|
-
|
|
25
|
+
const RERANK_OPS = new Set(['ai.rerank.doRerank']);
|
|
26
|
+
|
|
27
|
+
export { EMBEDDINGS_OPS, GENERATE_CONTENT_OPS, INVOKE_AGENT_OPS, RERANK_OPS, toolCallSpanMap };
|
|
25
28
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sources":["../../../../src/tracing/vercel-ai/constants.ts"],"sourcesContent":["import type { Span } from '../../types-hoist/span';\n\n// Global Map to track tool call IDs to their corresponding spans\n// This allows us to capture tool errors and link them to the correct span\nexport const toolCallSpanMap = new Map<string, Span>();\n\n// Operation sets for efficient mapping to OpenTelemetry semantic convention values\nexport const INVOKE_AGENT_OPS = new Set([\n 'ai.generateText',\n 'ai.streamText',\n 'ai.generateObject',\n 'ai.streamObject',\n 'ai.embed',\n 'ai.embedMany',\n]);\n\nexport const GENERATE_CONTENT_OPS = new Set([\n 'ai.generateText.doGenerate',\n 'ai.streamText.doStream',\n 'ai.generateObject.doGenerate',\n 'ai.streamObject.doStream',\n]);\n\nexport const EMBEDDINGS_OPS = new Set(['ai.embed.doEmbed', 'ai.embedMany.doEmbed']);\n"],"names":[],"mappings":"AAEA;AACA;MACa,eAAA,GAAkB,IAAI,GAAG;;AAEtC;AACO,MAAM,gBAAA,GAAmB,IAAI,GAAG,CAAC;AACxC,EAAE,iBAAiB;AACnB,EAAE,eAAe;AACjB,EAAE,mBAAmB;AACrB,EAAE,iBAAiB;AACnB,EAAE,UAAU;AACZ,EAAE,cAAc;AAChB,CAAC;;AAEM,MAAM,oBAAA,GAAuB,IAAI,GAAG,CAAC;AAC5C,EAAE,4BAA4B;AAC9B,EAAE,wBAAwB;AAC1B,EAAE,8BAA8B;AAChC,EAAE,0BAA0B;AAC5B,CAAC;;AAEM,MAAM,cAAA,GAAiB,IAAI,GAAG,CAAC,CAAC,kBAAkB,EAAE,sBAAsB,CAAC;;;;"}
|
|
1
|
+
{"version":3,"file":"constants.js","sources":["../../../../src/tracing/vercel-ai/constants.ts"],"sourcesContent":["import type { Span } from '../../types-hoist/span';\n\n// Global Map to track tool call IDs to their corresponding spans\n// This allows us to capture tool errors and link them to the correct span\nexport const toolCallSpanMap = new Map<string, Span>();\n\n// Operation sets for efficient mapping to OpenTelemetry semantic convention values\nexport const INVOKE_AGENT_OPS = new Set([\n 'ai.generateText',\n 'ai.streamText',\n 'ai.generateObject',\n 'ai.streamObject',\n 'ai.embed',\n 'ai.embedMany',\n 'ai.rerank',\n]);\n\nexport const GENERATE_CONTENT_OPS = new Set([\n 'ai.generateText.doGenerate',\n 'ai.streamText.doStream',\n 'ai.generateObject.doGenerate',\n 'ai.streamObject.doStream',\n]);\n\nexport const EMBEDDINGS_OPS = new Set(['ai.embed.doEmbed', 'ai.embedMany.doEmbed']);\n\nexport const RERANK_OPS = new Set(['ai.rerank.doRerank']);\n"],"names":[],"mappings":"AAEA;AACA;MACa,eAAA,GAAkB,IAAI,GAAG;;AAEtC;AACO,MAAM,gBAAA,GAAmB,IAAI,GAAG,CAAC;AACxC,EAAE,iBAAiB;AACnB,EAAE,eAAe;AACjB,EAAE,mBAAmB;AACrB,EAAE,iBAAiB;AACnB,EAAE,UAAU;AACZ,EAAE,cAAc;AAChB,EAAE,WAAW;AACb,CAAC;;AAEM,MAAM,oBAAA,GAAuB,IAAI,GAAG,CAAC;AAC5C,EAAE,4BAA4B;AAC9B,EAAE,wBAAwB;AAC1B,EAAE,8BAA8B;AAChC,EAAE,0BAA0B;AAC5B,CAAC;;AAEM,MAAM,cAAA,GAAiB,IAAI,GAAG,CAAC,CAAC,kBAAkB,EAAE,sBAAsB,CAAC;;AAE3E,MAAM,aAAa,IAAI,GAAG,CAAC,CAAC,oBAAoB,CAAC;;;;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '../../semanticAttributes.js';
|
|
2
2
|
import { spanToJSON } from '../../utils/spanUtils.js';
|
|
3
3
|
import { GEN_AI_OPERATION_NAME_ATTRIBUTE, GEN_AI_TOOL_CALL_ID_ATTRIBUTE, GEN_AI_TOOL_TYPE_ATTRIBUTE, GEN_AI_TOOL_NAME_ATTRIBUTE, GEN_AI_RESPONSE_MODEL_ATTRIBUTE, GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_INPUT_TOKENS_CACHED_ATTRIBUTE, GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE, GEN_AI_USAGE_INPUT_TOKENS_CACHE_WRITE_ATTRIBUTE, GEN_AI_INPUT_MESSAGES_ATTRIBUTE, GEN_AI_TOOL_INPUT_ATTRIBUTE, GEN_AI_TOOL_OUTPUT_ATTRIBUTE, GEN_AI_REQUEST_MODEL_ATTRIBUTE } from '../ai/gen-ai-attributes.js';
|
|
4
|
-
import { toolCallSpanMap, INVOKE_AGENT_OPS, GENERATE_CONTENT_OPS, EMBEDDINGS_OPS } from './constants.js';
|
|
4
|
+
import { toolCallSpanMap, INVOKE_AGENT_OPS, GENERATE_CONTENT_OPS, EMBEDDINGS_OPS, RERANK_OPS } from './constants.js';
|
|
5
5
|
import { accumulateTokensForParent, applyAccumulatedTokens, requestMessagesFromPrompt, getSpanOpFromName, convertAvailableToolsToJsonString } from './utils.js';
|
|
6
6
|
import { AI_TOOL_CALL_NAME_ATTRIBUTE, AI_TOOL_CALL_ID_ATTRIBUTE, AI_OPERATION_ID_ATTRIBUTE, AI_TELEMETRY_FUNCTION_ID_ATTRIBUTE, AI_MODEL_ID_ATTRIBUTE, AI_PROMPT_TOOLS_ATTRIBUTE, OPERATION_NAME_ATTRIBUTE, AI_RESPONSE_PROVIDER_METADATA_ATTRIBUTE, AI_USAGE_COMPLETION_TOKENS_ATTRIBUTE, AI_USAGE_PROMPT_TOKENS_ATTRIBUTE, AI_USAGE_CACHED_INPUT_TOKENS_ATTRIBUTE, AI_PROMPT_MESSAGES_ATTRIBUTE, AI_RESPONSE_TEXT_ATTRIBUTE, AI_RESPONSE_TOOL_CALLS_ATTRIBUTE, AI_RESPONSE_OBJECT_ATTRIBUTE, AI_TOOL_CALL_ARGS_ATTRIBUTE, AI_TOOL_CALL_RESULT_ATTRIBUTE, AI_SCHEMA_ATTRIBUTE } from './vercel-ai-attributes.js';
|
|
7
7
|
|
|
@@ -25,6 +25,9 @@ function mapVercelAiOperationName(operationName) {
|
|
|
25
25
|
if (EMBEDDINGS_OPS.has(operationName)) {
|
|
26
26
|
return 'embeddings';
|
|
27
27
|
}
|
|
28
|
+
if (RERANK_OPS.has(operationName)) {
|
|
29
|
+
return 'rerank';
|
|
30
|
+
}
|
|
28
31
|
if (operationName === 'ai.toolCall') {
|
|
29
32
|
return 'execute_tool';
|
|
30
33
|
}
|
|
@@ -59,6 +62,7 @@ function onVercelAiSpanStart(span) {
|
|
|
59
62
|
processGenerateSpan(span, name, attributes);
|
|
60
63
|
}
|
|
61
64
|
|
|
65
|
+
// TODO (span-streaming): move to client hook. What to do about parent modifications?
|
|
62
66
|
function vercelAiEventProcessor(event) {
|
|
63
67
|
if (event.type === 'transaction' && event.spans) {
|
|
64
68
|
// Map to accumulate token data by parent span ID
|
|
@@ -104,6 +108,13 @@ function processEndedVercelAiSpan(span) {
|
|
|
104
108
|
renameAttributeKey(attributes, AI_USAGE_PROMPT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE);
|
|
105
109
|
renameAttributeKey(attributes, AI_USAGE_CACHED_INPUT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_INPUT_TOKENS_CACHED_ATTRIBUTE);
|
|
106
110
|
|
|
111
|
+
// Parent spans (ai.streamText, ai.streamObject, etc.) use inputTokens/outputTokens instead of promptTokens/completionTokens
|
|
112
|
+
renameAttributeKey(attributes, 'ai.usage.inputTokens', GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE);
|
|
113
|
+
renameAttributeKey(attributes, 'ai.usage.outputTokens', GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE);
|
|
114
|
+
|
|
115
|
+
// AI SDK uses avgOutputTokensPerSecond, map to our expected attribute name
|
|
116
|
+
renameAttributeKey(attributes, 'ai.response.avgOutputTokensPerSecond', 'ai.response.avgCompletionTokensPerSecond');
|
|
117
|
+
|
|
107
118
|
// Input tokens is the sum of prompt tokens and cached input tokens
|
|
108
119
|
if (
|
|
109
120
|
typeof attributes[GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE] === 'number' &&
|
|
@@ -245,6 +256,9 @@ function processGenerateSpan(span, name, attributes) {
|
|
|
245
256
|
case 'ai.embedMany.doEmbed':
|
|
246
257
|
span.updateName(`embed_many ${modelId}`);
|
|
247
258
|
break;
|
|
259
|
+
case 'ai.rerank.doRerank':
|
|
260
|
+
span.updateName(`rerank ${modelId}`);
|
|
261
|
+
break;
|
|
248
262
|
}
|
|
249
263
|
}
|
|
250
264
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/tracing/vercel-ai/index.ts"],"sourcesContent":["import type { Client } from '../../client';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '../../semanticAttributes';\nimport type { Event } from '../../types-hoist/event';\nimport type { Span, SpanAttributes, SpanAttributeValue, SpanJSON, SpanOrigin } from '../../types-hoist/span';\nimport { spanToJSON } from '../../utils/spanUtils';\nimport {\n GEN_AI_INPUT_MESSAGES_ATTRIBUTE,\n GEN_AI_OPERATION_NAME_ATTRIBUTE,\n GEN_AI_REQUEST_MODEL_ATTRIBUTE,\n GEN_AI_RESPONSE_MODEL_ATTRIBUTE,\n GEN_AI_TOOL_CALL_ID_ATTRIBUTE,\n GEN_AI_TOOL_INPUT_ATTRIBUTE,\n GEN_AI_TOOL_NAME_ATTRIBUTE,\n GEN_AI_TOOL_OUTPUT_ATTRIBUTE,\n GEN_AI_TOOL_TYPE_ATTRIBUTE,\n GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE,\n GEN_AI_USAGE_INPUT_TOKENS_CACHE_WRITE_ATTRIBUTE,\n GEN_AI_USAGE_INPUT_TOKENS_CACHED_ATTRIBUTE,\n GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE,\n GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE,\n} from '../ai/gen-ai-attributes';\nimport { EMBEDDINGS_OPS, GENERATE_CONTENT_OPS, INVOKE_AGENT_OPS, toolCallSpanMap } from './constants';\nimport type { TokenSummary } from './types';\nimport {\n accumulateTokensForParent,\n applyAccumulatedTokens,\n convertAvailableToolsToJsonString,\n getSpanOpFromName,\n requestMessagesFromPrompt,\n} from './utils';\nimport type { OpenAiProviderMetadata, ProviderMetadata } from './vercel-ai-attributes';\nimport {\n AI_MODEL_ID_ATTRIBUTE,\n AI_OPERATION_ID_ATTRIBUTE,\n AI_PROMPT_MESSAGES_ATTRIBUTE,\n AI_PROMPT_TOOLS_ATTRIBUTE,\n AI_RESPONSE_OBJECT_ATTRIBUTE,\n AI_RESPONSE_PROVIDER_METADATA_ATTRIBUTE,\n AI_RESPONSE_TEXT_ATTRIBUTE,\n AI_RESPONSE_TOOL_CALLS_ATTRIBUTE,\n AI_SCHEMA_ATTRIBUTE,\n AI_TELEMETRY_FUNCTION_ID_ATTRIBUTE,\n AI_TOOL_CALL_ARGS_ATTRIBUTE,\n AI_TOOL_CALL_ID_ATTRIBUTE,\n AI_TOOL_CALL_NAME_ATTRIBUTE,\n AI_TOOL_CALL_RESULT_ATTRIBUTE,\n AI_USAGE_CACHED_INPUT_TOKENS_ATTRIBUTE,\n AI_USAGE_COMPLETION_TOKENS_ATTRIBUTE,\n AI_USAGE_PROMPT_TOKENS_ATTRIBUTE,\n OPERATION_NAME_ATTRIBUTE,\n} from './vercel-ai-attributes';\n\nfunction addOriginToSpan(span: Span, origin: SpanOrigin): void {\n span.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, origin);\n}\n\n/**\n * Maps Vercel AI SDK operation names to OpenTelemetry semantic convention values\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-spans/#llm-request-spans\n */\nfunction mapVercelAiOperationName(operationName: string): string {\n // Top-level pipeline operations map to invoke_agent\n if (INVOKE_AGENT_OPS.has(operationName)) {\n return 'invoke_agent';\n }\n // .do* operations are the actual LLM calls\n if (GENERATE_CONTENT_OPS.has(operationName)) {\n return 'generate_content';\n }\n if (EMBEDDINGS_OPS.has(operationName)) {\n return 'embeddings';\n }\n if (operationName === 'ai.toolCall') {\n return 'execute_tool';\n }\n // Return the original value for unknown operations\n return operationName;\n}\n\n/**\n * Post-process spans emitted by the Vercel AI SDK.\n * This is supposed to be used in `client.on('spanStart', ...)\n */\nfunction onVercelAiSpanStart(span: Span): void {\n const { data: attributes, description: name } = spanToJSON(span);\n\n if (!name) {\n return;\n }\n\n // Tool call spans\n // https://ai-sdk.dev/docs/ai-sdk-core/telemetry#tool-call-spans\n if (attributes[AI_TOOL_CALL_NAME_ATTRIBUTE] && attributes[AI_TOOL_CALL_ID_ATTRIBUTE] && name === 'ai.toolCall') {\n processToolCallSpan(span, attributes);\n return;\n }\n\n // V6+ Check if this is a Vercel AI span by checking if the operation ID attribute is present.\n // V5+ Check if this is a Vercel AI span by name pattern.\n if (!attributes[AI_OPERATION_ID_ATTRIBUTE] && !name.startsWith('ai.')) {\n return;\n }\n\n processGenerateSpan(span, name, attributes);\n}\n\nfunction vercelAiEventProcessor(event: Event): Event {\n if (event.type === 'transaction' && event.spans) {\n // Map to accumulate token data by parent span ID\n const tokenAccumulator: Map<string, TokenSummary> = new Map();\n\n // First pass: process all spans and accumulate token data\n for (const span of event.spans) {\n processEndedVercelAiSpan(span);\n\n // Accumulate token data for parent spans\n accumulateTokensForParent(span, tokenAccumulator);\n }\n\n // Second pass: apply accumulated token data to parent spans\n for (const span of event.spans) {\n if (span.op !== 'gen_ai.invoke_agent') {\n continue;\n }\n\n applyAccumulatedTokens(span, tokenAccumulator);\n }\n\n // Also apply to root when it is the invoke_agent pipeline\n const trace = event.contexts?.trace;\n if (trace && trace.op === 'gen_ai.invoke_agent') {\n applyAccumulatedTokens(trace, tokenAccumulator);\n }\n }\n\n return event;\n}\n/**\n * Post-process spans emitted by the Vercel AI SDK.\n */\nfunction processEndedVercelAiSpan(span: SpanJSON): void {\n const { data: attributes, origin } = span;\n\n if (origin !== 'auto.vercelai.otel') {\n return;\n }\n\n renameAttributeKey(attributes, AI_USAGE_COMPLETION_TOKENS_ATTRIBUTE, GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE);\n renameAttributeKey(attributes, AI_USAGE_PROMPT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE);\n renameAttributeKey(attributes, AI_USAGE_CACHED_INPUT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_INPUT_TOKENS_CACHED_ATTRIBUTE);\n\n // Input tokens is the sum of prompt tokens and cached input tokens\n if (\n typeof attributes[GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE] === 'number' &&\n typeof attributes[GEN_AI_USAGE_INPUT_TOKENS_CACHED_ATTRIBUTE] === 'number'\n ) {\n attributes[GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE] =\n attributes[GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE] + attributes[GEN_AI_USAGE_INPUT_TOKENS_CACHED_ATTRIBUTE];\n }\n\n if (\n typeof attributes[GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE] === 'number' &&\n typeof attributes[GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE] === 'number'\n ) {\n attributes[GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE] =\n attributes[GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE] + attributes[GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE];\n }\n\n // Convert the available tools array to a JSON string\n if (attributes[AI_PROMPT_TOOLS_ATTRIBUTE] && Array.isArray(attributes[AI_PROMPT_TOOLS_ATTRIBUTE])) {\n attributes[AI_PROMPT_TOOLS_ATTRIBUTE] = convertAvailableToolsToJsonString(\n attributes[AI_PROMPT_TOOLS_ATTRIBUTE] as unknown[],\n );\n }\n\n // Rename AI SDK attributes to standardized gen_ai attributes\n // Map operation.name to OpenTelemetry semantic convention values\n if (attributes[OPERATION_NAME_ATTRIBUTE]) {\n const operationName = mapVercelAiOperationName(attributes[OPERATION_NAME_ATTRIBUTE] as string);\n attributes[GEN_AI_OPERATION_NAME_ATTRIBUTE] = operationName;\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete attributes[OPERATION_NAME_ATTRIBUTE];\n }\n renameAttributeKey(attributes, AI_PROMPT_MESSAGES_ATTRIBUTE, GEN_AI_INPUT_MESSAGES_ATTRIBUTE);\n renameAttributeKey(attributes, AI_RESPONSE_TEXT_ATTRIBUTE, 'gen_ai.response.text');\n renameAttributeKey(attributes, AI_RESPONSE_TOOL_CALLS_ATTRIBUTE, 'gen_ai.response.tool_calls');\n renameAttributeKey(attributes, AI_RESPONSE_OBJECT_ATTRIBUTE, 'gen_ai.response.object');\n renameAttributeKey(attributes, AI_PROMPT_TOOLS_ATTRIBUTE, 'gen_ai.request.available_tools');\n\n renameAttributeKey(attributes, AI_TOOL_CALL_ARGS_ATTRIBUTE, GEN_AI_TOOL_INPUT_ATTRIBUTE);\n renameAttributeKey(attributes, AI_TOOL_CALL_RESULT_ATTRIBUTE, GEN_AI_TOOL_OUTPUT_ATTRIBUTE);\n\n renameAttributeKey(attributes, AI_SCHEMA_ATTRIBUTE, 'gen_ai.request.schema');\n renameAttributeKey(attributes, AI_MODEL_ID_ATTRIBUTE, GEN_AI_REQUEST_MODEL_ATTRIBUTE);\n\n addProviderMetadataToAttributes(attributes);\n\n // Change attributes namespaced with `ai.X` to `vercel.ai.X`\n for (const key of Object.keys(attributes)) {\n if (key.startsWith('ai.')) {\n renameAttributeKey(attributes, key, `vercel.${key}`);\n }\n }\n}\n\n/**\n * Renames an attribute key in the provided attributes object if the old key exists.\n * This function safely handles null and undefined values.\n */\nfunction renameAttributeKey(attributes: Record<string, unknown>, oldKey: string, newKey: string): void {\n if (attributes[oldKey] != null) {\n attributes[newKey] = attributes[oldKey];\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete attributes[oldKey];\n }\n}\n\nfunction processToolCallSpan(span: Span, attributes: SpanAttributes): void {\n addOriginToSpan(span, 'auto.vercelai.otel');\n span.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_OP, 'gen_ai.execute_tool');\n span.setAttribute(GEN_AI_OPERATION_NAME_ATTRIBUTE, 'execute_tool');\n renameAttributeKey(attributes, AI_TOOL_CALL_NAME_ATTRIBUTE, GEN_AI_TOOL_NAME_ATTRIBUTE);\n renameAttributeKey(attributes, AI_TOOL_CALL_ID_ATTRIBUTE, GEN_AI_TOOL_CALL_ID_ATTRIBUTE);\n\n // Store the span in our global map using the tool call ID\n // This allows us to capture tool errors and link them to the correct span\n const toolCallId = attributes[GEN_AI_TOOL_CALL_ID_ATTRIBUTE];\n\n if (typeof toolCallId === 'string') {\n toolCallSpanMap.set(toolCallId, span);\n }\n\n // https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/#gen-ai-tool-type\n if (!attributes[GEN_AI_TOOL_TYPE_ATTRIBUTE]) {\n span.setAttribute(GEN_AI_TOOL_TYPE_ATTRIBUTE, 'function');\n }\n const toolName = attributes[GEN_AI_TOOL_NAME_ATTRIBUTE];\n if (toolName) {\n span.updateName(`execute_tool ${toolName}`);\n }\n}\n\nfunction processGenerateSpan(span: Span, name: string, attributes: SpanAttributes): void {\n addOriginToSpan(span, 'auto.vercelai.otel');\n\n const nameWthoutAi = name.replace('ai.', '');\n span.setAttribute('ai.pipeline.name', nameWthoutAi);\n span.updateName(nameWthoutAi);\n\n // If a telemetry name is set and the span represents a pipeline, use it as the operation name.\n // This name can be set at the request level by adding `experimental_telemetry.functionId`.\n const functionId = attributes[AI_TELEMETRY_FUNCTION_ID_ATTRIBUTE];\n if (functionId && typeof functionId === 'string') {\n span.updateName(`${nameWthoutAi} ${functionId}`);\n span.setAttribute('gen_ai.function_id', functionId);\n }\n\n requestMessagesFromPrompt(span, attributes);\n\n if (attributes[AI_MODEL_ID_ATTRIBUTE] && !attributes[GEN_AI_RESPONSE_MODEL_ATTRIBUTE]) {\n span.setAttribute(GEN_AI_RESPONSE_MODEL_ATTRIBUTE, attributes[AI_MODEL_ID_ATTRIBUTE]);\n }\n span.setAttribute('ai.streaming', name.includes('stream'));\n\n // Set the op based on the span name\n const op = getSpanOpFromName(name);\n if (op) {\n span.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_OP, op);\n }\n\n // Update span names for .do* spans to include the model ID (only if model ID exists)\n const modelId = attributes[AI_MODEL_ID_ATTRIBUTE];\n if (modelId) {\n switch (name) {\n case 'ai.generateText.doGenerate':\n span.updateName(`generate_text ${modelId}`);\n break;\n case 'ai.streamText.doStream':\n span.updateName(`stream_text ${modelId}`);\n break;\n case 'ai.generateObject.doGenerate':\n span.updateName(`generate_object ${modelId}`);\n break;\n case 'ai.streamObject.doStream':\n span.updateName(`stream_object ${modelId}`);\n break;\n case 'ai.embed.doEmbed':\n span.updateName(`embed ${modelId}`);\n break;\n case 'ai.embedMany.doEmbed':\n span.updateName(`embed_many ${modelId}`);\n break;\n }\n }\n}\n\n/**\n * Add event processors to the given client to process Vercel AI spans.\n */\nexport function addVercelAiProcessors(client: Client): void {\n client.on('spanStart', onVercelAiSpanStart);\n // Note: We cannot do this on `spanEnd`, because the span cannot be mutated anymore at this point\n client.addEventProcessor(Object.assign(vercelAiEventProcessor, { id: 'VercelAiEventProcessor' }));\n}\n\nfunction addProviderMetadataToAttributes(attributes: SpanAttributes): void {\n const providerMetadata = attributes[AI_RESPONSE_PROVIDER_METADATA_ATTRIBUTE] as string | undefined;\n if (providerMetadata) {\n try {\n const providerMetadataObject = JSON.parse(providerMetadata) as ProviderMetadata;\n\n // Handle OpenAI metadata (v5 uses 'openai', v6 Azure Responses API uses 'azure')\n const openaiMetadata: OpenAiProviderMetadata | undefined =\n providerMetadataObject.openai ?? providerMetadataObject.azure;\n if (openaiMetadata) {\n setAttributeIfDefined(\n attributes,\n GEN_AI_USAGE_INPUT_TOKENS_CACHED_ATTRIBUTE,\n openaiMetadata.cachedPromptTokens,\n );\n setAttributeIfDefined(attributes, 'gen_ai.usage.output_tokens.reasoning', openaiMetadata.reasoningTokens);\n setAttributeIfDefined(\n attributes,\n 'gen_ai.usage.output_tokens.prediction_accepted',\n openaiMetadata.acceptedPredictionTokens,\n );\n setAttributeIfDefined(\n attributes,\n 'gen_ai.usage.output_tokens.prediction_rejected',\n openaiMetadata.rejectedPredictionTokens,\n );\n setAttributeIfDefined(attributes, 'gen_ai.conversation.id', openaiMetadata.responseId);\n }\n\n if (providerMetadataObject.anthropic) {\n const cachedInputTokens =\n providerMetadataObject.anthropic.usage?.cache_read_input_tokens ??\n providerMetadataObject.anthropic.cacheReadInputTokens;\n setAttributeIfDefined(attributes, GEN_AI_USAGE_INPUT_TOKENS_CACHED_ATTRIBUTE, cachedInputTokens);\n\n const cacheWriteInputTokens =\n providerMetadataObject.anthropic.usage?.cache_creation_input_tokens ??\n providerMetadataObject.anthropic.cacheCreationInputTokens;\n setAttributeIfDefined(attributes, GEN_AI_USAGE_INPUT_TOKENS_CACHE_WRITE_ATTRIBUTE, cacheWriteInputTokens);\n }\n\n if (providerMetadataObject.bedrock?.usage) {\n setAttributeIfDefined(\n attributes,\n GEN_AI_USAGE_INPUT_TOKENS_CACHED_ATTRIBUTE,\n providerMetadataObject.bedrock.usage.cacheReadInputTokens,\n );\n setAttributeIfDefined(\n attributes,\n GEN_AI_USAGE_INPUT_TOKENS_CACHE_WRITE_ATTRIBUTE,\n providerMetadataObject.bedrock.usage.cacheWriteInputTokens,\n );\n }\n\n if (providerMetadataObject.deepseek) {\n setAttributeIfDefined(\n attributes,\n GEN_AI_USAGE_INPUT_TOKENS_CACHED_ATTRIBUTE,\n providerMetadataObject.deepseek.promptCacheHitTokens,\n );\n setAttributeIfDefined(\n attributes,\n 'gen_ai.usage.input_tokens.cache_miss',\n providerMetadataObject.deepseek.promptCacheMissTokens,\n );\n }\n } catch {\n // Ignore\n }\n }\n}\n\n/**\n * Sets an attribute only if the value is not null or undefined.\n */\nfunction setAttributeIfDefined(attributes: SpanAttributes, key: string, value: SpanAttributeValue | undefined): void {\n if (value != null) {\n attributes[key] = value;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/tracing/vercel-ai/index.ts"],"sourcesContent":["import type { Client } from '../../client';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '../../semanticAttributes';\nimport type { Event } from '../../types-hoist/event';\nimport type { Span, SpanAttributes, SpanAttributeValue, SpanJSON, SpanOrigin } from '../../types-hoist/span';\nimport { spanToJSON } from '../../utils/spanUtils';\nimport {\n GEN_AI_INPUT_MESSAGES_ATTRIBUTE,\n GEN_AI_OPERATION_NAME_ATTRIBUTE,\n GEN_AI_REQUEST_MODEL_ATTRIBUTE,\n GEN_AI_RESPONSE_MODEL_ATTRIBUTE,\n GEN_AI_TOOL_CALL_ID_ATTRIBUTE,\n GEN_AI_TOOL_INPUT_ATTRIBUTE,\n GEN_AI_TOOL_NAME_ATTRIBUTE,\n GEN_AI_TOOL_OUTPUT_ATTRIBUTE,\n GEN_AI_TOOL_TYPE_ATTRIBUTE,\n GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE,\n GEN_AI_USAGE_INPUT_TOKENS_CACHE_WRITE_ATTRIBUTE,\n GEN_AI_USAGE_INPUT_TOKENS_CACHED_ATTRIBUTE,\n GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE,\n GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE,\n} from '../ai/gen-ai-attributes';\nimport { EMBEDDINGS_OPS, GENERATE_CONTENT_OPS, INVOKE_AGENT_OPS, RERANK_OPS, toolCallSpanMap } from './constants';\nimport type { TokenSummary } from './types';\nimport {\n accumulateTokensForParent,\n applyAccumulatedTokens,\n convertAvailableToolsToJsonString,\n getSpanOpFromName,\n requestMessagesFromPrompt,\n} from './utils';\nimport type { OpenAiProviderMetadata, ProviderMetadata } from './vercel-ai-attributes';\nimport {\n AI_MODEL_ID_ATTRIBUTE,\n AI_OPERATION_ID_ATTRIBUTE,\n AI_PROMPT_MESSAGES_ATTRIBUTE,\n AI_PROMPT_TOOLS_ATTRIBUTE,\n AI_RESPONSE_OBJECT_ATTRIBUTE,\n AI_RESPONSE_PROVIDER_METADATA_ATTRIBUTE,\n AI_RESPONSE_TEXT_ATTRIBUTE,\n AI_RESPONSE_TOOL_CALLS_ATTRIBUTE,\n AI_SCHEMA_ATTRIBUTE,\n AI_TELEMETRY_FUNCTION_ID_ATTRIBUTE,\n AI_TOOL_CALL_ARGS_ATTRIBUTE,\n AI_TOOL_CALL_ID_ATTRIBUTE,\n AI_TOOL_CALL_NAME_ATTRIBUTE,\n AI_TOOL_CALL_RESULT_ATTRIBUTE,\n AI_USAGE_CACHED_INPUT_TOKENS_ATTRIBUTE,\n AI_USAGE_COMPLETION_TOKENS_ATTRIBUTE,\n AI_USAGE_PROMPT_TOKENS_ATTRIBUTE,\n OPERATION_NAME_ATTRIBUTE,\n} from './vercel-ai-attributes';\n\nfunction addOriginToSpan(span: Span, origin: SpanOrigin): void {\n span.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, origin);\n}\n\n/**\n * Maps Vercel AI SDK operation names to OpenTelemetry semantic convention values\n * @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-spans/#llm-request-spans\n */\nfunction mapVercelAiOperationName(operationName: string): string {\n // Top-level pipeline operations map to invoke_agent\n if (INVOKE_AGENT_OPS.has(operationName)) {\n return 'invoke_agent';\n }\n // .do* operations are the actual LLM calls\n if (GENERATE_CONTENT_OPS.has(operationName)) {\n return 'generate_content';\n }\n if (EMBEDDINGS_OPS.has(operationName)) {\n return 'embeddings';\n }\n if (RERANK_OPS.has(operationName)) {\n return 'rerank';\n }\n if (operationName === 'ai.toolCall') {\n return 'execute_tool';\n }\n // Return the original value for unknown operations\n return operationName;\n}\n\n/**\n * Post-process spans emitted by the Vercel AI SDK.\n * This is supposed to be used in `client.on('spanStart', ...)\n */\nfunction onVercelAiSpanStart(span: Span): void {\n const { data: attributes, description: name } = spanToJSON(span);\n\n if (!name) {\n return;\n }\n\n // Tool call spans\n // https://ai-sdk.dev/docs/ai-sdk-core/telemetry#tool-call-spans\n if (attributes[AI_TOOL_CALL_NAME_ATTRIBUTE] && attributes[AI_TOOL_CALL_ID_ATTRIBUTE] && name === 'ai.toolCall') {\n processToolCallSpan(span, attributes);\n return;\n }\n\n // V6+ Check if this is a Vercel AI span by checking if the operation ID attribute is present.\n // V5+ Check if this is a Vercel AI span by name pattern.\n if (!attributes[AI_OPERATION_ID_ATTRIBUTE] && !name.startsWith('ai.')) {\n return;\n }\n\n processGenerateSpan(span, name, attributes);\n}\n\n// TODO (span-streaming): move to client hook. What to do about parent modifications?\nfunction vercelAiEventProcessor(event: Event): Event {\n if (event.type === 'transaction' && event.spans) {\n // Map to accumulate token data by parent span ID\n const tokenAccumulator: Map<string, TokenSummary> = new Map();\n\n // First pass: process all spans and accumulate token data\n for (const span of event.spans) {\n processEndedVercelAiSpan(span);\n\n // Accumulate token data for parent spans\n accumulateTokensForParent(span, tokenAccumulator);\n }\n\n // Second pass: apply accumulated token data to parent spans\n for (const span of event.spans) {\n if (span.op !== 'gen_ai.invoke_agent') {\n continue;\n }\n\n applyAccumulatedTokens(span, tokenAccumulator);\n }\n\n // Also apply to root when it is the invoke_agent pipeline\n const trace = event.contexts?.trace;\n if (trace && trace.op === 'gen_ai.invoke_agent') {\n applyAccumulatedTokens(trace, tokenAccumulator);\n }\n }\n\n return event;\n}\n/**\n * Post-process spans emitted by the Vercel AI SDK.\n */\nfunction processEndedVercelAiSpan(span: SpanJSON): void {\n const { data: attributes, origin } = span;\n\n if (origin !== 'auto.vercelai.otel') {\n return;\n }\n\n renameAttributeKey(attributes, AI_USAGE_COMPLETION_TOKENS_ATTRIBUTE, GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE);\n renameAttributeKey(attributes, AI_USAGE_PROMPT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE);\n renameAttributeKey(attributes, AI_USAGE_CACHED_INPUT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_INPUT_TOKENS_CACHED_ATTRIBUTE);\n\n // Parent spans (ai.streamText, ai.streamObject, etc.) use inputTokens/outputTokens instead of promptTokens/completionTokens\n renameAttributeKey(attributes, 'ai.usage.inputTokens', GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE);\n renameAttributeKey(attributes, 'ai.usage.outputTokens', GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE);\n\n // AI SDK uses avgOutputTokensPerSecond, map to our expected attribute name\n renameAttributeKey(attributes, 'ai.response.avgOutputTokensPerSecond', 'ai.response.avgCompletionTokensPerSecond');\n\n // Input tokens is the sum of prompt tokens and cached input tokens\n if (\n typeof attributes[GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE] === 'number' &&\n typeof attributes[GEN_AI_USAGE_INPUT_TOKENS_CACHED_ATTRIBUTE] === 'number'\n ) {\n attributes[GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE] =\n attributes[GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE] + attributes[GEN_AI_USAGE_INPUT_TOKENS_CACHED_ATTRIBUTE];\n }\n\n if (\n typeof attributes[GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE] === 'number' &&\n typeof attributes[GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE] === 'number'\n ) {\n attributes[GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE] =\n attributes[GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE] + attributes[GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE];\n }\n\n // Convert the available tools array to a JSON string\n if (attributes[AI_PROMPT_TOOLS_ATTRIBUTE] && Array.isArray(attributes[AI_PROMPT_TOOLS_ATTRIBUTE])) {\n attributes[AI_PROMPT_TOOLS_ATTRIBUTE] = convertAvailableToolsToJsonString(\n attributes[AI_PROMPT_TOOLS_ATTRIBUTE] as unknown[],\n );\n }\n\n // Rename AI SDK attributes to standardized gen_ai attributes\n // Map operation.name to OpenTelemetry semantic convention values\n if (attributes[OPERATION_NAME_ATTRIBUTE]) {\n const operationName = mapVercelAiOperationName(attributes[OPERATION_NAME_ATTRIBUTE] as string);\n attributes[GEN_AI_OPERATION_NAME_ATTRIBUTE] = operationName;\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete attributes[OPERATION_NAME_ATTRIBUTE];\n }\n renameAttributeKey(attributes, AI_PROMPT_MESSAGES_ATTRIBUTE, GEN_AI_INPUT_MESSAGES_ATTRIBUTE);\n renameAttributeKey(attributes, AI_RESPONSE_TEXT_ATTRIBUTE, 'gen_ai.response.text');\n renameAttributeKey(attributes, AI_RESPONSE_TOOL_CALLS_ATTRIBUTE, 'gen_ai.response.tool_calls');\n renameAttributeKey(attributes, AI_RESPONSE_OBJECT_ATTRIBUTE, 'gen_ai.response.object');\n renameAttributeKey(attributes, AI_PROMPT_TOOLS_ATTRIBUTE, 'gen_ai.request.available_tools');\n\n renameAttributeKey(attributes, AI_TOOL_CALL_ARGS_ATTRIBUTE, GEN_AI_TOOL_INPUT_ATTRIBUTE);\n renameAttributeKey(attributes, AI_TOOL_CALL_RESULT_ATTRIBUTE, GEN_AI_TOOL_OUTPUT_ATTRIBUTE);\n\n renameAttributeKey(attributes, AI_SCHEMA_ATTRIBUTE, 'gen_ai.request.schema');\n renameAttributeKey(attributes, AI_MODEL_ID_ATTRIBUTE, GEN_AI_REQUEST_MODEL_ATTRIBUTE);\n\n addProviderMetadataToAttributes(attributes);\n\n // Change attributes namespaced with `ai.X` to `vercel.ai.X`\n for (const key of Object.keys(attributes)) {\n if (key.startsWith('ai.')) {\n renameAttributeKey(attributes, key, `vercel.${key}`);\n }\n }\n}\n\n/**\n * Renames an attribute key in the provided attributes object if the old key exists.\n * This function safely handles null and undefined values.\n */\nfunction renameAttributeKey(attributes: Record<string, unknown>, oldKey: string, newKey: string): void {\n if (attributes[oldKey] != null) {\n attributes[newKey] = attributes[oldKey];\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete attributes[oldKey];\n }\n}\n\nfunction processToolCallSpan(span: Span, attributes: SpanAttributes): void {\n addOriginToSpan(span, 'auto.vercelai.otel');\n span.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_OP, 'gen_ai.execute_tool');\n span.setAttribute(GEN_AI_OPERATION_NAME_ATTRIBUTE, 'execute_tool');\n renameAttributeKey(attributes, AI_TOOL_CALL_NAME_ATTRIBUTE, GEN_AI_TOOL_NAME_ATTRIBUTE);\n renameAttributeKey(attributes, AI_TOOL_CALL_ID_ATTRIBUTE, GEN_AI_TOOL_CALL_ID_ATTRIBUTE);\n\n // Store the span in our global map using the tool call ID\n // This allows us to capture tool errors and link them to the correct span\n const toolCallId = attributes[GEN_AI_TOOL_CALL_ID_ATTRIBUTE];\n\n if (typeof toolCallId === 'string') {\n toolCallSpanMap.set(toolCallId, span);\n }\n\n // https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/#gen-ai-tool-type\n if (!attributes[GEN_AI_TOOL_TYPE_ATTRIBUTE]) {\n span.setAttribute(GEN_AI_TOOL_TYPE_ATTRIBUTE, 'function');\n }\n const toolName = attributes[GEN_AI_TOOL_NAME_ATTRIBUTE];\n if (toolName) {\n span.updateName(`execute_tool ${toolName}`);\n }\n}\n\nfunction processGenerateSpan(span: Span, name: string, attributes: SpanAttributes): void {\n addOriginToSpan(span, 'auto.vercelai.otel');\n\n const nameWthoutAi = name.replace('ai.', '');\n span.setAttribute('ai.pipeline.name', nameWthoutAi);\n span.updateName(nameWthoutAi);\n\n // If a telemetry name is set and the span represents a pipeline, use it as the operation name.\n // This name can be set at the request level by adding `experimental_telemetry.functionId`.\n const functionId = attributes[AI_TELEMETRY_FUNCTION_ID_ATTRIBUTE];\n if (functionId && typeof functionId === 'string') {\n span.updateName(`${nameWthoutAi} ${functionId}`);\n span.setAttribute('gen_ai.function_id', functionId);\n }\n\n requestMessagesFromPrompt(span, attributes);\n\n if (attributes[AI_MODEL_ID_ATTRIBUTE] && !attributes[GEN_AI_RESPONSE_MODEL_ATTRIBUTE]) {\n span.setAttribute(GEN_AI_RESPONSE_MODEL_ATTRIBUTE, attributes[AI_MODEL_ID_ATTRIBUTE]);\n }\n span.setAttribute('ai.streaming', name.includes('stream'));\n\n // Set the op based on the span name\n const op = getSpanOpFromName(name);\n if (op) {\n span.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_OP, op);\n }\n\n // Update span names for .do* spans to include the model ID (only if model ID exists)\n const modelId = attributes[AI_MODEL_ID_ATTRIBUTE];\n if (modelId) {\n switch (name) {\n case 'ai.generateText.doGenerate':\n span.updateName(`generate_text ${modelId}`);\n break;\n case 'ai.streamText.doStream':\n span.updateName(`stream_text ${modelId}`);\n break;\n case 'ai.generateObject.doGenerate':\n span.updateName(`generate_object ${modelId}`);\n break;\n case 'ai.streamObject.doStream':\n span.updateName(`stream_object ${modelId}`);\n break;\n case 'ai.embed.doEmbed':\n span.updateName(`embed ${modelId}`);\n break;\n case 'ai.embedMany.doEmbed':\n span.updateName(`embed_many ${modelId}`);\n break;\n case 'ai.rerank.doRerank':\n span.updateName(`rerank ${modelId}`);\n break;\n }\n }\n}\n\n/**\n * Add event processors to the given client to process Vercel AI spans.\n */\nexport function addVercelAiProcessors(client: Client): void {\n client.on('spanStart', onVercelAiSpanStart);\n // Note: We cannot do this on `spanEnd`, because the span cannot be mutated anymore at this point\n client.addEventProcessor(Object.assign(vercelAiEventProcessor, { id: 'VercelAiEventProcessor' }));\n}\n\nfunction addProviderMetadataToAttributes(attributes: SpanAttributes): void {\n const providerMetadata = attributes[AI_RESPONSE_PROVIDER_METADATA_ATTRIBUTE] as string | undefined;\n if (providerMetadata) {\n try {\n const providerMetadataObject = JSON.parse(providerMetadata) as ProviderMetadata;\n\n // Handle OpenAI metadata (v5 uses 'openai', v6 Azure Responses API uses 'azure')\n const openaiMetadata: OpenAiProviderMetadata | undefined =\n providerMetadataObject.openai ?? providerMetadataObject.azure;\n if (openaiMetadata) {\n setAttributeIfDefined(\n attributes,\n GEN_AI_USAGE_INPUT_TOKENS_CACHED_ATTRIBUTE,\n openaiMetadata.cachedPromptTokens,\n );\n setAttributeIfDefined(attributes, 'gen_ai.usage.output_tokens.reasoning', openaiMetadata.reasoningTokens);\n setAttributeIfDefined(\n attributes,\n 'gen_ai.usage.output_tokens.prediction_accepted',\n openaiMetadata.acceptedPredictionTokens,\n );\n setAttributeIfDefined(\n attributes,\n 'gen_ai.usage.output_tokens.prediction_rejected',\n openaiMetadata.rejectedPredictionTokens,\n );\n setAttributeIfDefined(attributes, 'gen_ai.conversation.id', openaiMetadata.responseId);\n }\n\n if (providerMetadataObject.anthropic) {\n const cachedInputTokens =\n providerMetadataObject.anthropic.usage?.cache_read_input_tokens ??\n providerMetadataObject.anthropic.cacheReadInputTokens;\n setAttributeIfDefined(attributes, GEN_AI_USAGE_INPUT_TOKENS_CACHED_ATTRIBUTE, cachedInputTokens);\n\n const cacheWriteInputTokens =\n providerMetadataObject.anthropic.usage?.cache_creation_input_tokens ??\n providerMetadataObject.anthropic.cacheCreationInputTokens;\n setAttributeIfDefined(attributes, GEN_AI_USAGE_INPUT_TOKENS_CACHE_WRITE_ATTRIBUTE, cacheWriteInputTokens);\n }\n\n if (providerMetadataObject.bedrock?.usage) {\n setAttributeIfDefined(\n attributes,\n GEN_AI_USAGE_INPUT_TOKENS_CACHED_ATTRIBUTE,\n providerMetadataObject.bedrock.usage.cacheReadInputTokens,\n );\n setAttributeIfDefined(\n attributes,\n GEN_AI_USAGE_INPUT_TOKENS_CACHE_WRITE_ATTRIBUTE,\n providerMetadataObject.bedrock.usage.cacheWriteInputTokens,\n );\n }\n\n if (providerMetadataObject.deepseek) {\n setAttributeIfDefined(\n attributes,\n GEN_AI_USAGE_INPUT_TOKENS_CACHED_ATTRIBUTE,\n providerMetadataObject.deepseek.promptCacheHitTokens,\n );\n setAttributeIfDefined(\n attributes,\n 'gen_ai.usage.input_tokens.cache_miss',\n providerMetadataObject.deepseek.promptCacheMissTokens,\n );\n }\n } catch {\n // Ignore\n }\n }\n}\n\n/**\n * Sets an attribute only if the value is not null or undefined.\n */\nfunction setAttributeIfDefined(attributes: SpanAttributes, key: string, value: SpanAttributeValue | undefined): void {\n if (value != null) {\n attributes[key] = value;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE, GEN_AI_INPUT_MESSAGES_ATTRIBUTE, GEN_AI_SYSTEM_INSTRUCTIONS_ATTRIBUTE, GEN_AI_INPUT_MESSAGES_ORIGINAL_LENGTH_ATTRIBUTE, GEN_AI_EXECUTE_TOOL_OPERATION_ATTRIBUTE, GEN_AI_EMBED_MANY_DO_EMBED_OPERATION_ATTRIBUTE, GEN_AI_EMBED_DO_EMBED_OPERATION_ATTRIBUTE, GEN_AI_STREAM_OBJECT_DO_STREAM_OPERATION_ATTRIBUTE, GEN_AI_GENERATE_OBJECT_DO_GENERATE_OPERATION_ATTRIBUTE, GEN_AI_STREAM_TEXT_DO_STREAM_OPERATION_ATTRIBUTE, GEN_AI_GENERATE_TEXT_DO_GENERATE_OPERATION_ATTRIBUTE, GEN_AI_INVOKE_AGENT_OPERATION_ATTRIBUTE } from '../ai/gen-ai-attributes.js';
|
|
2
|
-
import {
|
|
1
|
+
import { GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE, GEN_AI_INPUT_MESSAGES_ATTRIBUTE, GEN_AI_SYSTEM_INSTRUCTIONS_ATTRIBUTE, GEN_AI_INPUT_MESSAGES_ORIGINAL_LENGTH_ATTRIBUTE, GEN_AI_EXECUTE_TOOL_OPERATION_ATTRIBUTE, GEN_AI_RERANK_DO_RERANK_OPERATION_ATTRIBUTE, GEN_AI_EMBED_MANY_DO_EMBED_OPERATION_ATTRIBUTE, GEN_AI_EMBED_DO_EMBED_OPERATION_ATTRIBUTE, GEN_AI_STREAM_OBJECT_DO_STREAM_OPERATION_ATTRIBUTE, GEN_AI_GENERATE_OBJECT_DO_GENERATE_OPERATION_ATTRIBUTE, GEN_AI_STREAM_TEXT_DO_STREAM_OPERATION_ATTRIBUTE, GEN_AI_GENERATE_TEXT_DO_GENERATE_OPERATION_ATTRIBUTE, GEN_AI_INVOKE_AGENT_OPERATION_ATTRIBUTE } from '../ai/gen-ai-attributes.js';
|
|
2
|
+
import { extractSystemInstructions, getTruncatedJsonString } from '../ai/utils.js';
|
|
3
3
|
import { toolCallSpanMap } from './constants.js';
|
|
4
4
|
import { AI_PROMPT_ATTRIBUTE, AI_PROMPT_MESSAGES_ATTRIBUTE } from './vercel-ai-attributes.js';
|
|
5
5
|
|
|
@@ -88,22 +88,61 @@ function convertAvailableToolsToJsonString(tools) {
|
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
/**
|
|
91
|
-
*
|
|
91
|
+
* Filter out invalid entries in messages array
|
|
92
|
+
* @param input - The input array to filter
|
|
93
|
+
* @returns The filtered array
|
|
92
94
|
*/
|
|
93
|
-
function
|
|
95
|
+
function filterMessagesArray(input) {
|
|
96
|
+
return input.filter(
|
|
97
|
+
(m) =>
|
|
98
|
+
!!m && typeof m === 'object' && 'role' in m && 'content' in m,
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Normalize the user input (stringified object with prompt, system, messages) to messages array
|
|
104
|
+
*/
|
|
105
|
+
function convertUserInputToMessagesFormat(userInput) {
|
|
94
106
|
try {
|
|
95
|
-
const p = JSON.parse(
|
|
107
|
+
const p = JSON.parse(userInput);
|
|
96
108
|
if (!!p && typeof p === 'object') {
|
|
109
|
+
let { messages } = p;
|
|
97
110
|
const { prompt, system } = p;
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
|
|
111
|
+
const result = [];
|
|
112
|
+
|
|
113
|
+
// prepend top-level system instruction if present
|
|
114
|
+
if (typeof system === 'string') {
|
|
115
|
+
result.push({ role: 'system', content: system });
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// stringified messages array
|
|
119
|
+
if (typeof messages === 'string') {
|
|
120
|
+
try {
|
|
121
|
+
messages = JSON.parse(messages);
|
|
122
|
+
} catch {
|
|
123
|
+
// ignore parse errors
|
|
105
124
|
}
|
|
106
|
-
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// messages array format: { messages: [...] }
|
|
128
|
+
if (Array.isArray(messages)) {
|
|
129
|
+
result.push(...filterMessagesArray(messages));
|
|
130
|
+
return result;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// prompt array format: { prompt: [...] }
|
|
134
|
+
if (Array.isArray(prompt)) {
|
|
135
|
+
result.push(...filterMessagesArray(prompt));
|
|
136
|
+
return result;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// prompt string format: { prompt: "..." }
|
|
140
|
+
if (typeof prompt === 'string') {
|
|
141
|
+
result.push({ role: 'user', content: prompt });
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
if (result.length > 0) {
|
|
145
|
+
return result;
|
|
107
146
|
}
|
|
108
147
|
}
|
|
109
148
|
// eslint-disable-next-line no-empty
|
|
@@ -116,17 +155,17 @@ function convertPromptToMessages(prompt) {
|
|
|
116
155
|
* invoke_agent op
|
|
117
156
|
*/
|
|
118
157
|
function requestMessagesFromPrompt(span, attributes) {
|
|
119
|
-
if (attributes[AI_PROMPT_ATTRIBUTE]) {
|
|
120
|
-
const truncatedPrompt = getTruncatedJsonString(attributes[AI_PROMPT_ATTRIBUTE] );
|
|
121
|
-
span.setAttribute('gen_ai.prompt', truncatedPrompt);
|
|
122
|
-
}
|
|
123
|
-
const prompt = attributes[AI_PROMPT_ATTRIBUTE];
|
|
124
158
|
if (
|
|
125
|
-
typeof
|
|
159
|
+
typeof attributes[AI_PROMPT_ATTRIBUTE] === 'string' &&
|
|
126
160
|
!attributes[GEN_AI_INPUT_MESSAGES_ATTRIBUTE] &&
|
|
127
161
|
!attributes[AI_PROMPT_MESSAGES_ATTRIBUTE]
|
|
128
162
|
) {
|
|
129
|
-
|
|
163
|
+
// No messages array is present, so we need to convert the prompt to the proper messages format
|
|
164
|
+
// This is the case for ai.generateText spans
|
|
165
|
+
// The ai.prompt attribute is a stringified object with prompt, system, messages attributes
|
|
166
|
+
// The format of these is described in the vercel docs, for instance: https://ai-sdk.dev/docs/reference/ai-sdk-core/stream-object#parameters
|
|
167
|
+
const userInput = attributes[AI_PROMPT_ATTRIBUTE];
|
|
168
|
+
const messages = convertUserInputToMessagesFormat(userInput);
|
|
130
169
|
if (messages.length) {
|
|
131
170
|
const { systemInstructions, filteredMessages } = extractSystemInstructions(messages);
|
|
132
171
|
|
|
@@ -135,12 +174,17 @@ function requestMessagesFromPrompt(span, attributes) {
|
|
|
135
174
|
}
|
|
136
175
|
|
|
137
176
|
const filteredLength = Array.isArray(filteredMessages) ? filteredMessages.length : 0;
|
|
177
|
+
const truncatedMessages = getTruncatedJsonString(filteredMessages);
|
|
178
|
+
|
|
138
179
|
span.setAttributes({
|
|
139
|
-
[
|
|
180
|
+
[AI_PROMPT_ATTRIBUTE]: truncatedMessages,
|
|
181
|
+
[GEN_AI_INPUT_MESSAGES_ATTRIBUTE]: truncatedMessages,
|
|
140
182
|
[GEN_AI_INPUT_MESSAGES_ORIGINAL_LENGTH_ATTRIBUTE]: filteredLength,
|
|
141
183
|
});
|
|
142
184
|
}
|
|
143
185
|
} else if (typeof attributes[AI_PROMPT_MESSAGES_ATTRIBUTE] === 'string') {
|
|
186
|
+
// In this case we already get a properly formatted messages array, this is the preferred way to get the messages
|
|
187
|
+
// This is the case for ai.generateText.doGenerate spans
|
|
144
188
|
try {
|
|
145
189
|
const messages = JSON.parse(attributes[AI_PROMPT_MESSAGES_ATTRIBUTE]);
|
|
146
190
|
if (Array.isArray(messages)) {
|
|
@@ -151,9 +195,11 @@ function requestMessagesFromPrompt(span, attributes) {
|
|
|
151
195
|
}
|
|
152
196
|
|
|
153
197
|
const filteredLength = Array.isArray(filteredMessages) ? filteredMessages.length : 0;
|
|
198
|
+
const truncatedMessages = getTruncatedJsonString(filteredMessages);
|
|
199
|
+
|
|
154
200
|
span.setAttributes({
|
|
155
|
-
[AI_PROMPT_MESSAGES_ATTRIBUTE]:
|
|
156
|
-
[GEN_AI_INPUT_MESSAGES_ATTRIBUTE]:
|
|
201
|
+
[AI_PROMPT_MESSAGES_ATTRIBUTE]: truncatedMessages,
|
|
202
|
+
[GEN_AI_INPUT_MESSAGES_ATTRIBUTE]: truncatedMessages,
|
|
157
203
|
[GEN_AI_INPUT_MESSAGES_ORIGINAL_LENGTH_ATTRIBUTE]: filteredLength,
|
|
158
204
|
});
|
|
159
205
|
}
|
|
@@ -173,6 +219,7 @@ function getSpanOpFromName(name) {
|
|
|
173
219
|
case 'ai.streamObject':
|
|
174
220
|
case 'ai.embed':
|
|
175
221
|
case 'ai.embedMany':
|
|
222
|
+
case 'ai.rerank':
|
|
176
223
|
return GEN_AI_INVOKE_AGENT_OPERATION_ATTRIBUTE;
|
|
177
224
|
case 'ai.generateText.doGenerate':
|
|
178
225
|
return GEN_AI_GENERATE_TEXT_DO_GENERATE_OPERATION_ATTRIBUTE;
|
|
@@ -186,6 +233,8 @@ function getSpanOpFromName(name) {
|
|
|
186
233
|
return GEN_AI_EMBED_DO_EMBED_OPERATION_ATTRIBUTE;
|
|
187
234
|
case 'ai.embedMany.doEmbed':
|
|
188
235
|
return GEN_AI_EMBED_MANY_DO_EMBED_OPERATION_ATTRIBUTE;
|
|
236
|
+
case 'ai.rerank.doRerank':
|
|
237
|
+
return GEN_AI_RERANK_DO_RERANK_OPERATION_ATTRIBUTE;
|
|
189
238
|
case 'ai.toolCall':
|
|
190
239
|
return GEN_AI_EXECUTE_TOOL_OPERATION_ATTRIBUTE;
|
|
191
240
|
default:
|
|
@@ -196,5 +245,5 @@ function getSpanOpFromName(name) {
|
|
|
196
245
|
}
|
|
197
246
|
}
|
|
198
247
|
|
|
199
|
-
export { _INTERNAL_cleanupToolCallSpan, _INTERNAL_getSpanForToolCallId, accumulateTokensForParent, applyAccumulatedTokens, convertAvailableToolsToJsonString,
|
|
248
|
+
export { _INTERNAL_cleanupToolCallSpan, _INTERNAL_getSpanForToolCallId, accumulateTokensForParent, applyAccumulatedTokens, convertAvailableToolsToJsonString, convertUserInputToMessagesFormat, getSpanOpFromName, requestMessagesFromPrompt };
|
|
200
249
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../../../../src/tracing/vercel-ai/utils.ts"],"sourcesContent":["import type { TraceContext } from '../../types-hoist/context';\nimport type { Span, SpanAttributes, SpanJSON } from '../../types-hoist/span';\nimport {\n GEN_AI_EMBED_DO_EMBED_OPERATION_ATTRIBUTE,\n GEN_AI_EMBED_MANY_DO_EMBED_OPERATION_ATTRIBUTE,\n GEN_AI_EXECUTE_TOOL_OPERATION_ATTRIBUTE,\n GEN_AI_GENERATE_OBJECT_DO_GENERATE_OPERATION_ATTRIBUTE,\n GEN_AI_GENERATE_TEXT_DO_GENERATE_OPERATION_ATTRIBUTE,\n GEN_AI_INPUT_MESSAGES_ATTRIBUTE,\n GEN_AI_INPUT_MESSAGES_ORIGINAL_LENGTH_ATTRIBUTE,\n GEN_AI_INVOKE_AGENT_OPERATION_ATTRIBUTE,\n GEN_AI_STREAM_OBJECT_DO_STREAM_OPERATION_ATTRIBUTE,\n GEN_AI_STREAM_TEXT_DO_STREAM_OPERATION_ATTRIBUTE,\n GEN_AI_SYSTEM_INSTRUCTIONS_ATTRIBUTE,\n GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE,\n GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE,\n} from '../ai/gen-ai-attributes';\nimport { extractSystemInstructions, getTruncatedJsonString } from '../ai/utils';\nimport { toolCallSpanMap } from './constants';\nimport type { TokenSummary } from './types';\nimport { AI_PROMPT_ATTRIBUTE, AI_PROMPT_MESSAGES_ATTRIBUTE } from './vercel-ai-attributes';\n\n/**\n * Accumulates token data from a span to its parent in the token accumulator map.\n * This function extracts token usage from the current span and adds it to the\n * accumulated totals for its parent span.\n */\nexport function accumulateTokensForParent(span: SpanJSON, tokenAccumulator: Map<string, TokenSummary>): void {\n const parentSpanId = span.parent_span_id;\n if (!parentSpanId) {\n return;\n }\n\n const inputTokens = span.data[GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE];\n const outputTokens = span.data[GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE];\n\n if (typeof inputTokens === 'number' || typeof outputTokens === 'number') {\n const existing = tokenAccumulator.get(parentSpanId) || { inputTokens: 0, outputTokens: 0 };\n\n if (typeof inputTokens === 'number') {\n existing.inputTokens += inputTokens;\n }\n if (typeof outputTokens === 'number') {\n existing.outputTokens += outputTokens;\n }\n\n tokenAccumulator.set(parentSpanId, existing);\n }\n}\n\n/**\n * Applies accumulated token data to the `gen_ai.invoke_agent` span.\n * Only immediate children of the `gen_ai.invoke_agent` span are considered,\n * since aggregation will automatically occur for each parent span.\n */\nexport function applyAccumulatedTokens(\n spanOrTrace: SpanJSON | TraceContext,\n tokenAccumulator: Map<string, TokenSummary>,\n): void {\n const accumulated = tokenAccumulator.get(spanOrTrace.span_id);\n if (!accumulated || !spanOrTrace.data) {\n return;\n }\n\n if (accumulated.inputTokens > 0) {\n spanOrTrace.data[GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE] = accumulated.inputTokens;\n }\n if (accumulated.outputTokens > 0) {\n spanOrTrace.data[GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE] = accumulated.outputTokens;\n }\n if (accumulated.inputTokens > 0 || accumulated.outputTokens > 0) {\n spanOrTrace.data['gen_ai.usage.total_tokens'] = accumulated.inputTokens + accumulated.outputTokens;\n }\n}\n\n/**\n * Get the span associated with a tool call ID\n */\nexport function _INTERNAL_getSpanForToolCallId(toolCallId: string): Span | undefined {\n return toolCallSpanMap.get(toolCallId);\n}\n\n/**\n * Clean up the span mapping for a tool call ID\n */\nexport function _INTERNAL_cleanupToolCallSpan(toolCallId: string): void {\n toolCallSpanMap.delete(toolCallId);\n}\n\n/**\n * Convert an array of tool strings to a JSON string\n */\nexport function convertAvailableToolsToJsonString(tools: unknown[]): string {\n const toolObjects = tools.map(tool => {\n if (typeof tool === 'string') {\n try {\n return JSON.parse(tool);\n } catch {\n return tool;\n }\n }\n return tool;\n });\n return JSON.stringify(toolObjects);\n}\n\n/**\n * Convert the prompt string to messages array\n */\nexport function convertPromptToMessages(prompt: string): { role: string; content: string }[] {\n try {\n const p = JSON.parse(prompt);\n if (!!p && typeof p === 'object') {\n const { prompt, system } = p;\n if (typeof prompt === 'string' || typeof system === 'string') {\n const messages: { role: string; content: string }[] = [];\n if (typeof system === 'string') {\n messages.push({ role: 'system', content: system });\n }\n if (typeof prompt === 'string') {\n messages.push({ role: 'user', content: prompt });\n }\n return messages;\n }\n }\n // eslint-disable-next-line no-empty\n } catch {}\n return [];\n}\n\n/**\n * Generate a request.messages JSON array from the prompt field in the\n * invoke_agent op\n */\nexport function requestMessagesFromPrompt(span: Span, attributes: SpanAttributes): void {\n if (attributes[AI_PROMPT_ATTRIBUTE]) {\n const truncatedPrompt = getTruncatedJsonString(attributes[AI_PROMPT_ATTRIBUTE] as string | string[]);\n span.setAttribute('gen_ai.prompt', truncatedPrompt);\n }\n const prompt = attributes[AI_PROMPT_ATTRIBUTE];\n if (\n typeof prompt === 'string' &&\n !attributes[GEN_AI_INPUT_MESSAGES_ATTRIBUTE] &&\n !attributes[AI_PROMPT_MESSAGES_ATTRIBUTE]\n ) {\n const messages = convertPromptToMessages(prompt);\n if (messages.length) {\n const { systemInstructions, filteredMessages } = extractSystemInstructions(messages);\n\n if (systemInstructions) {\n span.setAttribute(GEN_AI_SYSTEM_INSTRUCTIONS_ATTRIBUTE, systemInstructions);\n }\n\n const filteredLength = Array.isArray(filteredMessages) ? filteredMessages.length : 0;\n span.setAttributes({\n [GEN_AI_INPUT_MESSAGES_ATTRIBUTE]: getTruncatedJsonString(filteredMessages),\n [GEN_AI_INPUT_MESSAGES_ORIGINAL_LENGTH_ATTRIBUTE]: filteredLength,\n });\n }\n } else if (typeof attributes[AI_PROMPT_MESSAGES_ATTRIBUTE] === 'string') {\n try {\n const messages = JSON.parse(attributes[AI_PROMPT_MESSAGES_ATTRIBUTE]);\n if (Array.isArray(messages)) {\n const { systemInstructions, filteredMessages } = extractSystemInstructions(messages);\n\n if (systemInstructions) {\n span.setAttribute(GEN_AI_SYSTEM_INSTRUCTIONS_ATTRIBUTE, systemInstructions);\n }\n\n const filteredLength = Array.isArray(filteredMessages) ? filteredMessages.length : 0;\n span.setAttributes({\n [AI_PROMPT_MESSAGES_ATTRIBUTE]: undefined,\n [GEN_AI_INPUT_MESSAGES_ATTRIBUTE]: getTruncatedJsonString(filteredMessages),\n [GEN_AI_INPUT_MESSAGES_ORIGINAL_LENGTH_ATTRIBUTE]: filteredLength,\n });\n }\n // eslint-disable-next-line no-empty\n } catch {}\n }\n}\n\n/**\n * Maps a Vercel AI span name to the corresponding Sentry op.\n */\nexport function getSpanOpFromName(name: string): string | undefined {\n switch (name) {\n case 'ai.generateText':\n case 'ai.streamText':\n case 'ai.generateObject':\n case 'ai.streamObject':\n case 'ai.embed':\n case 'ai.embedMany':\n return GEN_AI_INVOKE_AGENT_OPERATION_ATTRIBUTE;\n case 'ai.generateText.doGenerate':\n return GEN_AI_GENERATE_TEXT_DO_GENERATE_OPERATION_ATTRIBUTE;\n case 'ai.streamText.doStream':\n return GEN_AI_STREAM_TEXT_DO_STREAM_OPERATION_ATTRIBUTE;\n case 'ai.generateObject.doGenerate':\n return GEN_AI_GENERATE_OBJECT_DO_GENERATE_OPERATION_ATTRIBUTE;\n case 'ai.streamObject.doStream':\n return GEN_AI_STREAM_OBJECT_DO_STREAM_OPERATION_ATTRIBUTE;\n case 'ai.embed.doEmbed':\n return GEN_AI_EMBED_DO_EMBED_OPERATION_ATTRIBUTE;\n case 'ai.embedMany.doEmbed':\n return GEN_AI_EMBED_MANY_DO_EMBED_OPERATION_ATTRIBUTE;\n case 'ai.toolCall':\n return GEN_AI_EXECUTE_TOOL_OPERATION_ATTRIBUTE;\n default:\n if (name.startsWith('ai.stream')) {\n return 'ai.run';\n }\n return undefined;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../../src/tracing/vercel-ai/utils.ts"],"sourcesContent":["import type { TraceContext } from '../../types-hoist/context';\nimport type { Span, SpanAttributes, SpanJSON } from '../../types-hoist/span';\nimport {\n GEN_AI_EMBED_DO_EMBED_OPERATION_ATTRIBUTE,\n GEN_AI_EMBED_MANY_DO_EMBED_OPERATION_ATTRIBUTE,\n GEN_AI_EXECUTE_TOOL_OPERATION_ATTRIBUTE,\n GEN_AI_GENERATE_OBJECT_DO_GENERATE_OPERATION_ATTRIBUTE,\n GEN_AI_GENERATE_TEXT_DO_GENERATE_OPERATION_ATTRIBUTE,\n GEN_AI_INPUT_MESSAGES_ATTRIBUTE,\n GEN_AI_INPUT_MESSAGES_ORIGINAL_LENGTH_ATTRIBUTE,\n GEN_AI_INVOKE_AGENT_OPERATION_ATTRIBUTE,\n GEN_AI_RERANK_DO_RERANK_OPERATION_ATTRIBUTE,\n GEN_AI_STREAM_OBJECT_DO_STREAM_OPERATION_ATTRIBUTE,\n GEN_AI_STREAM_TEXT_DO_STREAM_OPERATION_ATTRIBUTE,\n GEN_AI_SYSTEM_INSTRUCTIONS_ATTRIBUTE,\n GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE,\n GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE,\n} from '../ai/gen-ai-attributes';\nimport { extractSystemInstructions, getTruncatedJsonString } from '../ai/utils';\nimport { toolCallSpanMap } from './constants';\nimport type { TokenSummary } from './types';\nimport { AI_PROMPT_ATTRIBUTE, AI_PROMPT_MESSAGES_ATTRIBUTE } from './vercel-ai-attributes';\n\n/**\n * Accumulates token data from a span to its parent in the token accumulator map.\n * This function extracts token usage from the current span and adds it to the\n * accumulated totals for its parent span.\n */\nexport function accumulateTokensForParent(span: SpanJSON, tokenAccumulator: Map<string, TokenSummary>): void {\n const parentSpanId = span.parent_span_id;\n if (!parentSpanId) {\n return;\n }\n\n const inputTokens = span.data[GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE];\n const outputTokens = span.data[GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE];\n\n if (typeof inputTokens === 'number' || typeof outputTokens === 'number') {\n const existing = tokenAccumulator.get(parentSpanId) || { inputTokens: 0, outputTokens: 0 };\n\n if (typeof inputTokens === 'number') {\n existing.inputTokens += inputTokens;\n }\n if (typeof outputTokens === 'number') {\n existing.outputTokens += outputTokens;\n }\n\n tokenAccumulator.set(parentSpanId, existing);\n }\n}\n\n/**\n * Applies accumulated token data to the `gen_ai.invoke_agent` span.\n * Only immediate children of the `gen_ai.invoke_agent` span are considered,\n * since aggregation will automatically occur for each parent span.\n */\nexport function applyAccumulatedTokens(\n spanOrTrace: SpanJSON | TraceContext,\n tokenAccumulator: Map<string, TokenSummary>,\n): void {\n const accumulated = tokenAccumulator.get(spanOrTrace.span_id);\n if (!accumulated || !spanOrTrace.data) {\n return;\n }\n\n if (accumulated.inputTokens > 0) {\n spanOrTrace.data[GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE] = accumulated.inputTokens;\n }\n if (accumulated.outputTokens > 0) {\n spanOrTrace.data[GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE] = accumulated.outputTokens;\n }\n if (accumulated.inputTokens > 0 || accumulated.outputTokens > 0) {\n spanOrTrace.data['gen_ai.usage.total_tokens'] = accumulated.inputTokens + accumulated.outputTokens;\n }\n}\n\n/**\n * Get the span associated with a tool call ID\n */\nexport function _INTERNAL_getSpanForToolCallId(toolCallId: string): Span | undefined {\n return toolCallSpanMap.get(toolCallId);\n}\n\n/**\n * Clean up the span mapping for a tool call ID\n */\nexport function _INTERNAL_cleanupToolCallSpan(toolCallId: string): void {\n toolCallSpanMap.delete(toolCallId);\n}\n\n/**\n * Convert an array of tool strings to a JSON string\n */\nexport function convertAvailableToolsToJsonString(tools: unknown[]): string {\n const toolObjects = tools.map(tool => {\n if (typeof tool === 'string') {\n try {\n return JSON.parse(tool);\n } catch {\n return tool;\n }\n }\n return tool;\n });\n return JSON.stringify(toolObjects);\n}\n\n/**\n * Filter out invalid entries in messages array\n * @param input - The input array to filter\n * @returns The filtered array\n */\nfunction filterMessagesArray(input: unknown[]): { role: string; content: string }[] {\n return input.filter(\n (m: unknown): m is { role: string; content: string } =>\n !!m && typeof m === 'object' && 'role' in m && 'content' in m,\n );\n}\n\n/**\n * Normalize the user input (stringified object with prompt, system, messages) to messages array\n */\nexport function convertUserInputToMessagesFormat(userInput: string): { role: string; content: string }[] {\n try {\n const p = JSON.parse(userInput);\n if (!!p && typeof p === 'object') {\n let { messages } = p;\n const { prompt, system } = p;\n const result: { role: string; content: string }[] = [];\n\n // prepend top-level system instruction if present\n if (typeof system === 'string') {\n result.push({ role: 'system', content: system });\n }\n\n // stringified messages array\n if (typeof messages === 'string') {\n try {\n messages = JSON.parse(messages);\n } catch {\n // ignore parse errors\n }\n }\n\n // messages array format: { messages: [...] }\n if (Array.isArray(messages)) {\n result.push(...filterMessagesArray(messages));\n return result;\n }\n\n // prompt array format: { prompt: [...] }\n if (Array.isArray(prompt)) {\n result.push(...filterMessagesArray(prompt));\n return result;\n }\n\n // prompt string format: { prompt: \"...\" }\n if (typeof prompt === 'string') {\n result.push({ role: 'user', content: prompt });\n }\n\n if (result.length > 0) {\n return result;\n }\n }\n // eslint-disable-next-line no-empty\n } catch {}\n return [];\n}\n\n/**\n * Generate a request.messages JSON array from the prompt field in the\n * invoke_agent op\n */\nexport function requestMessagesFromPrompt(span: Span, attributes: SpanAttributes): void {\n if (\n typeof attributes[AI_PROMPT_ATTRIBUTE] === 'string' &&\n !attributes[GEN_AI_INPUT_MESSAGES_ATTRIBUTE] &&\n !attributes[AI_PROMPT_MESSAGES_ATTRIBUTE]\n ) {\n // No messages array is present, so we need to convert the prompt to the proper messages format\n // This is the case for ai.generateText spans\n // The ai.prompt attribute is a stringified object with prompt, system, messages attributes\n // The format of these is described in the vercel docs, for instance: https://ai-sdk.dev/docs/reference/ai-sdk-core/stream-object#parameters\n const userInput = attributes[AI_PROMPT_ATTRIBUTE];\n const messages = convertUserInputToMessagesFormat(userInput);\n if (messages.length) {\n const { systemInstructions, filteredMessages } = extractSystemInstructions(messages);\n\n if (systemInstructions) {\n span.setAttribute(GEN_AI_SYSTEM_INSTRUCTIONS_ATTRIBUTE, systemInstructions);\n }\n\n const filteredLength = Array.isArray(filteredMessages) ? filteredMessages.length : 0;\n const truncatedMessages = getTruncatedJsonString(filteredMessages);\n\n span.setAttributes({\n [AI_PROMPT_ATTRIBUTE]: truncatedMessages,\n [GEN_AI_INPUT_MESSAGES_ATTRIBUTE]: truncatedMessages,\n [GEN_AI_INPUT_MESSAGES_ORIGINAL_LENGTH_ATTRIBUTE]: filteredLength,\n });\n }\n } else if (typeof attributes[AI_PROMPT_MESSAGES_ATTRIBUTE] === 'string') {\n // In this case we already get a properly formatted messages array, this is the preferred way to get the messages\n // This is the case for ai.generateText.doGenerate spans\n try {\n const messages = JSON.parse(attributes[AI_PROMPT_MESSAGES_ATTRIBUTE]);\n if (Array.isArray(messages)) {\n const { systemInstructions, filteredMessages } = extractSystemInstructions(messages);\n\n if (systemInstructions) {\n span.setAttribute(GEN_AI_SYSTEM_INSTRUCTIONS_ATTRIBUTE, systemInstructions);\n }\n\n const filteredLength = Array.isArray(filteredMessages) ? filteredMessages.length : 0;\n const truncatedMessages = getTruncatedJsonString(filteredMessages);\n\n span.setAttributes({\n [AI_PROMPT_MESSAGES_ATTRIBUTE]: truncatedMessages,\n [GEN_AI_INPUT_MESSAGES_ATTRIBUTE]: truncatedMessages,\n [GEN_AI_INPUT_MESSAGES_ORIGINAL_LENGTH_ATTRIBUTE]: filteredLength,\n });\n }\n // eslint-disable-next-line no-empty\n } catch {}\n }\n}\n\n/**\n * Maps a Vercel AI span name to the corresponding Sentry op.\n */\nexport function getSpanOpFromName(name: string): string | undefined {\n switch (name) {\n case 'ai.generateText':\n case 'ai.streamText':\n case 'ai.generateObject':\n case 'ai.streamObject':\n case 'ai.embed':\n case 'ai.embedMany':\n case 'ai.rerank':\n return GEN_AI_INVOKE_AGENT_OPERATION_ATTRIBUTE;\n case 'ai.generateText.doGenerate':\n return GEN_AI_GENERATE_TEXT_DO_GENERATE_OPERATION_ATTRIBUTE;\n case 'ai.streamText.doStream':\n return GEN_AI_STREAM_TEXT_DO_STREAM_OPERATION_ATTRIBUTE;\n case 'ai.generateObject.doGenerate':\n return GEN_AI_GENERATE_OBJECT_DO_GENERATE_OPERATION_ATTRIBUTE;\n case 'ai.streamObject.doStream':\n return GEN_AI_STREAM_OBJECT_DO_STREAM_OPERATION_ATTRIBUTE;\n case 'ai.embed.doEmbed':\n return GEN_AI_EMBED_DO_EMBED_OPERATION_ATTRIBUTE;\n case 'ai.embedMany.doEmbed':\n return GEN_AI_EMBED_MANY_DO_EMBED_OPERATION_ATTRIBUTE;\n case 'ai.rerank.doRerank':\n return GEN_AI_RERANK_DO_RERANK_OPERATION_ATTRIBUTE;\n case 'ai.toolCall':\n return GEN_AI_EXECUTE_TOOL_OPERATION_ATTRIBUTE;\n default:\n if (name.startsWith('ai.stream')) {\n return 'ai.run';\n }\n return undefined;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -57,9 +57,25 @@ function createTransport(
|
|
|
57
57
|
const requestTask = () =>
|
|
58
58
|
makeRequest({ body: serializeEnvelope(filteredEnvelope) }).then(
|
|
59
59
|
response => {
|
|
60
|
+
// Handle 413 Content Too Large
|
|
61
|
+
// Loss of envelope content is expected so we record a send_error client report
|
|
62
|
+
// https://develop.sentry.dev/sdk/expected-features/#dealing-with-network-failures
|
|
63
|
+
if (response.statusCode === 413) {
|
|
64
|
+
DEBUG_BUILD &&
|
|
65
|
+
debug.error(
|
|
66
|
+
'Sentry responded with status code 413. Envelope was discarded due to exceeding size limits.',
|
|
67
|
+
);
|
|
68
|
+
recordEnvelopeLoss('send_error');
|
|
69
|
+
return response;
|
|
70
|
+
}
|
|
71
|
+
|
|
60
72
|
// We don't want to throw on NOK responses, but we want to at least log them
|
|
61
|
-
if (
|
|
62
|
-
DEBUG_BUILD &&
|
|
73
|
+
if (
|
|
74
|
+
DEBUG_BUILD &&
|
|
75
|
+
response.statusCode !== undefined &&
|
|
76
|
+
(response.statusCode < 200 || response.statusCode >= 300)
|
|
77
|
+
) {
|
|
78
|
+
debug.warn(`Sentry responded with status code ${response.statusCode} to sent event.`);
|
|
63
79
|
}
|
|
64
80
|
|
|
65
81
|
rateLimits = updateRateLimits(rateLimits, response);
|