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.
- package/index.d.ts +3 -7
- package/package.json +4 -4
- package/packages/datadog-core/index.js +1 -1
- package/packages/datadog-core/src/storage.js +76 -31
- package/packages/datadog-instrumentations/src/aws-sdk.js +16 -0
- package/packages/datadog-instrumentations/src/helpers/hooks.js +1 -0
- package/packages/datadog-instrumentations/src/jest.js +3 -7
- package/packages/datadog-instrumentations/src/passport.js +45 -0
- package/packages/datadog-plugin-aerospike/src/index.js +1 -1
- package/packages/datadog-plugin-apollo/src/gateway/fetch.js +1 -1
- package/packages/datadog-plugin-apollo/src/gateway/index.js +1 -1
- package/packages/datadog-plugin-apollo/src/gateway/request.js +1 -1
- package/packages/datadog-plugin-aws-sdk/src/base.js +3 -3
- package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/utils.js +33 -6
- package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +4 -4
- package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +2 -2
- package/packages/datadog-plugin-azure-functions/src/index.js +1 -1
- package/packages/datadog-plugin-couchbase/src/index.js +2 -2
- package/packages/datadog-plugin-cucumber/src/index.js +11 -11
- package/packages/datadog-plugin-cypress/src/cypress-plugin.js +6 -1
- package/packages/datadog-plugin-cypress/src/support.js +36 -29
- package/packages/datadog-plugin-dd-trace-api/src/index.js +120 -0
- package/packages/datadog-plugin-grpc/src/client.js +1 -1
- package/packages/datadog-plugin-grpc/src/server.js +1 -1
- package/packages/datadog-plugin-hapi/src/index.js +1 -1
- package/packages/datadog-plugin-http/src/client.js +1 -1
- package/packages/datadog-plugin-http/src/server.js +1 -1
- package/packages/datadog-plugin-http2/src/client.js +3 -3
- package/packages/datadog-plugin-http2/src/server.js +1 -1
- package/packages/datadog-plugin-jest/src/index.js +6 -11
- package/packages/datadog-plugin-langchain/src/tracing.js +1 -1
- package/packages/datadog-plugin-mariadb/src/index.js +3 -3
- package/packages/datadog-plugin-mocha/src/index.js +13 -13
- package/packages/datadog-plugin-next/src/index.js +4 -4
- package/packages/datadog-plugin-openai/src/tracing.js +1 -1
- package/packages/datadog-plugin-playwright/src/index.js +4 -4
- package/packages/datadog-plugin-rhea/src/consumer.js +1 -1
- package/packages/datadog-plugin-router/src/index.js +2 -2
- package/packages/datadog-plugin-selenium/src/index.js +1 -1
- package/packages/datadog-plugin-vitest/src/index.js +11 -11
- package/packages/dd-trace/src/appsec/blocking.js +4 -1
- package/packages/dd-trace/src/appsec/channels.js +1 -0
- package/packages/dd-trace/src/appsec/graphql.js +6 -6
- package/packages/dd-trace/src/appsec/iast/analyzers/code-injection-analyzer.js +1 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/nosql-injection-mongodb-analyzer.js +6 -6
- package/packages/dd-trace/src/appsec/iast/analyzers/path-traversal-analyzer.js +2 -2
- package/packages/dd-trace/src/appsec/iast/analyzers/sql-injection-analyzer.js +5 -5
- package/packages/dd-trace/src/appsec/iast/analyzers/vulnerability-analyzer.js +2 -2
- package/packages/dd-trace/src/appsec/iast/analyzers/weak-hash-analyzer.js +2 -1
- package/packages/dd-trace/src/appsec/iast/context/context-plugin.js +2 -2
- package/packages/dd-trace/src/appsec/iast/iast-plugin.js +2 -2
- package/packages/dd-trace/src/appsec/iast/index.js +2 -2
- package/packages/dd-trace/src/appsec/iast/taint-tracking/constants.js +6 -0
- package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +8 -8
- package/packages/dd-trace/src/appsec/iast/taint-tracking/plugins/kafka.js +1 -1
- package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter-esm.mjs +65 -0
- package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter-telemetry.js +14 -5
- package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +80 -2
- package/packages/dd-trace/src/appsec/iast/taint-tracking/taint-tracking-impl.js +1 -1
- package/packages/dd-trace/src/appsec/index.js +20 -3
- package/packages/dd-trace/src/appsec/rasp/command_injection.js +1 -1
- package/packages/dd-trace/src/appsec/rasp/fs-plugin.js +5 -5
- package/packages/dd-trace/src/appsec/rasp/lfi.js +1 -1
- package/packages/dd-trace/src/appsec/rasp/sql_injection.js +2 -2
- package/packages/dd-trace/src/appsec/rasp/ssrf.js +1 -1
- package/packages/dd-trace/src/appsec/reporter.js +3 -3
- package/packages/dd-trace/src/appsec/sdk/set_user.js +9 -0
- package/packages/dd-trace/src/appsec/sdk/user_blocking.js +2 -1
- package/packages/dd-trace/src/appsec/telemetry.js +10 -0
- package/packages/dd-trace/src/appsec/user_tracking.js +32 -6
- package/packages/dd-trace/src/appsec/waf/index.js +1 -1
- package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/index.js +2 -0
- package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +17 -10
- package/packages/dd-trace/src/ci-visibility/test-api-manual/test-api-manual-plugin.js +3 -3
- package/packages/dd-trace/src/config.js +2 -0
- package/packages/dd-trace/src/data_streams_context.js +2 -2
- package/packages/dd-trace/src/debugger/devtools_client/state.js +8 -3
- package/packages/dd-trace/src/exporters/common/agents.js +1 -1
- package/packages/dd-trace/src/exporters/common/request.js +3 -3
- package/packages/dd-trace/src/llmobs/plugins/bedrockruntime.js +49 -4
- package/packages/dd-trace/src/log/writer.js +3 -3
- package/packages/dd-trace/src/noop/span.js +1 -1
- package/packages/dd-trace/src/opentracing/propagation/text_map.js +5 -4
- package/packages/dd-trace/src/opentracing/span.js +1 -1
- package/packages/dd-trace/src/plugin_manager.js +6 -1
- package/packages/dd-trace/src/plugins/apollo.js +1 -1
- package/packages/dd-trace/src/plugins/ci_plugin.js +35 -1
- package/packages/dd-trace/src/plugins/index.js +1 -0
- package/packages/dd-trace/src/plugins/log_plugin.js +1 -1
- package/packages/dd-trace/src/plugins/plugin.js +8 -8
- package/packages/dd-trace/src/plugins/tracing.js +3 -3
- package/packages/dd-trace/src/plugins/util/git.js +3 -3
- package/packages/dd-trace/src/plugins/util/test.js +5 -1
- package/packages/dd-trace/src/profiling/exporters/agent.js +3 -3
- package/packages/dd-trace/src/profiling/profilers/wall.js +1 -1
- package/packages/dd-trace/src/scope.js +5 -5
- 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
|
-
|
|
82
|
-
if (safeGetRum(
|
|
83
|
-
|
|
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
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
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
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
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:'
|
|
@@ -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)
|
|
@@ -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
|
|
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 {
|
|
366
|
-
this.runningTestProbeId = probeId
|
|
367
|
-
this.testErrorStackIndex = stackIndex
|
|
362
|
+
const { setProbePromise } = probeInformation
|
|
368
363
|
promises.isProbeReady = withTimeout(setProbePromise, 2000)
|
|
369
364
|
}
|
|
370
365
|
}
|
|
@@ -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.
|
|
223
|
-
this.removeDiProbe(this.
|
|
224
|
-
this.
|
|
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 {
|
|
279
|
-
this.
|
|
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
|
}
|
|
@@ -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 {
|
|
139
|
-
this.
|
|
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.
|
|
241
|
-
this.removeDiProbe(this.
|
|
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)
|