dd-trace 5.35.0 → 5.37.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 (125) hide show
  1. package/LICENSE-3rdparty.csv +2 -1
  2. package/index.d.ts +8 -7
  3. package/loader-hook.mjs +0 -4
  4. package/package.json +15 -14
  5. package/packages/datadog-core/index.js +1 -1
  6. package/packages/datadog-core/src/storage.js +76 -31
  7. package/packages/datadog-instrumentations/src/cucumber.js +54 -1
  8. package/packages/datadog-instrumentations/src/helpers/instrument.js +2 -2
  9. package/packages/datadog-instrumentations/src/helpers/register.js +2 -2
  10. package/packages/datadog-instrumentations/src/jest.js +105 -11
  11. package/packages/datadog-instrumentations/src/mocha/main.js +46 -4
  12. package/packages/datadog-instrumentations/src/mocha/utils.js +35 -2
  13. package/packages/datadog-instrumentations/src/mocha/worker.js +7 -0
  14. package/packages/datadog-instrumentations/src/mysql2.js +3 -3
  15. package/packages/datadog-instrumentations/src/openai.js +8 -0
  16. package/packages/datadog-instrumentations/src/playwright.js +70 -22
  17. package/packages/datadog-instrumentations/src/vitest.js +60 -6
  18. package/packages/datadog-plugin-aerospike/src/index.js +1 -1
  19. package/packages/datadog-plugin-apollo/src/gateway/fetch.js +1 -1
  20. package/packages/datadog-plugin-apollo/src/gateway/index.js +1 -1
  21. package/packages/datadog-plugin-apollo/src/gateway/request.js +1 -1
  22. package/packages/datadog-plugin-aws-sdk/src/base.js +3 -3
  23. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +4 -4
  24. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +2 -2
  25. package/packages/datadog-plugin-azure-functions/src/index.js +1 -1
  26. package/packages/datadog-plugin-couchbase/src/index.js +2 -2
  27. package/packages/datadog-plugin-cucumber/src/index.js +31 -14
  28. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +72 -7
  29. package/packages/datadog-plugin-cypress/src/support.js +36 -29
  30. package/packages/datadog-plugin-dd-trace-api/src/index.js +1 -3
  31. package/packages/datadog-plugin-graphql/src/utils.js +8 -1
  32. package/packages/datadog-plugin-grpc/src/client.js +1 -1
  33. package/packages/datadog-plugin-grpc/src/server.js +1 -1
  34. package/packages/datadog-plugin-hapi/src/index.js +1 -1
  35. package/packages/datadog-plugin-http/src/client.js +1 -1
  36. package/packages/datadog-plugin-http/src/server.js +1 -1
  37. package/packages/datadog-plugin-http2/src/client.js +3 -3
  38. package/packages/datadog-plugin-http2/src/server.js +1 -1
  39. package/packages/datadog-plugin-jest/src/index.js +17 -12
  40. package/packages/datadog-plugin-langchain/src/tracing.js +1 -1
  41. package/packages/datadog-plugin-mariadb/src/index.js +3 -3
  42. package/packages/datadog-plugin-mocha/src/index.js +35 -16
  43. package/packages/datadog-plugin-mongodb-core/src/index.js +28 -2
  44. package/packages/datadog-plugin-next/src/index.js +4 -4
  45. package/packages/datadog-plugin-openai/src/tracing.js +2 -3
  46. package/packages/datadog-plugin-playwright/src/index.js +35 -9
  47. package/packages/datadog-plugin-rhea/src/consumer.js +1 -1
  48. package/packages/datadog-plugin-router/src/index.js +2 -2
  49. package/packages/datadog-plugin-selenium/src/index.js +1 -1
  50. package/packages/datadog-plugin-vitest/src/index.js +36 -12
  51. package/packages/dd-trace/src/appsec/graphql.js +6 -6
  52. package/packages/dd-trace/src/appsec/iast/analyzers/code-injection-analyzer.js +3 -7
  53. package/packages/dd-trace/src/appsec/iast/analyzers/injection-analyzer.js +15 -1
  54. package/packages/dd-trace/src/appsec/iast/analyzers/nosql-injection-mongodb-analyzer.js +17 -30
  55. package/packages/dd-trace/src/appsec/iast/analyzers/path-traversal-analyzer.js +2 -2
  56. package/packages/dd-trace/src/appsec/iast/analyzers/sql-injection-analyzer.js +7 -11
  57. package/packages/dd-trace/src/appsec/iast/analyzers/stored-injection-analyzer.js +11 -0
  58. package/packages/dd-trace/src/appsec/iast/analyzers/template-injection-analyzer.js +2 -6
  59. package/packages/dd-trace/src/appsec/iast/analyzers/vulnerability-analyzer.js +24 -4
  60. package/packages/dd-trace/src/appsec/iast/context/context-plugin.js +2 -2
  61. package/packages/dd-trace/src/appsec/iast/iast-plugin.js +2 -2
  62. package/packages/dd-trace/src/appsec/iast/index.js +4 -2
  63. package/packages/dd-trace/src/appsec/iast/security-controls/index.js +187 -0
  64. package/packages/dd-trace/src/appsec/iast/security-controls/parser.js +96 -0
  65. package/packages/dd-trace/src/appsec/iast/taint-tracking/constants.js +6 -0
  66. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations.js +2 -2
  67. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +8 -8
  68. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugins/kafka.js +1 -1
  69. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter-esm.mjs +65 -0
  70. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter-telemetry.js +14 -5
  71. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +80 -2
  72. package/packages/dd-trace/src/appsec/iast/taint-tracking/secure-marks-generator.js +1 -1
  73. package/packages/dd-trace/src/appsec/iast/taint-tracking/secure-marks.js +28 -0
  74. package/packages/dd-trace/src/appsec/iast/taint-tracking/taint-tracking-impl.js +1 -1
  75. package/packages/dd-trace/src/appsec/iast/telemetry/iast-metric.js +5 -0
  76. package/packages/dd-trace/src/appsec/iast/utils.js +24 -0
  77. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/index.js +8 -13
  78. package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +1 -0
  79. package/packages/dd-trace/src/appsec/index.js +4 -4
  80. package/packages/dd-trace/src/appsec/rasp/command_injection.js +5 -5
  81. package/packages/dd-trace/src/appsec/rasp/fs-plugin.js +5 -5
  82. package/packages/dd-trace/src/appsec/rasp/lfi.js +3 -3
  83. package/packages/dd-trace/src/appsec/rasp/sql_injection.js +4 -4
  84. package/packages/dd-trace/src/appsec/rasp/ssrf.js +3 -3
  85. package/packages/dd-trace/src/appsec/reporter.js +3 -3
  86. package/packages/dd-trace/src/appsec/sdk/user_blocking.js +1 -1
  87. package/packages/dd-trace/src/appsec/waf/index.js +1 -1
  88. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/index.js +2 -0
  89. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +31 -56
  90. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +20 -2
  91. package/packages/dd-trace/src/ci-visibility/quarantined-tests/get-quarantined-tests.js +62 -0
  92. package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +5 -2
  93. package/packages/dd-trace/src/ci-visibility/test-api-manual/test-api-manual-plugin.js +3 -3
  94. package/packages/dd-trace/src/config.js +18 -3
  95. package/packages/dd-trace/src/data_streams_context.js +2 -2
  96. package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +14 -7
  97. package/packages/dd-trace/src/debugger/devtools_client/source-maps.js +50 -0
  98. package/packages/dd-trace/src/debugger/devtools_client/state.js +38 -10
  99. package/packages/dd-trace/src/exporters/common/agents.js +1 -1
  100. package/packages/dd-trace/src/exporters/common/request.js +3 -3
  101. package/packages/dd-trace/src/iitm.js +2 -2
  102. package/packages/dd-trace/src/llmobs/plugins/bedrockruntime.js +1 -1
  103. package/packages/dd-trace/src/llmobs/tagger.js +12 -2
  104. package/packages/dd-trace/src/log/writer.js +3 -3
  105. package/packages/dd-trace/src/noop/span.js +1 -1
  106. package/packages/dd-trace/src/opentracing/propagation/text_map.js +5 -4
  107. package/packages/dd-trace/src/opentracing/span.js +3 -3
  108. package/packages/dd-trace/src/plugin_manager.js +3 -1
  109. package/packages/dd-trace/src/plugins/apollo.js +1 -1
  110. package/packages/dd-trace/src/plugins/ci_plugin.js +51 -4
  111. package/packages/dd-trace/src/plugins/database.js +14 -4
  112. package/packages/dd-trace/src/plugins/log_plugin.js +1 -1
  113. package/packages/dd-trace/src/plugins/plugin.js +8 -8
  114. package/packages/dd-trace/src/plugins/tracing.js +3 -3
  115. package/packages/dd-trace/src/plugins/util/git.js +3 -3
  116. package/packages/dd-trace/src/plugins/util/inferred_proxy.js +1 -3
  117. package/packages/dd-trace/src/plugins/util/test.js +10 -4
  118. package/packages/dd-trace/src/profiling/exporters/agent.js +3 -3
  119. package/packages/dd-trace/src/profiling/profilers/wall.js +1 -1
  120. package/packages/dd-trace/src/proxy.js +5 -1
  121. package/packages/dd-trace/src/ritm.js +2 -1
  122. package/packages/dd-trace/src/scope.js +5 -5
  123. package/packages/dd-trace/src/spanleak.js +0 -1
  124. package/packages/dd-trace/src/tracer.js +0 -14
  125. package/packages/memwatch/package.json +0 -9
