dd-trace 6.8.0 → 6.9.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/diagnose.js +27 -25
- package/ci/init.js +6 -6
- package/ci/runbook.md +114 -20
- package/ci/test-optimization-validation/approval-artifacts.js +36 -3
- package/ci/test-optimization-validation/approval.js +78 -22
- package/ci/test-optimization-validation/blocker-category.js +24 -0
- package/ci/test-optimization-validation/ci-discovery.js +23 -17
- package/ci/test-optimization-validation/ci-package-scripts.js +34 -6
- package/ci/test-optimization-validation/ci-remediation.js +1 -1
- package/ci/test-optimization-validation/cli.js +280 -52
- package/ci/test-optimization-validation/command-blocker.js +159 -20
- package/ci/test-optimization-validation/command-output-policy.js +9 -3
- package/ci/test-optimization-validation/command-runner.js +9 -7
- package/ci/test-optimization-validation/environment.js +4 -2
- package/ci/test-optimization-validation/executable.js +15 -13
- package/ci/test-optimization-validation/execution-lock.js +70 -0
- package/ci/test-optimization-validation/framework-adapters/cucumber-validation.json +3 -0
- package/ci/test-optimization-validation/framework-adapters/cucumber.js +657 -5
- package/ci/test-optimization-validation/framework-adapters/vitest.js +517 -0
- package/ci/test-optimization-validation/generated-files.js +38 -28
- package/ci/test-optimization-validation/generated-test-contract.js +8 -4
- package/ci/test-optimization-validation/generated-verifier.js +24 -17
- package/ci/test-optimization-validation/literal-glob.js +52 -0
- package/ci/test-optimization-validation/manifest-loader.js +3 -0
- package/ci/test-optimization-validation/manifest-scaffold.js +300 -50
- package/ci/test-optimization-validation/manifest-schema.js +80 -17
- package/ci/test-optimization-validation/offline-fixtures.js +13 -4
- package/ci/test-optimization-validation/package-check.js +94 -0
- package/ci/test-optimization-validation/plan-writer.js +183 -10
- package/ci/test-optimization-validation/preflight-runner.js +110 -31
- package/ci/test-optimization-validation/project-build-artifact.js +31 -0
- package/ci/test-optimization-validation/redaction.js +18 -27
- package/ci/test-optimization-validation/report-writer.js +182 -48
- package/ci/test-optimization-validation/result-semantics.js +20 -3
- package/ci/test-optimization-validation/runner-command.js +40 -20
- package/ci/test-optimization-validation/runner-contract.js +79 -43
- package/ci/test-optimization-validation/scenarios/basic-reporting.js +59 -5
- package/ci/test-optimization-validation/scenarios/ci-wiring.js +141 -35
- package/ci/test-optimization-validation/scenarios/helpers.js +30 -6
- package/ci/test-optimization-validation/static-diagnosis.js +10 -3
- package/ci/test-optimization-validation/test-output.js +2 -1
- package/ci/test-optimization-validation/validation-blocker.js +21 -0
- package/ci/vitest-no-worker-init-setup.mjs +30 -34
- package/index.d.ts +98 -1
- package/init.js +1 -17
- package/initialize.mjs +11 -0
- package/loader-hook.mjs +6 -4
- package/package.json +5 -3
- package/packages/datadog-core/src/utils/src/parse-tags.js +0 -1
- package/packages/datadog-esbuild/src/utils.js +16 -1
- package/packages/datadog-instrumentations/src/ai.js +61 -34
- package/packages/datadog-instrumentations/src/bluebird.js +6 -6
- package/packages/datadog-instrumentations/src/claude-agent-sdk.js +81 -5
- package/packages/datadog-instrumentations/src/cucumber.js +124 -47
- package/packages/datadog-instrumentations/src/dns.js +21 -2
- package/packages/datadog-instrumentations/src/electron.js +1 -0
- package/packages/datadog-instrumentations/src/fastify.js +3 -1
- package/packages/datadog-instrumentations/src/grpc/client.js +4 -2
- package/packages/datadog-instrumentations/src/helpers/callback-instrumentor.js +3 -1
- package/packages/datadog-instrumentations/src/helpers/hooks.js +2 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/index.js +33 -9
- package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/webdriverio.js +118 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/loader.mjs +20 -2
- package/packages/datadog-instrumentations/src/helpers/rewriter/targets.js +32 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/targets.json +61 -0
- package/packages/datadog-instrumentations/src/helpers/router-helper.js +37 -6
- package/packages/datadog-instrumentations/src/jest/coverage-backfill.js +1 -1
- package/packages/datadog-instrumentations/src/jest.js +979 -233
- package/packages/datadog-instrumentations/src/mocha/main.js +107 -9
- package/packages/datadog-instrumentations/src/mocha/utils.js +64 -42
- package/packages/datadog-instrumentations/src/mocha/webdriverio-protocol.js +25 -0
- package/packages/datadog-instrumentations/src/mocha/worker.js +12 -18
- package/packages/datadog-instrumentations/src/mysql.js +1 -1
- package/packages/datadog-instrumentations/src/next.js +155 -23
- package/packages/datadog-instrumentations/src/openai.js +14 -0
- package/packages/datadog-instrumentations/src/pg.js +180 -6
- package/packages/datadog-instrumentations/src/playwright.js +173 -79
- package/packages/datadog-instrumentations/src/promise-js.js +4 -4
- package/packages/datadog-instrumentations/src/promise.js +3 -3
- package/packages/datadog-instrumentations/src/router.js +195 -19
- package/packages/datadog-instrumentations/src/vitest-main-no-worker-init.js +43 -10
- package/packages/datadog-instrumentations/src/vitest-main.js +360 -56
- package/packages/datadog-instrumentations/src/vitest-util.js +42 -7
- package/packages/datadog-instrumentations/src/vitest-worker.js +234 -17
- package/packages/datadog-instrumentations/src/webdriverio.js +194 -18
- package/packages/datadog-instrumentations/src/when.js +3 -3
- package/packages/datadog-instrumentations/src/ws.js +5 -1
- package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/utils.js +59 -48
- package/packages/datadog-plugin-child_process/src/scrub-cmd-params.js +1 -3
- package/packages/datadog-plugin-cucumber/src/index.js +5 -1
- package/packages/datadog-plugin-cypress/src/cypress-plugin.js +50 -46
- package/packages/datadog-plugin-cypress/src/support.js +7 -4
- package/packages/datadog-plugin-electron/src/net.js +10 -4
- package/packages/datadog-plugin-http/src/client.js +1 -1
- package/packages/datadog-plugin-http2/src/client.js +1 -1
- package/packages/datadog-plugin-jest/src/index.js +1 -18
- package/packages/datadog-plugin-jest/src/util.js +2 -0
- package/packages/datadog-plugin-kafkajs/src/producer.js +2 -1
- package/packages/datadog-plugin-mocha/src/index.js +318 -1
- package/packages/datadog-plugin-next/src/index.js +57 -9
- package/packages/datadog-plugin-openai/src/tracing.js +4 -0
- package/packages/datadog-plugin-pg/src/index.js +65 -1
- package/packages/datadog-plugin-playwright/src/index.js +1 -1
- package/packages/datadog-plugin-vitest/src/index.js +95 -7
- package/packages/datadog-shimmer/src/shimmer.js +6 -2
- package/packages/dd-trace/src/aiguard/sdk.js +3 -0
- package/packages/dd-trace/src/appsec/{blocking.js → blocking/index.js} +26 -6
- package/packages/dd-trace/src/appsec/handlers/auth.js +62 -0
- package/packages/dd-trace/src/appsec/handlers/http-request.js +215 -0
- package/packages/dd-trace/src/appsec/handlers/http-response.js +78 -0
- package/packages/dd-trace/src/appsec/handlers/http-shared.js +24 -0
- package/packages/dd-trace/src/appsec/handlers/payments.js +104 -0
- package/packages/dd-trace/src/appsec/iast/analyzers/hsts-header-missing-analyzer.js +1 -1
- package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/utils.js +1 -1
- package/packages/dd-trace/src/appsec/index.js +48 -476
- package/packages/dd-trace/src/appsec/sdk/track_event.js +9 -0
- package/packages/dd-trace/src/ci-visibility/coverage-report-discovery.js +46 -14
- package/packages/dd-trace/src/ci-visibility/efd-retry-policy.js +89 -0
- package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +27 -13
- package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +17 -0
- package/packages/dd-trace/src/ci-visibility/exporters/test-worker/index.js +21 -1
- package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +22 -7
- package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +9 -14
- package/packages/dd-trace/src/ci-visibility/requests/upload-coverage-report.js +21 -5
- package/packages/dd-trace/src/ci-visibility/test-optimization-http-cache-schema.js +1 -1
- package/packages/dd-trace/src/ci-visibility/test-optimization-http-cache.js +5 -1
- package/packages/dd-trace/src/config/generated-config-types.d.ts +2 -0
- package/packages/dd-trace/src/config/helper.js +2 -0
- package/packages/dd-trace/src/config/index.js +16 -5
- package/packages/dd-trace/src/config/remote_config.js +1 -1
- package/packages/dd-trace/src/config/supported-configurations.json +8 -0
- package/packages/dd-trace/src/debugger/devtools_client/status.js +1 -1
- package/packages/dd-trace/src/encode/coverage-ci-visibility.js +0 -1
- package/packages/dd-trace/src/guardrails/apply-pm2-env.js +16 -0
- package/packages/dd-trace/src/guardrails/log.js +1 -10
- package/packages/dd-trace/src/llmobs/eval-metric.js +249 -0
- package/packages/dd-trace/src/llmobs/experiments/index.js +33 -25
- package/packages/dd-trace/src/llmobs/experiments/util.js +4 -2
- package/packages/dd-trace/src/llmobs/noop.js +2 -0
- package/packages/dd-trace/src/llmobs/plugins/ai/ddTelemetry.js +1 -1
- package/packages/dd-trace/src/llmobs/plugins/ai/util.js +1 -1
- package/packages/dd-trace/src/llmobs/plugins/bedrockruntime.js +5 -5
- package/packages/dd-trace/src/llmobs/plugins/langchain/index.js +1 -1
- package/packages/dd-trace/src/llmobs/sdk.js +149 -68
- package/packages/dd-trace/src/llmobs/telemetry.js +18 -0
- package/packages/dd-trace/src/llmobs/writers/base.js +3 -0
- package/packages/dd-trace/src/llmobs/writers/util.js +2 -0
- package/packages/dd-trace/src/log/channels.js +1 -9
- package/packages/dd-trace/src/log/levels.js +12 -0
- package/packages/dd-trace/src/openfeature/writers/exposures.js +1 -1
- package/packages/dd-trace/src/openfeature/writers/util.js +1 -1
- package/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js +1 -1
- package/packages/dd-trace/src/opentelemetry/metrics/meter.js +8 -4
- package/packages/dd-trace/src/opentelemetry/metrics/periodic_metric_reader.js +1 -1
- package/packages/dd-trace/src/opentelemetry/span.js +4 -0
- package/packages/dd-trace/src/plugins/ci_plugin.js +21 -5
- package/packages/dd-trace/src/plugins/index.js +1 -0
- package/packages/dd-trace/src/plugins/util/ci.js +6 -0
- package/packages/dd-trace/src/plugins/util/git.js +6 -4
- package/packages/dd-trace/src/plugins/util/http-otel-semantics.js +2 -2
- package/packages/dd-trace/src/plugins/util/ip_extractor.js +1 -1
- package/packages/dd-trace/src/plugins/util/stacktrace.js +3 -0
- package/packages/dd-trace/src/plugins/util/test.js +319 -75
- package/packages/dd-trace/src/plugins/util/url.js +1 -1
- package/packages/dd-trace/src/plugins/util/web.js +23 -1
- package/packages/dd-trace/src/profiler.js +1 -1
- package/packages/dd-trace/src/profiling/exporters/event_serializer.js +1 -1
- package/packages/dd-trace/src/profiling/profilers/events.js +2 -2
- package/packages/dd-trace/src/proxy.js +1 -0
- package/packages/dd-trace/src/ritm.js +5 -0
- package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +4 -2
- package/packages/dd-trace/src/sampling_rule.js +4 -2
- package/packages/dd-trace/src/service-naming/schemas/v0/storage.js +1 -1
- package/packages/dd-trace/src/service-naming/schemas/v1/storage.js +1 -1
- package/packages/dd-trace/src/telemetry/logs/index.js +3 -0
- package/packages/dd-trace/src/telemetry/telemetry.js +1 -1
- package/vendor/dist/pprof-format/index.js +1 -1
- package/version.js +10 -8
- /package/packages/dd-trace/src/appsec/{blocked_templates.js → blocking/templates.js} +0 -0
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
const fs = require('node:fs')
|
|
4
4
|
const path = require('node:path')
|
|
5
5
|
|
|
6
|
+
const { BLOCKER_CATEGORIES, getBlockerDomain } = require('./blocker-category')
|
|
6
7
|
const { getCommandBlocker } = require('./command-blocker')
|
|
7
8
|
const { runCommand, serializeDisplayCommand } = require('./command-runner')
|
|
8
9
|
const {
|
|
@@ -12,6 +13,7 @@ const {
|
|
|
12
13
|
const { getGeneratedCommand } = require('./runner-command')
|
|
13
14
|
const { frameworkOutDir } = require('./scenarios/helpers')
|
|
14
15
|
const { getObservedTestCount } = require('./test-output')
|
|
16
|
+
const { getValidationBlockerEvidence } = require('./validation-blocker')
|
|
15
17
|
|
|
16
18
|
const GENERATED_SCENARIO_BY_FEATURE = {
|
|
17
19
|
efd: 'basic-pass',
|
|
@@ -103,15 +105,16 @@ async function verifyGeneratedTestStrategy ({ framework, out, options }) {
|
|
|
103
105
|
return { ok: true }
|
|
104
106
|
} catch (error) {
|
|
105
107
|
cleanupGeneratedRuntimeFiles(framework)
|
|
108
|
+
const blockerEvidence = getValidationBlockerEvidence(error)
|
|
106
109
|
return {
|
|
107
110
|
ok: false,
|
|
108
111
|
failure: {
|
|
109
112
|
frameworkId: framework.id,
|
|
110
113
|
scenario: 'generated-test-verification',
|
|
111
|
-
status: 'error',
|
|
114
|
+
status: blockerEvidence ? 'blocked' : 'error',
|
|
112
115
|
diagnosis: 'The validator could not run the temporary validation test as expected. No advanced-feature ' +
|
|
113
116
|
`conclusion was reached: ${error.message || error}`,
|
|
114
|
-
evidence,
|
|
117
|
+
evidence: { ...evidence, ...blockerEvidence },
|
|
115
118
|
artifacts,
|
|
116
119
|
},
|
|
117
120
|
}
|
|
@@ -153,14 +156,12 @@ function getVerificationFailure (framework, evidence, artifacts, scenario, resul
|
|
|
153
156
|
const commandFailure = getCommandBlocker(result, {
|
|
154
157
|
browserRequired: framework.browserRequired,
|
|
155
158
|
framework: framework.framework,
|
|
159
|
+
packageJson: framework.project.packageJson,
|
|
156
160
|
testsRan: Number.isInteger(observedTestCount) && observedTestCount > 0,
|
|
157
161
|
})
|
|
158
162
|
if (commandFailure) {
|
|
159
|
-
const
|
|
160
|
-
|
|
161
|
-
: commandFailure.localRuntimeBlocked
|
|
162
|
-
? 'local_runtime'
|
|
163
|
-
: 'project_setup'
|
|
163
|
+
const blockerCategory = commandFailure.blockerCategory
|
|
164
|
+
const domain = getBlockerDomain(blockerCategory)
|
|
164
165
|
return {
|
|
165
166
|
ok: false,
|
|
166
167
|
failure: {
|
|
@@ -168,7 +169,7 @@ function getVerificationFailure (framework, evidence, artifacts, scenario, resul
|
|
|
168
169
|
scenario: 'generated-test-verification',
|
|
169
170
|
status: 'blocked',
|
|
170
171
|
diagnosis: `${commandFailure.summary} Advanced-feature validation could not start reliably.`,
|
|
171
|
-
evidence: { ...evidence, commandFailure, domain, validationIncomplete: true },
|
|
172
|
+
evidence: { ...evidence, blockerCategory, commandFailure, domain, validationIncomplete: true },
|
|
172
173
|
artifacts,
|
|
173
174
|
},
|
|
174
175
|
}
|
|
@@ -189,7 +190,11 @@ function getVerificationFailure (framework, evidence, artifacts, scenario, resul
|
|
|
189
190
|
scenario: 'generated-test-verification',
|
|
190
191
|
status: 'error',
|
|
191
192
|
diagnosis: `Temporary validation test "${scenario.id}" ${reason}. No advanced-feature conclusion was reached.`,
|
|
192
|
-
evidence
|
|
193
|
+
evidence: {
|
|
194
|
+
...evidence,
|
|
195
|
+
blockerCategory: BLOCKER_CATEGORIES.VALIDATOR_LIMITATION,
|
|
196
|
+
validationIncomplete: true,
|
|
197
|
+
},
|
|
193
198
|
artifacts,
|
|
194
199
|
},
|
|
195
200
|
}
|
|
@@ -204,14 +209,16 @@ function getVerificationFailure (framework, evidence, artifacts, scenario, resul
|
|
|
204
209
|
function getGeneratedRuntimeFileStatus (strategy) {
|
|
205
210
|
const generatedFiles = new Set((strategy.files || []).map(file => path.resolve(file.path)))
|
|
206
211
|
let expectsRuntimeFile = false
|
|
207
|
-
|
|
208
|
-
const
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
212
|
+
if (strategy.cleanupPaths) {
|
|
213
|
+
for (const cleanupPath of strategy.cleanupPaths) {
|
|
214
|
+
const filename = path.resolve(cleanupPath)
|
|
215
|
+
if (generatedFiles.has(filename)) continue
|
|
216
|
+
expectsRuntimeFile = true
|
|
217
|
+
try {
|
|
218
|
+
const stat = fs.lstatSync(filename)
|
|
219
|
+
if (!stat.isSymbolicLink() && stat.isFile()) return true
|
|
220
|
+
} catch {}
|
|
221
|
+
}
|
|
215
222
|
}
|
|
216
223
|
return expectsRuntimeFile ? false : undefined
|
|
217
224
|
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
// Dynamic extglobs, negation, character classes, and malformed braces fail closed.
|
|
4
|
+
function matchesLiteralGlob (filename, pattern) {
|
|
5
|
+
const source = String(pattern || '').replaceAll('\\', '/').replace(/^\.\//, '')
|
|
6
|
+
if (!source || /[!()[\]]/.test(source)) return false
|
|
7
|
+
|
|
8
|
+
let expression = '^'
|
|
9
|
+
for (let index = 0; index < source.length; index++) {
|
|
10
|
+
const character = source[index]
|
|
11
|
+
if (character === '*') {
|
|
12
|
+
if (source[index + 1] === '*') {
|
|
13
|
+
index++
|
|
14
|
+
if (source[index + 1] === '/') {
|
|
15
|
+
index++
|
|
16
|
+
expression += '(?:.*/)?'
|
|
17
|
+
} else {
|
|
18
|
+
expression += '.*'
|
|
19
|
+
}
|
|
20
|
+
} else {
|
|
21
|
+
expression += '[^/]*'
|
|
22
|
+
}
|
|
23
|
+
continue
|
|
24
|
+
}
|
|
25
|
+
if (character === '?') {
|
|
26
|
+
expression += '[^/]'
|
|
27
|
+
continue
|
|
28
|
+
}
|
|
29
|
+
if (character === '{') {
|
|
30
|
+
const end = source.indexOf('}', index + 1)
|
|
31
|
+
if (end === -1) return false
|
|
32
|
+
const alternatives = source.slice(index + 1, end).split(',')
|
|
33
|
+
if (alternatives.length < 2 || alternatives.some(value => !/^[A-Za-z0-9._-]+$/.test(value))) return false
|
|
34
|
+
expression += `(?:${alternatives.map(escapeRegExp).join('|')})`
|
|
35
|
+
// eslint-disable-next-line sonarjs/updated-loop-counter
|
|
36
|
+
index = end
|
|
37
|
+
continue
|
|
38
|
+
}
|
|
39
|
+
expression += escapeRegExp(character)
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
return new RegExp(`${expression}$`).test(String(filename).replaceAll('\\', '/').replaceAll(/^\.\//g, ''))
|
|
43
|
+
} catch {
|
|
44
|
+
return false
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function escapeRegExp (value) {
|
|
49
|
+
return value.replaceAll(/[.*+?^${}()|[\]\\]/g, String.raw`\$&`)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
module.exports = { matchesLiteralGlob }
|
|
@@ -81,6 +81,9 @@ function getManifestPaths (manifest) {
|
|
|
81
81
|
[`${prefix}.ciWiring.configFile`, framework.ciWiring?.configFile],
|
|
82
82
|
[`${prefix}.ciWiring.workingDirectory`, framework.ciWiring?.workingDirectory]
|
|
83
83
|
)
|
|
84
|
+
for (const [index, fallback] of (framework.validation?.fallbackTests || []).entries()) {
|
|
85
|
+
paths.push([`${prefix}.validation.fallbackTests[${index}].testFile`, fallback.testFile])
|
|
86
|
+
}
|
|
84
87
|
for (const [index, configFile] of (framework.project?.configFiles || []).entries()) {
|
|
85
88
|
paths.push([`${prefix}.project.configFiles[${index}]`, configFile])
|
|
86
89
|
}
|