dd-trace 5.34.0 → 5.36.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 (97) hide show
  1. package/index.d.ts +3 -7
  2. package/package.json +4 -4
  3. package/packages/datadog-core/index.js +1 -1
  4. package/packages/datadog-core/src/storage.js +76 -31
  5. package/packages/datadog-instrumentations/src/aws-sdk.js +16 -0
  6. package/packages/datadog-instrumentations/src/helpers/hooks.js +1 -0
  7. package/packages/datadog-instrumentations/src/jest.js +3 -7
  8. package/packages/datadog-instrumentations/src/passport.js +45 -0
  9. package/packages/datadog-plugin-aerospike/src/index.js +1 -1
  10. package/packages/datadog-plugin-apollo/src/gateway/fetch.js +1 -1
  11. package/packages/datadog-plugin-apollo/src/gateway/index.js +1 -1
  12. package/packages/datadog-plugin-apollo/src/gateway/request.js +1 -1
  13. package/packages/datadog-plugin-aws-sdk/src/base.js +3 -3
  14. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/utils.js +33 -6
  15. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +4 -4
  16. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +2 -2
  17. package/packages/datadog-plugin-azure-functions/src/index.js +1 -1
  18. package/packages/datadog-plugin-couchbase/src/index.js +2 -2
  19. package/packages/datadog-plugin-cucumber/src/index.js +11 -11
  20. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +6 -1
  21. package/packages/datadog-plugin-cypress/src/support.js +36 -29
  22. package/packages/datadog-plugin-dd-trace-api/src/index.js +120 -0
  23. package/packages/datadog-plugin-grpc/src/client.js +1 -1
  24. package/packages/datadog-plugin-grpc/src/server.js +1 -1
  25. package/packages/datadog-plugin-hapi/src/index.js +1 -1
  26. package/packages/datadog-plugin-http/src/client.js +1 -1
  27. package/packages/datadog-plugin-http/src/server.js +1 -1
  28. package/packages/datadog-plugin-http2/src/client.js +3 -3
  29. package/packages/datadog-plugin-http2/src/server.js +1 -1
  30. package/packages/datadog-plugin-jest/src/index.js +6 -11
  31. package/packages/datadog-plugin-langchain/src/tracing.js +1 -1
  32. package/packages/datadog-plugin-mariadb/src/index.js +3 -3
  33. package/packages/datadog-plugin-mocha/src/index.js +13 -13
  34. package/packages/datadog-plugin-next/src/index.js +4 -4
  35. package/packages/datadog-plugin-openai/src/tracing.js +1 -1
  36. package/packages/datadog-plugin-playwright/src/index.js +4 -4
  37. package/packages/datadog-plugin-rhea/src/consumer.js +1 -1
  38. package/packages/datadog-plugin-router/src/index.js +2 -2
  39. package/packages/datadog-plugin-selenium/src/index.js +1 -1
  40. package/packages/datadog-plugin-vitest/src/index.js +11 -11
  41. package/packages/dd-trace/src/appsec/blocking.js +4 -1
  42. package/packages/dd-trace/src/appsec/channels.js +1 -0
  43. package/packages/dd-trace/src/appsec/graphql.js +6 -6
  44. package/packages/dd-trace/src/appsec/iast/analyzers/code-injection-analyzer.js +1 -1
  45. package/packages/dd-trace/src/appsec/iast/analyzers/nosql-injection-mongodb-analyzer.js +6 -6
  46. package/packages/dd-trace/src/appsec/iast/analyzers/path-traversal-analyzer.js +2 -2
  47. package/packages/dd-trace/src/appsec/iast/analyzers/sql-injection-analyzer.js +5 -5
  48. package/packages/dd-trace/src/appsec/iast/analyzers/vulnerability-analyzer.js +2 -2
  49. package/packages/dd-trace/src/appsec/iast/analyzers/weak-hash-analyzer.js +2 -1
  50. package/packages/dd-trace/src/appsec/iast/context/context-plugin.js +2 -2
  51. package/packages/dd-trace/src/appsec/iast/iast-plugin.js +2 -2
  52. package/packages/dd-trace/src/appsec/iast/index.js +2 -2
  53. package/packages/dd-trace/src/appsec/iast/taint-tracking/constants.js +6 -0
  54. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +8 -8
  55. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugins/kafka.js +1 -1
  56. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter-esm.mjs +65 -0
  57. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter-telemetry.js +14 -5
  58. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +80 -2
  59. package/packages/dd-trace/src/appsec/iast/taint-tracking/taint-tracking-impl.js +1 -1
  60. package/packages/dd-trace/src/appsec/index.js +20 -3
  61. package/packages/dd-trace/src/appsec/rasp/command_injection.js +1 -1
  62. package/packages/dd-trace/src/appsec/rasp/fs-plugin.js +5 -5
  63. package/packages/dd-trace/src/appsec/rasp/lfi.js +1 -1
  64. package/packages/dd-trace/src/appsec/rasp/sql_injection.js +2 -2
  65. package/packages/dd-trace/src/appsec/rasp/ssrf.js +1 -1
  66. package/packages/dd-trace/src/appsec/reporter.js +3 -3
  67. package/packages/dd-trace/src/appsec/sdk/set_user.js +9 -0
  68. package/packages/dd-trace/src/appsec/sdk/user_blocking.js +2 -1
  69. package/packages/dd-trace/src/appsec/telemetry.js +10 -0
  70. package/packages/dd-trace/src/appsec/user_tracking.js +32 -6
  71. package/packages/dd-trace/src/appsec/waf/index.js +1 -1
  72. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/index.js +2 -0
  73. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +17 -10
  74. package/packages/dd-trace/src/ci-visibility/test-api-manual/test-api-manual-plugin.js +3 -3
  75. package/packages/dd-trace/src/config.js +2 -0
  76. package/packages/dd-trace/src/data_streams_context.js +2 -2
  77. package/packages/dd-trace/src/debugger/devtools_client/state.js +8 -3
  78. package/packages/dd-trace/src/exporters/common/agents.js +1 -1
  79. package/packages/dd-trace/src/exporters/common/request.js +3 -3
  80. package/packages/dd-trace/src/llmobs/plugins/bedrockruntime.js +49 -4
  81. package/packages/dd-trace/src/log/writer.js +3 -3
  82. package/packages/dd-trace/src/noop/span.js +1 -1
  83. package/packages/dd-trace/src/opentracing/propagation/text_map.js +5 -4
  84. package/packages/dd-trace/src/opentracing/span.js +1 -1
  85. package/packages/dd-trace/src/plugin_manager.js +6 -1
  86. package/packages/dd-trace/src/plugins/apollo.js +1 -1
  87. package/packages/dd-trace/src/plugins/ci_plugin.js +35 -1
  88. package/packages/dd-trace/src/plugins/index.js +1 -0
  89. package/packages/dd-trace/src/plugins/log_plugin.js +1 -1
  90. package/packages/dd-trace/src/plugins/plugin.js +8 -8
  91. package/packages/dd-trace/src/plugins/tracing.js +3 -3
  92. package/packages/dd-trace/src/plugins/util/git.js +3 -3
  93. package/packages/dd-trace/src/plugins/util/test.js +5 -1
  94. package/packages/dd-trace/src/profiling/exporters/agent.js +3 -3
  95. package/packages/dd-trace/src/profiling/profilers/wall.js +1 -1
  96. package/packages/dd-trace/src/scope.js +5 -5
  97. package/packages/dd-trace/src/tracer.js +0 -14
