@sentry/browser 10.28.0-alpha.0 → 10.29.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.
Files changed (70) hide show
  1. package/build/npm/cjs/dev/index.js +3 -3
  2. package/build/npm/cjs/dev/integrations/httpcontext.js +0 -2
  3. package/build/npm/cjs/dev/integrations/httpcontext.js.map +1 -1
  4. package/build/npm/cjs/dev/profiling/UIProfiler.js.map +1 -1
  5. package/build/npm/cjs/dev/tracing/linkedTraces.js.map +1 -1
  6. package/build/npm/cjs/dev/tracing/request.js +0 -1
  7. package/build/npm/cjs/dev/tracing/request.js.map +1 -1
  8. package/build/npm/cjs/dev/utils/lazyLoadIntegration.js +2 -0
  9. package/build/npm/cjs/dev/utils/lazyLoadIntegration.js.map +1 -1
  10. package/build/npm/cjs/prod/index.js +3 -3
  11. package/build/npm/cjs/prod/integrations/httpcontext.js +0 -2
  12. package/build/npm/cjs/prod/integrations/httpcontext.js.map +1 -1
  13. package/build/npm/cjs/prod/profiling/UIProfiler.js.map +1 -1
  14. package/build/npm/cjs/prod/tracing/linkedTraces.js.map +1 -1
  15. package/build/npm/cjs/prod/tracing/request.js +0 -1
  16. package/build/npm/cjs/prod/tracing/request.js.map +1 -1
  17. package/build/npm/cjs/prod/utils/lazyLoadIntegration.js +2 -0
  18. package/build/npm/cjs/prod/utils/lazyLoadIntegration.js.map +1 -1
  19. package/build/npm/esm/dev/index.js +1 -2
  20. package/build/npm/esm/dev/index.js.map +1 -1
  21. package/build/npm/esm/dev/integrations/httpcontext.js +0 -2
  22. package/build/npm/esm/dev/integrations/httpcontext.js.map +1 -1
  23. package/build/npm/esm/dev/package.json +1 -1
  24. package/build/npm/esm/dev/profiling/UIProfiler.js.map +1 -1
  25. package/build/npm/esm/dev/tracing/linkedTraces.js.map +1 -1
  26. package/build/npm/esm/dev/tracing/request.js +0 -1
  27. package/build/npm/esm/dev/tracing/request.js.map +1 -1
  28. package/build/npm/esm/dev/utils/lazyLoadIntegration.js +2 -0
  29. package/build/npm/esm/dev/utils/lazyLoadIntegration.js.map +1 -1
  30. package/build/npm/esm/prod/index.js +1 -2
  31. package/build/npm/esm/prod/index.js.map +1 -1
  32. package/build/npm/esm/prod/integrations/httpcontext.js +0 -2
  33. package/build/npm/esm/prod/integrations/httpcontext.js.map +1 -1
  34. package/build/npm/esm/prod/package.json +1 -1
  35. package/build/npm/esm/prod/profiling/UIProfiler.js.map +1 -1
  36. package/build/npm/esm/prod/tracing/linkedTraces.js.map +1 -1
  37. package/build/npm/esm/prod/tracing/request.js +0 -1
  38. package/build/npm/esm/prod/tracing/request.js.map +1 -1
  39. package/build/npm/esm/prod/utils/lazyLoadIntegration.js +2 -0
  40. package/build/npm/esm/prod/utils/lazyLoadIntegration.js.map +1 -1
  41. package/build/npm/types/index.d.ts +1 -2
  42. package/build/npm/types/index.d.ts.map +1 -1
  43. package/build/npm/types/integrations/httpcontext.d.ts.map +1 -1
  44. package/build/npm/types/integrations-bundle/index.createlangchaincallbackhandler.d.ts +2 -0
  45. package/build/npm/types/integrations-bundle/index.createlangchaincallbackhandler.d.ts.map +1 -0
  46. package/build/npm/types/integrations-bundle/index.instrumentlanggraph.d.ts +2 -0
  47. package/build/npm/types/integrations-bundle/index.instrumentlanggraph.d.ts.map +1 -0
  48. package/build/npm/types/profiling/UIProfiler.d.ts.map +1 -1
  49. package/build/npm/types/tracing/linkedTraces.d.ts +1 -2
  50. package/build/npm/types/tracing/linkedTraces.d.ts.map +1 -1
  51. package/build/npm/types/tracing/request.d.ts.map +1 -1
  52. package/build/npm/types/utils/lazyLoadIntegration.d.ts +2 -0
  53. package/build/npm/types/utils/lazyLoadIntegration.d.ts.map +1 -1
  54. package/build/npm/types-ts3.8/index.d.ts +1 -2
  55. package/build/npm/types-ts3.8/integrations-bundle/index.createlangchaincallbackhandler.d.ts +2 -0
  56. package/build/npm/types-ts3.8/integrations-bundle/index.instrumentlanggraph.d.ts +2 -0
  57. package/build/npm/types-ts3.8/tracing/linkedTraces.d.ts +1 -2
  58. package/build/npm/types-ts3.8/utils/lazyLoadIntegration.d.ts +2 -0
  59. package/package.json +7 -7
  60. package/build/npm/cjs/dev/integrations/spanstreaming.js +0 -217
  61. package/build/npm/cjs/dev/integrations/spanstreaming.js.map +0 -1
  62. package/build/npm/cjs/prod/integrations/spanstreaming.js +0 -217
  63. package/build/npm/cjs/prod/integrations/spanstreaming.js.map +0 -1
  64. package/build/npm/esm/dev/integrations/spanstreaming.js +0 -215
  65. package/build/npm/esm/dev/integrations/spanstreaming.js.map +0 -1
  66. package/build/npm/esm/prod/integrations/spanstreaming.js +0 -215
  67. package/build/npm/esm/prod/integrations/spanstreaming.js.map +0 -1
  68. package/build/npm/types/integrations/spanstreaming.d.ts +0 -5
  69. package/build/npm/types/integrations/spanstreaming.d.ts.map +0 -1
  70. package/build/npm/types-ts3.8/integrations/spanstreaming.d.ts +0 -5
