@sentry/core 10.51.0 → 10.53.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/browser.js +3 -0
- package/build/cjs/browser.js +529 -0
- package/build/cjs/browser.js.map +1 -0
- package/build/cjs/client.js +15 -2
- package/build/cjs/client.js.map +1 -1
- package/build/cjs/fetch.js +7 -4
- package/build/cjs/fetch.js.map +1 -1
- package/build/cjs/index.js +82 -62
- package/build/cjs/index.js.map +1 -1
- package/build/cjs/instrument/console.js +43 -3
- package/build/cjs/instrument/console.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/console.js +5 -1
- package/build/cjs/integrations/console.js.map +1 -1
- package/build/cjs/integrations/express/index.js +4 -6
- package/build/cjs/integrations/express/index.js.map +1 -1
- package/build/cjs/integrations/express/utils.js +0 -7
- package/build/cjs/integrations/express/utils.js.map +1 -1
- package/build/cjs/integrations/http/add-outgoing-request-breadcrumb.js +43 -0
- package/build/cjs/integrations/http/add-outgoing-request-breadcrumb.js.map +1 -0
- package/build/cjs/integrations/http/client-patch.js +113 -0
- package/build/cjs/integrations/http/client-patch.js.map +1 -0
- package/build/cjs/integrations/http/client-subscriptions.js +166 -0
- package/build/cjs/integrations/http/client-subscriptions.js.map +1 -0
- package/build/cjs/integrations/http/constants.js +10 -0
- package/build/cjs/integrations/http/constants.js.map +1 -0
- package/build/cjs/integrations/http/double-wrap-warning.js +29 -0
- package/build/cjs/integrations/http/double-wrap-warning.js.map +1 -0
- package/build/cjs/integrations/http/get-outgoing-span-data.js +88 -0
- package/build/cjs/integrations/http/get-outgoing-span-data.js.map +1 -0
- package/build/cjs/integrations/http/get-request-url.js +54 -0
- package/build/cjs/integrations/http/get-request-url.js.map +1 -0
- package/build/cjs/integrations/http/inject-trace-propagation-headers.js +81 -0
- package/build/cjs/integrations/http/inject-trace-propagation-headers.js.map +1 -0
- 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/handlers.js +72 -0
- package/build/cjs/integrations/mcp-server/handlers.js.map +1 -1
- package/build/cjs/integrations/mcp-server/index.js +10 -1
- package/build/cjs/integrations/mcp-server/index.js.map +1 -1
- package/build/cjs/integrations/requestdata.js +85 -3
- package/build/cjs/integrations/requestdata.js.map +1 -1
- package/build/cjs/integrations/supabase.js +4 -4
- package/build/cjs/integrations/supabase.js.map +1 -1
- package/build/cjs/logs/envelope.js +12 -2
- package/build/cjs/logs/envelope.js.map +1 -1
- package/build/cjs/logs/internal.js +7 -1
- package/build/cjs/logs/internal.js.map +1 -1
- package/build/cjs/metrics/envelope.js +15 -2
- package/build/cjs/metrics/envelope.js.map +1 -1
- package/build/cjs/metrics/internal.js +7 -1
- package/build/cjs/metrics/internal.js.map +1 -1
- package/build/cjs/server.js +563 -0
- package/build/cjs/server.js.map +1 -0
- package/build/cjs/tracing/ai/utils.js +2 -2
- package/build/cjs/tracing/ai/utils.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/embeddings.js +2 -2
- package/build/cjs/tracing/langchain/embeddings.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/langgraph/utils.js +2 -2
- package/build/cjs/tracing/langgraph/utils.js.map +1 -1
- package/build/cjs/tracing/openai/index.js +3 -3
- 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 +5 -0
- package/build/cjs/tracing/sentrySpan.js.map +1 -1
- package/build/cjs/tracing/spans/captureSpan.js +58 -23
- package/build/cjs/tracing/spans/captureSpan.js.map +1 -1
- package/build/cjs/tracing/spans/extractGenAiSpans.js +60 -0
- package/build/cjs/tracing/spans/extractGenAiSpans.js.map +1 -0
- package/build/cjs/tracing/spans/spanJsonToStreamedSpan.js +26 -0
- package/build/cjs/tracing/spans/spanJsonToStreamedSpan.js.map +1 -0
- 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 +8 -0
- package/build/cjs/tracing/vercel-ai/constants.js.map +1 -1
- package/build/cjs/tracing/vercel-ai/index.js +99 -15
- package/build/cjs/tracing/vercel-ai/index.js.map +1 -1
- package/build/cjs/trpc.js +3 -3
- package/build/cjs/trpc.js.map +1 -1
- package/build/cjs/utils/baggage.js +73 -0
- package/build/cjs/utils/baggage.js.map +1 -1
- package/build/cjs/utils/chain-and-copy-promiselike.js +1 -0
- package/build/cjs/utils/chain-and-copy-promiselike.js.map +1 -1
- package/build/cjs/utils/exports.js +7 -7
- package/build/cjs/utils/exports.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/get-default-export.js +32 -0
- package/build/cjs/utils/get-default-export.js.map +1 -0
- package/build/cjs/utils/request.js +129 -0
- package/build/cjs/utils/request.js.map +1 -1
- package/build/cjs/utils/spanUtils.js +1 -1
- package/build/cjs/utils/spanUtils.js.map +1 -1
- package/build/cjs/utils/string.js +9 -2
- package/build/cjs/utils/string.js.map +1 -1
- package/build/cjs/utils/traceData.js +2 -2
- package/build/cjs/utils/traceData.js.map +1 -1
- package/build/cjs/utils/version.js +1 -1
- package/build/esm/browser.js +142 -0
- package/build/esm/browser.js.map +1 -0
- package/build/esm/client.js +15 -2
- package/build/esm/client.js.map +1 -1
- package/build/esm/fetch.js +7 -4
- package/build/esm/fetch.js.map +1 -1
- package/build/esm/index.js +20 -15
- package/build/esm/index.js.map +1 -1
- package/build/esm/instrument/console.js +44 -5
- package/build/esm/instrument/console.js.map +1 -1
- package/build/esm/integrations/console.js +6 -2
- package/build/esm/integrations/console.js.map +1 -1
- package/build/esm/integrations/express/index.js +3 -5
- package/build/esm/integrations/express/index.js.map +1 -1
- package/build/esm/integrations/express/utils.js +1 -7
- package/build/esm/integrations/express/utils.js.map +1 -1
- package/build/esm/integrations/http/add-outgoing-request-breadcrumb.js +41 -0
- package/build/esm/integrations/http/add-outgoing-request-breadcrumb.js.map +1 -0
- package/build/esm/integrations/http/client-patch.js +111 -0
- package/build/esm/integrations/http/client-patch.js.map +1 -0
- package/build/esm/integrations/http/client-subscriptions.js +164 -0
- package/build/esm/integrations/http/client-subscriptions.js.map +1 -0
- package/build/esm/integrations/http/constants.js +6 -0
- package/build/esm/integrations/http/constants.js.map +1 -0
- package/build/esm/integrations/http/double-wrap-warning.js +26 -0
- package/build/esm/integrations/http/double-wrap-warning.js.map +1 -0
- package/build/esm/integrations/http/get-outgoing-span-data.js +85 -0
- package/build/esm/integrations/http/get-outgoing-span-data.js.map +1 -0
- package/build/esm/integrations/http/get-request-url.js +49 -0
- package/build/esm/integrations/http/get-request-url.js.map +1 -0
- package/build/esm/integrations/http/inject-trace-propagation-headers.js +79 -0
- package/build/esm/integrations/http/inject-trace-propagation-headers.js.map +1 -0
- package/build/esm/integrations/mcp-server/handlers.js +72 -1
- package/build/esm/integrations/mcp-server/handlers.js.map +1 -1
- package/build/esm/integrations/mcp-server/index.js +11 -2
- package/build/esm/integrations/mcp-server/index.js.map +1 -1
- package/build/esm/integrations/requestdata.js +85 -3
- package/build/esm/integrations/requestdata.js.map +1 -1
- package/build/esm/logs/envelope.js +12 -2
- package/build/esm/logs/envelope.js.map +1 -1
- package/build/esm/logs/internal.js +7 -1
- package/build/esm/logs/internal.js.map +1 -1
- package/build/esm/metrics/envelope.js +15 -2
- package/build/esm/metrics/envelope.js.map +1 -1
- package/build/esm/metrics/internal.js +7 -1
- package/build/esm/metrics/internal.js.map +1 -1
- package/build/esm/package.json +1 -1
- package/build/esm/server.js +157 -0
- package/build/esm/server.js.map +1 -0
- package/build/esm/tracing/sentrySpan.js +5 -0
- package/build/esm/tracing/sentrySpan.js.map +1 -1
- package/build/esm/tracing/spans/captureSpan.js +58 -23
- package/build/esm/tracing/spans/captureSpan.js.map +1 -1
- package/build/esm/tracing/spans/extractGenAiSpans.js +58 -0
- package/build/esm/tracing/spans/extractGenAiSpans.js.map +1 -0
- package/build/esm/tracing/spans/spanJsonToStreamedSpan.js +24 -0
- package/build/esm/tracing/spans/spanJsonToStreamedSpan.js.map +1 -0
- package/build/esm/tracing/trace.js +1 -1
- package/build/esm/tracing/trace.js.map +1 -1
- package/build/esm/tracing/vercel-ai/constants.js +8 -1
- package/build/esm/tracing/vercel-ai/constants.js.map +1 -1
- package/build/esm/tracing/vercel-ai/index.js +101 -18
- package/build/esm/tracing/vercel-ai/index.js.map +1 -1
- package/build/esm/utils/baggage.js +73 -1
- package/build/esm/utils/baggage.js.map +1 -1
- package/build/esm/utils/chain-and-copy-promiselike.js +1 -0
- package/build/esm/utils/chain-and-copy-promiselike.js.map +1 -1
- package/build/esm/utils/exports.js +7 -7
- package/build/esm/utils/exports.js.map +1 -1
- package/build/esm/utils/get-default-export.js +30 -0
- package/build/esm/utils/get-default-export.js.map +1 -0
- package/build/esm/utils/request.js +127 -1
- package/build/esm/utils/request.js.map +1 -1
- package/build/esm/utils/spanUtils.js +1 -1
- package/build/esm/utils/spanUtils.js.map +1 -1
- package/build/esm/utils/string.js +9 -2
- package/build/esm/utils/string.js.map +1 -1
- package/build/esm/utils/version.js +1 -1
- package/build/types/browser-exports.d.ts +11 -0
- package/build/types/browser-exports.d.ts.map +1 -0
- package/build/types/browser.d.ts +3 -0
- package/build/types/browser.d.ts.map +1 -0
- package/build/types/build-time-plugins/buildTimeOptionsBase.d.ts +8 -0
- package/build/types/build-time-plugins/buildTimeOptionsBase.d.ts.map +1 -1
- package/build/types/carrier.d.ts +1 -1
- package/build/types/carrier.d.ts.map +1 -1
- package/build/types/client.d.ts.map +1 -1
- package/build/types/fetch.d.ts.map +1 -1
- package/build/types/index.d.ts +3 -223
- package/build/types/index.d.ts.map +1 -1
- package/build/types/instrument/console.d.ts +7 -0
- package/build/types/instrument/console.d.ts.map +1 -1
- package/build/types/integrations/captureconsole.d.ts +1 -1
- package/build/types/integrations/captureconsole.d.ts.map +1 -1
- package/build/types/integrations/console.d.ts +5 -0
- package/build/types/integrations/console.d.ts.map +1 -1
- package/build/types/integrations/conversationId.d.ts +1 -1
- package/build/types/integrations/conversationId.d.ts.map +1 -1
- package/build/types/integrations/dedupe.d.ts +1 -1
- package/build/types/integrations/dedupe.d.ts.map +1 -1
- package/build/types/integrations/eventFilters.d.ts +2 -2
- package/build/types/integrations/eventFilters.d.ts.map +1 -1
- package/build/types/integrations/express/index.d.ts.map +1 -1
- package/build/types/integrations/express/utils.d.ts +1 -5
- package/build/types/integrations/express/utils.d.ts.map +1 -1
- package/build/types/integrations/extraerrordata.d.ts +1 -1
- package/build/types/integrations/extraerrordata.d.ts.map +1 -1
- package/build/types/integrations/functiontostring.d.ts +1 -1
- package/build/types/integrations/functiontostring.d.ts.map +1 -1
- package/build/types/integrations/http/add-outgoing-request-breadcrumb.d.ts +6 -0
- package/build/types/integrations/http/add-outgoing-request-breadcrumb.d.ts.map +1 -0
- package/build/types/integrations/http/client-patch.d.ts +46 -0
- package/build/types/integrations/http/client-patch.d.ts.map +1 -0
- package/build/types/integrations/http/client-subscriptions.d.ts +21 -0
- package/build/types/integrations/http/client-subscriptions.d.ts.map +1 -0
- package/build/types/integrations/http/constants.d.ts +6 -0
- package/build/types/integrations/http/constants.d.ts.map +1 -0
- package/build/types/integrations/http/double-wrap-warning.d.ts +4 -0
- package/build/types/integrations/http/double-wrap-warning.d.ts.map +1 -0
- package/build/types/integrations/http/get-outgoing-span-data.d.ts +13 -0
- package/build/types/integrations/http/get-outgoing-span-data.d.ts.map +1 -0
- package/build/types/integrations/http/get-request-url.d.ts +10 -0
- package/build/types/integrations/http/get-request-url.d.ts.map +1 -0
- package/build/types/integrations/http/index.d.ts +4 -0
- package/build/types/integrations/http/index.d.ts.map +1 -0
- package/build/types/integrations/http/inject-trace-propagation-headers.d.ts +12 -0
- package/build/types/integrations/http/inject-trace-propagation-headers.d.ts.map +1 -0
- package/build/types/integrations/http/types.d.ts +249 -0
- package/build/types/integrations/http/types.d.ts.map +1 -0
- package/build/types/integrations/linkederrors.d.ts +1 -1
- package/build/types/integrations/linkederrors.d.ts.map +1 -1
- package/build/types/integrations/mcp-server/handlers.d.ts +18 -0
- package/build/types/integrations/mcp-server/handlers.d.ts.map +1 -1
- package/build/types/integrations/mcp-server/index.d.ts +8 -1
- package/build/types/integrations/mcp-server/index.d.ts.map +1 -1
- package/build/types/integrations/requestdata.d.ts +1 -1
- package/build/types/integrations/requestdata.d.ts.map +1 -1
- package/build/types/integrations/spanStreaming.d.ts +1 -1
- package/build/types/integrations/spanStreaming.d.ts.map +1 -1
- package/build/types/integrations/supabase.d.ts +1 -1
- package/build/types/integrations/supabase.d.ts.map +1 -1
- package/build/types/integrations/zoderrors.d.ts +1 -1
- package/build/types/integrations/zoderrors.d.ts.map +1 -1
- package/build/types/logs/console-integration.d.ts +1 -1
- package/build/types/logs/console-integration.d.ts.map +1 -1
- package/build/types/logs/envelope.d.ts +5 -2
- package/build/types/logs/envelope.d.ts.map +1 -1
- package/build/types/logs/internal.d.ts.map +1 -1
- package/build/types/metrics/envelope.d.ts +5 -2
- package/build/types/metrics/envelope.d.ts.map +1 -1
- package/build/types/metrics/internal.d.ts.map +1 -1
- package/build/types/server-exports.d.ts +26 -0
- package/build/types/server-exports.d.ts.map +1 -0
- package/build/types/server.d.ts +10 -0
- package/build/types/server.d.ts.map +1 -0
- package/build/types/shared-exports.d.ts +215 -0
- package/build/types/shared-exports.d.ts.map +1 -0
- package/build/types/tracing/index.d.ts +1 -1
- package/build/types/tracing/index.d.ts.map +1 -1
- package/build/types/tracing/sentrySpan.d.ts.map +1 -1
- package/build/types/tracing/spans/captureSpan.d.ts +4 -4
- package/build/types/tracing/spans/captureSpan.d.ts.map +1 -1
- package/build/types/tracing/spans/extractGenAiSpans.d.ts +15 -0
- package/build/types/tracing/spans/extractGenAiSpans.d.ts.map +1 -0
- package/build/types/tracing/spans/spanJsonToStreamedSpan.d.ts +6 -0
- package/build/types/tracing/spans/spanJsonToStreamedSpan.d.ts.map +1 -0
- package/build/types/tracing/trace.d.ts +1 -0
- package/build/types/tracing/trace.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 +9 -0
- package/build/types/tracing/vercel-ai/index.d.ts.map +1 -1
- package/build/types/types-hoist/envelope.d.ts +1 -1
- package/build/types/types-hoist/envelope.d.ts.map +1 -1
- package/build/types/types-hoist/log.d.ts +5 -0
- package/build/types/types-hoist/log.d.ts.map +1 -1
- package/build/types/types-hoist/metric.d.ts +5 -0
- package/build/types/types-hoist/metric.d.ts.map +1 -1
- package/build/types/types-hoist/options.d.ts +8 -0
- package/build/types/types-hoist/options.d.ts.map +1 -1
- package/build/types/types-hoist/webfetchapi.d.ts +2 -0
- package/build/types/types-hoist/webfetchapi.d.ts.map +1 -1
- package/build/types/utils/baggage.d.ts +13 -0
- package/build/types/utils/baggage.d.ts.map +1 -1
- package/build/types/utils/get-default-export.d.ts +22 -0
- package/build/types/utils/get-default-export.d.ts.map +1 -0
- package/build/types/utils/request.d.ts +30 -0
- package/build/types/utils/request.d.ts.map +1 -1
- package/build/types/utils/spanUtils.d.ts +1 -1
- package/build/types/utils/string.d.ts +1 -1
- package/build/types/utils/string.d.ts.map +1 -1
- package/build/types-ts3.8/browser-exports.d.ts +11 -0
- package/build/types-ts3.8/browser.d.ts +3 -0
- package/build/types-ts3.8/build-time-plugins/buildTimeOptionsBase.d.ts +8 -0
- package/build/types-ts3.8/carrier.d.ts +1 -1
- package/build/types-ts3.8/index.d.ts +3 -225
- package/build/types-ts3.8/instrument/console.d.ts +7 -0
- package/build/types-ts3.8/integrations/captureconsole.d.ts +1 -1
- package/build/types-ts3.8/integrations/console.d.ts +5 -0
- package/build/types-ts3.8/integrations/conversationId.d.ts +1 -1
- package/build/types-ts3.8/integrations/dedupe.d.ts +1 -1
- package/build/types-ts3.8/integrations/eventFilters.d.ts +2 -2
- package/build/types-ts3.8/integrations/express/utils.d.ts +1 -5
- package/build/types-ts3.8/integrations/extraerrordata.d.ts +1 -1
- package/build/types-ts3.8/integrations/functiontostring.d.ts +1 -1
- package/build/types-ts3.8/integrations/http/add-outgoing-request-breadcrumb.d.ts +6 -0
- package/build/types-ts3.8/integrations/http/client-patch.d.ts +46 -0
- package/build/types-ts3.8/integrations/http/client-subscriptions.d.ts +21 -0
- package/build/types-ts3.8/integrations/http/constants.d.ts +6 -0
- package/build/types-ts3.8/integrations/http/double-wrap-warning.d.ts +4 -0
- package/build/types-ts3.8/integrations/http/get-outgoing-span-data.d.ts +13 -0
- package/build/types-ts3.8/integrations/http/get-request-url.d.ts +10 -0
- package/build/types-ts3.8/integrations/http/index.d.ts +4 -0
- package/build/types-ts3.8/integrations/http/inject-trace-propagation-headers.d.ts +12 -0
- package/build/types-ts3.8/integrations/http/types.d.ts +252 -0
- package/build/types-ts3.8/integrations/linkederrors.d.ts +1 -1
- package/build/types-ts3.8/integrations/mcp-server/handlers.d.ts +18 -0
- package/build/types-ts3.8/integrations/mcp-server/index.d.ts +8 -1
- package/build/types-ts3.8/integrations/requestdata.d.ts +1 -1
- package/build/types-ts3.8/integrations/spanStreaming.d.ts +1 -1
- package/build/types-ts3.8/integrations/supabase.d.ts +1 -1
- package/build/types-ts3.8/integrations/zoderrors.d.ts +1 -1
- package/build/types-ts3.8/logs/console-integration.d.ts +1 -1
- package/build/types-ts3.8/logs/envelope.d.ts +5 -2
- package/build/types-ts3.8/metrics/envelope.d.ts +5 -2
- package/build/types-ts3.8/server-exports.d.ts +21 -0
- package/build/types-ts3.8/server.d.ts +10 -0
- package/build/types-ts3.8/shared-exports.d.ts +214 -0
- package/build/types-ts3.8/tracing/index.d.ts +1 -1
- package/build/types-ts3.8/tracing/spans/captureSpan.d.ts +4 -4
- package/build/types-ts3.8/tracing/spans/extractGenAiSpans.d.ts +15 -0
- package/build/types-ts3.8/tracing/spans/spanJsonToStreamedSpan.d.ts +6 -0
- package/build/types-ts3.8/tracing/trace.d.ts +1 -0
- package/build/types-ts3.8/tracing/vercel-ai/constants.d.ts +1 -0
- package/build/types-ts3.8/tracing/vercel-ai/index.d.ts +9 -0
- package/build/types-ts3.8/types-hoist/envelope.d.ts +1 -1
- package/build/types-ts3.8/types-hoist/log.d.ts +5 -0
- package/build/types-ts3.8/types-hoist/metric.d.ts +5 -0
- package/build/types-ts3.8/types-hoist/options.d.ts +8 -0
- package/build/types-ts3.8/types-hoist/webfetchapi.d.ts +2 -0
- package/build/types-ts3.8/utils/baggage.d.ts +13 -0
- package/build/types-ts3.8/utils/get-default-export.d.ts +22 -0
- package/build/types-ts3.8/utils/request.d.ts +30 -0
- package/build/types-ts3.8/utils/spanUtils.d.ts +1 -1
- package/build/types-ts3.8/utils/string.d.ts +1 -1
- package/package.json +24 -2
- package/server.js +3 -0
package/build/esm/index.js
CHANGED
|
@@ -4,7 +4,7 @@ export { TRACING_DEFAULTS, startIdleSpan } from './tracing/idleSpan.js';
|
|
|
4
4
|
export { SentrySpan } from './tracing/sentrySpan.js';
|
|
5
5
|
export { SentryNonRecordingSpan } from './tracing/sentryNonRecordingSpan.js';
|
|
6
6
|
export { SPAN_STATUS_ERROR, SPAN_STATUS_OK, SPAN_STATUS_UNSET, getSpanStatusFromHttpCode, setHttpStatus } from './tracing/spanstatus.js';
|
|
7
|
-
export { continueTrace, startInactiveSpan, startNewTrace, startSpan, startSpanManual, suppressTracing, withActiveSpan } from './tracing/trace.js';
|
|
7
|
+
export { SUPPRESS_TRACING_KEY, continueTrace, startInactiveSpan, startNewTrace, startSpan, startSpanManual, suppressTracing, withActiveSpan } from './tracing/trace.js';
|
|
8
8
|
export { getDynamicSamplingContextFromClient, getDynamicSamplingContextFromScope, getDynamicSamplingContextFromSpan, spanToBaggageHeader } from './tracing/dynamicSamplingContext.js';
|
|
9
9
|
export { setMeasurement, timedEventsToMeasurements } from './tracing/measurement.js';
|
|
10
10
|
export { sampleSpan } from './tracing/sampling.js';
|
|
@@ -22,7 +22,6 @@ export { Scope } from './scope.js';
|
|
|
22
22
|
export { notifyEventProcessors } from './eventProcessors.js';
|
|
23
23
|
export { SENTRY_API_VERSION, getEnvelopeEndpointWithUrlEncodedAuth, getReportDialogEndpoint } from './api.js';
|
|
24
24
|
export { Client } from './client.js';
|
|
25
|
-
export { ServerRuntimeClient } from './server-runtime-client.js';
|
|
26
25
|
export { initAndBind, setCurrentClient } from './sdk.js';
|
|
27
26
|
export { createTransport } from './transports/base.js';
|
|
28
27
|
export { makeOfflineTransport } from './transports/offline.js';
|
|
@@ -50,7 +49,7 @@ export { getTraceMetaTags } from './utils/meta.js';
|
|
|
50
49
|
export { debounce } from './utils/debounce.js';
|
|
51
50
|
export { derefWeakRef, makeWeakRef } from './utils/weakRef.js';
|
|
52
51
|
export { shouldIgnoreSpan } from './utils/should-ignore-span.js';
|
|
53
|
-
export { extractQueryParamsFromUrl, headersToDict, httpHeadersToSpanAttributes, httpRequestToRequestData, winterCGHeadersToDict, winterCGRequestToRequestData } from './utils/request.js';
|
|
52
|
+
export { MAX_BODY_BYTE_LENGTH, captureBodyFromWinterCGRequest, extractQueryParamsFromUrl, getMaxBodyByteLength, headersToDict, httpHeadersToSpanAttributes, httpRequestToRequestData, winterCGHeadersToDict, winterCGRequestToRequestData } from './utils/request.js';
|
|
54
53
|
export { DEFAULT_ENVIRONMENT, DEV_ENVIRONMENT } from './constants.js';
|
|
55
54
|
export { addBreadcrumb } from './breadcrumbs.js';
|
|
56
55
|
export { functionToStringIntegration } from './integrations/functiontostring.js';
|
|
@@ -59,12 +58,10 @@ export { linkedErrorsIntegration } from './integrations/linkederrors.js';
|
|
|
59
58
|
export { moduleMetadataIntegration } from './integrations/moduleMetadata.js';
|
|
60
59
|
export { requestDataIntegration } from './integrations/requestdata.js';
|
|
61
60
|
export { captureConsoleIntegration } from './integrations/captureconsole.js';
|
|
62
|
-
export { expressErrorHandler, patchExpressModule, setupExpressErrorHandler } from './integrations/express/index.js';
|
|
63
61
|
export { dedupeIntegration } from './integrations/dedupe.js';
|
|
64
62
|
export { extraErrorDataIntegration } from './integrations/extraerrordata.js';
|
|
65
63
|
export { rewriteFramesIntegration } from './integrations/rewriteframes.js';
|
|
66
64
|
export { instrumentSupabaseClient, supabaseIntegration } from './integrations/supabase.js';
|
|
67
|
-
export { instrumentPostgresJsSql } from './integrations/postgresjs.js';
|
|
68
65
|
export { zodErrorsIntegration } from './integrations/zoderrors.js';
|
|
69
66
|
export { thirdPartyErrorFilterIntegration } from './integrations/third-party-errors-filter.js';
|
|
70
67
|
export { consoleIntegration } from './integrations/console.js';
|
|
@@ -73,8 +70,6 @@ export { growthbookIntegration } from './integrations/featureFlags/growthbook.js
|
|
|
73
70
|
export { conversationIdIntegration } from './integrations/conversationId.js';
|
|
74
71
|
export { profiler } from './profiling.js';
|
|
75
72
|
export { _INTERNAL_getTracingHeadersForFetchRequest, instrumentFetchRequest } from './fetch.js';
|
|
76
|
-
export { trpcMiddleware } from './trpc.js';
|
|
77
|
-
export { wrapMcpServerWithSentry } from './integrations/mcp-server/index.js';
|
|
78
73
|
export { captureFeedback } from './feedback.js';
|
|
79
74
|
export { _INTERNAL_captureLog, _INTERNAL_captureSerializedLog, _INTERNAL_flushLogsBuffer } from './logs/internal.js';
|
|
80
75
|
import * as publicApi from './logs/public-api.js';
|
|
@@ -103,11 +98,10 @@ export { spanStreamingIntegration } from './integrations/spanStreaming.js';
|
|
|
103
98
|
export { _INTERNAL_FLAG_BUFFER_SIZE, _INTERNAL_MAX_FLAGS_PER_SPAN, _INTERNAL_addFeatureFlagToActiveSpan, _INTERNAL_copyFlagsFromScopeToEvent, _INTERNAL_insertFlagToScope } from './utils/featureFlags.js';
|
|
104
99
|
export { applyAggregateErrorsToEvent } from './utils/aggregate-errors.js';
|
|
105
100
|
export { getBreadcrumbLogLevelFromHttpStatusCode } from './utils/breadcrumb-log-level.js';
|
|
106
|
-
export { getComponentName, getLocationHref, htmlTreeAsString } from './utils/browser.js';
|
|
107
101
|
export { dsnFromString, dsnToString, makeDsn } from './utils/dsn.js';
|
|
108
102
|
export { SentryError } from './utils/error.js';
|
|
109
103
|
export { GLOBAL_OBJ } from './utils/worldwide.js';
|
|
110
|
-
export { addConsoleInstrumentationHandler } from './instrument/console.js';
|
|
104
|
+
export { addConsoleInstrumentationFilter, addConsoleInstrumentationHandler } from './instrument/console.js';
|
|
111
105
|
export { addFetchEndInstrumentationHandler, addFetchInstrumentationHandler } from './instrument/fetch.js';
|
|
112
106
|
export { addGlobalErrorInstrumentationHandler } from './instrument/globalError.js';
|
|
113
107
|
export { addGlobalUnhandledRejectionInstrumentationHandler } from './instrument/globalUnhandledRejection.js';
|
|
@@ -116,7 +110,6 @@ export { isDOMError, isDOMException, isElement, isError, isErrorEvent, isEvent,
|
|
|
116
110
|
export { isBrowser } from './utils/isBrowser.js';
|
|
117
111
|
export { CONSOLE_LEVELS, consoleSandbox, debug, originalConsoleMethods } from './utils/debug-logger.js';
|
|
118
112
|
export { addContextToFrame, addExceptionMechanism, addExceptionTypeValue, checkOrSetAlreadyCaught, getEventDescription, isAlreadyCaptured, parseSemver, uuid4 } from './utils/misc.js';
|
|
119
|
-
export { isNodeEnv, loadModule } from './utils/node.js';
|
|
120
113
|
export { normalize, normalizeToSize, normalizeUrlToBase } from './utils/normalize.js';
|
|
121
114
|
export { setNormalizationDepthOverrideHint, setSkipNormalizationHint } from './utils/normalizationHints.js';
|
|
122
115
|
export { addNonEnumerableProperty, convertToPlainObject, dropUndefinedKeys, extractExceptionKeysForMessage, fill, getOriginalFunction, markFunctionWrapped, objectify } from './utils/object.js';
|
|
@@ -125,7 +118,6 @@ export { SENTRY_BUFFER_FULL_ERROR, makePromiseBuffer } from './utils/promisebuff
|
|
|
125
118
|
export { severityLevelFromString } from './utils/severity.js';
|
|
126
119
|
export { replaceExports } from './utils/exports.js';
|
|
127
120
|
export { UNKNOWN_FUNCTION, createStackParser, getFramesFromEvent, getFunctionName, stackParserFromStackParserOptions, stripSentryFramesAndReverse } from './utils/stacktrace.js';
|
|
128
|
-
export { filenameIsInApp, node, nodeStackLineParser } from './utils/node-stack-trace.js';
|
|
129
121
|
export { isMatchingPattern, safeJoin, snipLine, stringMatchesSomePattern, truncate } from './utils/string.js';
|
|
130
122
|
export { isNativeFunction, supportsDOMError, supportsDOMException, supportsErrorEvent, supportsFetch, supportsHistory, supportsNativeFetch, supportsReferrerPolicy, supportsReportingObserver } from './utils/supports.js';
|
|
131
123
|
export { SyncPromise, rejectedSyncPromise, resolvedSyncPromise } from './utils/syncpromise.js';
|
|
@@ -135,19 +127,32 @@ export { getSDKSource, isBrowserBundle } from './utils/env.js';
|
|
|
135
127
|
export { addItemToEnvelope, createAttachmentEnvelopeItem, createEnvelope, createEventEnvelopeHeaders, createSpanEnvelopeItem, envelopeContainsItemType, envelopeItemTypeToDataCategory, forEachEnvelopeItem, getSdkMetadataForEnvelopeHeader, parseEnvelope, serializeEnvelope } from './utils/envelope.js';
|
|
136
128
|
export { createClientReportEnvelope } from './utils/clientreport.js';
|
|
137
129
|
export { DEFAULT_RETRY_AFTER, disabledUntil, isRateLimited, parseRetryAfterHeader, updateRateLimits } from './utils/ratelimit.js';
|
|
138
|
-
export { MAX_BAGGAGE_STRING_LENGTH, SENTRY_BAGGAGE_KEY_PREFIX, SENTRY_BAGGAGE_KEY_PREFIX_REGEX, baggageHeaderToDynamicSamplingContext, dynamicSamplingContextToSentryBaggageHeader, objectToBaggageHeader, parseBaggageHeader } from './utils/baggage.js';
|
|
130
|
+
export { MAX_BAGGAGE_STRING_LENGTH, SENTRY_BAGGAGE_KEY_PREFIX, SENTRY_BAGGAGE_KEY_PREFIX_REGEX, baggageHeaderToDynamicSamplingContext, dynamicSamplingContextToSentryBaggageHeader, mergeBaggageHeaders, objectToBaggageHeader, parseBaggageHeader } from './utils/baggage.js';
|
|
139
131
|
export { getHttpSpanDetailsFromUrlObject, getSanitizedUrlString, getSanitizedUrlStringFromUrlObject, isURLObjectRelative, parseStringToURLObject, parseUrl, stripDataUrlContent, stripUrlQueryAndFragment } from './utils/url.js';
|
|
140
132
|
export { _enhanceErrorWithSentryInfo as _INTERNAL_enhanceErrorWithSentryInfo, eventFromMessage, eventFromUnknownInput, exceptionFromError, parseStackFrames } from './utils/eventbuilder.js';
|
|
141
|
-
export { callFrameToStackFrame, watchdogTimer } from './utils/anr.js';
|
|
142
133
|
export { LRUMap } from './utils/lru.js';
|
|
143
134
|
export { generateSpanId, generateTraceId } from './utils/propagationContext.js';
|
|
144
|
-
export { vercelWaitUntil } from './utils/vercelWaitUntil.js';
|
|
145
|
-
export { flushIfServerless } from './utils/flushIfServerless.js';
|
|
146
135
|
export { SDK_VERSION } from './utils/version.js';
|
|
147
136
|
export { getDebugImagesForResources, getFilenameToDebugIdMap } from './utils/debug-ids.js';
|
|
148
137
|
export { getFilenameToMetadataMap } from './metadata.js';
|
|
149
138
|
export { escapeStringForRegex } from './vendor/escapeStringForRegex.js';
|
|
150
139
|
export { safeDateNow as _INTERNAL_safeDateNow, safeMathRandom as _INTERNAL_safeMathRandom, withRandomSafeContext as _INTERNAL_withRandomSafeContext } from './utils/randomSafeContext.js';
|
|
140
|
+
export { ServerRuntimeClient } from './server-runtime-client.js';
|
|
141
|
+
export { trpcMiddleware } from './trpc.js';
|
|
142
|
+
export { wrapMcpServerWithSentry } from './integrations/mcp-server/index.js';
|
|
143
|
+
export { isNodeEnv, loadModule } from './utils/node.js';
|
|
144
|
+
export { filenameIsInApp, node, nodeStackLineParser } from './utils/node-stack-trace.js';
|
|
145
|
+
export { vercelWaitUntil } from './utils/vercelWaitUntil.js';
|
|
146
|
+
export { flushIfServerless } from './utils/flushIfServerless.js';
|
|
147
|
+
export { callFrameToStackFrame, watchdogTimer } from './utils/anr.js';
|
|
151
148
|
export { safeUnref as _INTERNAL_safeUnref } from './utils/timer.js';
|
|
149
|
+
export { expressErrorHandler, patchExpressModule, setupExpressErrorHandler } from './integrations/express/index.js';
|
|
150
|
+
export { instrumentPostgresJsSql } from './integrations/postgresjs.js';
|
|
151
|
+
export { patchHttpModuleClient } from './integrations/http/client-patch.js';
|
|
152
|
+
export { getHttpClientSubscriptions } from './integrations/http/client-subscriptions.js';
|
|
153
|
+
export { addOutgoingRequestBreadcrumb } from './integrations/http/add-outgoing-request-breadcrumb.js';
|
|
154
|
+
export { getRequestOptions, getRequestUrl, getRequestUrlFromClientRequest, getRequestUrlObject } from './integrations/http/get-request-url.js';
|
|
155
|
+
export { HTTP_ON_CLIENT_REQUEST, HTTP_ON_SERVER_REQUEST } from './integrations/http/constants.js';
|
|
156
|
+
export { getComponentName, getLocationHref, htmlTreeAsString } from './utils/browser.js';
|
|
152
157
|
export { instrumentLangChainEmbeddings } from './tracing/langchain/embeddings.js';
|
|
153
158
|
//# sourceMappingURL=index.js.map
|
package/build/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1,8 +1,20 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DEBUG_BUILD } from '../debug-build.js';
|
|
2
|
+
import { CONSOLE_LEVELS, originalConsoleMethods, debug } from '../utils/debug-logger.js';
|
|
2
3
|
import { fill } from '../utils/object.js';
|
|
4
|
+
import { stringMatchesSomePattern } from '../utils/string.js';
|
|
3
5
|
import { GLOBAL_OBJ } from '../utils/worldwide.js';
|
|
4
6
|
import { addHandler, maybeInstrument, triggerHandlers } from './handlers.js';
|
|
5
7
|
|
|
8
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
9
|
+
/* eslint-disable @typescript-eslint/ban-types */
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Filter out console messages that match the given strings or regular expressions.
|
|
13
|
+
* These will neither be passed to the handler, and they will also not be logged to the user, unless they have debug enabled.
|
|
14
|
+
* This is a set to avoid duplicate integration setups to add the same filter multiple times.
|
|
15
|
+
*/
|
|
16
|
+
const _filter = new Set([]);
|
|
17
|
+
|
|
6
18
|
/**
|
|
7
19
|
* Add an instrumentation handler for when a console.xxx method is called.
|
|
8
20
|
* Returns a function to remove the handler.
|
|
@@ -17,6 +29,22 @@ function addConsoleInstrumentationHandler(handler) {
|
|
|
17
29
|
return removeHandler;
|
|
18
30
|
}
|
|
19
31
|
|
|
32
|
+
/**
|
|
33
|
+
* Add a filter to the console instrumentation to filter out console messages that match the given strings or regular expressions.
|
|
34
|
+
* Returns a function to remove the filter.
|
|
35
|
+
*/
|
|
36
|
+
function addConsoleInstrumentationFilter(filter) {
|
|
37
|
+
for (const f of filter) {
|
|
38
|
+
_filter.add(f);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return () => {
|
|
42
|
+
for (const f of filter) {
|
|
43
|
+
_filter.delete(f);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
20
48
|
function instrumentConsole() {
|
|
21
49
|
if (!('console' in GLOBAL_OBJ)) {
|
|
22
50
|
return;
|
|
@@ -31,14 +59,25 @@ function instrumentConsole() {
|
|
|
31
59
|
originalConsoleMethods[level] = originalConsoleMethod;
|
|
32
60
|
|
|
33
61
|
return function (...args) {
|
|
34
|
-
|
|
35
|
-
|
|
62
|
+
const firstArg = args[0];
|
|
36
63
|
const log = originalConsoleMethods[level];
|
|
37
|
-
|
|
64
|
+
|
|
65
|
+
const isFiltered = _filter.size && typeof firstArg === 'string' && stringMatchesSomePattern(firstArg, _filter);
|
|
66
|
+
|
|
67
|
+
// Only trigger handlers for non-filtered messages
|
|
68
|
+
if (!isFiltered) {
|
|
69
|
+
triggerHandlers('console', { args, level } );
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Only log filtered messages in debug mode
|
|
73
|
+
if (!isFiltered || (DEBUG_BUILD && debug.isEnabled())) {
|
|
74
|
+
// Call original console method
|
|
75
|
+
log?.apply(GLOBAL_OBJ.console, args);
|
|
76
|
+
}
|
|
38
77
|
};
|
|
39
78
|
});
|
|
40
79
|
});
|
|
41
80
|
}
|
|
42
81
|
|
|
43
|
-
export { addConsoleInstrumentationHandler };
|
|
82
|
+
export { addConsoleInstrumentationFilter, addConsoleInstrumentationHandler };
|
|
44
83
|
//# sourceMappingURL=console.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"console.js","sources":["../../../src/instrument/console.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/ban-types */\nimport type { ConsoleLevel, HandlerDataConsole } from '../types-hoist/instrument';\nimport { CONSOLE_LEVELS, originalConsoleMethods } from '../utils/debug-logger';\nimport { fill } from '../utils/object';\nimport { GLOBAL_OBJ } from '../utils/worldwide';\nimport { addHandler, maybeInstrument, triggerHandlers } from './handlers';\n\n/**\n * Add an instrumentation handler for when a console.xxx method is called.\n * Returns a function to remove the handler.\n *\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nexport function addConsoleInstrumentationHandler(handler: (data: HandlerDataConsole) => void): () => void {\n const type = 'console';\n const removeHandler = addHandler(type, handler);\n maybeInstrument(type, instrumentConsole);\n return removeHandler;\n}\n\nfunction instrumentConsole(): void {\n if (!('console' in GLOBAL_OBJ)) {\n return;\n }\n\n CONSOLE_LEVELS.forEach(function (level: ConsoleLevel): void {\n if (!(level in GLOBAL_OBJ.console)) {\n return;\n }\n\n fill(GLOBAL_OBJ.console, level, function (originalConsoleMethod: () => any): Function {\n originalConsoleMethods[level] = originalConsoleMethod;\n\n return function (...args: any[]): void {\n triggerHandlers('console', { args, level } as HandlerDataConsole);\n\n
|
|
1
|
+
{"version":3,"file":"console.js","sources":["../../../src/instrument/console.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/ban-types */\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { ConsoleLevel, HandlerDataConsole } from '../types-hoist/instrument';\nimport { CONSOLE_LEVELS, originalConsoleMethods } from '../utils/debug-logger';\nimport { fill } from '../utils/object';\nimport { stringMatchesSomePattern } from '../utils/string';\nimport { GLOBAL_OBJ } from '../utils/worldwide';\nimport { addHandler, maybeInstrument, triggerHandlers } from './handlers';\nimport { debug } from '../utils/debug-logger';\n\n/**\n * Filter out console messages that match the given strings or regular expressions.\n * These will neither be passed to the handler, and they will also not be logged to the user, unless they have debug enabled.\n * This is a set to avoid duplicate integration setups to add the same filter multiple times.\n */\nconst _filter = new Set<string | RegExp>([]);\n\n/**\n * Add an instrumentation handler for when a console.xxx method is called.\n * Returns a function to remove the handler.\n *\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nexport function addConsoleInstrumentationHandler(handler: (data: HandlerDataConsole) => void): () => void {\n const type = 'console';\n const removeHandler = addHandler(type, handler);\n maybeInstrument(type, instrumentConsole);\n return removeHandler;\n}\n\n/**\n * Add a filter to the console instrumentation to filter out console messages that match the given strings or regular expressions.\n * Returns a function to remove the filter.\n */\nexport function addConsoleInstrumentationFilter(filter: (string | RegExp)[]): () => void {\n for (const f of filter) {\n _filter.add(f);\n }\n\n return () => {\n for (const f of filter) {\n _filter.delete(f);\n }\n };\n}\n\n/** Only exported for tests. */\nexport function _INTERNAL_resetConsoleInstrumentationOptions(): void {\n _filter.clear();\n}\n\nfunction instrumentConsole(): void {\n if (!('console' in GLOBAL_OBJ)) {\n return;\n }\n\n CONSOLE_LEVELS.forEach(function (level: ConsoleLevel): void {\n if (!(level in GLOBAL_OBJ.console)) {\n return;\n }\n\n fill(GLOBAL_OBJ.console, level, function (originalConsoleMethod: () => any): Function {\n originalConsoleMethods[level] = originalConsoleMethod;\n\n return function (...args: any[]): void {\n const firstArg = args[0];\n const log = originalConsoleMethods[level];\n\n const isFiltered = _filter.size && typeof firstArg === 'string' && stringMatchesSomePattern(firstArg, _filter);\n\n // Only trigger handlers for non-filtered messages\n if (!isFiltered) {\n triggerHandlers('console', { args, level } as HandlerDataConsole);\n }\n\n // Only log filtered messages in debug mode\n if (!isFiltered || (DEBUG_BUILD && debug.isEnabled())) {\n // Call original console method\n log?.apply(GLOBAL_OBJ.console, args);\n }\n };\n });\n });\n}\n"],"names":[],"mappings":";;;;;;;AAAA;AACA;;AAUA;AACA;AACA;AACA;AACA;AACA,MAAM,UAAU,IAAI,GAAG,CAAkB,EAAE,CAAC;;AAE5C;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,gCAAgC,CAAC,OAAO,EAAkD;AAC1G,EAAE,MAAM,IAAA,GAAO,SAAS;AACxB,EAAE,MAAM,gBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC;AACjD,EAAE,eAAe,CAAC,IAAI,EAAE,iBAAiB,CAAC;AAC1C,EAAE,OAAO,aAAa;AACtB;;AAEA;AACA;AACA;AACA;AACO,SAAS,+BAA+B,CAAC,MAAM,EAAmC;AACzF,EAAE,KAAK,MAAM,CAAA,IAAK,MAAM,EAAE;AAC1B,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AAClB,EAAE;;AAEF,EAAE,OAAO,MAAM;AACf,IAAI,KAAK,MAAM,CAAA,IAAK,MAAM,EAAE;AAC5B,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AACvB,IAAI;AACJ,EAAE,CAAC;AACH;;AAOA,SAAS,iBAAiB,GAAS;AACnC,EAAE,IAAI,EAAE,aAAa,UAAU,CAAC,EAAE;AAClC,IAAI;AACJ,EAAE;;AAEF,EAAE,cAAc,CAAC,OAAO,CAAC,UAAU,KAAK,EAAsB;AAC9D,IAAI,IAAI,EAAE,KAAA,IAAS,UAAU,CAAC,OAAO,CAAC,EAAE;AACxC,MAAM;AACN,IAAI;;AAEJ,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,UAAU,qBAAqB,EAAuB;AAC1F,MAAM,sBAAsB,CAAC,KAAK,CAAA,GAAI,qBAAqB;;AAE3D,MAAM,OAAO,UAAU,GAAG,IAAI,EAAe;AAC7C,QAAQ,MAAM,QAAA,GAAW,IAAI,CAAC,CAAC,CAAC;AAChC,QAAQ,MAAM,GAAA,GAAM,sBAAsB,CAAC,KAAK,CAAC;;AAEjD,QAAQ,MAAM,UAAA,GAAa,OAAO,CAAC,QAAQ,OAAO,QAAA,KAAa,YAAY,wBAAwB,CAAC,QAAQ,EAAE,OAAO,CAAC;;AAEtH;AACA,QAAQ,IAAI,CAAC,UAAU,EAAE;AACzB,UAAU,eAAe,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,KAAA,EAAM,EAAwB;AAC3E,QAAQ;;AAER;AACA,QAAQ,IAAI,CAAC,UAAA,KAAe,WAAA,IAAe,KAAK,CAAC,SAAS,EAAE,CAAC,EAAE;AAC/D;AACA,UAAU,GAAG,EAAE,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC;AAC9C,QAAQ;AACR,MAAM,CAAC;AACP,IAAI,CAAC,CAAC;AACN,EAAE,CAAC,CAAC;AACJ;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { addBreadcrumb } from '../breadcrumbs.js';
|
|
2
2
|
import { getClient } from '../currentScopes.js';
|
|
3
|
-
import { addConsoleInstrumentationHandler } from '../instrument/console.js';
|
|
3
|
+
import { addConsoleInstrumentationHandler, addConsoleInstrumentationFilter } from '../instrument/console.js';
|
|
4
4
|
import { defineIntegration } from '../integration.js';
|
|
5
5
|
import { CONSOLE_LEVELS } from '../utils/debug-logger.js';
|
|
6
6
|
import { severityLevelFromString } from '../utils/severity.js';
|
|
@@ -37,8 +37,12 @@ const consoleIntegration = defineIntegration((options = {}) => {
|
|
|
37
37
|
|
|
38
38
|
addConsoleBreadcrumb(level, args);
|
|
39
39
|
});
|
|
40
|
-
|
|
41
40
|
client.registerCleanup(unsubscribe);
|
|
41
|
+
|
|
42
|
+
if (options.filter) {
|
|
43
|
+
const unsubscribe = addConsoleInstrumentationFilter(options.filter);
|
|
44
|
+
client.registerCleanup(unsubscribe);
|
|
45
|
+
}
|
|
42
46
|
},
|
|
43
47
|
};
|
|
44
48
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"console.js","sources":["../../../src/integrations/console.ts"],"sourcesContent":["import { addBreadcrumb } from '../breadcrumbs';\nimport { getClient } from '../currentScopes';\nimport { addConsoleInstrumentationHandler } from '../instrument/console';\nimport { defineIntegration } from '../integration';\nimport type { ConsoleLevel } from '../types-hoist/instrument';\nimport { CONSOLE_LEVELS } from '../utils/debug-logger';\nimport { severityLevelFromString } from '../utils/severity';\nimport { safeJoin } from '../utils/string';\nimport { GLOBAL_OBJ } from '../utils/worldwide';\n\ninterface ConsoleIntegrationOptions {\n levels: ConsoleLevel[];\n}\n\ntype GlobalObjectWithUtil = typeof GLOBAL_OBJ & {\n util: {\n format: (...args: unknown[]) => string;\n };\n};\n\nconst INTEGRATION_NAME = 'Console';\n\n/**\n * Captures calls to the `console` API as breadcrumbs in Sentry.\n *\n * By default the integration instruments `console.debug`, `console.info`, `console.warn`, `console.error`,\n * `console.log`, `console.trace`, and `console.assert`. You can use the `levels` option to customize which\n * levels are captured.\n *\n * @example\n *\n * ```js\n * Sentry.init({\n * integrations: [Sentry.consoleIntegration({ levels: ['error', 'warn'] })],\n * });\n * ```\n */\nexport const consoleIntegration = defineIntegration((options: Partial<ConsoleIntegrationOptions> = {}) => {\n const levels = new Set(options.levels || CONSOLE_LEVELS);\n\n return {\n name: INTEGRATION_NAME,\n setup(client) {\n const unsubscribe = addConsoleInstrumentationHandler(({ args, level }) => {\n if (getClient() !== client || !levels.has(level)) {\n return;\n }\n\n addConsoleBreadcrumb(level, args);\n });\n\n client.registerCleanup(unsubscribe);\n },\n };\n});\n\n/**\n * Capture a console breadcrumb.\n *\n * Exported just for tests.\n */\nexport function addConsoleBreadcrumb(level: ConsoleLevel, args: unknown[]): void {\n const breadcrumb = {\n category: 'console',\n data: {\n arguments: args,\n logger: 'console',\n },\n level: severityLevelFromString(level),\n message: formatConsoleArgs(args),\n };\n\n if (level === 'assert') {\n if (args[0] === false) {\n const assertionArgs = args.slice(1);\n breadcrumb.message =\n assertionArgs.length > 0 ? `Assertion failed: ${formatConsoleArgs(assertionArgs)}` : 'Assertion failed';\n breadcrumb.data.arguments = assertionArgs;\n } else {\n // Don't capture a breadcrumb for passed assertions\n return;\n }\n }\n\n addBreadcrumb(breadcrumb, {\n input: args,\n level,\n });\n}\n\nfunction formatConsoleArgs(values: unknown[]): string {\n return 'util' in GLOBAL_OBJ && typeof (GLOBAL_OBJ as GlobalObjectWithUtil).util.format === 'function'\n ? (GLOBAL_OBJ as GlobalObjectWithUtil).util.format(...values)\n : safeJoin(values, ' ');\n}\n"],"names":[],"mappings":";;;;;;;;;
|
|
1
|
+
{"version":3,"file":"console.js","sources":["../../../src/integrations/console.ts"],"sourcesContent":["import { addBreadcrumb } from '../breadcrumbs';\nimport { getClient } from '../currentScopes';\nimport { addConsoleInstrumentationFilter, addConsoleInstrumentationHandler } from '../instrument/console';\nimport { defineIntegration } from '../integration';\nimport type { ConsoleLevel } from '../types-hoist/instrument';\nimport { CONSOLE_LEVELS } from '../utils/debug-logger';\nimport { severityLevelFromString } from '../utils/severity';\nimport { safeJoin } from '../utils/string';\nimport { GLOBAL_OBJ } from '../utils/worldwide';\n\ninterface ConsoleIntegrationOptions {\n levels: ConsoleLevel[];\n /**\n * Filter out console messages that match the given strings or regular expressions.\n * These will neither be passed to the handler, and they will also not be logged to the user, unless they have debug enabled.\n */\n filter?: (string | RegExp)[];\n}\n\ntype GlobalObjectWithUtil = typeof GLOBAL_OBJ & {\n util: {\n format: (...args: unknown[]) => string;\n };\n};\n\nconst INTEGRATION_NAME = 'Console';\n\n/**\n * Captures calls to the `console` API as breadcrumbs in Sentry.\n *\n * By default the integration instruments `console.debug`, `console.info`, `console.warn`, `console.error`,\n * `console.log`, `console.trace`, and `console.assert`. You can use the `levels` option to customize which\n * levels are captured.\n *\n * @example\n *\n * ```js\n * Sentry.init({\n * integrations: [Sentry.consoleIntegration({ levels: ['error', 'warn'] })],\n * });\n * ```\n */\nexport const consoleIntegration = defineIntegration((options: Partial<ConsoleIntegrationOptions> = {}) => {\n const levels = new Set(options.levels || CONSOLE_LEVELS);\n\n return {\n name: INTEGRATION_NAME,\n setup(client) {\n const unsubscribe = addConsoleInstrumentationHandler(({ args, level }) => {\n if (getClient() !== client || !levels.has(level)) {\n return;\n }\n\n addConsoleBreadcrumb(level, args);\n });\n client.registerCleanup(unsubscribe);\n\n if (options.filter) {\n const unsubscribe = addConsoleInstrumentationFilter(options.filter);\n client.registerCleanup(unsubscribe);\n }\n },\n };\n});\n\n/**\n * Capture a console breadcrumb.\n *\n * Exported just for tests.\n */\nexport function addConsoleBreadcrumb(level: ConsoleLevel, args: unknown[]): void {\n const breadcrumb = {\n category: 'console',\n data: {\n arguments: args,\n logger: 'console',\n },\n level: severityLevelFromString(level),\n message: formatConsoleArgs(args),\n };\n\n if (level === 'assert') {\n if (args[0] === false) {\n const assertionArgs = args.slice(1);\n breadcrumb.message =\n assertionArgs.length > 0 ? `Assertion failed: ${formatConsoleArgs(assertionArgs)}` : 'Assertion failed';\n breadcrumb.data.arguments = assertionArgs;\n } else {\n // Don't capture a breadcrumb for passed assertions\n return;\n }\n }\n\n addBreadcrumb(breadcrumb, {\n input: args,\n level,\n });\n}\n\nfunction formatConsoleArgs(values: unknown[]): string {\n return 'util' in GLOBAL_OBJ && typeof (GLOBAL_OBJ as GlobalObjectWithUtil).util.format === 'function'\n ? (GLOBAL_OBJ as GlobalObjectWithUtil).util.format(...values)\n : safeJoin(values, ' ');\n}\n"],"names":[],"mappings":";;;;;;;;;AAyBA,MAAM,gBAAA,GAAmB,SAAS;;AAElC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAM,kBAAA,GAAqB,iBAAiB,CAAC,CAAC,OAAO,GAAuC,EAAE,KAAK;AAC1G,EAAE,MAAM,MAAA,GAAS,IAAI,GAAG,CAAC,OAAO,CAAC,MAAA,IAAU,cAAc,CAAC;;AAE1D,EAAE,OAAO;AACT,IAAI,IAAI,EAAE,gBAAgB;AAC1B,IAAI,KAAK,CAAC,MAAM,EAAE;AAClB,MAAM,MAAM,WAAA,GAAc,gCAAgC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAA,EAAO,KAAK;AAChF,QAAQ,IAAI,SAAS,OAAO,MAAA,IAAU,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;AAC1D,UAAU;AACV,QAAQ;;AAER,QAAQ,oBAAoB,CAAC,KAAK,EAAE,IAAI,CAAC;AACzC,MAAM,CAAC,CAAC;AACR,MAAM,MAAM,CAAC,eAAe,CAAC,WAAW,CAAC;;AAEzC,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE;AAC1B,QAAQ,MAAM,cAAc,+BAA+B,CAAC,OAAO,CAAC,MAAM,CAAC;AAC3E,QAAQ,MAAM,CAAC,eAAe,CAAC,WAAW,CAAC;AAC3C,MAAM;AACN,IAAI,CAAC;AACL,GAAG;AACH,CAAC;;AAED;AACA;AACA;AACA;AACA;AACO,SAAS,oBAAoB,CAAC,KAAK,EAAgB,IAAI,EAAmB;AACjF,EAAE,MAAM,aAAa;AACrB,IAAI,QAAQ,EAAE,SAAS;AACvB,IAAI,IAAI,EAAE;AACV,MAAM,SAAS,EAAE,IAAI;AACrB,MAAM,MAAM,EAAE,SAAS;AACvB,KAAK;AACL,IAAI,KAAK,EAAE,uBAAuB,CAAC,KAAK,CAAC;AACzC,IAAI,OAAO,EAAE,iBAAiB,CAAC,IAAI,CAAC;AACpC,GAAG;;AAEH,EAAE,IAAI,KAAA,KAAU,QAAQ,EAAE;AAC1B,IAAI,IAAI,IAAI,CAAC,CAAC,CAAA,KAAM,KAAK,EAAE;AAC3B,MAAM,MAAM,gBAAgB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AACzC,MAAM,UAAU,CAAC,OAAA;AACjB,QAAQ,aAAa,CAAC,MAAA,GAAS,IAAI,CAAC,kBAAkB,EAAE,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAAA,GAAA,kBAAA;AACA,MAAA,UAAA,CAAA,IAAA,CAAA,SAAA,GAAA,aAAA;AACA,IAAA,CAAA,MAAA;AACA;AACA,MAAA;AACA,IAAA;AACA,EAAA;;AAEA,EAAA,aAAA,CAAA,UAAA,EAAA;AACA,IAAA,KAAA,EAAA,IAAA;AACA,IAAA,KAAA;AACA,GAAA,CAAA;AACA;;AAEA,SAAA,iBAAA,CAAA,MAAA,EAAA;AACA,EAAA,OAAA,MAAA,IAAA,UAAA,IAAA,OAAA,CAAA,UAAA,GAAA,IAAA,CAAA,MAAA,KAAA;AACA,MAAA,CAAA,UAAA,GAAA,IAAA,CAAA,MAAA,CAAA,GAAA,MAAA;AACA,MAAA,QAAA,CAAA,MAAA,EAAA,GAAA,CAAA;AACA;;;;"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { debug } from '../../utils/debug-logger.js';
|
|
2
2
|
import { captureException } from '../../exports.js';
|
|
3
3
|
import { DEBUG_BUILD } from '../../debug-build.js';
|
|
4
|
-
import { defaultShouldHandleError, isExpressWithRouterPrototype, isExpressWithoutRouterPrototype, getLayerPath
|
|
4
|
+
import { defaultShouldHandleError, isExpressWithRouterPrototype, isExpressWithoutRouterPrototype, getLayerPath } from './utils.js';
|
|
5
5
|
import { wrapMethod } from '../../utils/object.js';
|
|
6
6
|
import { patchLayer } from './patch-layer.js';
|
|
7
7
|
import { setSDKProcessingMetadata } from './set-sdk-processing-metadata.js';
|
|
8
|
+
import { getDefaultExport } from '../../utils/get-default-export.js';
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* Platform-portable Express tracing integration.
|
|
@@ -36,9 +37,6 @@ import { setSDKProcessingMetadata } from './set-sdk-processing-metadata.js';
|
|
|
36
37
|
*/
|
|
37
38
|
|
|
38
39
|
|
|
39
|
-
const getExpressExport = (express) =>
|
|
40
|
-
hasDefaultProp(express) ? express.default : (express );
|
|
41
|
-
|
|
42
40
|
function isLegacyOptions(
|
|
43
41
|
options,
|
|
44
42
|
) {
|
|
@@ -89,7 +87,7 @@ function patchExpressModule(
|
|
|
89
87
|
}
|
|
90
88
|
|
|
91
89
|
// pass in the require() or import() result of express
|
|
92
|
-
const express =
|
|
90
|
+
const express = getDefaultExport(moduleExports);
|
|
93
91
|
const routerProto = isExpressWithRouterPrototype(express)
|
|
94
92
|
? express.Router.prototype // Express v5
|
|
95
93
|
: isExpressWithoutRouterPrototype(express)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/integrations/express/index.ts"],"sourcesContent":["/**\n * Platform-portable Express tracing integration.\n *\n * @module\n *\n * This Sentry integration is a derivative work based on the OpenTelemetry\n * Express instrumentation.\n *\n * <https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/packages/instrumentation-express>\n *\n * Extended under the terms of the Apache 2.0 license linked below:\n *\n * ----\n *\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { debug } from '../../utils/debug-logger';\nimport { captureException } from '../../exports';\nimport { DEBUG_BUILD } from '../../debug-build';\nimport type {\n ExpressApplication,\n ExpressErrorMiddleware,\n ExpressExport,\n ExpressHandlerOptions,\n ExpressIntegrationOptions,\n ExpressLayer,\n ExpressMiddleware,\n ExpressModuleExport,\n ExpressRequest,\n ExpressResponse,\n ExpressRouter,\n ExpressRouterv4,\n ExpressRouterv5,\n MiddlewareError,\n} from './types';\nimport {\n defaultShouldHandleError,\n getLayerPath,\n hasDefaultProp,\n isExpressWithoutRouterPrototype,\n isExpressWithRouterPrototype,\n} from './utils';\nimport { wrapMethod } from '../../utils/object';\nimport { patchLayer } from './patch-layer';\nimport { setSDKProcessingMetadata } from './set-sdk-processing-metadata';\n\nconst getExpressExport = (express: ExpressModuleExport): ExpressExport =>\n hasDefaultProp(express) ? express.default : (express as ExpressExport);\n\nfunction isLegacyOptions(\n options: ExpressModuleExport | (ExpressIntegrationOptions & { express: ExpressModuleExport }),\n): options is ExpressIntegrationOptions & { express: ExpressModuleExport } {\n return !!(options as { express: ExpressModuleExport }).express;\n}\n\n// TODO: remove this deprecation handling in v11\nlet didLegacyDeprecationWarning = false;\nfunction deprecationWarning() {\n if (!didLegacyDeprecationWarning) {\n didLegacyDeprecationWarning = true;\n DEBUG_BUILD &&\n debug.warn(\n '[Express] `patchExpressModule(options)` is deprecated. Use `patchExpressModule(moduleExports, getOptions)` instead.',\n );\n }\n}\n\n/**\n * This is a portable instrumentatiton function that works in any environment\n * where Express can be loaded, without depending on OpenTelemetry.\n *\n * @example\n * ```javascript\n * import express from 'express';\n * import * as Sentry from '@sentry/deno'; // or any SDK that extends core\n *\n * Sentry.patchExpressModule(express, () => ({}));\n * ```\n */\nexport function patchExpressModule(\n moduleExports: ExpressModuleExport,\n getOptions: () => ExpressIntegrationOptions,\n): ExpressModuleExport;\n/**\n * @deprecated Pass the Express module export as the first argument and options getter as the second argument.\n */\nexport function patchExpressModule(\n options: ExpressIntegrationOptions & { express: ExpressModuleExport },\n): ExpressModuleExport;\nexport function patchExpressModule(\n optionsOrExports: ExpressModuleExport | (ExpressIntegrationOptions & { express: ExpressModuleExport }),\n maybeGetOptions?: () => ExpressIntegrationOptions,\n): ExpressModuleExport {\n let getOptions: () => ExpressIntegrationOptions;\n let moduleExports: ExpressModuleExport;\n if (!maybeGetOptions && isLegacyOptions(optionsOrExports)) {\n const { express, ...options } = optionsOrExports;\n moduleExports = express;\n getOptions = () => options;\n deprecationWarning();\n } else if (typeof maybeGetOptions !== 'function') {\n throw new TypeError('`patchExpressModule(moduleExports, getOptions)` requires a `getOptions` callback');\n } else {\n getOptions = maybeGetOptions;\n moduleExports = optionsOrExports as ExpressModuleExport;\n }\n\n // pass in the require() or import() result of express\n const express = getExpressExport(moduleExports);\n const routerProto: ExpressRouterv4 | ExpressRouterv5 | undefined = isExpressWithRouterPrototype(express)\n ? express.Router.prototype // Express v5\n : isExpressWithoutRouterPrototype(express)\n ? express.Router // Express v4\n : undefined;\n\n if (!routerProto) {\n throw new TypeError('no valid Express route function to instrument');\n }\n\n // oxlint-disable-next-line @typescript-eslint/unbound-method\n const originalRouteMethod = routerProto.route;\n try {\n wrapMethod(\n routerProto,\n 'route',\n function routeTrace(this: ExpressRouter, ...args: Parameters<typeof originalRouteMethod>[]) {\n const route = originalRouteMethod.apply(this, args);\n const layer = this.stack[this.stack.length - 1] as ExpressLayer;\n patchLayer(getOptions, layer, getLayerPath(args));\n return route;\n },\n );\n } catch (e) {\n DEBUG_BUILD && debug.error('Failed to patch express route method:', e);\n }\n\n // oxlint-disable-next-line @typescript-eslint/unbound-method\n const originalRouterUse = routerProto.use;\n try {\n wrapMethod(\n routerProto,\n 'use',\n function useTrace(this: ExpressApplication, ...args: Parameters<typeof originalRouterUse>) {\n const route = originalRouterUse.apply(this, args);\n const layer = this.stack[this.stack.length - 1];\n if (!layer) {\n return route;\n }\n patchLayer(getOptions, layer, getLayerPath(args));\n return route;\n },\n );\n } catch (e) {\n DEBUG_BUILD && debug.error('Failed to patch express use method:', e);\n }\n\n const { application } = express;\n const originalApplicationUse = application.use;\n try {\n wrapMethod(\n application,\n 'use',\n function appUseTrace(\n this: ExpressApplication & {\n _router?: ExpressRouter;\n router?: ExpressRouter;\n },\n ...args: Parameters<ExpressApplication['use']>\n ) {\n // If we access app.router in express 4.x we trigger an assertion error.\n // This property existed in v3, was removed in v4 and then re-added in v5.\n const route = originalApplicationUse.apply(this, args);\n const router = isExpressWithRouterPrototype(express) ? this.router : this._router;\n if (router) {\n const layer = router.stack[router.stack.length - 1];\n if (layer) {\n patchLayer(getOptions, layer, getLayerPath(args));\n }\n }\n return route;\n },\n );\n } catch (e) {\n DEBUG_BUILD && debug.error('Failed to patch express application.use method:', e);\n }\n\n return express;\n}\n\n/**\n * An Express-compatible error handler, used by setupExpressErrorHandler\n */\nexport function expressErrorHandler(options?: ExpressHandlerOptions): ExpressErrorMiddleware {\n return function sentryErrorMiddleware(\n error: MiddlewareError,\n request: ExpressRequest,\n res: ExpressResponse,\n next: (error: MiddlewareError) => void,\n ): void {\n // When an error happens, the `expressRequestHandler` middleware does not run, so we set it here too\n setSDKProcessingMetadata(request);\n const shouldHandleError = options?.shouldHandleError || defaultShouldHandleError;\n\n if (shouldHandleError(error)) {\n const eventId = captureException(error, {\n mechanism: { type: 'auto.middleware.express', handled: false },\n });\n (res as { sentry?: string }).sentry = eventId;\n }\n\n next(error);\n };\n}\n\n/**\n * Add an Express error handler to capture errors to Sentry.\n *\n * The error handler must be before any other middleware and after all controllers.\n *\n * @param app The Express instances\n * @param options {ExpressHandlerOptions} Configuration options for the handler\n *\n * @example\n * ```javascript\n * import * as Sentry from 'sentry/deno'; // or any other @sentry/<platform>\n * import * as express from 'express';\n *\n * Sentry.instrumentExpress(express);\n *\n * const app = express();\n *\n * // Add your routes, etc.\n *\n * // Add this after all routes,\n * // but before any and other error-handling middlewares are defined\n * Sentry.setupExpressErrorHandler(app);\n *\n * app.listen(3000);\n * ```\n */\nexport function setupExpressErrorHandler(\n app: {\n //oxlint-disable-next-line no-explicit-any\n use: (middleware: any) => unknown;\n },\n options?: ExpressHandlerOptions,\n): void {\n app.use(expressRequestHandler());\n app.use(expressErrorHandler(options));\n}\n\nfunction expressRequestHandler(): ExpressMiddleware {\n return function sentryRequestMiddleware(request: ExpressRequest, _res: ExpressResponse, next: () => void): void {\n setSDKProcessingMetadata(request);\n next();\n };\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/integrations/express/index.ts"],"sourcesContent":["/**\n * Platform-portable Express tracing integration.\n *\n * @module\n *\n * This Sentry integration is a derivative work based on the OpenTelemetry\n * Express instrumentation.\n *\n * <https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/packages/instrumentation-express>\n *\n * Extended under the terms of the Apache 2.0 license linked below:\n *\n * ----\n *\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { debug } from '../../utils/debug-logger';\nimport { captureException } from '../../exports';\nimport { DEBUG_BUILD } from '../../debug-build';\nimport type {\n ExpressApplication,\n ExpressErrorMiddleware,\n ExpressHandlerOptions,\n ExpressIntegrationOptions,\n ExpressLayer,\n ExpressMiddleware,\n ExpressModuleExport,\n ExpressRequest,\n ExpressResponse,\n ExpressRouter,\n ExpressRouterv4,\n ExpressRouterv5,\n MiddlewareError,\n} from './types';\nimport {\n defaultShouldHandleError,\n getLayerPath,\n isExpressWithoutRouterPrototype,\n isExpressWithRouterPrototype,\n} from './utils';\nimport { wrapMethod } from '../../utils/object';\nimport { patchLayer } from './patch-layer';\nimport { setSDKProcessingMetadata } from './set-sdk-processing-metadata';\nimport { getDefaultExport } from '../../utils/get-default-export';\n\nfunction isLegacyOptions(\n options: ExpressModuleExport | (ExpressIntegrationOptions & { express: ExpressModuleExport }),\n): options is ExpressIntegrationOptions & { express: ExpressModuleExport } {\n return !!(options as { express: ExpressModuleExport }).express;\n}\n\n// TODO: remove this deprecation handling in v11\nlet didLegacyDeprecationWarning = false;\nfunction deprecationWarning() {\n if (!didLegacyDeprecationWarning) {\n didLegacyDeprecationWarning = true;\n DEBUG_BUILD &&\n debug.warn(\n '[Express] `patchExpressModule(options)` is deprecated. Use `patchExpressModule(moduleExports, getOptions)` instead.',\n );\n }\n}\n\n/**\n * This is a portable instrumentatiton function that works in any environment\n * where Express can be loaded, without depending on OpenTelemetry.\n *\n * @example\n * ```javascript\n * import express from 'express';\n * import * as Sentry from '@sentry/deno'; // or any SDK that extends core\n *\n * Sentry.patchExpressModule(express, () => ({}));\n * ```\n */\nexport function patchExpressModule(\n moduleExports: ExpressModuleExport,\n getOptions: () => ExpressIntegrationOptions,\n): ExpressModuleExport;\n/**\n * @deprecated Pass the Express module export as the first argument and options getter as the second argument.\n */\nexport function patchExpressModule(\n options: ExpressIntegrationOptions & { express: ExpressModuleExport },\n): ExpressModuleExport;\nexport function patchExpressModule(\n optionsOrExports: ExpressModuleExport | (ExpressIntegrationOptions & { express: ExpressModuleExport }),\n maybeGetOptions?: () => ExpressIntegrationOptions,\n): ExpressModuleExport {\n let getOptions: () => ExpressIntegrationOptions;\n let moduleExports: ExpressModuleExport;\n if (!maybeGetOptions && isLegacyOptions(optionsOrExports)) {\n const { express, ...options } = optionsOrExports;\n moduleExports = express;\n getOptions = () => options;\n deprecationWarning();\n } else if (typeof maybeGetOptions !== 'function') {\n throw new TypeError('`patchExpressModule(moduleExports, getOptions)` requires a `getOptions` callback');\n } else {\n getOptions = maybeGetOptions;\n moduleExports = optionsOrExports as ExpressModuleExport;\n }\n\n // pass in the require() or import() result of express\n const express = getDefaultExport(moduleExports);\n const routerProto: ExpressRouterv4 | ExpressRouterv5 | undefined = isExpressWithRouterPrototype(express)\n ? express.Router.prototype // Express v5\n : isExpressWithoutRouterPrototype(express)\n ? express.Router // Express v4\n : undefined;\n\n if (!routerProto) {\n throw new TypeError('no valid Express route function to instrument');\n }\n\n // oxlint-disable-next-line @typescript-eslint/unbound-method\n const originalRouteMethod = routerProto.route;\n try {\n wrapMethod(\n routerProto,\n 'route',\n function routeTrace(this: ExpressRouter, ...args: Parameters<typeof originalRouteMethod>[]) {\n const route = originalRouteMethod.apply(this, args);\n const layer = this.stack[this.stack.length - 1] as ExpressLayer;\n patchLayer(getOptions, layer, getLayerPath(args));\n return route;\n },\n );\n } catch (e) {\n DEBUG_BUILD && debug.error('Failed to patch express route method:', e);\n }\n\n // oxlint-disable-next-line @typescript-eslint/unbound-method\n const originalRouterUse = routerProto.use;\n try {\n wrapMethod(\n routerProto,\n 'use',\n function useTrace(this: ExpressApplication, ...args: Parameters<typeof originalRouterUse>) {\n const route = originalRouterUse.apply(this, args);\n const layer = this.stack[this.stack.length - 1];\n if (!layer) {\n return route;\n }\n patchLayer(getOptions, layer, getLayerPath(args));\n return route;\n },\n );\n } catch (e) {\n DEBUG_BUILD && debug.error('Failed to patch express use method:', e);\n }\n\n const { application } = express;\n const originalApplicationUse = application.use;\n try {\n wrapMethod(\n application,\n 'use',\n function appUseTrace(\n this: ExpressApplication & {\n _router?: ExpressRouter;\n router?: ExpressRouter;\n },\n ...args: Parameters<ExpressApplication['use']>\n ) {\n // If we access app.router in express 4.x we trigger an assertion error.\n // This property existed in v3, was removed in v4 and then re-added in v5.\n const route = originalApplicationUse.apply(this, args);\n const router = isExpressWithRouterPrototype(express) ? this.router : this._router;\n if (router) {\n const layer = router.stack[router.stack.length - 1];\n if (layer) {\n patchLayer(getOptions, layer, getLayerPath(args));\n }\n }\n return route;\n },\n );\n } catch (e) {\n DEBUG_BUILD && debug.error('Failed to patch express application.use method:', e);\n }\n\n return express;\n}\n\n/**\n * An Express-compatible error handler, used by setupExpressErrorHandler\n */\nexport function expressErrorHandler(options?: ExpressHandlerOptions): ExpressErrorMiddleware {\n return function sentryErrorMiddleware(\n error: MiddlewareError,\n request: ExpressRequest,\n res: ExpressResponse,\n next: (error: MiddlewareError) => void,\n ): void {\n // When an error happens, the `expressRequestHandler` middleware does not run, so we set it here too\n setSDKProcessingMetadata(request);\n const shouldHandleError = options?.shouldHandleError || defaultShouldHandleError;\n\n if (shouldHandleError(error)) {\n const eventId = captureException(error, {\n mechanism: { type: 'auto.middleware.express', handled: false },\n });\n (res as { sentry?: string }).sentry = eventId;\n }\n\n next(error);\n };\n}\n\n/**\n * Add an Express error handler to capture errors to Sentry.\n *\n * The error handler must be before any other middleware and after all controllers.\n *\n * @param app The Express instances\n * @param options {ExpressHandlerOptions} Configuration options for the handler\n *\n * @example\n * ```javascript\n * import * as Sentry from 'sentry/deno'; // or any other @sentry/<platform>\n * import * as express from 'express';\n *\n * Sentry.instrumentExpress(express);\n *\n * const app = express();\n *\n * // Add your routes, etc.\n *\n * // Add this after all routes,\n * // but before any and other error-handling middlewares are defined\n * Sentry.setupExpressErrorHandler(app);\n *\n * app.listen(3000);\n * ```\n */\nexport function setupExpressErrorHandler(\n app: {\n //oxlint-disable-next-line no-explicit-any\n use: (middleware: any) => unknown;\n },\n options?: ExpressHandlerOptions,\n): void {\n app.use(expressRequestHandler());\n app.use(expressErrorHandler(options));\n}\n\nfunction expressRequestHandler(): ExpressMiddleware {\n return function sentryRequestMiddleware(request: ExpressRequest, _res: ExpressResponse, next: () => void): void {\n setSDKProcessingMetadata(request);\n next();\n };\n}\n"],"names":[],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AA+BA,SAAS,eAAe;AACxB,EAAE,OAAO;AACT,EAA2E;AAC3E,EAAE,OAAO,CAAC,CAAC,CAAC,OAAA,GAA6C,OAAO;AAChE;;AAEA;AACA,IAAI,2BAAA,GAA8B,KAAK;AACvC,SAAS,kBAAkB,GAAG;AAC9B,EAAE,IAAI,CAAC,2BAA2B,EAAE;AACpC,IAAI,2BAAA,GAA8B,IAAI;AACtC,IAAI,WAAA;AACJ,MAAM,KAAK,CAAC,IAAI;AAChB,QAAQ,qHAAqH;AAC7H,OAAO;AACP,EAAE;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAWO,SAAS,kBAAkB;AAClC,EAAE,gBAAgB;AAClB,EAAE,eAAe;AACjB,EAAuB;AACvB,EAAE,IAAI,UAAU;AAChB,EAAE,IAAI,aAAa;AACnB,EAAE,IAAI,CAAC,eAAA,IAAmB,eAAe,CAAC,gBAAgB,CAAC,EAAE;AAC7D,IAAI,MAAM,EAAE,OAAO,EAAE,GAAG,OAAA,EAAQ,GAAI,gBAAgB;AACpD,IAAI,aAAA,GAAgB,OAAO;AAC3B,IAAI,UAAA,GAAa,MAAM,OAAO;AAC9B,IAAI,kBAAkB,EAAE;AACxB,EAAE,CAAA,MAAO,IAAI,OAAO,eAAA,KAAoB,UAAU,EAAE;AACpD,IAAI,MAAM,IAAI,SAAS,CAAC,kFAAkF,CAAC;AAC3G,EAAE,OAAO;AACT,IAAI,UAAA,GAAa,eAAe;AAChC,IAAI,aAAA,GAAgB,gBAAA;AACpB,EAAE;;AAEF;AACA,EAAE,MAAM,OAAA,GAAU,gBAAgB,CAAC,aAAa,CAAC;AACjD,EAAE,MAAM,WAAW,GAAkD,4BAA4B,CAAC,OAAO;AACzG,MAAM,OAAO,CAAC,MAAM,CAAC,SAAA;AACrB,MAAM,+BAA+B,CAAC,OAAO;AAC7C,QAAQ,OAAO,CAAC,MAAA;AAChB,QAAQ,SAAS;;AAEjB,EAAE,IAAI,CAAC,WAAW,EAAE;AACpB,IAAI,MAAM,IAAI,SAAS,CAAC,+CAA+C,CAAC;AACxE,EAAE;;AAEF;AACA,EAAE,MAAM,mBAAA,GAAsB,WAAW,CAAC,KAAK;AAC/C,EAAE,IAAI;AACN,IAAI,UAAU;AACd,MAAM,WAAW;AACjB,MAAM,OAAO;AACb,MAAM,SAAS,UAAU,EAAsB,GAAG,IAAI,EAA4C;AAClG,QAAQ,MAAM,KAAA,GAAQ,mBAAmB,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC;AAC3D,QAAQ,MAAM,KAAA,GAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAA,GAAS,CAAC,CAAA;AACtD,QAAQ,UAAU,CAAC,UAAU,EAAE,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC;AACzD,QAAQ,OAAO,KAAK;AACpB,MAAM,CAAC;AACP,KAAK;AACL,EAAE,CAAA,CAAE,OAAO,CAAC,EAAE;AACd,IAAI,WAAA,IAAe,KAAK,CAAC,KAAK,CAAC,uCAAuC,EAAE,CAAC,CAAC;AAC1E,EAAE;;AAEF;AACA,EAAE,MAAM,iBAAA,GAAoB,WAAW,CAAC,GAAG;AAC3C,EAAE,IAAI;AACN,IAAI,UAAU;AACd,MAAM,WAAW;AACjB,MAAM,KAAK;AACX,MAAM,SAAS,QAAQ,EAA2B,GAAG,IAAI,EAAwC;AACjG,QAAQ,MAAM,KAAA,GAAQ,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC;AACzD,QAAQ,MAAM,KAAA,GAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAA,GAAS,CAAC,CAAC;AACvD,QAAQ,IAAI,CAAC,KAAK,EAAE;AACpB,UAAU,OAAO,KAAK;AACtB,QAAQ;AACR,QAAQ,UAAU,CAAC,UAAU,EAAE,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC;AACzD,QAAQ,OAAO,KAAK;AACpB,MAAM,CAAC;AACP,KAAK;AACL,EAAE,CAAA,CAAE,OAAO,CAAC,EAAE;AACd,IAAI,WAAA,IAAe,KAAK,CAAC,KAAK,CAAC,qCAAqC,EAAE,CAAC,CAAC;AACxE,EAAE;;AAEF,EAAE,MAAM,EAAE,WAAA,EAAY,GAAI,OAAO;AACjC,EAAE,MAAM,sBAAA,GAAyB,WAAW,CAAC,GAAG;AAChD,EAAE,IAAI;AACN,IAAI,UAAU;AACd,MAAM,WAAW;AACjB,MAAM,KAAK;AACX,MAAM,SAAS,WAAW;;AAK1B,QAAQ,GAAG;AACX,QAAQ;AACR;AACA;AACA,QAAQ,MAAM,KAAA,GAAQ,sBAAsB,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC;AAC9D,QAAQ,MAAM,MAAA,GAAS,4BAA4B,CAAC,OAAO,CAAA,GAAI,IAAI,CAAC,MAAA,GAAS,IAAI,CAAC,OAAO;AACzF,QAAQ,IAAI,MAAM,EAAE;AACpB,UAAU,MAAM,KAAA,GAAQ,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAA,GAAS,CAAC,CAAC;AAC7D,UAAU,IAAI,KAAK,EAAE;AACrB,YAAY,UAAU,CAAC,UAAU,EAAE,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC;AAC7D,UAAU;AACV,QAAQ;AACR,QAAQ,OAAO,KAAK;AACpB,MAAM,CAAC;AACP,KAAK;AACL,EAAE,CAAA,CAAE,OAAO,CAAC,EAAE;AACd,IAAI,WAAA,IAAe,KAAK,CAAC,KAAK,CAAC,iDAAiD,EAAE,CAAC,CAAC;AACpF,EAAE;;AAEF,EAAE,OAAO,OAAO;AAChB;;AAEA;AACA;AACA;AACO,SAAS,mBAAmB,CAAC,OAAO,EAAkD;AAC7F,EAAE,OAAO,SAAS,qBAAqB;AACvC,IAAI,KAAK;AACT,IAAI,OAAO;AACX,IAAI,GAAG;AACP,IAAI,IAAI;AACR,IAAU;AACV;AACA,IAAI,wBAAwB,CAAC,OAAO,CAAC;AACrC,IAAI,MAAM,iBAAA,GAAoB,OAAO,EAAE,iBAAA,IAAqB,wBAAwB;;AAEpF,IAAI,IAAI,iBAAiB,CAAC,KAAK,CAAC,EAAE;AAClC,MAAM,MAAM,OAAA,GAAU,gBAAgB,CAAC,KAAK,EAAE;AAC9C,QAAQ,SAAS,EAAE,EAAE,IAAI,EAAE,yBAAyB,EAAE,OAAO,EAAE,KAAA,EAAO;AACtE,OAAO,CAAC;AACR,MAAM,CAAC,GAAA,GAA4B,MAAA,GAAS,OAAO;AACnD,IAAI;;AAEJ,IAAI,IAAI,CAAC,KAAK,CAAC;AACf,EAAE,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,wBAAwB;AACxC,EAAE;;AAGA;AACF,EAAE,OAAO;AACT,EAAQ;AACR,EAAE,GAAG,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC;AAClC,EAAE,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;AACvC;;AAEA,SAAS,qBAAqB,GAAsB;AACpD,EAAE,OAAO,SAAS,uBAAuB,CAAC,OAAO,EAAkB,IAAI,EAAmB,IAAI,EAAoB;AAClH,IAAI,wBAAwB,CAAC,OAAO,CAAC;AACrC,IAAI,IAAI,EAAE;AACV,EAAE,CAAC;AACH;;;;"}
|
|
@@ -204,12 +204,6 @@ const isExpressRouterPrototype = (routerProto) =>
|
|
|
204
204
|
const isExpressWithoutRouterPrototype = (express) =>
|
|
205
205
|
isExpressRouterPrototype((express ).Router) && !isExpressWithRouterPrototype(express);
|
|
206
206
|
|
|
207
|
-
// dynamic puts the default on .default, require or normal import are fine
|
|
208
|
-
const hasDefaultProp = (
|
|
209
|
-
express,
|
|
210
|
-
|
|
211
|
-
) => !!express && typeof express === 'object' && 'default' in express && typeof express.default === 'function';
|
|
212
|
-
|
|
213
207
|
function getStatusCodeFromResponse(error) {
|
|
214
208
|
const statusCode = error.status || error.statusCode || error.status_code || error.output?.statusCode;
|
|
215
209
|
return statusCode ? parseInt(statusCode , 10) : 500;
|
|
@@ -221,5 +215,5 @@ function defaultShouldHandleError(error) {
|
|
|
221
215
|
return status >= 500;
|
|
222
216
|
}
|
|
223
217
|
|
|
224
|
-
export { asErrorAndMessage, defaultShouldHandleError, getActualMatchedRoute, getConstructedRoute, getLayerMetadata, getLayerPath, getRouterPath,
|
|
218
|
+
export { asErrorAndMessage, defaultShouldHandleError, getActualMatchedRoute, getConstructedRoute, getLayerMetadata, getLayerPath, getRouterPath, isExpressWithRouterPrototype, isExpressWithoutRouterPrototype, isLayerIgnored, isRoutePattern };
|
|
225
219
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../../../../src/integrations/express/utils.ts"],"sourcesContent":["/**\n * Platform-portable Express tracing integration.\n *\n * @module\n *\n * This Sentry integration is a derivative work based on the OpenTelemetry\n * Express instrumentation.\n *\n * <https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/packages/instrumentation-express>\n *\n * Extended under the terms of the Apache 2.0 license linked below:\n *\n * ----\n *\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { SpanAttributes } from '../../types-hoist/span';\nimport { getStoredLayers } from './request-layer-store';\nimport type {\n ExpressExport,\n ExpressIntegrationOptions,\n ExpressLayer,\n ExpressLayerType,\n ExpressRequest,\n LayerPathSegment,\n MiddlewareError,\n ExpressRouterv4,\n ExpressExportv5,\n ExpressExportv4,\n} from './types';\nimport {\n ATTR_EXPRESS_NAME,\n ATTR_EXPRESS_TYPE,\n ExpressLayerType_MIDDLEWARE,\n ExpressLayerType_REQUEST_HANDLER,\n ExpressLayerType_ROUTER,\n} from './types';\nimport { stringMatchesSomePattern } from '../../utils/string';\n\n/**\n * Converts a user-provided error value into an error and error message pair\n *\n * @param error - User-provided error value\n * @returns Both an Error or string representation of the value and an error message\n */\nexport const asErrorAndMessage = (error: unknown): [string | Error, string] =>\n error instanceof Error ? [error, error.message] : [String(error), String(error)];\n\n/**\n * Checks if a route contains parameter patterns (e.g., :id, :userId)\n * which are valid even if they don't exactly match the original URL\n */\nexport function isRoutePattern(route: string): boolean {\n return route.includes(':') || route.includes('*');\n}\n\n/**\n * Parse express layer context to retrieve a name and attributes.\n * @param route The route of the layer\n * @param layer Express layer\n * @param [layerPath] if present, the path on which the layer has been mounted\n */\nexport const getLayerMetadata = (\n route: string,\n layer: ExpressLayer,\n layerPath?: string,\n): {\n attributes: SpanAttributes & { [ATTR_EXPRESS_NAME]: string; [ATTR_EXPRESS_TYPE]: ExpressLayerType };\n name: string;\n} => {\n if (layer.name === 'router') {\n const maybeRouterPath = getRouterPath('', layer);\n const extractedRouterPath = maybeRouterPath ? maybeRouterPath : layerPath || route || '/';\n\n return {\n attributes: {\n [ATTR_EXPRESS_NAME]: extractedRouterPath,\n [ATTR_EXPRESS_TYPE]: ExpressLayerType_ROUTER,\n },\n name: `router - ${extractedRouterPath}`,\n };\n } else if (layer.name === 'bound dispatch' || layer.name === 'handle') {\n return {\n attributes: {\n [ATTR_EXPRESS_NAME]: (route || layerPath) ?? 'request handler',\n [ATTR_EXPRESS_TYPE]: ExpressLayerType_REQUEST_HANDLER,\n },\n name: `request handler${layer.path ? ` - ${route || layerPath}` : ''}`,\n };\n } else {\n return {\n attributes: {\n [ATTR_EXPRESS_NAME]: layer.name,\n [ATTR_EXPRESS_TYPE]: ExpressLayerType_MIDDLEWARE,\n },\n name: `middleware - ${layer.name}`,\n };\n }\n};\n\n/**\n * Recursively search the router path from layer stack\n * @param path The path to reconstruct\n * @param layer The layer to reconstruct from\n * @returns The reconstructed path\n */\nexport const getRouterPath = (path: string, layer: ExpressLayer): string => {\n const stackLayer = Array.isArray(layer.handle?.stack) ? layer.handle?.stack?.[0] : undefined;\n\n if (stackLayer?.route?.path) {\n return `${path}${stackLayer.route.path}`;\n }\n\n if (stackLayer && Array.isArray(stackLayer?.handle?.stack)) {\n return getRouterPath(path, stackLayer);\n }\n\n return path;\n};\n\n/**\n * Check whether the given request is ignored by configuration\n * It will not re-throw exceptions from `list` provided by the client\n * @param constant e.g URL of request\n * @param [list] List of ignore patterns\n * @param [onException] callback for doing something when an exception has\n * occurred\n */\nexport type ExpressIsLayerIgnoredOptions = Pick<ExpressIntegrationOptions, 'ignoreLayersType' | 'ignoreLayers'>;\nexport const isLayerIgnored = (\n name: string,\n type: ExpressLayerType,\n config?: ExpressIsLayerIgnoredOptions,\n): boolean => {\n if (Array.isArray(config?.ignoreLayersType) && config?.ignoreLayersType?.includes(type)) {\n return true;\n }\n if (!Array.isArray(config?.ignoreLayers)) {\n return false;\n }\n try {\n return stringMatchesSomePattern(name, config.ignoreLayers, true);\n } catch {}\n\n return false;\n};\n\n/**\n * Extracts the actual matched route from Express request for OpenTelemetry instrumentation.\n * Returns the route that should be used as the http.route attribute.\n *\n * @param req - The Express request object with layers store\n * @param constructedRoute - The constructed route from `getConstructedRoute`\n * @returns The matched route string or undefined if no valid route is found\n */\nexport function getActualMatchedRoute(req: ExpressRequest, constructedRoute: string): string | undefined {\n const layersStore = getStoredLayers(req);\n\n // If no layers are stored, no route can be determined\n if (layersStore.length === 0) {\n return undefined;\n }\n\n // Handle root path case - if all paths are root, only return root if originalUrl is also root\n // The layer store also includes root paths in case a non-existing url was requested\n if (layersStore.every(path => path === '/')) {\n return req.originalUrl === '/' ? '/' : undefined;\n }\n\n if (constructedRoute === '*') {\n return constructedRoute;\n }\n\n // For RegExp routes or route arrays, return the constructed route\n // This handles the case where the route is defined using RegExp or an array\n if (\n constructedRoute.includes('/') &&\n (constructedRoute.includes(',') ||\n constructedRoute.includes('\\\\') ||\n constructedRoute.includes('*') ||\n constructedRoute.includes('['))\n ) {\n return constructedRoute;\n }\n\n // Ensure route starts with '/' if it doesn't already\n const normalizedRoute = constructedRoute.startsWith('/') ? constructedRoute : `/${constructedRoute}`;\n\n // Validate that this appears to be a matched route\n // A route is considered matched if:\n // 1. We have a constructed route\n // 2. The original URL matches or starts with our route pattern\n const isValidRoute =\n normalizedRoute.length > 0 &&\n (req.originalUrl === normalizedRoute ||\n req.originalUrl.startsWith(normalizedRoute) ||\n isRoutePattern(normalizedRoute));\n\n return isValidRoute ? normalizedRoute : undefined;\n}\n\nexport function getConstructedRoute(req: ExpressRequest) {\n const layersStore: string[] = getStoredLayers(req);\n\n let constructedRoute: string = '';\n for (const path of layersStore) {\n if (path === '/' || path === '/*') {\n continue;\n }\n constructedRoute += !constructedRoute || constructedRoute.endsWith('/') ? path : `/${path}`;\n }\n\n return constructedRoute.replace(/\\/{2,}/g, '/');\n}\n\nexport const getLayerPath = (args: unknown[]): string | undefined => {\n const firstArg = args[0];\n\n if (Array.isArray(firstArg)) {\n return firstArg.map(arg => extractLayerPathSegment(arg) || '').join(',');\n }\n\n return extractLayerPathSegment(firstArg as LayerPathSegment);\n};\n\nconst extractLayerPathSegment = (arg: LayerPathSegment): string | undefined =>\n typeof arg === 'string' ? arg : arg instanceof RegExp || typeof arg === 'number' ? String(arg) : undefined;\n\n// v5 we instrument Router.prototype\n// v4 we instrument Router itself\nexport const isExpressWithRouterPrototype = (express: unknown): express is ExpressExportv5 =>\n isExpressRouterPrototype((express as ExpressExportv5)?.Router?.prototype);\n\n// In Express v4, Router is a function (not a plain object), so we need to accept both\nconst isExpressRouterPrototype = (routerProto?: unknown): routerProto is ExpressRouterv4 =>\n (typeof routerProto === 'object' || typeof routerProto === 'function') &&\n !!routerProto &&\n 'route' in routerProto &&\n typeof (routerProto as ExpressRouterv4).route === 'function';\n\nexport const isExpressWithoutRouterPrototype = (express: unknown): express is ExpressExportv4 =>\n isExpressRouterPrototype((express as ExpressExportv4).Router) && !isExpressWithRouterPrototype(express);\n\n// dynamic puts the default on .default, require or normal import are fine\nexport const hasDefaultProp = (\n express: unknown,\n): express is {\n [k: string]: unknown;\n default: ExpressExport;\n} => !!express && typeof express === 'object' && 'default' in express && typeof express.default === 'function';\n\nfunction getStatusCodeFromResponse(error: MiddlewareError): number {\n const statusCode = error.status || error.statusCode || error.status_code || error.output?.statusCode;\n return statusCode ? parseInt(statusCode as string, 10) : 500;\n}\n\n/** Returns true if response code is internal server error */\nexport function defaultShouldHandleError(error: MiddlewareError): boolean {\n const status = getStatusCodeFromResponse(error);\n return status >= 500;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../../src/integrations/express/utils.ts"],"sourcesContent":["/**\n * Platform-portable Express tracing integration.\n *\n * @module\n *\n * This Sentry integration is a derivative work based on the OpenTelemetry\n * Express instrumentation.\n *\n * <https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/packages/instrumentation-express>\n *\n * Extended under the terms of the Apache 2.0 license linked below:\n *\n * ----\n *\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { SpanAttributes } from '../../types-hoist/span';\nimport { getStoredLayers } from './request-layer-store';\nimport type {\n ExpressIntegrationOptions,\n ExpressLayer,\n ExpressLayerType,\n ExpressRequest,\n LayerPathSegment,\n MiddlewareError,\n ExpressRouterv4,\n ExpressExportv5,\n ExpressExportv4,\n} from './types';\nimport {\n ATTR_EXPRESS_NAME,\n ATTR_EXPRESS_TYPE,\n ExpressLayerType_MIDDLEWARE,\n ExpressLayerType_REQUEST_HANDLER,\n ExpressLayerType_ROUTER,\n} from './types';\nimport { stringMatchesSomePattern } from '../../utils/string';\n\n/**\n * Converts a user-provided error value into an error and error message pair\n *\n * @param error - User-provided error value\n * @returns Both an Error or string representation of the value and an error message\n */\nexport const asErrorAndMessage = (error: unknown): [string | Error, string] =>\n error instanceof Error ? [error, error.message] : [String(error), String(error)];\n\n/**\n * Checks if a route contains parameter patterns (e.g., :id, :userId)\n * which are valid even if they don't exactly match the original URL\n */\nexport function isRoutePattern(route: string): boolean {\n return route.includes(':') || route.includes('*');\n}\n\n/**\n * Parse express layer context to retrieve a name and attributes.\n * @param route The route of the layer\n * @param layer Express layer\n * @param [layerPath] if present, the path on which the layer has been mounted\n */\nexport const getLayerMetadata = (\n route: string,\n layer: ExpressLayer,\n layerPath?: string,\n): {\n attributes: SpanAttributes & { [ATTR_EXPRESS_NAME]: string; [ATTR_EXPRESS_TYPE]: ExpressLayerType };\n name: string;\n} => {\n if (layer.name === 'router') {\n const maybeRouterPath = getRouterPath('', layer);\n const extractedRouterPath = maybeRouterPath ? maybeRouterPath : layerPath || route || '/';\n\n return {\n attributes: {\n [ATTR_EXPRESS_NAME]: extractedRouterPath,\n [ATTR_EXPRESS_TYPE]: ExpressLayerType_ROUTER,\n },\n name: `router - ${extractedRouterPath}`,\n };\n } else if (layer.name === 'bound dispatch' || layer.name === 'handle') {\n return {\n attributes: {\n [ATTR_EXPRESS_NAME]: (route || layerPath) ?? 'request handler',\n [ATTR_EXPRESS_TYPE]: ExpressLayerType_REQUEST_HANDLER,\n },\n name: `request handler${layer.path ? ` - ${route || layerPath}` : ''}`,\n };\n } else {\n return {\n attributes: {\n [ATTR_EXPRESS_NAME]: layer.name,\n [ATTR_EXPRESS_TYPE]: ExpressLayerType_MIDDLEWARE,\n },\n name: `middleware - ${layer.name}`,\n };\n }\n};\n\n/**\n * Recursively search the router path from layer stack\n * @param path The path to reconstruct\n * @param layer The layer to reconstruct from\n * @returns The reconstructed path\n */\nexport const getRouterPath = (path: string, layer: ExpressLayer): string => {\n const stackLayer = Array.isArray(layer.handle?.stack) ? layer.handle?.stack?.[0] : undefined;\n\n if (stackLayer?.route?.path) {\n return `${path}${stackLayer.route.path}`;\n }\n\n if (stackLayer && Array.isArray(stackLayer?.handle?.stack)) {\n return getRouterPath(path, stackLayer);\n }\n\n return path;\n};\n\n/**\n * Check whether the given request is ignored by configuration\n * It will not re-throw exceptions from `list` provided by the client\n * @param constant e.g URL of request\n * @param [list] List of ignore patterns\n * @param [onException] callback for doing something when an exception has\n * occurred\n */\nexport type ExpressIsLayerIgnoredOptions = Pick<ExpressIntegrationOptions, 'ignoreLayersType' | 'ignoreLayers'>;\nexport const isLayerIgnored = (\n name: string,\n type: ExpressLayerType,\n config?: ExpressIsLayerIgnoredOptions,\n): boolean => {\n if (Array.isArray(config?.ignoreLayersType) && config?.ignoreLayersType?.includes(type)) {\n return true;\n }\n if (!Array.isArray(config?.ignoreLayers)) {\n return false;\n }\n try {\n return stringMatchesSomePattern(name, config.ignoreLayers, true);\n } catch {}\n\n return false;\n};\n\n/**\n * Extracts the actual matched route from Express request for OpenTelemetry instrumentation.\n * Returns the route that should be used as the http.route attribute.\n *\n * @param req - The Express request object with layers store\n * @param constructedRoute - The constructed route from `getConstructedRoute`\n * @returns The matched route string or undefined if no valid route is found\n */\nexport function getActualMatchedRoute(req: ExpressRequest, constructedRoute: string): string | undefined {\n const layersStore = getStoredLayers(req);\n\n // If no layers are stored, no route can be determined\n if (layersStore.length === 0) {\n return undefined;\n }\n\n // Handle root path case - if all paths are root, only return root if originalUrl is also root\n // The layer store also includes root paths in case a non-existing url was requested\n if (layersStore.every(path => path === '/')) {\n return req.originalUrl === '/' ? '/' : undefined;\n }\n\n if (constructedRoute === '*') {\n return constructedRoute;\n }\n\n // For RegExp routes or route arrays, return the constructed route\n // This handles the case where the route is defined using RegExp or an array\n if (\n constructedRoute.includes('/') &&\n (constructedRoute.includes(',') ||\n constructedRoute.includes('\\\\') ||\n constructedRoute.includes('*') ||\n constructedRoute.includes('['))\n ) {\n return constructedRoute;\n }\n\n // Ensure route starts with '/' if it doesn't already\n const normalizedRoute = constructedRoute.startsWith('/') ? constructedRoute : `/${constructedRoute}`;\n\n // Validate that this appears to be a matched route\n // A route is considered matched if:\n // 1. We have a constructed route\n // 2. The original URL matches or starts with our route pattern\n const isValidRoute =\n normalizedRoute.length > 0 &&\n (req.originalUrl === normalizedRoute ||\n req.originalUrl.startsWith(normalizedRoute) ||\n isRoutePattern(normalizedRoute));\n\n return isValidRoute ? normalizedRoute : undefined;\n}\n\nexport function getConstructedRoute(req: ExpressRequest) {\n const layersStore: string[] = getStoredLayers(req);\n\n let constructedRoute: string = '';\n for (const path of layersStore) {\n if (path === '/' || path === '/*') {\n continue;\n }\n constructedRoute += !constructedRoute || constructedRoute.endsWith('/') ? path : `/${path}`;\n }\n\n return constructedRoute.replace(/\\/{2,}/g, '/');\n}\n\nexport const getLayerPath = (args: unknown[]): string | undefined => {\n const firstArg = args[0];\n\n if (Array.isArray(firstArg)) {\n return firstArg.map(arg => extractLayerPathSegment(arg) || '').join(',');\n }\n\n return extractLayerPathSegment(firstArg as LayerPathSegment);\n};\n\nconst extractLayerPathSegment = (arg: LayerPathSegment): string | undefined =>\n typeof arg === 'string' ? arg : arg instanceof RegExp || typeof arg === 'number' ? String(arg) : undefined;\n\n// v5 we instrument Router.prototype\n// v4 we instrument Router itself\nexport const isExpressWithRouterPrototype = (express: unknown): express is ExpressExportv5 =>\n isExpressRouterPrototype((express as ExpressExportv5)?.Router?.prototype);\n\n// In Express v4, Router is a function (not a plain object), so we need to accept both\nconst isExpressRouterPrototype = (routerProto?: unknown): routerProto is ExpressRouterv4 =>\n (typeof routerProto === 'object' || typeof routerProto === 'function') &&\n !!routerProto &&\n 'route' in routerProto &&\n typeof (routerProto as ExpressRouterv4).route === 'function';\n\nexport const isExpressWithoutRouterPrototype = (express: unknown): express is ExpressExportv4 =>\n isExpressRouterPrototype((express as ExpressExportv4).Router) && !isExpressWithRouterPrototype(express);\n\nfunction getStatusCodeFromResponse(error: MiddlewareError): number {\n const statusCode = error.status || error.statusCode || error.status_code || error.output?.statusCode;\n return statusCode ? parseInt(statusCode as string, 10) : 500;\n}\n\n/** Returns true if response code is internal server error */\nexport function defaultShouldHandleError(error: MiddlewareError): boolean {\n const status = getStatusCodeFromResponse(error);\n return status >= 500;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { addBreadcrumb } from '../../breadcrumbs.js';
|
|
2
|
+
import { getBreadcrumbLogLevelFromHttpStatusCode } from '../../utils/breadcrumb-log-level.js';
|
|
3
|
+
import { parseUrl, getSanitizedUrlString } from '../../utils/url.js';
|
|
4
|
+
import { getRequestUrlFromClientRequest } from './get-request-url.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Create a breadcrumb for a finished outgoing HTTP request.
|
|
8
|
+
*/
|
|
9
|
+
function addOutgoingRequestBreadcrumb(
|
|
10
|
+
request,
|
|
11
|
+
response,
|
|
12
|
+
) {
|
|
13
|
+
const url = getRequestUrlFromClientRequest(request);
|
|
14
|
+
const parsedUrl = parseUrl(url);
|
|
15
|
+
|
|
16
|
+
const statusCode = response?.statusCode;
|
|
17
|
+
const level = getBreadcrumbLogLevelFromHttpStatusCode(statusCode);
|
|
18
|
+
|
|
19
|
+
addBreadcrumb(
|
|
20
|
+
{
|
|
21
|
+
category: 'http',
|
|
22
|
+
data: {
|
|
23
|
+
status_code: statusCode,
|
|
24
|
+
url: getSanitizedUrlString(parsedUrl),
|
|
25
|
+
'http.method': request.method || 'GET',
|
|
26
|
+
...(parsedUrl.search ? { 'http.query': parsedUrl.search } : {}),
|
|
27
|
+
...(parsedUrl.hash ? { 'http.fragment': parsedUrl.hash } : {}),
|
|
28
|
+
},
|
|
29
|
+
type: 'http',
|
|
30
|
+
level,
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
event: 'response',
|
|
34
|
+
request,
|
|
35
|
+
response,
|
|
36
|
+
},
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export { addOutgoingRequestBreadcrumb };
|
|
41
|
+
//# sourceMappingURL=add-outgoing-request-breadcrumb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-outgoing-request-breadcrumb.js","sources":["../../../../src/integrations/http/add-outgoing-request-breadcrumb.ts"],"sourcesContent":["import { addBreadcrumb } from '../../breadcrumbs';\nimport { getBreadcrumbLogLevelFromHttpStatusCode } from '../../utils/breadcrumb-log-level';\nimport { getSanitizedUrlString, parseUrl } from '../../utils/url';\nimport { getRequestUrlFromClientRequest } from './get-request-url';\nimport type { HttpClientRequest, HttpIncomingMessage } from './types';\n\n/**\n * Create a breadcrumb for a finished outgoing HTTP request.\n */\nexport function addOutgoingRequestBreadcrumb(\n request: HttpClientRequest,\n response: HttpIncomingMessage | undefined,\n): void {\n const url = getRequestUrlFromClientRequest(request);\n const parsedUrl = parseUrl(url);\n\n const statusCode = response?.statusCode;\n const level = getBreadcrumbLogLevelFromHttpStatusCode(statusCode);\n\n addBreadcrumb(\n {\n category: 'http',\n data: {\n status_code: statusCode,\n url: getSanitizedUrlString(parsedUrl),\n 'http.method': request.method || 'GET',\n ...(parsedUrl.search ? { 'http.query': parsedUrl.search } : {}),\n ...(parsedUrl.hash ? { 'http.fragment': parsedUrl.hash } : {}),\n },\n type: 'http',\n level,\n },\n {\n event: 'response',\n request,\n response,\n },\n );\n}\n"],"names":[],"mappings":";;;;;AAMA;AACA;AACA;AACO,SAAS,4BAA4B;AAC5C,EAAE,OAAO;AACT,EAAE,QAAQ;AACV,EAAQ;AACR,EAAE,MAAM,GAAA,GAAM,8BAA8B,CAAC,OAAO,CAAC;AACrD,EAAE,MAAM,SAAA,GAAY,QAAQ,CAAC,GAAG,CAAC;;AAEjC,EAAE,MAAM,UAAA,GAAa,QAAQ,EAAE,UAAU;AACzC,EAAE,MAAM,KAAA,GAAQ,uCAAuC,CAAC,UAAU,CAAC;;AAEnE,EAAE,aAAa;AACf,IAAI;AACJ,MAAM,QAAQ,EAAE,MAAM;AACtB,MAAM,IAAI,EAAE;AACZ,QAAQ,WAAW,EAAE,UAAU;AAC/B,QAAQ,GAAG,EAAE,qBAAqB,CAAC,SAAS,CAAC;AAC7C,QAAQ,aAAa,EAAE,OAAO,CAAC,MAAA,IAAU,KAAK;AAC9C,QAAQ,IAAI,SAAS,CAAC,MAAA,GAAS,EAAE,YAAY,EAAE,SAAS,CAAC,MAAA,EAAO,GAAI,EAAE,CAAC;AACvE,QAAQ,IAAI,SAAS,CAAC,IAAA,GAAO,EAAE,eAAe,EAAE,SAAS,CAAC,IAAA,EAAK,GAAI,EAAE,CAAC;AACtE,OAAO;AACP,MAAM,IAAI,EAAE,MAAM;AAClB,MAAM,KAAK;AACX,KAAK;AACL,IAAI;AACJ,MAAM,KAAK,EAAE,UAAU;AACvB,MAAM,OAAO;AACb,MAAM,QAAQ;AACd,KAAK;AACL,GAAG;AACH;;;;"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { getDefaultExport } from '../../utils/get-default-export.js';
|
|
2
|
+
import { HTTP_ON_CLIENT_REQUEST } from './constants.js';
|
|
3
|
+
import { getOriginalFunction, wrapMethod } from '../../utils/object.js';
|
|
4
|
+
import { getHttpClientSubscriptions } from './client-subscriptions.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Platform-portable HTTP(S) outgoing-request patching integration
|
|
8
|
+
*
|
|
9
|
+
* Patches the `http` and `https` Node.js built-in module exports to create
|
|
10
|
+
* Sentry spans for outgoing requests and optionally inject distributed trace
|
|
11
|
+
* propagation headers.
|
|
12
|
+
*
|
|
13
|
+
* @module
|
|
14
|
+
*
|
|
15
|
+
* This Sentry integration is a derivative work based on the OpenTelemetry
|
|
16
|
+
* HTTP instrumentation.
|
|
17
|
+
*
|
|
18
|
+
* <https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-instrumentation-http>
|
|
19
|
+
*
|
|
20
|
+
* Extended under the terms of the Apache 2.0 license linked below:
|
|
21
|
+
*
|
|
22
|
+
* ----
|
|
23
|
+
*
|
|
24
|
+
* Copyright The OpenTelemetry Authors
|
|
25
|
+
*
|
|
26
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
27
|
+
* you may not use this file except in compliance with the License.
|
|
28
|
+
* You may obtain a copy of the License at
|
|
29
|
+
*
|
|
30
|
+
* https://www.apache.org/licenses/LICENSE-2.0
|
|
31
|
+
*
|
|
32
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
33
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
34
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
35
|
+
* See the License for the specific language governing permissions and
|
|
36
|
+
* limitations under the License.
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
function patchHttpRequest(httpModule, options) {
|
|
41
|
+
// avoid double-wrap
|
|
42
|
+
if (!getOriginalFunction(httpModule.request)) {
|
|
43
|
+
const { [HTTP_ON_CLIENT_REQUEST]: onHttpClientRequestCreated } = getHttpClientSubscriptions({
|
|
44
|
+
...options,
|
|
45
|
+
http: httpModule,
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
const originalRequest = httpModule.request;
|
|
49
|
+
wrapMethod(httpModule, 'request', function patchedRequest( ...args) {
|
|
50
|
+
const request = originalRequest.apply(this, args) ;
|
|
51
|
+
onHttpClientRequestCreated({ request }, HTTP_ON_CLIENT_REQUEST);
|
|
52
|
+
return request;
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// This simply ensures that http.get calls http.request, which we patched.
|
|
58
|
+
// Call it from the object each time, to ensure that any subsequent patches
|
|
59
|
+
// or other mutations are also respected.
|
|
60
|
+
function patchHttpGet(httpModule) {
|
|
61
|
+
if (!getOriginalFunction(httpModule.get)) {
|
|
62
|
+
// match node's normalization to exactly 3 arguments.
|
|
63
|
+
wrapMethod(httpModule, 'get', function patchedGet( input, options, cb) {
|
|
64
|
+
// http.get is like http.request but automatically calls .end()
|
|
65
|
+
const request = httpModule.request.call(this, input, options, cb) ;
|
|
66
|
+
request.end();
|
|
67
|
+
return request;
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function patchModule(httpModuleExport, options = {}) {
|
|
73
|
+
const httpDefault = getDefaultExport(httpModuleExport);
|
|
74
|
+
const httpModule = httpModuleExport ;
|
|
75
|
+
// if we have a default, patch that, and copy to the import container
|
|
76
|
+
if (httpDefault !== httpModuleExport) {
|
|
77
|
+
patchModule(httpDefault, options);
|
|
78
|
+
// copy with defineProperty because these might be configured oddly
|
|
79
|
+
for (const method of ['get', 'request']) {
|
|
80
|
+
const desc = Object.getOwnPropertyDescriptor(httpDefault, method);
|
|
81
|
+
/* v8 ignore start - will always be set at this point */
|
|
82
|
+
if (desc) {
|
|
83
|
+
Object.defineProperty(httpModule, method, desc);
|
|
84
|
+
}
|
|
85
|
+
/* v8 ignore stop */
|
|
86
|
+
}
|
|
87
|
+
return httpModule;
|
|
88
|
+
}
|
|
89
|
+
patchHttpRequest(httpModule, options);
|
|
90
|
+
patchHttpGet(httpModule);
|
|
91
|
+
return httpModuleExport;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Patch an `node:http` or `node:https` module-shaped export so that every
|
|
96
|
+
* outgoing request is tracked by Sentry.
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* ```javascript
|
|
100
|
+
* import http from 'http';
|
|
101
|
+
* import { patchHttpModule } from '@sentry/core';
|
|
102
|
+
* patchHttpModule(http, { propagateTrace: true });
|
|
103
|
+
* ```
|
|
104
|
+
*/
|
|
105
|
+
const patchHttpModuleClient = (
|
|
106
|
+
httpModuleExport,
|
|
107
|
+
options = {},
|
|
108
|
+
) => patchModule(httpModuleExport, options);
|
|
109
|
+
|
|
110
|
+
export { patchHttpModuleClient };
|
|
111
|
+
//# sourceMappingURL=client-patch.js.map
|