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