@sentry/core 10.32.0-alpha.0 → 10.32.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 (159) hide show
  1. package/build/cjs/attributes.js +74 -57
  2. package/build/cjs/attributes.js.map +1 -1
  3. package/build/cjs/client.js +6 -11
  4. package/build/cjs/client.js.map +1 -1
  5. package/build/cjs/envelope.js +7 -41
  6. package/build/cjs/envelope.js.map +1 -1
  7. package/build/cjs/index.js +0 -29
  8. package/build/cjs/index.js.map +1 -1
  9. package/build/cjs/integrations/eventFilters.js +1 -1
  10. package/build/cjs/integrations/eventFilters.js.map +1 -1
  11. package/build/cjs/integrations/requestdata.js +6 -72
  12. package/build/cjs/integrations/requestdata.js.map +1 -1
  13. package/build/cjs/logs/internal.js +8 -54
  14. package/build/cjs/logs/internal.js.map +1 -1
  15. package/build/cjs/scope.js +12 -6
  16. package/build/cjs/scope.js.map +1 -1
  17. package/build/cjs/semanticAttributes.js +0 -36
  18. package/build/cjs/semanticAttributes.js.map +1 -1
  19. package/build/cjs/tracing/sentrySpan.js +0 -31
  20. package/build/cjs/tracing/sentrySpan.js.map +1 -1
  21. package/build/cjs/tracing/trace.js +0 -1
  22. package/build/cjs/tracing/trace.js.map +1 -1
  23. package/build/cjs/tracing/vercel-ai/index.js +0 -1
  24. package/build/cjs/tracing/vercel-ai/index.js.map +1 -1
  25. package/build/cjs/utils/applyScopeDataToEvent.js +1 -4
  26. package/build/cjs/utils/applyScopeDataToEvent.js.map +1 -1
  27. package/build/cjs/utils/featureFlags.js +0 -1
  28. package/build/cjs/utils/featureFlags.js.map +1 -1
  29. package/build/cjs/utils/should-ignore-span.js +9 -31
  30. package/build/cjs/utils/should-ignore-span.js.map +1 -1
  31. package/build/cjs/utils/spanUtils.js +2 -101
  32. package/build/cjs/utils/spanUtils.js.map +1 -1
  33. package/build/cjs/utils/version.js +1 -1
  34. package/build/cjs/utils/version.js.map +1 -1
  35. package/build/esm/attributes.js +74 -58
  36. package/build/esm/attributes.js.map +1 -1
  37. package/build/esm/client.js +1 -6
  38. package/build/esm/client.js.map +1 -1
  39. package/build/esm/envelope.js +8 -41
  40. package/build/esm/envelope.js.map +1 -1
  41. package/build/esm/index.js +3 -9
  42. package/build/esm/index.js.map +1 -1
  43. package/build/esm/integrations/eventFilters.js +1 -1
  44. package/build/esm/integrations/eventFilters.js.map +1 -1
  45. package/build/esm/integrations/requestdata.js +6 -72
  46. package/build/esm/integrations/requestdata.js.map +1 -1
  47. package/build/esm/logs/internal.js +9 -54
  48. package/build/esm/logs/internal.js.map +1 -1
  49. package/build/esm/package.json +1 -1
  50. package/build/esm/scope.js +12 -6
  51. package/build/esm/scope.js.map +1 -1
  52. package/build/esm/semanticAttributes.js +1 -26
  53. package/build/esm/semanticAttributes.js.map +1 -1
  54. package/build/esm/tracing/sentrySpan.js +1 -32
  55. package/build/esm/tracing/sentrySpan.js.map +1 -1
  56. package/build/esm/tracing/trace.js +0 -1
  57. package/build/esm/tracing/trace.js.map +1 -1
  58. package/build/esm/tracing/vercel-ai/index.js +0 -1
  59. package/build/esm/tracing/vercel-ai/index.js.map +1 -1
  60. package/build/esm/utils/applyScopeDataToEvent.js +1 -4
  61. package/build/esm/utils/applyScopeDataToEvent.js.map +1 -1
  62. package/build/esm/utils/featureFlags.js +0 -1
  63. package/build/esm/utils/featureFlags.js.map +1 -1
  64. package/build/esm/utils/should-ignore-span.js +9 -31
  65. package/build/esm/utils/should-ignore-span.js.map +1 -1
  66. package/build/esm/utils/spanUtils.js +3 -97
  67. package/build/esm/utils/spanUtils.js.map +1 -1
  68. package/build/esm/utils/version.js +1 -1
  69. package/build/esm/utils/version.js.map +1 -1
  70. package/build/types/attributes.d.ts +18 -5
  71. package/build/types/attributes.d.ts.map +1 -1
  72. package/build/types/client.d.ts +2 -40
  73. package/build/types/client.d.ts.map +1 -1
  74. package/build/types/envelope.d.ts +1 -6
  75. package/build/types/envelope.d.ts.map +1 -1
  76. package/build/types/index.d.ts +4 -10
  77. package/build/types/index.d.ts.map +1 -1
  78. package/build/types/integrations/requestdata.d.ts.map +1 -1
  79. package/build/types/logs/internal.d.ts +1 -9
  80. package/build/types/logs/internal.d.ts.map +1 -1
  81. package/build/types/scope.d.ts +12 -6
  82. package/build/types/scope.d.ts.map +1 -1
  83. package/build/types/semanticAttributes.d.ts +0 -21
  84. package/build/types/semanticAttributes.d.ts.map +1 -1
  85. package/build/types/tracing/sentrySpan.d.ts +1 -10
  86. package/build/types/tracing/sentrySpan.d.ts.map +1 -1
  87. package/build/types/tracing/vercel-ai/index.d.ts.map +1 -1
  88. package/build/types/types-hoist/envelope.d.ts +2 -22
  89. package/build/types/types-hoist/envelope.d.ts.map +1 -1
  90. package/build/types/types-hoist/link.d.ts +2 -2
  91. package/build/types/types-hoist/link.d.ts.map +1 -1
  92. package/build/types/types-hoist/log.d.ts +2 -14
  93. package/build/types/types-hoist/log.d.ts.map +1 -1
  94. package/build/types/types-hoist/options.d.ts +2 -18
  95. package/build/types/types-hoist/options.d.ts.map +1 -1
  96. package/build/types/types-hoist/span.d.ts +0 -27
  97. package/build/types/types-hoist/span.d.ts.map +1 -1
  98. package/build/types/utils/applyScopeDataToEvent.d.ts +1 -1
  99. package/build/types/utils/applyScopeDataToEvent.d.ts.map +1 -1
  100. package/build/types/utils/featureFlags.d.ts.map +1 -1
  101. package/build/types/utils/should-ignore-span.d.ts +3 -3
  102. package/build/types/utils/should-ignore-span.d.ts.map +1 -1
  103. package/build/types/utils/spanUtils.d.ts +2 -26
  104. package/build/types/utils/spanUtils.d.ts.map +1 -1
  105. package/build/types-ts3.8/attributes.d.ts +18 -5
  106. package/build/types-ts3.8/client.d.ts +2 -40
  107. package/build/types-ts3.8/envelope.d.ts +1 -6
  108. package/build/types-ts3.8/index.d.ts +4 -10
  109. package/build/types-ts3.8/logs/internal.d.ts +1 -9
  110. package/build/types-ts3.8/scope.d.ts +12 -6
  111. package/build/types-ts3.8/semanticAttributes.d.ts +0 -21
  112. package/build/types-ts3.8/tracing/sentrySpan.d.ts +1 -10
  113. package/build/types-ts3.8/types-hoist/envelope.d.ts +2 -22
  114. package/build/types-ts3.8/types-hoist/link.d.ts +2 -2
  115. package/build/types-ts3.8/types-hoist/log.d.ts +2 -14
  116. package/build/types-ts3.8/types-hoist/options.d.ts +2 -18
  117. package/build/types-ts3.8/types-hoist/span.d.ts +0 -27
  118. package/build/types-ts3.8/utils/applyScopeDataToEvent.d.ts +1 -1
  119. package/build/types-ts3.8/utils/should-ignore-span.d.ts +3 -3
  120. package/build/types-ts3.8/utils/spanUtils.d.ts +2 -26
  121. package/package.json +1 -1
  122. package/build/cjs/integrations/serverSpanStreaming.js +0 -51
  123. package/build/cjs/integrations/serverSpanStreaming.js.map +0 -1
  124. package/build/cjs/spans/captureSpan.js +0 -107
  125. package/build/cjs/spans/captureSpan.js.map +0 -1
  126. package/build/cjs/spans/spanBuffer.js +0 -117
  127. package/build/cjs/spans/spanBuffer.js.map +0 -1
  128. package/build/cjs/spans/spanFirstUtils.js +0 -187
  129. package/build/cjs/spans/spanFirstUtils.js.map +0 -1
  130. package/build/cjs/utils/beforeSendSpan.js +0 -36
  131. package/build/cjs/utils/beforeSendSpan.js.map +0 -1
  132. package/build/esm/integrations/serverSpanStreaming.js +0 -49
  133. package/build/esm/integrations/serverSpanStreaming.js.map +0 -1
  134. package/build/esm/spans/captureSpan.js +0 -105
  135. package/build/esm/spans/captureSpan.js.map +0 -1
  136. package/build/esm/spans/spanBuffer.js +0 -115
  137. package/build/esm/spans/spanBuffer.js.map +0 -1
  138. package/build/esm/spans/spanFirstUtils.js +0 -183
  139. package/build/esm/spans/spanFirstUtils.js.map +0 -1
  140. package/build/esm/utils/beforeSendSpan.js +0 -33
  141. package/build/esm/utils/beforeSendSpan.js.map +0 -1
  142. package/build/types/integrations/serverSpanStreaming.d.ts +0 -8
  143. package/build/types/integrations/serverSpanStreaming.d.ts.map +0 -1
  144. package/build/types/spans/captureSpan.d.ts +0 -10
  145. package/build/types/spans/captureSpan.d.ts.map +0 -1
  146. package/build/types/spans/spanBuffer.d.ts +0 -31
  147. package/build/types/spans/spanBuffer.d.ts.map +0 -1
  148. package/build/types/spans/spanFirstUtils.d.ts +0 -20
  149. package/build/types/spans/spanFirstUtils.d.ts.map +0 -1
  150. package/build/types/types-hoist/attributes.d.ts +0 -19
  151. package/build/types/types-hoist/attributes.d.ts.map +0 -1
  152. package/build/types/utils/beforeSendSpan.d.ts +0 -22
  153. package/build/types/utils/beforeSendSpan.d.ts.map +0 -1
  154. package/build/types-ts3.8/integrations/serverSpanStreaming.d.ts +0 -8
  155. package/build/types-ts3.8/spans/captureSpan.d.ts +0 -10
  156. package/build/types-ts3.8/spans/spanBuffer.d.ts +0 -31
  157. package/build/types-ts3.8/spans/spanFirstUtils.d.ts +0 -20
  158. package/build/types-ts3.8/types-hoist/attributes.d.ts +0 -19
  159. package/build/types-ts3.8/utils/beforeSendSpan.d.ts +0 -22
