dd-trace 5.54.0 → 5.55.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 (178) hide show
  1. package/ci/cypress/plugin.js +8 -0
  2. package/ci/cypress/polyfills.js +23 -0
  3. package/ci/init.js +8 -7
  4. package/initialize.mjs +2 -2
  5. package/package.json +6 -6
  6. package/packages/datadog-code-origin/index.js +22 -4
  7. package/packages/datadog-core/src/utils/src/kebabcase.js +3 -3
  8. package/packages/datadog-instrumentations/src/cassandra-driver.js +5 -6
  9. package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +2 -3
  10. package/packages/datadog-instrumentations/src/cookie-parser.js +1 -1
  11. package/packages/datadog-instrumentations/src/couchbase.js +3 -6
  12. package/packages/datadog-instrumentations/src/cucumber.js +21 -28
  13. package/packages/datadog-instrumentations/src/dns.js +4 -4
  14. package/packages/datadog-instrumentations/src/elasticsearch.js +9 -10
  15. package/packages/datadog-instrumentations/src/fastify.js +7 -9
  16. package/packages/datadog-instrumentations/src/google-cloud-pubsub.js +14 -16
  17. package/packages/datadog-instrumentations/src/hapi.js +10 -11
  18. package/packages/datadog-instrumentations/src/helpers/fetch.js +4 -5
  19. package/packages/datadog-instrumentations/src/helpers/hook.js +1 -2
  20. package/packages/datadog-instrumentations/src/helpers/register.js +6 -5
  21. package/packages/datadog-instrumentations/src/jest.js +67 -98
  22. package/packages/datadog-instrumentations/src/koa.js +2 -3
  23. package/packages/datadog-instrumentations/src/mariadb.js +11 -4
  24. package/packages/datadog-instrumentations/src/mocha/main.js +79 -75
  25. package/packages/datadog-instrumentations/src/mocha.js +3 -1
  26. package/packages/datadog-instrumentations/src/mysql.js +11 -2
  27. package/packages/datadog-instrumentations/src/nyc.js +2 -1
  28. package/packages/datadog-instrumentations/src/openai.js +2 -2
  29. package/packages/datadog-instrumentations/src/otel-sdk-trace.js +4 -3
  30. package/packages/datadog-instrumentations/src/pg.js +2 -3
  31. package/packages/datadog-instrumentations/src/playwright.js +19 -22
  32. package/packages/datadog-instrumentations/src/protobufjs.js +3 -4
  33. package/packages/datadog-instrumentations/src/redis.js +1 -1
  34. package/packages/datadog-instrumentations/src/restify.js +9 -13
  35. package/packages/datadog-instrumentations/src/router.js +12 -11
  36. package/packages/datadog-instrumentations/src/tedious.js +1 -2
  37. package/packages/datadog-instrumentations/src/vitest.js +15 -29
  38. package/packages/datadog-plugin-avsc/src/schema_iterator.js +12 -12
  39. package/packages/datadog-plugin-aws-sdk/src/base.js +12 -8
  40. package/packages/datadog-plugin-aws-sdk/src/services/cloudwatchlogs.js +3 -5
  41. package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +12 -20
  42. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +4 -5
  43. package/packages/datadog-plugin-aws-sdk/src/services/lambda.js +3 -5
  44. package/packages/datadog-plugin-aws-sdk/src/services/redshift.js +3 -5
  45. package/packages/datadog-plugin-aws-sdk/src/services/s3.js +3 -5
  46. package/packages/datadog-plugin-aws-sdk/src/services/sns.js +1 -2
  47. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +7 -10
  48. package/packages/datadog-plugin-cucumber/src/index.js +3 -2
  49. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +2 -1
  50. package/packages/datadog-plugin-dd-trace-api/src/index.js +2 -1
  51. package/packages/datadog-plugin-elasticsearch/src/index.js +1 -1
  52. package/packages/datadog-plugin-google-cloud-vertexai/src/tracing.js +1 -1
  53. package/packages/datadog-plugin-graphql/src/index.js +3 -2
  54. package/packages/datadog-plugin-graphql/src/resolve.js +17 -10
  55. package/packages/datadog-plugin-http/src/client.js +5 -6
  56. package/packages/datadog-plugin-http2/src/client.js +7 -8
  57. package/packages/datadog-plugin-jest/src/index.js +3 -2
  58. package/packages/datadog-plugin-mocha/src/index.js +6 -1
  59. package/packages/datadog-plugin-mongodb-core/src/index.js +2 -1
  60. package/packages/datadog-plugin-mysql/src/index.js +11 -0
  61. package/packages/datadog-plugin-next/src/index.js +1 -1
  62. package/packages/datadog-plugin-openai/src/tracing.js +2 -4
  63. package/packages/datadog-plugin-playwright/src/index.js +3 -2
  64. package/packages/datadog-plugin-protobufjs/src/schema_iterator.js +8 -9
  65. package/packages/datadog-plugin-redis/src/index.js +1 -3
  66. package/packages/datadog-plugin-vitest/src/index.js +5 -4
  67. package/packages/dd-trace/src/appsec/iast/analyzers/analyzers.js +0 -1
  68. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-password-rules.js +0 -1
  69. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secret-rules.js +0 -1
  70. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secrets-rules.js +0 -1
  71. package/packages/dd-trace/src/appsec/iast/analyzers/missing-header-analyzer.js +1 -2
  72. package/packages/dd-trace/src/appsec/iast/security-controls/index.js +11 -12
  73. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +1 -1
  74. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +2 -1
  75. package/packages/dd-trace/src/appsec/iast/telemetry/span-tags.js +1 -1
  76. package/packages/dd-trace/src/appsec/iast/telemetry/verbosity.js +1 -2
  77. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/range-utils.js +10 -11
  78. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-handler.js +0 -4
  79. package/packages/dd-trace/src/appsec/iast/vulnerabilities.js +0 -1
  80. package/packages/dd-trace/src/appsec/index.js +4 -4
  81. package/packages/dd-trace/src/appsec/reporter.js +5 -7
  82. package/packages/dd-trace/src/appsec/sdk/set_user.js +2 -2
  83. package/packages/dd-trace/src/appsec/sdk/track_event.js +3 -3
  84. package/packages/dd-trace/src/appsec/telemetry/index.js +31 -1
  85. package/packages/dd-trace/src/appsec/waf/waf_context_wrapper.js +6 -2
  86. package/packages/dd-trace/src/azure_metadata.js +8 -3
  87. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/index.js +8 -7
  88. package/packages/dd-trace/src/ci-visibility/early-flake-detection/get-known-tests.js +2 -1
  89. package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +2 -1
  90. package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +2 -1
  91. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +2 -1
  92. package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +4 -3
  93. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/index.js +7 -6
  94. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +2 -1
  95. package/packages/dd-trace/src/ci-visibility/log-submission/log-submission-plugin.js +4 -3
  96. package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +4 -3
  97. package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +2 -1
  98. package/packages/dd-trace/src/config-helper.js +89 -0
  99. package/packages/dd-trace/src/config.js +77 -78
  100. package/packages/dd-trace/src/config_stable.js +7 -4
  101. package/packages/dd-trace/src/datastreams/fnv.js +1 -1
  102. package/packages/dd-trace/src/datastreams/schemas/schema_builder.js +6 -6
  103. package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +1 -2
  104. package/packages/dd-trace/src/debugger/devtools_client/condition.js +1 -2
  105. package/packages/dd-trace/src/debugger/devtools_client/index.js +2 -1
  106. package/packages/dd-trace/src/debugger/devtools_client/send.js +3 -2
  107. package/packages/dd-trace/src/debugger/devtools_client/snapshot/collector.js +1 -2
  108. package/packages/dd-trace/src/debugger/devtools_client/snapshot/processor.js +3 -4
  109. package/packages/dd-trace/src/debugger/devtools_client/snapshot/redaction.js +1 -1
  110. package/packages/dd-trace/src/debugger/index.js +1 -0
  111. package/packages/dd-trace/src/dogstatsd.js +2 -2
  112. package/packages/dd-trace/src/encode/0.4.js +5 -2
  113. package/packages/dd-trace/src/encode/0.5.js +3 -5
  114. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +5 -5
  115. package/packages/dd-trace/src/exporter.js +2 -1
  116. package/packages/dd-trace/src/exporters/common/docker.js +3 -2
  117. package/packages/dd-trace/src/exporters/common/request.js +4 -1
  118. package/packages/dd-trace/src/exporters/common/util.js +3 -1
  119. package/packages/dd-trace/src/id.js +3 -3
  120. package/packages/dd-trace/src/index.js +4 -3
  121. package/packages/dd-trace/src/lambda/handler.js +2 -1
  122. package/packages/dd-trace/src/lambda/index.js +2 -1
  123. package/packages/dd-trace/src/lambda/runtime/patch.js +3 -2
  124. package/packages/dd-trace/src/lambda/runtime/ritm.js +3 -2
  125. package/packages/dd-trace/src/llmobs/constants/tags.js +1 -0
  126. package/packages/dd-trace/src/llmobs/index.js +21 -5
  127. package/packages/dd-trace/src/llmobs/noop.js +18 -20
  128. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/index.js +11 -13
  129. package/packages/dd-trace/src/llmobs/plugins/openai.js +1 -2
  130. package/packages/dd-trace/src/llmobs/sdk.js +2 -1
  131. package/packages/dd-trace/src/llmobs/span_processor.js +1 -1
  132. package/packages/dd-trace/src/llmobs/tagger.js +19 -6
  133. package/packages/dd-trace/src/llmobs/writers/base.js +1 -1
  134. package/packages/dd-trace/src/log/index.js +5 -4
  135. package/packages/dd-trace/src/log/writer.js +1 -2
  136. package/packages/dd-trace/src/msgpack/encoder.js +3 -3
  137. package/packages/dd-trace/src/noop/span.js +1 -1
  138. package/packages/dd-trace/src/opentelemetry/tracer.js +1 -1
  139. package/packages/dd-trace/src/opentracing/propagation/log.js +4 -5
  140. package/packages/dd-trace/src/opentracing/propagation/text_map.js +17 -18
  141. package/packages/dd-trace/src/opentracing/span.js +7 -6
  142. package/packages/dd-trace/src/payload-tagging/config/index.js +17 -21
  143. package/packages/dd-trace/src/plugin_manager.js +4 -3
  144. package/packages/dd-trace/src/plugins/ci_plugin.js +25 -1
  145. package/packages/dd-trace/src/plugins/plugin.js +1 -1
  146. package/packages/dd-trace/src/plugins/util/ci.js +7 -7
  147. package/packages/dd-trace/src/plugins/util/git.js +1 -1
  148. package/packages/dd-trace/src/plugins/util/llm.js +2 -2
  149. package/packages/dd-trace/src/plugins/util/stacktrace.js +8 -1
  150. package/packages/dd-trace/src/plugins/util/test.js +4 -3
  151. package/packages/dd-trace/src/plugins/util/user-provided-git.js +2 -1
  152. package/packages/dd-trace/src/plugins/util/web.js +3 -4
  153. package/packages/dd-trace/src/priority_sampler.js +46 -35
  154. package/packages/dd-trace/src/profiling/config.js +12 -32
  155. package/packages/dd-trace/src/profiling/exporter_cli.js +20 -20
  156. package/packages/dd-trace/src/profiling/exporters/agent.js +1 -1
  157. package/packages/dd-trace/src/profiling/exporters/event_serializer.js +2 -1
  158. package/packages/dd-trace/src/profiling/index.js +2 -1
  159. package/packages/dd-trace/src/profiling/profiler.js +7 -4
  160. package/packages/dd-trace/src/profiling/ssi-telemetry-mock-profiler.js +3 -1
  161. package/packages/dd-trace/src/profiling/tagger.js +22 -12
  162. package/packages/dd-trace/src/proxy.js +2 -1
  163. package/packages/dd-trace/src/ritm.js +4 -4
  164. package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +3 -2
  165. package/packages/dd-trace/src/sampler.js +10 -2
  166. package/packages/dd-trace/src/serverless.js +11 -4
  167. package/packages/dd-trace/src/span_processor.js +2 -1
  168. package/packages/dd-trace/src/standalone/tracesource.js +1 -2
  169. package/packages/dd-trace/src/standalone/tracesource_priority_sampler.js +1 -2
  170. package/packages/dd-trace/src/startup-log.js +5 -17
  171. package/packages/dd-trace/src/supported-configurations.json +439 -0
  172. package/packages/dd-trace/src/telemetry/dependencies.js +62 -57
  173. package/packages/dd-trace/src/telemetry/send-data.js +7 -6
  174. package/packages/dd-trace/src/telemetry/telemetry.js +12 -25
  175. package/packages/dd-trace/src/tracer.js +3 -7
  176. package/packages/dd-trace/src/util.js +0 -5
  177. package/packages/dd-trace/src/appsec/iast/analyzers/header-injection-analyzer.js +0 -120
  178. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/header-sensitive-analyzer.js +0 -20
