@sentry/core 10.47.0 → 10.49.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 +43 -0
- package/build/cjs/attributes.js.map +1 -1
- package/build/cjs/client.js +13 -6
- package/build/cjs/client.js.map +1 -1
- package/build/cjs/envelope.js +4 -3
- package/build/cjs/envelope.js.map +1 -1
- package/build/cjs/fetch.js +36 -17
- package/build/cjs/fetch.js.map +1 -1
- package/build/cjs/index.js +53 -18
- package/build/cjs/index.js.map +1 -1
- package/build/cjs/integration.js +6 -0
- package/build/cjs/integration.js.map +1 -1
- package/build/cjs/integrations/conversationId.js +11 -0
- package/build/cjs/integrations/conversationId.js.map +1 -1
- package/build/cjs/integrations/express/index.js +243 -0
- package/build/cjs/integrations/express/index.js.map +1 -0
- package/build/cjs/integrations/express/patch-layer.js +257 -0
- package/build/cjs/integrations/express/patch-layer.js.map +1 -0
- package/build/cjs/integrations/express/request-layer-store.js +25 -0
- package/build/cjs/integrations/express/request-layer-store.js.map +1 -0
- package/build/cjs/integrations/express/set-sdk-processing-metadata.js +17 -0
- package/build/cjs/integrations/express/set-sdk-processing-metadata.js.map +1 -0
- package/build/cjs/integrations/express/types.js +17 -0
- package/build/cjs/integrations/express/types.js.map +1 -0
- package/build/cjs/integrations/express/utils.js +238 -0
- package/build/cjs/integrations/express/utils.js.map +1 -0
- package/build/cjs/integrations/mcp-server/correlation.js +5 -1
- package/build/cjs/integrations/mcp-server/correlation.js.map +1 -1
- package/build/cjs/integrations/mcp-server/handlers.js +18 -10
- package/build/cjs/integrations/mcp-server/handlers.js.map +1 -1
- package/build/cjs/integrations/mcp-server/index.js +2 -1
- package/build/cjs/integrations/mcp-server/index.js.map +1 -1
- package/build/cjs/integrations/mcp-server/transport.js +1 -1
- package/build/cjs/integrations/mcp-server/transport.js.map +1 -1
- package/build/cjs/integrations/mcp-server/validation.js +7 -5
- package/build/cjs/integrations/mcp-server/validation.js.map +1 -1
- package/build/cjs/integrations/requestdata.js.map +1 -1
- package/build/cjs/integrations/spanStreaming.js +48 -0
- package/build/cjs/integrations/spanStreaming.js.map +1 -0
- package/build/cjs/semanticAttributes.js +35 -3
- package/build/cjs/semanticAttributes.js.map +1 -1
- package/build/cjs/tracing/ai/gen-ai-attributes.js +3 -89
- package/build/cjs/tracing/ai/gen-ai-attributes.js.map +1 -1
- package/build/cjs/tracing/ai/utils.js +74 -0
- package/build/cjs/tracing/ai/utils.js.map +1 -1
- package/build/cjs/tracing/anthropic-ai/index.js +6 -17
- package/build/cjs/tracing/anthropic-ai/index.js.map +1 -1
- package/build/cjs/tracing/anthropic-ai/streaming.js +2 -100
- package/build/cjs/tracing/anthropic-ai/streaming.js.map +1 -1
- package/build/cjs/tracing/anthropic-ai/utils.js +4 -2
- package/build/cjs/tracing/anthropic-ai/utils.js.map +1 -1
- package/build/cjs/tracing/dynamicSamplingContext.js +2 -1
- package/build/cjs/tracing/dynamicSamplingContext.js.map +1 -1
- package/build/cjs/tracing/google-genai/constants.js +1 -6
- package/build/cjs/tracing/google-genai/constants.js.map +1 -1
- package/build/cjs/tracing/google-genai/index.js +40 -35
- package/build/cjs/tracing/google-genai/index.js.map +1 -1
- package/build/cjs/tracing/google-genai/streaming.js +2 -23
- package/build/cjs/tracing/google-genai/streaming.js.map +1 -1
- package/build/cjs/tracing/langchain/embeddings.js +132 -0
- package/build/cjs/tracing/langchain/embeddings.js.map +1 -0
- package/build/cjs/tracing/langchain/index.js +3 -0
- package/build/cjs/tracing/langchain/index.js.map +1 -1
- package/build/cjs/tracing/langchain/utils.js +12 -4
- package/build/cjs/tracing/langchain/utils.js.map +1 -1
- package/build/cjs/tracing/langgraph/index.js +4 -3
- package/build/cjs/tracing/langgraph/index.js.map +1 -1
- package/build/cjs/tracing/openai/index.js +14 -34
- package/build/cjs/tracing/openai/index.js.map +1 -1
- package/build/cjs/tracing/openai/streaming.js +3 -34
- package/build/cjs/tracing/openai/streaming.js.map +1 -1
- package/build/cjs/tracing/openai/utils.js +78 -204
- package/build/cjs/tracing/openai/utils.js.map +1 -1
- package/build/cjs/tracing/sentryNonRecordingSpan.js +7 -0
- package/build/cjs/tracing/sentryNonRecordingSpan.js.map +1 -1
- package/build/cjs/tracing/sentrySpan.js +39 -0
- package/build/cjs/tracing/sentrySpan.js.map +1 -1
- package/build/cjs/tracing/spans/beforeSendSpan.js +43 -0
- package/build/cjs/tracing/spans/beforeSendSpan.js.map +1 -0
- package/build/cjs/tracing/spans/captureSpan.js +126 -0
- package/build/cjs/tracing/spans/captureSpan.js.map +1 -0
- package/build/cjs/tracing/spans/envelope.js +38 -0
- package/build/cjs/tracing/spans/envelope.js.map +1 -0
- package/build/cjs/tracing/spans/estimateSize.js +41 -0
- package/build/cjs/tracing/spans/estimateSize.js.map +1 -0
- package/build/cjs/tracing/spans/hasSpanStreamingEnabled.js +11 -0
- package/build/cjs/tracing/spans/hasSpanStreamingEnabled.js.map +1 -0
- package/build/cjs/tracing/spans/spanBuffer.js +158 -0
- package/build/cjs/tracing/spans/spanBuffer.js.map +1 -0
- package/build/cjs/tracing/trace.js +83 -13
- package/build/cjs/tracing/trace.js.map +1 -1
- package/build/cjs/tracing/utils.js +3 -37
- package/build/cjs/tracing/utils.js.map +1 -1
- package/build/cjs/tracing/vercel-ai/constants.js +15 -23
- package/build/cjs/tracing/vercel-ai/constants.js.map +1 -1
- package/build/cjs/tracing/vercel-ai/index.js +32 -45
- package/build/cjs/tracing/vercel-ai/index.js.map +1 -1
- package/build/cjs/tracing/vercel-ai/utils.js +11 -42
- package/build/cjs/tracing/vercel-ai/utils.js.map +1 -1
- package/build/cjs/tracing/vercel-ai/vercel-ai-attributes.js +4 -1
- package/build/cjs/tracing/vercel-ai/vercel-ai-attributes.js.map +1 -1
- package/build/cjs/utils/browser.js +2 -3
- package/build/cjs/utils/browser.js.map +1 -1
- package/build/cjs/utils/featureFlags.js +6 -0
- package/build/cjs/utils/featureFlags.js.map +1 -1
- package/build/cjs/utils/object.js +33 -0
- package/build/cjs/utils/object.js.map +1 -1
- package/build/cjs/utils/spanUtils.js +116 -13
- package/build/cjs/utils/spanUtils.js.map +1 -1
- package/build/cjs/utils/stacktrace.js +3 -1
- package/build/cjs/utils/stacktrace.js.map +1 -1
- package/build/cjs/utils/string.js +3 -0
- package/build/cjs/utils/string.js.map +1 -1
- package/build/cjs/utils/version.js +1 -1
- package/build/cjs/utils/weakRef.js +62 -0
- package/build/cjs/utils/weakRef.js.map +1 -0
- package/build/esm/attributes.js +43 -1
- package/build/esm/attributes.js.map +1 -1
- package/build/esm/client.js +8 -1
- package/build/esm/client.js.map +1 -1
- package/build/esm/envelope.js +2 -1
- package/build/esm/envelope.js.map +1 -1
- package/build/esm/fetch.js +36 -17
- package/build/esm/fetch.js.map +1 -1
- package/build/esm/index.js +12 -3
- package/build/esm/index.js.map +1 -1
- package/build/esm/integration.js +6 -0
- package/build/esm/integration.js.map +1 -1
- package/build/esm/integrations/conversationId.js +11 -0
- package/build/esm/integrations/conversationId.js.map +1 -1
- package/build/esm/integrations/express/index.js +239 -0
- package/build/esm/integrations/express/index.js.map +1 -0
- package/build/esm/integrations/express/patch-layer.js +255 -0
- package/build/esm/integrations/express/patch-layer.js.map +1 -0
- package/build/esm/integrations/express/request-layer-store.js +22 -0
- package/build/esm/integrations/express/request-layer-store.js.map +1 -0
- package/build/esm/integrations/express/set-sdk-processing-metadata.js +15 -0
- package/build/esm/integrations/express/set-sdk-processing-metadata.js.map +1 -0
- package/build/esm/integrations/express/types.js +10 -0
- package/build/esm/integrations/express/types.js.map +1 -0
- package/build/esm/integrations/express/utils.js +225 -0
- package/build/esm/integrations/express/utils.js.map +1 -0
- package/build/esm/integrations/mcp-server/correlation.js +5 -1
- package/build/esm/integrations/mcp-server/correlation.js.map +1 -1
- package/build/esm/integrations/mcp-server/handlers.js +18 -10
- package/build/esm/integrations/mcp-server/handlers.js.map +1 -1
- package/build/esm/integrations/mcp-server/index.js +2 -1
- package/build/esm/integrations/mcp-server/index.js.map +1 -1
- package/build/esm/integrations/mcp-server/transport.js +1 -1
- package/build/esm/integrations/mcp-server/transport.js.map +1 -1
- package/build/esm/integrations/mcp-server/validation.js +7 -5
- package/build/esm/integrations/mcp-server/validation.js.map +1 -1
- package/build/esm/integrations/requestdata.js.map +1 -1
- package/build/esm/integrations/spanStreaming.js +46 -0
- package/build/esm/integrations/spanStreaming.js.map +1 -0
- package/build/esm/package.json +1 -1
- package/build/esm/semanticAttributes.js +26 -4
- package/build/esm/semanticAttributes.js.map +1 -1
- package/build/esm/tracing/ai/gen-ai-attributes.js +3 -76
- package/build/esm/tracing/ai/gen-ai-attributes.js.map +1 -1
- package/build/esm/tracing/ai/utils.js +73 -2
- package/build/esm/tracing/ai/utils.js.map +1 -1
- package/build/esm/tracing/anthropic-ai/index.js +8 -19
- package/build/esm/tracing/anthropic-ai/index.js.map +1 -1
- package/build/esm/tracing/anthropic-ai/streaming.js +3 -101
- package/build/esm/tracing/anthropic-ai/streaming.js.map +1 -1
- package/build/esm/tracing/anthropic-ai/utils.js +5 -3
- package/build/esm/tracing/anthropic-ai/utils.js.map +1 -1
- package/build/esm/tracing/dynamicSamplingContext.js +2 -1
- package/build/esm/tracing/dynamicSamplingContext.js.map +1 -1
- package/build/esm/tracing/google-genai/constants.js +2 -5
- package/build/esm/tracing/google-genai/constants.js.map +1 -1
- package/build/esm/tracing/google-genai/index.js +42 -37
- package/build/esm/tracing/google-genai/index.js.map +1 -1
- package/build/esm/tracing/google-genai/streaming.js +2 -23
- package/build/esm/tracing/google-genai/streaming.js.map +1 -1
- package/build/esm/tracing/langchain/embeddings.js +129 -0
- package/build/esm/tracing/langchain/embeddings.js.map +1 -0
- package/build/esm/tracing/langchain/index.js +4 -1
- package/build/esm/tracing/langchain/index.js.map +1 -1
- package/build/esm/tracing/langchain/utils.js +13 -5
- package/build/esm/tracing/langchain/utils.js.map +1 -1
- package/build/esm/tracing/langgraph/index.js +5 -4
- package/build/esm/tracing/langgraph/index.js.map +1 -1
- package/build/esm/tracing/openai/index.js +16 -36
- package/build/esm/tracing/openai/index.js.map +1 -1
- package/build/esm/tracing/openai/streaming.js +4 -35
- package/build/esm/tracing/openai/streaming.js.map +1 -1
- package/build/esm/tracing/openai/utils.js +79 -196
- package/build/esm/tracing/openai/utils.js.map +1 -1
- package/build/esm/tracing/sentryNonRecordingSpan.js +7 -0
- package/build/esm/tracing/sentryNonRecordingSpan.js.map +1 -1
- package/build/esm/tracing/sentrySpan.js +40 -1
- package/build/esm/tracing/sentrySpan.js.map +1 -1
- package/build/esm/tracing/spans/beforeSendSpan.js +40 -0
- package/build/esm/tracing/spans/beforeSendSpan.js.map +1 -0
- package/build/esm/tracing/spans/captureSpan.js +122 -0
- package/build/esm/tracing/spans/captureSpan.js.map +1 -0
- package/build/esm/tracing/spans/envelope.js +36 -0
- package/build/esm/tracing/spans/envelope.js.map +1 -0
- package/build/esm/tracing/spans/estimateSize.js +39 -0
- package/build/esm/tracing/spans/estimateSize.js.map +1 -0
- package/build/esm/tracing/spans/hasSpanStreamingEnabled.js +9 -0
- package/build/esm/tracing/spans/hasSpanStreamingEnabled.js.map +1 -0
- package/build/esm/tracing/spans/spanBuffer.js +156 -0
- package/build/esm/tracing/spans/spanBuffer.js.map +1 -0
- package/build/esm/tracing/trace.js +84 -14
- package/build/esm/tracing/trace.js.map +1 -1
- package/build/esm/tracing/utils.js +3 -37
- package/build/esm/tracing/utils.js.map +1 -1
- package/build/esm/tracing/vercel-ai/constants.js +15 -19
- package/build/esm/tracing/vercel-ai/constants.js.map +1 -1
- package/build/esm/tracing/vercel-ai/index.js +29 -42
- package/build/esm/tracing/vercel-ai/index.js.map +1 -1
- package/build/esm/tracing/vercel-ai/utils.js +14 -44
- package/build/esm/tracing/vercel-ai/utils.js.map +1 -1
- package/build/esm/tracing/vercel-ai/vercel-ai-attributes.js +4 -1
- package/build/esm/tracing/vercel-ai/vercel-ai-attributes.js.map +1 -1
- package/build/esm/utils/browser.js +2 -3
- package/build/esm/utils/browser.js.map +1 -1
- package/build/esm/utils/featureFlags.js +6 -0
- package/build/esm/utils/featureFlags.js.map +1 -1
- package/build/esm/utils/object.js +33 -1
- package/build/esm/utils/object.js.map +1 -1
- package/build/esm/utils/spanUtils.js +112 -14
- package/build/esm/utils/spanUtils.js.map +1 -1
- package/build/esm/utils/stacktrace.js +3 -1
- package/build/esm/utils/stacktrace.js.map +1 -1
- package/build/esm/utils/string.js +3 -0
- package/build/esm/utils/string.js.map +1 -1
- package/build/esm/utils/version.js +1 -1
- package/build/esm/utils/weakRef.js +59 -0
- package/build/esm/utils/weakRef.js.map +1 -0
- package/build/types/attributes.d.ts +5 -0
- package/build/types/attributes.d.ts.map +1 -1
- package/build/types/build-time-plugins/buildTimeOptionsBase.d.ts +13 -0
- package/build/types/build-time-plugins/buildTimeOptionsBase.d.ts.map +1 -1
- package/build/types/client.d.ts +35 -1
- package/build/types/client.d.ts.map +1 -1
- package/build/types/envelope.d.ts.map +1 -1
- package/build/types/fetch.d.ts +12 -8
- package/build/types/fetch.d.ts.map +1 -1
- package/build/types/index.d.ts +16 -5
- package/build/types/index.d.ts.map +1 -1
- package/build/types/integration.d.ts.map +1 -1
- package/build/types/integrations/conversationId.d.ts.map +1 -1
- package/build/types/integrations/express/index.d.ts +82 -0
- package/build/types/integrations/express/index.d.ts.map +1 -0
- package/build/types/integrations/express/patch-layer.d.ts +32 -0
- package/build/types/integrations/express/patch-layer.d.ts.map +1 -0
- package/build/types/integrations/express/request-layer-store.d.ts +32 -0
- package/build/types/integrations/express/request-layer-store.d.ts.map +1 -0
- package/build/types/integrations/express/set-sdk-processing-metadata.d.ts +35 -0
- package/build/types/integrations/express/set-sdk-processing-metadata.d.ts.map +1 -0
- package/build/types/integrations/express/types.d.ts +158 -0
- package/build/types/integrations/express/types.d.ts.map +1 -0
- package/build/types/integrations/express/utils.d.ts +93 -0
- package/build/types/integrations/express/utils.d.ts.map +1 -0
- package/build/types/integrations/mcp-server/correlation.d.ts +2 -1
- package/build/types/integrations/mcp-server/correlation.d.ts.map +1 -1
- package/build/types/integrations/mcp-server/handlers.d.ts +9 -4
- package/build/types/integrations/mcp-server/handlers.d.ts.map +1 -1
- package/build/types/integrations/mcp-server/index.d.ts +2 -1
- package/build/types/integrations/mcp-server/index.d.ts.map +1 -1
- package/build/types/integrations/mcp-server/types.d.ts +40 -7
- package/build/types/integrations/mcp-server/types.d.ts.map +1 -1
- package/build/types/integrations/mcp-server/validation.d.ts +4 -1
- package/build/types/integrations/mcp-server/validation.d.ts.map +1 -1
- package/build/types/integrations/requestdata.d.ts.map +1 -1
- package/build/types/integrations/spanStreaming.d.ts +2 -0
- package/build/types/integrations/spanStreaming.d.ts.map +1 -0
- package/build/types/semanticAttributes.d.ts +23 -3
- package/build/types/semanticAttributes.d.ts.map +1 -1
- package/build/types/tracing/ai/gen-ai-attributes.d.ts +4 -44
- package/build/types/tracing/ai/gen-ai-attributes.d.ts.map +1 -1
- package/build/types/tracing/ai/utils.d.ts +32 -2
- package/build/types/tracing/ai/utils.d.ts.map +1 -1
- package/build/types/tracing/anthropic-ai/index.d.ts.map +1 -1
- package/build/types/tracing/anthropic-ai/streaming.d.ts.map +1 -1
- package/build/types/tracing/anthropic-ai/types.d.ts +5 -0
- package/build/types/tracing/anthropic-ai/types.d.ts.map +1 -1
- package/build/types/tracing/anthropic-ai/utils.d.ts +1 -1
- package/build/types/tracing/anthropic-ai/utils.d.ts.map +1 -1
- package/build/types/tracing/dynamicSamplingContext.d.ts.map +1 -1
- package/build/types/tracing/google-genai/constants.d.ts +1 -3
- package/build/types/tracing/google-genai/constants.d.ts.map +1 -1
- package/build/types/tracing/google-genai/index.d.ts.map +1 -1
- package/build/types/tracing/google-genai/streaming.d.ts.map +1 -1
- package/build/types/tracing/google-genai/types.d.ts +5 -0
- package/build/types/tracing/google-genai/types.d.ts.map +1 -1
- package/build/types/tracing/index.d.ts +1 -0
- package/build/types/tracing/index.d.ts.map +1 -1
- package/build/types/tracing/langchain/embeddings.d.ts +27 -0
- package/build/types/tracing/langchain/embeddings.d.ts.map +1 -0
- package/build/types/tracing/langchain/index.d.ts +1 -0
- package/build/types/tracing/langchain/index.d.ts.map +1 -1
- package/build/types/tracing/langchain/types.d.ts +5 -0
- package/build/types/tracing/langchain/types.d.ts.map +1 -1
- package/build/types/tracing/langchain/utils.d.ts +2 -2
- package/build/types/tracing/langchain/utils.d.ts.map +1 -1
- package/build/types/tracing/langgraph/index.d.ts.map +1 -1
- package/build/types/tracing/langgraph/types.d.ts +5 -0
- package/build/types/tracing/langgraph/types.d.ts.map +1 -1
- package/build/types/tracing/openai/index.d.ts.map +1 -1
- package/build/types/tracing/openai/streaming.d.ts.map +1 -1
- package/build/types/tracing/openai/types.d.ts +5 -0
- package/build/types/tracing/openai/types.d.ts.map +1 -1
- package/build/types/tracing/openai/utils.d.ts +4 -49
- package/build/types/tracing/openai/utils.d.ts.map +1 -1
- package/build/types/tracing/sentryNonRecordingSpan.d.ts +12 -1
- package/build/types/tracing/sentryNonRecordingSpan.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/spans/beforeSendSpan.d.ts +35 -0
- package/build/types/tracing/spans/beforeSendSpan.d.ts.map +1 -0
- package/build/types/tracing/spans/captureSpan.d.ts +26 -0
- package/build/types/tracing/spans/captureSpan.d.ts.map +1 -0
- package/build/types/tracing/spans/envelope.d.ts +8 -0
- package/build/types/tracing/spans/envelope.d.ts.map +1 -0
- package/build/types/tracing/spans/estimateSize.d.ts +12 -0
- package/build/types/tracing/spans/estimateSize.d.ts.map +1 -0
- package/build/types/tracing/spans/hasSpanStreamingEnabled.d.ts +6 -0
- package/build/types/tracing/spans/hasSpanStreamingEnabled.d.ts.map +1 -0
- package/build/types/tracing/spans/spanBuffer.d.ts +60 -0
- package/build/types/tracing/spans/spanBuffer.d.ts.map +1 -0
- package/build/types/tracing/trace.d.ts.map +1 -1
- package/build/types/tracing/utils.d.ts.map +1 -1
- package/build/types/tracing/vercel-ai/constants.d.ts +2 -5
- 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 +1 -5
- package/build/types/tracing/vercel-ai/utils.d.ts.map +1 -1
- package/build/types/tracing/vercel-ai/vercel-ai-attributes.d.ts +0 -480
- package/build/types/tracing/vercel-ai/vercel-ai-attributes.d.ts.map +1 -1
- 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/integration.d.ts +8 -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 +26 -2
- package/build/types/types-hoist/options.d.ts.map +1 -1
- package/build/types/types-hoist/span.d.ts +35 -0
- package/build/types/types-hoist/span.d.ts.map +1 -1
- package/build/types/types-hoist/view-hierarchy.d.ts +1 -0
- package/build/types/types-hoist/view-hierarchy.d.ts.map +1 -1
- package/build/types/utils/browser.d.ts +1 -1
- package/build/types/utils/browser.d.ts.map +1 -1
- package/build/types/utils/featureFlags.d.ts.map +1 -1
- package/build/types/utils/object.d.ts +10 -0
- package/build/types/utils/object.d.ts.map +1 -1
- package/build/types/utils/spanUtils.d.ts +27 -2
- package/build/types/utils/spanUtils.d.ts.map +1 -1
- package/build/types/utils/stacktrace.d.ts.map +1 -1
- package/build/types/utils/string.d.ts +2 -2
- package/build/types/utils/string.d.ts.map +1 -1
- package/build/types/utils/weakRef.d.ts +34 -0
- package/build/types/utils/weakRef.d.ts.map +1 -0
- package/build/types-ts3.8/attributes.d.ts +5 -0
- package/build/types-ts3.8/build-time-plugins/buildTimeOptionsBase.d.ts +13 -0
- package/build/types-ts3.8/client.d.ts +35 -1
- package/build/types-ts3.8/fetch.d.ts +14 -10
- package/build/types-ts3.8/index.d.ts +16 -5
- package/build/types-ts3.8/integrations/express/index.d.ts +82 -0
- package/build/types-ts3.8/integrations/express/patch-layer.d.ts +32 -0
- package/build/types-ts3.8/integrations/express/request-layer-store.d.ts +32 -0
- package/build/types-ts3.8/integrations/express/set-sdk-processing-metadata.d.ts +35 -0
- package/build/types-ts3.8/integrations/express/types.d.ts +158 -0
- package/build/types-ts3.8/integrations/express/utils.d.ts +96 -0
- package/build/types-ts3.8/integrations/mcp-server/correlation.d.ts +2 -1
- package/build/types-ts3.8/integrations/mcp-server/handlers.d.ts +9 -4
- package/build/types-ts3.8/integrations/mcp-server/index.d.ts +2 -1
- package/build/types-ts3.8/integrations/mcp-server/types.d.ts +40 -7
- package/build/types-ts3.8/integrations/mcp-server/validation.d.ts +4 -1
- package/build/types-ts3.8/integrations/spanStreaming.d.ts +2 -0
- package/build/types-ts3.8/semanticAttributes.d.ts +23 -3
- package/build/types-ts3.8/tracing/ai/gen-ai-attributes.d.ts +4 -44
- package/build/types-ts3.8/tracing/ai/utils.d.ts +32 -2
- package/build/types-ts3.8/tracing/anthropic-ai/types.d.ts +5 -0
- package/build/types-ts3.8/tracing/anthropic-ai/utils.d.ts +1 -1
- package/build/types-ts3.8/tracing/google-genai/constants.d.ts +1 -3
- package/build/types-ts3.8/tracing/google-genai/types.d.ts +5 -0
- package/build/types-ts3.8/tracing/index.d.ts +1 -0
- package/build/types-ts3.8/tracing/langchain/embeddings.d.ts +27 -0
- package/build/types-ts3.8/tracing/langchain/index.d.ts +1 -0
- package/build/types-ts3.8/tracing/langchain/types.d.ts +5 -0
- package/build/types-ts3.8/tracing/langchain/utils.d.ts +2 -2
- package/build/types-ts3.8/tracing/langgraph/types.d.ts +5 -0
- package/build/types-ts3.8/tracing/openai/types.d.ts +5 -0
- package/build/types-ts3.8/tracing/openai/utils.d.ts +4 -49
- package/build/types-ts3.8/tracing/sentryNonRecordingSpan.d.ts +12 -1
- package/build/types-ts3.8/tracing/sentrySpan.d.ts +10 -1
- package/build/types-ts3.8/tracing/spans/beforeSendSpan.d.ts +35 -0
- package/build/types-ts3.8/tracing/spans/captureSpan.d.ts +26 -0
- package/build/types-ts3.8/tracing/spans/envelope.d.ts +8 -0
- package/build/types-ts3.8/tracing/spans/estimateSize.d.ts +12 -0
- package/build/types-ts3.8/tracing/spans/hasSpanStreamingEnabled.d.ts +6 -0
- package/build/types-ts3.8/tracing/spans/spanBuffer.d.ts +60 -0
- package/build/types-ts3.8/tracing/vercel-ai/constants.d.ts +2 -5
- package/build/types-ts3.8/tracing/vercel-ai/utils.d.ts +1 -5
- package/build/types-ts3.8/tracing/vercel-ai/vercel-ai-attributes.d.ts +0 -480
- package/build/types-ts3.8/types-hoist/envelope.d.ts +22 -2
- package/build/types-ts3.8/types-hoist/integration.d.ts +8 -0
- package/build/types-ts3.8/types-hoist/link.d.ts +2 -2
- package/build/types-ts3.8/types-hoist/options.d.ts +26 -2
- package/build/types-ts3.8/types-hoist/span.d.ts +35 -0
- package/build/types-ts3.8/types-hoist/view-hierarchy.d.ts +1 -0
- package/build/types-ts3.8/utils/browser.d.ts +1 -1
- package/build/types-ts3.8/utils/object.d.ts +10 -0
- package/build/types-ts3.8/utils/spanUtils.d.ts +27 -2
- package/build/types-ts3.8/utils/string.d.ts +2 -2
- package/build/types-ts3.8/utils/weakRef.d.ts +34 -0
- package/package.json +1 -1
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { captureException } from '../../exports.js';
|
|
2
2
|
import { SPAN_STATUS_ERROR } from '../spanstatus.js';
|
|
3
|
-
import {
|
|
4
|
-
import { setTokenUsageAttributes } from '../ai/utils.js';
|
|
3
|
+
import { endStreamSpan } from '../ai/utils.js';
|
|
5
4
|
import { mapAnthropicErrorToStatusMessage } from './utils.js';
|
|
6
5
|
|
|
7
6
|
/**
|
|
@@ -170,60 +169,6 @@ function processEvent(
|
|
|
170
169
|
handleContentBlockStop(event, state);
|
|
171
170
|
}
|
|
172
171
|
|
|
173
|
-
/**
|
|
174
|
-
* Finalizes span attributes when stream processing completes
|
|
175
|
-
*/
|
|
176
|
-
function finalizeStreamSpan(state, span, recordOutputs) {
|
|
177
|
-
if (!span.isRecording()) {
|
|
178
|
-
return;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
// Set common response attributes if available
|
|
182
|
-
if (state.responseId) {
|
|
183
|
-
span.setAttributes({
|
|
184
|
-
[GEN_AI_RESPONSE_ID_ATTRIBUTE]: state.responseId,
|
|
185
|
-
});
|
|
186
|
-
}
|
|
187
|
-
if (state.responseModel) {
|
|
188
|
-
span.setAttributes({
|
|
189
|
-
[GEN_AI_RESPONSE_MODEL_ATTRIBUTE]: state.responseModel,
|
|
190
|
-
});
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
setTokenUsageAttributes(
|
|
194
|
-
span,
|
|
195
|
-
state.promptTokens,
|
|
196
|
-
state.completionTokens,
|
|
197
|
-
state.cacheCreationInputTokens,
|
|
198
|
-
state.cacheReadInputTokens,
|
|
199
|
-
);
|
|
200
|
-
|
|
201
|
-
span.setAttributes({
|
|
202
|
-
[GEN_AI_RESPONSE_STREAMING_ATTRIBUTE]: true,
|
|
203
|
-
});
|
|
204
|
-
|
|
205
|
-
if (state.finishReasons.length > 0) {
|
|
206
|
-
span.setAttributes({
|
|
207
|
-
[GEN_AI_RESPONSE_FINISH_REASONS_ATTRIBUTE]: JSON.stringify(state.finishReasons),
|
|
208
|
-
});
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
if (recordOutputs && state.responseTexts.length > 0) {
|
|
212
|
-
span.setAttributes({
|
|
213
|
-
[GEN_AI_RESPONSE_TEXT_ATTRIBUTE]: state.responseTexts.join(''),
|
|
214
|
-
});
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
// Set tool calls if any were captured
|
|
218
|
-
if (recordOutputs && state.toolCalls.length > 0) {
|
|
219
|
-
span.setAttributes({
|
|
220
|
-
[GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE]: JSON.stringify(state.toolCalls),
|
|
221
|
-
});
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
span.end();
|
|
225
|
-
}
|
|
226
|
-
|
|
227
172
|
/**
|
|
228
173
|
* Instruments an async iterable stream of Anthropic events, updates the span with
|
|
229
174
|
* streaming attributes and (optionally) the aggregated output text, and yields
|
|
@@ -253,50 +198,7 @@ async function* instrumentAsyncIterableStream(
|
|
|
253
198
|
yield event;
|
|
254
199
|
}
|
|
255
200
|
} finally {
|
|
256
|
-
|
|
257
|
-
if (state.responseId) {
|
|
258
|
-
span.setAttributes({
|
|
259
|
-
[GEN_AI_RESPONSE_ID_ATTRIBUTE]: state.responseId,
|
|
260
|
-
});
|
|
261
|
-
}
|
|
262
|
-
if (state.responseModel) {
|
|
263
|
-
span.setAttributes({
|
|
264
|
-
[GEN_AI_RESPONSE_MODEL_ATTRIBUTE]: state.responseModel,
|
|
265
|
-
});
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
setTokenUsageAttributes(
|
|
269
|
-
span,
|
|
270
|
-
state.promptTokens,
|
|
271
|
-
state.completionTokens,
|
|
272
|
-
state.cacheCreationInputTokens,
|
|
273
|
-
state.cacheReadInputTokens,
|
|
274
|
-
);
|
|
275
|
-
|
|
276
|
-
span.setAttributes({
|
|
277
|
-
[GEN_AI_RESPONSE_STREAMING_ATTRIBUTE]: true,
|
|
278
|
-
});
|
|
279
|
-
|
|
280
|
-
if (state.finishReasons.length > 0) {
|
|
281
|
-
span.setAttributes({
|
|
282
|
-
[GEN_AI_RESPONSE_FINISH_REASONS_ATTRIBUTE]: JSON.stringify(state.finishReasons),
|
|
283
|
-
});
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
if (recordOutputs && state.responseTexts.length > 0) {
|
|
287
|
-
span.setAttributes({
|
|
288
|
-
[GEN_AI_RESPONSE_TEXT_ATTRIBUTE]: state.responseTexts.join(''),
|
|
289
|
-
});
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
// Set tool calls if any were captured
|
|
293
|
-
if (recordOutputs && state.toolCalls.length > 0) {
|
|
294
|
-
span.setAttributes({
|
|
295
|
-
[GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE]: JSON.stringify(state.toolCalls),
|
|
296
|
-
});
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
span.end();
|
|
201
|
+
endStreamSpan(span, state, recordOutputs);
|
|
300
202
|
}
|
|
301
203
|
}
|
|
302
204
|
|
|
@@ -328,7 +230,7 @@ function instrumentMessageStream(
|
|
|
328
230
|
// The event fired when a message is done being streamed by the API. Corresponds to the message_stop SSE event.
|
|
329
231
|
// @see https://github.com/anthropics/anthropic-sdk-typescript/blob/d3be31f5a4e6ebb4c0a2f65dbb8f381ae73a9166/helpers.md?plain=1#L42-L44
|
|
330
232
|
stream.on('message', () => {
|
|
331
|
-
|
|
233
|
+
endStreamSpan(span, state, recordOutputs);
|
|
332
234
|
});
|
|
333
235
|
|
|
334
236
|
stream.on('error', (error) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streaming.js","sources":["../../../../src/tracing/anthropic-ai/streaming.ts"],"sourcesContent":["import { captureException } from '../../exports';\nimport { SPAN_STATUS_ERROR } from '../../tracing';\nimport type { Span } from '../../types-hoist/span';\nimport {\n GEN_AI_RESPONSE_FINISH_REASONS_ATTRIBUTE,\n GEN_AI_RESPONSE_ID_ATTRIBUTE,\n GEN_AI_RESPONSE_MODEL_ATTRIBUTE,\n GEN_AI_RESPONSE_STREAMING_ATTRIBUTE,\n GEN_AI_RESPONSE_TEXT_ATTRIBUTE,\n GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE,\n} from '../ai/gen-ai-attributes';\nimport { setTokenUsageAttributes } from '../ai/utils';\nimport type { AnthropicAiStreamingEvent } from './types';\nimport { mapAnthropicErrorToStatusMessage } from './utils';\n\n/**\n * State object used to accumulate information from a stream of Anthropic AI events.\n */\ninterface StreamingState {\n /** Collected response text fragments (for output recording). */\n responseTexts: string[];\n /** Reasons for finishing the response, as reported by the API. */\n finishReasons: string[];\n /** The response ID. */\n responseId: string;\n /** The model name. */\n responseModel: string;\n /** Number of prompt/input tokens used. */\n promptTokens: number | undefined;\n /** Number of completion/output tokens used. */\n completionTokens: number | undefined;\n /** Number of cache creation input tokens used. */\n cacheCreationInputTokens: number | undefined;\n /** Number of cache read input tokens used. */\n cacheReadInputTokens: number | undefined;\n /** Accumulated tool calls (finalized) */\n toolCalls: Array<Record<string, unknown>>;\n /** In-progress tool call blocks keyed by index */\n activeToolBlocks: Record<\n number,\n {\n id?: string;\n name?: string;\n inputJsonParts: string[];\n }\n >;\n}\n\n/**\n * Checks if an event is an error event\n * @param event - The event to process\n * @param state - The state of the streaming process\n * @param recordOutputs - Whether to record outputs\n * @param span - The span to update\n * @returns Whether an error occurred\n */\n\nfunction isErrorEvent(event: AnthropicAiStreamingEvent, span: Span): boolean {\n if ('type' in event && typeof event.type === 'string') {\n // If the event is an error, set the span status and capture the error\n // These error events are not rejected by the API by default, but are sent as metadata of the response\n if (event.type === 'error') {\n span.setStatus({ code: SPAN_STATUS_ERROR, message: mapAnthropicErrorToStatusMessage(event.error?.type) });\n captureException(event.error, {\n mechanism: {\n handled: false,\n type: 'auto.ai.anthropic.anthropic_error',\n },\n });\n return true;\n }\n }\n return false;\n}\n\n/**\n * Processes the message metadata of an event\n * @param event - The event to process\n * @param state - The state of the streaming process\n */\n\nfunction handleMessageMetadata(event: AnthropicAiStreamingEvent, state: StreamingState): void {\n // The token counts shown in the usage field of the message_delta event are cumulative.\n // @see https://docs.anthropic.com/en/docs/build-with-claude/streaming#event-types\n if (event.type === 'message_delta' && event.usage) {\n if ('output_tokens' in event.usage && typeof event.usage.output_tokens === 'number') {\n state.completionTokens = event.usage.output_tokens;\n }\n }\n\n if (event.message) {\n const message = event.message;\n\n if (message.id) state.responseId = message.id;\n if (message.model) state.responseModel = message.model;\n if (message.stop_reason) state.finishReasons.push(message.stop_reason);\n\n if (message.usage) {\n if (typeof message.usage.input_tokens === 'number') state.promptTokens = message.usage.input_tokens;\n if (typeof message.usage.cache_creation_input_tokens === 'number')\n state.cacheCreationInputTokens = message.usage.cache_creation_input_tokens;\n if (typeof message.usage.cache_read_input_tokens === 'number')\n state.cacheReadInputTokens = message.usage.cache_read_input_tokens;\n }\n }\n}\n\n/**\n * Handle start of a content block (e.g., tool_use)\n */\nfunction handleContentBlockStart(event: AnthropicAiStreamingEvent, state: StreamingState): void {\n if (event.type !== 'content_block_start' || typeof event.index !== 'number' || !event.content_block) return;\n if (event.content_block.type === 'tool_use' || event.content_block.type === 'server_tool_use') {\n state.activeToolBlocks[event.index] = {\n id: event.content_block.id,\n name: event.content_block.name,\n inputJsonParts: [],\n };\n }\n}\n\n/**\n * Handle deltas of a content block, including input_json_delta for tool_use\n */\nfunction handleContentBlockDelta(\n event: AnthropicAiStreamingEvent,\n state: StreamingState,\n recordOutputs: boolean,\n): void {\n if (event.type !== 'content_block_delta' || !event.delta) return;\n\n // Accumulate tool_use input JSON deltas only when we have an index and an active tool block\n if (\n typeof event.index === 'number' &&\n 'partial_json' in event.delta &&\n typeof event.delta.partial_json === 'string'\n ) {\n const active = state.activeToolBlocks[event.index];\n if (active) {\n active.inputJsonParts.push(event.delta.partial_json);\n }\n }\n\n // Accumulate streamed response text regardless of index\n if (recordOutputs && typeof event.delta.text === 'string') {\n state.responseTexts.push(event.delta.text);\n }\n}\n\n/**\n * Handle stop of a content block; finalize tool_use entries\n */\nfunction handleContentBlockStop(event: AnthropicAiStreamingEvent, state: StreamingState): void {\n if (event.type !== 'content_block_stop' || typeof event.index !== 'number') return;\n\n const active = state.activeToolBlocks[event.index];\n if (!active) return;\n\n const raw = active.inputJsonParts.join('');\n let parsedInput: unknown;\n\n try {\n parsedInput = raw ? JSON.parse(raw) : {};\n } catch {\n parsedInput = { __unparsed: raw };\n }\n\n state.toolCalls.push({\n type: 'tool_use',\n id: active.id,\n name: active.name,\n input: parsedInput,\n });\n\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete state.activeToolBlocks[event.index];\n}\n\n/**\n * Processes an event\n * @param event - The event to process\n * @param state - The state of the streaming process\n * @param recordOutputs - Whether to record outputs\n * @param span - The span to update\n */\nfunction processEvent(\n event: AnthropicAiStreamingEvent,\n state: StreamingState,\n recordOutputs: boolean,\n span: Span,\n): void {\n if (!(event && typeof event === 'object')) {\n return;\n }\n\n const isError = isErrorEvent(event, span);\n if (isError) return;\n\n handleMessageMetadata(event, state);\n\n // Tool call events are sent via 3 separate events:\n // - content_block_start (start of the tool call)\n // - content_block_delta (delta aka input of the tool call)\n // - content_block_stop (end of the tool call)\n // We need to handle them all to capture the full tool call.\n handleContentBlockStart(event, state);\n handleContentBlockDelta(event, state, recordOutputs);\n handleContentBlockStop(event, state);\n}\n\n/**\n * Finalizes span attributes when stream processing completes\n */\nfunction finalizeStreamSpan(state: StreamingState, span: Span, recordOutputs: boolean): void {\n if (!span.isRecording()) {\n return;\n }\n\n // Set common response attributes if available\n if (state.responseId) {\n span.setAttributes({\n [GEN_AI_RESPONSE_ID_ATTRIBUTE]: state.responseId,\n });\n }\n if (state.responseModel) {\n span.setAttributes({\n [GEN_AI_RESPONSE_MODEL_ATTRIBUTE]: state.responseModel,\n });\n }\n\n setTokenUsageAttributes(\n span,\n state.promptTokens,\n state.completionTokens,\n state.cacheCreationInputTokens,\n state.cacheReadInputTokens,\n );\n\n span.setAttributes({\n [GEN_AI_RESPONSE_STREAMING_ATTRIBUTE]: true,\n });\n\n if (state.finishReasons.length > 0) {\n span.setAttributes({\n [GEN_AI_RESPONSE_FINISH_REASONS_ATTRIBUTE]: JSON.stringify(state.finishReasons),\n });\n }\n\n if (recordOutputs && state.responseTexts.length > 0) {\n span.setAttributes({\n [GEN_AI_RESPONSE_TEXT_ATTRIBUTE]: state.responseTexts.join(''),\n });\n }\n\n // Set tool calls if any were captured\n if (recordOutputs && state.toolCalls.length > 0) {\n span.setAttributes({\n [GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE]: JSON.stringify(state.toolCalls),\n });\n }\n\n span.end();\n}\n\n/**\n * Instruments an async iterable stream of Anthropic events, updates the span with\n * streaming attributes and (optionally) the aggregated output text, and yields\n * each event from the input stream unchanged.\n */\nexport async function* instrumentAsyncIterableStream(\n stream: AsyncIterable<AnthropicAiStreamingEvent>,\n span: Span,\n recordOutputs: boolean,\n): AsyncGenerator<AnthropicAiStreamingEvent, void, unknown> {\n const state: StreamingState = {\n responseTexts: [],\n finishReasons: [],\n responseId: '',\n responseModel: '',\n promptTokens: undefined,\n completionTokens: undefined,\n cacheCreationInputTokens: undefined,\n cacheReadInputTokens: undefined,\n toolCalls: [],\n activeToolBlocks: {},\n };\n\n try {\n for await (const event of stream) {\n processEvent(event, state, recordOutputs, span);\n yield event;\n }\n } finally {\n // Set common response attributes if available\n if (state.responseId) {\n span.setAttributes({\n [GEN_AI_RESPONSE_ID_ATTRIBUTE]: state.responseId,\n });\n }\n if (state.responseModel) {\n span.setAttributes({\n [GEN_AI_RESPONSE_MODEL_ATTRIBUTE]: state.responseModel,\n });\n }\n\n setTokenUsageAttributes(\n span,\n state.promptTokens,\n state.completionTokens,\n state.cacheCreationInputTokens,\n state.cacheReadInputTokens,\n );\n\n span.setAttributes({\n [GEN_AI_RESPONSE_STREAMING_ATTRIBUTE]: true,\n });\n\n if (state.finishReasons.length > 0) {\n span.setAttributes({\n [GEN_AI_RESPONSE_FINISH_REASONS_ATTRIBUTE]: JSON.stringify(state.finishReasons),\n });\n }\n\n if (recordOutputs && state.responseTexts.length > 0) {\n span.setAttributes({\n [GEN_AI_RESPONSE_TEXT_ATTRIBUTE]: state.responseTexts.join(''),\n });\n }\n\n // Set tool calls if any were captured\n if (recordOutputs && state.toolCalls.length > 0) {\n span.setAttributes({\n [GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE]: JSON.stringify(state.toolCalls),\n });\n }\n\n span.end();\n }\n}\n\n/**\n * Instruments a MessageStream by registering event handlers and preserving the original stream API.\n */\nexport function instrumentMessageStream<R extends { on: (...args: unknown[]) => void }>(\n stream: R,\n span: Span,\n recordOutputs: boolean,\n): R {\n const state: StreamingState = {\n responseTexts: [],\n finishReasons: [],\n responseId: '',\n responseModel: '',\n promptTokens: undefined,\n completionTokens: undefined,\n cacheCreationInputTokens: undefined,\n cacheReadInputTokens: undefined,\n toolCalls: [],\n activeToolBlocks: {},\n };\n\n stream.on('streamEvent', (event: unknown) => {\n processEvent(event as AnthropicAiStreamingEvent, state, recordOutputs, span);\n });\n\n // The event fired when a message is done being streamed by the API. Corresponds to the message_stop SSE event.\n // @see https://github.com/anthropics/anthropic-sdk-typescript/blob/d3be31f5a4e6ebb4c0a2f65dbb8f381ae73a9166/helpers.md?plain=1#L42-L44\n stream.on('message', () => {\n finalizeStreamSpan(state, span, recordOutputs);\n });\n\n stream.on('error', (error: unknown) => {\n captureException(error, {\n mechanism: {\n handled: false,\n type: 'auto.ai.anthropic.stream_error',\n },\n });\n\n if (span.isRecording()) {\n span.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n span.end();\n }\n });\n\n return stream;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"streaming.js","sources":["../../../../src/tracing/anthropic-ai/streaming.ts"],"sourcesContent":["import { captureException } from '../../exports';\nimport { SPAN_STATUS_ERROR } from '../../tracing';\nimport type { Span } from '../../types-hoist/span';\nimport { endStreamSpan } from '../ai/utils';\nimport type { AnthropicAiStreamingEvent } from './types';\nimport { mapAnthropicErrorToStatusMessage } from './utils';\n\n/**\n * State object used to accumulate information from a stream of Anthropic AI events.\n */\ninterface StreamingState {\n /** Collected response text fragments (for output recording). */\n responseTexts: string[];\n /** Reasons for finishing the response, as reported by the API. */\n finishReasons: string[];\n /** The response ID. */\n responseId: string;\n /** The model name. */\n responseModel: string;\n /** Number of prompt/input tokens used. */\n promptTokens: number | undefined;\n /** Number of completion/output tokens used. */\n completionTokens: number | undefined;\n /** Number of cache creation input tokens used. */\n cacheCreationInputTokens: number | undefined;\n /** Number of cache read input tokens used. */\n cacheReadInputTokens: number | undefined;\n /** Accumulated tool calls (finalized) */\n toolCalls: Array<Record<string, unknown>>;\n /** In-progress tool call blocks keyed by index */\n activeToolBlocks: Record<\n number,\n {\n id?: string;\n name?: string;\n inputJsonParts: string[];\n }\n >;\n}\n\n/**\n * Checks if an event is an error event\n * @param event - The event to process\n * @param state - The state of the streaming process\n * @param recordOutputs - Whether to record outputs\n * @param span - The span to update\n * @returns Whether an error occurred\n */\n\nfunction isErrorEvent(event: AnthropicAiStreamingEvent, span: Span): boolean {\n if ('type' in event && typeof event.type === 'string') {\n // If the event is an error, set the span status and capture the error\n // These error events are not rejected by the API by default, but are sent as metadata of the response\n if (event.type === 'error') {\n span.setStatus({ code: SPAN_STATUS_ERROR, message: mapAnthropicErrorToStatusMessage(event.error?.type) });\n captureException(event.error, {\n mechanism: {\n handled: false,\n type: 'auto.ai.anthropic.anthropic_error',\n },\n });\n return true;\n }\n }\n return false;\n}\n\n/**\n * Processes the message metadata of an event\n * @param event - The event to process\n * @param state - The state of the streaming process\n */\n\nfunction handleMessageMetadata(event: AnthropicAiStreamingEvent, state: StreamingState): void {\n // The token counts shown in the usage field of the message_delta event are cumulative.\n // @see https://docs.anthropic.com/en/docs/build-with-claude/streaming#event-types\n if (event.type === 'message_delta' && event.usage) {\n if ('output_tokens' in event.usage && typeof event.usage.output_tokens === 'number') {\n state.completionTokens = event.usage.output_tokens;\n }\n }\n\n if (event.message) {\n const message = event.message;\n\n if (message.id) state.responseId = message.id;\n if (message.model) state.responseModel = message.model;\n if (message.stop_reason) state.finishReasons.push(message.stop_reason);\n\n if (message.usage) {\n if (typeof message.usage.input_tokens === 'number') state.promptTokens = message.usage.input_tokens;\n if (typeof message.usage.cache_creation_input_tokens === 'number')\n state.cacheCreationInputTokens = message.usage.cache_creation_input_tokens;\n if (typeof message.usage.cache_read_input_tokens === 'number')\n state.cacheReadInputTokens = message.usage.cache_read_input_tokens;\n }\n }\n}\n\n/**\n * Handle start of a content block (e.g., tool_use)\n */\nfunction handleContentBlockStart(event: AnthropicAiStreamingEvent, state: StreamingState): void {\n if (event.type !== 'content_block_start' || typeof event.index !== 'number' || !event.content_block) return;\n if (event.content_block.type === 'tool_use' || event.content_block.type === 'server_tool_use') {\n state.activeToolBlocks[event.index] = {\n id: event.content_block.id,\n name: event.content_block.name,\n inputJsonParts: [],\n };\n }\n}\n\n/**\n * Handle deltas of a content block, including input_json_delta for tool_use\n */\nfunction handleContentBlockDelta(\n event: AnthropicAiStreamingEvent,\n state: StreamingState,\n recordOutputs: boolean,\n): void {\n if (event.type !== 'content_block_delta' || !event.delta) return;\n\n // Accumulate tool_use input JSON deltas only when we have an index and an active tool block\n if (\n typeof event.index === 'number' &&\n 'partial_json' in event.delta &&\n typeof event.delta.partial_json === 'string'\n ) {\n const active = state.activeToolBlocks[event.index];\n if (active) {\n active.inputJsonParts.push(event.delta.partial_json);\n }\n }\n\n // Accumulate streamed response text regardless of index\n if (recordOutputs && typeof event.delta.text === 'string') {\n state.responseTexts.push(event.delta.text);\n }\n}\n\n/**\n * Handle stop of a content block; finalize tool_use entries\n */\nfunction handleContentBlockStop(event: AnthropicAiStreamingEvent, state: StreamingState): void {\n if (event.type !== 'content_block_stop' || typeof event.index !== 'number') return;\n\n const active = state.activeToolBlocks[event.index];\n if (!active) return;\n\n const raw = active.inputJsonParts.join('');\n let parsedInput: unknown;\n\n try {\n parsedInput = raw ? JSON.parse(raw) : {};\n } catch {\n parsedInput = { __unparsed: raw };\n }\n\n state.toolCalls.push({\n type: 'tool_use',\n id: active.id,\n name: active.name,\n input: parsedInput,\n });\n\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete state.activeToolBlocks[event.index];\n}\n\n/**\n * Processes an event\n * @param event - The event to process\n * @param state - The state of the streaming process\n * @param recordOutputs - Whether to record outputs\n * @param span - The span to update\n */\nfunction processEvent(\n event: AnthropicAiStreamingEvent,\n state: StreamingState,\n recordOutputs: boolean,\n span: Span,\n): void {\n if (!(event && typeof event === 'object')) {\n return;\n }\n\n const isError = isErrorEvent(event, span);\n if (isError) return;\n\n handleMessageMetadata(event, state);\n\n // Tool call events are sent via 3 separate events:\n // - content_block_start (start of the tool call)\n // - content_block_delta (delta aka input of the tool call)\n // - content_block_stop (end of the tool call)\n // We need to handle them all to capture the full tool call.\n handleContentBlockStart(event, state);\n handleContentBlockDelta(event, state, recordOutputs);\n handleContentBlockStop(event, state);\n}\n\n/**\n * Instruments an async iterable stream of Anthropic events, updates the span with\n * streaming attributes and (optionally) the aggregated output text, and yields\n * each event from the input stream unchanged.\n */\nexport async function* instrumentAsyncIterableStream(\n stream: AsyncIterable<AnthropicAiStreamingEvent>,\n span: Span,\n recordOutputs: boolean,\n): AsyncGenerator<AnthropicAiStreamingEvent, void, unknown> {\n const state: StreamingState = {\n responseTexts: [],\n finishReasons: [],\n responseId: '',\n responseModel: '',\n promptTokens: undefined,\n completionTokens: undefined,\n cacheCreationInputTokens: undefined,\n cacheReadInputTokens: undefined,\n toolCalls: [],\n activeToolBlocks: {},\n };\n\n try {\n for await (const event of stream) {\n processEvent(event, state, recordOutputs, span);\n yield event;\n }\n } finally {\n endStreamSpan(span, state, recordOutputs);\n }\n}\n\n/**\n * Instruments a MessageStream by registering event handlers and preserving the original stream API.\n */\nexport function instrumentMessageStream<R extends { on: (...args: unknown[]) => void }>(\n stream: R,\n span: Span,\n recordOutputs: boolean,\n): R {\n const state: StreamingState = {\n responseTexts: [],\n finishReasons: [],\n responseId: '',\n responseModel: '',\n promptTokens: undefined,\n completionTokens: undefined,\n cacheCreationInputTokens: undefined,\n cacheReadInputTokens: undefined,\n toolCalls: [],\n activeToolBlocks: {},\n };\n\n stream.on('streamEvent', (event: unknown) => {\n processEvent(event as AnthropicAiStreamingEvent, state, recordOutputs, span);\n });\n\n // The event fired when a message is done being streamed by the API. Corresponds to the message_stop SSE event.\n // @see https://github.com/anthropics/anthropic-sdk-typescript/blob/d3be31f5a4e6ebb4c0a2f65dbb8f381ae73a9166/helpers.md?plain=1#L42-L44\n stream.on('message', () => {\n endStreamSpan(span, state, recordOutputs);\n });\n\n stream.on('error', (error: unknown) => {\n captureException(error, {\n mechanism: {\n handled: false,\n type: 'auto.ai.anthropic.stream_error',\n },\n });\n\n if (span.isRecording()) {\n span.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n span.end();\n }\n });\n\n return stream;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { captureException } from '../../exports.js';
|
|
2
2
|
import { SPAN_STATUS_ERROR } from '../spanstatus.js';
|
|
3
3
|
import { GEN_AI_SYSTEM_INSTRUCTIONS_ATTRIBUTE, GEN_AI_INPUT_MESSAGES_ORIGINAL_LENGTH_ATTRIBUTE, GEN_AI_INPUT_MESSAGES_ATTRIBUTE } from '../ai/gen-ai-attributes.js';
|
|
4
|
-
import { extractSystemInstructions, getTruncatedJsonString } from '../ai/utils.js';
|
|
4
|
+
import { extractSystemInstructions, getTruncatedJsonString, getJsonString } from '../ai/utils.js';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Set the messages and messages original length attributes.
|
|
8
8
|
* Extracts system instructions before truncation.
|
|
9
9
|
*/
|
|
10
|
-
function setMessagesAttribute(span, messages) {
|
|
10
|
+
function setMessagesAttribute(span, messages, enableTruncation) {
|
|
11
11
|
if (Array.isArray(messages) && messages.length === 0) {
|
|
12
12
|
return;
|
|
13
13
|
}
|
|
@@ -22,7 +22,9 @@ function setMessagesAttribute(span, messages) {
|
|
|
22
22
|
|
|
23
23
|
const filteredLength = Array.isArray(filteredMessages) ? filteredMessages.length : 1;
|
|
24
24
|
span.setAttributes({
|
|
25
|
-
[GEN_AI_INPUT_MESSAGES_ATTRIBUTE]:
|
|
25
|
+
[GEN_AI_INPUT_MESSAGES_ATTRIBUTE]: enableTruncation
|
|
26
|
+
? getTruncatedJsonString(filteredMessages)
|
|
27
|
+
: getJsonString(filteredMessages),
|
|
26
28
|
[GEN_AI_INPUT_MESSAGES_ORIGINAL_LENGTH_ATTRIBUTE]: filteredLength,
|
|
27
29
|
});
|
|
28
30
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../../../../src/tracing/anthropic-ai/utils.ts"],"sourcesContent":["import { captureException } from '../../exports';\nimport { SPAN_STATUS_ERROR } from '../../tracing';\nimport type { Span } from '../../types-hoist/span';\nimport type { SpanStatusType } from '../../types-hoist/spanStatus';\nimport {\n GEN_AI_INPUT_MESSAGES_ATTRIBUTE,\n GEN_AI_INPUT_MESSAGES_ORIGINAL_LENGTH_ATTRIBUTE,\n GEN_AI_SYSTEM_INSTRUCTIONS_ATTRIBUTE,\n} from '../ai/gen-ai-attributes';\nimport { extractSystemInstructions, getTruncatedJsonString } from '../ai/utils';\nimport type { AnthropicAiResponse } from './types';\n\n/**\n * Set the messages and messages original length attributes.\n * Extracts system instructions before truncation.\n */\nexport function setMessagesAttribute(span: Span, messages: unknown): void {\n if (Array.isArray(messages) && messages.length === 0) {\n return;\n }\n\n const { systemInstructions, filteredMessages } = extractSystemInstructions(messages);\n\n if (systemInstructions) {\n span.setAttributes({\n [GEN_AI_SYSTEM_INSTRUCTIONS_ATTRIBUTE]: systemInstructions,\n });\n }\n\n const filteredLength = Array.isArray(filteredMessages) ? filteredMessages.length : 1;\n span.setAttributes({\n [GEN_AI_INPUT_MESSAGES_ATTRIBUTE]: getTruncatedJsonString(filteredMessages),\n [GEN_AI_INPUT_MESSAGES_ORIGINAL_LENGTH_ATTRIBUTE]: filteredLength,\n });\n}\n\nconst ANTHROPIC_ERROR_TYPE_TO_SPAN_STATUS: Record<string, SpanStatusType> = {\n invalid_request_error: 'invalid_argument',\n authentication_error: 'unauthenticated',\n permission_error: 'permission_denied',\n not_found_error: 'not_found',\n request_too_large: 'failed_precondition',\n rate_limit_error: 'resource_exhausted',\n api_error: 'internal_error',\n overloaded_error: 'unavailable',\n};\n\n/**\n * Map an Anthropic API error type to a SpanStatusType value.\n * @see https://docs.anthropic.com/en/api/errors#error-shapes\n */\nexport function mapAnthropicErrorToStatusMessage(errorType: string | undefined): SpanStatusType {\n if (!errorType) {\n return 'internal_error';\n }\n return ANTHROPIC_ERROR_TYPE_TO_SPAN_STATUS[errorType] || 'internal_error';\n}\n\n/**\n * Capture error information from the response\n * @see https://docs.anthropic.com/en/api/errors#error-shapes\n */\nexport function handleResponseError(span: Span, response: AnthropicAiResponse): void {\n if (response.error) {\n span.setStatus({ code: SPAN_STATUS_ERROR, message: mapAnthropicErrorToStatusMessage(response.error.type) });\n\n captureException(response.error, {\n mechanism: {\n handled: false,\n type: 'auto.ai.anthropic.anthropic_error',\n },\n });\n }\n}\n\n/**\n * Include the system prompt in the messages list, if available\n */\nexport function messagesFromParams(params: Record<string, unknown>): unknown[] {\n const { system, messages, input } = params;\n\n const systemMessages = typeof system === 'string' ? [{ role: 'system', content: params.system }] : [];\n\n const inputParamMessages = Array.isArray(input) ? input : input != null ? [input] : undefined;\n\n const messagesParamMessages = Array.isArray(messages) ? messages : messages != null ? [messages] : [];\n\n const userMessages = inputParamMessages ?? messagesParamMessages;\n\n return [...systemMessages, ...userMessages];\n}\n"],"names":[],"mappings":";;;;;AAYA;AACA;AACA;AACA;AACO,SAAS,oBAAoB,CAAC,IAAI,EAAQ,QAAQ,EAAiB;
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../../src/tracing/anthropic-ai/utils.ts"],"sourcesContent":["import { captureException } from '../../exports';\nimport { SPAN_STATUS_ERROR } from '../../tracing';\nimport type { Span } from '../../types-hoist/span';\nimport type { SpanStatusType } from '../../types-hoist/spanStatus';\nimport {\n GEN_AI_INPUT_MESSAGES_ATTRIBUTE,\n GEN_AI_INPUT_MESSAGES_ORIGINAL_LENGTH_ATTRIBUTE,\n GEN_AI_SYSTEM_INSTRUCTIONS_ATTRIBUTE,\n} from '../ai/gen-ai-attributes';\nimport { extractSystemInstructions, getJsonString, getTruncatedJsonString } from '../ai/utils';\nimport type { AnthropicAiResponse } from './types';\n\n/**\n * Set the messages and messages original length attributes.\n * Extracts system instructions before truncation.\n */\nexport function setMessagesAttribute(span: Span, messages: unknown, enableTruncation: boolean): void {\n if (Array.isArray(messages) && messages.length === 0) {\n return;\n }\n\n const { systemInstructions, filteredMessages } = extractSystemInstructions(messages);\n\n if (systemInstructions) {\n span.setAttributes({\n [GEN_AI_SYSTEM_INSTRUCTIONS_ATTRIBUTE]: systemInstructions,\n });\n }\n\n const filteredLength = Array.isArray(filteredMessages) ? filteredMessages.length : 1;\n span.setAttributes({\n [GEN_AI_INPUT_MESSAGES_ATTRIBUTE]: enableTruncation\n ? getTruncatedJsonString(filteredMessages)\n : getJsonString(filteredMessages),\n [GEN_AI_INPUT_MESSAGES_ORIGINAL_LENGTH_ATTRIBUTE]: filteredLength,\n });\n}\n\nconst ANTHROPIC_ERROR_TYPE_TO_SPAN_STATUS: Record<string, SpanStatusType> = {\n invalid_request_error: 'invalid_argument',\n authentication_error: 'unauthenticated',\n permission_error: 'permission_denied',\n not_found_error: 'not_found',\n request_too_large: 'failed_precondition',\n rate_limit_error: 'resource_exhausted',\n api_error: 'internal_error',\n overloaded_error: 'unavailable',\n};\n\n/**\n * Map an Anthropic API error type to a SpanStatusType value.\n * @see https://docs.anthropic.com/en/api/errors#error-shapes\n */\nexport function mapAnthropicErrorToStatusMessage(errorType: string | undefined): SpanStatusType {\n if (!errorType) {\n return 'internal_error';\n }\n return ANTHROPIC_ERROR_TYPE_TO_SPAN_STATUS[errorType] || 'internal_error';\n}\n\n/**\n * Capture error information from the response\n * @see https://docs.anthropic.com/en/api/errors#error-shapes\n */\nexport function handleResponseError(span: Span, response: AnthropicAiResponse): void {\n if (response.error) {\n span.setStatus({ code: SPAN_STATUS_ERROR, message: mapAnthropicErrorToStatusMessage(response.error.type) });\n\n captureException(response.error, {\n mechanism: {\n handled: false,\n type: 'auto.ai.anthropic.anthropic_error',\n },\n });\n }\n}\n\n/**\n * Include the system prompt in the messages list, if available\n */\nexport function messagesFromParams(params: Record<string, unknown>): unknown[] {\n const { system, messages, input } = params;\n\n const systemMessages = typeof system === 'string' ? [{ role: 'system', content: params.system }] : [];\n\n const inputParamMessages = Array.isArray(input) ? input : input != null ? [input] : undefined;\n\n const messagesParamMessages = Array.isArray(messages) ? messages : messages != null ? [messages] : [];\n\n const userMessages = inputParamMessages ?? messagesParamMessages;\n\n return [...systemMessages, ...userMessages];\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -107,7 +107,8 @@ function getDynamicSamplingContextFromSpan(span) {
|
|
|
107
107
|
const dsc = getDynamicSamplingContextFromClient(span.spanContext().traceId, client);
|
|
108
108
|
|
|
109
109
|
// We don't want to have a transaction name in the DSC if the source is "url" because URLs might contain PII
|
|
110
|
-
|
|
110
|
+
// TODO(v11): Only read `SEMANTIC_ATTRIBUTE_SENTRY_SOURCE` again, once we renamed it to `sentry.span.source`
|
|
111
|
+
const source = rootSpanAttributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE] ?? rootSpanAttributes['sentry.span.source'];
|
|
111
112
|
|
|
112
113
|
// after JSON conversion, txn.name becomes jsonSpan.description
|
|
113
114
|
const name = rootSpanJson.description;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamicSamplingContext.js","sources":["../../../src/tracing/dynamicSamplingContext.ts"],"sourcesContent":["import type { Client } from '../client';\nimport { DEFAULT_ENVIRONMENT } from '../constants';\nimport { getClient } from '../currentScopes';\nimport type { Scope } from '../scope';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_PREVIOUS_TRACE_SAMPLE_RATE,\n SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n} from '../semanticAttributes';\nimport type { DynamicSamplingContext } from '../types-hoist/envelope';\nimport type { Span } from '../types-hoist/span';\nimport { baggageHeaderToDynamicSamplingContext, dynamicSamplingContextToSentryBaggageHeader } from '../utils/baggage';\nimport { extractOrgIdFromClient } from '../utils/dsn';\nimport { hasSpansEnabled } from '../utils/hasSpansEnabled';\nimport { addNonEnumerableProperty } from '../utils/object';\nimport { getRootSpan, spanIsSampled, spanToJSON } from '../utils/spanUtils';\nimport { getCapturedScopesOnSpan } from './utils';\n\n/**\n * If you change this value, also update the terser plugin config to\n * avoid minification of the object property!\n */\nconst FROZEN_DSC_FIELD = '_frozenDsc';\n\ntype SpanWithMaybeDsc = Span & {\n [FROZEN_DSC_FIELD]?: Partial<DynamicSamplingContext> | undefined;\n};\n\n/**\n * Freeze the given DSC on the given span.\n */\nexport function freezeDscOnSpan(span: Span, dsc: Partial<DynamicSamplingContext>): void {\n const spanWithMaybeDsc = span as SpanWithMaybeDsc;\n addNonEnumerableProperty(spanWithMaybeDsc, FROZEN_DSC_FIELD, dsc);\n}\n\n/**\n * Creates a dynamic sampling context from a client.\n *\n * Dispatches the `createDsc` lifecycle hook as a side effect.\n */\nexport function getDynamicSamplingContextFromClient(trace_id: string, client: Client): DynamicSamplingContext {\n const options = client.getOptions();\n\n const { publicKey: public_key } = client.getDsn() || {};\n\n // Instead of conditionally adding non-undefined values, we add them and then remove them if needed\n // otherwise, the order of baggage entries changes, which \"breaks\" a bunch of tests etc.\n const dsc: DynamicSamplingContext = {\n environment: options.environment || DEFAULT_ENVIRONMENT,\n release: options.release,\n public_key,\n trace_id,\n org_id: extractOrgIdFromClient(client),\n };\n\n client.emit('createDsc', dsc);\n\n return dsc;\n}\n\n/**\n * Get the dynamic sampling context for the currently active scopes.\n */\nexport function getDynamicSamplingContextFromScope(client: Client, scope: Scope): Partial<DynamicSamplingContext> {\n const propagationContext = scope.getPropagationContext();\n return propagationContext.dsc || getDynamicSamplingContextFromClient(propagationContext.traceId, client);\n}\n\n/**\n * Creates a dynamic sampling context from a span (and client and scope)\n *\n * @param span the span from which a few values like the root span name and sample rate are extracted.\n *\n * @returns a dynamic sampling context\n */\nexport function getDynamicSamplingContextFromSpan(span: Span): Readonly<Partial<DynamicSamplingContext>> {\n const client = getClient();\n if (!client) {\n return {};\n }\n\n const rootSpan = getRootSpan(span);\n const rootSpanJson = spanToJSON(rootSpan);\n const rootSpanAttributes = rootSpanJson.data;\n const traceState = rootSpan.spanContext().traceState;\n\n // The span sample rate that was locally applied to the root span should also always be applied to the DSC, even if the DSC is frozen.\n // This is so that the downstream traces/services can use parentSampleRate in their `tracesSampler` to make consistent sampling decisions across the entire trace.\n const rootSpanSampleRate =\n traceState?.get('sentry.sample_rate') ??\n rootSpanAttributes[SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE] ??\n rootSpanAttributes[SEMANTIC_ATTRIBUTE_SENTRY_PREVIOUS_TRACE_SAMPLE_RATE];\n\n function applyLocalSampleRateToDsc(dsc: Partial<DynamicSamplingContext>): Partial<DynamicSamplingContext> {\n if (typeof rootSpanSampleRate === 'number' || typeof rootSpanSampleRate === 'string') {\n dsc.sample_rate = `${rootSpanSampleRate}`;\n }\n return dsc;\n }\n\n // For core implementation, we freeze the DSC onto the span as a non-enumerable property\n const frozenDsc = (rootSpan as SpanWithMaybeDsc)[FROZEN_DSC_FIELD];\n if (frozenDsc) {\n return applyLocalSampleRateToDsc(frozenDsc);\n }\n\n // For OpenTelemetry, we freeze the DSC on the trace state\n const traceStateDsc = traceState?.get('sentry.dsc');\n\n // If the span has a DSC, we want it to take precedence\n const dscOnTraceState = traceStateDsc && baggageHeaderToDynamicSamplingContext(traceStateDsc);\n\n if (dscOnTraceState) {\n return applyLocalSampleRateToDsc(dscOnTraceState);\n }\n\n // Else, we generate it from the span\n const dsc = getDynamicSamplingContextFromClient(span.spanContext().traceId, client);\n\n // We don't want to have a transaction name in the DSC if the source is \"url\" because URLs might contain PII\n const source = rootSpanAttributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE];\n\n // after JSON conversion, txn.name becomes jsonSpan.description\n const name = rootSpanJson.description;\n if (source !== 'url' && name) {\n dsc.transaction = name;\n }\n\n // How can we even land here with hasSpansEnabled() returning false?\n // Otel creates a Non-recording span in Tracing Without Performance mode when handling incoming requests\n // So we end up with an active span that is not sampled (neither positively nor negatively)\n if (hasSpansEnabled()) {\n dsc.sampled = String(spanIsSampled(rootSpan));\n dsc.sample_rand =\n // In OTEL we store the sample rand on the trace state because we cannot access scopes for NonRecordingSpans\n // The Sentry OTEL SpanSampler takes care of writing the sample rand on the root span\n traceState?.get('sentry.sample_rand') ??\n // On all other platforms we can actually get the scopes from a root span (we use this as a fallback)\n getCapturedScopesOnSpan(rootSpan).scope?.getPropagationContext().sampleRand.toString();\n }\n\n applyLocalSampleRateToDsc(dsc);\n\n client.emit('createDsc', dsc, rootSpan);\n\n return dsc;\n}\n\n/**\n * Convert a Span to a baggage header.\n */\nexport function spanToBaggageHeader(span: Span): string | undefined {\n const dsc = getDynamicSamplingContextFromSpan(span);\n return dynamicSamplingContextToSentryBaggageHeader(dsc);\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dynamicSamplingContext.js","sources":["../../../src/tracing/dynamicSamplingContext.ts"],"sourcesContent":["import type { Client } from '../client';\nimport { DEFAULT_ENVIRONMENT } from '../constants';\nimport { getClient } from '../currentScopes';\nimport type { Scope } from '../scope';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_PREVIOUS_TRACE_SAMPLE_RATE,\n SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n} from '../semanticAttributes';\nimport type { DynamicSamplingContext } from '../types-hoist/envelope';\nimport type { Span } from '../types-hoist/span';\nimport { baggageHeaderToDynamicSamplingContext, dynamicSamplingContextToSentryBaggageHeader } from '../utils/baggage';\nimport { extractOrgIdFromClient } from '../utils/dsn';\nimport { hasSpansEnabled } from '../utils/hasSpansEnabled';\nimport { addNonEnumerableProperty } from '../utils/object';\nimport { getRootSpan, spanIsSampled, spanToJSON } from '../utils/spanUtils';\nimport { getCapturedScopesOnSpan } from './utils';\n\n/**\n * If you change this value, also update the terser plugin config to\n * avoid minification of the object property!\n */\nconst FROZEN_DSC_FIELD = '_frozenDsc';\n\ntype SpanWithMaybeDsc = Span & {\n [FROZEN_DSC_FIELD]?: Partial<DynamicSamplingContext> | undefined;\n};\n\n/**\n * Freeze the given DSC on the given span.\n */\nexport function freezeDscOnSpan(span: Span, dsc: Partial<DynamicSamplingContext>): void {\n const spanWithMaybeDsc = span as SpanWithMaybeDsc;\n addNonEnumerableProperty(spanWithMaybeDsc, FROZEN_DSC_FIELD, dsc);\n}\n\n/**\n * Creates a dynamic sampling context from a client.\n *\n * Dispatches the `createDsc` lifecycle hook as a side effect.\n */\nexport function getDynamicSamplingContextFromClient(trace_id: string, client: Client): DynamicSamplingContext {\n const options = client.getOptions();\n\n const { publicKey: public_key } = client.getDsn() || {};\n\n // Instead of conditionally adding non-undefined values, we add them and then remove them if needed\n // otherwise, the order of baggage entries changes, which \"breaks\" a bunch of tests etc.\n const dsc: DynamicSamplingContext = {\n environment: options.environment || DEFAULT_ENVIRONMENT,\n release: options.release,\n public_key,\n trace_id,\n org_id: extractOrgIdFromClient(client),\n };\n\n client.emit('createDsc', dsc);\n\n return dsc;\n}\n\n/**\n * Get the dynamic sampling context for the currently active scopes.\n */\nexport function getDynamicSamplingContextFromScope(client: Client, scope: Scope): Partial<DynamicSamplingContext> {\n const propagationContext = scope.getPropagationContext();\n return propagationContext.dsc || getDynamicSamplingContextFromClient(propagationContext.traceId, client);\n}\n\n/**\n * Creates a dynamic sampling context from a span (and client and scope)\n *\n * @param span the span from which a few values like the root span name and sample rate are extracted.\n *\n * @returns a dynamic sampling context\n */\nexport function getDynamicSamplingContextFromSpan(span: Span): Readonly<Partial<DynamicSamplingContext>> {\n const client = getClient();\n if (!client) {\n return {};\n }\n\n const rootSpan = getRootSpan(span);\n const rootSpanJson = spanToJSON(rootSpan);\n const rootSpanAttributes = rootSpanJson.data;\n const traceState = rootSpan.spanContext().traceState;\n\n // The span sample rate that was locally applied to the root span should also always be applied to the DSC, even if the DSC is frozen.\n // This is so that the downstream traces/services can use parentSampleRate in their `tracesSampler` to make consistent sampling decisions across the entire trace.\n const rootSpanSampleRate =\n traceState?.get('sentry.sample_rate') ??\n rootSpanAttributes[SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE] ??\n rootSpanAttributes[SEMANTIC_ATTRIBUTE_SENTRY_PREVIOUS_TRACE_SAMPLE_RATE];\n\n function applyLocalSampleRateToDsc(dsc: Partial<DynamicSamplingContext>): Partial<DynamicSamplingContext> {\n if (typeof rootSpanSampleRate === 'number' || typeof rootSpanSampleRate === 'string') {\n dsc.sample_rate = `${rootSpanSampleRate}`;\n }\n return dsc;\n }\n\n // For core implementation, we freeze the DSC onto the span as a non-enumerable property\n const frozenDsc = (rootSpan as SpanWithMaybeDsc)[FROZEN_DSC_FIELD];\n if (frozenDsc) {\n return applyLocalSampleRateToDsc(frozenDsc);\n }\n\n // For OpenTelemetry, we freeze the DSC on the trace state\n const traceStateDsc = traceState?.get('sentry.dsc');\n\n // If the span has a DSC, we want it to take precedence\n const dscOnTraceState = traceStateDsc && baggageHeaderToDynamicSamplingContext(traceStateDsc);\n\n if (dscOnTraceState) {\n return applyLocalSampleRateToDsc(dscOnTraceState);\n }\n\n // Else, we generate it from the span\n const dsc = getDynamicSamplingContextFromClient(span.spanContext().traceId, client);\n\n // We don't want to have a transaction name in the DSC if the source is \"url\" because URLs might contain PII\n // TODO(v11): Only read `SEMANTIC_ATTRIBUTE_SENTRY_SOURCE` again, once we renamed it to `sentry.span.source`\n const source = rootSpanAttributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE] ?? rootSpanAttributes['sentry.span.source'];\n\n // after JSON conversion, txn.name becomes jsonSpan.description\n const name = rootSpanJson.description;\n if (source !== 'url' && name) {\n dsc.transaction = name;\n }\n\n // How can we even land here with hasSpansEnabled() returning false?\n // Otel creates a Non-recording span in Tracing Without Performance mode when handling incoming requests\n // So we end up with an active span that is not sampled (neither positively nor negatively)\n if (hasSpansEnabled()) {\n dsc.sampled = String(spanIsSampled(rootSpan));\n dsc.sample_rand =\n // In OTEL we store the sample rand on the trace state because we cannot access scopes for NonRecordingSpans\n // The Sentry OTEL SpanSampler takes care of writing the sample rand on the root span\n traceState?.get('sentry.sample_rand') ??\n // On all other platforms we can actually get the scopes from a root span (we use this as a fallback)\n getCapturedScopesOnSpan(rootSpan).scope?.getPropagationContext().sampleRand.toString();\n }\n\n applyLocalSampleRateToDsc(dsc);\n\n client.emit('createDsc', dsc, rootSpan);\n\n return dsc;\n}\n\n/**\n * Convert a Span to a baggage header.\n */\nexport function spanToBaggageHeader(span: Span): string | undefined {\n const dsc = getDynamicSamplingContextFromSpan(span);\n return dynamicSamplingContextToSentryBaggageHeader(dsc);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -8,16 +8,13 @@ const GOOGLE_GENAI_METHOD_REGISTRY = {
|
|
|
8
8
|
'models.generateContent': { operation: 'generate_content' },
|
|
9
9
|
'models.generateContentStream': { operation: 'generate_content', streaming: true },
|
|
10
10
|
'models.embedContent': { operation: 'embeddings' },
|
|
11
|
-
'chats.create': {
|
|
12
|
-
// chat.* paths are built by createDeepProxy when it proxies the chat instance with CHAT_PATH as base
|
|
11
|
+
'chats.create': { proxyResultPath: 'chat' },
|
|
13
12
|
'chat.sendMessage': { operation: 'chat' },
|
|
14
13
|
'chat.sendMessageStream': { operation: 'chat', streaming: true },
|
|
15
14
|
} ;
|
|
16
15
|
|
|
17
16
|
// Constants for internal use
|
|
18
17
|
const GOOGLE_GENAI_SYSTEM_NAME = 'google_genai';
|
|
19
|
-
const CHATS_CREATE_METHOD = 'chats.create';
|
|
20
|
-
const CHAT_PATH = 'chat';
|
|
21
18
|
|
|
22
|
-
export {
|
|
19
|
+
export { GOOGLE_GENAI_INTEGRATION_NAME, GOOGLE_GENAI_METHOD_REGISTRY, GOOGLE_GENAI_SYSTEM_NAME };
|
|
23
20
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sources":["../../../../src/tracing/google-genai/constants.ts"],"sourcesContent":["import type { InstrumentedMethodRegistry } from '../ai/utils';\n\nexport const GOOGLE_GENAI_INTEGRATION_NAME = 'Google_GenAI';\n\n// https://ai.google.dev/api/rest/v1/models/generateContent\n// https://ai.google.dev/api/rest/v1/chats/sendMessage\n// https://googleapis.github.io/js-genai/release_docs/classes/models.Models.html#generatecontentstream\n// https://googleapis.github.io/js-genai/release_docs/classes/chats.Chat.html#sendmessagestream\nexport const GOOGLE_GENAI_METHOD_REGISTRY = {\n 'models.generateContent': { operation: 'generate_content' },\n 'models.generateContentStream': { operation: 'generate_content', streaming: true },\n 'models.embedContent': { operation: 'embeddings' },\n 'chats.create': {
|
|
1
|
+
{"version":3,"file":"constants.js","sources":["../../../../src/tracing/google-genai/constants.ts"],"sourcesContent":["import type { InstrumentedMethodRegistry } from '../ai/utils';\n\nexport const GOOGLE_GENAI_INTEGRATION_NAME = 'Google_GenAI';\n\n// https://ai.google.dev/api/rest/v1/models/generateContent\n// https://ai.google.dev/api/rest/v1/chats/sendMessage\n// https://googleapis.github.io/js-genai/release_docs/classes/models.Models.html#generatecontentstream\n// https://googleapis.github.io/js-genai/release_docs/classes/chats.Chat.html#sendmessagestream\nexport const GOOGLE_GENAI_METHOD_REGISTRY = {\n 'models.generateContent': { operation: 'generate_content' },\n 'models.generateContentStream': { operation: 'generate_content', streaming: true },\n 'models.embedContent': { operation: 'embeddings' },\n 'chats.create': { proxyResultPath: 'chat' },\n 'chat.sendMessage': { operation: 'chat' },\n 'chat.sendMessageStream': { operation: 'chat', streaming: true },\n} as const satisfies InstrumentedMethodRegistry;\n\n// Constants for internal use\nexport const GOOGLE_GENAI_SYSTEM_NAME = 'google_genai';\n"],"names":[],"mappings":"AAEO,MAAM,6BAAA,GAAgC;;AAE7C;AACA;AACA;AACA;AACO,MAAM,+BAA+B;AAC5C,EAAE,wBAAwB,EAAE,EAAE,SAAS,EAAE,oBAAoB;AAC7D,EAAE,8BAA8B,EAAE,EAAE,SAAS,EAAE,kBAAkB,EAAE,SAAS,EAAE,IAAA,EAAM;AACpF,EAAE,qBAAqB,EAAE,EAAE,SAAS,EAAE,cAAc;AACpD,EAAE,cAAc,EAAE,EAAE,eAAe,EAAE,QAAQ;AAC7C,EAAE,kBAAkB,EAAE,EAAE,SAAS,EAAE,QAAQ;AAC3C,EAAE,wBAAwB,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,IAAA,EAAM;AAClE,CAAA;;AAEA;AACO,MAAM,wBAAA,GAA2B;;;;"}
|
|
@@ -4,9 +4,8 @@ import { SPAN_STATUS_ERROR } from '../spanstatus.js';
|
|
|
4
4
|
import { startSpanManual, startSpan } from '../trace.js';
|
|
5
5
|
import { handleCallbackErrors } from '../../utils/handleCallbackErrors.js';
|
|
6
6
|
import { GEN_AI_REQUEST_MODEL_ATTRIBUTE, GEN_AI_REQUEST_AVAILABLE_TOOLS_ATTRIBUTE, GEN_AI_EMBEDDINGS_INPUT_ATTRIBUTE, GEN_AI_SYSTEM_INSTRUCTIONS_ATTRIBUTE, GEN_AI_INPUT_MESSAGES_ATTRIBUTE, GEN_AI_INPUT_MESSAGES_ORIGINAL_LENGTH_ATTRIBUTE, GEN_AI_RESPONSE_MODEL_ATTRIBUTE, GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE, GEN_AI_RESPONSE_TEXT_ATTRIBUTE, GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE, GEN_AI_OPERATION_NAME_ATTRIBUTE, GEN_AI_SYSTEM_ATTRIBUTE, GEN_AI_REQUEST_TEMPERATURE_ATTRIBUTE, GEN_AI_REQUEST_TOP_P_ATTRIBUTE, GEN_AI_REQUEST_TOP_K_ATTRIBUTE, GEN_AI_REQUEST_MAX_TOKENS_ATTRIBUTE, GEN_AI_REQUEST_FREQUENCY_PENALTY_ATTRIBUTE, GEN_AI_REQUEST_PRESENCE_PENALTY_ATTRIBUTE } from '../ai/gen-ai-attributes.js';
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import { CHATS_CREATE_METHOD, GOOGLE_GENAI_METHOD_REGISTRY, CHAT_PATH, GOOGLE_GENAI_SYSTEM_NAME } from './constants.js';
|
|
7
|
+
import { resolveAIRecordingOptions, shouldEnableTruncation, buildMethodPath, extractSystemInstructions, getTruncatedJsonString, getJsonString } from '../ai/utils.js';
|
|
8
|
+
import { GOOGLE_GENAI_METHOD_REGISTRY, GOOGLE_GENAI_SYSTEM_NAME } from './constants.js';
|
|
10
9
|
import { instrumentStream } from './streaming.js';
|
|
11
10
|
import { contentUnionToMessages } from './utils.js';
|
|
12
11
|
|
|
@@ -110,7 +109,12 @@ function extractRequestAttributes(
|
|
|
110
109
|
* This is only recorded if recordInputs is true.
|
|
111
110
|
* Handles different parameter formats for different Google GenAI methods.
|
|
112
111
|
*/
|
|
113
|
-
function addPrivateRequestAttributes(
|
|
112
|
+
function addPrivateRequestAttributes(
|
|
113
|
+
span,
|
|
114
|
+
params,
|
|
115
|
+
isEmbeddings,
|
|
116
|
+
enableTruncation,
|
|
117
|
+
) {
|
|
114
118
|
if (isEmbeddings) {
|
|
115
119
|
const contents = params.contents;
|
|
116
120
|
if (contents != null) {
|
|
@@ -160,7 +164,9 @@ function addPrivateRequestAttributes(span, params, isEmbeddings) {
|
|
|
160
164
|
const filteredLength = Array.isArray(filteredMessages) ? filteredMessages.length : 0;
|
|
161
165
|
span.setAttributes({
|
|
162
166
|
[GEN_AI_INPUT_MESSAGES_ORIGINAL_LENGTH_ATTRIBUTE]: filteredLength,
|
|
163
|
-
[GEN_AI_INPUT_MESSAGES_ATTRIBUTE]:
|
|
167
|
+
[GEN_AI_INPUT_MESSAGES_ATTRIBUTE]: enableTruncation
|
|
168
|
+
? getTruncatedJsonString(filteredMessages)
|
|
169
|
+
: getJsonString(filteredMessages),
|
|
164
170
|
});
|
|
165
171
|
}
|
|
166
172
|
}
|
|
@@ -240,12 +246,11 @@ function instrumentMethod(
|
|
|
240
246
|
context,
|
|
241
247
|
options,
|
|
242
248
|
) {
|
|
243
|
-
const isSyncCreate = methodPath === CHATS_CREATE_METHOD;
|
|
244
249
|
const isEmbeddings = instrumentedMethod.operation === 'embeddings';
|
|
245
250
|
|
|
246
251
|
return new Proxy(originalMethod, {
|
|
247
252
|
apply(target, _, args) {
|
|
248
|
-
const operationName = instrumentedMethod.operation;
|
|
253
|
+
const operationName = instrumentedMethod.operation || 'unknown';
|
|
249
254
|
const params = args[0] ;
|
|
250
255
|
const requestAttributes = extractRequestAttributes(operationName, params, context);
|
|
251
256
|
const model = requestAttributes[GEN_AI_REQUEST_MODEL_ATTRIBUTE] ?? 'unknown';
|
|
@@ -262,7 +267,12 @@ function instrumentMethod(
|
|
|
262
267
|
async (span) => {
|
|
263
268
|
try {
|
|
264
269
|
if (options.recordInputs && params) {
|
|
265
|
-
addPrivateRequestAttributes(
|
|
270
|
+
addPrivateRequestAttributes(
|
|
271
|
+
span,
|
|
272
|
+
params,
|
|
273
|
+
isEmbeddings,
|
|
274
|
+
shouldEnableTruncation(options.enableTruncation),
|
|
275
|
+
);
|
|
266
276
|
}
|
|
267
277
|
const stream = await target.apply(context, args);
|
|
268
278
|
return instrumentStream(stream, span, Boolean(options.recordOutputs)) ;
|
|
@@ -284,13 +294,13 @@ function instrumentMethod(
|
|
|
284
294
|
// Single span for both sync and async operations
|
|
285
295
|
return startSpan(
|
|
286
296
|
{
|
|
287
|
-
name:
|
|
297
|
+
name: `${operationName} ${model}`,
|
|
288
298
|
op: `gen_ai.${operationName}`,
|
|
289
299
|
attributes: requestAttributes,
|
|
290
300
|
},
|
|
291
301
|
(span) => {
|
|
292
302
|
if (options.recordInputs && params) {
|
|
293
|
-
addPrivateRequestAttributes(span, params, isEmbeddings);
|
|
303
|
+
addPrivateRequestAttributes(span, params, isEmbeddings, shouldEnableTruncation(options.enableTruncation));
|
|
294
304
|
}
|
|
295
305
|
|
|
296
306
|
return handleCallbackErrors(
|
|
@@ -302,8 +312,8 @@ function instrumentMethod(
|
|
|
302
312
|
},
|
|
303
313
|
() => {},
|
|
304
314
|
result => {
|
|
305
|
-
// Only add response attributes for content-producing methods, not for
|
|
306
|
-
if (!
|
|
315
|
+
// Only add response attributes for content-producing methods, not for embeddings
|
|
316
|
+
if (!isEmbeddings) {
|
|
307
317
|
addResponseAttributes(span, result, options.recordOutputs);
|
|
308
318
|
}
|
|
309
319
|
},
|
|
@@ -324,34 +334,29 @@ function createDeepProxy(target, currentPath = '', options) {
|
|
|
324
334
|
const value = Reflect.get(t, prop, receiver);
|
|
325
335
|
const methodPath = buildMethodPath(currentPath, String(prop));
|
|
326
336
|
|
|
327
|
-
const instrumentedMethod =
|
|
337
|
+
const instrumentedMethod =
|
|
338
|
+
GOOGLE_GENAI_METHOD_REGISTRY[methodPath ];
|
|
328
339
|
if (typeof value === 'function' && instrumentedMethod) {
|
|
329
|
-
//
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
options,
|
|
337
|
-
);
|
|
338
|
-
return function instrumentedAndProxiedCreate(...args) {
|
|
339
|
-
const result = wrappedMethod(...args);
|
|
340
|
-
// If the result is an object (like a chat instance), proxy it too
|
|
341
|
-
if (result && typeof result === 'object') {
|
|
342
|
-
return createDeepProxy(result, CHAT_PATH, options);
|
|
343
|
-
}
|
|
344
|
-
return result;
|
|
345
|
-
};
|
|
340
|
+
// If an operation is specified, we need to instrument the method itself
|
|
341
|
+
const wrappedMethod = instrumentedMethod.operation
|
|
342
|
+
? instrumentMethod(value , methodPath, instrumentedMethod, t, options)
|
|
343
|
+
: value.bind(t);
|
|
344
|
+
|
|
345
|
+
if (!instrumentedMethod.proxyResultPath) {
|
|
346
|
+
return wrappedMethod;
|
|
346
347
|
}
|
|
347
348
|
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
349
|
+
// If a proxyResultPath is specified, we need to proxy the result of the method.
|
|
350
|
+
// Note: This currently only properly handles synchronous methods. For async methods,
|
|
351
|
+
// the Promise itself would be proxied instead of the resolved value. Currently we
|
|
352
|
+
// don't have a case where this is needed, so I'll keep it simple for now.
|
|
353
|
+
return function (...args) {
|
|
354
|
+
const result = wrappedMethod(...args);
|
|
355
|
+
if (result && typeof result === 'object') {
|
|
356
|
+
return createDeepProxy(result , instrumentedMethod.proxyResultPath, options);
|
|
357
|
+
}
|
|
358
|
+
return result;
|
|
359
|
+
};
|
|
355
360
|
}
|
|
356
361
|
|
|
357
362
|
if (typeof value === 'function') {
|