@@ -39,9 +39,6 @@ const handleCallbackErrors = require('./utils/handleCallbackErrors.js');
39
39
  const parameterize = require('./utils/parameterize.js');
40
40
  const ipAddress = require('./utils/ipAddress.js');
41
41
  const spanUtils = require('./utils/spanUtils.js');
42
- const captureSpan = require('./spans/captureSpan.js');
43
- const spanFirstUtils = require('./spans/spanFirstUtils.js');
44
- const spanBuffer = require('./spans/spanBuffer.js');
45
42
  const spanOnScope = require('./utils/spanOnScope.js');
46
43
  const parseSampleRate = require('./utils/parseSampleRate.js');
47
44
  const sdkMetadata = require('./utils/sdkMetadata.js');
@@ -66,7 +63,6 @@ const thirdPartyErrorsFilter = require('./integrations/third-party-errors-filter
66
63
  const console = require('./integrations/console.js');
67
64
  const featureFlagsIntegration = require('./integrations/featureFlags/featureFlagsIntegration.js');
68
65
  const growthbook = require('./integrations/featureFlags/growthbook.js');
69
- const serverSpanStreaming = require('./integrations/serverSpanStreaming.js');
70
66
  const profiling = require('./profiling.js');
71
67
  const fetch = require('./fetch.js');
72
68
  const trpc = require('./trpc.js');
@@ -135,8 +131,6 @@ const flushIfServerless = require('./utils/flushIfServerless.js');
135
131
  const version = require('./utils/version.js');
136
132
  const debugIds = require('./utils/debug-ids.js');
137
133
  const escapeStringForRegex = require('./vendor/escapeStringForRegex.js');
138
- const beforeSendSpan = require('./utils/beforeSendSpan.js');
139
- const shouldIgnoreSpan = require('./utils/should-ignore-span.js');
140
134
 
141
135
 
142
136
 
@@ -175,31 +169,19 @@ exports.SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME = semanticAttributes.SEMANTIC_ATTRIBUT
175
169
  exports.SEMANTIC_ATTRIBUTE_HTTP_REQUEST_METHOD = semanticAttributes.SEMANTIC_ATTRIBUTE_HTTP_REQUEST_METHOD;
176
170
  exports.SEMANTIC_ATTRIBUTE_PROFILE_ID = semanticAttributes.SEMANTIC_ATTRIBUTE_PROFILE_ID;
177
171
  exports.SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME = semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME;
178
- exports.SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT = semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT;
179
172
  exports.SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON = semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON;
180
173
  exports.SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT = semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT;
181
174
  exports.SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE = semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE;
182
175
  exports.SEMANTIC_ATTRIBUTE_SENTRY_OP = semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_OP;
183
176
  exports.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN = semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN;
184
177
  exports.SEMANTIC_ATTRIBUTE_SENTRY_PREVIOUS_TRACE_SAMPLE_RATE = semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_PREVIOUS_TRACE_SAMPLE_RATE;
185
- exports.SEMANTIC_ATTRIBUTE_SENTRY_RELEASE = semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_RELEASE;
186
178
  exports.SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE = semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE;
187
- exports.SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME = semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME;
188
- exports.SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION = semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION;
189
- exports.SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID = semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID;
190
- exports.SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME = semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME;
191
179
  exports.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE = semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE;
192
180
  exports.SEMANTIC_ATTRIBUTE_URL_FULL = semanticAttributes.SEMANTIC_ATTRIBUTE_URL_FULL;
193
- exports.SEMANTIC_ATTRIBUTE_URL_QUERY = semanticAttributes.SEMANTIC_ATTRIBUTE_URL_QUERY;
194
- exports.SEMANTIC_ATTRIBUTE_USER_EMAIL = semanticAttributes.SEMANTIC_ATTRIBUTE_USER_EMAIL;
195
- exports.SEMANTIC_ATTRIBUTE_USER_ID = semanticAttributes.SEMANTIC_ATTRIBUTE_USER_ID;
196
- exports.SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS = semanticAttributes.SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS;
197
- exports.SEMANTIC_ATTRIBUTE_USER_USERNAME = semanticAttributes.SEMANTIC_ATTRIBUTE_USER_USERNAME;
198
181
  exports.SEMANTIC_LINK_ATTRIBUTE_LINK_TYPE = semanticAttributes.SEMANTIC_LINK_ATTRIBUTE_LINK_TYPE;
199
182
  exports.createEventEnvelope = envelope.createEventEnvelope;
200
183
  exports.createSessionEnvelope = envelope.createSessionEnvelope;
201
184
  exports.createSpanEnvelope = envelope.createSpanEnvelope;
202
- exports.createSpanV2Envelope = envelope.createSpanV2Envelope;
203
185
  exports.addEventProcessor = exports$1.addEventProcessor;
204
186
  exports.captureCheckIn = exports$1.captureCheckIn;
205
187
  exports.captureEvent = exports$1.captureEvent;
@@ -265,24 +247,18 @@ exports.fmt = parameterize.fmt;
265
247
  exports.parameterize = parameterize.parameterize;
266
248
  exports.addAutoIpAddressToSession = ipAddress.addAutoIpAddressToSession;
267
249
  exports.addAutoIpAddressToUser = ipAddress.addAutoIpAddressToUser;
268
- exports.INTERNAL_getSegmentSpan = spanUtils.INTERNAL_getSegmentSpan;
269
250
  exports.addChildSpanToSpan = spanUtils.addChildSpanToSpan;
270
251
  exports.convertSpanLinksForEnvelope = spanUtils.convertSpanLinksForEnvelope;
271
252
  exports.getActiveSpan = spanUtils.getActiveSpan;
272
253
  exports.getRootSpan = spanUtils.getRootSpan;
273
254
  exports.getSpanDescendants = spanUtils.getSpanDescendants;
274
255
  exports.getStatusMessage = spanUtils.getStatusMessage;
275
- exports.showSpanDropWarning = spanUtils.showSpanDropWarning;
276
256
  exports.spanIsSampled = spanUtils.spanIsSampled;
277
257
  exports.spanTimeInputToSeconds = spanUtils.spanTimeInputToSeconds;
278
258
  exports.spanToJSON = spanUtils.spanToJSON;
279
259
  exports.spanToTraceContext = spanUtils.spanToTraceContext;
280
260
  exports.spanToTraceHeader = spanUtils.spanToTraceHeader;
281
- exports.spanToV2JSON = spanUtils.spanToV2JSON;
282
261
  exports.updateSpanName = spanUtils.updateSpanName;
283
- exports.captureSpan = captureSpan.captureSpan;
284
- exports.safeSetSpanJSONAttributes = spanFirstUtils.safeSetSpanJSONAttributes;
285
- exports.SpanBuffer = spanBuffer.SpanBuffer;
286
262
  exports._INTERNAL_setSpanForScope = spanOnScope._setSpanForScope;
287
263
  exports.parseSampleRate = parseSampleRate.parseSampleRate;
288
264
  exports.applySdkMetadata = sdkMetadata.applySdkMetadata;
@@ -314,7 +290,6 @@ exports.thirdPartyErrorFilterIntegration = thirdPartyErrorsFilter.thirdPartyErro
314
290
  exports.consoleIntegration = console.consoleIntegration;
315
291
  exports.featureFlagsIntegration = featureFlagsIntegration.featureFlagsIntegration;
316
292
  exports.growthbookIntegration = growthbook.growthbookIntegration;
317
- exports.serverSpanStreamingIntegration = serverSpanStreaming.serverSpanStreamingIntegration;
318
293
  exports.profiler = profiling.profiler;
319
294
  exports.instrumentFetchRequest = fetch.instrumentFetchRequest;
320
295
  exports.trpcMiddleware = trpc.trpcMiddleware;
@@ -502,8 +477,4 @@ exports.SDK_VERSION = version.SDK_VERSION;
502
477
  exports.getDebugImagesForResources = debugIds.getDebugImagesForResources;
503
478
  exports.getFilenameToDebugIdMap = debugIds.getFilenameToDebugIdMap;
504
479
  exports.escapeStringForRegex = escapeStringForRegex.escapeStringForRegex;
505
- exports.isV2BeforeSendSpanCallback = beforeSendSpan.isV2BeforeSendSpanCallback;
506
- exports.withStreamSpan = beforeSendSpan.withStreamSpan;
507
- exports.reparentChildSpans = shouldIgnoreSpan.reparentChildSpans;
508
- exports.shouldIgnoreSpan = shouldIgnoreSpan.shouldIgnoreSpan;
509
480
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -136,7 +136,7 @@ function _shouldDropEvent(event, options) {
136
136
  }
137
137
  } else if (event.type === 'transaction') {
138
138
  // Filter transactions
139
- // TODO (span-streaming): replace with ignoreSpans defaults (if we have any)
139
+
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 // 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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"}
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,10 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
 
3
3
  const integration = require('../integration.js');
4
- const semanticAttributes = require('../semanticAttributes.js');
5
- const spanFirstUtils = require('../spans/spanFirstUtils.js');
6
4
  const cookie = require('../utils/cookie.js');
7
- const request = require('../utils/request.js');
8
5
  const getIpAddress = require('../vendor/getIpAddress.js');
9
6
 
10
7
  // TODO(v11): Change defaults based on `sendDefaultPii`
@@ -26,67 +23,14 @@ const _requestDataIntegration = ((options = {}) => {
26
23
 
27
24
  return {
28
25
  name: INTEGRATION_NAME,
29
- setup(client) {
30
- client.on('processSegmentSpan', (spanJSON, { scopeData }) => {
31
- const { sdkProcessingMetadata = {} } = scopeData;
32
- const { normalizedRequest, ipAddress } = sdkProcessingMetadata;
33
-
34
- if (!normalizedRequest) {
35
- return;
36
- }
37
-
38
- const includeWithDefaultPiiApplied = getIncludeWithDefaultPiiApplied(
39
- include,
40
- client,
41
- );
42
-
43
- // no need to check for include after calling `extractNormalizedRequestData`
44
- // because it already internally only return what's permitted by `include`
45
- const { method, url, query_string, headers, data, env } = extractNormalizedRequestData(
46
- normalizedRequest,
47
- includeWithDefaultPiiApplied,
48
- );
49
-
50
- spanFirstUtils.safeSetSpanJSONAttributes(spanJSON, {
51
- ...(method ? { [semanticAttributes.SEMANTIC_ATTRIBUTE_HTTP_REQUEST_METHOD]: method } : {}),
52
- ...(url ? { [semanticAttributes.SEMANTIC_ATTRIBUTE_URL_FULL]: url } : {}),
53
- ...(query_string ? { [semanticAttributes.SEMANTIC_ATTRIBUTE_URL_QUERY]: query_string } : {}),
54
- ...(headers ? request.httpHeadersToSpanAttributes(headers, client.getOptions().sendDefaultPii) : {}),
55
- // TODO: Apparently, Relay still needs Pii rule updates, so I'm leaving this out for now
56
- // ...(cookies
57
- // ? Object.keys(cookies).reduce(
58
- // (acc, cookieName) => ({
59
- // ...acc,
60
- // [`http.request.header.cookie.${cookieName}`]: cookies[cookieName] ?? '',
61
- // }),
62
- // {} as Record<string, string>,
63
- // )
64
- // : {}),
65
- ...(include.ip
66
- ? {
67
- [semanticAttributes.SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS]:
68
- (normalizedRequest.headers && getIpAddress.getClientIPAddress(normalizedRequest.headers)) || ipAddress,
69
- }
70
- : {}),
71
- ...(data ? { 'http.request.body.content': data } : {}),
72
- ...(env
73
- ? {
74
- 'http.request.env': Object.keys(env).reduce(
75
- (acc, key) => ({ ...acc, [key]: env[key] ?? '' }),
76
- {} ,
77
- ),
78
- }
79
- : {}),
80
- });
81
- });
82
- },
83
- // TODO (span-streaming): probably fine to leave as-is for errors.
84
- // For spans, we go through global context -> attribute conversion or omit this completely (TBD)
85
26
  processEvent(event, _hint, client) {
86
27
  const { sdkProcessingMetadata = {} } = event;
87
28
  const { normalizedRequest, ipAddress } = sdkProcessingMetadata;
88
29
 
89
- const includeWithDefaultPiiApplied = getIncludeWithDefaultPiiApplied(include, client);
30
+ const includeWithDefaultPiiApplied = {
31
+ ...include,
32
+ ip: include.ip ?? client.getOptions().sendDefaultPii,
33
+ };
90
34
 
91
35
  if (normalizedRequest) {
92
36
  addNormalizedRequestDataToEvent(event, normalizedRequest, { ipAddress }, includeWithDefaultPiiApplied);
@@ -103,16 +47,6 @@ const _requestDataIntegration = ((options = {}) => {
103
47
  */
104
48
  const requestDataIntegration = integration.defineIntegration(_requestDataIntegration);
105
49
 
106
- const getIncludeWithDefaultPiiApplied = (
107
- include
108
-
109
- ,
110
- client,
111
- ) => ({
112
- ...include,
113
- ip: include.ip ?? client.getOptions().sendDefaultPii,
114
- });
115
-
116
50
  /**
117
51
  * Add already normalized request data to an event.
118
52
  * This mutates the passed in event.
@@ -152,14 +86,14 @@ function extractNormalizedRequestData(
152
86
 
153
87
  // Remove the Cookie header in case cookie data should not be included in the event
154
88
  if (!include.cookies) {
155
- delete headers.cookie;
89
+ delete (headers ).cookie;
156
90
  }
157
91
 
158
92
  // Remove IP headers in case IP data should not be included in the event
159
93
  if (!include.ip) {
160
94
  getIpAddress.ipHeaderNames.forEach(ipHeaderName => {
161
95
  // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
162
- delete headers[ipHeaderName];
96
+ delete (headers )[ipHeaderName];
163
97
  });
164
98
  }
165
99
  }
@@ -1 +1 @@
1
- {"version":3,"file":"requestdata.js","sources":["../../../src/integrations/requestdata.ts"],"sourcesContent":["import type { Client } from '../client';\nimport { defineIntegration } from '../integration';\nimport {\n SEMANTIC_ATTRIBUTE_HTTP_REQUEST_METHOD,\n SEMANTIC_ATTRIBUTE_URL_FULL,\n SEMANTIC_ATTRIBUTE_URL_QUERY,\n SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS,\n} from '../semanticAttributes';\nimport { safeSetSpanJSONAttributes } from '../spans/spanFirstUtils';\nimport type { Event } from '../types-hoist/event';\nimport type { IntegrationFn } from '../types-hoist/integration';\nimport type { ClientOptions } from '../types-hoist/options';\nimport type { RequestEventData } from '../types-hoist/request';\nimport type { BaseTransportOptions } from '../types-hoist/transport';\nimport { parseCookie } from '../utils/cookie';\nimport { httpHeadersToSpanAttributes } from '../utils/request';\nimport { getClientIPAddress, ipHeaderNames } from '../vendor/getIpAddress';\n\ninterface RequestDataIncludeOptions {\n cookies?: boolean;\n data?: boolean;\n headers?: boolean;\n ip?: boolean;\n query_string?: boolean;\n url?: boolean;\n}\n\ntype RequestDataIntegrationOptions = {\n /**\n * Controls what data is pulled from the request and added to the event.\n */\n include?: RequestDataIncludeOptions;\n};\n\n// TODO(v11): Change defaults based on `sendDefaultPii`\nconst DEFAULT_INCLUDE: RequestDataIncludeOptions = {\n cookies: true,\n data: true,\n headers: true,\n query_string: true,\n url: true,\n};\n\nconst INTEGRATION_NAME = 'RequestData';\n\nconst _requestDataIntegration = ((options: RequestDataIntegrationOptions = {}) => {\n const include = {\n ...DEFAULT_INCLUDE,\n ...options.include,\n };\n\n return {\n name: INTEGRATION_NAME,\n setup(client) {\n client.on('processSegmentSpan', (spanJSON, { scopeData }) => {\n const { sdkProcessingMetadata = {} } = scopeData;\n const { normalizedRequest, ipAddress } = sdkProcessingMetadata;\n\n if (!normalizedRequest) {\n return;\n }\n\n const includeWithDefaultPiiApplied: RequestDataIncludeOptions = getIncludeWithDefaultPiiApplied(\n include,\n client,\n );\n\n // no need to check for include after calling `extractNormalizedRequestData`\n // because it already internally only return what's permitted by `include`\n const { method, url, query_string, headers, data, env } = extractNormalizedRequestData(\n normalizedRequest,\n includeWithDefaultPiiApplied,\n );\n\n safeSetSpanJSONAttributes(spanJSON, {\n ...(method ? { [SEMANTIC_ATTRIBUTE_HTTP_REQUEST_METHOD]: method } : {}),\n ...(url ? { [SEMANTIC_ATTRIBUTE_URL_FULL]: url } : {}),\n ...(query_string ? { [SEMANTIC_ATTRIBUTE_URL_QUERY]: query_string } : {}),\n ...(headers ? httpHeadersToSpanAttributes(headers, client.getOptions().sendDefaultPii) : {}),\n // TODO: Apparently, Relay still needs Pii rule updates, so I'm leaving this out for now\n // ...(cookies\n // ? Object.keys(cookies).reduce(\n // (acc, cookieName) => ({\n // ...acc,\n // [`http.request.header.cookie.${cookieName}`]: cookies[cookieName] ?? '',\n // }),\n // {} as Record<string, string>,\n // )\n // : {}),\n ...(include.ip\n ? {\n [SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS]:\n (normalizedRequest.headers && getClientIPAddress(normalizedRequest.headers)) || ipAddress,\n }\n : {}),\n ...(data ? { 'http.request.body.content': data } : {}),\n ...(env\n ? {\n 'http.request.env': Object.keys(env).reduce(\n (acc, key) => ({ ...acc, [key]: env[key] ?? '' }),\n {} as Record<string, string>,\n ),\n }\n : {}),\n });\n });\n },\n // TODO (span-streaming): probably fine to leave as-is for errors.\n // For spans, we go through global context -> attribute conversion or omit this completely (TBD)\n processEvent(event, _hint, client) {\n const { sdkProcessingMetadata = {} } = event;\n const { normalizedRequest, ipAddress } = sdkProcessingMetadata;\n\n const includeWithDefaultPiiApplied: RequestDataIncludeOptions = getIncludeWithDefaultPiiApplied(include, client);\n\n if (normalizedRequest) {\n addNormalizedRequestDataToEvent(event, normalizedRequest, { ipAddress }, includeWithDefaultPiiApplied);\n }\n\n return event;\n },\n };\n}) satisfies IntegrationFn;\n\n/**\n * Add data about a request to an event. Primarily for use in Node-based SDKs, but included in `@sentry/core`\n * so it can be used in cross-platform SDKs like `@sentry/nextjs`.\n */\nexport const requestDataIntegration = defineIntegration(_requestDataIntegration);\n\nconst getIncludeWithDefaultPiiApplied = (\n include: {\n cookies?: boolean;\n data?: boolean;\n headers?: boolean;\n ip?: boolean;\n query_string?: boolean;\n url?: boolean;\n },\n client: Client<ClientOptions<BaseTransportOptions>>,\n): RequestDataIncludeOptions => ({\n ...include,\n ip: include.ip ?? client.getOptions().sendDefaultPii,\n});\n\n/**\n * Add already normalized request data to an event.\n * This mutates the passed in event.\n */\nfunction addNormalizedRequestDataToEvent(\n event: Event,\n req: RequestEventData,\n // Data that should not go into `event.request` but is somehow related to requests\n additionalData: { ipAddress?: string },\n include: RequestDataIncludeOptions,\n): void {\n event.request = {\n ...event.request,\n ...extractNormalizedRequestData(req, include),\n };\n\n if (include.ip) {\n const ip = (req.headers && getClientIPAddress(req.headers)) || additionalData.ipAddress;\n if (ip) {\n event.user = {\n ...event.user,\n ip_address: ip,\n };\n }\n }\n}\n\nfunction extractNormalizedRequestData(\n normalizedRequest: RequestEventData,\n include: RequestDataIncludeOptions,\n): RequestEventData {\n const requestData: RequestEventData = {};\n const headers = { ...normalizedRequest.headers };\n\n if (include.headers) {\n requestData.headers = headers;\n\n // Remove the Cookie header in case cookie data should not be included in the event\n if (!include.cookies) {\n delete headers.cookie;\n }\n\n // Remove IP headers in case IP data should not be included in the event\n if (!include.ip) {\n ipHeaderNames.forEach(ipHeaderName => {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete headers[ipHeaderName];\n });\n }\n }\n\n requestData.method = normalizedRequest.method;\n\n if (include.url) {\n requestData.url = normalizedRequest.url;\n }\n\n if (include.cookies) {\n const cookies = normalizedRequest.cookies || (headers?.cookie ? parseCookie(headers.cookie) : undefined);\n requestData.cookies = cookies || {};\n }\n\n if (include.query_string) {\n requestData.query_string = normalizedRequest.query_string;\n }\n\n if (include.data) {\n requestData.data = normalizedRequest.data;\n }\n\n return requestData;\n}\n"],"names":["safeSetSpanJSONAttributes","SEMANTIC_ATTRIBUTE_HTTP_REQUEST_METHOD","SEMANTIC_ATTRIBUTE_URL_FULL","SEMANTIC_ATTRIBUTE_URL_QUERY","httpHeadersToSpanAttributes","SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS","getClientIPAddress","defineIntegration","ipHeaderNames","parseCookie"],"mappings":"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"}
1
+ {"version":3,"file":"requestdata.js","sources":["../../../src/integrations/requestdata.ts"],"sourcesContent":["import { defineIntegration } from '../integration';\nimport type { Event } from '../types-hoist/event';\nimport type { IntegrationFn } from '../types-hoist/integration';\nimport type { RequestEventData } from '../types-hoist/request';\nimport { parseCookie } from '../utils/cookie';\nimport { getClientIPAddress, ipHeaderNames } from '../vendor/getIpAddress';\n\ninterface RequestDataIncludeOptions {\n cookies?: boolean;\n data?: boolean;\n headers?: boolean;\n ip?: boolean;\n query_string?: boolean;\n url?: boolean;\n}\n\ntype RequestDataIntegrationOptions = {\n /**\n * Controls what data is pulled from the request and added to the event.\n */\n include?: RequestDataIncludeOptions;\n};\n\n// TODO(v11): Change defaults based on `sendDefaultPii`\nconst DEFAULT_INCLUDE: RequestDataIncludeOptions = {\n cookies: true,\n data: true,\n headers: true,\n query_string: true,\n url: true,\n};\n\nconst INTEGRATION_NAME = 'RequestData';\n\nconst _requestDataIntegration = ((options: RequestDataIntegrationOptions = {}) => {\n const include = {\n ...DEFAULT_INCLUDE,\n ...options.include,\n };\n\n return {\n name: INTEGRATION_NAME,\n processEvent(event, _hint, client) {\n const { sdkProcessingMetadata = {} } = event;\n const { normalizedRequest, ipAddress } = sdkProcessingMetadata;\n\n const includeWithDefaultPiiApplied: RequestDataIncludeOptions = {\n ...include,\n ip: include.ip ?? client.getOptions().sendDefaultPii,\n };\n\n if (normalizedRequest) {\n addNormalizedRequestDataToEvent(event, normalizedRequest, { ipAddress }, includeWithDefaultPiiApplied);\n }\n\n return event;\n },\n };\n}) satisfies IntegrationFn;\n\n/**\n * Add data about a request to an event. Primarily for use in Node-based SDKs, but included in `@sentry/core`\n * so it can be used in cross-platform SDKs like `@sentry/nextjs`.\n */\nexport const requestDataIntegration = defineIntegration(_requestDataIntegration);\n\n/**\n * Add already normalized request data to an event.\n * This mutates the passed in event.\n */\nfunction addNormalizedRequestDataToEvent(\n event: Event,\n req: RequestEventData,\n // Data that should not go into `event.request` but is somehow related to requests\n additionalData: { ipAddress?: string },\n include: RequestDataIncludeOptions,\n): void {\n event.request = {\n ...event.request,\n ...extractNormalizedRequestData(req, include),\n };\n\n if (include.ip) {\n const ip = (req.headers && getClientIPAddress(req.headers)) || additionalData.ipAddress;\n if (ip) {\n event.user = {\n ...event.user,\n ip_address: ip,\n };\n }\n }\n}\n\nfunction extractNormalizedRequestData(\n normalizedRequest: RequestEventData,\n include: RequestDataIncludeOptions,\n): RequestEventData {\n const requestData: RequestEventData = {};\n const headers = { ...normalizedRequest.headers };\n\n if (include.headers) {\n requestData.headers = headers;\n\n // Remove the Cookie header in case cookie data should not be included in the event\n if (!include.cookies) {\n delete (headers as { cookie?: string }).cookie;\n }\n\n // Remove IP headers in case IP data should not be included in the event\n if (!include.ip) {\n ipHeaderNames.forEach(ipHeaderName => {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete (headers as Record<string, unknown>)[ipHeaderName];\n });\n }\n }\n\n requestData.method = normalizedRequest.method;\n\n if (include.url) {\n requestData.url = normalizedRequest.url;\n }\n\n if (include.cookies) {\n const cookies = normalizedRequest.cookies || (headers?.cookie ? parseCookie(headers.cookie) : undefined);\n requestData.cookies = cookies || {};\n }\n\n if (include.query_string) {\n requestData.query_string = normalizedRequest.query_string;\n }\n\n if (include.data) {\n requestData.data = normalizedRequest.data;\n }\n\n return requestData;\n}\n"],"names":["defineIntegration","getClientIPAddress","ipHeaderNames","parseCookie"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
 
3
+ const attributes = require('../attributes.js');
3
4
  const carrier = require('../carrier.js');
4
5
  const currentScopes = require('../currentScopes.js');
5
6
  const debugBuild = require('../debug-build.js');
@@ -14,51 +15,6 @@ const envelope = require('./envelope.js');
14
15
 
15
16
  const MAX_LOG_BUFFER_SIZE = 100;
16
17
 
17
- /**
18
- * Converts a log attribute to a serialized log attribute.
19
- *
20
- * @param key - The key of the log attribute.
21
- * @param value - The value of the log attribute.
22
- * @returns The serialized log attribute.
23
- */
24
- function logAttributeToSerializedLogAttribute(value) {
25
- switch (typeof value) {
26
- case 'number':
27
- if (Number.isInteger(value)) {
28
- return {
29
- value,
30
- type: 'integer',
31
- };
32
- }
33
- return {
34
- value,
35
- type: 'double',
36
- };
37
- case 'boolean':
38
- return {
39
- value,
40
- type: 'boolean',
41
- };
42
- case 'string':
43
- return {
44
- value,
45
- type: 'string',
46
- };
47
- default: {
48
- let stringValue = '';
49
- try {
50
- stringValue = JSON.stringify(value) ?? '';
51
- } catch {
52
- // Do nothing
53
- }
54
- return {
55
- value: stringValue,
56
- type: 'string',
57
- };
58
- }
59
- }
60
- }
61
-
62
18
  /**
63
19
  * Sets a log attribute if the value exists and the attribute key is not already present.
64
20
  *
@@ -139,7 +95,9 @@ function _INTERNAL_captureLog(
139
95
 
140
96
  const {
141
97
  user: { id, email, username },
98
+ attributes: scopeAttributes = {},
142
99
  } = getMergedScopeData(currentScope);
100
+
143
101
  setLogAttribute(processedLogAttributes, 'user.id', id, false);
144
102
  setLogAttribute(processedLogAttributes, 'user.email', email, false);
145
103
  setLogAttribute(processedLogAttributes, 'user.name', username, false);
@@ -190,7 +148,7 @@ function _INTERNAL_captureLog(
190
148
  return;
191
149
  }
192
150
 
193
- const { level, message, attributes = {}, severityNumber } = log;
151
+ const { level, message, attributes: logAttributes = {}, severityNumber } = log;
194
152
 
195
153
  const serializedLog = {
196
154
  timestamp: time.timestampInSeconds(),
@@ -198,13 +156,10 @@ function _INTERNAL_captureLog(
198
156
  body: message,
199
157
  trace_id: traceContext?.trace_id,
200
158
  severity_number: severityNumber ?? constants.SEVERITY_TEXT_TO_SEVERITY_NUMBER[level],
201
- attributes: Object.keys(attributes).reduce(
202
- (acc, key) => {
203
- acc[key] = logAttributeToSerializedLogAttribute(attributes[key]);
204
- return acc;
205
- },
206
- {} ,
207
- ),
159
+ attributes: {
160
+ ...attributes.serializeAttributes(scopeAttributes),
161
+ ...attributes.serializeAttributes(logAttributes, true),
162
+ },
208
163
  };
209
164
 
210
165
  captureSerializedLog(client, serializedLog);
@@ -275,5 +230,4 @@ exports._INTERNAL_captureLog = _INTERNAL_captureLog;
275
230
  exports._INTERNAL_captureSerializedLog = _INTERNAL_captureSerializedLog;
276
231
  exports._INTERNAL_flushLogsBuffer = _INTERNAL_flushLogsBuffer;
277
232
  exports._INTERNAL_getLogBuffer = _INTERNAL_getLogBuffer;
278
- exports.logAttributeToSerializedLogAttribute = logAttributeToSerializedLogAttribute;
279
233
  //# sourceMappingURL=internal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"internal.js","sources":["../../../src/logs/internal.ts"],"sourcesContent":["import { getGlobalSingleton } from '../carrier';\nimport type { Client } from '../client';\nimport { getClient, getCurrentScope, getGlobalScope, getIsolationScope } from '../currentScopes';\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { Scope, ScopeData } from '../scope';\nimport type { Integration } from '../types-hoist/integration';\nimport type { Log, SerializedLog, SerializedLogAttributeValue } from '../types-hoist/log';\nimport { mergeScopeData } from '../utils/applyScopeDataToEvent';\nimport { consoleSandbox, debug } from '../utils/debug-logger';\nimport { isParameterizedString } from '../utils/is';\nimport { _getSpanForScope } from '../utils/spanOnScope';\nimport { timestampInSeconds } from '../utils/time';\nimport { _getTraceInfoFromScope } from '../utils/trace-info';\nimport { SEVERITY_TEXT_TO_SEVERITY_NUMBER } from './constants';\nimport { createLogEnvelope } from './envelope';\n\nconst MAX_LOG_BUFFER_SIZE = 100;\n\n/**\n * Converts a log attribute to a serialized log attribute.\n *\n * @param key - The key of the log attribute.\n * @param value - The value of the log attribute.\n * @returns The serialized log attribute.\n */\nexport function logAttributeToSerializedLogAttribute(value: unknown): SerializedLogAttributeValue {\n switch (typeof value) {\n case 'number':\n if (Number.isInteger(value)) {\n return {\n value,\n type: 'integer',\n };\n }\n return {\n value,\n type: 'double',\n };\n case 'boolean':\n return {\n value,\n type: 'boolean',\n };\n case 'string':\n return {\n value,\n type: 'string',\n };\n default: {\n let stringValue = '';\n try {\n stringValue = JSON.stringify(value) ?? '';\n } catch {\n // Do nothing\n }\n return {\n value: stringValue,\n type: 'string',\n };\n }\n }\n}\n\n/**\n * Sets a log attribute if the value exists and the attribute key is not already present.\n *\n * @param logAttributes - The log attributes object to modify.\n * @param key - The attribute key to set.\n * @param value - The value to set (only sets if truthy and key not present).\n * @param setEvenIfPresent - Whether to set the attribute if it is present. Defaults to true.\n */\nfunction setLogAttribute(\n logAttributes: Record<string, unknown>,\n key: string,\n value: unknown,\n setEvenIfPresent = true,\n): void {\n if (value && (!logAttributes[key] || setEvenIfPresent)) {\n logAttributes[key] = value;\n }\n}\n\n/**\n * Captures a serialized log event and adds it to the log buffer for the given client.\n *\n * @param client - A client. Uses the current client if not provided.\n * @param serializedLog - The serialized log event to capture.\n *\n * @experimental This method will experience breaking changes. This is not yet part of\n * the stable Sentry SDK API and can be changed or removed without warning.\n */\nexport function _INTERNAL_captureSerializedLog(client: Client, serializedLog: SerializedLog): void {\n const bufferMap = _getBufferMap();\n const logBuffer = _INTERNAL_getLogBuffer(client);\n\n if (logBuffer === undefined) {\n bufferMap.set(client, [serializedLog]);\n } else {\n if (logBuffer.length >= MAX_LOG_BUFFER_SIZE) {\n _INTERNAL_flushLogsBuffer(client, logBuffer);\n bufferMap.set(client, [serializedLog]);\n } else {\n bufferMap.set(client, [...logBuffer, serializedLog]);\n }\n }\n}\n\n/**\n * Captures a log event and sends it to Sentry.\n *\n * @param log - The log event to capture.\n * @param scope - A scope. Uses the current scope if not provided.\n * @param client - A client. Uses the current client if not provided.\n * @param captureSerializedLog - A function to capture the serialized log.\n *\n * @experimental This method will experience breaking changes. This is not yet part of\n * the stable Sentry SDK API and can be changed or removed without warning.\n */\nexport function _INTERNAL_captureLog(\n beforeLog: Log,\n currentScope = getCurrentScope(),\n captureSerializedLog: (client: Client, log: SerializedLog) => void = _INTERNAL_captureSerializedLog,\n): void {\n const client = currentScope?.getClient() ?? getClient();\n if (!client) {\n DEBUG_BUILD && debug.warn('No client available to capture log.');\n return;\n }\n\n const { release, environment, enableLogs = false, beforeSendLog } = client.getOptions();\n if (!enableLogs) {\n DEBUG_BUILD && debug.warn('logging option not enabled, log will not be captured.');\n return;\n }\n\n const [, traceContext] = _getTraceInfoFromScope(client, currentScope);\n\n const processedLogAttributes = {\n ...beforeLog.attributes,\n };\n\n const {\n user: { id, email, username },\n } = getMergedScopeData(currentScope);\n setLogAttribute(processedLogAttributes, 'user.id', id, false);\n setLogAttribute(processedLogAttributes, 'user.email', email, false);\n setLogAttribute(processedLogAttributes, 'user.name', username, false);\n\n setLogAttribute(processedLogAttributes, 'sentry.release', release);\n setLogAttribute(processedLogAttributes, 'sentry.environment', environment);\n\n const { name, version } = client.getSdkMetadata()?.sdk ?? {};\n setLogAttribute(processedLogAttributes, 'sentry.sdk.name', name);\n setLogAttribute(processedLogAttributes, 'sentry.sdk.version', version);\n\n const replay = client.getIntegrationByName<\n Integration & {\n getReplayId: (onlyIfSampled?: boolean) => string;\n getRecordingMode: () => 'session' | 'buffer' | undefined;\n }\n >('Replay');\n\n const replayId = replay?.getReplayId(true);\n setLogAttribute(processedLogAttributes, 'sentry.replay_id', replayId);\n\n if (replayId && replay?.getRecordingMode() === 'buffer') {\n // We send this so we can identify cases where the replayId is attached but the replay itself might not have been sent to Sentry\n setLogAttribute(processedLogAttributes, 'sentry._internal.replay_is_buffering', true);\n }\n\n const beforeLogMessage = beforeLog.message;\n if (isParameterizedString(beforeLogMessage)) {\n const { __sentry_template_string__, __sentry_template_values__ = [] } = beforeLogMessage;\n if (__sentry_template_values__?.length) {\n processedLogAttributes['sentry.message.template'] = __sentry_template_string__;\n }\n __sentry_template_values__.forEach((param, index) => {\n processedLogAttributes[`sentry.message.parameter.${index}`] = param;\n });\n }\n\n const span = _getSpanForScope(currentScope);\n // Add the parent span ID to the log attributes for trace context\n setLogAttribute(processedLogAttributes, 'sentry.trace.parent_span_id', span?.spanContext().spanId);\n\n const processedLog = { ...beforeLog, attributes: processedLogAttributes };\n\n client.emit('beforeCaptureLog', processedLog);\n\n // We need to wrap this in `consoleSandbox` to avoid recursive calls to `beforeSendLog`\n const log = beforeSendLog ? consoleSandbox(() => beforeSendLog(processedLog)) : processedLog;\n if (!log) {\n client.recordDroppedEvent('before_send', 'log_item', 1);\n DEBUG_BUILD && debug.warn('beforeSendLog returned null, log will not be captured.');\n return;\n }\n\n const { level, message, attributes = {}, severityNumber } = log;\n\n const serializedLog: SerializedLog = {\n timestamp: timestampInSeconds(),\n level,\n body: message,\n trace_id: traceContext?.trace_id,\n severity_number: severityNumber ?? SEVERITY_TEXT_TO_SEVERITY_NUMBER[level],\n attributes: Object.keys(attributes).reduce(\n (acc, key) => {\n acc[key] = logAttributeToSerializedLogAttribute(attributes[key]);\n return acc;\n },\n {} as Record<string, SerializedLogAttributeValue>,\n ),\n };\n\n captureSerializedLog(client, serializedLog);\n\n client.emit('afterCaptureLog', log);\n}\n\n/**\n * Flushes the logs buffer to Sentry.\n *\n * @param client - A client.\n * @param maybeLogBuffer - A log buffer. Uses the log buffer for the given client if not provided.\n *\n * @experimental This method will experience breaking changes. This is not yet part of\n * the stable Sentry SDK API and can be changed or removed without warning.\n */\nexport function _INTERNAL_flushLogsBuffer(client: Client, maybeLogBuffer?: Array<SerializedLog>): void {\n const logBuffer = maybeLogBuffer ?? _INTERNAL_getLogBuffer(client) ?? [];\n if (logBuffer.length === 0) {\n return;\n }\n\n const clientOptions = client.getOptions();\n const envelope = createLogEnvelope(logBuffer, clientOptions._metadata, clientOptions.tunnel, client.getDsn());\n\n // Clear the log buffer after envelopes have been constructed.\n _getBufferMap().set(client, []);\n\n client.emit('flushLogs');\n\n // sendEnvelope should not throw\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n client.sendEnvelope(envelope);\n}\n\n/**\n * Returns the log buffer for a given client.\n *\n * Exported for testing purposes.\n *\n * @param client - The client to get the log buffer for.\n * @returns The log buffer for the given client.\n */\nexport function _INTERNAL_getLogBuffer(client: Client): Array<SerializedLog> | undefined {\n return _getBufferMap().get(client);\n}\n\n/**\n * Get the scope data for the current scope after merging with the\n * global scope and isolation scope.\n *\n * @param currentScope - The current scope.\n * @returns The scope data.\n */\nfunction getMergedScopeData(currentScope: Scope): ScopeData {\n const scopeData = getGlobalScope().getScopeData();\n mergeScopeData(scopeData, getIsolationScope().getScopeData());\n mergeScopeData(scopeData, currentScope.getScopeData());\n return scopeData;\n}\n\nfunction _getBufferMap(): WeakMap<Client, Array<SerializedLog>> {\n // The reference to the Client <> LogBuffer map is stored on the carrier to ensure it's always the same\n return getGlobalSingleton('clientToLogBufferMap', () => new WeakMap<Client, Array<SerializedLog>>());\n}\n"],"names":["getCurrentScope","getClient","DEBUG_BUILD","debug","_getTraceInfoFromScope","isParameterizedString","_getSpanForScope","consoleSandbox","timestampInSeconds","SEVERITY_TEXT_TO_SEVERITY_NUMBER","envelope","createLogEnvelope","getGlobalScope","mergeScopeData","getIsolationScope","getGlobalSingleton"],"mappings":"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"}
1
+ {"version":3,"file":"internal.js","sources":["../../../src/logs/internal.ts"],"sourcesContent":["import { serializeAttributes } from '../attributes';\nimport { getGlobalSingleton } from '../carrier';\nimport type { Client } from '../client';\nimport { getClient, getCurrentScope, getGlobalScope, getIsolationScope } from '../currentScopes';\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { Scope, ScopeData } from '../scope';\nimport type { Integration } from '../types-hoist/integration';\nimport type { Log, SerializedLog } from '../types-hoist/log';\nimport { mergeScopeData } from '../utils/applyScopeDataToEvent';\nimport { consoleSandbox, debug } from '../utils/debug-logger';\nimport { isParameterizedString } from '../utils/is';\nimport { _getSpanForScope } from '../utils/spanOnScope';\nimport { timestampInSeconds } from '../utils/time';\nimport { _getTraceInfoFromScope } from '../utils/trace-info';\nimport { SEVERITY_TEXT_TO_SEVERITY_NUMBER } from './constants';\nimport { createLogEnvelope } from './envelope';\n\nconst MAX_LOG_BUFFER_SIZE = 100;\n\n/**\n * Sets a log attribute if the value exists and the attribute key is not already present.\n *\n * @param logAttributes - The log attributes object to modify.\n * @param key - The attribute key to set.\n * @param value - The value to set (only sets if truthy and key not present).\n * @param setEvenIfPresent - Whether to set the attribute if it is present. Defaults to true.\n */\nfunction setLogAttribute(\n logAttributes: Record<string, unknown>,\n key: string,\n value: unknown,\n setEvenIfPresent = true,\n): void {\n if (value && (!logAttributes[key] || setEvenIfPresent)) {\n logAttributes[key] = value;\n }\n}\n\n/**\n * Captures a serialized log event and adds it to the log buffer for the given client.\n *\n * @param client - A client. Uses the current client if not provided.\n * @param serializedLog - The serialized log event to capture.\n *\n * @experimental This method will experience breaking changes. This is not yet part of\n * the stable Sentry SDK API and can be changed or removed without warning.\n */\nexport function _INTERNAL_captureSerializedLog(client: Client, serializedLog: SerializedLog): void {\n const bufferMap = _getBufferMap();\n const logBuffer = _INTERNAL_getLogBuffer(client);\n\n if (logBuffer === undefined) {\n bufferMap.set(client, [serializedLog]);\n } else {\n if (logBuffer.length >= MAX_LOG_BUFFER_SIZE) {\n _INTERNAL_flushLogsBuffer(client, logBuffer);\n bufferMap.set(client, [serializedLog]);\n } else {\n bufferMap.set(client, [...logBuffer, serializedLog]);\n }\n }\n}\n\n/**\n * Captures a log event and sends it to Sentry.\n *\n * @param log - The log event to capture.\n * @param scope - A scope. Uses the current scope if not provided.\n * @param client - A client. Uses the current client if not provided.\n * @param captureSerializedLog - A function to capture the serialized log.\n *\n * @experimental This method will experience breaking changes. This is not yet part of\n * the stable Sentry SDK API and can be changed or removed without warning.\n */\nexport function _INTERNAL_captureLog(\n beforeLog: Log,\n currentScope = getCurrentScope(),\n captureSerializedLog: (client: Client, log: SerializedLog) => void = _INTERNAL_captureSerializedLog,\n): void {\n const client = currentScope?.getClient() ?? getClient();\n if (!client) {\n DEBUG_BUILD && debug.warn('No client available to capture log.');\n return;\n }\n\n const { release, environment, enableLogs = false, beforeSendLog } = client.getOptions();\n if (!enableLogs) {\n DEBUG_BUILD && debug.warn('logging option not enabled, log will not be captured.');\n return;\n }\n\n const [, traceContext] = _getTraceInfoFromScope(client, currentScope);\n\n const processedLogAttributes = {\n ...beforeLog.attributes,\n };\n\n const {\n user: { id, email, username },\n attributes: scopeAttributes = {},\n } = getMergedScopeData(currentScope);\n\n setLogAttribute(processedLogAttributes, 'user.id', id, false);\n setLogAttribute(processedLogAttributes, 'user.email', email, false);\n setLogAttribute(processedLogAttributes, 'user.name', username, false);\n\n setLogAttribute(processedLogAttributes, 'sentry.release', release);\n setLogAttribute(processedLogAttributes, 'sentry.environment', environment);\n\n const { name, version } = client.getSdkMetadata()?.sdk ?? {};\n setLogAttribute(processedLogAttributes, 'sentry.sdk.name', name);\n setLogAttribute(processedLogAttributes, 'sentry.sdk.version', version);\n\n const replay = client.getIntegrationByName<\n Integration & {\n getReplayId: (onlyIfSampled?: boolean) => string;\n getRecordingMode: () => 'session' | 'buffer' | undefined;\n }\n >('Replay');\n\n const replayId = replay?.getReplayId(true);\n setLogAttribute(processedLogAttributes, 'sentry.replay_id', replayId);\n\n if (replayId && replay?.getRecordingMode() === 'buffer') {\n // We send this so we can identify cases where the replayId is attached but the replay itself might not have been sent to Sentry\n setLogAttribute(processedLogAttributes, 'sentry._internal.replay_is_buffering', true);\n }\n\n const beforeLogMessage = beforeLog.message;\n if (isParameterizedString(beforeLogMessage)) {\n const { __sentry_template_string__, __sentry_template_values__ = [] } = beforeLogMessage;\n if (__sentry_template_values__?.length) {\n processedLogAttributes['sentry.message.template'] = __sentry_template_string__;\n }\n __sentry_template_values__.forEach((param, index) => {\n processedLogAttributes[`sentry.message.parameter.${index}`] = param;\n });\n }\n\n const span = _getSpanForScope(currentScope);\n // Add the parent span ID to the log attributes for trace context\n setLogAttribute(processedLogAttributes, 'sentry.trace.parent_span_id', span?.spanContext().spanId);\n\n const processedLog = { ...beforeLog, attributes: processedLogAttributes };\n\n client.emit('beforeCaptureLog', processedLog);\n\n // We need to wrap this in `consoleSandbox` to avoid recursive calls to `beforeSendLog`\n const log = beforeSendLog ? consoleSandbox(() => beforeSendLog(processedLog)) : processedLog;\n if (!log) {\n client.recordDroppedEvent('before_send', 'log_item', 1);\n DEBUG_BUILD && debug.warn('beforeSendLog returned null, log will not be captured.');\n return;\n }\n\n const { level, message, attributes: logAttributes = {}, severityNumber } = log;\n\n const serializedLog: SerializedLog = {\n timestamp: timestampInSeconds(),\n level,\n body: message,\n trace_id: traceContext?.trace_id,\n severity_number: severityNumber ?? SEVERITY_TEXT_TO_SEVERITY_NUMBER[level],\n attributes: {\n ...serializeAttributes(scopeAttributes),\n ...serializeAttributes(logAttributes, true),\n },\n };\n\n captureSerializedLog(client, serializedLog);\n\n client.emit('afterCaptureLog', log);\n}\n\n/**\n * Flushes the logs buffer to Sentry.\n *\n * @param client - A client.\n * @param maybeLogBuffer - A log buffer. Uses the log buffer for the given client if not provided.\n *\n * @experimental This method will experience breaking changes. This is not yet part of\n * the stable Sentry SDK API and can be changed or removed without warning.\n */\nexport function _INTERNAL_flushLogsBuffer(client: Client, maybeLogBuffer?: Array<SerializedLog>): void {\n const logBuffer = maybeLogBuffer ?? _INTERNAL_getLogBuffer(client) ?? [];\n if (logBuffer.length === 0) {\n return;\n }\n\n const clientOptions = client.getOptions();\n const envelope = createLogEnvelope(logBuffer, clientOptions._metadata, clientOptions.tunnel, client.getDsn());\n\n // Clear the log buffer after envelopes have been constructed.\n _getBufferMap().set(client, []);\n\n client.emit('flushLogs');\n\n // sendEnvelope should not throw\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n client.sendEnvelope(envelope);\n}\n\n/**\n * Returns the log buffer for a given client.\n *\n * Exported for testing purposes.\n *\n * @param client - The client to get the log buffer for.\n * @returns The log buffer for the given client.\n */\nexport function _INTERNAL_getLogBuffer(client: Client): Array<SerializedLog> | undefined {\n return _getBufferMap().get(client);\n}\n\n/**\n * Get the scope data for the current scope after merging with the\n * global scope and isolation scope.\n *\n * @param currentScope - The current scope.\n * @returns The scope data.\n */\nfunction getMergedScopeData(currentScope: Scope): ScopeData {\n const scopeData = getGlobalScope().getScopeData();\n mergeScopeData(scopeData, getIsolationScope().getScopeData());\n mergeScopeData(scopeData, currentScope.getScopeData());\n return scopeData;\n}\n\nfunction _getBufferMap(): WeakMap<Client, Array<SerializedLog>> {\n // The reference to the Client <> LogBuffer map is stored on the carrier to ensure it's always the same\n return getGlobalSingleton('clientToLogBufferMap', () => new WeakMap<Client, Array<SerializedLog>>());\n}\n"],"names":["getCurrentScope","getClient","DEBUG_BUILD","debug","_getTraceInfoFromScope","isParameterizedString","_getSpanForScope","consoleSandbox","timestampInSeconds","SEVERITY_TEXT_TO_SEVERITY_NUMBER","serializeAttributes","envelope","createLogEnvelope","getGlobalScope","mergeScopeData","getIsolationScope","getGlobalSingleton"],"mappings":"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"}
@@ -224,8 +224,12 @@ class Scope {
224
224
  /**
225
225
  * Sets attributes onto the scope.
226
226
  *
227
- * TODO:
228
- * Currently, these attributes are not applied to any telemetry data but they will be in the future.
227
+ * These attributes are currently only applied to logs.
228
+ * In the future, they will also be applied to metrics and spans.
229
+ *
230
+ * Important: For now, only strings, numbers and boolean attributes are supported, despite types allowing for
231
+ * more complex attribute types. We'll add this support in the future but already specify the wider type to
232
+ * avoid a breaking change in the future.
229
233
  *
230
234
  * @param newAttributes - The attributes to set on the scope. You can either pass in key-value pairs, or
231
235
  * an object with a `value` and an optional `unit` (if applicable to your attribute).
@@ -235,7 +239,6 @@ class Scope {
235
239
  * scope.setAttributes({
236
240
  * is_admin: true,
237
241
  * payment_selection: 'credit_card',
238
- * clicked_products: [130, 554, 292],
239
242
  * render_duration: { value: 'render_duration', unit: 'ms' },
240
243
  * });
241
244
  * ```
@@ -253,8 +256,12 @@ class Scope {
253
256
  /**
254
257
  * Sets an attribute onto the scope.
255
258
  *
256
- * TODO:
257
- * Currently, these attributes are not applied to any telemetry data but they will be in the future.
259
+ * These attributes are currently only applied to logs.
260
+ * In the future, they will also be applied to metrics and spans.
261
+ *
262
+ * Important: For now, only strings, numbers and boolean attributes are supported, despite types allowing for
263
+ * more complex attribute types. We'll add this support in the future but already specify the wider type to
264
+ * avoid a breaking change in the future.
258
265
  *
259
266
  * @param key - The attribute key.
260
267
  * @param value - the attribute value. You can either pass in a raw value, or an attribute
@@ -263,7 +270,6 @@ class Scope {
263
270
  * @example
264
271
  * ```typescript
265
272
  * scope.setAttribute('is_admin', true);
266
- * scope.setAttribute('clicked_products', [130, 554, 292]);
267
273
  * scope.setAttribute('render_duration', { value: 'render_duration', unit: 'ms' });
268
274
  * ```
269
275
  */