dd-trace 5.102.0 → 5.104.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 (201) hide show
  1. package/ext/exporters.js +1 -0
  2. package/index.d.ts +25 -3
  3. package/package.json +15 -13
  4. package/packages/datadog-esbuild/src/utils.js +2 -2
  5. package/packages/datadog-instrumentations/src/ai.js +1 -1
  6. package/packages/datadog-instrumentations/src/aws-sdk.js +2 -2
  7. package/packages/datadog-instrumentations/src/cassandra-driver.js +5 -2
  8. package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +32 -15
  9. package/packages/datadog-instrumentations/src/couchbase.js +69 -220
  10. package/packages/datadog-instrumentations/src/cucumber.js +104 -31
  11. package/packages/datadog-instrumentations/src/elasticsearch.js +4 -4
  12. package/packages/datadog-instrumentations/src/electron/preload.js +42 -0
  13. package/packages/datadog-instrumentations/src/electron.js +240 -0
  14. package/packages/datadog-instrumentations/src/fetch.js +5 -5
  15. package/packages/datadog-instrumentations/src/graphql.js +13 -17
  16. package/packages/datadog-instrumentations/src/grpc/client.js +48 -32
  17. package/packages/datadog-instrumentations/src/helpers/callback-instrumentor.js +2 -2
  18. package/packages/datadog-instrumentations/src/helpers/hook.js +4 -1
  19. package/packages/datadog-instrumentations/src/helpers/hooks.js +1 -0
  20. package/packages/datadog-instrumentations/src/helpers/instrument.js +2 -2
  21. package/packages/datadog-instrumentations/src/helpers/kafka.js +58 -0
  22. package/packages/datadog-instrumentations/src/helpers/rewriter/compiler.js +3 -2
  23. package/packages/datadog-instrumentations/src/helpers/rewriter/index.js +19 -5
  24. package/packages/datadog-instrumentations/src/helpers/rewriter/transforms.js +14 -13
  25. package/packages/datadog-instrumentations/src/http/client.js +2 -2
  26. package/packages/datadog-instrumentations/src/ioredis.js +18 -14
  27. package/packages/datadog-instrumentations/src/jest.js +382 -84
  28. package/packages/datadog-instrumentations/src/kafkajs.js +184 -174
  29. package/packages/datadog-instrumentations/src/mariadb.js +1 -1
  30. package/packages/datadog-instrumentations/src/memcached.js +2 -1
  31. package/packages/datadog-instrumentations/src/mocha/main.js +309 -56
  32. package/packages/datadog-instrumentations/src/mocha/utils.js +48 -8
  33. package/packages/datadog-instrumentations/src/mongodb-core.js +34 -9
  34. package/packages/datadog-instrumentations/src/mongoose.js +10 -12
  35. package/packages/datadog-instrumentations/src/mysql.js +2 -2
  36. package/packages/datadog-instrumentations/src/mysql2.js +1 -1
  37. package/packages/datadog-instrumentations/src/pg.js +25 -11
  38. package/packages/datadog-instrumentations/src/playwright.js +449 -60
  39. package/packages/datadog-instrumentations/src/redis.js +19 -10
  40. package/packages/datadog-instrumentations/src/router.js +4 -2
  41. package/packages/datadog-instrumentations/src/vitest.js +246 -149
  42. package/packages/datadog-plugin-apollo/src/gateway/request.js +1 -21
  43. package/packages/datadog-plugin-aws-sdk/src/base.js +18 -24
  44. package/packages/datadog-plugin-aws-sdk/src/services/cloudwatchlogs.js +1 -1
  45. package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +1 -1
  46. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +1 -1
  47. package/packages/datadog-plugin-aws-sdk/src/services/lambda.js +1 -1
  48. package/packages/datadog-plugin-aws-sdk/src/services/redshift.js +1 -1
  49. package/packages/datadog-plugin-aws-sdk/src/services/s3.js +1 -1
  50. package/packages/datadog-plugin-aws-sdk/src/services/sns.js +2 -2
  51. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +1 -1
  52. package/packages/datadog-plugin-aws-sdk/src/services/stepfunctions.js +1 -1
  53. package/packages/datadog-plugin-couchbase/src/index.js +58 -52
  54. package/packages/datadog-plugin-cucumber/src/index.js +1 -0
  55. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +239 -40
  56. package/packages/datadog-plugin-cypress/src/support.js +13 -1
  57. package/packages/datadog-plugin-elasticsearch/src/index.js +28 -8
  58. package/packages/datadog-plugin-electron/src/index.js +17 -0
  59. package/packages/datadog-plugin-electron/src/ipc.js +143 -0
  60. package/packages/datadog-plugin-electron/src/net.js +82 -0
  61. package/packages/datadog-plugin-google-cloud-pubsub/src/producer.js +27 -18
  62. package/packages/datadog-plugin-graphql/src/execute.js +6 -28
  63. package/packages/datadog-plugin-graphql/src/resolve.js +30 -35
  64. package/packages/datadog-plugin-graphql/src/tools/signature.js +32 -7
  65. package/packages/datadog-plugin-graphql/src/tools/transforms.js +118 -100
  66. package/packages/datadog-plugin-graphql/src/utils.js +33 -1
  67. package/packages/datadog-plugin-grpc/src/client.js +6 -7
  68. package/packages/datadog-plugin-grpc/src/util.js +57 -22
  69. package/packages/datadog-plugin-http/src/client.js +2 -2
  70. package/packages/datadog-plugin-jest/src/index.js +92 -50
  71. package/packages/datadog-plugin-kafkajs/src/producer.js +32 -0
  72. package/packages/datadog-plugin-mocha/src/index.js +1 -0
  73. package/packages/datadog-plugin-mongodb-core/src/index.js +70 -69
  74. package/packages/datadog-plugin-mysql/src/index.js +1 -1
  75. package/packages/datadog-plugin-openai/src/services.js +2 -1
  76. package/packages/datadog-plugin-pg/src/index.js +3 -3
  77. package/packages/datadog-plugin-playwright/src/index.js +4 -0
  78. package/packages/datadog-plugin-redis/src/index.js +54 -24
  79. package/packages/datadog-plugin-undici/src/index.js +19 -0
  80. package/packages/datadog-plugin-vitest/src/index.js +19 -7
  81. package/packages/datadog-shimmer/src/shimmer.js +35 -0
  82. package/packages/dd-trace/src/aiguard/index.js +3 -1
  83. package/packages/dd-trace/src/aiguard/sdk.js +36 -30
  84. package/packages/dd-trace/src/aiguard/tags.js +20 -11
  85. package/packages/dd-trace/src/appsec/blocking.js +2 -2
  86. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +2 -2
  87. package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +1 -1
  88. package/packages/dd-trace/src/appsec/index.js +10 -3
  89. package/packages/dd-trace/src/appsec/reporter.js +19 -5
  90. package/packages/dd-trace/src/azure_metadata.js +17 -6
  91. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/index.js +4 -4
  92. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +4 -2
  93. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/index.js +6 -4
  94. package/packages/dd-trace/src/ci-visibility/requests/fs-cache.js +1 -1
  95. package/packages/dd-trace/src/ci-visibility/requests/request.js +3 -1
  96. package/packages/dd-trace/src/ci-visibility/test-api-manual/test-api-manual-plugin.js +5 -3
  97. package/packages/dd-trace/src/config/defaults.js +3 -14
  98. package/packages/dd-trace/src/config/generated-config-types.d.ts +4 -1
  99. package/packages/dd-trace/src/config/helper.js +4 -0
  100. package/packages/dd-trace/src/config/index.js +2 -2
  101. package/packages/dd-trace/src/config/major-overrides.js +98 -0
  102. package/packages/dd-trace/src/config/parsers.js +7 -1
  103. package/packages/dd-trace/src/config/supported-configurations.json +60 -38
  104. package/packages/dd-trace/src/crashtracking/crashtracker.js +15 -3
  105. package/packages/dd-trace/src/datastreams/checkpointer.js +2 -2
  106. package/packages/dd-trace/src/datastreams/context.js +4 -2
  107. package/packages/dd-trace/src/datastreams/manager.js +1 -1
  108. package/packages/dd-trace/src/datastreams/processor.js +2 -2
  109. package/packages/dd-trace/src/debugger/devtools_client/snapshot/collector.js +2 -2
  110. package/packages/dd-trace/src/debugger/devtools_client/source-maps.js +1 -1
  111. package/packages/dd-trace/src/debugger/devtools_client/state.js +2 -1
  112. package/packages/dd-trace/src/debugger/index.js +7 -7
  113. package/packages/dd-trace/src/dogstatsd.js +2 -2
  114. package/packages/dd-trace/src/encode/0.4.js +45 -54
  115. package/packages/dd-trace/src/encode/0.5.js +34 -3
  116. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +26 -19
  117. package/packages/dd-trace/src/encode/agentless-json.js +1 -1
  118. package/packages/dd-trace/src/exporter.js +2 -0
  119. package/packages/dd-trace/src/exporters/agent/index.js +2 -1
  120. package/packages/dd-trace/src/exporters/agentless/index.js +3 -2
  121. package/packages/dd-trace/src/exporters/agentless/writer.js +2 -2
  122. package/packages/dd-trace/src/exporters/common/agents.js +3 -1
  123. package/packages/dd-trace/src/exporters/common/buffering-exporter.js +2 -1
  124. package/packages/dd-trace/src/exporters/common/request.js +4 -2
  125. package/packages/dd-trace/src/exporters/electron/index.js +49 -0
  126. package/packages/dd-trace/src/external-logger/src/index.js +2 -1
  127. package/packages/dd-trace/src/git_metadata.js +10 -8
  128. package/packages/dd-trace/src/id.js +17 -4
  129. package/packages/dd-trace/src/lambda/handler-paths.js +52 -0
  130. package/packages/dd-trace/src/lambda/handler.js +2 -4
  131. package/packages/dd-trace/src/lambda/index.js +62 -14
  132. package/packages/dd-trace/src/lambda/runtime/patch.js +21 -46
  133. package/packages/dd-trace/src/llmobs/index.js +13 -2
  134. package/packages/dd-trace/src/llmobs/plugins/bedrockruntime.js +45 -15
  135. package/packages/dd-trace/src/llmobs/sdk.js +10 -0
  136. package/packages/dd-trace/src/llmobs/writers/base.js +2 -1
  137. package/packages/dd-trace/src/log/writer.js +3 -1
  138. package/packages/dd-trace/src/noop/span.js +3 -1
  139. package/packages/dd-trace/src/openfeature/writers/base.js +2 -1
  140. package/packages/dd-trace/src/openfeature/writers/exposures.js +51 -20
  141. package/packages/dd-trace/src/opentelemetry/metrics/periodic_metric_reader.js +3 -2
  142. package/packages/dd-trace/src/opentracing/propagation/text_map.js +20 -9
  143. package/packages/dd-trace/src/payload-tagging/config/index.js +2 -2
  144. package/packages/dd-trace/src/plugins/apollo.js +3 -1
  145. package/packages/dd-trace/src/plugins/ci_plugin.js +52 -17
  146. package/packages/dd-trace/src/plugins/database.js +54 -12
  147. package/packages/dd-trace/src/plugins/index.js +1 -0
  148. package/packages/dd-trace/src/plugins/log_plugin.js +3 -1
  149. package/packages/dd-trace/src/plugins/plugin.js +2 -4
  150. package/packages/dd-trace/src/plugins/tracing.js +5 -3
  151. package/packages/dd-trace/src/plugins/util/ci.js +8 -8
  152. package/packages/dd-trace/src/plugins/util/git-cache.js +20 -18
  153. package/packages/dd-trace/src/plugins/util/git.js +3 -1
  154. package/packages/dd-trace/src/plugins/util/stacktrace.js +2 -2
  155. package/packages/dd-trace/src/plugins/util/test.js +119 -5
  156. package/packages/dd-trace/src/plugins/util/user-provided-git.js +17 -15
  157. package/packages/dd-trace/src/plugins/util/web.js +11 -0
  158. package/packages/dd-trace/src/priority_sampler.js +1 -1
  159. package/packages/dd-trace/src/profiling/profiler.js +1 -1
  160. package/packages/dd-trace/src/profiling/profilers/wall.js +1 -1
  161. package/packages/dd-trace/src/profiling/ssi-heuristics.js +1 -1
  162. package/packages/dd-trace/src/rate_limiter.js +1 -1
  163. package/packages/dd-trace/src/remote_config/scheduler.js +1 -1
  164. package/packages/dd-trace/src/ritm.js +2 -1
  165. package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +5 -8
  166. package/packages/dd-trace/src/scope.js +7 -5
  167. package/packages/dd-trace/src/serverless.js +5 -2
  168. package/packages/dd-trace/src/service-naming/extra-services.js +14 -0
  169. package/packages/dd-trace/src/service-naming/schemas/v0/messaging.js +20 -0
  170. package/packages/dd-trace/src/service-naming/schemas/v0/web.js +4 -0
  171. package/packages/dd-trace/src/service-naming/schemas/v1/messaging.js +20 -0
  172. package/packages/dd-trace/src/service-naming/schemas/v1/web.js +4 -0
  173. package/packages/dd-trace/src/span_stats.js +1 -1
  174. package/packages/dd-trace/src/telemetry/dependencies.js +1 -1
  175. package/packages/dd-trace/src/telemetry/endpoints.js +1 -1
  176. package/packages/dd-trace/src/telemetry/telemetry.js +2 -2
  177. package/packages/dd-trace/src/lambda/runtime/ritm.js +0 -133
  178. package/vendor/dist/opentracing/LICENSE +0 -201
  179. package/vendor/dist/opentracing/binary_carrier.d.ts +0 -11
  180. package/vendor/dist/opentracing/constants.d.ts +0 -61
  181. package/vendor/dist/opentracing/examples/demo/demo.d.ts +0 -2
  182. package/vendor/dist/opentracing/ext/tags.d.ts +0 -90
  183. package/vendor/dist/opentracing/functions.d.ts +0 -20
  184. package/vendor/dist/opentracing/global_tracer.d.ts +0 -14
  185. package/vendor/dist/opentracing/index.d.ts +0 -12
  186. package/vendor/dist/opentracing/index.js +0 -1
  187. package/vendor/dist/opentracing/mock_tracer/index.d.ts +0 -5
  188. package/vendor/dist/opentracing/mock_tracer/mock_context.d.ts +0 -13
  189. package/vendor/dist/opentracing/mock_tracer/mock_report.d.ts +0 -16
  190. package/vendor/dist/opentracing/mock_tracer/mock_span.d.ts +0 -50
  191. package/vendor/dist/opentracing/mock_tracer/mock_tracer.d.ts +0 -26
  192. package/vendor/dist/opentracing/noop.d.ts +0 -8
  193. package/vendor/dist/opentracing/reference.d.ts +0 -33
  194. package/vendor/dist/opentracing/span.d.ts +0 -147
  195. package/vendor/dist/opentracing/span_context.d.ts +0 -26
  196. package/vendor/dist/opentracing/test/api_compatibility.d.ts +0 -16
  197. package/vendor/dist/opentracing/test/mocktracer_implemenation.d.ts +0 -3
  198. package/vendor/dist/opentracing/test/noop_implementation.d.ts +0 -4
  199. package/vendor/dist/opentracing/test/opentracing_api.d.ts +0 -3
  200. package/vendor/dist/opentracing/test/unittest.d.ts +0 -2
  201. package/vendor/dist/opentracing/tracer.d.ts +0 -127
