@sentry/core 10.38.0 → 10.39.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/attributes.js.map +1 -1
- package/build/cjs/client.js +22 -12
- package/build/cjs/client.js.map +1 -1
- package/build/cjs/envelope.js +41 -7
- package/build/cjs/envelope.js.map +1 -1
- package/build/cjs/index.js +52 -0
- package/build/cjs/index.js.map +1 -1
- package/build/cjs/integration.js +12 -0
- package/build/cjs/integration.js.map +1 -1
- package/build/cjs/integrations/eventFilters.js +1 -1
- package/build/cjs/integrations/eventFilters.js.map +1 -1
- package/build/cjs/integrations/mcp-server/correlation.js +54 -10
- package/build/cjs/integrations/mcp-server/correlation.js.map +1 -1
- package/build/cjs/integrations/mcp-server/sessionManagement.js +50 -16
- package/build/cjs/integrations/mcp-server/sessionManagement.js.map +1 -1
- package/build/cjs/integrations/requestdata.js +72 -6
- package/build/cjs/integrations/requestdata.js.map +1 -1
- package/build/cjs/integrations/spanStreaming.js +54 -0
- package/build/cjs/integrations/spanStreaming.js.map +1 -0
- package/build/cjs/metrics/public-api.js +3 -3
- package/build/cjs/metrics/public-api.js.map +1 -1
- package/build/cjs/scope.js +1 -1
- package/build/cjs/scope.js.map +1 -1
- package/build/cjs/semanticAttributes.js +84 -0
- package/build/cjs/semanticAttributes.js.map +1 -1
- package/build/cjs/spans/captureSpan.js +104 -0
- package/build/cjs/spans/captureSpan.js.map +1 -0
- package/build/cjs/spans/spanBuffer.js +121 -0
- package/build/cjs/spans/spanBuffer.js.map +1 -0
- package/build/cjs/spans/spanFirstUtils.js +186 -0
- package/build/cjs/spans/spanFirstUtils.js.map +1 -0
- package/build/cjs/tracing/ai/gen-ai-attributes.js +6 -0
- package/build/cjs/tracing/ai/gen-ai-attributes.js.map +1 -1
- package/build/cjs/tracing/openai/index.js +134 -51
- package/build/cjs/tracing/openai/index.js.map +1 -1
- package/build/cjs/tracing/sentrySpan.js +32 -0
- package/build/cjs/tracing/sentrySpan.js.map +1 -1
- package/build/cjs/tracing/trace.js +1 -0
- package/build/cjs/tracing/trace.js.map +1 -1
- package/build/cjs/tracing/vercel-ai/constants.js +4 -0
- package/build/cjs/tracing/vercel-ai/constants.js.map +1 -1
- package/build/cjs/tracing/vercel-ai/index.js +14 -0
- package/build/cjs/tracing/vercel-ai/index.js.map +1 -1
- package/build/cjs/tracing/vercel-ai/utils.js +71 -22
- package/build/cjs/tracing/vercel-ai/utils.js.map +1 -1
- package/build/cjs/transports/base.js +18 -2
- package/build/cjs/transports/base.js.map +1 -1
- package/build/cjs/transports/offline.js +16 -17
- package/build/cjs/transports/offline.js.map +1 -1
- package/build/cjs/utils/beforeSendSpan.js +36 -0
- package/build/cjs/utils/beforeSendSpan.js.map +1 -0
- package/build/cjs/utils/envToBool.js +32 -0
- package/build/cjs/utils/envToBool.js.map +1 -0
- package/build/cjs/utils/featureFlags.js +1 -0
- package/build/cjs/utils/featureFlags.js.map +1 -1
- package/build/cjs/utils/flushIfServerless.js.map +1 -1
- package/build/cjs/utils/hasSpanStreamingEnabled.js +21 -0
- package/build/cjs/utils/hasSpanStreamingEnabled.js.map +1 -0
- package/build/cjs/utils/prepareEvent.js +6 -1
- package/build/cjs/utils/prepareEvent.js.map +1 -1
- package/build/cjs/utils/promisebuffer.js +5 -3
- package/build/cjs/utils/promisebuffer.js.map +1 -1
- package/build/cjs/utils/scopeData.js +4 -0
- package/build/cjs/utils/scopeData.js.map +1 -1
- package/build/cjs/utils/sdkMetadata.js +7 -11
- package/build/cjs/utils/sdkMetadata.js.map +1 -1
- package/build/cjs/utils/should-ignore-span.js +31 -9
- package/build/cjs/utils/should-ignore-span.js.map +1 -1
- package/build/cjs/utils/spanUtils.js +90 -2
- package/build/cjs/utils/spanUtils.js.map +1 -1
- package/build/cjs/utils/timer.js +20 -0
- package/build/cjs/utils/timer.js.map +1 -0
- package/build/cjs/utils/tracePropagationTargets.js +38 -0
- package/build/cjs/utils/tracePropagationTargets.js.map +1 -0
- package/build/cjs/utils/version.js +1 -1
- package/build/cjs/utils/version.js.map +1 -1
- package/build/esm/attributes.js.map +1 -1
- package/build/esm/client.js +18 -8
- package/build/esm/client.js.map +1 -1
- package/build/esm/envelope.js +41 -8
- package/build/esm/envelope.js.map +1 -1
- package/build/esm/index.js +12 -3
- package/build/esm/index.js.map +1 -1
- package/build/esm/integration.js +12 -1
- package/build/esm/integration.js.map +1 -1
- package/build/esm/integrations/eventFilters.js +1 -1
- package/build/esm/integrations/eventFilters.js.map +1 -1
- package/build/esm/integrations/mcp-server/correlation.js +54 -10
- package/build/esm/integrations/mcp-server/correlation.js.map +1 -1
- package/build/esm/integrations/mcp-server/sessionManagement.js +50 -16
- package/build/esm/integrations/mcp-server/sessionManagement.js.map +1 -1
- package/build/esm/integrations/requestdata.js +72 -6
- package/build/esm/integrations/requestdata.js.map +1 -1
- package/build/esm/integrations/spanStreaming.js +52 -0
- package/build/esm/integrations/spanStreaming.js.map +1 -0
- package/build/esm/metrics/public-api.js +3 -3
- package/build/esm/metrics/public-api.js.map +1 -1
- package/build/esm/package.json +1 -1
- package/build/esm/scope.js +1 -1
- package/build/esm/scope.js.map +1 -1
- package/build/esm/semanticAttributes.js +57 -1
- package/build/esm/semanticAttributes.js.map +1 -1
- package/build/esm/spans/captureSpan.js +102 -0
- package/build/esm/spans/captureSpan.js.map +1 -0
- package/build/esm/spans/spanBuffer.js +119 -0
- package/build/esm/spans/spanBuffer.js.map +1 -0
- package/build/esm/spans/spanFirstUtils.js +182 -0
- package/build/esm/spans/spanFirstUtils.js.map +1 -0
- package/build/esm/tracing/ai/gen-ai-attributes.js +6 -1
- package/build/esm/tracing/ai/gen-ai-attributes.js.map +1 -1
- package/build/esm/tracing/openai/index.js +134 -51
- package/build/esm/tracing/openai/index.js.map +1 -1
- package/build/esm/tracing/sentrySpan.js +33 -1
- package/build/esm/tracing/sentrySpan.js.map +1 -1
- package/build/esm/tracing/trace.js +1 -0
- package/build/esm/tracing/trace.js.map +1 -1
- package/build/esm/tracing/vercel-ai/constants.js +4 -1
- package/build/esm/tracing/vercel-ai/constants.js.map +1 -1
- package/build/esm/tracing/vercel-ai/index.js +15 -1
- package/build/esm/tracing/vercel-ai/index.js.map +1 -1
- package/build/esm/tracing/vercel-ai/utils.js +73 -24
- package/build/esm/tracing/vercel-ai/utils.js.map +1 -1
- package/build/esm/transports/base.js +18 -2
- package/build/esm/transports/base.js.map +1 -1
- package/build/esm/transports/offline.js +16 -17
- package/build/esm/transports/offline.js.map +1 -1
- package/build/esm/utils/beforeSendSpan.js +33 -0
- package/build/esm/utils/beforeSendSpan.js.map +1 -0
- package/build/esm/utils/envToBool.js +28 -0
- package/build/esm/utils/envToBool.js.map +1 -0
- package/build/esm/utils/featureFlags.js +1 -0
- package/build/esm/utils/featureFlags.js.map +1 -1
- package/build/esm/utils/flushIfServerless.js.map +1 -1
- package/build/esm/utils/hasSpanStreamingEnabled.js +19 -0
- package/build/esm/utils/hasSpanStreamingEnabled.js.map +1 -0
- package/build/esm/utils/prepareEvent.js +6 -1
- package/build/esm/utils/prepareEvent.js.map +1 -1
- package/build/esm/utils/promisebuffer.js +5 -3
- package/build/esm/utils/promisebuffer.js.map +1 -1
- package/build/esm/utils/scopeData.js +4 -0
- package/build/esm/utils/scopeData.js.map +1 -1
- package/build/esm/utils/sdkMetadata.js +7 -11
- package/build/esm/utils/sdkMetadata.js.map +1 -1
- package/build/esm/utils/should-ignore-span.js +31 -9
- package/build/esm/utils/should-ignore-span.js.map +1 -1
- package/build/esm/utils/spanUtils.js +87 -3
- package/build/esm/utils/spanUtils.js.map +1 -1
- package/build/esm/utils/timer.js +18 -0
- package/build/esm/utils/timer.js.map +1 -0
- package/build/esm/utils/tracePropagationTargets.js +36 -0
- package/build/esm/utils/tracePropagationTargets.js.map +1 -0
- package/build/esm/utils/version.js +1 -1
- package/build/esm/utils/version.js.map +1 -1
- package/build/types/attributes.d.ts +1 -1
- package/build/types/attributes.d.ts.map +1 -1
- package/build/types/client.d.ts +40 -2
- package/build/types/client.d.ts.map +1 -1
- package/build/types/envelope.d.ts +6 -1
- package/build/types/envelope.d.ts.map +1 -1
- package/build/types/index.d.ts +13 -4
- package/build/types/index.d.ts.map +1 -1
- package/build/types/integration.d.ts +4 -0
- package/build/types/integration.d.ts.map +1 -1
- package/build/types/integrations/mcp-server/correlation.d.ts +6 -2
- package/build/types/integrations/mcp-server/correlation.d.ts.map +1 -1
- package/build/types/integrations/mcp-server/sessionManagement.d.ts +8 -2
- package/build/types/integrations/mcp-server/sessionManagement.d.ts.map +1 -1
- package/build/types/integrations/requestdata.d.ts.map +1 -1
- package/build/types/integrations/spanStreaming.d.ts +11 -0
- package/build/types/integrations/spanStreaming.d.ts.map +1 -0
- package/build/types/metrics/public-api.d.ts +3 -3
- package/build/types/semanticAttributes.d.ts +38 -0
- package/build/types/semanticAttributes.d.ts.map +1 -1
- package/build/types/spans/captureSpan.d.ts +10 -0
- package/build/types/spans/captureSpan.d.ts.map +1 -0
- package/build/types/spans/spanBuffer.d.ts +35 -0
- package/build/types/spans/spanBuffer.d.ts.map +1 -0
- package/build/types/spans/spanFirstUtils.d.ts +20 -0
- package/build/types/spans/spanFirstUtils.d.ts.map +1 -0
- package/build/types/tracing/ai/gen-ai-attributes.d.ts +4 -0
- package/build/types/tracing/ai/gen-ai-attributes.d.ts.map +1 -1
- package/build/types/tracing/openai/index.d.ts.map +1 -1
- package/build/types/tracing/sentrySpan.d.ts +10 -1
- package/build/types/tracing/sentrySpan.d.ts.map +1 -1
- package/build/types/tracing/vercel-ai/constants.d.ts +1 -0
- package/build/types/tracing/vercel-ai/constants.d.ts.map +1 -1
- package/build/types/tracing/vercel-ai/index.d.ts.map +1 -1
- package/build/types/tracing/vercel-ai/utils.d.ts +2 -2
- package/build/types/tracing/vercel-ai/utils.d.ts.map +1 -1
- package/build/types/transports/base.d.ts.map +1 -1
- package/build/types/transports/offline.d.ts.map +1 -1
- package/build/types/types-hoist/attributes.d.ts +19 -0
- package/build/types/types-hoist/attributes.d.ts.map +1 -0
- package/build/types/types-hoist/envelope.d.ts +22 -2
- package/build/types/types-hoist/envelope.d.ts.map +1 -1
- package/build/types/types-hoist/feedback/index.d.ts.map +1 -1
- package/build/types/types-hoist/integration.d.ts +7 -0
- package/build/types/types-hoist/integration.d.ts.map +1 -1
- package/build/types/types-hoist/link.d.ts +2 -2
- package/build/types/types-hoist/link.d.ts.map +1 -1
- package/build/types/types-hoist/options.d.ts +18 -2
- package/build/types/types-hoist/options.d.ts.map +1 -1
- package/build/types/types-hoist/span.d.ts +27 -0
- package/build/types/types-hoist/span.d.ts.map +1 -1
- package/build/types/utils/beforeSendSpan.d.ts +22 -0
- package/build/types/utils/beforeSendSpan.d.ts.map +1 -0
- package/build/types/utils/envToBool.d.ts +13 -0
- package/build/types/utils/envToBool.d.ts.map +1 -0
- package/build/types/utils/featureFlags.d.ts.map +1 -1
- package/build/types/utils/flushIfServerless.d.ts.map +1 -1
- package/build/types/utils/hasSpanStreamingEnabled.d.ts +9 -0
- package/build/types/utils/hasSpanStreamingEnabled.d.ts.map +1 -0
- package/build/types/utils/prepareEvent.d.ts.map +1 -1
- package/build/types/utils/promisebuffer.d.ts.map +1 -1
- package/build/types/utils/scopeData.d.ts.map +1 -1
- package/build/types/utils/sdkMetadata.d.ts.map +1 -1
- package/build/types/utils/should-ignore-span.d.ts +3 -3
- package/build/types/utils/should-ignore-span.d.ts.map +1 -1
- package/build/types/utils/spanUtils.d.ts +22 -2
- package/build/types/utils/spanUtils.d.ts.map +1 -1
- package/build/types/utils/timer.d.ts +11 -0
- package/build/types/utils/timer.d.ts.map +1 -0
- package/build/types/utils/tracePropagationTargets.d.ts +9 -0
- package/build/types/utils/tracePropagationTargets.d.ts.map +1 -0
- package/build/types-ts3.8/attributes.d.ts +1 -1
- package/build/types-ts3.8/client.d.ts +40 -2
- package/build/types-ts3.8/envelope.d.ts +6 -1
- package/build/types-ts3.8/index.d.ts +13 -4
- package/build/types-ts3.8/integration.d.ts +4 -0
- package/build/types-ts3.8/integrations/mcp-server/correlation.d.ts +6 -2
- package/build/types-ts3.8/integrations/mcp-server/sessionManagement.d.ts +8 -2
- package/build/types-ts3.8/integrations/spanStreaming.d.ts +11 -0
- package/build/types-ts3.8/metrics/public-api.d.ts +3 -3
- package/build/types-ts3.8/semanticAttributes.d.ts +38 -0
- package/build/types-ts3.8/spans/captureSpan.d.ts +10 -0
- package/build/types-ts3.8/spans/spanBuffer.d.ts +35 -0
- package/build/types-ts3.8/spans/spanFirstUtils.d.ts +20 -0
- package/build/types-ts3.8/tracing/ai/gen-ai-attributes.d.ts +4 -0
- package/build/types-ts3.8/tracing/sentrySpan.d.ts +10 -1
- package/build/types-ts3.8/tracing/vercel-ai/constants.d.ts +1 -0
- package/build/types-ts3.8/tracing/vercel-ai/utils.d.ts +2 -2
- package/build/types-ts3.8/types-hoist/attributes.d.ts +19 -0
- package/build/types-ts3.8/types-hoist/envelope.d.ts +22 -2
- package/build/types-ts3.8/types-hoist/integration.d.ts +7 -0
- package/build/types-ts3.8/types-hoist/link.d.ts +2 -2
- package/build/types-ts3.8/types-hoist/options.d.ts +18 -2
- package/build/types-ts3.8/types-hoist/span.d.ts +27 -0
- package/build/types-ts3.8/utils/beforeSendSpan.d.ts +22 -0
- package/build/types-ts3.8/utils/envToBool.d.ts +13 -0
- package/build/types-ts3.8/utils/hasSpanStreamingEnabled.d.ts +9 -0
- package/build/types-ts3.8/utils/should-ignore-span.d.ts +3 -3
- package/build/types-ts3.8/utils/spanUtils.d.ts +22 -2
- package/build/types-ts3.8/utils/timer.d.ts +11 -0
- package/build/types-ts3.8/utils/tracePropagationTargets.d.ts +9 -0
- package/package.json +1 -1
package/build/cjs/envelope.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
2
|
|
|
3
3
|
const dynamicSamplingContext = require('./tracing/dynamicSamplingContext.js');
|
|
4
|
+
const beforeSendSpan = require('./utils/beforeSendSpan.js');
|
|
4
5
|
const dsn = require('./utils/dsn.js');
|
|
5
6
|
const envelope = require('./utils/envelope.js');
|
|
6
7
|
const shouldIgnoreSpan = require('./utils/should-ignore-span.js');
|
|
@@ -97,10 +98,6 @@ function createEventEnvelope(
|
|
|
97
98
|
* Takes an optional client and runs spans through `beforeSendSpan` if available.
|
|
98
99
|
*/
|
|
99
100
|
function createSpanEnvelope(spans, client) {
|
|
100
|
-
function dscHasRequiredProps(dsc) {
|
|
101
|
-
return !!dsc.trace_id && !!dsc.public_key;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
101
|
// For the moment we'll obtain the DSC from the first span in the array
|
|
105
102
|
// This might need to be changed if we permit sending multiple spans from
|
|
106
103
|
// different segments in one envelope
|
|
@@ -115,7 +112,8 @@ function createSpanEnvelope(spans, client) {
|
|
|
115
112
|
...(!!tunnel && dsn$1 && { dsn: dsn.dsnToString(dsn$1) }),
|
|
116
113
|
};
|
|
117
114
|
|
|
118
|
-
const
|
|
115
|
+
const options = client?.getOptions();
|
|
116
|
+
const ignoreSpans = options?.ignoreSpans;
|
|
119
117
|
|
|
120
118
|
const filteredSpans = ignoreSpans?.length
|
|
121
119
|
? spans.filter(span => !shouldIgnoreSpan.shouldIgnoreSpan(spanUtils.spanToJSON(span), ignoreSpans))
|
|
@@ -126,10 +124,14 @@ function createSpanEnvelope(spans, client) {
|
|
|
126
124
|
client?.recordDroppedEvent('before_send', 'span', droppedSpans);
|
|
127
125
|
}
|
|
128
126
|
|
|
129
|
-
|
|
127
|
+
// checking against traceLifeCycle so that TS can infer the correct type for
|
|
128
|
+
// beforeSendSpan. This is a workaround for now as most likely, this entire function
|
|
129
|
+
// will be removed in the future (once we send standalone spans as spans v2)
|
|
130
|
+
const convertToSpanJSON = options?.beforeSendSpan
|
|
130
131
|
? (span) => {
|
|
131
132
|
const spanJson = spanUtils.spanToJSON(span);
|
|
132
|
-
const processedSpan =
|
|
133
|
+
const processedSpan =
|
|
134
|
+
!beforeSendSpan.isV2BeforeSendSpanCallback(options?.beforeSendSpan) && options?.beforeSendSpan?.(spanJson);
|
|
133
135
|
|
|
134
136
|
if (!processedSpan) {
|
|
135
137
|
spanUtils.showSpanDropWarning();
|
|
@@ -151,8 +153,40 @@ function createSpanEnvelope(spans, client) {
|
|
|
151
153
|
return envelope.createEnvelope(headers, items);
|
|
152
154
|
}
|
|
153
155
|
|
|
156
|
+
/**
|
|
157
|
+
* Creates a span v2 envelope
|
|
158
|
+
*/
|
|
159
|
+
function createSpanV2Envelope(
|
|
160
|
+
serializedSpans,
|
|
161
|
+
dsc,
|
|
162
|
+
client,
|
|
163
|
+
) {
|
|
164
|
+
const dsn$1 = client?.getDsn();
|
|
165
|
+
const tunnel = client?.getOptions().tunnel;
|
|
166
|
+
const sdk = client?.getOptions()._metadata?.sdk;
|
|
167
|
+
|
|
168
|
+
const headers = {
|
|
169
|
+
sent_at: new Date().toISOString(),
|
|
170
|
+
...(dscHasRequiredProps(dsc) && { trace: dsc }),
|
|
171
|
+
...(sdk && { sdk: sdk }),
|
|
172
|
+
...(!!tunnel && dsn$1 && { dsn: dsn.dsnToString(dsn$1) }),
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
const spanContainer = [
|
|
176
|
+
{ type: 'span', item_count: serializedSpans.length, content_type: 'application/vnd.sentry.items.span.v2+json' },
|
|
177
|
+
{ items: serializedSpans },
|
|
178
|
+
];
|
|
179
|
+
|
|
180
|
+
return envelope.createEnvelope(headers, [spanContainer]);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function dscHasRequiredProps(dsc) {
|
|
184
|
+
return !!dsc.trace_id && !!dsc.public_key;
|
|
185
|
+
}
|
|
186
|
+
|
|
154
187
|
exports._enhanceEventWithSdkInfo = _enhanceEventWithSdkInfo;
|
|
155
188
|
exports.createEventEnvelope = createEventEnvelope;
|
|
156
189
|
exports.createSessionEnvelope = createSessionEnvelope;
|
|
157
190
|
exports.createSpanEnvelope = createSpanEnvelope;
|
|
191
|
+
exports.createSpanV2Envelope = createSpanV2Envelope;
|
|
158
192
|
//# sourceMappingURL=envelope.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"envelope.js","sources":["../../src/envelope.ts"],"sourcesContent":["import type { Client } from './client';\nimport { getDynamicSamplingContextFromSpan } from './tracing/dynamicSamplingContext';\nimport type { SentrySpan } from './tracing/sentrySpan';\nimport type { LegacyCSPReport } from './types-hoist/csp';\nimport type { DsnComponents } from './types-hoist/dsn';\nimport type {\n DynamicSamplingContext,\n EventEnvelope,\n EventItem,\n RawSecurityEnvelope,\n RawSecurityItem,\n SessionEnvelope,\n SessionItem,\n SpanEnvelope,\n SpanItem,\n} from './types-hoist/envelope';\nimport type { Event } from './types-hoist/event';\nimport type { SdkInfo } from './types-hoist/sdkinfo';\nimport type { SdkMetadata } from './types-hoist/sdkmetadata';\nimport type { Session, SessionAggregates } from './types-hoist/session';\nimport { dsnToString } from './utils/dsn';\nimport {\n createEnvelope,\n createEventEnvelopeHeaders,\n createSpanEnvelopeItem,\n getSdkMetadataForEnvelopeHeader,\n} from './utils/envelope';\nimport { uuid4 } from './utils/misc';\nimport { shouldIgnoreSpan } from './utils/should-ignore-span';\nimport { showSpanDropWarning, spanToJSON } from './utils/spanUtils';\n\n/**\n * Apply SdkInfo (name, version, packages, integrations) to the corresponding event key.\n * Merge with existing data if any.\n *\n * @internal, exported only for testing\n **/\nexport function _enhanceEventWithSdkInfo(event: Event, newSdkInfo?: SdkInfo): Event {\n if (!newSdkInfo) {\n return event;\n }\n\n const eventSdkInfo = event.sdk || {};\n\n event.sdk = {\n ...eventSdkInfo,\n name: eventSdkInfo.name || newSdkInfo.name,\n version: eventSdkInfo.version || newSdkInfo.version,\n integrations: [...(event.sdk?.integrations || []), ...(newSdkInfo.integrations || [])],\n packages: [...(event.sdk?.packages || []), ...(newSdkInfo.packages || [])],\n settings:\n event.sdk?.settings || newSdkInfo.settings\n ? {\n ...event.sdk?.settings,\n ...newSdkInfo.settings,\n }\n : undefined,\n };\n\n return event;\n}\n\n/** Creates an envelope from a Session */\nexport function createSessionEnvelope(\n session: Session | SessionAggregates,\n dsn?: DsnComponents,\n metadata?: SdkMetadata,\n tunnel?: string,\n): SessionEnvelope {\n const sdkInfo = getSdkMetadataForEnvelopeHeader(metadata);\n const envelopeHeaders = {\n sent_at: new Date().toISOString(),\n ...(sdkInfo && { sdk: sdkInfo }),\n ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n };\n\n const envelopeItem: SessionItem =\n 'aggregates' in session ? [{ type: 'sessions' }, session] : [{ type: 'session' }, session.toJSON()];\n\n return createEnvelope<SessionEnvelope>(envelopeHeaders, [envelopeItem]);\n}\n\n/**\n * Create an Envelope from an event.\n */\nexport function createEventEnvelope(\n event: Event,\n dsn?: DsnComponents,\n metadata?: SdkMetadata,\n tunnel?: string,\n): EventEnvelope {\n const sdkInfo = getSdkMetadataForEnvelopeHeader(metadata);\n\n /*\n Note: Due to TS, event.type may be `replay_event`, theoretically.\n In practice, we never call `createEventEnvelope` with `replay_event` type,\n and we'd have to adjust a looot of types to make this work properly.\n We want to avoid casting this around, as that could lead to bugs (e.g. when we add another type)\n So the safe choice is to really guard against the replay_event type here.\n */\n const eventType = event.type && event.type !== 'replay_event' ? event.type : 'event';\n\n _enhanceEventWithSdkInfo(event, metadata?.sdk);\n\n const envelopeHeaders = createEventEnvelopeHeaders(event, sdkInfo, tunnel, dsn);\n\n // Prevent this data (which, if it exists, was used in earlier steps in the processing pipeline) from being sent to\n // sentry. (Note: Our use of this property comes and goes with whatever we might be debugging, whatever hacks we may\n // have temporarily added, etc. Even if we don't happen to be using it at some point in the future, let's not get rid\n // of this `delete`, lest we miss putting it back in the next time the property is in use.)\n delete event.sdkProcessingMetadata;\n\n const eventItem: EventItem = [{ type: eventType }, event];\n return createEnvelope<EventEnvelope>(envelopeHeaders, [eventItem]);\n}\n\n/**\n * Create envelope from Span item.\n *\n * Takes an optional client and runs spans through `beforeSendSpan` if available.\n */\nexport function createSpanEnvelope(spans: [SentrySpan, ...SentrySpan[]], client?: Client): SpanEnvelope {\n function dscHasRequiredProps(dsc: Partial<DynamicSamplingContext>): dsc is DynamicSamplingContext {\n return !!dsc.trace_id && !!dsc.public_key;\n }\n\n // For the moment we'll obtain the DSC from the first span in the array\n // This might need to be changed if we permit sending multiple spans from\n // different segments in one envelope\n const dsc = getDynamicSamplingContextFromSpan(spans[0]);\n\n const dsn = client?.getDsn();\n const tunnel = client?.getOptions().tunnel;\n\n const headers: SpanEnvelope[0] = {\n sent_at: new Date().toISOString(),\n ...(dscHasRequiredProps(dsc) && { trace: dsc }),\n ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n };\n\n const { beforeSendSpan, ignoreSpans } = client?.getOptions() || {};\n\n const filteredSpans = ignoreSpans?.length\n ? spans.filter(span => !shouldIgnoreSpan(spanToJSON(span), ignoreSpans))\n : spans;\n const droppedSpans = spans.length - filteredSpans.length;\n\n if (droppedSpans) {\n client?.recordDroppedEvent('before_send', 'span', droppedSpans);\n }\n\n const convertToSpanJSON = beforeSendSpan\n ? (span: SentrySpan) => {\n const spanJson = spanToJSON(span);\n const processedSpan = beforeSendSpan(spanJson);\n\n if (!processedSpan) {\n showSpanDropWarning();\n return spanJson;\n }\n\n return processedSpan;\n }\n : spanToJSON;\n\n const items: SpanItem[] = [];\n for (const span of filteredSpans) {\n const spanJson = convertToSpanJSON(span);\n if (spanJson) {\n items.push(createSpanEnvelopeItem(spanJson));\n }\n }\n\n return createEnvelope<SpanEnvelope>(headers, items);\n}\n\n/**\n * Create an Envelope from a CSP report.\n */\nexport function createRawSecurityEnvelope(\n report: LegacyCSPReport,\n dsn: DsnComponents,\n tunnel?: string,\n release?: string,\n environment?: string,\n): RawSecurityEnvelope {\n const envelopeHeaders = {\n event_id: uuid4(),\n ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n };\n\n const eventItem: RawSecurityItem = [\n { type: 'raw_security', sentry_release: release, sentry_environment: environment },\n report,\n ];\n\n return createEnvelope<RawSecurityEnvelope>(envelopeHeaders, [eventItem]);\n}\n"],"names":["dsn","getSdkMetadataForEnvelopeHeader","dsnToString","createEnvelope","createEventEnvelopeHeaders","getDynamicSamplingContextFromSpan","shouldIgnoreSpan","spanToJSON","showSpanDropWarning","createSpanEnvelopeItem"],"mappings":";;;;;;;;AA+BA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,wBAAwB,CAAC,KAAK,EAAS,UAAU,EAAmB;AACpF,EAAE,IAAI,CAAC,UAAU,EAAE;AACnB,IAAI,OAAO,KAAK;AAChB,EAAE;;AAEF,EAAE,MAAM,eAAe,KAAK,CAAC,GAAA,IAAO,EAAE;;AAEtC,EAAE,KAAK,CAAC,GAAA,GAAM;AACd,IAAI,GAAG,YAAY;AACnB,IAAI,IAAI,EAAE,YAAY,CAAC,QAAQ,UAAU,CAAC,IAAI;AAC9C,IAAI,OAAO,EAAE,YAAY,CAAC,WAAW,UAAU,CAAC,OAAO;AACvD,IAAI,YAAY,EAAE,CAAC,IAAI,KAAK,CAAC,GAAG,EAAE,YAAA,IAAgB,EAAE,CAAC,EAAE,IAAI,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC;AAC1F,IAAI,QAAQ,EAAE,CAAC,IAAI,KAAK,CAAC,GAAG,EAAE,QAAA,IAAY,EAAE,CAAC,EAAE,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;AAC9E,IAAI,QAAQ;AACZ,MAAM,KAAK,CAAC,GAAG,EAAE,QAAA,IAAY,UAAU,CAAC;AACxC,UAAU;AACV,YAAY,GAAG,KAAK,CAAC,GAAG,EAAE,QAAQ;AAClC,YAAY,GAAG,UAAU,CAAC,QAAQ;AAClC;AACA,UAAU,SAAS;AACnB,GAAG;;AAEH,EAAE,OAAO,KAAK;AACd;;AAEA;AACO,SAAS,qBAAqB;AACrC,EAAE,OAAO;AACT,EAAEA,KAAG;AACL,EAAE,QAAQ;AACV,EAAE,MAAM;AACR,EAAmB;AACnB,EAAE,MAAM,OAAA,GAAUC,wCAA+B,CAAC,QAAQ,CAAC;AAC3D,EAAE,MAAM,kBAAkB;AAC1B,IAAI,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;AACrC,IAAI,IAAI,OAAA,IAAW,EAAE,GAAG,EAAE,OAAA,EAAS,CAAC;AACpC,IAAI,IAAI,CAAC,CAAC,MAAA,IAAUD,KAAA,IAAO,EAAE,GAAG,EAAEE,eAAW,CAACF,KAAG,CAAA,EAAG,CAAC;AACrD,GAAG;;AAEH,EAAE,MAAM,YAAY;AACpB,IAAI,YAAA,IAAgB,OAAA,GAAU,CAAC,EAAE,IAAI,EAAE,UAAA,EAAY,EAAE,OAAO,CAAA,GAAI,CAAC,EAAE,IAAI,EAAE,SAAA,EAAW,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;;AAEvG,EAAE,OAAOG,uBAAc,CAAkB,eAAe,EAAE,CAAC,YAAY,CAAC,CAAC;AACzE;;AAEA;AACA;AACA;AACO,SAAS,mBAAmB;AACnC,EAAE,KAAK;AACP,EAAE,GAAG;AACL,EAAE,QAAQ;AACV,EAAE,MAAM;AACR,EAAiB;AACjB,EAAE,MAAM,OAAA,GAAUF,wCAA+B,CAAC,QAAQ,CAAC;;AAE3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,MAAM,SAAA,GAAY,KAAK,CAAC,QAAQ,KAAK,CAAC,IAAA,KAAS,cAAA,GAAiB,KAAK,CAAC,IAAA,GAAO,OAAO;;AAEtF,EAAE,wBAAwB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC;;AAEhD,EAAE,MAAM,eAAA,GAAkBG,mCAA0B,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC;;AAEjF;AACA;AACA;AACA;AACA,EAAE,OAAO,KAAK,CAAC,qBAAqB;;AAEpC,EAAE,MAAM,SAAS,GAAc,CAAC,EAAE,IAAI,EAAE,SAAA,EAAW,EAAE,KAAK,CAAC;AAC3D,EAAE,OAAOD,uBAAc,CAAgB,eAAe,EAAE,CAAC,SAAS,CAAC,CAAC;AACpE;;AAEA;AACA;AACA;AACA;AACA;AACO,SAAS,kBAAkB,CAAC,KAAK,EAAiC,MAAM,EAAyB;AACxG,EAAE,SAAS,mBAAmB,CAAC,GAAG,EAAkE;AACpG,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,QAAA,IAAY,CAAC,CAAC,GAAG,CAAC,UAAU;AAC7C,EAAE;;AAEF;AACA;AACA;AACA,EAAE,MAAM,MAAME,wDAAiC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;;AAEzD,EAAE,MAAML,KAAA,GAAM,MAAM,EAAE,MAAM,EAAE;AAC9B,EAAE,MAAM,SAAS,MAAM,EAAE,UAAU,EAAE,CAAC,MAAM;;AAE5C,EAAE,MAAM,OAAO,GAAoB;AACnC,IAAI,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;AACrC,IAAI,IAAI,mBAAmB,CAAC,GAAG,CAAA,IAAK,EAAE,KAAK,EAAE,GAAA,EAAK,CAAC;AACnD,IAAI,IAAI,CAAC,CAAC,MAAA,IAAUA,KAAA,IAAO,EAAE,GAAG,EAAEE,eAAW,CAACF,KAAG,CAAA,EAAG,CAAC;AACrD,GAAG;;AAEH,EAAE,MAAM,EAAE,cAAc,EAAE,aAAY,GAAI,MAAM,EAAE,UAAU,EAAC,IAAK,EAAE;;AAEpE,EAAE,MAAM,aAAA,GAAgB,WAAW,EAAE;AACrC,MAAM,KAAK,CAAC,MAAM,CAAC,QAAQ,CAACM,iCAAgB,CAACC,oBAAU,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC;AAC3E,MAAM,KAAK;AACX,EAAE,MAAM,eAAe,KAAK,CAAC,MAAA,GAAS,aAAa,CAAC,MAAM;;AAE1D,EAAE,IAAI,YAAY,EAAE;AACpB,IAAI,MAAM,EAAE,kBAAkB,CAAC,aAAa,EAAE,MAAM,EAAE,YAAY,CAAC;AACnE,EAAE;;AAEF,EAAE,MAAM,oBAAoB;AAC5B,MAAM,CAAC,IAAI,KAAiB;AAC5B,QAAQ,MAAM,QAAA,GAAWA,oBAAU,CAAC,IAAI,CAAC;AACzC,QAAQ,MAAM,aAAA,GAAgB,cAAc,CAAC,QAAQ,CAAC;;AAEtD,QAAQ,IAAI,CAAC,aAAa,EAAE;AAC5B,UAAUC,6BAAmB,EAAE;AAC/B,UAAU,OAAO,QAAQ;AACzB,QAAQ;;AAER,QAAQ,OAAO,aAAa;AAC5B,MAAM;AACN,MAAMD,oBAAU;;AAEhB,EAAE,MAAM,KAAK,GAAe,EAAE;AAC9B,EAAE,KAAK,MAAM,IAAA,IAAQ,aAAa,EAAE;AACpC,IAAI,MAAM,QAAA,GAAW,iBAAiB,CAAC,IAAI,CAAC;AAC5C,IAAI,IAAI,QAAQ,EAAE;AAClB,MAAM,KAAK,CAAC,IAAI,CAACE,+BAAsB,CAAC,QAAQ,CAAC,CAAC;AAClD,IAAI;AACJ,EAAE;;AAEF,EAAE,OAAON,uBAAc,CAAe,OAAO,EAAE,KAAK,CAAC;AACrD;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"envelope.js","sources":["../../src/envelope.ts"],"sourcesContent":["import type { Client } from './client';\nimport { getDynamicSamplingContextFromSpan } from './tracing/dynamicSamplingContext';\nimport type { SentrySpan } from './tracing/sentrySpan';\nimport type { LegacyCSPReport } from './types-hoist/csp';\nimport type { DsnComponents } from './types-hoist/dsn';\nimport type {\n DynamicSamplingContext,\n EventEnvelope,\n EventItem,\n RawSecurityEnvelope,\n RawSecurityItem,\n SessionEnvelope,\n SessionItem,\n SpanContainerItem,\n SpanEnvelope,\n SpanItem,\n SpanV2Envelope,\n} from './types-hoist/envelope';\nimport type { Event } from './types-hoist/event';\nimport type { SdkInfo } from './types-hoist/sdkinfo';\nimport type { SdkMetadata } from './types-hoist/sdkmetadata';\nimport type { Session, SessionAggregates } from './types-hoist/session';\nimport type { SpanV2JSON } from './types-hoist/span';\nimport { isV2BeforeSendSpanCallback } from './utils/beforeSendSpan';\nimport { dsnToString } from './utils/dsn';\nimport {\n createEnvelope,\n createEventEnvelopeHeaders,\n createSpanEnvelopeItem,\n getSdkMetadataForEnvelopeHeader,\n} from './utils/envelope';\nimport { uuid4 } from './utils/misc';\nimport { shouldIgnoreSpan } from './utils/should-ignore-span';\nimport { showSpanDropWarning, spanToJSON } from './utils/spanUtils';\n\n/**\n * Apply SdkInfo (name, version, packages, integrations) to the corresponding event key.\n * Merge with existing data if any.\n *\n * @internal, exported only for testing\n **/\nexport function _enhanceEventWithSdkInfo(event: Event, newSdkInfo?: SdkInfo): Event {\n if (!newSdkInfo) {\n return event;\n }\n\n const eventSdkInfo = event.sdk || {};\n\n event.sdk = {\n ...eventSdkInfo,\n name: eventSdkInfo.name || newSdkInfo.name,\n version: eventSdkInfo.version || newSdkInfo.version,\n integrations: [...(event.sdk?.integrations || []), ...(newSdkInfo.integrations || [])],\n packages: [...(event.sdk?.packages || []), ...(newSdkInfo.packages || [])],\n settings:\n event.sdk?.settings || newSdkInfo.settings\n ? {\n ...event.sdk?.settings,\n ...newSdkInfo.settings,\n }\n : undefined,\n };\n\n return event;\n}\n\n/** Creates an envelope from a Session */\nexport function createSessionEnvelope(\n session: Session | SessionAggregates,\n dsn?: DsnComponents,\n metadata?: SdkMetadata,\n tunnel?: string,\n): SessionEnvelope {\n const sdkInfo = getSdkMetadataForEnvelopeHeader(metadata);\n const envelopeHeaders = {\n sent_at: new Date().toISOString(),\n ...(sdkInfo && { sdk: sdkInfo }),\n ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n };\n\n const envelopeItem: SessionItem =\n 'aggregates' in session ? [{ type: 'sessions' }, session] : [{ type: 'session' }, session.toJSON()];\n\n return createEnvelope<SessionEnvelope>(envelopeHeaders, [envelopeItem]);\n}\n\n/**\n * Create an Envelope from an event.\n */\nexport function createEventEnvelope(\n event: Event,\n dsn?: DsnComponents,\n metadata?: SdkMetadata,\n tunnel?: string,\n): EventEnvelope {\n const sdkInfo = getSdkMetadataForEnvelopeHeader(metadata);\n\n /*\n Note: Due to TS, event.type may be `replay_event`, theoretically.\n In practice, we never call `createEventEnvelope` with `replay_event` type,\n and we'd have to adjust a looot of types to make this work properly.\n We want to avoid casting this around, as that could lead to bugs (e.g. when we add another type)\n So the safe choice is to really guard against the replay_event type here.\n */\n const eventType = event.type && event.type !== 'replay_event' ? event.type : 'event';\n\n _enhanceEventWithSdkInfo(event, metadata?.sdk);\n\n const envelopeHeaders = createEventEnvelopeHeaders(event, sdkInfo, tunnel, dsn);\n\n // Prevent this data (which, if it exists, was used in earlier steps in the processing pipeline) from being sent to\n // sentry. (Note: Our use of this property comes and goes with whatever we might be debugging, whatever hacks we may\n // have temporarily added, etc. Even if we don't happen to be using it at some point in the future, let's not get rid\n // of this `delete`, lest we miss putting it back in the next time the property is in use.)\n delete event.sdkProcessingMetadata;\n\n const eventItem: EventItem = [{ type: eventType }, event];\n return createEnvelope<EventEnvelope>(envelopeHeaders, [eventItem]);\n}\n\n/**\n * Create envelope from Span item.\n *\n * Takes an optional client and runs spans through `beforeSendSpan` if available.\n */\nexport function createSpanEnvelope(spans: [SentrySpan, ...SentrySpan[]], client?: Client): SpanEnvelope {\n // For the moment we'll obtain the DSC from the first span in the array\n // This might need to be changed if we permit sending multiple spans from\n // different segments in one envelope\n const dsc = getDynamicSamplingContextFromSpan(spans[0]);\n\n const dsn = client?.getDsn();\n const tunnel = client?.getOptions().tunnel;\n\n const headers: SpanEnvelope[0] = {\n sent_at: new Date().toISOString(),\n ...(dscHasRequiredProps(dsc) && { trace: dsc }),\n ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n };\n\n const options = client?.getOptions();\n const ignoreSpans = options?.ignoreSpans;\n\n const filteredSpans = ignoreSpans?.length\n ? spans.filter(span => !shouldIgnoreSpan(spanToJSON(span), ignoreSpans))\n : spans;\n const droppedSpans = spans.length - filteredSpans.length;\n\n if (droppedSpans) {\n client?.recordDroppedEvent('before_send', 'span', droppedSpans);\n }\n\n // checking against traceLifeCycle so that TS can infer the correct type for\n // beforeSendSpan. This is a workaround for now as most likely, this entire function\n // will be removed in the future (once we send standalone spans as spans v2)\n const convertToSpanJSON = options?.beforeSendSpan\n ? (span: SentrySpan) => {\n const spanJson = spanToJSON(span);\n const processedSpan =\n !isV2BeforeSendSpanCallback(options?.beforeSendSpan) && options?.beforeSendSpan?.(spanJson);\n\n if (!processedSpan) {\n showSpanDropWarning();\n return spanJson;\n }\n\n return processedSpan;\n }\n : spanToJSON;\n\n const items: SpanItem[] = [];\n for (const span of filteredSpans) {\n const spanJson = convertToSpanJSON(span);\n if (spanJson) {\n items.push(createSpanEnvelopeItem(spanJson));\n }\n }\n\n return createEnvelope<SpanEnvelope>(headers, items);\n}\n\n/**\n * Creates a span v2 envelope\n */\nexport function createSpanV2Envelope(\n serializedSpans: SpanV2JSON[],\n dsc: Partial<DynamicSamplingContext>,\n client: Client,\n): SpanV2Envelope {\n const dsn = client?.getDsn();\n const tunnel = client?.getOptions().tunnel;\n const sdk = client?.getOptions()._metadata?.sdk;\n\n const headers: SpanV2Envelope[0] = {\n sent_at: new Date().toISOString(),\n ...(dscHasRequiredProps(dsc) && { trace: dsc }),\n ...(sdk && { sdk: sdk }),\n ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n };\n\n const spanContainer: SpanContainerItem = [\n { type: 'span', item_count: serializedSpans.length, content_type: 'application/vnd.sentry.items.span.v2+json' },\n { items: serializedSpans },\n ];\n\n return createEnvelope<SpanV2Envelope>(headers, [spanContainer]);\n}\n\n/**\n * Create an Envelope from a CSP report.\n */\nexport function createRawSecurityEnvelope(\n report: LegacyCSPReport,\n dsn: DsnComponents,\n tunnel?: string,\n release?: string,\n environment?: string,\n): RawSecurityEnvelope {\n const envelopeHeaders = {\n event_id: uuid4(),\n ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n };\n\n const eventItem: RawSecurityItem = [\n { type: 'raw_security', sentry_release: release, sentry_environment: environment },\n report,\n ];\n\n return createEnvelope<RawSecurityEnvelope>(envelopeHeaders, [eventItem]);\n}\n\nfunction dscHasRequiredProps(dsc: Partial<DynamicSamplingContext>): dsc is DynamicSamplingContext {\n return !!dsc.trace_id && !!dsc.public_key;\n}\n"],"names":["dsn","getSdkMetadataForEnvelopeHeader","dsnToString","createEnvelope","createEventEnvelopeHeaders","getDynamicSamplingContextFromSpan","shouldIgnoreSpan","spanToJSON","isV2BeforeSendSpanCallback","showSpanDropWarning","createSpanEnvelopeItem"],"mappings":"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"}
|
package/build/cjs/index.js
CHANGED
|
@@ -30,19 +30,25 @@ const offline = require('./transports/offline.js');
|
|
|
30
30
|
const multiplexed = require('./transports/multiplexed.js');
|
|
31
31
|
const integration = require('./integration.js');
|
|
32
32
|
const providerSkip = require('./utils/ai/providerSkip.js');
|
|
33
|
+
const envToBool = require('./utils/envToBool.js');
|
|
33
34
|
const scopeData = require('./utils/scopeData.js');
|
|
34
35
|
const prepareEvent = require('./utils/prepareEvent.js');
|
|
35
36
|
const checkin = require('./checkin.js');
|
|
36
37
|
const hasSpansEnabled = require('./utils/hasSpansEnabled.js');
|
|
38
|
+
const hasSpanStreamingEnabled = require('./utils/hasSpanStreamingEnabled.js');
|
|
37
39
|
const isSentryRequestUrl = require('./utils/isSentryRequestUrl.js');
|
|
38
40
|
const handleCallbackErrors = require('./utils/handleCallbackErrors.js');
|
|
39
41
|
const parameterize = require('./utils/parameterize.js');
|
|
40
42
|
const ipAddress = require('./utils/ipAddress.js');
|
|
41
43
|
const spanUtils = require('./utils/spanUtils.js');
|
|
44
|
+
const captureSpan = require('./spans/captureSpan.js');
|
|
45
|
+
const spanFirstUtils = require('./spans/spanFirstUtils.js');
|
|
46
|
+
const spanBuffer = require('./spans/spanBuffer.js');
|
|
42
47
|
const spanOnScope = require('./utils/spanOnScope.js');
|
|
43
48
|
const parseSampleRate = require('./utils/parseSampleRate.js');
|
|
44
49
|
const sdkMetadata = require('./utils/sdkMetadata.js');
|
|
45
50
|
const traceData = require('./utils/traceData.js');
|
|
51
|
+
const tracePropagationTargets = require('./utils/tracePropagationTargets.js');
|
|
46
52
|
const meta = require('./utils/meta.js');
|
|
47
53
|
const debounce = require('./utils/debounce.js');
|
|
48
54
|
const request = require('./utils/request.js');
|
|
@@ -64,6 +70,7 @@ const console$1 = require('./integrations/console.js');
|
|
|
64
70
|
const featureFlagsIntegration = require('./integrations/featureFlags/featureFlagsIntegration.js');
|
|
65
71
|
const growthbook = require('./integrations/featureFlags/growthbook.js');
|
|
66
72
|
const conversationId = require('./integrations/conversationId.js');
|
|
73
|
+
const spanStreaming = require('./integrations/spanStreaming.js');
|
|
67
74
|
const profiling = require('./profiling.js');
|
|
68
75
|
const fetch$1 = require('./fetch.js');
|
|
69
76
|
const trpc = require('./trpc.js');
|
|
@@ -133,6 +140,8 @@ const version = require('./utils/version.js');
|
|
|
133
140
|
const debugIds = require('./utils/debug-ids.js');
|
|
134
141
|
const metadata = require('./metadata.js');
|
|
135
142
|
const escapeStringForRegex = require('./vendor/escapeStringForRegex.js');
|
|
143
|
+
const beforeSendSpan = require('./utils/beforeSendSpan.js');
|
|
144
|
+
const shouldIgnoreSpan = require('./utils/should-ignore-span.js');
|
|
136
145
|
const randomSafeContext = require('./utils/randomSafeContext.js');
|
|
137
146
|
|
|
138
147
|
|
|
@@ -166,26 +175,55 @@ exports.sampleSpan = sampling.sampleSpan;
|
|
|
166
175
|
exports.logSpanEnd = logSpans.logSpanEnd;
|
|
167
176
|
exports.logSpanStart = logSpans.logSpanStart;
|
|
168
177
|
exports.GEN_AI_CONVERSATION_ID_ATTRIBUTE = semanticAttributes.GEN_AI_CONVERSATION_ID_ATTRIBUTE;
|
|
178
|
+
exports.SEMANTIC_ATTRIBUTE_BROWSER_CONNECTION_RTT = semanticAttributes.SEMANTIC_ATTRIBUTE_BROWSER_CONNECTION_RTT;
|
|
169
179
|
exports.SEMANTIC_ATTRIBUTE_CACHE_HIT = semanticAttributes.SEMANTIC_ATTRIBUTE_CACHE_HIT;
|
|
170
180
|
exports.SEMANTIC_ATTRIBUTE_CACHE_ITEM_SIZE = semanticAttributes.SEMANTIC_ATTRIBUTE_CACHE_ITEM_SIZE;
|
|
171
181
|
exports.SEMANTIC_ATTRIBUTE_CACHE_KEY = semanticAttributes.SEMANTIC_ATTRIBUTE_CACHE_KEY;
|
|
172
182
|
exports.SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME = semanticAttributes.SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME;
|
|
173
183
|
exports.SEMANTIC_ATTRIBUTE_HTTP_REQUEST_METHOD = semanticAttributes.SEMANTIC_ATTRIBUTE_HTTP_REQUEST_METHOD;
|
|
184
|
+
exports.SEMANTIC_ATTRIBUTE_HTTP_REQUEST_TIME_TO_FIRST_BYTE = semanticAttributes.SEMANTIC_ATTRIBUTE_HTTP_REQUEST_TIME_TO_FIRST_BYTE;
|
|
174
185
|
exports.SEMANTIC_ATTRIBUTE_PROFILE_ID = semanticAttributes.SEMANTIC_ATTRIBUTE_PROFILE_ID;
|
|
175
186
|
exports.SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME = semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME;
|
|
187
|
+
exports.SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT = semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT;
|
|
176
188
|
exports.SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON = semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON;
|
|
177
189
|
exports.SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT = semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT;
|
|
178
190
|
exports.SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE = semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE;
|
|
179
191
|
exports.SEMANTIC_ATTRIBUTE_SENTRY_OP = semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_OP;
|
|
180
192
|
exports.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN = semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN;
|
|
181
193
|
exports.SEMANTIC_ATTRIBUTE_SENTRY_PREVIOUS_TRACE_SAMPLE_RATE = semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_PREVIOUS_TRACE_SAMPLE_RATE;
|
|
194
|
+
exports.SEMANTIC_ATTRIBUTE_SENTRY_RELEASE = semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_RELEASE;
|
|
182
195
|
exports.SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE = semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE;
|
|
196
|
+
exports.SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME = semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME;
|
|
197
|
+
exports.SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION = semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION;
|
|
198
|
+
exports.SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID = semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID;
|
|
199
|
+
exports.SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME = semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME;
|
|
183
200
|
exports.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE = semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE;
|
|
201
|
+
exports.SEMANTIC_ATTRIBUTE_SENTRY_SPAN_SOURCE = semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_SPAN_SOURCE;
|
|
184
202
|
exports.SEMANTIC_ATTRIBUTE_URL_FULL = semanticAttributes.SEMANTIC_ATTRIBUTE_URL_FULL;
|
|
203
|
+
exports.SEMANTIC_ATTRIBUTE_URL_QUERY = semanticAttributes.SEMANTIC_ATTRIBUTE_URL_QUERY;
|
|
204
|
+
exports.SEMANTIC_ATTRIBUTE_USER_EMAIL = semanticAttributes.SEMANTIC_ATTRIBUTE_USER_EMAIL;
|
|
205
|
+
exports.SEMANTIC_ATTRIBUTE_USER_ID = semanticAttributes.SEMANTIC_ATTRIBUTE_USER_ID;
|
|
206
|
+
exports.SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS = semanticAttributes.SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS;
|
|
207
|
+
exports.SEMANTIC_ATTRIBUTE_USER_USERNAME = semanticAttributes.SEMANTIC_ATTRIBUTE_USER_USERNAME;
|
|
208
|
+
exports.SEMANTIC_ATTRIBUTE_WEB_VITAL_CLS_SOURCES = semanticAttributes.SEMANTIC_ATTRIBUTE_WEB_VITAL_CLS_SOURCES;
|
|
209
|
+
exports.SEMANTIC_ATTRIBUTE_WEB_VITAL_CLS_VALUE = semanticAttributes.SEMANTIC_ATTRIBUTE_WEB_VITAL_CLS_VALUE;
|
|
210
|
+
exports.SEMANTIC_ATTRIBUTE_WEB_VITAL_FCP_VALUE = semanticAttributes.SEMANTIC_ATTRIBUTE_WEB_VITAL_FCP_VALUE;
|
|
211
|
+
exports.SEMANTIC_ATTRIBUTE_WEB_VITAL_FP_VALUE = semanticAttributes.SEMANTIC_ATTRIBUTE_WEB_VITAL_FP_VALUE;
|
|
212
|
+
exports.SEMANTIC_ATTRIBUTE_WEB_VITAL_INP_VALUE = semanticAttributes.SEMANTIC_ATTRIBUTE_WEB_VITAL_INP_VALUE;
|
|
213
|
+
exports.SEMANTIC_ATTRIBUTE_WEB_VITAL_LCP_ELEMENT = semanticAttributes.SEMANTIC_ATTRIBUTE_WEB_VITAL_LCP_ELEMENT;
|
|
214
|
+
exports.SEMANTIC_ATTRIBUTE_WEB_VITAL_LCP_ID = semanticAttributes.SEMANTIC_ATTRIBUTE_WEB_VITAL_LCP_ID;
|
|
215
|
+
exports.SEMANTIC_ATTRIBUTE_WEB_VITAL_LCP_LOAD_TIME = semanticAttributes.SEMANTIC_ATTRIBUTE_WEB_VITAL_LCP_LOAD_TIME;
|
|
216
|
+
exports.SEMANTIC_ATTRIBUTE_WEB_VITAL_LCP_RENDER_TIME = semanticAttributes.SEMANTIC_ATTRIBUTE_WEB_VITAL_LCP_RENDER_TIME;
|
|
217
|
+
exports.SEMANTIC_ATTRIBUTE_WEB_VITAL_LCP_SIZE = semanticAttributes.SEMANTIC_ATTRIBUTE_WEB_VITAL_LCP_SIZE;
|
|
218
|
+
exports.SEMANTIC_ATTRIBUTE_WEB_VITAL_LCP_URL = semanticAttributes.SEMANTIC_ATTRIBUTE_WEB_VITAL_LCP_URL;
|
|
219
|
+
exports.SEMANTIC_ATTRIBUTE_WEB_VITAL_LCP_VALUE = semanticAttributes.SEMANTIC_ATTRIBUTE_WEB_VITAL_LCP_VALUE;
|
|
220
|
+
exports.SEMANTIC_ATTRIBUTE_WEB_VITAL_TTFB_REQUEST_TIME = semanticAttributes.SEMANTIC_ATTRIBUTE_WEB_VITAL_TTFB_REQUEST_TIME;
|
|
221
|
+
exports.SEMANTIC_ATTRIBUTE_WEB_VITAL_TTFB_VALUE = semanticAttributes.SEMANTIC_ATTRIBUTE_WEB_VITAL_TTFB_VALUE;
|
|
185
222
|
exports.SEMANTIC_LINK_ATTRIBUTE_LINK_TYPE = semanticAttributes.SEMANTIC_LINK_ATTRIBUTE_LINK_TYPE;
|
|
186
223
|
exports.createEventEnvelope = envelope$1.createEventEnvelope;
|
|
187
224
|
exports.createSessionEnvelope = envelope$1.createSessionEnvelope;
|
|
188
225
|
exports.createSpanEnvelope = envelope$1.createSpanEnvelope;
|
|
226
|
+
exports.createSpanV2Envelope = envelope$1.createSpanV2Envelope;
|
|
189
227
|
exports.addEventProcessor = _exports.addEventProcessor;
|
|
190
228
|
exports.captureCheckIn = _exports.captureCheckIn;
|
|
191
229
|
exports.captureEvent = _exports.captureEvent;
|
|
@@ -241,34 +279,43 @@ exports.installedIntegrations = integration.installedIntegrations;
|
|
|
241
279
|
exports._INTERNAL_clearAiProviderSkips = providerSkip._INTERNAL_clearAiProviderSkips;
|
|
242
280
|
exports._INTERNAL_shouldSkipAiProviderWrapping = providerSkip._INTERNAL_shouldSkipAiProviderWrapping;
|
|
243
281
|
exports._INTERNAL_skipAiProviderWrapping = providerSkip._INTERNAL_skipAiProviderWrapping;
|
|
282
|
+
exports.envToBool = envToBool.envToBool;
|
|
244
283
|
exports.applyScopeDataToEvent = scopeData.applyScopeDataToEvent;
|
|
245
284
|
exports.getCombinedScopeData = scopeData.getCombinedScopeData;
|
|
246
285
|
exports.mergeScopeData = scopeData.mergeScopeData;
|
|
247
286
|
exports.prepareEvent = prepareEvent.prepareEvent;
|
|
248
287
|
exports.createCheckInEnvelope = checkin.createCheckInEnvelope;
|
|
249
288
|
exports.hasSpansEnabled = hasSpansEnabled.hasSpansEnabled;
|
|
289
|
+
exports.hasSpanStreamingEnabled = hasSpanStreamingEnabled.hasSpanStreamingEnabled;
|
|
250
290
|
exports.isSentryRequestUrl = isSentryRequestUrl.isSentryRequestUrl;
|
|
251
291
|
exports.handleCallbackErrors = handleCallbackErrors.handleCallbackErrors;
|
|
252
292
|
exports.fmt = parameterize.fmt;
|
|
253
293
|
exports.parameterize = parameterize.parameterize;
|
|
254
294
|
exports.addAutoIpAddressToSession = ipAddress.addAutoIpAddressToSession;
|
|
255
295
|
exports.addAutoIpAddressToUser = ipAddress.addAutoIpAddressToUser;
|
|
296
|
+
exports.INTERNAL_getSegmentSpan = spanUtils.INTERNAL_getSegmentSpan;
|
|
256
297
|
exports.addChildSpanToSpan = spanUtils.addChildSpanToSpan;
|
|
257
298
|
exports.convertSpanLinksForEnvelope = spanUtils.convertSpanLinksForEnvelope;
|
|
258
299
|
exports.getActiveSpan = spanUtils.getActiveSpan;
|
|
259
300
|
exports.getRootSpan = spanUtils.getRootSpan;
|
|
260
301
|
exports.getSpanDescendants = spanUtils.getSpanDescendants;
|
|
261
302
|
exports.getStatusMessage = spanUtils.getStatusMessage;
|
|
303
|
+
exports.showSpanDropWarning = spanUtils.showSpanDropWarning;
|
|
262
304
|
exports.spanIsSampled = spanUtils.spanIsSampled;
|
|
263
305
|
exports.spanTimeInputToSeconds = spanUtils.spanTimeInputToSeconds;
|
|
264
306
|
exports.spanToJSON = spanUtils.spanToJSON;
|
|
265
307
|
exports.spanToTraceContext = spanUtils.spanToTraceContext;
|
|
266
308
|
exports.spanToTraceHeader = spanUtils.spanToTraceHeader;
|
|
309
|
+
exports.spanToV2JSON = spanUtils.spanToV2JSON;
|
|
267
310
|
exports.updateSpanName = spanUtils.updateSpanName;
|
|
311
|
+
exports.captureSpan = captureSpan.captureSpan;
|
|
312
|
+
exports.safeSetSpanJSONAttributes = spanFirstUtils.safeSetSpanJSONAttributes;
|
|
313
|
+
exports.SpanBuffer = spanBuffer.SpanBuffer;
|
|
268
314
|
exports._INTERNAL_setSpanForScope = spanOnScope._setSpanForScope;
|
|
269
315
|
exports.parseSampleRate = parseSampleRate.parseSampleRate;
|
|
270
316
|
exports.applySdkMetadata = sdkMetadata.applySdkMetadata;
|
|
271
317
|
exports.getTraceData = traceData.getTraceData;
|
|
318
|
+
exports.shouldPropagateTraceForUrl = tracePropagationTargets.shouldPropagateTraceForUrl;
|
|
272
319
|
exports.getTraceMetaTags = meta.getTraceMetaTags;
|
|
273
320
|
exports.debounce = debounce.debounce;
|
|
274
321
|
exports.extractQueryParamsFromUrl = request.extractQueryParamsFromUrl;
|
|
@@ -298,6 +345,7 @@ exports.consoleIntegration = console$1.consoleIntegration;
|
|
|
298
345
|
exports.featureFlagsIntegration = featureFlagsIntegration.featureFlagsIntegration;
|
|
299
346
|
exports.growthbookIntegration = growthbook.growthbookIntegration;
|
|
300
347
|
exports.conversationIdIntegration = conversationId.conversationIdIntegration;
|
|
348
|
+
exports.spanStreamingIntegration = spanStreaming.spanStreamingIntegration;
|
|
301
349
|
exports.profiler = profiling.profiler;
|
|
302
350
|
exports.instrumentFetchRequest = fetch$1.instrumentFetchRequest;
|
|
303
351
|
exports.trpcMiddleware = trpc.trpcMiddleware;
|
|
@@ -488,6 +536,10 @@ exports.getDebugImagesForResources = debugIds.getDebugImagesForResources;
|
|
|
488
536
|
exports.getFilenameToDebugIdMap = debugIds.getFilenameToDebugIdMap;
|
|
489
537
|
exports.getFilenameToMetadataMap = metadata.getFilenameToMetadataMap;
|
|
490
538
|
exports.escapeStringForRegex = escapeStringForRegex.escapeStringForRegex;
|
|
539
|
+
exports.isV2BeforeSendSpanCallback = beforeSendSpan.isV2BeforeSendSpanCallback;
|
|
540
|
+
exports.withStreamSpan = beforeSendSpan.withStreamSpan;
|
|
541
|
+
exports.reparentChildSpans = shouldIgnoreSpan.reparentChildSpans;
|
|
542
|
+
exports.shouldIgnoreSpan = shouldIgnoreSpan.shouldIgnoreSpan;
|
|
491
543
|
exports._INTERNAL_safeDateNow = randomSafeContext.safeDateNow;
|
|
492
544
|
exports._INTERNAL_safeMathRandom = randomSafeContext.safeMathRandom;
|
|
493
545
|
exports._INTERNAL_withRandomSafeContext = randomSafeContext.withRandomSafeContext;
|
package/build/cjs/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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/build/cjs/integration.js
CHANGED
|
@@ -79,6 +79,17 @@ function setupIntegrations(client, integrations) {
|
|
|
79
79
|
return integrationIndex;
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
+
/**
|
|
83
|
+
* Runs the `beforeSetup` hooks of the given integrations on the given client.
|
|
84
|
+
*/
|
|
85
|
+
function beforeSetupIntegrations(client, integrations) {
|
|
86
|
+
for (const integration of integrations) {
|
|
87
|
+
if (integration?.beforeSetup) {
|
|
88
|
+
integration.beforeSetup(client);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
82
93
|
/**
|
|
83
94
|
* Execute the `afterAllSetup` hooks of the given integrations.
|
|
84
95
|
*/
|
|
@@ -150,6 +161,7 @@ function defineIntegration(fn) {
|
|
|
150
161
|
|
|
151
162
|
exports.addIntegration = addIntegration;
|
|
152
163
|
exports.afterSetupIntegrations = afterSetupIntegrations;
|
|
164
|
+
exports.beforeSetupIntegrations = beforeSetupIntegrations;
|
|
153
165
|
exports.defineIntegration = defineIntegration;
|
|
154
166
|
exports.getIntegrationsToSetup = getIntegrationsToSetup;
|
|
155
167
|
exports.installedIntegrations = installedIntegrations;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integration.js","sources":["../../src/integration.ts"],"sourcesContent":["import type { Client } from './client';\nimport { getClient } from './currentScopes';\nimport { DEBUG_BUILD } from './debug-build';\nimport type { Event, EventHint } from './types-hoist/event';\nimport type { Integration, IntegrationFn } from './types-hoist/integration';\nimport type { CoreOptions } from './types-hoist/options';\nimport { debug } from './utils/debug-logger';\n\nexport const installedIntegrations: string[] = [];\n\n/** Map of integrations assigned to a client */\nexport type IntegrationIndex = {\n [key: string]: Integration;\n};\n\ntype IntegrationWithDefaultInstance = Integration & { isDefaultInstance?: true };\n\n/**\n * Remove duplicates from the given array, preferring the last instance of any duplicate. Not guaranteed to\n * preserve the order of integrations in the array.\n *\n * @private\n */\nfunction filterDuplicates(integrations: Integration[]): Integration[] {\n const integrationsByName: { [key: string]: Integration } = {};\n\n integrations.forEach((currentInstance: IntegrationWithDefaultInstance) => {\n const { name } = currentInstance;\n\n const existingInstance: IntegrationWithDefaultInstance | undefined = integrationsByName[name];\n\n // We want integrations later in the array to overwrite earlier ones of the same type, except that we never want a\n // default instance to overwrite an existing user instance\n if (existingInstance && !existingInstance.isDefaultInstance && currentInstance.isDefaultInstance) {\n return;\n }\n\n integrationsByName[name] = currentInstance;\n });\n\n return Object.values(integrationsByName);\n}\n\n/** Gets integrations to install */\nexport function getIntegrationsToSetup(\n options: Pick<CoreOptions, 'defaultIntegrations' | 'integrations'>,\n): Integration[] {\n const defaultIntegrations = options.defaultIntegrations || [];\n const userIntegrations = options.integrations;\n\n // We flag default instances, so that later we can tell them apart from any user-created instances of the same class\n defaultIntegrations.forEach((integration: IntegrationWithDefaultInstance) => {\n integration.isDefaultInstance = true;\n });\n\n let integrations: Integration[];\n\n if (Array.isArray(userIntegrations)) {\n integrations = [...defaultIntegrations, ...userIntegrations];\n } else if (typeof userIntegrations === 'function') {\n const resolvedUserIntegrations = userIntegrations(defaultIntegrations);\n integrations = Array.isArray(resolvedUserIntegrations) ? resolvedUserIntegrations : [resolvedUserIntegrations];\n } else {\n integrations = defaultIntegrations;\n }\n\n return filterDuplicates(integrations);\n}\n\n/**\n * Given a list of integration instances this installs them all. When `withDefaults` is set to `true` then all default\n * integrations are added unless they were already provided before.\n * @param integrations array of integration instances\n * @param withDefault should enable default integrations\n */\nexport function setupIntegrations(client: Client, integrations: Integration[]): IntegrationIndex {\n const integrationIndex: IntegrationIndex = {};\n\n integrations.forEach((integration: Integration | undefined) => {\n // guard against empty provided integrations\n if (integration) {\n setupIntegration(client, integration, integrationIndex);\n }\n });\n\n return integrationIndex;\n}\n\n/**\n * Execute the `afterAllSetup` hooks of the given integrations.\n */\nexport function afterSetupIntegrations(client: Client, integrations: Integration[]): void {\n for (const integration of integrations) {\n // guard against empty provided integrations\n if (integration?.afterAllSetup) {\n integration.afterAllSetup(client);\n }\n }\n}\n\n/** Setup a single integration. */\nexport function setupIntegration(client: Client, integration: Integration, integrationIndex: IntegrationIndex): void {\n if (integrationIndex[integration.name]) {\n DEBUG_BUILD && debug.log(`Integration skipped because it was already installed: ${integration.name}`);\n return;\n }\n integrationIndex[integration.name] = integration;\n\n // `setupOnce` is only called the first time\n if (!installedIntegrations.includes(integration.name) && typeof integration.setupOnce === 'function') {\n integration.setupOnce();\n installedIntegrations.push(integration.name);\n }\n\n // `setup` is run for each client\n if (integration.setup && typeof integration.setup === 'function') {\n integration.setup(client);\n }\n\n if (typeof integration.preprocessEvent === 'function') {\n const callback = integration.preprocessEvent.bind(integration) as typeof integration.preprocessEvent;\n client.on('preprocessEvent', (event, hint) => callback(event, hint, client));\n }\n\n if (typeof integration.processEvent === 'function') {\n const callback = integration.processEvent.bind(integration) as typeof integration.processEvent;\n\n const processor = Object.assign((event: Event, hint: EventHint) => callback(event, hint, client), {\n id: integration.name,\n });\n\n client.addEventProcessor(processor);\n }\n\n DEBUG_BUILD && debug.log(`Integration installed: ${integration.name}`);\n}\n\n/** Add an integration to the current scope's client. */\nexport function addIntegration(integration: Integration): void {\n const client = getClient();\n\n if (!client) {\n DEBUG_BUILD && debug.warn(`Cannot add integration \"${integration.name}\" because no SDK Client is available.`);\n return;\n }\n\n client.addIntegration(integration);\n}\n\n/**\n * Define an integration function that can be used to create an integration instance.\n * Note that this by design hides the implementation details of the integration, as they are considered internal.\n */\nexport function defineIntegration<Fn extends IntegrationFn>(fn: Fn): (...args: Parameters<Fn>) => Integration {\n return fn;\n}\n"],"names":["DEBUG_BUILD","debug","getClient"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"integration.js","sources":["../../src/integration.ts"],"sourcesContent":["import type { Client } from './client';\nimport { getClient } from './currentScopes';\nimport { DEBUG_BUILD } from './debug-build';\nimport type { Event, EventHint } from './types-hoist/event';\nimport type { Integration, IntegrationFn } from './types-hoist/integration';\nimport type { CoreOptions } from './types-hoist/options';\nimport { debug } from './utils/debug-logger';\n\nexport const installedIntegrations: string[] = [];\n\n/** Map of integrations assigned to a client */\nexport type IntegrationIndex = {\n [key: string]: Integration;\n};\n\ntype IntegrationWithDefaultInstance = Integration & { isDefaultInstance?: true };\n\n/**\n * Remove duplicates from the given array, preferring the last instance of any duplicate. Not guaranteed to\n * preserve the order of integrations in the array.\n *\n * @private\n */\nfunction filterDuplicates(integrations: Integration[]): Integration[] {\n const integrationsByName: { [key: string]: Integration } = {};\n\n integrations.forEach((currentInstance: IntegrationWithDefaultInstance) => {\n const { name } = currentInstance;\n\n const existingInstance: IntegrationWithDefaultInstance | undefined = integrationsByName[name];\n\n // We want integrations later in the array to overwrite earlier ones of the same type, except that we never want a\n // default instance to overwrite an existing user instance\n if (existingInstance && !existingInstance.isDefaultInstance && currentInstance.isDefaultInstance) {\n return;\n }\n\n integrationsByName[name] = currentInstance;\n });\n\n return Object.values(integrationsByName);\n}\n\n/** Gets integrations to install */\nexport function getIntegrationsToSetup(\n options: Pick<CoreOptions, 'defaultIntegrations' | 'integrations'>,\n): Integration[] {\n const defaultIntegrations = options.defaultIntegrations || [];\n const userIntegrations = options.integrations;\n\n // We flag default instances, so that later we can tell them apart from any user-created instances of the same class\n defaultIntegrations.forEach((integration: IntegrationWithDefaultInstance) => {\n integration.isDefaultInstance = true;\n });\n\n let integrations: Integration[];\n\n if (Array.isArray(userIntegrations)) {\n integrations = [...defaultIntegrations, ...userIntegrations];\n } else if (typeof userIntegrations === 'function') {\n const resolvedUserIntegrations = userIntegrations(defaultIntegrations);\n integrations = Array.isArray(resolvedUserIntegrations) ? resolvedUserIntegrations : [resolvedUserIntegrations];\n } else {\n integrations = defaultIntegrations;\n }\n\n return filterDuplicates(integrations);\n}\n\n/**\n * Given a list of integration instances this installs them all. When `withDefaults` is set to `true` then all default\n * integrations are added unless they were already provided before.\n * @param integrations array of integration instances\n * @param withDefault should enable default integrations\n */\nexport function setupIntegrations(client: Client, integrations: Integration[]): IntegrationIndex {\n const integrationIndex: IntegrationIndex = {};\n\n integrations.forEach((integration: Integration | undefined) => {\n // guard against empty provided integrations\n if (integration) {\n setupIntegration(client, integration, integrationIndex);\n }\n });\n\n return integrationIndex;\n}\n\n/**\n * Runs the `beforeSetup` hooks of the given integrations on the given client.\n */\nexport function beforeSetupIntegrations(client: Client, integrations: Integration[]): void {\n for (const integration of integrations) {\n if (integration?.beforeSetup) {\n integration.beforeSetup(client);\n }\n }\n}\n\n/**\n * Execute the `afterAllSetup` hooks of the given integrations.\n */\nexport function afterSetupIntegrations(client: Client, integrations: Integration[]): void {\n for (const integration of integrations) {\n // guard against empty provided integrations\n if (integration?.afterAllSetup) {\n integration.afterAllSetup(client);\n }\n }\n}\n\n/** Setup a single integration. */\nexport function setupIntegration(client: Client, integration: Integration, integrationIndex: IntegrationIndex): void {\n if (integrationIndex[integration.name]) {\n DEBUG_BUILD && debug.log(`Integration skipped because it was already installed: ${integration.name}`);\n return;\n }\n integrationIndex[integration.name] = integration;\n\n // `setupOnce` is only called the first time\n if (!installedIntegrations.includes(integration.name) && typeof integration.setupOnce === 'function') {\n integration.setupOnce();\n installedIntegrations.push(integration.name);\n }\n\n // `setup` is run for each client\n if (integration.setup && typeof integration.setup === 'function') {\n integration.setup(client);\n }\n\n if (typeof integration.preprocessEvent === 'function') {\n const callback = integration.preprocessEvent.bind(integration) as typeof integration.preprocessEvent;\n client.on('preprocessEvent', (event, hint) => callback(event, hint, client));\n }\n\n if (typeof integration.processEvent === 'function') {\n const callback = integration.processEvent.bind(integration) as typeof integration.processEvent;\n\n const processor = Object.assign((event: Event, hint: EventHint) => callback(event, hint, client), {\n id: integration.name,\n });\n\n client.addEventProcessor(processor);\n }\n\n DEBUG_BUILD && debug.log(`Integration installed: ${integration.name}`);\n}\n\n/** Add an integration to the current scope's client. */\nexport function addIntegration(integration: Integration): void {\n const client = getClient();\n\n if (!client) {\n DEBUG_BUILD && debug.warn(`Cannot add integration \"${integration.name}\" because no SDK Client is available.`);\n return;\n }\n\n client.addIntegration(integration);\n}\n\n/**\n * Define an integration function that can be used to create an integration instance.\n * Note that this by design hides the implementation details of the integration, as they are considered internal.\n */\nexport function defineIntegration<Fn extends IntegrationFn>(fn: Fn): (...args: Parameters<Fn>) => Integration {\n return fn;\n}\n"],"names":["DEBUG_BUILD","debug","getClient"],"mappings":"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"}
|
|
@@ -136,7 +136,7 @@ function _shouldDropEvent(event, options) {
|
|
|
136
136
|
}
|
|
137
137
|
} else if (event.type === 'transaction') {
|
|
138
138
|
// Filter transactions
|
|
139
|
-
|
|
139
|
+
// TODO (span-streaming): replace with ignoreSpans defaults (if we have any)
|
|
140
140
|
if (_isIgnoredTransaction(event, options.ignoreTransactions)) {
|
|
141
141
|
debugBuild.DEBUG_BUILD &&
|
|
142
142
|
debugLogger.debug.warn(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eventFilters.js","sources":["../../../src/integrations/eventFilters.ts"],"sourcesContent":["import { DEBUG_BUILD } from '../debug-build';\nimport { defineIntegration } from '../integration';\nimport type { Event } from '../types-hoist/event';\nimport type { IntegrationFn } from '../types-hoist/integration';\nimport type { StackFrame } from '../types-hoist/stackframe';\nimport { debug } from '../utils/debug-logger';\nimport { getPossibleEventMessages } from '../utils/eventUtils';\nimport { getEventDescription } from '../utils/misc';\nimport { stringMatchesSomePattern } from '../utils/string';\n\n// \"Script error.\" is hard coded into browsers for errors that it can't read.\n// this is the result of a script being pulled in from an external domain and CORS.\nconst DEFAULT_IGNORE_ERRORS = [\n /^Script error\\.?$/,\n /^Javascript error: Script error\\.? on line 0$/,\n /^ResizeObserver loop completed with undelivered notifications.$/, // The browser logs this when a ResizeObserver handler takes a bit longer. Usually this is not an actual issue though. It indicates slowness.\n /^Cannot redefine property: googletag$/, // This is thrown when google tag manager is used in combination with an ad blocker\n /^Can't find variable: gmo$/, // Error from Google Search App https://issuetracker.google.com/issues/396043331\n /^undefined is not an object \\(evaluating 'a\\.[A-Z]'\\)$/, // Random error that happens but not actionable or noticeable to end-users.\n 'can\\'t redefine non-configurable property \"solana\"', // Probably a browser extension or custom browser (Brave) throwing this error\n \"vv().getRestrictions is not a function. (In 'vv().getRestrictions(1,a)', 'vv().getRestrictions' is undefined)\", // Error thrown by GTM, seemingly not affecting end-users\n \"Can't find variable: _AutofillCallbackHandler\", // Unactionable error in instagram webview https://developers.facebook.com/community/threads/320013549791141/\n /^Non-Error promise rejection captured with value: Object Not Found Matching Id:\\d+, MethodName:simulateEvent, ParamCount:\\d+$/, // unactionable error from CEFSharp, a .NET library that embeds chromium in .NET apps\n /^Java exception was raised during method invocation$/, // error from Facebook Mobile browser (https://github.com/getsentry/sentry-javascript/issues/15065)\n];\n\n/** Options for the EventFilters integration */\nexport interface EventFiltersOptions {\n allowUrls: Array<string | RegExp>;\n denyUrls: Array<string | RegExp>;\n ignoreErrors: Array<string | RegExp>;\n ignoreTransactions: Array<string | RegExp>;\n ignoreInternal: boolean;\n disableErrorDefaults: boolean;\n}\n\nconst INTEGRATION_NAME = 'EventFilters';\n\n/**\n * An integration that filters out events (errors and transactions) based on:\n *\n * - (Errors) A curated list of known low-value or irrelevant errors (see {@link DEFAULT_IGNORE_ERRORS})\n * - (Errors) A list of error messages or urls/filenames passed in via\n * - Top level Sentry.init options (`ignoreErrors`, `denyUrls`, `allowUrls`)\n * - The same options passed to the integration directly via @param options\n * - (Transactions/Spans) A list of root span (transaction) names passed in via\n * - Top level Sentry.init option (`ignoreTransactions`)\n * - The same option passed to the integration directly via @param options\n *\n * Events filtered by this integration will not be sent to Sentry.\n */\nexport const eventFiltersIntegration = defineIntegration((options: Partial<EventFiltersOptions> = {}) => {\n let mergedOptions: Partial<EventFiltersOptions> | undefined;\n return {\n name: INTEGRATION_NAME,\n setup(client) {\n const clientOptions = client.getOptions();\n mergedOptions = _mergeOptions(options, clientOptions);\n },\n processEvent(event, _hint, client) {\n if (!mergedOptions) {\n const clientOptions = client.getOptions();\n mergedOptions = _mergeOptions(options, clientOptions);\n }\n return _shouldDropEvent(event, mergedOptions) ? null : event;\n },\n };\n});\n\n/**\n * An integration that filters out events (errors and transactions) based on:\n *\n * - (Errors) A curated list of known low-value or irrelevant errors (see {@link DEFAULT_IGNORE_ERRORS})\n * - (Errors) A list of error messages or urls/filenames passed in via\n * - Top level Sentry.init options (`ignoreErrors`, `denyUrls`, `allowUrls`)\n * - The same options passed to the integration directly via @param options\n * - (Transactions/Spans) A list of root span (transaction) names passed in via\n * - Top level Sentry.init option (`ignoreTransactions`)\n * - The same option passed to the integration directly via @param options\n *\n * Events filtered by this integration will not be sent to Sentry.\n *\n * @deprecated this integration was renamed and will be removed in a future major version.\n * Use `eventFiltersIntegration` instead.\n */\nexport const inboundFiltersIntegration = defineIntegration(((options: Partial<EventFiltersOptions> = {}) => {\n return {\n ...eventFiltersIntegration(options),\n name: 'InboundFilters',\n };\n}) satisfies IntegrationFn);\n\nfunction _mergeOptions(\n internalOptions: Partial<EventFiltersOptions> = {},\n clientOptions: Partial<EventFiltersOptions> = {},\n): Partial<EventFiltersOptions> {\n return {\n allowUrls: [...(internalOptions.allowUrls || []), ...(clientOptions.allowUrls || [])],\n denyUrls: [...(internalOptions.denyUrls || []), ...(clientOptions.denyUrls || [])],\n ignoreErrors: [\n ...(internalOptions.ignoreErrors || []),\n ...(clientOptions.ignoreErrors || []),\n ...(internalOptions.disableErrorDefaults ? [] : DEFAULT_IGNORE_ERRORS),\n ],\n ignoreTransactions: [...(internalOptions.ignoreTransactions || []), ...(clientOptions.ignoreTransactions || [])],\n };\n}\n\nfunction _shouldDropEvent(event: Event, options: Partial<EventFiltersOptions>): boolean {\n if (!event.type) {\n // Filter errors\n if (_isIgnoredError(event, options.ignoreErrors)) {\n DEBUG_BUILD &&\n debug.warn(\n `Event dropped due to being matched by \\`ignoreErrors\\` option.\\nEvent: ${getEventDescription(event)}`,\n );\n return true;\n }\n if (_isUselessError(event)) {\n DEBUG_BUILD &&\n debug.warn(\n `Event dropped due to not having an error message, error type or stacktrace.\\nEvent: ${getEventDescription(\n event,\n )}`,\n );\n return true;\n }\n if (_isDeniedUrl(event, options.denyUrls)) {\n DEBUG_BUILD &&\n debug.warn(\n `Event dropped due to being matched by \\`denyUrls\\` option.\\nEvent: ${getEventDescription(\n event,\n )}.\\nUrl: ${_getEventFilterUrl(event)}`,\n );\n return true;\n }\n if (!_isAllowedUrl(event, options.allowUrls)) {\n DEBUG_BUILD &&\n debug.warn(\n `Event dropped due to not being matched by \\`allowUrls\\` option.\\nEvent: ${getEventDescription(\n event,\n )}.\\nUrl: ${_getEventFilterUrl(event)}`,\n );\n return true;\n }\n } else if (event.type === 'transaction') {\n // Filter transactions\n\n if (_isIgnoredTransaction(event, options.ignoreTransactions)) {\n DEBUG_BUILD &&\n debug.warn(\n `Event dropped due to being matched by \\`ignoreTransactions\\` option.\\nEvent: ${getEventDescription(event)}`,\n );\n return true;\n }\n }\n return false;\n}\n\nfunction _isIgnoredError(event: Event, ignoreErrors?: Array<string | RegExp>): boolean {\n if (!ignoreErrors?.length) {\n return false;\n }\n\n return getPossibleEventMessages(event).some(message => stringMatchesSomePattern(message, ignoreErrors));\n}\n\nfunction _isIgnoredTransaction(event: Event, ignoreTransactions?: Array<string | RegExp>): boolean {\n if (!ignoreTransactions?.length) {\n return false;\n }\n\n const name = event.transaction;\n return name ? stringMatchesSomePattern(name, ignoreTransactions) : false;\n}\n\nfunction _isDeniedUrl(event: Event, denyUrls?: Array<string | RegExp>): boolean {\n if (!denyUrls?.length) {\n return false;\n }\n const url = _getEventFilterUrl(event);\n return !url ? false : stringMatchesSomePattern(url, denyUrls);\n}\n\nfunction _isAllowedUrl(event: Event, allowUrls?: Array<string | RegExp>): boolean {\n if (!allowUrls?.length) {\n return true;\n }\n const url = _getEventFilterUrl(event);\n return !url ? true : stringMatchesSomePattern(url, allowUrls);\n}\n\nfunction _getLastValidUrl(frames: StackFrame[] = []): string | null {\n for (let i = frames.length - 1; i >= 0; i--) {\n const frame = frames[i];\n\n if (frame && frame.filename !== '<anonymous>' && frame.filename !== '[native code]') {\n return frame.filename || null;\n }\n }\n\n return null;\n}\n\nfunction _getEventFilterUrl(event: Event): string | null {\n try {\n // If there are linked exceptions or exception aggregates we only want to match against the top frame of the \"root\" (the main exception)\n // The root always comes last in linked exceptions\n const rootException = [...(event.exception?.values ?? [])]\n .reverse()\n .find(value => value.mechanism?.parent_id === undefined && value.stacktrace?.frames?.length);\n const frames = rootException?.stacktrace?.frames;\n return frames ? _getLastValidUrl(frames) : null;\n } catch {\n DEBUG_BUILD && debug.error(`Cannot extract url for event ${getEventDescription(event)}`);\n return null;\n }\n}\n\nfunction _isUselessError(event: Event): boolean {\n // We only want to consider events for dropping that actually have recorded exception values.\n if (!event.exception?.values?.length) {\n return false;\n }\n\n return (\n // No top-level message\n !event.message &&\n // There are no exception values that have a stacktrace, a non-generic-Error type or value\n !event.exception.values.some(value => value.stacktrace || (value.type && value.type !== 'Error') || value.value)\n );\n}\n"],"names":["defineIntegration","DEBUG_BUILD","debug","getEventDescription","getPossibleEventMessages","stringMatchesSomePattern"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"eventFilters.js","sources":["../../../src/integrations/eventFilters.ts"],"sourcesContent":["import { DEBUG_BUILD } from '../debug-build';\nimport { defineIntegration } from '../integration';\nimport type { Event } from '../types-hoist/event';\nimport type { IntegrationFn } from '../types-hoist/integration';\nimport type { StackFrame } from '../types-hoist/stackframe';\nimport { debug } from '../utils/debug-logger';\nimport { getPossibleEventMessages } from '../utils/eventUtils';\nimport { getEventDescription } from '../utils/misc';\nimport { stringMatchesSomePattern } from '../utils/string';\n\n// \"Script error.\" is hard coded into browsers for errors that it can't read.\n// this is the result of a script being pulled in from an external domain and CORS.\nconst DEFAULT_IGNORE_ERRORS = [\n /^Script error\\.?$/,\n /^Javascript error: Script error\\.? on line 0$/,\n /^ResizeObserver loop completed with undelivered notifications.$/, // The browser logs this when a ResizeObserver handler takes a bit longer. Usually this is not an actual issue though. It indicates slowness.\n /^Cannot redefine property: googletag$/, // This is thrown when google tag manager is used in combination with an ad blocker\n /^Can't find variable: gmo$/, // Error from Google Search App https://issuetracker.google.com/issues/396043331\n /^undefined is not an object \\(evaluating 'a\\.[A-Z]'\\)$/, // Random error that happens but not actionable or noticeable to end-users.\n 'can\\'t redefine non-configurable property \"solana\"', // Probably a browser extension or custom browser (Brave) throwing this error\n \"vv().getRestrictions is not a function. (In 'vv().getRestrictions(1,a)', 'vv().getRestrictions' is undefined)\", // Error thrown by GTM, seemingly not affecting end-users\n \"Can't find variable: _AutofillCallbackHandler\", // Unactionable error in instagram webview https://developers.facebook.com/community/threads/320013549791141/\n /^Non-Error promise rejection captured with value: Object Not Found Matching Id:\\d+, MethodName:simulateEvent, ParamCount:\\d+$/, // unactionable error from CEFSharp, a .NET library that embeds chromium in .NET apps\n /^Java exception was raised during method invocation$/, // error from Facebook Mobile browser (https://github.com/getsentry/sentry-javascript/issues/15065)\n];\n\n/** Options for the EventFilters integration */\nexport interface EventFiltersOptions {\n allowUrls: Array<string | RegExp>;\n denyUrls: Array<string | RegExp>;\n ignoreErrors: Array<string | RegExp>;\n ignoreTransactions: Array<string | RegExp>;\n ignoreInternal: boolean;\n disableErrorDefaults: boolean;\n}\n\nconst INTEGRATION_NAME = 'EventFilters';\n\n/**\n * An integration that filters out events (errors and transactions) based on:\n *\n * - (Errors) A curated list of known low-value or irrelevant errors (see {@link DEFAULT_IGNORE_ERRORS})\n * - (Errors) A list of error messages or urls/filenames passed in via\n * - Top level Sentry.init options (`ignoreErrors`, `denyUrls`, `allowUrls`)\n * - The same options passed to the integration directly via @param options\n * - (Transactions/Spans) A list of root span (transaction) names passed in via\n * - Top level Sentry.init option (`ignoreTransactions`)\n * - The same option passed to the integration directly via @param options\n *\n * Events filtered by this integration will not be sent to Sentry.\n */\nexport const eventFiltersIntegration = defineIntegration((options: Partial<EventFiltersOptions> = {}) => {\n let mergedOptions: Partial<EventFiltersOptions> | undefined;\n return {\n name: INTEGRATION_NAME,\n setup(client) {\n const clientOptions = client.getOptions();\n mergedOptions = _mergeOptions(options, clientOptions);\n },\n processEvent(event, _hint, client) {\n if (!mergedOptions) {\n const clientOptions = client.getOptions();\n mergedOptions = _mergeOptions(options, clientOptions);\n }\n return _shouldDropEvent(event, mergedOptions) ? null : event;\n },\n };\n});\n\n/**\n * An integration that filters out events (errors and transactions) based on:\n *\n * - (Errors) A curated list of known low-value or irrelevant errors (see {@link DEFAULT_IGNORE_ERRORS})\n * - (Errors) A list of error messages or urls/filenames passed in via\n * - Top level Sentry.init options (`ignoreErrors`, `denyUrls`, `allowUrls`)\n * - The same options passed to the integration directly via @param options\n * - (Transactions/Spans) A list of root span (transaction) names passed in via\n * - Top level Sentry.init option (`ignoreTransactions`)\n * - The same option passed to the integration directly via @param options\n *\n * Events filtered by this integration will not be sent to Sentry.\n *\n * @deprecated this integration was renamed and will be removed in a future major version.\n * Use `eventFiltersIntegration` instead.\n */\nexport const inboundFiltersIntegration = defineIntegration(((options: Partial<EventFiltersOptions> = {}) => {\n return {\n ...eventFiltersIntegration(options),\n name: 'InboundFilters',\n };\n}) satisfies IntegrationFn);\n\nfunction _mergeOptions(\n internalOptions: Partial<EventFiltersOptions> = {},\n clientOptions: Partial<EventFiltersOptions> = {},\n): Partial<EventFiltersOptions> {\n return {\n allowUrls: [...(internalOptions.allowUrls || []), ...(clientOptions.allowUrls || [])],\n denyUrls: [...(internalOptions.denyUrls || []), ...(clientOptions.denyUrls || [])],\n ignoreErrors: [\n ...(internalOptions.ignoreErrors || []),\n ...(clientOptions.ignoreErrors || []),\n ...(internalOptions.disableErrorDefaults ? [] : DEFAULT_IGNORE_ERRORS),\n ],\n ignoreTransactions: [...(internalOptions.ignoreTransactions || []), ...(clientOptions.ignoreTransactions || [])],\n };\n}\n\nfunction _shouldDropEvent(event: Event, options: Partial<EventFiltersOptions>): boolean {\n if (!event.type) {\n // Filter errors\n if (_isIgnoredError(event, options.ignoreErrors)) {\n DEBUG_BUILD &&\n debug.warn(\n `Event dropped due to being matched by \\`ignoreErrors\\` option.\\nEvent: ${getEventDescription(event)}`,\n );\n return true;\n }\n if (_isUselessError(event)) {\n DEBUG_BUILD &&\n debug.warn(\n `Event dropped due to not having an error message, error type or stacktrace.\\nEvent: ${getEventDescription(\n event,\n )}`,\n );\n return true;\n }\n if (_isDeniedUrl(event, options.denyUrls)) {\n DEBUG_BUILD &&\n debug.warn(\n `Event dropped due to being matched by \\`denyUrls\\` option.\\nEvent: ${getEventDescription(\n event,\n )}.\\nUrl: ${_getEventFilterUrl(event)}`,\n );\n return true;\n }\n if (!_isAllowedUrl(event, options.allowUrls)) {\n DEBUG_BUILD &&\n debug.warn(\n `Event dropped due to not being matched by \\`allowUrls\\` option.\\nEvent: ${getEventDescription(\n event,\n )}.\\nUrl: ${_getEventFilterUrl(event)}`,\n );\n return true;\n }\n } else if (event.type === 'transaction') {\n // Filter transactions\n // TODO (span-streaming): replace with ignoreSpans defaults (if we have any)\n if (_isIgnoredTransaction(event, options.ignoreTransactions)) {\n DEBUG_BUILD &&\n debug.warn(\n `Event dropped due to being matched by \\`ignoreTransactions\\` option.\\nEvent: ${getEventDescription(event)}`,\n );\n return true;\n }\n }\n return false;\n}\n\nfunction _isIgnoredError(event: Event, ignoreErrors?: Array<string | RegExp>): boolean {\n if (!ignoreErrors?.length) {\n return false;\n }\n\n return getPossibleEventMessages(event).some(message => stringMatchesSomePattern(message, ignoreErrors));\n}\n\nfunction _isIgnoredTransaction(event: Event, ignoreTransactions?: Array<string | RegExp>): boolean {\n if (!ignoreTransactions?.length) {\n return false;\n }\n\n const name = event.transaction;\n return name ? stringMatchesSomePattern(name, ignoreTransactions) : false;\n}\n\nfunction _isDeniedUrl(event: Event, denyUrls?: Array<string | RegExp>): boolean {\n if (!denyUrls?.length) {\n return false;\n }\n const url = _getEventFilterUrl(event);\n return !url ? false : stringMatchesSomePattern(url, denyUrls);\n}\n\nfunction _isAllowedUrl(event: Event, allowUrls?: Array<string | RegExp>): boolean {\n if (!allowUrls?.length) {\n return true;\n }\n const url = _getEventFilterUrl(event);\n return !url ? true : stringMatchesSomePattern(url, allowUrls);\n}\n\nfunction _getLastValidUrl(frames: StackFrame[] = []): string | null {\n for (let i = frames.length - 1; i >= 0; i--) {\n const frame = frames[i];\n\n if (frame && frame.filename !== '<anonymous>' && frame.filename !== '[native code]') {\n return frame.filename || null;\n }\n }\n\n return null;\n}\n\nfunction _getEventFilterUrl(event: Event): string | null {\n try {\n // If there are linked exceptions or exception aggregates we only want to match against the top frame of the \"root\" (the main exception)\n // The root always comes last in linked exceptions\n const rootException = [...(event.exception?.values ?? [])]\n .reverse()\n .find(value => value.mechanism?.parent_id === undefined && value.stacktrace?.frames?.length);\n const frames = rootException?.stacktrace?.frames;\n return frames ? _getLastValidUrl(frames) : null;\n } catch {\n DEBUG_BUILD && debug.error(`Cannot extract url for event ${getEventDescription(event)}`);\n return null;\n }\n}\n\nfunction _isUselessError(event: Event): boolean {\n // We only want to consider events for dropping that actually have recorded exception values.\n if (!event.exception?.values?.length) {\n return false;\n }\n\n return (\n // No top-level message\n !event.message &&\n // There are no exception values that have a stacktrace, a non-generic-Error type or value\n !event.exception.values.some(value => value.stacktrace || (value.type && value.type !== 'Error') || value.value)\n );\n}\n"],"names":["defineIntegration","DEBUG_BUILD","debug","getEventDescription","getPossibleEventMessages","stringMatchesSomePattern"],"mappings":"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"}
|
|
@@ -9,28 +9,52 @@ const sessionExtraction = require('./sessionExtraction.js');
|
|
|
9
9
|
* Request-span correlation system for MCP server instrumentation
|
|
10
10
|
*
|
|
11
11
|
* Handles mapping requestId to span data for correlation with handler execution.
|
|
12
|
-
*
|
|
13
|
-
*
|
|
12
|
+
*
|
|
13
|
+
* Uses sessionId as the primary key for stateful transports. This handles the wrapper
|
|
14
|
+
* transport pattern (e.g., NodeStreamableHTTPServerTransport wrapping WebStandardStreamableHTTPServerTransport)
|
|
15
|
+
* where onmessage and send may receive different `this` values but share the same sessionId.
|
|
16
|
+
*
|
|
17
|
+
* Falls back to WeakMap by transport instance for stateless transports (no sessionId).
|
|
14
18
|
*/
|
|
15
19
|
|
|
16
20
|
|
|
17
21
|
/**
|
|
18
|
-
*
|
|
19
|
-
* @internal
|
|
22
|
+
* Session-scoped correlation for stateful transports (with sessionId)
|
|
23
|
+
* @internal Using sessionId as key handles wrapper transport patterns where
|
|
24
|
+
* different transport objects share the same logical session
|
|
20
25
|
*/
|
|
21
|
-
const
|
|
26
|
+
const sessionToSpanMap = new Map();
|
|
22
27
|
|
|
23
28
|
/**
|
|
24
|
-
*
|
|
29
|
+
* Transport-scoped correlation fallback for stateless transports (no sessionId)
|
|
30
|
+
* @internal WeakMap allows automatic cleanup when transport is garbage collected
|
|
31
|
+
*/
|
|
32
|
+
const statelessSpanMap = new WeakMap();
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Gets or creates the span map for a transport, using sessionId when available
|
|
25
36
|
* @internal
|
|
26
37
|
* @param transport - MCP transport instance
|
|
27
|
-
* @returns Span map for the transport
|
|
38
|
+
* @returns Span map for the transport/session
|
|
28
39
|
*/
|
|
29
40
|
function getOrCreateSpanMap(transport) {
|
|
30
|
-
|
|
41
|
+
const sessionId = transport.sessionId;
|
|
42
|
+
|
|
43
|
+
if (sessionId) {
|
|
44
|
+
// Stateful transport - use sessionId as key (handles wrapper pattern)
|
|
45
|
+
let spanMap = sessionToSpanMap.get(sessionId);
|
|
46
|
+
if (!spanMap) {
|
|
47
|
+
spanMap = new Map();
|
|
48
|
+
sessionToSpanMap.set(sessionId, spanMap);
|
|
49
|
+
}
|
|
50
|
+
return spanMap;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Stateless fallback - use transport instance as key
|
|
54
|
+
let spanMap = statelessSpanMap.get(transport);
|
|
31
55
|
if (!spanMap) {
|
|
32
56
|
spanMap = new Map();
|
|
33
|
-
|
|
57
|
+
statelessSpanMap.set(transport, spanMap);
|
|
34
58
|
}
|
|
35
59
|
return spanMap;
|
|
36
60
|
}
|
|
@@ -100,7 +124,26 @@ function completeSpanWithResults(
|
|
|
100
124
|
* @param transport - MCP transport instance
|
|
101
125
|
*/
|
|
102
126
|
function cleanupPendingSpansForTransport(transport) {
|
|
103
|
-
const
|
|
127
|
+
const sessionId = transport.sessionId;
|
|
128
|
+
|
|
129
|
+
// Try sessionId-based cleanup first (for stateful transports)
|
|
130
|
+
if (sessionId) {
|
|
131
|
+
const spanMap = sessionToSpanMap.get(sessionId);
|
|
132
|
+
if (spanMap) {
|
|
133
|
+
for (const [, spanData] of spanMap) {
|
|
134
|
+
spanData.span.setStatus({
|
|
135
|
+
code: spanstatus.SPAN_STATUS_ERROR,
|
|
136
|
+
message: 'cancelled',
|
|
137
|
+
});
|
|
138
|
+
spanData.span.end();
|
|
139
|
+
}
|
|
140
|
+
sessionToSpanMap.delete(sessionId);
|
|
141
|
+
}
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Fallback to transport-based cleanup (for stateless transports)
|
|
146
|
+
const spanMap = statelessSpanMap.get(transport);
|
|
104
147
|
if (spanMap) {
|
|
105
148
|
for (const [, spanData] of spanMap) {
|
|
106
149
|
spanData.span.setStatus({
|
|
@@ -110,6 +153,7 @@ function cleanupPendingSpansForTransport(transport) {
|
|
|
110
153
|
spanData.span.end();
|
|
111
154
|
}
|
|
112
155
|
spanMap.clear();
|
|
156
|
+
// Note: WeakMap entries are automatically cleaned up when transport is GC'd
|
|
113
157
|
}
|
|
114
158
|
}
|
|
115
159
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"correlation.js","sources":["../../../../src/integrations/mcp-server/correlation.ts"],"sourcesContent":["/**\n * Request-span correlation system for MCP server instrumentation\n *\n * Handles mapping requestId to span data for correlation with handler execution.\n * Uses
|
|
1
|
+
{"version":3,"file":"correlation.js","sources":["../../../../src/integrations/mcp-server/correlation.ts"],"sourcesContent":["/**\n * Request-span correlation system for MCP server instrumentation\n *\n * Handles mapping requestId to span data for correlation with handler execution.\n *\n * Uses sessionId as the primary key for stateful transports. This handles the wrapper\n * transport pattern (e.g., NodeStreamableHTTPServerTransport wrapping WebStandardStreamableHTTPServerTransport)\n * where onmessage and send may receive different `this` values but share the same sessionId.\n *\n * Falls back to WeakMap by transport instance for stateless transports (no sessionId).\n */\n\nimport { SPAN_STATUS_ERROR } from '../../tracing';\nimport type { Span } from '../../types-hoist/span';\nimport { MCP_PROTOCOL_VERSION_ATTRIBUTE } from './attributes';\nimport { extractPromptResultAttributes, extractToolResultAttributes } from './resultExtraction';\nimport { buildServerAttributesFromInfo, extractSessionDataFromInitializeResponse } from './sessionExtraction';\nimport type { MCPTransport, RequestId, RequestSpanMapValue, ResolvedMcpOptions } from './types';\n\n/**\n * Session-scoped correlation for stateful transports (with sessionId)\n * @internal Using sessionId as key handles wrapper transport patterns where\n * different transport objects share the same logical session\n */\nconst sessionToSpanMap = new Map<string, Map<RequestId, RequestSpanMapValue>>();\n\n/**\n * Transport-scoped correlation fallback for stateless transports (no sessionId)\n * @internal WeakMap allows automatic cleanup when transport is garbage collected\n */\nconst statelessSpanMap = new WeakMap<MCPTransport, Map<RequestId, RequestSpanMapValue>>();\n\n/**\n * Gets or creates the span map for a transport, using sessionId when available\n * @internal\n * @param transport - MCP transport instance\n * @returns Span map for the transport/session\n */\nfunction getOrCreateSpanMap(transport: MCPTransport): Map<RequestId, RequestSpanMapValue> {\n const sessionId = transport.sessionId;\n\n if (sessionId) {\n // Stateful transport - use sessionId as key (handles wrapper pattern)\n let spanMap = sessionToSpanMap.get(sessionId);\n if (!spanMap) {\n spanMap = new Map();\n sessionToSpanMap.set(sessionId, spanMap);\n }\n return spanMap;\n }\n\n // Stateless fallback - use transport instance as key\n let spanMap = statelessSpanMap.get(transport);\n if (!spanMap) {\n spanMap = new Map();\n statelessSpanMap.set(transport, spanMap);\n }\n return spanMap;\n}\n\n/**\n * Stores span context for later correlation with handler execution\n * @param transport - MCP transport instance\n * @param requestId - Request identifier\n * @param span - Active span to correlate\n * @param method - MCP method name\n */\nexport function storeSpanForRequest(transport: MCPTransport, requestId: RequestId, span: Span, method: string): void {\n const spanMap = getOrCreateSpanMap(transport);\n spanMap.set(requestId, {\n span,\n method,\n // eslint-disable-next-line @sentry-internal/sdk/no-unsafe-random-apis\n startTime: Date.now(),\n });\n}\n\n/**\n * Completes span with results and cleans up correlation\n * @param transport - MCP transport instance\n * @param requestId - Request identifier\n * @param result - Execution result for attribute extraction\n * @param options - Resolved MCP options\n */\nexport function completeSpanWithResults(\n transport: MCPTransport,\n requestId: RequestId,\n result: unknown,\n options: ResolvedMcpOptions,\n): void {\n const spanMap = getOrCreateSpanMap(transport);\n const spanData = spanMap.get(requestId);\n if (spanData) {\n const { span, method } = spanData;\n\n if (method === 'initialize') {\n const sessionData = extractSessionDataFromInitializeResponse(result);\n const serverAttributes = buildServerAttributesFromInfo(sessionData.serverInfo);\n\n const initAttributes: Record<string, string | number> = {\n ...serverAttributes,\n };\n if (sessionData.protocolVersion) {\n initAttributes[MCP_PROTOCOL_VERSION_ATTRIBUTE] = sessionData.protocolVersion;\n }\n\n span.setAttributes(initAttributes);\n } else if (method === 'tools/call') {\n const toolAttributes = extractToolResultAttributes(result, options.recordOutputs);\n span.setAttributes(toolAttributes);\n } else if (method === 'prompts/get') {\n const promptAttributes = extractPromptResultAttributes(result, options.recordOutputs);\n span.setAttributes(promptAttributes);\n }\n\n span.end();\n spanMap.delete(requestId);\n }\n}\n\n/**\n * Cleans up pending spans for a specific transport (when that transport closes)\n * @param transport - MCP transport instance\n */\nexport function cleanupPendingSpansForTransport(transport: MCPTransport): void {\n const sessionId = transport.sessionId;\n\n // Try sessionId-based cleanup first (for stateful transports)\n if (sessionId) {\n const spanMap = sessionToSpanMap.get(sessionId);\n if (spanMap) {\n for (const [, spanData] of spanMap) {\n spanData.span.setStatus({\n code: SPAN_STATUS_ERROR,\n message: 'cancelled',\n });\n spanData.span.end();\n }\n sessionToSpanMap.delete(sessionId);\n }\n return;\n }\n\n // Fallback to transport-based cleanup (for stateless transports)\n const spanMap = statelessSpanMap.get(transport);\n if (spanMap) {\n for (const [, spanData] of spanMap) {\n spanData.span.setStatus({\n code: SPAN_STATUS_ERROR,\n message: 'cancelled',\n });\n spanData.span.end();\n }\n spanMap.clear();\n // Note: WeakMap entries are automatically cleaned up when transport is GC'd\n }\n}\n"],"names":["extractSessionDataFromInitializeResponse","buildServerAttributesFromInfo","MCP_PROTOCOL_VERSION_ATTRIBUTE","extractToolResultAttributes","extractPromptResultAttributes","SPAN_STATUS_ERROR"],"mappings":"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"}
|