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.
- package/LICENSE-3rdparty.csv +2 -1
- package/index.d.ts +8 -7
- package/loader-hook.mjs +0 -4
- package/package.json +15 -14
- package/packages/datadog-core/index.js +1 -1
- package/packages/datadog-core/src/storage.js +76 -31
- package/packages/datadog-instrumentations/src/cucumber.js +54 -1
- package/packages/datadog-instrumentations/src/helpers/instrument.js +2 -2
- package/packages/datadog-instrumentations/src/helpers/register.js +2 -2
- package/packages/datadog-instrumentations/src/jest.js +105 -11
- package/packages/datadog-instrumentations/src/mocha/main.js +46 -4
- package/packages/datadog-instrumentations/src/mocha/utils.js +35 -2
- package/packages/datadog-instrumentations/src/mocha/worker.js +7 -0
- package/packages/datadog-instrumentations/src/mysql2.js +3 -3
- package/packages/datadog-instrumentations/src/openai.js +8 -0
- package/packages/datadog-instrumentations/src/playwright.js +70 -22
- package/packages/datadog-instrumentations/src/vitest.js +60 -6
- 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/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 +31 -14
- package/packages/datadog-plugin-cypress/src/cypress-plugin.js +72 -7
- package/packages/datadog-plugin-cypress/src/support.js +36 -29
- package/packages/datadog-plugin-dd-trace-api/src/index.js +1 -3
- package/packages/datadog-plugin-graphql/src/utils.js +8 -1
- 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 +17 -12
- 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 +35 -16
- package/packages/datadog-plugin-mongodb-core/src/index.js +28 -2
- package/packages/datadog-plugin-next/src/index.js +4 -4
- package/packages/datadog-plugin-openai/src/tracing.js +2 -3
- package/packages/datadog-plugin-playwright/src/index.js +35 -9
- 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 +36 -12
- package/packages/dd-trace/src/appsec/graphql.js +6 -6
- package/packages/dd-trace/src/appsec/iast/analyzers/code-injection-analyzer.js +3 -7
- package/packages/dd-trace/src/appsec/iast/analyzers/injection-analyzer.js +15 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/nosql-injection-mongodb-analyzer.js +17 -30
- 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 +7 -11
- package/packages/dd-trace/src/appsec/iast/analyzers/stored-injection-analyzer.js +11 -0
- package/packages/dd-trace/src/appsec/iast/analyzers/template-injection-analyzer.js +2 -6
- package/packages/dd-trace/src/appsec/iast/analyzers/vulnerability-analyzer.js +24 -4
- 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 +4 -2
- package/packages/dd-trace/src/appsec/iast/security-controls/index.js +187 -0
- package/packages/dd-trace/src/appsec/iast/security-controls/parser.js +96 -0
- package/packages/dd-trace/src/appsec/iast/taint-tracking/constants.js +6 -0
- package/packages/dd-trace/src/appsec/iast/taint-tracking/operations.js +2 -2
- 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/secure-marks-generator.js +1 -1
- package/packages/dd-trace/src/appsec/iast/taint-tracking/secure-marks.js +28 -0
- package/packages/dd-trace/src/appsec/iast/taint-tracking/taint-tracking-impl.js +1 -1
- package/packages/dd-trace/src/appsec/iast/telemetry/iast-metric.js +5 -0
- package/packages/dd-trace/src/appsec/iast/utils.js +24 -0
- package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/index.js +8 -13
- package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +1 -0
- package/packages/dd-trace/src/appsec/index.js +4 -4
- package/packages/dd-trace/src/appsec/rasp/command_injection.js +5 -5
- package/packages/dd-trace/src/appsec/rasp/fs-plugin.js +5 -5
- package/packages/dd-trace/src/appsec/rasp/lfi.js +3 -3
- package/packages/dd-trace/src/appsec/rasp/sql_injection.js +4 -4
- package/packages/dd-trace/src/appsec/rasp/ssrf.js +3 -3
- package/packages/dd-trace/src/appsec/reporter.js +3 -3
- package/packages/dd-trace/src/appsec/sdk/user_blocking.js +1 -1
- 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 +31 -56
- package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +20 -2
- package/packages/dd-trace/src/ci-visibility/quarantined-tests/get-quarantined-tests.js +62 -0
- package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +5 -2
- package/packages/dd-trace/src/ci-visibility/test-api-manual/test-api-manual-plugin.js +3 -3
- package/packages/dd-trace/src/config.js +18 -3
- package/packages/dd-trace/src/data_streams_context.js +2 -2
- package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +14 -7
- package/packages/dd-trace/src/debugger/devtools_client/source-maps.js +50 -0
- package/packages/dd-trace/src/debugger/devtools_client/state.js +38 -10
- 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/iitm.js +2 -2
- package/packages/dd-trace/src/llmobs/plugins/bedrockruntime.js +1 -1
- package/packages/dd-trace/src/llmobs/tagger.js +12 -2
- 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 +3 -3
- package/packages/dd-trace/src/plugin_manager.js +3 -1
- package/packages/dd-trace/src/plugins/apollo.js +1 -1
- package/packages/dd-trace/src/plugins/ci_plugin.js +51 -4
- package/packages/dd-trace/src/plugins/database.js +14 -4
- 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/inferred_proxy.js +1 -3
- package/packages/dd-trace/src/plugins/util/test.js +10 -4
- 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/proxy.js +5 -1
- package/packages/dd-trace/src/ritm.js +2 -1
- package/packages/dd-trace/src/scope.js +5 -5
- package/packages/dd-trace/src/spanleak.js +0 -1
- package/packages/dd-trace/src/tracer.js +0 -14
- 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('
|
|
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('
|
|
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('
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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',
|
|
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) {
|
|
@@ -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(
|
|
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
|
-
|
|
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
|
|
|
@@ -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
|
|