@@ -163,8 +163,12 @@ const DD_CAPABILITIES_TEST_MANAGEMENT_DISABLE = '_dd.library_capabilities.test_m
163
163
  const DD_CAPABILITIES_TEST_MANAGEMENT_ATTEMPT_TO_FIX = '_dd.library_capabilities.test_management.attempt_to_fix'
164
164
  const DD_CAPABILITIES_FAILED_TEST_REPLAY = '_dd.library_capabilities.failed_test_replay'
165
165
 
166
- // Library configuration request error tag
167
- const DD_CI_LIBRARY_CONFIGURATION_ERROR = '_dd.ci.library_configuration_error'
166
+ // Library configuration request error tags
167
+ const DD_CI_LIBRARY_CONFIGURATION_ERROR_SETTINGS = '_dd.ci.library_configuration_error.settings'
168
+ const DD_CI_LIBRARY_CONFIGURATION_ERROR_SKIPPABLE_TESTS = '_dd.ci.library_configuration_error.skippable_tests'
169
+ const DD_CI_LIBRARY_CONFIGURATION_ERROR_KNOWN_TESTS = '_dd.ci.library_configuration_error.known_tests'
170
+ const DD_CI_LIBRARY_CONFIGURATION_ERROR_TEST_MANAGEMENT_TESTS =
171
+ '_dd.ci.library_configuration_error.test_management_tests'
168
172
 