@@ -1 +0,0 @@
1
- {"version":3,"file":"spanstreaming.js","sources":["../../../../../src/integrations/spanstreaming.ts"],"sourcesContent":["import type { Client, IntegrationFn, Scope, ScopeData, Span, SpanAttributes, SpanV2JSON } from '@sentry/core';\nimport {\n createSpanV2Envelope,\n debug,\n defineIntegration,\n getCapturedScopesOnSpan,\n getDynamicSamplingContextFromSpan,\n getGlobalScope,\n INTERNAL_getSegmentSpan,\n isV2BeforeSendSpanCallback,\n mergeScopeData,\n reparentChildSpans,\n SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME,\n SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT,\n SEMANTIC_ATTRIBUTE_SENTRY_RELEASE,\n SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME,\n SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION,\n SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID,\n SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME,\n SEMANTIC_ATTRIBUTE_USER_EMAIL,\n SEMANTIC_ATTRIBUTE_USER_ID,\n SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS,\n SEMANTIC_ATTRIBUTE_USER_USERNAME,\n shouldIgnoreSpan,\n showSpanDropWarning,\n spanToV2JSON,\n} from '@sentry/core';\nimport { DEBUG_BUILD } from '../debug-build';\n\nexport interface SpanStreamingOptions {\n batchLimit: number;\n}\n\nexport const spanStreamingIntegration = defineIntegration(((userOptions?: Partial<SpanStreamingOptions>) => {\n const validatedUserProvidedBatchLimit =\n userOptions?.batchLimit && userOptions.batchLimit <= 1000 && userOptions.batchLimit >= 1\n ? userOptions.batchLimit\n : undefined;\n\n if (DEBUG_BUILD && userOptions?.batchLimit && !validatedUserProvidedBatchLimit) {\n debug.warn('SpanStreaming batchLimit must be between 1 and 1000, defaulting to 1000');\n }\n\n const options: SpanStreamingOptions = {\n ...userOptions,\n batchLimit:\n userOptions?.batchLimit && userOptions.batchLimit <= 1000 && userOptions.batchLimit >= 1\n ? userOptions.batchLimit\n : 1000,\n };\n\n // key: traceId-segmentSpanId\n const spanTreeMap = new Map<string, Set<Span>>();\n\n return {\n name: 'SpanStreaming',\n setup(client) {\n const clientOptions = client.getOptions();\n const beforeSendSpan = clientOptions.beforeSendSpan;\n\n const initialMessage = 'spanStreamingIntegration requires';\n const fallbackMsg = 'Falling back to static trace lifecycle.';\n\n if (clientOptions.traceLifecycle !== 'stream') {\n DEBUG_BUILD && debug.warn(`${initialMessage} \\`traceLifecycle\\` to be set to \"stream\"! ${fallbackMsg}`);\n return;\n }\n\n if (beforeSendSpan && !isV2BeforeSendSpanCallback(beforeSendSpan)) {\n client.getOptions().traceLifecycle = 'static';\n debug.warn(`${initialMessage} a beforeSendSpan callback using \\`withStreamSpan\\`! ${fallbackMsg}`);\n return;\n }\n\n client.on('spanEnd', span => {\n const spanTreeMapKey = getSpanTreeMapKey(span);\n const spanBuffer = spanTreeMap.get(spanTreeMapKey);\n if (spanBuffer) {\n spanBuffer.add(span);\n } else {\n spanTreeMap.set(spanTreeMapKey, new Set([span]));\n }\n });\n\n // For now, we send all spans on local segment (root) span end.\n // TODO: This will change once we have more concrete ideas about a universal SDK data buffer.\n client.on('segmentSpanEnd', segmentSpan => {\n processAndSendSpans(segmentSpan, {\n spanTreeMap: spanTreeMap,\n client,\n batchLimit: options.batchLimit,\n beforeSendSpan,\n });\n });\n },\n };\n}) satisfies IntegrationFn);\n\ninterface SpanProcessingOptions {\n client: Client;\n spanTreeMap: Map<string, Set<Span>>;\n batchLimit: number;\n beforeSendSpan: ((span: SpanV2JSON) => SpanV2JSON) | undefined;\n}\n\n/**\n * Just the traceid alone isn't enough because there can be multiple span trees with the same traceid.\n */\nfunction getSpanTreeMapKey(span: Span): string {\n return `${span.spanContext().traceId}-${INTERNAL_getSegmentSpan(span).spanContext().spanId}`;\n}\n\nfunction processAndSendSpans(\n segmentSpan: Span,\n { client, spanTreeMap, batchLimit, beforeSendSpan }: SpanProcessingOptions,\n): void {\n const traceId = segmentSpan.spanContext().traceId;\n const spanTreeMapKey = getSpanTreeMapKey(segmentSpan);\n const spansOfTrace = spanTreeMap.get(spanTreeMapKey);\n\n if (!spansOfTrace?.size) {\n spanTreeMap.delete(spanTreeMapKey);\n return;\n }\n\n const segmentSpanJson = spanToV2JSON(segmentSpan);\n\n for (const span of spansOfTrace) {\n applyCommonSpanAttributes(span, segmentSpanJson, client);\n }\n\n const { ignoreSpans } = client.getOptions();\n\n // 1. Check if the entire span tree is ignored by ignoreSpans\n if (ignoreSpans?.length && shouldIgnoreSpan(segmentSpanJson, ignoreSpans)) {\n client.recordDroppedEvent('before_send', 'span', spansOfTrace.size);\n spanTreeMap.delete(spanTreeMapKey);\n return;\n }\n\n const serializedSpans = Array.from(spansOfTrace ?? []).map(s => {\n const serialized = spanToV2JSON(s);\n // remove internal span attributes we don't need to send.\n delete serialized.attributes?.[SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME];\n return serialized;\n });\n\n const processedSpans = [];\n let ignoredSpanCount = 0;\n\n for (const span of serializedSpans) {\n // 2. Check if child spans should be ignored\n const isChildSpan = span.span_id !== segmentSpan.spanContext().spanId;\n if (ignoreSpans?.length && isChildSpan && shouldIgnoreSpan(span, ignoreSpans)) {\n reparentChildSpans(serializedSpans, span);\n ignoredSpanCount++;\n // drop this span by not adding it to the processedSpans array\n continue;\n }\n\n // 3. Apply beforeSendSpan callback\n // TODO: validate beforeSendSpan result/pass in a copy and merge afterwards\n const processedSpan = beforeSendSpan ? applyBeforeSendSpanCallback(span, beforeSendSpan) : span;\n processedSpans.push(processedSpan);\n }\n\n if (ignoredSpanCount) {\n client.recordDroppedEvent('before_send', 'span', ignoredSpanCount);\n }\n\n const batches: SpanV2JSON[][] = [];\n for (let i = 0; i < processedSpans.length; i += batchLimit) {\n batches.push(processedSpans.slice(i, i + batchLimit));\n }\n\n DEBUG_BUILD && debug.log(`Sending trace ${traceId} in ${batches.length} batch${batches.length === 1 ? '' : 'es'}`);\n\n const dsc = getDynamicSamplingContextFromSpan(segmentSpan);\n\n for (const batch of batches) {\n const envelope = createSpanV2Envelope(batch, dsc, client);\n // no need to handle client reports for network errors,\n // buffer overflows or rate limiting here. All of this is handled\n // by client and transport.\n client.sendEnvelope(envelope).then(null, reason => {\n DEBUG_BUILD && debug.error('Error while sending span stream envelope:', reason);\n });\n }\n\n spanTreeMap.delete(spanTreeMapKey);\n}\n\nfunction applyCommonSpanAttributes(span: Span, serializedSegmentSpan: SpanV2JSON, client: Client): void {\n const sdk = client.getSdkMetadata();\n const { release, environment, sendDefaultPii } = client.getOptions();\n\n const { isolationScope: spanIsolationScope, scope: spanScope } = getCapturedScopesOnSpan(span);\n\n const originalAttributeKeys = Object.keys(spanToV2JSON(span).attributes ?? {});\n\n const finalScopeData = getFinalScopeData(spanIsolationScope, spanScope);\n\n // avoid overwriting any previously set attributes (from users or potentially our SDK instrumentation)\n setAttributesIfNotPresent(span, originalAttributeKeys, {\n [SEMANTIC_ATTRIBUTE_SENTRY_RELEASE]: release,\n [SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT]: environment,\n [SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME]: serializedSegmentSpan.name,\n [SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID]: serializedSegmentSpan.span_id,\n [SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME]: sdk?.sdk?.name,\n [SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION]: sdk?.sdk?.version,\n ...(sendDefaultPii\n ? {\n [SEMANTIC_ATTRIBUTE_USER_ID]: finalScopeData.user?.id,\n [SEMANTIC_ATTRIBUTE_USER_EMAIL]: finalScopeData.user?.email,\n [SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS]: finalScopeData.user?.ip_address ?? undefined,\n [SEMANTIC_ATTRIBUTE_USER_USERNAME]: finalScopeData.user?.username,\n }\n : {}),\n });\n}\n\nfunction applyBeforeSendSpanCallback(span: SpanV2JSON, beforeSendSpan: (span: SpanV2JSON) => SpanV2JSON): SpanV2JSON {\n const modifedSpan = beforeSendSpan(span);\n if (!modifedSpan) {\n showSpanDropWarning();\n return span;\n }\n return modifedSpan;\n}\n\nfunction setAttributesIfNotPresent(span: Span, originalAttributeKeys: string[], newAttributes: SpanAttributes): void {\n Object.keys(newAttributes).forEach(key => {\n if (!originalAttributeKeys.includes(key)) {\n span.setAttribute(key, newAttributes[key]);\n }\n });\n}\n\n// TODO: Extract this to a helper in core. It's used in multiple places.\nfunction getFinalScopeData(isolationScope: Scope | undefined, scope: Scope | undefined): ScopeData {\n const finalScopeData = getGlobalScope().getScopeData();\n if (isolationScope) {\n mergeScopeData(finalScopeData, isolationScope.getScopeData());\n }\n if (scope) {\n mergeScopeData(finalScopeData, scope.getScopeData());\n }\n return finalScopeData;\n}\n"],"names":["defineIntegration","DEBUG_BUILD","debug","isV2BeforeSendSpanCallback","INTERNAL_getSegmentSpan","spanToV2JSON","shouldIgnoreSpan","SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME","reparentChildSpans","getDynamicSamplingContextFromSpan","createSpanV2Envelope","getCapturedScopesOnSpan","SEMANTIC_ATTRIBUTE_SENTRY_RELEASE","SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT","SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME","SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID","SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME","SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION","SEMANTIC_ATTRIBUTE_USER_ID","SEMANTIC_ATTRIBUTE_USER_EMAIL","SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS","SEMANTIC_ATTRIBUTE_USER_USERNAME","showSpanDropWarning","getGlobalScope","mergeScopeData"],"mappings":"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"}
@@ -1,215 +0,0 @@
1
- import { defineIntegration, debug, isV2BeforeSendSpanCallback, INTERNAL_getSegmentSpan, spanToV2JSON, shouldIgnoreSpan, SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME, reparentChildSpans, getDynamicSamplingContextFromSpan, createSpanV2Envelope, getCapturedScopesOnSpan, SEMANTIC_ATTRIBUTE_USER_USERNAME, SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS, SEMANTIC_ATTRIBUTE_USER_EMAIL, SEMANTIC_ATTRIBUTE_USER_ID, SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION, SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME, SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID, SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME, showSpanDropWarning, getGlobalScope, mergeScopeData, SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT, SEMANTIC_ATTRIBUTE_SENTRY_RELEASE } from '@sentry/core';
2
- import { DEBUG_BUILD } from '../debug-build.js';
3
-
4
- const spanStreamingIntegration = defineIntegration(((userOptions) => {
5
- const validatedUserProvidedBatchLimit =
6
- userOptions?.batchLimit && userOptions.batchLimit <= 1000 && userOptions.batchLimit >= 1
7
- ? userOptions.batchLimit
8
- : undefined;
9
-
10
- if (DEBUG_BUILD && userOptions?.batchLimit && !validatedUserProvidedBatchLimit) {
11
- debug.warn('SpanStreaming batchLimit must be between 1 and 1000, defaulting to 1000');
12
- }
13
-
14
- const options = {
15
- ...userOptions,
16
- batchLimit:
17
- userOptions?.batchLimit && userOptions.batchLimit <= 1000 && userOptions.batchLimit >= 1
18
- ? userOptions.batchLimit
19
- : 1000,
20
- };
21
-
22
- // key: traceId-segmentSpanId
23
- const spanTreeMap = new Map();
24
-
25
- return {
26
- name: 'SpanStreaming',
27
- setup(client) {
28
- const clientOptions = client.getOptions();
29
- const beforeSendSpan = clientOptions.beforeSendSpan;
30
-
31
- const initialMessage = 'spanStreamingIntegration requires';
32
- const fallbackMsg = 'Falling back to static trace lifecycle.';
33
-
34
- if (clientOptions.traceLifecycle !== 'stream') {
35
- DEBUG_BUILD && debug.warn(`${initialMessage} \`traceLifecycle\` to be set to "stream"! ${fallbackMsg}`);
36
- return;
37
- }
38
-
39
- if (beforeSendSpan && !isV2BeforeSendSpanCallback(beforeSendSpan)) {
40
- client.getOptions().traceLifecycle = 'static';
41
- debug.warn(`${initialMessage} a beforeSendSpan callback using \`withStreamSpan\`! ${fallbackMsg}`);
42
- return;
43
- }
44
-
45
- client.on('spanEnd', span => {
46
- const spanTreeMapKey = getSpanTreeMapKey(span);
47
- const spanBuffer = spanTreeMap.get(spanTreeMapKey);
48
- if (spanBuffer) {
49
- spanBuffer.add(span);
50
- } else {
51
- spanTreeMap.set(spanTreeMapKey, new Set([span]));
52
- }
53
- });
54
-
55
- // For now, we send all spans on local segment (root) span end.
56
- // TODO: This will change once we have more concrete ideas about a universal SDK data buffer.
57
- client.on('segmentSpanEnd', segmentSpan => {
58
- processAndSendSpans(segmentSpan, {
59
- spanTreeMap: spanTreeMap,
60
- client,
61
- batchLimit: options.batchLimit,
62
- beforeSendSpan,
63
- });
64
- });
65
- },
66
- };
67
- }) );
68
-
69
- /**
70
- * Just the traceid alone isn't enough because there can be multiple span trees with the same traceid.
71
- */
72
- function getSpanTreeMapKey(span) {
73
- return `${span.spanContext().traceId}-${INTERNAL_getSegmentSpan(span).spanContext().spanId}`;
74
- }
75
-
76
- function processAndSendSpans(
77
- segmentSpan,
78
- { client, spanTreeMap, batchLimit, beforeSendSpan },
79
- ) {
80
- const traceId = segmentSpan.spanContext().traceId;
81
- const spanTreeMapKey = getSpanTreeMapKey(segmentSpan);
82
- const spansOfTrace = spanTreeMap.get(spanTreeMapKey);
83
-
84
- if (!spansOfTrace?.size) {
85
- spanTreeMap.delete(spanTreeMapKey);
86
- return;
87
- }
88
-
89
- const segmentSpanJson = spanToV2JSON(segmentSpan);
90
-
91
- for (const span of spansOfTrace) {
92
- applyCommonSpanAttributes(span, segmentSpanJson, client);
93
- }
94
-
95
- const { ignoreSpans } = client.getOptions();
96
-
97
- // 1. Check if the entire span tree is ignored by ignoreSpans
98
- if (ignoreSpans?.length && shouldIgnoreSpan(segmentSpanJson, ignoreSpans)) {
99
- client.recordDroppedEvent('before_send', 'span', spansOfTrace.size);
100
- spanTreeMap.delete(spanTreeMapKey);
101
- return;
102
- }
103
-
104
- const serializedSpans = Array.from(spansOfTrace ?? []).map(s => {
105
- const serialized = spanToV2JSON(s);
106
- // remove internal span attributes we don't need to send.
107
- delete serialized.attributes?.[SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME];
108
- return serialized;
109
- });
110
-
111
- const processedSpans = [];
112
- let ignoredSpanCount = 0;
113
-
114
- for (const span of serializedSpans) {
115
- // 2. Check if child spans should be ignored
116
- const isChildSpan = span.span_id !== segmentSpan.spanContext().spanId;
117
- if (ignoreSpans?.length && isChildSpan && shouldIgnoreSpan(span, ignoreSpans)) {
118
- reparentChildSpans(serializedSpans, span);
119
- ignoredSpanCount++;
120
- // drop this span by not adding it to the processedSpans array
121
- continue;
122
- }
123
-
124
- // 3. Apply beforeSendSpan callback
125
- // TODO: validate beforeSendSpan result/pass in a copy and merge afterwards
126
- const processedSpan = beforeSendSpan ? applyBeforeSendSpanCallback(span, beforeSendSpan) : span;
127
- processedSpans.push(processedSpan);
128
- }
129
-
130
- if (ignoredSpanCount) {
131
- client.recordDroppedEvent('before_send', 'span', ignoredSpanCount);
132
- }
133
-
134
- const batches = [];
135
- for (let i = 0; i < processedSpans.length; i += batchLimit) {
136
- batches.push(processedSpans.slice(i, i + batchLimit));
137
- }
138
-
139
- DEBUG_BUILD && debug.log(`Sending trace ${traceId} in ${batches.length} batch${batches.length === 1 ? '' : 'es'}`);
140
-
141
- const dsc = getDynamicSamplingContextFromSpan(segmentSpan);
142
-
143
- for (const batch of batches) {
144
- const envelope = createSpanV2Envelope(batch, dsc, client);
145
- // no need to handle client reports for network errors,
146
- // buffer overflows or rate limiting here. All of this is handled
147
- // by client and transport.
148
- client.sendEnvelope(envelope).then(null, reason => {
149
- DEBUG_BUILD && debug.error('Error while sending span stream envelope:', reason);
150
- });
151
- }
152
-
153
- spanTreeMap.delete(spanTreeMapKey);
154
- }
155
-
156
- function applyCommonSpanAttributes(span, serializedSegmentSpan, client) {
157
- const sdk = client.getSdkMetadata();
158
- const { release, environment, sendDefaultPii } = client.getOptions();
159
-
160
- const { isolationScope: spanIsolationScope, scope: spanScope } = getCapturedScopesOnSpan(span);
161
-
162
- const originalAttributeKeys = Object.keys(spanToV2JSON(span).attributes ?? {});
163
-
164
- const finalScopeData = getFinalScopeData(spanIsolationScope, spanScope);
165
-
166
- // avoid overwriting any previously set attributes (from users or potentially our SDK instrumentation)
167
- setAttributesIfNotPresent(span, originalAttributeKeys, {
168
- [SEMANTIC_ATTRIBUTE_SENTRY_RELEASE]: release,
169
- [SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT]: environment,
170
- [SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME]: serializedSegmentSpan.name,
171
- [SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID]: serializedSegmentSpan.span_id,
172
- [SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME]: sdk?.sdk?.name,
173
- [SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION]: sdk?.sdk?.version,
174
- ...(sendDefaultPii
175
- ? {
176
- [SEMANTIC_ATTRIBUTE_USER_ID]: finalScopeData.user?.id,
177
- [SEMANTIC_ATTRIBUTE_USER_EMAIL]: finalScopeData.user?.email,
178
- [SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS]: finalScopeData.user?.ip_address ?? undefined,
179
- [SEMANTIC_ATTRIBUTE_USER_USERNAME]: finalScopeData.user?.username,
180
- }
181
- : {}),
182
- });
183
- }
184
-
185
- function applyBeforeSendSpanCallback(span, beforeSendSpan) {
186
- const modifedSpan = beforeSendSpan(span);
187
- if (!modifedSpan) {
188
- showSpanDropWarning();
189
- return span;
190
- }
191
- return modifedSpan;
192
- }
193
-
194
- function setAttributesIfNotPresent(span, originalAttributeKeys, newAttributes) {
195
- Object.keys(newAttributes).forEach(key => {
196
- if (!originalAttributeKeys.includes(key)) {
197
- span.setAttribute(key, newAttributes[key]);
198
- }
199
- });
200
- }
201
-
202
- // TODO: Extract this to a helper in core. It's used in multiple places.
203
- function getFinalScopeData(isolationScope, scope) {
204
- const finalScopeData = getGlobalScope().getScopeData();
205
- if (isolationScope) {
206
- mergeScopeData(finalScopeData, isolationScope.getScopeData());
207
- }
208
- if (scope) {
209
- mergeScopeData(finalScopeData, scope.getScopeData());
210
- }
211
- return finalScopeData;
212
- }
213
-
214
- export { spanStreamingIntegration };
215
- //# sourceMappingURL=spanstreaming.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"spanstreaming.js","sources":["../../../../../src/integrations/spanstreaming.ts"],"sourcesContent":["import type { Client, IntegrationFn, Scope, ScopeData, Span, SpanAttributes, SpanV2JSON } from '@sentry/core';\nimport {\n createSpanV2Envelope,\n debug,\n defineIntegration,\n getCapturedScopesOnSpan,\n getDynamicSamplingContextFromSpan,\n getGlobalScope,\n INTERNAL_getSegmentSpan,\n isV2BeforeSendSpanCallback,\n mergeScopeData,\n reparentChildSpans,\n SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME,\n SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT,\n SEMANTIC_ATTRIBUTE_SENTRY_RELEASE,\n SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME,\n SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION,\n SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID,\n SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME,\n SEMANTIC_ATTRIBUTE_USER_EMAIL,\n SEMANTIC_ATTRIBUTE_USER_ID,\n SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS,\n SEMANTIC_ATTRIBUTE_USER_USERNAME,\n shouldIgnoreSpan,\n showSpanDropWarning,\n spanToV2JSON,\n} from '@sentry/core';\nimport { DEBUG_BUILD } from '../debug-build';\n\nexport interface SpanStreamingOptions {\n batchLimit: number;\n}\n\nexport const spanStreamingIntegration = defineIntegration(((userOptions?: Partial<SpanStreamingOptions>) => {\n const validatedUserProvidedBatchLimit =\n userOptions?.batchLimit && userOptions.batchLimit <= 1000 && userOptions.batchLimit >= 1\n ? userOptions.batchLimit\n : undefined;\n\n if (DEBUG_BUILD && userOptions?.batchLimit && !validatedUserProvidedBatchLimit) {\n debug.warn('SpanStreaming batchLimit must be between 1 and 1000, defaulting to 1000');\n }\n\n const options: SpanStreamingOptions = {\n ...userOptions,\n batchLimit:\n userOptions?.batchLimit && userOptions.batchLimit <= 1000 && userOptions.batchLimit >= 1\n ? userOptions.batchLimit\n : 1000,\n };\n\n // key: traceId-segmentSpanId\n const spanTreeMap = new Map<string, Set<Span>>();\n\n return {\n name: 'SpanStreaming',\n setup(client) {\n const clientOptions = client.getOptions();\n const beforeSendSpan = clientOptions.beforeSendSpan;\n\n const initialMessage = 'spanStreamingIntegration requires';\n const fallbackMsg = 'Falling back to static trace lifecycle.';\n\n if (clientOptions.traceLifecycle !== 'stream') {\n DEBUG_BUILD && debug.warn(`${initialMessage} \\`traceLifecycle\\` to be set to \"stream\"! ${fallbackMsg}`);\n return;\n }\n\n if (beforeSendSpan && !isV2BeforeSendSpanCallback(beforeSendSpan)) {\n client.getOptions().traceLifecycle = 'static';\n debug.warn(`${initialMessage} a beforeSendSpan callback using \\`withStreamSpan\\`! ${fallbackMsg}`);\n return;\n }\n\n client.on('spanEnd', span => {\n const spanTreeMapKey = getSpanTreeMapKey(span);\n const spanBuffer = spanTreeMap.get(spanTreeMapKey);\n if (spanBuffer) {\n spanBuffer.add(span);\n } else {\n spanTreeMap.set(spanTreeMapKey, new Set([span]));\n }\n });\n\n // For now, we send all spans on local segment (root) span end.\n // TODO: This will change once we have more concrete ideas about a universal SDK data buffer.\n client.on('segmentSpanEnd', segmentSpan => {\n processAndSendSpans(segmentSpan, {\n spanTreeMap: spanTreeMap,\n client,\n batchLimit: options.batchLimit,\n beforeSendSpan,\n });\n });\n },\n };\n}) satisfies IntegrationFn);\n\ninterface SpanProcessingOptions {\n client: Client;\n spanTreeMap: Map<string, Set<Span>>;\n batchLimit: number;\n beforeSendSpan: ((span: SpanV2JSON) => SpanV2JSON) | undefined;\n}\n\n/**\n * Just the traceid alone isn't enough because there can be multiple span trees with the same traceid.\n */\nfunction getSpanTreeMapKey(span: Span): string {\n return `${span.spanContext().traceId}-${INTERNAL_getSegmentSpan(span).spanContext().spanId}`;\n}\n\nfunction processAndSendSpans(\n segmentSpan: Span,\n { client, spanTreeMap, batchLimit, beforeSendSpan }: SpanProcessingOptions,\n): void {\n const traceId = segmentSpan.spanContext().traceId;\n const spanTreeMapKey = getSpanTreeMapKey(segmentSpan);\n const spansOfTrace = spanTreeMap.get(spanTreeMapKey);\n\n if (!spansOfTrace?.size) {\n spanTreeMap.delete(spanTreeMapKey);\n return;\n }\n\n const segmentSpanJson = spanToV2JSON(segmentSpan);\n\n for (const span of spansOfTrace) {\n applyCommonSpanAttributes(span, segmentSpanJson, client);\n }\n\n const { ignoreSpans } = client.getOptions();\n\n // 1. Check if the entire span tree is ignored by ignoreSpans\n if (ignoreSpans?.length && shouldIgnoreSpan(segmentSpanJson, ignoreSpans)) {\n client.recordDroppedEvent('before_send', 'span', spansOfTrace.size);\n spanTreeMap.delete(spanTreeMapKey);\n return;\n }\n\n const serializedSpans = Array.from(spansOfTrace ?? []).map(s => {\n const serialized = spanToV2JSON(s);\n // remove internal span attributes we don't need to send.\n delete serialized.attributes?.[SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME];\n return serialized;\n });\n\n const processedSpans = [];\n let ignoredSpanCount = 0;\n\n for (const span of serializedSpans) {\n // 2. Check if child spans should be ignored\n const isChildSpan = span.span_id !== segmentSpan.spanContext().spanId;\n if (ignoreSpans?.length && isChildSpan && shouldIgnoreSpan(span, ignoreSpans)) {\n reparentChildSpans(serializedSpans, span);\n ignoredSpanCount++;\n // drop this span by not adding it to the processedSpans array\n continue;\n }\n\n // 3. Apply beforeSendSpan callback\n // TODO: validate beforeSendSpan result/pass in a copy and merge afterwards\n const processedSpan = beforeSendSpan ? applyBeforeSendSpanCallback(span, beforeSendSpan) : span;\n processedSpans.push(processedSpan);\n }\n\n if (ignoredSpanCount) {\n client.recordDroppedEvent('before_send', 'span', ignoredSpanCount);\n }\n\n const batches: SpanV2JSON[][] = [];\n for (let i = 0; i < processedSpans.length; i += batchLimit) {\n batches.push(processedSpans.slice(i, i + batchLimit));\n }\n\n DEBUG_BUILD && debug.log(`Sending trace ${traceId} in ${batches.length} batch${batches.length === 1 ? '' : 'es'}`);\n\n const dsc = getDynamicSamplingContextFromSpan(segmentSpan);\n\n for (const batch of batches) {\n const envelope = createSpanV2Envelope(batch, dsc, client);\n // no need to handle client reports for network errors,\n // buffer overflows or rate limiting here. All of this is handled\n // by client and transport.\n client.sendEnvelope(envelope).then(null, reason => {\n DEBUG_BUILD && debug.error('Error while sending span stream envelope:', reason);\n });\n }\n\n spanTreeMap.delete(spanTreeMapKey);\n}\n\nfunction applyCommonSpanAttributes(span: Span, serializedSegmentSpan: SpanV2JSON, client: Client): void {\n const sdk = client.getSdkMetadata();\n const { release, environment, sendDefaultPii } = client.getOptions();\n\n const { isolationScope: spanIsolationScope, scope: spanScope } = getCapturedScopesOnSpan(span);\n\n const originalAttributeKeys = Object.keys(spanToV2JSON(span).attributes ?? {});\n\n const finalScopeData = getFinalScopeData(spanIsolationScope, spanScope);\n\n // avoid overwriting any previously set attributes (from users or potentially our SDK instrumentation)\n setAttributesIfNotPresent(span, originalAttributeKeys, {\n [SEMANTIC_ATTRIBUTE_SENTRY_RELEASE]: release,\n [SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT]: environment,\n [SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME]: serializedSegmentSpan.name,\n [SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID]: serializedSegmentSpan.span_id,\n [SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME]: sdk?.sdk?.name,\n [SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION]: sdk?.sdk?.version,\n ...(sendDefaultPii\n ? {\n [SEMANTIC_ATTRIBUTE_USER_ID]: finalScopeData.user?.id,\n [SEMANTIC_ATTRIBUTE_USER_EMAIL]: finalScopeData.user?.email,\n [SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS]: finalScopeData.user?.ip_address ?? undefined,\n [SEMANTIC_ATTRIBUTE_USER_USERNAME]: finalScopeData.user?.username,\n }\n : {}),\n });\n}\n\nfunction applyBeforeSendSpanCallback(span: SpanV2JSON, beforeSendSpan: (span: SpanV2JSON) => SpanV2JSON): SpanV2JSON {\n const modifedSpan = beforeSendSpan(span);\n if (!modifedSpan) {\n showSpanDropWarning();\n return span;\n }\n return modifedSpan;\n}\n\nfunction setAttributesIfNotPresent(span: Span, originalAttributeKeys: string[], newAttributes: SpanAttributes): void {\n Object.keys(newAttributes).forEach(key => {\n if (!originalAttributeKeys.includes(key)) {\n span.setAttribute(key, newAttributes[key]);\n }\n });\n}\n\n// TODO: Extract this to a helper in core. It's used in multiple places.\nfunction getFinalScopeData(isolationScope: Scope | undefined, scope: Scope | undefined): ScopeData {\n const finalScopeData = getGlobalScope().getScopeData();\n if (isolationScope) {\n mergeScopeData(finalScopeData, isolationScope.getScopeData());\n }\n if (scope) {\n mergeScopeData(finalScopeData, scope.getScopeData());\n }\n return finalScopeData;\n}\n"],"names":[],"mappings":"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"}
@@ -1,215 +0,0 @@
1
- import { defineIntegration, debug, isV2BeforeSendSpanCallback, INTERNAL_getSegmentSpan, spanToV2JSON, shouldIgnoreSpan, SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME, reparentChildSpans, getDynamicSamplingContextFromSpan, createSpanV2Envelope, getCapturedScopesOnSpan, SEMANTIC_ATTRIBUTE_USER_USERNAME, SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS, SEMANTIC_ATTRIBUTE_USER_EMAIL, SEMANTIC_ATTRIBUTE_USER_ID, SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION, SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME, SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID, SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME, showSpanDropWarning, getGlobalScope, mergeScopeData, SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT, SEMANTIC_ATTRIBUTE_SENTRY_RELEASE } from '@sentry/core';
2
- import { DEBUG_BUILD } from '../debug-build.js';
3
-
4
- const spanStreamingIntegration = defineIntegration(((userOptions) => {
5
- const validatedUserProvidedBatchLimit =
6
- userOptions?.batchLimit && userOptions.batchLimit <= 1000 && userOptions.batchLimit >= 1
7
- ? userOptions.batchLimit
8
- : undefined;
9
-
10
- if (DEBUG_BUILD && userOptions?.batchLimit && !validatedUserProvidedBatchLimit) {
11
- debug.warn('SpanStreaming batchLimit must be between 1 and 1000, defaulting to 1000');
12
- }
13
-
14
- const options = {
15
- ...userOptions,
16
- batchLimit:
17
- userOptions?.batchLimit && userOptions.batchLimit <= 1000 && userOptions.batchLimit >= 1
18
- ? userOptions.batchLimit
19
- : 1000,
20
- };
21
-
22
- // key: traceId-segmentSpanId
23
- const spanTreeMap = new Map();
24
-
25
- return {
26
- name: 'SpanStreaming',
27
- setup(client) {
28
- const clientOptions = client.getOptions();
29
- const beforeSendSpan = clientOptions.beforeSendSpan;
30
-
31
- const initialMessage = 'spanStreamingIntegration requires';
32
- const fallbackMsg = 'Falling back to static trace lifecycle.';
33
-
34
- if (clientOptions.traceLifecycle !== 'stream') {
35
- DEBUG_BUILD && debug.warn(`${initialMessage} \`traceLifecycle\` to be set to "stream"! ${fallbackMsg}`);
36
- return;
37
- }
38
-
39
- if (beforeSendSpan && !isV2BeforeSendSpanCallback(beforeSendSpan)) {
40
- client.getOptions().traceLifecycle = 'static';
41
- debug.warn(`${initialMessage} a beforeSendSpan callback using \`withStreamSpan\`! ${fallbackMsg}`);
42
- return;
43
- }
44
-
45
- client.on('spanEnd', span => {
46
- const spanTreeMapKey = getSpanTreeMapKey(span);
47
- const spanBuffer = spanTreeMap.get(spanTreeMapKey);
48
- if (spanBuffer) {
49
- spanBuffer.add(span);
50
- } else {
51
- spanTreeMap.set(spanTreeMapKey, new Set([span]));
52
- }
53
- });
54
-
55
- // For now, we send all spans on local segment (root) span end.
56
- // TODO: This will change once we have more concrete ideas about a universal SDK data buffer.
57
- client.on('segmentSpanEnd', segmentSpan => {
58
- processAndSendSpans(segmentSpan, {
59
- spanTreeMap: spanTreeMap,
60
- client,
61
- batchLimit: options.batchLimit,
62
- beforeSendSpan,
63
- });
64
- });
65
- },
66
- };
67
- }) );
68
-
69
- /**
70
- * Just the traceid alone isn't enough because there can be multiple span trees with the same traceid.
71
- */
72
- function getSpanTreeMapKey(span) {
73
- return `${span.spanContext().traceId}-${INTERNAL_getSegmentSpan(span).spanContext().spanId}`;
74
- }
75
-
76
- function processAndSendSpans(
77
- segmentSpan,
78
- { client, spanTreeMap, batchLimit, beforeSendSpan },
79
- ) {
80
- const traceId = segmentSpan.spanContext().traceId;
81
- const spanTreeMapKey = getSpanTreeMapKey(segmentSpan);
82
- const spansOfTrace = spanTreeMap.get(spanTreeMapKey);
83
-
84
- if (!spansOfTrace?.size) {
85
- spanTreeMap.delete(spanTreeMapKey);
86
- return;
87
- }
88
-
89
- const segmentSpanJson = spanToV2JSON(segmentSpan);
90
-
91
- for (const span of spansOfTrace) {
92
- applyCommonSpanAttributes(span, segmentSpanJson, client);
93
- }
94
-
95
- const { ignoreSpans } = client.getOptions();
96
-
97
- // 1. Check if the entire span tree is ignored by ignoreSpans
98
- if (ignoreSpans?.length && shouldIgnoreSpan(segmentSpanJson, ignoreSpans)) {
99
- client.recordDroppedEvent('before_send', 'span', spansOfTrace.size);
100
- spanTreeMap.delete(spanTreeMapKey);
101
- return;
102
- }
103
-
104
- const serializedSpans = Array.from(spansOfTrace ?? []).map(s => {
105
- const serialized = spanToV2JSON(s);
106
- // remove internal span attributes we don't need to send.
107
- delete serialized.attributes?.[SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME];
108
- return serialized;
109
- });
110
-
111
- const processedSpans = [];
112
- let ignoredSpanCount = 0;
113
-
114
- for (const span of serializedSpans) {
115
- // 2. Check if child spans should be ignored
116
- const isChildSpan = span.span_id !== segmentSpan.spanContext().spanId;
117
- if (ignoreSpans?.length && isChildSpan && shouldIgnoreSpan(span, ignoreSpans)) {
118
- reparentChildSpans(serializedSpans, span);
119
- ignoredSpanCount++;
120
- // drop this span by not adding it to the processedSpans array
121
- continue;
122
- }
123
-
124
- // 3. Apply beforeSendSpan callback
125
- // TODO: validate beforeSendSpan result/pass in a copy and merge afterwards
126
- const processedSpan = beforeSendSpan ? applyBeforeSendSpanCallback(span, beforeSendSpan) : span;
127
- processedSpans.push(processedSpan);
128
- }
129
-
130
- if (ignoredSpanCount) {
131
- client.recordDroppedEvent('before_send', 'span', ignoredSpanCount);
132
- }
133
-
134
- const batches = [];
135
- for (let i = 0; i < processedSpans.length; i += batchLimit) {
136
- batches.push(processedSpans.slice(i, i + batchLimit));
137
- }
138
-
139
- DEBUG_BUILD && debug.log(`Sending trace ${traceId} in ${batches.length} batch${batches.length === 1 ? '' : 'es'}`);
140
-
141
- const dsc = getDynamicSamplingContextFromSpan(segmentSpan);
142
-
143
- for (const batch of batches) {
144
- const envelope = createSpanV2Envelope(batch, dsc, client);
145
- // no need to handle client reports for network errors,
146
- // buffer overflows or rate limiting here. All of this is handled
147
- // by client and transport.
148
- client.sendEnvelope(envelope).then(null, reason => {
149
- DEBUG_BUILD && debug.error('Error while sending span stream envelope:', reason);
150
- });
151
- }
152
-
153
- spanTreeMap.delete(spanTreeMapKey);
154
- }
155
-
156
- function applyCommonSpanAttributes(span, serializedSegmentSpan, client) {
157
- const sdk = client.getSdkMetadata();
158
- const { release, environment, sendDefaultPii } = client.getOptions();
159
-
160
- const { isolationScope: spanIsolationScope, scope: spanScope } = getCapturedScopesOnSpan(span);
161
-
162
- const originalAttributeKeys = Object.keys(spanToV2JSON(span).attributes ?? {});
163
-
164
- const finalScopeData = getFinalScopeData(spanIsolationScope, spanScope);
165
-
166
- // avoid overwriting any previously set attributes (from users or potentially our SDK instrumentation)
167
- setAttributesIfNotPresent(span, originalAttributeKeys, {
168
- [SEMANTIC_ATTRIBUTE_SENTRY_RELEASE]: release,
169
- [SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT]: environment,
170
- [SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME]: serializedSegmentSpan.name,
171
- [SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID]: serializedSegmentSpan.span_id,
172
- [SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME]: sdk?.sdk?.name,
173
- [SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION]: sdk?.sdk?.version,
174
- ...(sendDefaultPii
175
- ? {
176
- [SEMANTIC_ATTRIBUTE_USER_ID]: finalScopeData.user?.id,
177
- [SEMANTIC_ATTRIBUTE_USER_EMAIL]: finalScopeData.user?.email,
178
- [SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS]: finalScopeData.user?.ip_address ?? undefined,
179
- [SEMANTIC_ATTRIBUTE_USER_USERNAME]: finalScopeData.user?.username,
180
- }
181
- : {}),
182
- });
183
- }
184
-
185
- function applyBeforeSendSpanCallback(span, beforeSendSpan) {
186
- const modifedSpan = beforeSendSpan(span);
187
- if (!modifedSpan) {
188
- showSpanDropWarning();
189
- return span;
190
- }
191
- return modifedSpan;
192
- }
193
-
194
- function setAttributesIfNotPresent(span, originalAttributeKeys, newAttributes) {
195
- Object.keys(newAttributes).forEach(key => {
196
- if (!originalAttributeKeys.includes(key)) {
197
- span.setAttribute(key, newAttributes[key]);
198
- }
199
- });
200
- }
201
-
202
- // TODO: Extract this to a helper in core. It's used in multiple places.
203
- function getFinalScopeData(isolationScope, scope) {
204
- const finalScopeData = getGlobalScope().getScopeData();
205
- if (isolationScope) {
206
- mergeScopeData(finalScopeData, isolationScope.getScopeData());
207
- }
208
- if (scope) {
209
- mergeScopeData(finalScopeData, scope.getScopeData());
210
- }
211
- return finalScopeData;
212
- }
213
-
214
- export { spanStreamingIntegration };
215
- //# sourceMappingURL=spanstreaming.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"spanstreaming.js","sources":["../../../../../src/integrations/spanstreaming.ts"],"sourcesContent":["import type { Client, IntegrationFn, Scope, ScopeData, Span, SpanAttributes, SpanV2JSON } from '@sentry/core';\nimport {\n createSpanV2Envelope,\n debug,\n defineIntegration,\n getCapturedScopesOnSpan,\n getDynamicSamplingContextFromSpan,\n getGlobalScope,\n INTERNAL_getSegmentSpan,\n isV2BeforeSendSpanCallback,\n mergeScopeData,\n reparentChildSpans,\n SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME,\n SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT,\n SEMANTIC_ATTRIBUTE_SENTRY_RELEASE,\n SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME,\n SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION,\n SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID,\n SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME,\n SEMANTIC_ATTRIBUTE_USER_EMAIL,\n SEMANTIC_ATTRIBUTE_USER_ID,\n SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS,\n SEMANTIC_ATTRIBUTE_USER_USERNAME,\n shouldIgnoreSpan,\n showSpanDropWarning,\n spanToV2JSON,\n} from '@sentry/core';\nimport { DEBUG_BUILD } from '../debug-build';\n\nexport interface SpanStreamingOptions {\n batchLimit: number;\n}\n\nexport const spanStreamingIntegration = defineIntegration(((userOptions?: Partial<SpanStreamingOptions>) => {\n const validatedUserProvidedBatchLimit =\n userOptions?.batchLimit && userOptions.batchLimit <= 1000 && userOptions.batchLimit >= 1\n ? userOptions.batchLimit\n : undefined;\n\n if (DEBUG_BUILD && userOptions?.batchLimit && !validatedUserProvidedBatchLimit) {\n debug.warn('SpanStreaming batchLimit must be between 1 and 1000, defaulting to 1000');\n }\n\n const options: SpanStreamingOptions = {\n ...userOptions,\n batchLimit:\n userOptions?.batchLimit && userOptions.batchLimit <= 1000 && userOptions.batchLimit >= 1\n ? userOptions.batchLimit\n : 1000,\n };\n\n // key: traceId-segmentSpanId\n const spanTreeMap = new Map<string, Set<Span>>();\n\n return {\n name: 'SpanStreaming',\n setup(client) {\n const clientOptions = client.getOptions();\n const beforeSendSpan = clientOptions.beforeSendSpan;\n\n const initialMessage = 'spanStreamingIntegration requires';\n const fallbackMsg = 'Falling back to static trace lifecycle.';\n\n if (clientOptions.traceLifecycle !== 'stream') {\n DEBUG_BUILD && debug.warn(`${initialMessage} \\`traceLifecycle\\` to be set to \"stream\"! ${fallbackMsg}`);\n return;\n }\n\n if (beforeSendSpan && !isV2BeforeSendSpanCallback(beforeSendSpan)) {\n client.getOptions().traceLifecycle = 'static';\n debug.warn(`${initialMessage} a beforeSendSpan callback using \\`withStreamSpan\\`! ${fallbackMsg}`);\n return;\n }\n\n client.on('spanEnd', span => {\n const spanTreeMapKey = getSpanTreeMapKey(span);\n const spanBuffer = spanTreeMap.get(spanTreeMapKey);\n if (spanBuffer) {\n spanBuffer.add(span);\n } else {\n spanTreeMap.set(spanTreeMapKey, new Set([span]));\n }\n });\n\n // For now, we send all spans on local segment (root) span end.\n // TODO: This will change once we have more concrete ideas about a universal SDK data buffer.\n client.on('segmentSpanEnd', segmentSpan => {\n processAndSendSpans(segmentSpan, {\n spanTreeMap: spanTreeMap,\n client,\n batchLimit: options.batchLimit,\n beforeSendSpan,\n });\n });\n },\n };\n}) satisfies IntegrationFn);\n\ninterface SpanProcessingOptions {\n client: Client;\n spanTreeMap: Map<string, Set<Span>>;\n batchLimit: number;\n beforeSendSpan: ((span: SpanV2JSON) => SpanV2JSON) | undefined;\n}\n\n/**\n * Just the traceid alone isn't enough because there can be multiple span trees with the same traceid.\n */\nfunction getSpanTreeMapKey(span: Span): string {\n return `${span.spanContext().traceId}-${INTERNAL_getSegmentSpan(span).spanContext().spanId}`;\n}\n\nfunction processAndSendSpans(\n segmentSpan: Span,\n { client, spanTreeMap, batchLimit, beforeSendSpan }: SpanProcessingOptions,\n): void {\n const traceId = segmentSpan.spanContext().traceId;\n const spanTreeMapKey = getSpanTreeMapKey(segmentSpan);\n const spansOfTrace = spanTreeMap.get(spanTreeMapKey);\n\n if (!spansOfTrace?.size) {\n spanTreeMap.delete(spanTreeMapKey);\n return;\n }\n\n const segmentSpanJson = spanToV2JSON(segmentSpan);\n\n for (const span of spansOfTrace) {\n applyCommonSpanAttributes(span, segmentSpanJson, client);\n }\n\n const { ignoreSpans } = client.getOptions();\n\n // 1. Check if the entire span tree is ignored by ignoreSpans\n if (ignoreSpans?.length && shouldIgnoreSpan(segmentSpanJson, ignoreSpans)) {\n client.recordDroppedEvent('before_send', 'span', spansOfTrace.size);\n spanTreeMap.delete(spanTreeMapKey);\n return;\n }\n\n const serializedSpans = Array.from(spansOfTrace ?? []).map(s => {\n const serialized = spanToV2JSON(s);\n // remove internal span attributes we don't need to send.\n delete serialized.attributes?.[SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME];\n return serialized;\n });\n\n const processedSpans = [];\n let ignoredSpanCount = 0;\n\n for (const span of serializedSpans) {\n // 2. Check if child spans should be ignored\n const isChildSpan = span.span_id !== segmentSpan.spanContext().spanId;\n if (ignoreSpans?.length && isChildSpan && shouldIgnoreSpan(span, ignoreSpans)) {\n reparentChildSpans(serializedSpans, span);\n ignoredSpanCount++;\n // drop this span by not adding it to the processedSpans array\n continue;\n }\n\n // 3. Apply beforeSendSpan callback\n // TODO: validate beforeSendSpan result/pass in a copy and merge afterwards\n const processedSpan = beforeSendSpan ? applyBeforeSendSpanCallback(span, beforeSendSpan) : span;\n processedSpans.push(processedSpan);\n }\n\n if (ignoredSpanCount) {\n client.recordDroppedEvent('before_send', 'span', ignoredSpanCount);\n }\n\n const batches: SpanV2JSON[][] = [];\n for (let i = 0; i < processedSpans.length; i += batchLimit) {\n batches.push(processedSpans.slice(i, i + batchLimit));\n }\n\n DEBUG_BUILD && debug.log(`Sending trace ${traceId} in ${batches.length} batch${batches.length === 1 ? '' : 'es'}`);\n\n const dsc = getDynamicSamplingContextFromSpan(segmentSpan);\n\n for (const batch of batches) {\n const envelope = createSpanV2Envelope(batch, dsc, client);\n // no need to handle client reports for network errors,\n // buffer overflows or rate limiting here. All of this is handled\n // by client and transport.\n client.sendEnvelope(envelope).then(null, reason => {\n DEBUG_BUILD && debug.error('Error while sending span stream envelope:', reason);\n });\n }\n\n spanTreeMap.delete(spanTreeMapKey);\n}\n\nfunction applyCommonSpanAttributes(span: Span, serializedSegmentSpan: SpanV2JSON, client: Client): void {\n const sdk = client.getSdkMetadata();\n const { release, environment, sendDefaultPii } = client.getOptions();\n\n const { isolationScope: spanIsolationScope, scope: spanScope } = getCapturedScopesOnSpan(span);\n\n const originalAttributeKeys = Object.keys(spanToV2JSON(span).attributes ?? {});\n\n const finalScopeData = getFinalScopeData(spanIsolationScope, spanScope);\n\n // avoid overwriting any previously set attributes (from users or potentially our SDK instrumentation)\n setAttributesIfNotPresent(span, originalAttributeKeys, {\n [SEMANTIC_ATTRIBUTE_SENTRY_RELEASE]: release,\n [SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT]: environment,\n [SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME]: serializedSegmentSpan.name,\n [SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID]: serializedSegmentSpan.span_id,\n [SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME]: sdk?.sdk?.name,\n [SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION]: sdk?.sdk?.version,\n ...(sendDefaultPii\n ? {\n [SEMANTIC_ATTRIBUTE_USER_ID]: finalScopeData.user?.id,\n [SEMANTIC_ATTRIBUTE_USER_EMAIL]: finalScopeData.user?.email,\n [SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS]: finalScopeData.user?.ip_address ?? undefined,\n [SEMANTIC_ATTRIBUTE_USER_USERNAME]: finalScopeData.user?.username,\n }\n : {}),\n });\n}\n\nfunction applyBeforeSendSpanCallback(span: SpanV2JSON, beforeSendSpan: (span: SpanV2JSON) => SpanV2JSON): SpanV2JSON {\n const modifedSpan = beforeSendSpan(span);\n if (!modifedSpan) {\n showSpanDropWarning();\n return span;\n }\n return modifedSpan;\n}\n\nfunction setAttributesIfNotPresent(span: Span, originalAttributeKeys: string[], newAttributes: SpanAttributes): void {\n Object.keys(newAttributes).forEach(key => {\n if (!originalAttributeKeys.includes(key)) {\n span.setAttribute(key, newAttributes[key]);\n }\n });\n}\n\n// TODO: Extract this to a helper in core. It's used in multiple places.\nfunction getFinalScopeData(isolationScope: Scope | undefined, scope: Scope | undefined): ScopeData {\n const finalScopeData = getGlobalScope().getScopeData();\n if (isolationScope) {\n mergeScopeData(finalScopeData, isolationScope.getScopeData());\n }\n if (scope) {\n mergeScopeData(finalScopeData, scope.getScopeData());\n }\n return finalScopeData;\n}\n"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- export interface SpanStreamingOptions {
2
- batchLimit: number;
3
- }
4
- export declare const spanStreamingIntegration: (userOptions?: Partial<SpanStreamingOptions> | undefined) => import("@sentry/core").Integration;
5
- //# sourceMappingURL=spanstreaming.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"spanstreaming.d.ts","sourceRoot":"","sources":["../../../../src/integrations/spanstreaming.ts"],"names":[],"mappings":"AA6BA,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,wBAAwB,iGA+DV,CAAC"}
@@ -1,5 +0,0 @@
1
- export interface SpanStreamingOptions {
2
- batchLimit: number;
3
- }
4
- export declare const spanStreamingIntegration: (userOptions?: Partial<SpanStreamingOptions> | undefined) => import("@sentry/core").Integration;
5
- //# sourceMappingURL=spanstreaming.d.ts.map