@@ -45,11 +45,12 @@ module.exports = class CiPlugin extends Plugin {
45
45
  constructor (...args) {
46
46
  super(...args)
47
47
 
48
+ this.fileLineToProbeId = new Map()
48
49
  this.rootDir = process.cwd() // fallback in case :session:start events are not emitted
49
50
 
50
51
  this.addSub(`ci:${this.constructor.id}:library-configuration`, ({ onDone }) => {
51
52
  if (!this.tracer._exporter || !this.tracer._exporter.getLibraryConfiguration) {
52
- return onDone({ err: new Error('CI Visibility was not initialized correctly') })
53
+ return onDone({ err: new Error('Test optimization was not initialized correctly') })
53
54
  }
54
55
  this.tracer._exporter.getLibraryConfiguration(this.testConfiguration, (err, libraryConfig) => {
55
56
  if (err) {
@@ -63,7 +64,7 @@ module.exports = class CiPlugin extends Plugin {
63
64
 
64
65
  this.addSub(`ci:${this.constructor.id}:test-suite:skippable`, ({ onDone }) => {
65
66
  if (!this.tracer._exporter?.getSkippableSuites) {
66
- return onDone({ err: new Error('CI Visibility was not initialized correctly') })
67
+ return onDone({ err: new Error('Test optimization was not initialized correctly') })
67
68
  }
68
69
  this.tracer._exporter.getSkippableSuites(this.testConfiguration, (err, skippableSuites, itrCorrelationId) => {
69
70
  if (err) {
@@ -152,7 +153,7 @@ module.exports = class CiPlugin extends Plugin {
152
153
 
153
154
  this.addSub(`ci:${this.constructor.id}:known-tests`, ({ onDone }) => {
154
155
  if (!this.tracer._exporter?.getKnownTests) {
155
- return onDone({ err: new Error('CI Visibility was not initialized correctly') })
156
+ return onDone({ err: new Error('Test optimization was not initialized correctly') })
156
157
  }
157
158
  this.tracer._exporter.getKnownTests(this.testConfiguration, (err, knownTests) => {
158
159
  if (err) {
@@ -163,6 +164,19 @@ module.exports = class CiPlugin extends Plugin {
163
164
  onDone({ err, knownTests })
164
165
  })
165
166
  })
167
+
168
+ this.addSub(`ci:${this.constructor.id}:quarantined-tests`, ({ onDone }) => {
169
+ if (!this.tracer._exporter?.getQuarantinedTests) {
170
+ return onDone({ err: new Error('Test optimization was not initialized correctly') })
171
+ }
172
+ this.tracer._exporter.getQuarantinedTests(this.testConfiguration, (err, quarantinedTests) => {
173
+ if (err) {
174
+ log.error('Quarantined tests could not be fetched. %s', err.message)
175
+ this.libraryConfig.isQuarantinedTestsEnabled = false
176
+ }
177
+ onDone({ err, quarantinedTests })
178
+ })
179
+ })
166
180
  }
167
181
 
168
182
  get telemetry () {
@@ -335,7 +349,22 @@ module.exports = class CiPlugin extends Plugin {
335
349
  })
336
350
  }
337
351
 
338
- removeDiProbe (probeId) {
352
+ removeAllDiProbes () {
353
+ if (this.fileLineToProbeId.size === 0) {
354
+ return Promise.resolve()
355
+ }
356
+ log.debug('Removing all Dynamic Instrumentation probes')
357
+ return Promise.all(Array.from(this.fileLineToProbeId.keys())
358
+ .map((fileLine) => {
359
+ const [file, line] = fileLine.split(':')
360
+ return this.removeDiProbe({ file, line })
361
+ }))
362
+ }
363
+
364
+ removeDiProbe ({ file, line }) {
365
+ const probeId = this.fileLineToProbeId.get(`${file}:${line}`)
366
+ log.warn(`Removing probe from ${file}:${line}, with id: ${probeId}`)
367
+ this.fileLineToProbeId.delete(probeId)
339
368
  return this.di.removeProbe(probeId)
340
369
  }
341
370
 
@@ -346,9 +375,27 @@ module.exports = class CiPlugin extends Plugin {
346
375
  log.warn('Could not add breakpoint for dynamic instrumentation')
347
376
  return
348
377
  }
378
+ log.debug('Adding breakpoint for Dynamic Instrumentation')
379
+
380
+ this.testErrorStackIndex = stackIndex
381
+ const activeProbeKey = `${file}:${line}`
382
+
383
+ if (this.fileLineToProbeId.has(activeProbeKey)) {
384
+ log.warn('Probe already set for this line')
385
+ const oldProbeId = this.fileLineToProbeId.get(activeProbeKey)
386
+ return {
387
+ probeId: oldProbeId,
388
+ setProbePromise: Promise.resolve(),
389
+ stackIndex,
390
+ file,
391
+ line
392
+ }
393
+ }
349
394
 
350
395
  const [probeId, setProbePromise] = this.di.addLineProbe({ file, line }, this.onDiBreakpointHit.bind(this))
351
396
 
397
+ this.fileLineToProbeId.set(activeProbeKey, probeId)
398
+
352
399
  return {
353
400
  probeId,
354
401
  setProbePromise,
@@ -63,25 +63,35 @@ class DatabasePlugin extends StoragePlugin {
63
63
  return tracerService
64
64
  }
65
65
 
66
- injectDbmQuery (span, query, serviceName, isPreparedStatement = false) {
66
+ createDbmComment (span, serviceName, isPreparedStatement = false) {
67
67
  const mode = this.config.dbmPropagationMode
68
68
  const dbmService = this.getDbmServiceName(span, serviceName)
69
69
 
70
70
  if (mode === 'disabled') {
71
- return query
71
+ return null
72
72
  }
73
73
 
74
74
  const servicePropagation = this.createDBMPropagationCommentService(dbmService, span)
75
75
 
76
76
  if (isPreparedStatement || mode === 'service') {
77
- return `/*${servicePropagation}*/ ${query}`
77
+ return servicePropagation
78
78
  } else if (mode === 'full') {
79
79
  span.setTag('_dd.dbm_trace_injected', 'true')
80
80
  const traceparent = span._spanContext.toTraceparent()
81
- return `/*${servicePropagation},traceparent='${traceparent}'*/ ${query}`
81
+ return `${servicePropagation},traceparent='${traceparent}'`
82
82
  }
83
83
  }
84
84
 
85
+ injectDbmQuery (span, query, serviceName, isPreparedStatement = false) {
86
+ const dbmTraceComment = this.createDbmComment(span, serviceName, isPreparedStatement)
87
+
88
+ if (!dbmTraceComment) {
89
+ return query
90
+ }
91
+
92
+ return `/*${dbmTraceComment}*/ ${query}`
93
+ }
94
+
85
95
  maybeTruncate (query) {
86
96
  const maxLength = typeof this.config.truncate === 'number'
87
97
  ? this.config.truncate
@@ -40,7 +40,7 @@ module.exports = class LogPlugin extends Plugin {
40
40
  super(...args)
41
41
 
42
42
  this.addSub(`apm:${this.constructor.id}:log`, (arg) => {
43
- const store = storage.getStore()
43
+ const store = storage('legacy').getStore()
44
44
  const span = store && store.span
45
45
 
46
46
  // NOTE: This needs to run whether or not there is a span
@@ -10,7 +10,7 @@ class Subscription {
10
10
  constructor (event, handler) {
11
11
  this._channel = dc.channel(event)
12
12
  this._handler = (message, name) => {
13
- const store = storage.getStore()
13
+ const store = storage('legacy').getStore()
14
14
  if (!store || !store.noop) {
15
15
  handler(message, name)
16
16
  }
@@ -30,7 +30,7 @@ class StoreBinding {
30
30
  constructor (event, transform) {
31
31
  this._channel = dc.channel(event)
32
32
  this._transform = data => {
33
- const store = storage.getStore()
33
+ const store = storage('legacy').getStore()
34
34
 
35
35
  return !store || !store.noop
36
36
  ? transform(data)
@@ -39,11 +39,11 @@ class StoreBinding {
39
39
  }
40
40
 
41
41
  enable () {
42
- this._channel.bindStore(storage, this._transform)
42
+ this._channel.bindStore(storage('legacy'), this._transform)
43
43
  }
44
44
 
45
45
  disable () {
46
- this._channel.unbindStore(storage, this._transform)
46
+ this._channel.unbindStore(storage('legacy'))
47
47
  }
48
48
  }
49
49
 
@@ -62,14 +62,14 @@ module.exports = class Plugin {
62
62
  }
63
63
 
64
64
  enter (span, store) {
65
- store = store || storage.getStore()
66
- storage.enterWith({ ...store, span })
65
+ store = store || storage('legacy').getStore()
66
+ storage('legacy').enterWith({ ...store, span })
67
67
  }
68
68
 
69
69
  // TODO: Implement filters on resource name for all plugins.
70
70
  /** Prevents creation of spans here and for all async descendants. */
71
71
  skip () {
72
- storage.enterWith({ noop: true })
72
+ storage('legacy').enterWith({ noop: true })
73
73
  }
74
74
 
75
75
  addSub (channelName, handler) {
@@ -91,7 +91,7 @@ module.exports = class Plugin {
91
91
  }
92
92
 
93
93
  addError (error) {
94
- const store = storage.getStore()
94
+ const store = storage('legacy').getStore()
95
95
 
96
96
  if (!store || !store.span) return
97
97
 
@@ -16,7 +16,7 @@ class TracingPlugin extends Plugin {
16
16
  }
17
17
 
18
18
  get activeSpan () {
19
- const store = storage.getStore()
19
+ const store = storage('legacy').getStore()
20
20
 
21
21
  return store && store.span
22
22
  }
@@ -102,7 +102,7 @@ class TracingPlugin extends Plugin {
102
102
  }
103
103
 
104
104
  startSpan (name, { childOf, kind, meta, metrics, service, resource, type } = {}, enter = true) {
105
- const store = storage.getStore()
105
+ const store = storage('legacy').getStore()
106
106
  if (store && childOf === undefined) {
107
107
  childOf = store.span
108
108
  }
@@ -126,7 +126,7 @@ class TracingPlugin extends Plugin {
126
126
 
127
127
  // TODO: Remove this after migration to TracingChannel is done.
128
128
  if (enter) {
129
- storage.enterWith({ ...store, span })
129
+ storage('legacy').enterWith({ ...store, span })
130
130
  }
131
131
 
132
132
  return span
@@ -37,8 +37,8 @@ function sanitizedExec (
37
37
  durationMetric,
38
38
  errorMetric
39
39
  ) {
40
- const store = storage.getStore()
41
- storage.enterWith({ noop: true })
40
+ const store = storage('legacy').getStore()
41
+ storage('legacy').enterWith({ noop: true })
42
42
 
43
43
  let startTime
44
44
  if (operationMetric) {
@@ -64,7 +64,7 @@ function sanitizedExec (
64
64
  log.error('Git plugin error executing command', err)
65
65
  return ''
66
66
  } finally {
67
- storage.enterWith(store)
67
+ storage('legacy').enterWith(store)
68
68
  }
69
69
  }
70
70
 
@@ -2,7 +2,6 @@ const log = require('../../log')
2
2
  const tags = require('../../../../../ext/tags')
3
3
 
4
4
  const RESOURCE_NAME = tags.RESOURCE_NAME
5
- const SPAN_KIND = tags.SPAN_KIND
6
5
  const SPAN_TYPE = tags.SPAN_TYPE
7
6
  const HTTP_URL = tags.HTTP_URL
8
7
  const HTTP_METHOD = tags.HTTP_METHOD
@@ -49,7 +48,6 @@ function createInferredProxySpan (headers, childOf, tracer, context) {
49
48
  tags: {
50
49
  service: proxyContext.domainName || tracer._config.service,
51
50
  component: proxySpanInfo.component,
52
- [SPAN_KIND]: 'internal',
53
51
  [SPAN_TYPE]: 'web',
54
52
  [HTTP_METHOD]: proxyContext.method,
55
53
  [HTTP_URL]: proxyContext.domainName + proxyContext.path,
@@ -71,7 +69,7 @@ function createInferredProxySpan (headers, childOf, tracer, context) {
71
69
 
72
70
  function setInferredProxySpanTags (span, proxyContext) {
73
71
  span.setTag(RESOURCE_NAME, `${proxyContext.method} ${proxyContext.path}`)
74
- span.setTag('_dd.inferred_span', '1')
72
+ span.setTag('_dd.inferred_span', 1)
75
73
  return span
76
74
  }
77
75
 
@@ -52,8 +52,6 @@ const TEST_MODULE_ID = 'test_module_id'
52
52
  const TEST_SUITE_ID = 'test_suite_id'
53
53
  const TEST_TOOLCHAIN = 'test.toolchain'
54
54
  const TEST_SKIPPED_BY_ITR = 'test.skipped_by_itr'
55
- // Browser used in browser test. Namespaced by test.configuration because it affects the fingerprint
56
- const TEST_CONFIGURATION_BROWSER_NAME = 'test.configuration.browser_name'
57
55
  // Early flake detection
58
56
  const TEST_IS_NEW = 'test.is_new'
59
57
  const TEST_IS_RETRY = 'test.is_retry'
@@ -108,6 +106,8 @@ const TEST_LEVEL_EVENT_TYPES = [
108
106
  'test_session_end'
109
107
  ]
110
108
 
109
+ const DD_TEST_IS_USER_PROVIDED_SERVICE = '_dd.test.is_user_provided_service'
110
+
111
111
  // Dynamic instrumentation - Test optimization integration tags
112
112
  const DI_ERROR_DEBUG_INFO_CAPTURED = 'error.debug_info_captured'
113
113
  const DI_DEBUG_ERROR_PREFIX = '_dd.debug.error'
@@ -115,6 +115,9 @@ const DI_DEBUG_ERROR_SNAPSHOT_ID_SUFFIX = 'snapshot_id'
115
115
  const DI_DEBUG_ERROR_FILE_SUFFIX = 'file'
116
116
  const DI_DEBUG_ERROR_LINE_SUFFIX = 'line'
117
117
 
118
+ const TEST_MANAGEMENT_IS_QUARANTINED = 'test.test_management.is_quarantined'
119
+ const TEST_MANAGEMENT_ENABLED = 'test.test_management.enabled'
120
+
118
121
  module.exports = {
119
122
  TEST_CODE_OWNERS,
120
123
  TEST_SESSION_NAME,
@@ -141,7 +144,6 @@ module.exports = {
141
144
  MOCHA_WORKER_TRACE_PAYLOAD_CODE,
142
145
  TEST_SOURCE_START,
143
146
  TEST_SKIPPED_BY_ITR,
144
- TEST_CONFIGURATION_BROWSER_NAME,
145
147
  TEST_IS_NEW,
146
148
  TEST_IS_RETRY,
147
149
  TEST_EARLY_FLAKE_ENABLED,
@@ -199,7 +201,10 @@ module.exports = {
199
201
  DI_DEBUG_ERROR_SNAPSHOT_ID_SUFFIX,
200
202
  DI_DEBUG_ERROR_FILE_SUFFIX,
201
203
  DI_DEBUG_ERROR_LINE_SUFFIX,
202
- getFormattedError
204
+ getFormattedError,
205
+ DD_TEST_IS_USER_PROVIDED_SERVICE,
206
+ TEST_MANAGEMENT_IS_QUARANTINED,
207
+ TEST_MANAGEMENT_ENABLED
203
208
  }
204
209
 
205
210
  // Returns pkg manager and its version, separated by '-', e.g. npm-8.15.0 or yarn-1.22.19
@@ -275,6 +280,7 @@ function getTestEnvironmentMetadata (testFramework, config) {
275
280
 
276
281
  const metadata = {
277
282
  [TEST_FRAMEWORK]: testFramework,
283
+ [DD_TEST_IS_USER_PROVIDED_SERVICE]: (config && config.isServiceUserProvided) ? 'true' : 'false',
278
284
  ...gitMetadata,
279
285
  ...ciMetadata,
280
286
  ...userProvidedGitMetadata,
@@ -40,8 +40,8 @@ function countStatusCode (statusCode) {
40
40
  function sendRequest (options, form, callback) {
41
41
  const request = options.protocol === 'https:' ? httpsRequest : httpRequest
42
42
 
43
- const store = storage.getStore()
44
- storage.enterWith({ noop: true })
43
+ const store = storage('legacy').getStore()
44
+ storage('legacy').enterWith({ noop: true })
45
45
  requestCounter.inc()
46
46
  const start = perf.now()
47
47
  const req = request(options, res => {
@@ -65,7 +65,7 @@ function sendRequest (options, form, callback) {
65
65
  sizeDistribution.track(form.size())
66
66
  form.pipe(req)
67
67
  }
68
- storage.enterWith(store)
68
+ storage('legacy').enterWith(store)
69
69
  }
70
70
 
71
71
  function getBody (stream, callback) {
@@ -25,7 +25,7 @@ const ProfilingContext = Symbol('NativeWallProfiler.ProfilingContext')
25
25
  let kSampleCount
26
26
 
27
27
  function getActiveSpan () {
28
- const store = storage.getStore()
28
+ const store = storage('legacy').getStore()
29
29
  return store && store.span
30
30
  }
31
31
 
@@ -201,7 +201,11 @@ class Tracer extends NoopProxy {
201
201
  try {
202
202
  return require('./profiler').start(config)
203
203
  } catch (e) {
204
- log.error('Error starting profiler', e)
204
+ log.error(
205
+ 'Error starting profiler. For troubleshooting tips, see ' +
206
+ '<https://dtdg.co/nodejs-profiler-troubleshooting>',
207
+ e
208
+ )
205
209
  }
206
210
  }
207
211
 
@@ -94,10 +94,11 @@ function Hook (modules, options, onrequire) {
94
94
  if (moduleLoadStartChannel.hasSubscribers) {
95
95
  moduleLoadStartChannel.publish(payload)
96
96
  }
97
- const exports = origRequire.apply(this, arguments)
97
+ let exports = origRequire.apply(this, arguments)
98
98
  payload.module = exports
99
99
  if (moduleLoadEndChannel.hasSubscribers) {
100
100
  moduleLoadEndChannel.publish(payload)
101
+ exports = payload.module
101
102
  }
102
103
 
103
104
  // The module has already been loaded,
@@ -8,7 +8,7 @@ const originals = new WeakMap()
8
8
 
9
9
  class Scope {
10
10
  active () {
11
- const store = storage.getStore()
11
+ const store = storage('legacy').getStore()
12
12
 
13
13
  return (store && store.span) || null
14
14
  }
@@ -16,10 +16,10 @@ class Scope {
16
16
  activate (span, callback) {
17
17
  if (typeof callback !== 'function') return callback
18
18
 
19
- const oldStore = storage.getStore()
20
- const newStore = span ? storage.getStore(span._store) : oldStore
19
+ const oldStore = storage('legacy').getStore()
20
+ const newStore = span ? storage('legacy').getStore(span._store) : oldStore
21
21
 
22
- storage.enterWith({ ...newStore, span })
22
+ storage('legacy').enterWith({ ...newStore, span })
23
23
 
24
24
  try {
25
25
  return callback()
@@ -30,7 +30,7 @@ class Scope {
30
30
 
31
31
  throw e
32
32
  } finally {
33
- storage.enterWith(oldStore)
33
+ storage('legacy').enterWith(oldStore)
34
34
  }
35
35
  }
36
36
 
@@ -83,7 +83,6 @@ module.exports.addSpan = function (span) {
83
83
 
84
84
  const now = Date.now()
85
85
  const expiration = now + LIFETIME
86
- // eslint-disable-next-line no-undef
87
86
  const wrapped = new WeakRef(span)
88
87
  spans.add(wrapped, expiration)
89
88
  // registry.register(span, span._name)
@@ -3,13 +3,11 @@
3
3
  const Tracer = require('./opentracing/tracer')
4
4
  const tags = require('../../../ext/tags')
5
5
  const Scope = require('./scope')
6
- const { storage } = require('../../datadog-core')
7
6
  const { isError } = require('./util')
8
7
  const { setStartupLogConfig } = require('./startup-log')
9
8
  const { ERROR_MESSAGE, ERROR_TYPE, ERROR_STACK } = require('../../dd-trace/src/constants')
10
9
  const { DataStreamsProcessor } = require('./datastreams/processor')
11
10
  const { DsmPathwayCodec } = require('./datastreams/pathway')
12
- const { DD_MAJOR } = require('../../../version')
13
11
  const DataStreamsContext = require('./data_streams_context')
14
12
  const { DataStreamsCheckpointer } = require('./data_streams')
15
13
  const { flushStartupLogs } = require('../../datadog-instrumentations/src/check_require_cache')
@@ -60,10 +58,6 @@ class DatadogTracer extends Tracer {
60
58
  childOf: this.scope().active()
61
59
  }, options)
62
60
 
63
- if (!options.childOf && options.orphanable === false && DD_MAJOR < 4) {
64
- return fn(null, () => {})
65
- }
66
-
67
61
  const span = this.startSpan(name, options)
68
62
 
69
63
  addTags(span, options)
@@ -106,19 +100,11 @@ class DatadogTracer extends Tracer {
106
100
  const tracer = this
107
101
 
108
102
  return function () {
109
- const store = storage.getStore()
110
-
111
- if (store && store.noop) return fn.apply(this, arguments)
112
-
113
103
  let optionsObj = options
114
104
  if (typeof optionsObj === 'function' && typeof fn === 'function') {
115
105
  optionsObj = optionsObj.apply(this, arguments)
116
106
  }
117
107
 
118
- if (optionsObj && optionsObj.orphanable === false && !tracer.scope().active() && DD_MAJOR < 4) {
119
- return fn.apply(this, arguments)
120
- }
121
-
122
108
  const lastArgId = arguments.length - 1
123
109
  const cb = arguments[lastArgId]
124
110
 
@@ -1,9 +0,0 @@
1
- {
2
- "name": "memwatch",
3
- "version": "1.0.0",
4
- "license": "BSD-3-Clause",
5
- "private": true,
6
- "dependencies": {
7
- "@airbnb/node-memwatch": "^1.0.2"
8
- }
9
- }