169
173
  const UNSUPPORTED_TIA_FRAMEWORKS = new Set(['playwright', 'vitest'])
170
174
  const MINIMUM_FRAMEWORK_VERSION_FOR_EFD = {
@@ -230,15 +234,120 @@ const BASE_LIKE_BRANCH_FILTER = /^(main|master|preprod|prod|dev|development|trun
230
234
  */
231
235
  function getSessionRequestErrorTags (sessionSpan) {
232
236
  const tags = sessionSpan?.context()._tags
237
+ const sessionRequestErrorTags = {}
233
238
  if (!tags || typeof tags !== 'object') return {}
234
- if (tags[DD_CI_LIBRARY_CONFIGURATION_ERROR] === 'true') {
239
+ if (tags[DD_CI_LIBRARY_CONFIGURATION_ERROR_SETTINGS] === 'true') {
240
+ sessionRequestErrorTags[DD_CI_LIBRARY_CONFIGURATION_ERROR_SETTINGS] = 'true'
241
+ }
242
+ if (tags[DD_CI_LIBRARY_CONFIGURATION_ERROR_SKIPPABLE_TESTS] === 'true') {
243
+ sessionRequestErrorTags[DD_CI_LIBRARY_CONFIGURATION_ERROR_SKIPPABLE_TESTS] = 'true'
244
+ }
245
+ if (tags[DD_CI_LIBRARY_CONFIGURATION_ERROR_KNOWN_TESTS] === 'true') {
246
+ sessionRequestErrorTags[DD_CI_LIBRARY_CONFIGURATION_ERROR_KNOWN_TESTS] = 'true'
247
+ }
248
+ if (tags[DD_CI_LIBRARY_CONFIGURATION_ERROR_TEST_MANAGEMENT_TESTS] === 'true') {
249
+ sessionRequestErrorTags[DD_CI_LIBRARY_CONFIGURATION_ERROR_TEST_MANAGEMENT_TESTS] = 'true'
250
+ }
251
+ return sessionRequestErrorTags
252
+ }
253
+
254
+ /**
255
+ * Returns ITR skipping-enabled tags from a test session span for propagation to child events.
256
+ * @param {{ context: () => { _tags?: Record<string, string> } } | undefined} sessionSpan
257
+ * @returns {Record<string, string>}
258
+ */
259
+ function getSessionItrSkippingEnabledTags (sessionSpan) {
260
+ const tags = sessionSpan?.context()._tags
261
+ if (!tags || typeof tags !== 'object') return {}
262
+ if (tags[TEST_ITR_SKIPPING_ENABLED] !== undefined) {
235
263
  return {
236
- [DD_CI_LIBRARY_CONFIGURATION_ERROR]: 'true',
264
+ [TEST_ITR_SKIPPING_ENABLED]: tags[TEST_ITR_SKIPPING_ENABLED],
237
265
  }
238
266
  }
239
267
  return {}
240
268
  }
241
269
 
270
+ /**
271
+ * Starts supported test optimization requests together when each feature is enabled.
272
+ *
273
+ * @param {{
274
+ * isKnownTestsEnabled: boolean,
275
+ * isTestManagementTestsEnabled: boolean,
276
+ * isSuitesSkippingEnabled?: boolean,
277
+ * getKnownTests: () => Promise<object>,
278
+ * getTestManagementTests: () => Promise<object>,
279
+ * getSkippableSuites?: () => Promise<object>
280
+ * }} options - Test optimization request factories.
281
+ * @returns {Promise<{
282
+ * knownTestsResponse?: object,
283
+ * testManagementTestsResponse?: object,
284
+ * skippableSuitesResponse?: object
285
+ * }>}
286
+ */
287
+ function getTestOptimizationRequestResults ({
288
+ isKnownTestsEnabled,
289
+ isTestManagementTestsEnabled,
290
+ isSuitesSkippingEnabled,
291
+ getKnownTests,
292
+ getTestManagementTests,
293
+ getSkippableSuites,
294
+ }) {
295
+ const requestPromises = []
296
+ const responseNames = []
297
+
298
+ if (isKnownTestsEnabled) {
299
+ addTestOptimizationRequest(requestPromises, responseNames, 'knownTestsResponse', getKnownTests)
300
+ }
301
+
302
+ if (isTestManagementTestsEnabled) {
303
+ addTestOptimizationRequest(
304
+ requestPromises,
305
+ responseNames,
306
+ 'testManagementTestsResponse',
307
+ getTestManagementTests
308
+ )
309
+ }
310
+
311
+ if (isSuitesSkippingEnabled && getSkippableSuites) {
312
+ addTestOptimizationRequest(requestPromises, responseNames, 'skippableSuitesResponse', getSkippableSuites)
313
+ }
314
+
315
+ if (!requestPromises.length) {
316
+ return Promise.resolve({})
317
+ }
318
+
319
+ return Promise.allSettled(requestPromises).then(requestResults => {
320
+ const responses = {}
321
+
322
+ for (let index = 0; index < requestResults.length; index++) {
323
+ const requestResult = requestResults[index]
324
+ responses[responseNames[index]] = requestResult.status === 'fulfilled'
325
+ ? requestResult.value
326
+ : { err: requestResult.reason }
327
+ }
328
+
329
+ return responses
330
+ })
331
+ }
332
+
333
+ /**
334
+ * Starts a test optimization request.
335
+ *
336
+ * @param {Promise<object>[]} requestPromises - Test optimization request promises.
337
+ * @param {string[]} responseNames - Response keys matching request promises.
338
+ * @param {string} responseName - Response key for this request.
339
+ * @param {() => Promise<object>} getRequest - Test optimization request factory.
340
+ */
341
+ function addTestOptimizationRequest (requestPromises, responseNames, responseName, getRequest) {
342
+ responseNames.push(responseName)
343
+
344
+ try {
345
+ requestPromises.push(Promise.resolve(getRequest()))
346
+ } catch (err) {
347
+ requestPromises.push(Promise.reject(err))
348
+ }
349
+ }
350
+
242
351
  module.exports = {
243
352
  TEST_CODE_OWNERS,
244
353
  TEST_SESSION_NAME,
@@ -350,7 +459,12 @@ module.exports = {
350
459
  TEST_MANAGEMENT_ATTEMPT_TO_FIX_PASSED,
351
460
  getLibraryCapabilitiesTags,
352
461
  getSessionRequestErrorTags,
353
- DD_CI_LIBRARY_CONFIGURATION_ERROR,
462
+ DD_CI_LIBRARY_CONFIGURATION_ERROR_SETTINGS,
463
+ DD_CI_LIBRARY_CONFIGURATION_ERROR_SKIPPABLE_TESTS,
464
+ DD_CI_LIBRARY_CONFIGURATION_ERROR_KNOWN_TESTS,
465
+ DD_CI_LIBRARY_CONFIGURATION_ERROR_TEST_MANAGEMENT_TESTS,
466
+ getSessionItrSkippingEnabledTags,
467
+ getTestOptimizationRequestResults,
354
468
  checkShaDiscrepancies,
355
469
  getPullRequestDiff,
356
470
  getPullRequestBaseBranch,
@@ -1,6 +1,6 @@
1
1
  'use strict'
2
2
 
3
- const { getValueFromEnvSources } = require('../../config/helper')
3
+ const getConfig = require('../../config')
4
4
  const {
5
5
  GIT_COMMIT_SHA,
6
6
  GIT_BRANCH,
@@ -46,20 +46,22 @@ function validateGitCommitSha (gitCommitSha) {
46
46
  }
47
47
 
48
48
  function getUserProviderGitMetadata () {
49
- const DD_GIT_COMMIT_SHA = getValueFromEnvSources('DD_GIT_COMMIT_SHA')
50
- const DD_GIT_BRANCH = getValueFromEnvSources('DD_GIT_BRANCH')
51
- const DD_GIT_REPOSITORY_URL = getValueFromEnvSources('DD_GIT_REPOSITORY_URL')
52
- const DD_GIT_TAG = getValueFromEnvSources('DD_GIT_TAG')
53
- const DD_GIT_COMMIT_MESSAGE = getValueFromEnvSources('DD_GIT_COMMIT_MESSAGE')
54
- const DD_GIT_COMMIT_COMMITTER_NAME = getValueFromEnvSources('DD_GIT_COMMIT_COMMITTER_NAME')
55
- const DD_GIT_COMMIT_COMMITTER_EMAIL = getValueFromEnvSources('DD_GIT_COMMIT_COMMITTER_EMAIL')
56
- const DD_GIT_COMMIT_COMMITTER_DATE = getValueFromEnvSources('DD_GIT_COMMIT_COMMITTER_DATE')
57
- const DD_GIT_COMMIT_AUTHOR_NAME = getValueFromEnvSources('DD_GIT_COMMIT_AUTHOR_NAME')
58
- const DD_GIT_COMMIT_AUTHOR_EMAIL = getValueFromEnvSources('DD_GIT_COMMIT_AUTHOR_EMAIL')
59
- const DD_GIT_COMMIT_AUTHOR_DATE = getValueFromEnvSources('DD_GIT_COMMIT_AUTHOR_DATE')
60
- const DD_GIT_PULL_REQUEST_BASE_BRANCH = getValueFromEnvSources('DD_GIT_PULL_REQUEST_BASE_BRANCH')
61
- const DD_GIT_PULL_REQUEST_BASE_BRANCH_SHA = getValueFromEnvSources('DD_GIT_PULL_REQUEST_BASE_BRANCH_SHA')
62
- const DD_GIT_COMMIT_HEAD_SHA = getValueFromEnvSources('DD_GIT_COMMIT_HEAD_SHA')
49
+ const {
50
+ DD_GIT_COMMIT_SHA,
51
+ DD_GIT_BRANCH,
52
+ DD_GIT_REPOSITORY_URL,
53
+ DD_GIT_TAG,
54
+ DD_GIT_COMMIT_MESSAGE,
55
+ DD_GIT_COMMIT_COMMITTER_NAME,
56
+ DD_GIT_COMMIT_COMMITTER_EMAIL,
57
+ DD_GIT_COMMIT_COMMITTER_DATE,
58
+ DD_GIT_COMMIT_AUTHOR_NAME,
59
+ DD_GIT_COMMIT_AUTHOR_EMAIL,
60
+ DD_GIT_COMMIT_AUTHOR_DATE,
61
+ DD_GIT_PULL_REQUEST_BASE_BRANCH,
62
+ DD_GIT_PULL_REQUEST_BASE_BRANCH_SHA,
63
+ DD_GIT_COMMIT_HEAD_SHA,
64
+ } = getConfig()
63
65
 
64
66
  const branch = normalizeRef(DD_GIT_BRANCH)
65
67
  let tag = normalizeRef(DD_GIT_TAG)
@@ -400,6 +400,17 @@ function addRequestTags (context, spanType) {
400
400
  }
401
401
  }
402
402
 
403
+ // Datadog scan/test markers, tagged unconditionally so the API endpoint
404
+ // reducer can keep scan/test traffic out of the API inventory.
405
+ const endpointScan = req.headers['x-datadog-endpoint-scan']
406
+ if (endpointScan !== undefined) {
407
+ span.setTag(`${HTTP_REQUEST_HEADERS}.x-datadog-endpoint-scan`, endpointScan)
408
+ }
409
+ const securityTest = req.headers['x-datadog-security-test']
410
+ if (securityTest !== undefined) {
411
+ span.setTag(`${HTTP_REQUEST_HEADERS}.x-datadog-security-test`, securityTest)
412
+ }
413
+
403
414
  addHeaders(context)
404
415
  }
405
416
 
@@ -110,7 +110,7 @@ class PrioritySampler {
110
110
  * Assigns a sampling priority to a span if not already set.
111
111
  *
112
112
  * @param {DatadogSpan} span
113
- * @param {boolean} [auto=true] - Whether to use automatic sampling if no manual tags are present.
113
+ * @param {boolean} [auto] - Whether to use automatic sampling if no manual tags are present.
114
114
  * @returns {void}
115
115
  */
116
116
  sample (span, auto = true) {
@@ -260,7 +260,7 @@ class Profiler extends EventEmitter {
260
260
  this.#lastStart = start
261
261
  if (!this.#timer || timeout !== this._timeoutInterval) {
262
262
  this.#timer = setTimeout(() => this._collect(snapshotKinds.PERIODIC), timeout)
263
- this.#timer.unref()
263
+ this.#timer.unref?.()
264
264
  } else {
265
265
  this.#timer.refresh()
266
266
  }
@@ -223,7 +223,7 @@ class NativeWallProfiler {
223
223
  asyncContextsLiveGauge.mark(totalAsyncContextCount)
224
224
  asyncContextsUsedGauge.mark(usedAsyncContextCount)
225
225
  }, this.#telemetryHeartbeatIntervalMillis)
226
- this._contextCountGaugeUpdater.unref()
226
+ this._contextCountGaugeUpdater.unref?.()
227
227
  }
228
228
 
229
229
  #enter () {
@@ -39,7 +39,7 @@ class SSIHeuristics {
39
39
  setTimeout(() => {
40
40
  this.shortLived = false
41
41
  this._maybeTriggered()
42
- }, this.longLivedThreshold).unref()
42
+ }, this.longLivedThreshold).unref?.()
43
43
 
44
44
  this._onSpanCreated = this._onSpanCreated.bind(this)
45
45
  dc.subscribe('dd-trace:span:start', this._onSpanCreated)
@@ -5,7 +5,7 @@ const limiter = require('../../../vendor/dist/limiter')
5
5
  class RateLimiter {
6
6
  /**
7
7
  * @param {number} rateLimit - Allowed units per interval. Negative means unlimited, 0 disables.
8
- * @param {'second'|'minute'|'hour'|'day'} [interval='second'] - Time window for the limiter.
8
+ * @param {'second'|'minute'|'hour'|'day'} [interval] - Time window for the limiter.
9
9
  */
10
10
  constructor (rateLimit, interval = 'second') {
11
11
  // TODO: Change rateLimit to integers. Right now these are sometimes strings, sometimes numbers.
@@ -17,7 +17,7 @@ class Scheduler {
17
17
  runAfterDelay (interval = this._interval) {
18
18
  this._timer = setTimeout(this._callback, interval, () => this.runAfterDelay())
19
19
 
20
- this._timer.unref()
20
+ this._timer.unref?.()
21
21
  }
22
22
 
23
23
  stop () {
@@ -31,6 +31,7 @@ const builtinModules = new Set(Module.builtinModules.map(stripNodePrefix))
31
31
 
32
32
  function isBuiltinModuleName (name) {
33
33
  if (typeof name !== 'string') return false
34
+ if (name === 'electron') return true
34
35
  return builtinModules.has(stripNodePrefix(name))
35
36
  }
36
37
 
@@ -101,7 +102,7 @@ function Hook (modules, options, onrequire) {
101
102
  if (cache[moduleId]) {
102
103
  // require.cache was potentially altered externally
103
104
  const cacheEntry = require.cache[filename]
104
- if (cacheEntry && cacheEntry.exports !== cache[filename].original) {
105
+ if (cacheEntry && cacheEntry.exports !== cache[moduleId].original) {
105
106
  return cacheEntry.exports
106
107
  }
107
108
 
@@ -8,14 +8,9 @@ const process = require('process')
8
8
  const { performance, PerformanceObserver, monitorEventLoopDelay } = require('perf_hooks')
9
9
  const { DogStatsDClient, MetricsAggregationClient } = require('../dogstatsd')
10
10
  const log = require('../log')
11
- const { getValueFromEnvSources } = require('../config/helper')
12
11
 
13
12
  const { NODE_MAJOR } = require('../../../../version')
14
13
  const processTags = require('../process-tags')
15
- // TODO: This environment variable may not be changed, since the agent expects a flush every ten seconds.
16
- // It is only a variable for testing. Think about alternatives.
17
- const DD_RUNTIME_METRICS_FLUSH_INTERVAL = getValueFromEnvSources('DD_RUNTIME_METRICS_FLUSH_INTERVAL') ?? '10000'
18
- const INTERVAL = Number.parseInt(DD_RUNTIME_METRICS_FLUSH_INTERVAL, 10)
19
14
 
20
15
  const eventLoopDelayResolution = 4
21
16
 
@@ -40,6 +35,8 @@ module.exports = {
40
35
  */
41
36
  start (config) {
42
37
  this.stop()
38
+ // The agent expects a flush every ten seconds, so this is for tests only.
39
+ const flushIntervalMs = config.DD_RUNTIME_METRICS_FLUSH_INTERVAL
43
40
  const clientConfig = DogStatsDClient.generateClientConfig(config)
44
41
 
45
42
  if (config.DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED) {
@@ -81,7 +78,7 @@ module.exports = {
81
78
  captureNativeMetrics(trackEventLoop, trackGc)
82
79
  captureCommonMetrics(trackEventLoop)
83
80
  client.flush()
84
- }, INTERVAL)
81
+ }, flushIntervalMs)
85
82
  } else {
86
83
  lastCpuUsage = process.cpuUsage()
87
84
 
@@ -103,10 +100,10 @@ module.exports = {
103
100
  captureEventLoopDelay()
104
101
  }
105
102
  client.flush()
106
- }, INTERVAL)
103
+ }, flushIntervalMs)
107
104
  }
108
105
 
109
- interval.unref()
106
+ interval.unref?.()
110
107
  },
111
108
 
112
109
  stop () {
@@ -2,10 +2,12 @@
2
2
 
3
3
  const { storage } = require('../../datadog-core')
4
4
 
5
+ const legacyStorage = storage('legacy')
6
+
5
7
  // TODO: refactor bind to use shimmer once the new internal tracer lands
6
8
  class Scope {
7
9
  active () {
8
- const store = storage('legacy').getStore()
10
+ const store = legacyStorage.getStore()
9
11
 
10
12
  return store?.span ?? null
11
13
  }
@@ -13,10 +15,10 @@ class Scope {
13
15
  activate (span, callback) {
14
16
  if (typeof callback !== 'function') return callback
15
17
 
16
- const oldStore = storage('legacy').getStore()
17
- const newStore = span ? storage('legacy').getStore(span._store) : oldStore
18
+ const oldStore = legacyStorage.getStore()
19
+ const newStore = span ? legacyStorage.getStore(span._store) : oldStore
18
20
 
19
- storage('legacy').enterWith({ ...newStore, span })
21
+ legacyStorage.enterWith({ ...newStore, span })
20
22
 
21
23
  try {
22
24
  return callback()
@@ -27,7 +29,7 @@ class Scope {
27
29
 
28
30
  throw e
29
31
  } finally {
30
- storage('legacy').enterWith(oldStore)
32
+ legacyStorage.enterWith(oldStore)
31
33
  }
32
34
  }
33
35
 
@@ -17,10 +17,13 @@ function getIsGCPFunction () {
17
17
  /**
18
18
  * Enable GCP Pub/Sub PUSH subscription tracing for Cloud Run (K_SERVICE present).
19
19
  * PUSH: GCP sends HTTP POST requests to the service with message data in headers.
20
+ *
21
+ * Stays on the env helper to avoid closing the
22
+ * `config -> serverless -> config` import cycle.
20
23
  */
21
24
  function enableGCPPubSubPushSubscription () {
22
- const isGCPPubSubPushSubscriptionEnabled = getValueFromEnvSources('DD_TRACE_GCP_PUBSUB_PUSH_ENABLED')
23
- return getEnvironmentVariable('K_SERVICE') !== undefined && !isFalse(isGCPPubSubPushSubscriptionEnabled)
25
+ return getEnvironmentVariable('K_SERVICE') !== undefined &&
26
+ !isFalse(getValueFromEnvSources('DD_TRACE_GCP_PUBSUB_PUSH_ENABLED'))
24
27
  }
25
28
 
26
29
  function getIsAzureFunction () {
@@ -1,13 +1,26 @@
1
1
  'use strict'
2
2
 
3
3
  const maxExtraServices = 64
4
+ /** @type {Set<string>} */
4
5
  const extraServices = new Set()
5
6
 
7
+ // 1-element cache of the most-recent argument. The sole production caller
8
+ // (`span_format.js`) runs per span; without the cache every redis / mysql
9
+ // burst pays a `Set.add` hash + probe even though the value is already
10
+ // registered.
11
+ /** @type {string | null | undefined} */
12
+ let lastSeenService
13
+
6
14
  function getExtraServices () {
7
15
  return [...extraServices]
8
16
  }
9
17
 
18
+ /**
19
+ * @param {string | null} [serviceName]
20
+ */
10
21
  function registerExtraService (serviceName) {
22
+ if (serviceName === lastSeenService) return
23
+ lastSeenService = serviceName
11
24
  if (serviceName && extraServices.size < maxExtraServices) {
12
25
  extraServices.add(serviceName)
13
26
  }
@@ -15,6 +28,7 @@ function registerExtraService (serviceName) {
15
28
 
16
29
  function clear () {
17
30
  extraServices.clear()
31
+ lastSeenService = undefined
18
32
  }
19
33
 
20
34
  module.exports = {
@@ -32,6 +32,14 @@ const messaging = {
32
32
  serviceName: ({ tracerService }) => `${tracerService}-azure-service-bus`,
33
33
  serviceSource: integrationSource('azure-service-bus'),
34
34
  },
35
+ 'electron:ipc:main:send': {
36
+ opName: () => 'electron.main.send',
37
+ serviceName: identityService,
38
+ },
39
+ 'electron:ipc:renderer:send': {
40
+ opName: () => 'electron.renderer.send',
41
+ serviceName: identityService,
42
+ },
35
43
  'google-cloud-pubsub': {
36
44
  opName: () => 'pubsub.request',
37
45
  serviceName: ({ tracerService }) => `${tracerService}-pubsub`,
@@ -79,6 +87,18 @@ const messaging = {
79
87
  serviceName: amqpServiceName,
80
88
  serviceSource: integrationSource('amqp'),
81
89
  },
90
+ 'electron:ipc:main:receive': {
91
+ opName: () => 'electron.main.receive',
92
+ serviceName: identityService,
93
+ },
94
+ 'electron:ipc:main:handle': {
95
+ opName: () => 'electron.main.handle',
96
+ serviceName: identityService,
97
+ },
98
+ 'electron:ipc:renderer:receive': {
99
+ opName: () => 'electron.renderer.receive',
100
+ serviceName: identityService,
101
+ },
82
102
  'google-cloud-pubsub': {
83
103
  opName: () => 'pubsub.receive',
84
104
  serviceName: ({ tracerService }) => `${tracerService}-pubsub`,
@@ -54,6 +54,10 @@ const web = {
54
54
  serviceName: httpPluginClientService,
55
55
  serviceSource: optionServiceSource,
56
56
  },
57
+ 'electron:net:request': {
58
+ opName: () => 'http.request',
59
+ serviceName: httpPluginClientService,
60
+ },
57
61
  },
58
62
  server: {
59
63
  'apollo.gateway.request': {
@@ -24,6 +24,14 @@ const messaging = {
24
24
  opName: () => 'azure.eventhubs.send',
25
25
  serviceName: identityService,
26
26
  },
27
+ 'electron:ipc:main:send': {
28
+ opName: () => 'electron.main.send',
29
+ serviceName: identityService,
30
+ },
31
+ 'electron:ipc:renderer:send': {
32
+ opName: () => 'electron.renderer.send',
33
+ serviceName: identityService,
34
+ },
27
35
  'google-cloud-pubsub': {
28
36
  opName: () => 'gcp.pubsub.send',
29
37
  serviceName: identityService,
@@ -53,6 +61,18 @@ const messaging = {
53
61
  consumer: {
54
62
  amqplib: amqpInbound,
55
63
  amqp10: amqpInbound,
64
+ 'electron:ipc:main:receive': {
65
+ opName: () => 'electron.main.receive',
66
+ serviceName: identityService,
67
+ },
68
+ 'electron:ipc:main:handle': {
69
+ opName: () => 'electron.main.handle',
70
+ serviceName: identityService,
71
+ },
72
+ 'electron:ipc:renderer:receive': {
73
+ opName: () => 'electron.renderer.receive',
74
+ serviceName: identityService,
75
+ },
56
76
  'google-cloud-pubsub': {
57
77
  opName: () => 'gcp.pubsub.process',
58
78
  serviceName: identityService,
@@ -48,6 +48,10 @@ const web = {
48
48
  opName: () => 'undici.request',
49
49
  serviceName: httpPluginClientService,
50
50
  },
51
+ 'electron:net:request': {
52
+ opName: () => 'http.client.request',
53
+ serviceName: httpPluginClientService,
54
+ },
51
55
  },
52
56
  server: {
53
57
  'apollo.gateway.request': {
@@ -165,7 +165,7 @@ class SpanStatsProcessor {
165
165
 
166
166
  if (this.enabled) {
167
167
  this.timer = setInterval(this.onInterval.bind(this), interval * 1e3)
168
- this.timer.unref()
168
+ this.timer.unref?.()
169
169
  }
170
170
  }
171
171
 
@@ -75,7 +75,7 @@ function waitAndSend (config, application, host) {
75
75
  if (savedDependenciesToSend.size > 0) {
76
76
  waitAndSend(config, application, host)
77
77
  }
78
- }).unref()
78
+ }).unref?.()
79
79
  }
80
80
 
81
81
  function loadAllTheLoadedModules () {
@@ -63,7 +63,7 @@ function scheduleFlush () {
63
63
  flushScheduled = true
64
64
  // this used to be setImmediate() instead, but it was making the system test flaky
65
65
  // don't ask me why
66
- setTimeout(flushAndSend).unref()
66
+ setTimeout(flushAndSend).unref?.()
67
67
  }
68
68
 
69
69
  /**
@@ -291,7 +291,7 @@ function heartbeat (config, application) {
291
291
 
292
292
  const { reqType, payload } = createPayload('app-heartbeat')
293
293
  sendData(config, application, host, reqType, payload, updateRetryData)
294
- }, config.telemetry.heartbeatInterval).unref()
294
+ }, config.telemetry.heartbeatInterval).unref?.()
295
295
  }
296
296
 
297
297
  /** @param {import('../config/config-base')} config */
@@ -307,7 +307,7 @@ function extendedHeartbeat (config) {
307
307
  heartbeatFailedDependencies = []
308
308
  }
309
309
  sendData(config, application, host, 'app-extended-heartbeat', appPayload)
310
- }, config.telemetry.extendedHeartbeatInterval).unref()
310
+ }, config.telemetry.extendedHeartbeatInterval).unref?.()
311
311
  }
312
312
 
313
313
  /**