@@ -178,9 +178,8 @@ function wrapPoolQuery (query) {
178
178
  cb(error)
179
179
 
180
180
  return
181
- } else {
182
- return Promise.reject(error)
183
181
  }
182
+ return Promise.reject(error)
184
183
  }
185
184
 
186
185
  if (typeof cb === 'function') {
@@ -192,7 +191,7 @@ function wrapPoolQuery (query) {
192
191
 
193
192
  const retval = query.apply(this, arguments)
194
193
 
195
- if (retval && retval.then) {
194
+ if (retval?.then) {
196
195
  retval.then(() => {
197
196
  finish()
198
197
  }).catch(() => {
@@ -1,6 +1,6 @@
1
1
  const satisfies = require('semifies')
2
2
 
3
- const { addHook, channel, AsyncResource } = require('./helpers/instrument')
3
+ const { addHook, channel } = require('./helpers/instrument')
4
4
  const shimmer = require('../../datadog-shimmer')
5
5
  const {
6
6
  parseAnnotations,
@@ -33,7 +33,6 @@ const testSuiteToCtx = new Map()
33
33
  const testSuiteToTestStatuses = new Map()
34
34
  const testSuiteToErrors = new Map()
35
35
  const testsToTestStatuses = new Map()
36
- const testSessionAsyncResource = new AsyncResource('bound-anonymous-fn')
37
36
 
38
37
  let applyRepeatEachIndex = null
39
38
 
@@ -109,7 +108,12 @@ function deepCloneSuite (suite, filterTest, tags = []) {
109
108
 
110
109
  function getTestsBySuiteFromTestGroups (testGroups) {
111
110
  return testGroups.reduce((acc, { requireFile, tests }) => {
112
- acc[requireFile] = acc[requireFile] ? acc[requireFile].concat(tests) : tests
111
+ if (acc[requireFile]) {
112
+ acc[requireFile].push(...tests)
113
+ } else {
114
+ // Copy the tests, otherwise we modify the original tests
115
+ acc[requireFile] = [...tests]
116
+ }
113
117
  return acc
114
118
  }, {})
115
119
  }
@@ -238,9 +242,7 @@ function getTestByTestId (dispatcher, testId) {
238
242
 
239
243
  function getChannelPromise (channelToPublishTo, params) {
240
244
  return new Promise(resolve => {
241
- testSessionAsyncResource.runInAsyncScope(() => {
242
- channelToPublishTo.publish({ onDone: resolve, ...params })
243
- })
245
+ channelToPublishTo.publish({ onDone: resolve, ...params })
244
246
  })
245
247
  }
246
248
 
@@ -417,7 +419,7 @@ function dispatcherRunWrapperNew (run) {
417
419
  // Not available from >=1.44.0
418
420
  this._ddAllTests = testGroups.flatMap(g => g.tests)
419
421
  }
420
- remainingTestsByFile = getTestsBySuiteFromTestGroups(arguments[0])
422
+ remainingTestsByFile = getTestsBySuiteFromTestGroups(testGroups)
421
423
  return run.apply(this, arguments)
422
424
  }
423
425
  }
@@ -511,9 +513,7 @@ function runnerHook (runnerExport, playwrightVersion) {
511
513
 
512
514
  const processArgv = process.argv.slice(2).join(' ')
513
515
  const command = `playwright ${processArgv}`
514
- testSessionAsyncResource.runInAsyncScope(() => {
515
- testSessionStartCh.publish({ command, frameworkVersion: playwrightVersion, rootDir })
516
- })
516
+ testSessionStartCh.publish({ command, frameworkVersion: playwrightVersion, rootDir })
517
517
 
518
518
  try {
519
519
  const { err, libraryConfig } = await getChannelPromise(libraryConfigurationCh)
@@ -630,13 +630,11 @@ function runnerHook (runnerExport, playwrightVersion) {
630
630
  const flushWait = new Promise(resolve => {
631
631
  onDone = resolve
632
632
  })
633
- testSessionAsyncResource.runInAsyncScope(() => {
634
- testSessionFinishCh.publish({
635
- status: STATUS_TO_TEST_STATUS[sessionStatus],
636
- isEarlyFlakeDetectionEnabled,
637
- isTestManagementTestsEnabled,
638
- onDone
639
- })
633
+ testSessionFinishCh.publish({
634
+ status: STATUS_TO_TEST_STATUS[sessionStatus],
635
+ isEarlyFlakeDetectionEnabled,
636
+ isTestManagementTestsEnabled,
637
+ onDone
640
638
  })
641
639
  await flushWait
642
640
 
@@ -754,8 +752,7 @@ addHook({
754
752
  }
755
753
 
756
754
  if (isImpactedTestsEnabled) {
757
- for (const test of allTests) {
758
- const isNew = isKnownTestsEnabled && isNewTest(test)
755
+ await Promise.all(allTests.map(async (test) => {
759
756
  const { isModified } = await getChannelPromise(isModifiedCh, {
760
757
  filePath: test._requireFile,
761
758
  modifiedTests
@@ -764,6 +761,7 @@ addHook({
764
761
  test._ddIsModified = true
765
762
  }
766
763
  if (isEarlyFlakeDetectionEnabled && test.expectedStatus !== 'skipped') {
764
+ const isNew = isKnownTestsEnabled && isNewTest(test)
767
765
  const fileSuite = getSuiteType(test, 'file')
768
766
  const projectSuite = getSuiteType(test, 'project')
769
767
  // If something change in the file, all tests in the file are impacted
@@ -778,7 +776,7 @@ addHook({
778
776
  projectSuite._addSuite(copyFileSuite)
779
777
  }
780
778
  }
781
- }
779
+ }))
782
780
  }
783
781
 
784
782
  if (isKnownTestsEnabled) {
@@ -939,9 +937,8 @@ addHook({
939
937
  if (window.DD_RUM && window.DD_RUM.stopSession) {
940
938
  window.DD_RUM.stopSession()
941
939
  return true
942
- } else {
943
- return false
944
940
  }
941
+ return false
945
942
  })
946
943
 
947
944
  if (isRumActive) {
@@ -102,11 +102,10 @@ addHook({
102
102
  wrapProtobufClasses(root)
103
103
  return root
104
104
  })
105
- } else {
106
- // If result is not a promise, directly wrap the protobuf classes
107
- wrapProtobufClasses(result)
108
- return result
109
105
  }
106
+ // If result is not a promise, directly wrap the protobuf classes
107
+ wrapProtobufClasses(result)
108
+ return result
110
109
  })
111
110
 
112
111
  shimmer.wrap(protobuf.Root.prototype, 'loadSync', original => function () {
@@ -45,7 +45,7 @@ function wrapCommandQueueClass (cls) {
45
45
  try {
46
46
  const parsed = new URL(createClientUrl)
47
47
  if (parsed) {
48
- this._url = { host: parsed.hostname, port: +parsed.port || 6379 }
48
+ this._url = { host: parsed.hostname, port: Number(parsed.port) || 6379 }
49
49
  }
50
50
  } catch {
51
51
  // ignore
@@ -20,25 +20,21 @@ function wrapSetupRequest (setupRequest) {
20
20
  }
21
21
 
22
22
  function wrapMethod (method) {
23
- return function (path, ...rest) {
24
- const middleware = wrapMiddleware(rest)
23
+ return function (path, ...middlewares) {
24
+ const wrappedMiddlewares = middlewares.map(wrapFn)
25
25
 
26
- return method.apply(this, [path].concat(middleware))
26
+ return method.apply(this, [path, ...wrappedMiddlewares])
27
27
  }
28
28
  }
29
29
 
30
30
  function wrapHandler (method) {
31
- return function () {
32
- return method.apply(this, wrapMiddleware(arguments))
31
+ return function (...middlewares) {
32
+ return method.apply(this, middlewares.map(wrapFn))
33
33
  }
34
34
  }
35
35
 
36
- function wrapMiddleware (middleware) {
37
- return Array.prototype.map.call(middleware, wrapFn)
38
- }
39
-
40
36
  function wrapFn (fn) {
41
- if (Array.isArray(fn)) return wrapMiddleware(fn)
37
+ if (Array.isArray(fn)) return fn.map(wrapFn)
42
38
 
43
39
  return shimmer.wrapFunction(fn, fn => function (req, res, next) {
44
40
  if (typeof next === 'function') {
@@ -51,11 +47,11 @@ function wrapFn (fn) {
51
47
 
52
48
  try {
53
49
  const result = fn.apply(this, arguments)
54
- if (result !== null && typeof result === 'object' && typeof result.then === 'function') {
55
- return result.then(function () {
50
+ if (typeof result?.then === 'function') {
51
+ return result.then(function (result) {
56
52
  nextChannel.publish({ req })
57
53
  finishChannel.publish({ req })
58
- return arguments[0]
54
+ return result
59
55
  }).catch(function (error) {
60
56
  errorChannel.publish({ req, error })
61
57
  nextChannel.publish({ req })
@@ -13,10 +13,6 @@ function isFastSlash (layer, matchers) {
13
13
  return layer.regexp?.fast_slash ?? matchers.some(matcher => matcher.path === '/')
14
14
  }
15
15
 
16
- function flatten (arr) {
17
- return arr.reduce((acc, val) => Array.isArray(val) ? acc.concat(flatten(val)) : acc.concat(val), [])
18
- }
19
-
20
16
  // TODO: Move this function to a shared file between Express and Router
21
17
  function createWrapRouterMethod (name) {
22
18
  const enterChannel = channel(`apm:${name}:middleware:enter`)
@@ -74,8 +70,8 @@ function createWrapRouterMethod (name) {
74
70
  })
75
71
  }
76
72
 
77
- function wrapStack (stack, offset, matchers) {
78
- [].concat(stack).slice(offset).forEach(layer => {
73
+ function wrapStack (layers, matchers) {
74
+ for (const layer of layers) {
79
75
  if (layer.__handle) { // express-async-errors
80
76
  layer.__handle = wrapLayerHandle(layer, layer.__handle)
81
77
  } else {
@@ -93,7 +89,7 @@ function createWrapRouterMethod (name) {
93
89
  layer.route[method] = wrapMethod(layer.route[method])
94
90
  })
95
91
  }
96
- })
92
+ }
97
93
  }
98
94
 
99
95
  function wrapNext (req, next) {
@@ -110,7 +106,7 @@ function createWrapRouterMethod (name) {
110
106
  }
111
107
 
112
108
  function extractMatchers (fn) {
113
- const arg = flatten([].concat(fn))
109
+ const arg = Array.isArray(fn) ? fn : [fn]
114
110
 
115
111
  if (typeof arg[0] === 'function') {
116
112
  return []
@@ -139,7 +135,10 @@ function createWrapRouterMethod (name) {
139
135
 
140
136
  function wrapMethod (original) {
141
137
  return shimmer.wrapFunction(original, original => function methodWithTrace (fn) {
142
- const offset = this.stack ? [].concat(this.stack).length : 0
138
+ let offset = 0
139
+ if (this.stack) {
140
+ offset = Array.isArray(this.stack) ? this.stack.length : 1
141
+ }
143
142
  const router = original.apply(this, arguments)
144
143
 
145
144
  if (typeof this.stack === 'function') {
@@ -150,7 +149,9 @@ function createWrapRouterMethod (name) {
150
149
  routeAddedChannel.publish({ topOfStackFunc: methodWithTrace, layer: this.stack[0] })
151
150
  }
152
151
 
153
- wrapStack(this.stack, offset, extractMatchers(fn))
152
+ if (this.stack.length > offset) {
153
+ wrapStack(this.stack.slice(offset), extractMatchers(fn))
154
+ }
154
155
 
155
156
  return router
156
157
  })
@@ -204,7 +205,7 @@ const visitedParams = new WeakSet()
204
205
 
205
206
  function wrapHandleRequest (original) {
206
207
  return function wrappedHandleRequest (req, res, next) {
207
- if (routerParamStartCh.hasSubscribers && Object.keys(req.params).length && !visitedParams.has(req.params)) {
208
+ if (routerParamStartCh.hasSubscribers && !visitedParams.has(req.params) && Object.keys(req.params).length) {
208
209
  visitedParams.add(req.params)
209
210
 
210
211
  const abortController = new AbortController()
@@ -63,7 +63,6 @@ function getQueryOrProcedure (request) {
63
63
  return [request.parametersByName.statement.value, request.parametersByName.statement, 'value']
64
64
  } else if (request.parametersByName.stmt) {
65
65
  return [request.parametersByName.stmt.value, request.parametersByName.stmt, 'value']
66
- } else {
67
- return [request.sqlTextOrProcedure, request, 'sqlTextOrProcedure']
68
66
  }
67
+ return [request.sqlTextOrProcedure, request, 'sqlTextOrProcedure']
69
68
  }
@@ -1,4 +1,4 @@
1
- const { addHook, channel, AsyncResource } = require('./helpers/instrument')
1
+ const { addHook, channel } = require('./helpers/instrument')
2
2
  const shimmer = require('../../datadog-shimmer')
3
3
  const log = require('../../dd-trace/src/log')
4
4
 
@@ -38,7 +38,6 @@ const modifiedTasks = new WeakSet()
38
38
  let isRetryReasonEfd = false
39
39
  let isRetryReasonAttemptToFix = false
40
40
  const switchedStatuses = new WeakSet()
41
- const sessionAsyncResource = new AsyncResource('bound-anonymous-fn')
42
41
 
43
42
  const BREAKPOINT_HIT_GRACE_PERIOD_MS = 400
44
43
 
@@ -116,9 +115,7 @@ function isBaseSequencer (vitestPackage) {
116
115
 
117
116
  function getChannelPromise (channelToPublishTo) {
118
117
  return new Promise(resolve => {
119
- sessionAsyncResource.runInAsyncScope(() => {
120
- channelToPublishTo.publish({ onDone: resolve })
121
- })
118
+ channelToPublishTo.publish({ onDone: resolve })
122
119
  })
123
120
  }
124
121
 
@@ -194,9 +191,6 @@ function getSortWrapper (sort) {
194
191
  let isImpactedTestsEnabled = false
195
192
  let testManagementAttemptToFixRetries = 0
196
193
  let isDiEnabled = false
197
- let knownTests = {}
198
- let testManagementTests = {}
199
- let modifiedTests = {}
200
194
 
201
195
  try {
202
196
  const { err, libraryConfig } = await getChannelPromise(libraryConfigurationCh)
@@ -233,9 +227,8 @@ function getSortWrapper (sort) {
233
227
  const knownTestsResponse = await getChannelPromise(knownTestsCh)
234
228
  if (knownTestsResponse.err) {
235
229
  isEarlyFlakeDetectionEnabled = false
236
- isKnownTestsEnabled = false
237
230
  } else {
238
- knownTests = knownTestsResponse.knownTests
231
+ const knownTests = knownTestsResponse.knownTests
239
232
  const getFilePaths = this.ctx.getTestFilepaths || this.ctx._globTestFilepaths
240
233
 
241
234
  const testFilepaths = await getFilePaths.call(this.ctx)
@@ -249,7 +242,6 @@ function getSortWrapper (sort) {
249
242
  })
250
243
  if (isEarlyFlakeDetectionFaulty) {
251
244
  isEarlyFlakeDetectionEnabled = false
252
- isKnownTestsEnabled = false
253
245
  log.warn('New test detection is disabled because the number of new tests is too high.')
254
246
  } else {
255
247
  // TODO: use this to pass session and module IDs to the worker, instead of polluting process.env
@@ -282,7 +274,7 @@ function getSortWrapper (sort) {
282
274
  isTestManagementTestsEnabled = false
283
275
  log.error('Could not get test management tests.')
284
276
  } else {
285
- testManagementTests = receivedTestManagementTests
277
+ const testManagementTests = receivedTestManagementTests
286
278
  try {
287
279
  const workspaceProject = this.ctx.getCoreWorkspaceProject()
288
280
  workspaceProject._provided._ddIsTestManagementTestsEnabled = isTestManagementTestsEnabled
@@ -295,12 +287,10 @@ function getSortWrapper (sort) {
295
287
  }
296
288
 
297
289
  if (isImpactedTestsEnabled) {
298
- const { err, modifiedTests: receivedModifiedTests } = await getChannelPromise(impactedTestsCh)
290
+ const { err, modifiedTests } = await getChannelPromise(impactedTestsCh)
299
291
  if (err) {
300
- isImpactedTestsEnabled = false
301
292
  log.error('Could not get modified tests.')
302
293
  } else {
303
- modifiedTests = receivedModifiedTests
304
294
  try {
305
295
  const workspaceProject = this.ctx.getCoreWorkspaceProject()
306
296
  workspaceProject._provided._ddIsImpactedTestsEnabled = isImpactedTestsEnabled
@@ -338,16 +328,14 @@ function getSortWrapper (sort) {
338
328
  error = new Error(`Test suites failed: ${failedSuites.length}.`)
339
329
  }
340
330
 
341
- sessionAsyncResource.runInAsyncScope(() => {
342
- testSessionFinishCh.publish({
343
- status: getSessionStatus(this.state),
344
- testCodeCoverageLinesTotal,
345
- error,
346
- isEarlyFlakeDetectionEnabled,
347
- isEarlyFlakeDetectionFaulty,
348
- isTestManagementTestsEnabled,
349
- onFinish
350
- })
331
+ testSessionFinishCh.publish({
332
+ status: getSessionStatus(this.state),
333
+ testCodeCoverageLinesTotal,
334
+ error,
335
+ isEarlyFlakeDetectionEnabled,
336
+ isEarlyFlakeDetectionFaulty,
337
+ isTestManagementTestsEnabled,
338
+ onFinish
351
339
  })
352
340
 
353
341
  await flushPromise
@@ -364,10 +352,8 @@ function getCreateCliWrapper (vitestPackage, frameworkVersion) {
364
352
  if (!testSessionStartCh.hasSubscribers) {
365
353
  return oldCreateCli.apply(this, arguments)
366
354
  }
367
- sessionAsyncResource.runInAsyncScope(() => {
368
- const processArgv = process.argv.slice(2).join(' ')
369
- testSessionStartCh.publish({ command: `vitest ${processArgv}`, frameworkVersion })
370
- })
355
+ const processArgv = process.argv.slice(2).join(' ')
356
+ testSessionStartCh.publish({ command: `vitest ${processArgv}`, frameworkVersion })
371
357
  return oldCreateCli.apply(this, arguments)
372
358
  })
373
359
 
@@ -104,21 +104,21 @@ class SchemaExtractor {
104
104
  }
105
105
  }
106
106
  return true
107
- } else {
108
- if (!builder.shouldExtractSchema(schemaName, depth)) {
109
- return false
110
- }
111
- if (schema.fields?.[Symbol.iterator]) {
112
- for (const field of schema.fields) {
113
- if (!this.extractProperty(field, schemaName, field.name, builder, depth)) {
114
- log.warn('DSM: Unable to extract field with name: %s from Avro schema with name: %s', field.name,
115
- schemaName)
116
- }
107
+ }
108
+ if (!builder.shouldExtractSchema(schemaName, depth)) {
109
+ return false
110
+ }
111
+ if (schema.fields?.[Symbol.iterator]) {
112
+ for (const field of schema.fields) {
113
+ if (!this.extractProperty(field, schemaName, field.name, builder, depth)) {
114
+ log.warn('DSM: Unable to extract field with name: %s from Avro schema with name: %s', field.name,
115
+ schemaName)
117
116
  }
118
- } else {
119
- log.warn('DSM: schema.fields is not iterable from Avro schema with name: %s', schemaName)
120
117
  }
118
+ } else {
119
+ log.warn('DSM: schema.fields is not iterable from Avro schema with name: %s', schemaName)
121
120
  }
121
+
122
122
  return true
123
123
  }
124
124
 
@@ -6,6 +6,7 @@ const { storage } = require('../../datadog-core')
6
6
  const { isTrue } = require('../../dd-trace/src/util')
7
7
  const coalesce = require('koalas')
8
8
  const { tagsFromRequest, tagsFromResponse } = require('../../dd-trace/src/payload-tagging')
9
+ const { getEnvironmentVariable } = require('../../dd-trace/src/config-helper')
9
10
 
10
11
  class BaseAwsSdkPlugin extends ClientPlugin {
11
12
  static get id () { return 'aws' }
@@ -132,7 +133,7 @@ class BaseAwsSdkPlugin extends ClientPlugin {
132
133
 
133
134
  isEnabled (request) {
134
135
  const serviceId = this.serviceIdentifier.toUpperCase()
135
- const envVarValue = process.env[`DD_TRACE_AWS_SDK_${serviceId}_ENABLED`]
136
+ const envVarValue = getEnvironmentVariable(`DD_TRACE_AWS_SDK_${serviceId}_ENABLED`)
136
137
  return envVarValue ? isTrue(envVarValue) : true
137
138
  }
138
139
 
@@ -142,11 +143,12 @@ class BaseAwsSdkPlugin extends ClientPlugin {
142
143
  const operation = response.request.operation
143
144
  const extraTags = this.generateTags(params, operation, response) || {}
144
145
 
145
- const tags = Object.assign({
146
+ const tags = {
146
147
  'aws.response.request_id': response.requestId,
147
148
  'resource.name': operation,
148
- 'span.kind': 'client'
149
- }, extraTags)
149
+ 'span.kind': 'client',
150
+ ...extraTags
151
+ }
150
152
 
151
153
  span.addTags(tags)
152
154
 
@@ -211,19 +213,21 @@ function normalizeConfig (config, serviceIdentifier) {
211
213
  const batchPropagationEnabled = isTrue(
212
214
  coalesce(
213
215
  specificConfig.batchPropagationEnabled,
214
- process.env[`DD_TRACE_AWS_SDK_${serviceId}_BATCH_PROPAGATION_ENABLED`],
216
+ getEnvironmentVariable(`DD_TRACE_AWS_SDK_${serviceId}_BATCH_PROPAGATION_ENABLED`),
215
217
  config.batchPropagationEnabled,
216
- process.env.DD_TRACE_AWS_SDK_BATCH_PROPAGATION_ENABLED,
218
+ getEnvironmentVariable('DD_TRACE_AWS_SDK_BATCH_PROPAGATION_ENABLED'),
217
219
  false
218
220
  )
219
221
  )
220
222
 
221
223
  // Merge the specific config back into the main config
222
- return Object.assign({}, config, specificConfig, {
224
+ return {
225
+ ...config,
226
+ ...specificConfig,
223
227
  splitByAwsService: config.splitByAwsService !== false,
224
228
  batchPropagationEnabled,
225
229
  hooks
226
- })
230
+ }
227
231
  }
228
232
 
229
233
  const noop = () => {}
@@ -6,15 +6,13 @@ class CloudwatchLogs extends BaseAwsSdkPlugin {
6
6
  static get id () { return 'cloudwatchlogs' }
7
7
 
8
8
  generateTags (params, operation) {
9
- const tags = {}
9
+ if (!params?.logGroupName) return {}
10
10
 
11
- if (!params || !params.logGroupName) return tags
12
-
13
- return Object.assign(tags, {
11
+ return {
14
12
  'resource.name': `${operation} ${params.logGroupName}`,
15
13
  'aws.cloudwatch.logs.log_group_name': params.logGroupName,
16
14
  loggroupname: params.logGroupName
17
- })
15
+ }
18
16
  }
19
17
  }
20
18
 
@@ -14,40 +14,32 @@ class DynamoDb extends BaseAwsSdkPlugin {
14
14
  const tags = {}
15
15
 
16
16
  if (params) {
17
- if (params.TableName) {
18
- Object.assign(tags, {
19
- 'resource.name': `${operation} ${params.TableName}`,
20
- 'aws.dynamodb.table_name': params.TableName,
21
- tablename: params.TableName
22
- })
23
- }
17
+ let tableName = params.TableName
24
18
 
25
- // batch operations have different format, collect table name for batch
19
+ // Collect table name for batch operations which have different format
26
20
  // https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html#batchGetItem-property`
27
21
  // dynamoDB batch TableName
28
22
  if (params.RequestItems !== null && typeof params.RequestItems === 'object') {
29
23
  const requestItemsKeys = Object.keys(params.RequestItems)
30
24
  if (requestItemsKeys.length === 1) {
31
- const tableName = requestItemsKeys[0]
32
-
33
- // also add span type to match serverless convention
34
- Object.assign(tags, {
35
- 'resource.name': `${operation} ${tableName}`,
36
- 'aws.dynamodb.table_name': tableName,
37
- tablename: tableName
38
- })
25
+ tableName = requestItemsKeys[0]
39
26
  }
40
27
  }
41
28
 
29
+ if (tableName) {
30
+ // Also add span type to match serverless convention
31
+ tags['resource.name'] = `${operation} ${tableName}`
32
+ tags['aws.dynamodb.table_name'] = tableName
33
+ tags.tablename = tableName
34
+ }
35
+
42
36
  // TODO: DynamoDB.DocumentClient does batches on multiple tables
43
37
  // https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#batchGet-property
44
38
  // it may be useful to have a different resource naming convention here to show all table names
45
39
  }
46
40
 
47
- // also add span type to match serverless convention
48
- Object.assign(tags, {
49
- 'span.type': 'dynamodb'
50
- })
41
+ // Also add span type to match serverless convention
42
+ tags['span.type'] = 'dynamodb'
51
43
 
52
44
  return tags
53
45
  }
@@ -35,11 +35,10 @@ class Kinesis extends BaseAwsSdkPlugin {
35
35
  obj.needsFinish = true
36
36
  const options = {
37
37
  childOf: responseExtraction.maybeChildOf,
38
- tags: Object.assign(
39
- {},
40
- this.requestTags.get(request) || {},
41
- { 'span.kind': 'server' }
42
- )
38
+ tags: {
39
+ ...this.requestTags.get(request),
40
+ 'span.kind': 'server'
41
+ }
43
42
  }
44
43
  span = plugin.tracer.startSpan('aws.response', options)
45
44
  this.enter(span, store)
@@ -7,15 +7,13 @@ class Lambda extends BaseAwsSdkPlugin {
7
7
  static get id () { return 'lambda' }
8
8
 
9
9
  generateTags (params, operation, response) {
10
- const tags = {}
10
+ if (!params?.FunctionName) return {}
11
11
 
12
- if (!params || !params.FunctionName) return tags
13
-
14
- return Object.assign(tags, {
12
+ return {
15
13
  'resource.name': `${operation} ${params.FunctionName}`,
16
14
  functionname: params.FunctionName,
17
15
  'aws.lambda': params.FunctionName
18
- })
16
+ }
19
17
  }
20
18
 
21
19
  requestInject (span, request) {
@@ -6,15 +6,13 @@ class Redshift extends BaseAwsSdkPlugin {
6
6
  static get id () { return 'redshift' }
7
7
 
8
8
  generateTags (params, operation, response) {
9
- const tags = {}
9
+ if (!params?.ClusterIdentifier) return {}
10
10
 
11
- if (!params || !params.ClusterIdentifier) return tags
12
-
13
- return Object.assign(tags, {
11
+ return {
14
12
  'resource.name': `${operation} ${params.ClusterIdentifier}`,
15
13
  'aws.redshift.cluster_identifier': params.ClusterIdentifier,
16
14
  clusteridentifier: params.ClusterIdentifier
17
- })
15
+ }
18
16
  }
19
17
  }
20
18
 
@@ -11,15 +11,13 @@ class S3 extends BaseAwsSdkPlugin {
11
11
  static get isPayloadReporter () { return true }
12
12
 
13
13
  generateTags (params, operation, response) {
14
- const tags = {}
14
+ if (!params?.Bucket) return {}
15
15
 
16
- if (!params || !params.Bucket) return tags
17
-
18
- return Object.assign(tags, {
16
+ return {
19
17
  'resource.name': `${operation} ${params.Bucket}`,
20
18
  'aws.s3.bucket_name': params.Bucket,
21
19
  bucketname: params.Bucket
22
- })
20
+ }
23
21
  }
24
22
 
25
23
  addSpanPointers (span, response) {
@@ -74,8 +74,7 @@ class Sns extends BaseAwsSdkPlugin {
74
74
  injectToMessage (span, params, topicArn, injectTraceContext) {
75
75
  if (!params.MessageAttributes) {
76
76
  params.MessageAttributes = {}
77
- }
78
- if (Object.keys(params.MessageAttributes).length >= 10) { // SNS quota
77
+ } else if (Object.keys(params.MessageAttributes).length >= 10) { // SNS quota
79
78
  log.info('Message attributes full, skipping trace context injection')
80
79
  return
81
80
  }