@@ -4,6 +4,10 @@ let isKnownTestsEnabled = false
4
4
  let knownTestsForSuite = []
5
5
  let suiteTests = []
6
6
  let earlyFlakeDetectionNumRetries = 0
7
+ // We need to grab the original window as soon as possible,
8
+ // in case the test changes the origin. If the test does change the origin,
9
+ // any call to `cy.window()` will result in a cross origin error.
10
+ let originalWindow
7
11
 
8
12
  // If the test is using multi domain with cy.origin, trying to access
9
13
  // window properties will result in a cross origin error.
@@ -61,6 +65,9 @@ beforeEach(function () {
61
65
  this.skip()
62
66
  }
63
67
  })
68
+ cy.window().then(win => {
69
+ originalWindow = win
70
+ })
64
71
  })
65
72
 
66
73
  before(function () {
@@ -78,39 +85,39 @@ before(function () {
78
85
  })
79
86
 
80
87
  after(() => {
81
- cy.window().then(win => {
82
- if (safeGetRum(win)) {
83
- win.dispatchEvent(new Event('beforeunload'))
88
+ try {
89
+ if (safeGetRum(originalWindow)) {
90
+ originalWindow.dispatchEvent(new Event('beforeunload'))
84
91
  }
85
- })
92
+ } catch (e) {
93
+ // ignore error. It's usually a multi origin issue.
94
+ }
86
95
  })
87
96
 
88
97
 
89
98
  afterEach(function () {
90
- cy.window().then(win => {
91
- const currentTest = Cypress.mocha.getRunner().suite.ctx.currentTest
92
- const testInfo = {
93
- testName: currentTest.fullTitle(),
94
- testSuite: Cypress.mocha.getRootSuite().file,
95
- testSuiteAbsolutePath: Cypress.spec && Cypress.spec.absolute,
96
- state: currentTest.state,
97
- error: currentTest.err,
98
- isNew: currentTest._ddIsNew,
99
- isEfdRetry: currentTest._ddIsEfdRetry
100
- }
101
- try {
102
- testInfo.testSourceLine = Cypress.mocha.getRunner().currentRunnable.invocationDetails.line
103
- } catch (e) {}
99
+ const currentTest = Cypress.mocha.getRunner().suite.ctx.currentTest
100
+ const testInfo = {
101
+ testName: currentTest.fullTitle(),
102
+ testSuite: Cypress.mocha.getRootSuite().file,
103
+ testSuiteAbsolutePath: Cypress.spec && Cypress.spec.absolute,
104
+ state: currentTest.state,
105
+ error: currentTest.err,
106
+ isNew: currentTest._ddIsNew,
107
+ isEfdRetry: currentTest._ddIsEfdRetry
108
+ }
109
+ try {
110
+ testInfo.testSourceLine = Cypress.mocha.getRunner().currentRunnable.invocationDetails.line
111
+ } catch (e) {}
104
112
 
105
- if (safeGetRum(win)) {
106
- testInfo.isRUMActive = true
107
- }
108
- let coverage
109
- try {
110
- coverage = win.__coverage__
111
- } catch (e) {
112
- // ignore error and continue
113
- }
114
- cy.task('dd:afterEach', { test: testInfo, coverage })
115
- })
113
+ if (safeGetRum(originalWindow)) {
114
+ testInfo.isRUMActive = true
115
+ }
116
+ let coverage
117
+ try {
118
+ coverage = originalWindow.__coverage__
119
+ } catch (e) {
120
+ // ignore error and continue
121
+ }
122
+ cy.task('dd:afterEach', { test: testInfo, coverage })
116
123
  })
@@ -0,0 +1,120 @@
1
+ 'use strict'
2
+
3
+ const Plugin = require('../../dd-trace/src/plugins/plugin')
4
+ const telemetryMetrics = require('../../dd-trace/src/telemetry/metrics')
5
+ const apiMetrics = telemetryMetrics.manager.namespace('tracers')
6
+
7
+ // api ==> here
8
+ const objectMap = new WeakMap()
9
+
10
+ const injectionEnabledTag =
11
+ `injection_enabled:${process.env.DD_INJECTION_ENABLED ? 'yes' : 'no'}`
12
+
13
+ module.exports = class DdTraceApiPlugin extends Plugin {
14
+ static get id () {
15
+ return 'dd-trace-api'
16
+ }
17
+
18
+ constructor (...args) {
19
+ super(...args)
20
+
21
+ const tracer = this._tracer
22
+
23
+ this.addSub('datadog-api:v1:tracerinit', ({ proxy }) => {
24
+ const proxyVal = proxy()
25
+ objectMap.set(proxyVal, tracer)
26
+ objectMap.set(proxyVal.appsec, tracer.appsec)
27
+ objectMap.set(proxyVal.dogstatsd, tracer.dogstatsd)
28
+ })
29
+
30
+ const handleEvent = (name) => {
31
+ const counter = apiMetrics.count('dd_trace_api.called', [
32
+ `name:${name.replaceAll(':', '.')}`,
33
+ 'api_version:v1',
34
+ injectionEnabledTag
35
+ ])
36
+
37
+ // For v1, APIs are 1:1 with their internal equivalents, so we can just
38
+ // call the internal method directly. That's what we do here unless we
39
+ // want to override. As the API evolves, this may change.
40
+ this.addSub(`datadog-api:v1:${name}`, ({ self, args, ret, proxy, revProxy }) => {
41
+ counter.inc()
42
+
43
+ if (name.includes(':')) {
44
+ name = name.split(':').pop()
45
+ }
46
+
47
+ if (objectMap.has(self)) {
48
+ self = objectMap.get(self)
49
+ }
50
+
51
+ for (let i = 0; i < args.length; i++) {
52
+ if (objectMap.has(args[i])) {
53
+ args[i] = objectMap.get(args[i])
54
+ }
55
+ if (typeof args[i] === 'function') {
56
+ const orig = args[i]
57
+ args[i] = (...fnArgs) => {
58
+ for (let j = 0; j < fnArgs.length; j++) {
59
+ if (revProxy && revProxy[j]) {
60
+ const proxyVal = revProxy[j]()
61
+ objectMap.set(proxyVal, fnArgs[j])
62
+ fnArgs[j] = proxyVal
63
+ }
64
+ }
65
+ // TODO do we need to apply(this, ...) here?
66
+ return orig(...fnArgs)
67
+ }
68
+ }
69
+ }
70
+
71
+ try {
72
+ ret.value = self[name](...args)
73
+ if (proxy) {
74
+ const proxyVal = proxy()
75
+ objectMap.set(proxyVal, ret.value)
76
+ ret.value = proxyVal
77
+ } else if (ret.value && typeof ret.value === 'object') {
78
+ throw new TypeError(`Objects need proxies when returned via API (${name})`)
79
+ }
80
+ } catch (e) {
81
+ ret.error = e
82
+ }
83
+ })
84
+ }
85
+
86
+ // handleEvent('configure')
87
+ handleEvent('startSpan')
88
+ handleEvent('wrap')
89
+ handleEvent('trace')
90
+ handleEvent('inject')
91
+ handleEvent('extract')
92
+ handleEvent('getRumData')
93
+ handleEvent('profilerStarted')
94
+ handleEvent('context:toTraceId')
95
+ handleEvent('context:toSpanId')
96
+ handleEvent('context:toTraceparent')
97
+ handleEvent('span:context')
98
+ handleEvent('span:setTag')
99
+ handleEvent('span:addTags')
100
+ handleEvent('span:finish')
101
+ handleEvent('span:addLink')
102
+ handleEvent('scope')
103
+ handleEvent('scope:activate')
104
+ handleEvent('scope:active')
105
+ handleEvent('scope:bind')
106
+ handleEvent('appsec:blockRequest')
107
+ handleEvent('appsec:isUserBlocked')
108
+ handleEvent('appsec:setUser')
109
+ handleEvent('appsec:trackCustomEvent')
110
+ handleEvent('appsec:trackUserLoginFailureEvent')
111
+ handleEvent('appsec:trackUserLoginSuccessEvent')
112
+ handleEvent('dogstatsd:decrement')
113
+ handleEvent('dogstatsd:distribution')
114
+ handleEvent('dogstatsd:flush')
115
+ handleEvent('dogstatsd:gauge')
116
+ handleEvent('dogstatsd:histogram')
117
+ handleEvent('dogstatsd:increment')
118
+ handleEvent('use')
119
+ }
120
+ }
@@ -20,7 +20,7 @@ class GrpcClientPlugin extends ClientPlugin {
20
20
  }
21
21
 
22
22
  bindStart (message) {
23
- const store = storage.getStore()
23
+ const store = storage('legacy').getStore()
24
24
  const { metadata, path, type } = message
25
25
  const metadataFilter = this.config.metadataFilter
26
26
  const method = getMethodMetadata(path, type)
@@ -27,7 +27,7 @@ class GrpcServerPlugin extends ServerPlugin {
27
27
  }
28
28
 
29
29
  bindStart (message) {
30
- const store = storage.getStore()
30
+ const store = storage('legacy').getStore()
31
31
  const { name, metadata, type } = message
32
32
  const metadataFilter = this.config.metadataFilter
33
33
  const childOf = extract(this.tracer, metadata)
@@ -15,7 +15,7 @@ class HapiPlugin extends RouterPlugin {
15
15
  this._requestSpans = new WeakMap()
16
16
 
17
17
  this.addSub('apm:hapi:request:handle', ({ req }) => {
18
- const store = storage.getStore()
18
+ const store = storage('legacy').getStore()
19
19
  const span = store && store.span
20
20
 
21
21
  this.setFramework(req, 'hapi', this.config)
@@ -21,7 +21,7 @@ class HttpClientPlugin extends ClientPlugin {
21
21
 
22
22
  bindStart (message) {
23
23
  const { args, http = {} } = message
24
- const store = storage.getStore()
24
+ const store = storage('legacy').getStore()
25
25
  const options = args.options
26
26
  const agent = options.agent || options._defaultAgent || http.globalAgent || {}
27
27
  const protocol = options.protocol || agent.protocol || 'http:'
@@ -22,7 +22,7 @@ class HttpServerPlugin extends ServerPlugin {
22
22
  }
23
23
 
24
24
  start ({ req, res, abortController }) {
25
- const store = storage.getStore()
25
+ const store = storage('legacy').getStore()
26
26
  const span = web.startSpan(
27
27
  this.tracer,
28
28
  {
@@ -36,7 +36,7 @@ class Http2ClientPlugin extends ClientPlugin {
36
36
  const uri = `${sessionDetails.protocol}//${sessionDetails.host}:${sessionDetails.port}${pathname}`
37
37
  const allowed = this.config.filter(uri)
38
38
 
39
- const store = storage.getStore()
39
+ const store = storage('legacy').getStore()
40
40
  const childOf = store && allowed ? store.span : null
41
41
  const span = this.startSpan(this.operationName(), {
42
42
  childOf,
@@ -85,7 +85,7 @@ class Http2ClientPlugin extends ClientPlugin {
85
85
  return parentStore
86
86
  }
87
87
 
88
- return storage.getStore()
88
+ return storage('legacy').getStore()
89
89
  }
90
90
 
91
91
  configure (config) {
@@ -98,7 +98,7 @@ class Http2ClientPlugin extends ClientPlugin {
98
98
  store.span.setTag(HTTP_STATUS_CODE, status)
99
99
 
100
100
  if (!this.config.validateStatus(status)) {
101
- storage.run(store, () => this.addError())
101
+ storage('legacy').run(store, () => this.addError())
102
102
  }
103
103
 
104
104
  addHeaderTags(store.span, headers, HTTP_RESPONSE_HEADERS, this.config)
@@ -17,7 +17,7 @@ class Http2ServerPlugin extends ServerPlugin {
17
17
  }
18
18
 
19
19
  start ({ req, res }) {
20
- const store = storage.getStore()
20
+ const store = storage('legacy').getStore()
21
21
  const span = web.startSpan(
22
22
  this.tracer,
23
23
  {
@@ -291,6 +291,7 @@ class JestPlugin extends CiPlugin {
291
291
  if (isJestWorker) {
292
292
  this.tracer._exporter.flush()
293
293
  }
294
+ this.removeAllDiProbes()
294
295
  })
295
296
 
296
297
  /**
@@ -317,15 +318,15 @@ class JestPlugin extends CiPlugin {
317
318
  })
318
319
 
319
320
  this.addSub('ci:jest:test:start', (test) => {
320
- const store = storage.getStore()
321
+ const store = storage('legacy').getStore()
321
322
  const span = this.startTestSpan(test)
322
323
 
323
324
  this.enter(span, store)
324
325
  this.activeTestSpan = span
325
326
  })
326
327
 
327
- this.addSub('ci:jest:test:finish', ({ status, testStartLine, promises, shouldRemoveProbe }) => {
328
- const span = storage.getStore().span
328
+ this.addSub('ci:jest:test:finish', ({ status, testStartLine }) => {
329
+ const span = storage('legacy').getStore().span
329
330
  span.setTag(TEST_STATUS, status)
330
331
  if (testStartLine) {
331
332
  span.setTag(TEST_SOURCE_START, testStartLine)
@@ -346,15 +347,11 @@ class JestPlugin extends CiPlugin {
346
347
  span.finish()
347
348
  finishAllTraceSpans(span)
348
349
  this.activeTestSpan = null
349
- if (shouldRemoveProbe && this.runningTestProbeId) {
350
- promises.isProbeRemoved = withTimeout(this.removeDiProbe(this.runningTestProbeId), 2000)
351
- this.runningTestProbeId = null
352
- }
353
350
  })
354
351
 
355
352
  this.addSub('ci:jest:test:err', ({ error, shouldSetProbe, promises }) => {
356
353
  if (error) {
357
- const store = storage.getStore()
354
+ const store = storage('legacy').getStore()
358
355
  if (store && store.span) {
359
356
  const span = store.span
360
357
  span.setTag(TEST_STATUS, 'fail')
@@ -362,9 +359,7 @@ class JestPlugin extends CiPlugin {
362
359
  if (shouldSetProbe) {
363
360
  const probeInformation = this.addDiProbe(error)
364
361
  if (probeInformation) {
365
- const { probeId, setProbePromise, stackIndex } = probeInformation
366
- this.runningTestProbeId = probeId
367
- this.testErrorStackIndex = stackIndex
362
+ const { setProbePromise } = probeInformation
368
363
  promises.isProbeReady = withTimeout(setProbePromise, 2000)
369
364
  }
370
365
  }
@@ -61,7 +61,7 @@ class LangChainTracingPlugin extends TracingPlugin {
61
61
  }
62
62
  }, false)
63
63
 
64
- const store = storage.getStore() || {}
64
+ const store = storage('legacy').getStore() || {}
65
65
  ctx.currentStore = { ...store, span }
66
66
 
67
67
  return ctx.currentStore
@@ -13,12 +13,12 @@ class MariadbPlugin extends MySQLPlugin {
13
13
  super(...args)
14
14
 
15
15
  this.addSub(`apm:${this.component}:pool:skip`, () => {
16
- skippedStore = storage.getStore()
17
- storage.enterWith({ noop: true })
16
+ skippedStore = storage('legacy').getStore()
17
+ storage('legacy').enterWith({ noop: true })
18
18
  })
19
19
 
20
20
  this.addSub(`apm:${this.component}:pool:unskip`, () => {
21
- storage.enterWith(skippedStore)
21
+ storage('legacy').enterWith(skippedStore)
22
22
  skippedStore = undefined
23
23
  })
24
24
  }
@@ -155,13 +155,13 @@ class MochaPlugin extends CiPlugin {
155
155
  if (itrCorrelationId) {
156
156
  testSuiteSpan.setTag(ITR_CORRELATION_ID, itrCorrelationId)
157
157
  }
158
- const store = storage.getStore()
158
+ const store = storage('legacy').getStore()
159
159
  this.enter(testSuiteSpan, store)
160
160
  this._testSuites.set(testSuite, testSuiteSpan)
161
161
  })
162
162
 
163
163
  this.addSub('ci:mocha:test-suite:finish', (status) => {
164
- const store = storage.getStore()
164
+ const store = storage('legacy').getStore()
165
165
  if (store && store.span) {
166
166
  const span = store.span
167
167
  // the test status of the suite may have been set in ci:mocha:test-suite:error already
@@ -174,7 +174,7 @@ class MochaPlugin extends CiPlugin {
174
174
  })
175
175
 
176
176
  this.addSub('ci:mocha:test-suite:error', (err) => {
177
- const store = storage.getStore()
177
+ const store = storage('legacy').getStore()
178
178
  if (store && store.span) {
179
179
  const span = store.span
180
180
  span.setTag('error', err)
@@ -183,7 +183,7 @@ class MochaPlugin extends CiPlugin {
183
183
  })
184
184
 
185
185
  this.addSub('ci:mocha:test:start', (testInfo) => {
186
- const store = storage.getStore()
186
+ const store = storage('legacy').getStore()
187
187
  const span = this.startTestSpan(testInfo)
188
188
 
189
189
  this.enter(span, store)
@@ -195,7 +195,7 @@ class MochaPlugin extends CiPlugin {
195
195
  })
196
196
 
197
197
  this.addSub('ci:mocha:test:finish', ({ status, hasBeenRetried, isLastRetry }) => {
198
- const store = storage.getStore()
198
+ const store = storage('legacy').getStore()
199
199
  const span = store?.span
200
200
 
201
201
  if (span) {
@@ -219,15 +219,15 @@ class MochaPlugin extends CiPlugin {
219
219
  span.finish()
220
220
  finishAllTraceSpans(span)
221
221
  this.activeTestSpan = null
222
- if (this.di && this.libraryConfig?.isDiEnabled && this.runningTestProbeId && isLastRetry) {
223
- this.removeDiProbe(this.runningTestProbeId)
224
- this.runningTestProbeId = null
222
+ if (this.di && this.libraryConfig?.isDiEnabled && this.runningTestProbe && isLastRetry) {
223
+ this.removeDiProbe(this.runningTestProbe)
224
+ this.runningTestProbe = null
225
225
  }
226
226
  }
227
227
  })
228
228
 
229
229
  this.addSub('ci:mocha:test:skip', (testInfo) => {
230
- const store = storage.getStore()
230
+ const store = storage('legacy').getStore()
231
231
  // skipped through it.skip, so the span is not created yet
232
232
  // for this test
233
233
  if (!store) {
@@ -237,7 +237,7 @@ class MochaPlugin extends CiPlugin {
237
237
  })
238
238
 
239
239
  this.addSub('ci:mocha:test:error', (err) => {
240
- const store = storage.getStore()
240
+ const store = storage('legacy').getStore()
241
241
  const span = store?.span
242
242
  if (err && span) {
243
243
  if (err.constructor.name === 'Pending' && !this.forbidPending) {
@@ -250,7 +250,7 @@ class MochaPlugin extends CiPlugin {
250
250
  })
251
251
 
252
252
  this.addSub('ci:mocha:test:retry', ({ isFirstAttempt, willBeRetried, err, test }) => {
253
- const store = storage.getStore()
253
+ const store = storage('legacy').getStore()
254
254
  const span = store?.span
255
255
  if (span) {
256
256
  span.setTag(TEST_STATUS, 'fail')
@@ -275,8 +275,8 @@ class MochaPlugin extends CiPlugin {
275
275
  if (isFirstAttempt && willBeRetried && this.di && this.libraryConfig?.isDiEnabled) {
276
276
  const probeInformation = this.addDiProbe(err)
277
277
  if (probeInformation) {
278
- const { probeId, stackIndex } = probeInformation
279
- this.runningTestProbeId = probeId
278
+ const { file, line, stackIndex } = probeInformation
279
+ this.runningTestProbe = { file, line }
280
280
  this.testErrorStackIndex = stackIndex
281
281
  test._ddShouldWaitForHitProbe = true
282
282
  // TODO: we're not waiting for setProbePromise to be resolved, so there might be race conditions
@@ -20,7 +20,7 @@ class NextPlugin extends ServerPlugin {
20
20
  }
21
21
 
22
22
  bindStart ({ req, res }) {
23
- const store = storage.getStore()
23
+ const store = storage('legacy').getStore()
24
24
  const childOf = store ? store.span : store
25
25
  const span = this.tracer.startSpan(this.operationName(), {
26
26
  childOf,
@@ -43,7 +43,7 @@ class NextPlugin extends ServerPlugin {
43
43
 
44
44
  error ({ span, error }) {
45
45
  if (!span) {
46
- const store = storage.getStore()
46
+ const store = storage('legacy').getStore()
47
47
  if (!store) return
48
48
 
49
49
  span = store.span
@@ -53,7 +53,7 @@ class NextPlugin extends ServerPlugin {
53
53
  }
54
54
 
55
55
  finish ({ req, res, nextRequest = {} }) {
56
- const store = storage.getStore()
56
+ const store = storage('legacy').getStore()
57
57
 
58
58
  if (!store) return
59
59
 
@@ -85,7 +85,7 @@ class NextPlugin extends ServerPlugin {
85
85
  }
86
86
 
87
87
  pageLoad ({ page, isAppPath = false, isStatic = false }) {
88
- const store = storage.getStore()
88
+ const store = storage('legacy').getStore()
89
89
 
90
90
  if (!store) return
91
91
 
@@ -60,7 +60,7 @@ class OpenAiTracingPlugin extends TracingPlugin {
60
60
  bindStart (ctx) {
61
61
  const { methodName, args, basePath, apiKey } = ctx
62
62
  const payload = normalizeRequestPayload(methodName, args)
63
- const store = storage.getStore() || {}
63
+ const store = storage('legacy').getStore() || {}
64
64
 
65
65
  const span = this.startSpan('openai.request', {
66
66
  service: this.config.service,
@@ -68,7 +68,7 @@ class PlaywrightPlugin extends CiPlugin {
68
68
  })
69
69
 
70
70
  this.addSub('ci:playwright:test-suite:start', (testSuiteAbsolutePath) => {
71
- const store = storage.getStore()
71
+ const store = storage('legacy').getStore()
72
72
  const testSuite = getTestSuitePath(testSuiteAbsolutePath, this.rootDir)
73
73
  const testSourceFile = getTestSuitePath(testSuiteAbsolutePath, this.repositoryRoot)
74
74
 
@@ -102,7 +102,7 @@ class PlaywrightPlugin extends CiPlugin {
102
102
  })
103
103
 
104
104
  this.addSub('ci:playwright:test-suite:finish', ({ status, error }) => {
105
- const store = storage.getStore()
105
+ const store = storage('legacy').getStore()
106
106
  const span = store && store.span
107
107
  if (!span) return
108
108
  if (error) {
@@ -121,7 +121,7 @@ class PlaywrightPlugin extends CiPlugin {
121
121
  })
122
122
 
123
123
  this.addSub('ci:playwright:test:start', ({ testName, testSuiteAbsolutePath, testSourceLine, browserName }) => {
124
- const store = storage.getStore()
124
+ const store = storage('legacy').getStore()
125
125
  const testSuite = getTestSuitePath(testSuiteAbsolutePath, this.rootDir)
126
126
  const testSourceFile = getTestSuitePath(testSuiteAbsolutePath, this.repositoryRoot)
127
127
  const span = this.startTestSpan(testName, testSuite, testSourceFile, testSourceLine, browserName)
@@ -129,7 +129,7 @@ class PlaywrightPlugin extends CiPlugin {
129
129
  this.enter(span, store)
130
130
  })
131
131
  this.addSub('ci:playwright:test:finish', ({ testStatus, steps, error, extraTags, isNew, isEfdRetry, isRetry }) => {
132
- const store = storage.getStore()
132
+ const store = storage('legacy').getStore()
133
133
  const span = store && store.span
134
134
  if (!span) return
135
135
 
@@ -11,7 +11,7 @@ class RheaConsumerPlugin extends ConsumerPlugin {
11
11
  super(...args)
12
12
 
13
13
  this.addTraceSub('dispatch', ({ state }) => {
14
- const span = storage.getStore().span
14
+ const span = storage('legacy').getStore().span
15
15
  span.setTag('amqp.delivery.state', state)
16
16
  })
17
17
  }
@@ -29,7 +29,7 @@ class RouterPlugin extends WebPlugin {
29
29
  context.middleware.push(span)
30
30
  }
31
31
 
32
- const store = storage.getStore()
32
+ const store = storage('legacy').getStore()
33
33
  this._storeStack.push(store)
34
34
  this.enter(span, store)
35
35
 
@@ -94,7 +94,7 @@ class RouterPlugin extends WebPlugin {
94
94
  }
95
95
 
96
96
  _getStoreSpan () {
97
- const store = storage.getStore()
97
+ const store = storage('legacy').getStore()
98
98
 
99
99
  return store && store.span
100
100
  }
@@ -39,7 +39,7 @@ class SeleniumPlugin extends CiPlugin {
39
39
  browserVersion,
40
40
  isRumActive
41
41
  }) => {
42
- const store = storage.getStore()
42
+ const store = storage('legacy').getStore()
43
43
  const span = store?.span
44
44
  if (!span) {
45
45
  return
@@ -70,7 +70,7 @@ class VitestPlugin extends CiPlugin {
70
70
  isRetryReasonEfd
71
71
  }) => {
72
72
  const testSuite = getTestSuitePath(testSuiteAbsolutePath, this.repositoryRoot)
73
- const store = storage.getStore()
73
+ const store = storage('legacy').getStore()
74
74
 
75
75
  const extraTags = {
76
76
  [TEST_SOURCE_FILE]: testSuite
@@ -102,7 +102,7 @@ class VitestPlugin extends CiPlugin {
102
102
  })
103
103
 
104
104
  this.addSub('ci:vitest:test:finish-time', ({ status, task }) => {
105
- const store = storage.getStore()
105
+ const store = storage('legacy').getStore()
106
106
  const span = store?.span
107
107
 
108
108
  // we store the finish time to finish at a later hook
@@ -114,7 +114,7 @@ class VitestPlugin extends CiPlugin {
114
114
  })
115
115
 
116
116
  this.addSub('ci:vitest:test:pass', ({ task }) => {
117
- const store = storage.getStore()
117
+ const store = storage('legacy').getStore()
118
118
  const span = store?.span
119
119
 
120
120
  if (span) {
@@ -128,15 +128,15 @@ class VitestPlugin extends CiPlugin {
128
128
  })
129
129
 
130
130
  this.addSub('ci:vitest:test:error', ({ duration, error, shouldSetProbe, promises }) => {
131
- const store = storage.getStore()
131
+ const store = storage('legacy').getStore()
132
132
  const span = store?.span
133
133
 
134
134
  if (span) {
135
135
  if (shouldSetProbe && this.di) {
136
136
  const probeInformation = this.addDiProbe(error)
137
137
  if (probeInformation) {
138
- const { probeId, stackIndex, setProbePromise } = probeInformation
139
- this.runningTestProbeId = probeId
138
+ const { file, line, stackIndex, setProbePromise } = probeInformation
139
+ this.runningTestProbe = { file, line }
140
140
  this.testErrorStackIndex = stackIndex
141
141
  promises.setProbePromise = setProbePromise
142
142
  }
@@ -221,13 +221,13 @@ class VitestPlugin extends CiPlugin {
221
221
  }
222
222
  })
223
223
  this.telemetry.ciVisEvent(TELEMETRY_EVENT_CREATED, 'suite')
224
- const store = storage.getStore()
224
+ const store = storage('legacy').getStore()
225
225
  this.enter(testSuiteSpan, store)
226
226
  this.testSuiteSpan = testSuiteSpan
227
227
  })
228
228
 
229
229
  this.addSub('ci:vitest:test-suite:finish', ({ status, onFinish }) => {
230
- const store = storage.getStore()
230
+ const store = storage('legacy').getStore()
231
231
  const span = store?.span
232
232
  if (span) {
233
233
  span.setTag(TEST_STATUS, status)
@@ -237,13 +237,13 @@ class VitestPlugin extends CiPlugin {
237
237
  this.telemetry.ciVisEvent(TELEMETRY_EVENT_FINISHED, 'suite')
238
238
  // TODO: too frequent flush - find for method in worker to decrease frequency
239
239
  this.tracer._exporter.flush(onFinish)
240
- if (this.runningTestProbeId) {
241
- this.removeDiProbe(this.runningTestProbeId)
240
+ if (this.runningTestProbe) {
241
+ this.removeDiProbe(this.runningTestProbe)
242
242
  }
243
243
  })
244
244
 
245
245
  this.addSub('ci:vitest:test-suite:error', ({ error }) => {
246
- const store = storage.getStore()
246
+ const store = storage('legacy').getStore()
247
247
  const span = store?.span
248
248
  if (span && error) {
249
249
  span.setTag('error', error)