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.
Files changed (179) hide show
  1. package/ci/diagnose.js +27 -25
  2. package/ci/init.js +6 -6
  3. package/ci/runbook.md +114 -20
  4. package/ci/test-optimization-validation/approval-artifacts.js +36 -3
  5. package/ci/test-optimization-validation/approval.js +78 -22
  6. package/ci/test-optimization-validation/blocker-category.js +24 -0
  7. package/ci/test-optimization-validation/ci-discovery.js +23 -17
  8. package/ci/test-optimization-validation/ci-package-scripts.js +34 -6
  9. package/ci/test-optimization-validation/ci-remediation.js +1 -1
  10. package/ci/test-optimization-validation/cli.js +280 -52
  11. package/ci/test-optimization-validation/command-blocker.js +159 -20
  12. package/ci/test-optimization-validation/command-output-policy.js +9 -3
  13. package/ci/test-optimization-validation/command-runner.js +9 -7
  14. package/ci/test-optimization-validation/environment.js +4 -2
  15. package/ci/test-optimization-validation/executable.js +15 -13
  16. package/ci/test-optimization-validation/execution-lock.js +70 -0
  17. package/ci/test-optimization-validation/framework-adapters/cucumber-validation.json +3 -0
  18. package/ci/test-optimization-validation/framework-adapters/cucumber.js +657 -5
  19. package/ci/test-optimization-validation/framework-adapters/vitest.js +517 -0
  20. package/ci/test-optimization-validation/generated-files.js +38 -28
  21. package/ci/test-optimization-validation/generated-test-contract.js +8 -4
  22. package/ci/test-optimization-validation/generated-verifier.js +24 -17
  23. package/ci/test-optimization-validation/literal-glob.js +52 -0
  24. package/ci/test-optimization-validation/manifest-loader.js +3 -0
  25. package/ci/test-optimization-validation/manifest-scaffold.js +300 -50
  26. package/ci/test-optimization-validation/manifest-schema.js +80 -17
  27. package/ci/test-optimization-validation/offline-fixtures.js +13 -4
  28. package/ci/test-optimization-validation/package-check.js +94 -0
  29. package/ci/test-optimization-validation/plan-writer.js +183 -10
  30. package/ci/test-optimization-validation/preflight-runner.js +110 -31
  31. package/ci/test-optimization-validation/project-build-artifact.js +31 -0
  32. package/ci/test-optimization-validation/redaction.js +18 -27
  33. package/ci/test-optimization-validation/report-writer.js +182 -48
  34. package/ci/test-optimization-validation/result-semantics.js +20 -3
  35. package/ci/test-optimization-validation/runner-command.js +40 -20
  36. package/ci/test-optimization-validation/runner-contract.js +79 -43
  37. package/ci/test-optimization-validation/scenarios/basic-reporting.js +59 -5
  38. package/ci/test-optimization-validation/scenarios/ci-wiring.js +141 -35
  39. package/ci/test-optimization-validation/scenarios/helpers.js +30 -6
  40. package/ci/test-optimization-validation/static-diagnosis.js +10 -3
  41. package/ci/test-optimization-validation/test-output.js +2 -1
  42. package/ci/test-optimization-validation/validation-blocker.js +21 -0
  43. package/ci/vitest-no-worker-init-setup.mjs +30 -34
  44. package/index.d.ts +98 -1
  45. package/init.js +1 -17
  46. package/initialize.mjs +11 -0
  47. package/loader-hook.mjs +6 -4
  48. package/package.json +5 -3
  49. package/packages/datadog-core/src/utils/src/parse-tags.js +0 -1
  50. package/packages/datadog-esbuild/src/utils.js +16 -1
  51. package/packages/datadog-instrumentations/src/ai.js +61 -34
  52. package/packages/datadog-instrumentations/src/bluebird.js +6 -6
  53. package/packages/datadog-instrumentations/src/claude-agent-sdk.js +81 -5
  54. package/packages/datadog-instrumentations/src/cucumber.js +124 -47
  55. package/packages/datadog-instrumentations/src/dns.js +21 -2
  56. package/packages/datadog-instrumentations/src/electron.js +1 -0
  57. package/packages/datadog-instrumentations/src/fastify.js +3 -1
  58. package/packages/datadog-instrumentations/src/grpc/client.js +4 -2
  59. package/packages/datadog-instrumentations/src/helpers/callback-instrumentor.js +3 -1
  60. package/packages/datadog-instrumentations/src/helpers/hooks.js +2 -0
  61. package/packages/datadog-instrumentations/src/helpers/rewriter/index.js +33 -9
  62. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/webdriverio.js +118 -0
  63. package/packages/datadog-instrumentations/src/helpers/rewriter/loader.mjs +20 -2
  64. package/packages/datadog-instrumentations/src/helpers/rewriter/targets.js +32 -0
  65. package/packages/datadog-instrumentations/src/helpers/rewriter/targets.json +61 -0
  66. package/packages/datadog-instrumentations/src/helpers/router-helper.js +37 -6
  67. package/packages/datadog-instrumentations/src/jest/coverage-backfill.js +1 -1
  68. package/packages/datadog-instrumentations/src/jest.js +979 -233
  69. package/packages/datadog-instrumentations/src/mocha/main.js +107 -9
  70. package/packages/datadog-instrumentations/src/mocha/utils.js +64 -42
  71. package/packages/datadog-instrumentations/src/mocha/webdriverio-protocol.js +25 -0
  72. package/packages/datadog-instrumentations/src/mocha/worker.js +12 -18
  73. package/packages/datadog-instrumentations/src/mysql.js +1 -1
  74. package/packages/datadog-instrumentations/src/next.js +155 -23
  75. package/packages/datadog-instrumentations/src/openai.js +14 -0
  76. package/packages/datadog-instrumentations/src/pg.js +180 -6
  77. package/packages/datadog-instrumentations/src/playwright.js +173 -79
  78. package/packages/datadog-instrumentations/src/promise-js.js +4 -4
  79. package/packages/datadog-instrumentations/src/promise.js +3 -3
  80. package/packages/datadog-instrumentations/src/router.js +195 -19
  81. package/packages/datadog-instrumentations/src/vitest-main-no-worker-init.js +43 -10
  82. package/packages/datadog-instrumentations/src/vitest-main.js +360 -56
  83. package/packages/datadog-instrumentations/src/vitest-util.js +42 -7
  84. package/packages/datadog-instrumentations/src/vitest-worker.js +234 -17
  85. package/packages/datadog-instrumentations/src/webdriverio.js +194 -18
  86. package/packages/datadog-instrumentations/src/when.js +3 -3
  87. package/packages/datadog-instrumentations/src/ws.js +5 -1
  88. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/utils.js +59 -48
  89. package/packages/datadog-plugin-child_process/src/scrub-cmd-params.js +1 -3
  90. package/packages/datadog-plugin-cucumber/src/index.js +5 -1
  91. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +50 -46
  92. package/packages/datadog-plugin-cypress/src/support.js +7 -4
  93. package/packages/datadog-plugin-electron/src/net.js +10 -4
  94. package/packages/datadog-plugin-http/src/client.js +1 -1
  95. package/packages/datadog-plugin-http2/src/client.js +1 -1
  96. package/packages/datadog-plugin-jest/src/index.js +1 -18
  97. package/packages/datadog-plugin-jest/src/util.js +2 -0
  98. package/packages/datadog-plugin-kafkajs/src/producer.js +2 -1
  99. package/packages/datadog-plugin-mocha/src/index.js +318 -1
  100. package/packages/datadog-plugin-next/src/index.js +57 -9
  101. package/packages/datadog-plugin-openai/src/tracing.js +4 -0
  102. package/packages/datadog-plugin-pg/src/index.js +65 -1
  103. package/packages/datadog-plugin-playwright/src/index.js +1 -1
  104. package/packages/datadog-plugin-vitest/src/index.js +95 -7
  105. package/packages/datadog-shimmer/src/shimmer.js +6 -2
  106. package/packages/dd-trace/src/aiguard/sdk.js +3 -0
  107. package/packages/dd-trace/src/appsec/{blocking.js → blocking/index.js} +26 -6
  108. package/packages/dd-trace/src/appsec/handlers/auth.js +62 -0
  109. package/packages/dd-trace/src/appsec/handlers/http-request.js +215 -0
  110. package/packages/dd-trace/src/appsec/handlers/http-response.js +78 -0
  111. package/packages/dd-trace/src/appsec/handlers/http-shared.js +24 -0
  112. package/packages/dd-trace/src/appsec/handlers/payments.js +104 -0
  113. package/packages/dd-trace/src/appsec/iast/analyzers/hsts-header-missing-analyzer.js +1 -1
  114. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/utils.js +1 -1
  115. package/packages/dd-trace/src/appsec/index.js +48 -476
  116. package/packages/dd-trace/src/appsec/sdk/track_event.js +9 -0
  117. package/packages/dd-trace/src/ci-visibility/coverage-report-discovery.js +46 -14
  118. package/packages/dd-trace/src/ci-visibility/efd-retry-policy.js +89 -0
  119. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +27 -13
  120. package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +17 -0
  121. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/index.js +21 -1
  122. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +22 -7
  123. package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +9 -14
  124. package/packages/dd-trace/src/ci-visibility/requests/upload-coverage-report.js +21 -5
  125. package/packages/dd-trace/src/ci-visibility/test-optimization-http-cache-schema.js +1 -1
  126. package/packages/dd-trace/src/ci-visibility/test-optimization-http-cache.js +5 -1
  127. package/packages/dd-trace/src/config/generated-config-types.d.ts +2 -0
  128. package/packages/dd-trace/src/config/helper.js +2 -0
  129. package/packages/dd-trace/src/config/index.js +16 -5
  130. package/packages/dd-trace/src/config/remote_config.js +1 -1
  131. package/packages/dd-trace/src/config/supported-configurations.json +8 -0
  132. package/packages/dd-trace/src/debugger/devtools_client/status.js +1 -1
  133. package/packages/dd-trace/src/encode/coverage-ci-visibility.js +0 -1
  134. package/packages/dd-trace/src/guardrails/apply-pm2-env.js +16 -0
  135. package/packages/dd-trace/src/guardrails/log.js +1 -10
  136. package/packages/dd-trace/src/llmobs/eval-metric.js +249 -0
  137. package/packages/dd-trace/src/llmobs/experiments/index.js +33 -25
  138. package/packages/dd-trace/src/llmobs/experiments/util.js +4 -2
  139. package/packages/dd-trace/src/llmobs/noop.js +2 -0
  140. package/packages/dd-trace/src/llmobs/plugins/ai/ddTelemetry.js +1 -1
  141. package/packages/dd-trace/src/llmobs/plugins/ai/util.js +1 -1
  142. package/packages/dd-trace/src/llmobs/plugins/bedrockruntime.js +5 -5
  143. package/packages/dd-trace/src/llmobs/plugins/langchain/index.js +1 -1
  144. package/packages/dd-trace/src/llmobs/sdk.js +149 -68
  145. package/packages/dd-trace/src/llmobs/telemetry.js +18 -0
  146. package/packages/dd-trace/src/llmobs/writers/base.js +3 -0
  147. package/packages/dd-trace/src/llmobs/writers/util.js +2 -0
  148. package/packages/dd-trace/src/log/channels.js +1 -9
  149. package/packages/dd-trace/src/log/levels.js +12 -0
  150. package/packages/dd-trace/src/openfeature/writers/exposures.js +1 -1
  151. package/packages/dd-trace/src/openfeature/writers/util.js +1 -1
  152. package/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js +1 -1
  153. package/packages/dd-trace/src/opentelemetry/metrics/meter.js +8 -4
  154. package/packages/dd-trace/src/opentelemetry/metrics/periodic_metric_reader.js +1 -1
  155. package/packages/dd-trace/src/opentelemetry/span.js +4 -0
  156. package/packages/dd-trace/src/plugins/ci_plugin.js +21 -5
  157. package/packages/dd-trace/src/plugins/index.js +1 -0
  158. package/packages/dd-trace/src/plugins/util/ci.js +6 -0
  159. package/packages/dd-trace/src/plugins/util/git.js +6 -4
  160. package/packages/dd-trace/src/plugins/util/http-otel-semantics.js +2 -2
  161. package/packages/dd-trace/src/plugins/util/ip_extractor.js +1 -1
  162. package/packages/dd-trace/src/plugins/util/stacktrace.js +3 -0
  163. package/packages/dd-trace/src/plugins/util/test.js +319 -75
  164. package/packages/dd-trace/src/plugins/util/url.js +1 -1
  165. package/packages/dd-trace/src/plugins/util/web.js +23 -1
  166. package/packages/dd-trace/src/profiler.js +1 -1
  167. package/packages/dd-trace/src/profiling/exporters/event_serializer.js +1 -1
  168. package/packages/dd-trace/src/profiling/profilers/events.js +2 -2
  169. package/packages/dd-trace/src/proxy.js +1 -0
  170. package/packages/dd-trace/src/ritm.js +5 -0
  171. package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +4 -2
  172. package/packages/dd-trace/src/sampling_rule.js +4 -2
  173. package/packages/dd-trace/src/service-naming/schemas/v0/storage.js +1 -1
  174. package/packages/dd-trace/src/service-naming/schemas/v1/storage.js +1 -1
  175. package/packages/dd-trace/src/telemetry/logs/index.js +3 -0
  176. package/packages/dd-trace/src/telemetry/telemetry.js +1 -1
  177. package/vendor/dist/pprof-format/index.js +1 -1
  178. package/version.js +10 -8
  179. /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 domain = commandFailure.blockedByExecutionEnvironment
160
- ? 'execution_environment'
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
- for (const cleanupPath of strategy.cleanupPaths || []) {
208
- const filename = path.resolve(cleanupPath)
209
- if (generatedFiles.has(filename)) continue
210
- expectsRuntimeFile = true
211
- try {
212
- const stat = fs.lstatSync(filename)
213
- if (!stat.isSymbolicLink() && stat.isFile()) return true
214
- } catch {}
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
  }