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
@@ -8,6 +8,12 @@ const dateNow = Date.now
8
8
  const { createCoverageMap } = require('../../../vendor/dist/istanbul-lib-coverage')
9
9
  const satisfies = require('../../../vendor/dist/semifies')
10
10
  const { RUM_TEST_EXECUTION_ID_COOKIE_NAME } = require('../../dd-trace/src/ci-visibility/rum')
11
+ const {
12
+ EMPTY_EFD_RETRY_POLICY,
13
+ getEfdRetryCountForDuration,
14
+ hasEfdRetries,
15
+ shouldSkipEfdRetry,
16
+ } = require('../../dd-trace/src/ci-visibility/efd-retry-policy')
11
17
  const {
12
18
  TEST_STATUS,
13
19
  setRumTestTags,
@@ -73,10 +79,9 @@ const {
73
79
  getIsFaultyEarlyFlakeDetection,
74
80
  DYNAMIC_NAME_RE,
75
81
  recordAttemptToFixExecution,
82
+ recordTestManagementExecution,
76
83
  logAttemptToFixTestExecution,
77
84
  logTestOptimizationSummary,
78
- getEfdRetryCount,
79
- getMaxEfdRetryCount,
80
85
  getPullRequestBaseBranch,
81
86
  TEST_FINAL_STATUS,
82
87
  getTestOptimizationRequestResults,
@@ -465,8 +470,7 @@ class CypressPlugin {
465
470
  isEarlyFlakeDetectionEnabled = false
466
471
  isEarlyFlakeDetectionFaulty = false
467
472
  isKnownTestsEnabled = false
468
- earlyFlakeDetectionNumRetries = 0
469
- earlyFlakeDetectionSlowTestRetries = {}
473
+ earlyFlakeDetectionRetryPolicy = EMPTY_EFD_RETRY_POLICY
470
474
  efdRetryCountByTest = {}
471
475
  efdSlowAbortedTests = {}
472
476
  earlyFlakeDetectionFaultyThreshold = 0
@@ -554,8 +558,7 @@ class CypressPlugin {
554
558
  this.isEarlyFlakeDetectionEnabled = false
555
559
  this.isEarlyFlakeDetectionFaulty = false
556
560
  this.isKnownTestsEnabled = false
557
- this.earlyFlakeDetectionNumRetries = 0
558
- this.earlyFlakeDetectionSlowTestRetries = {}
561
+ this.earlyFlakeDetectionRetryPolicy = EMPTY_EFD_RETRY_POLICY
559
562
  this.efdRetryCountByTest = {}
560
563
  this.efdSlowAbortedTests = {}
561
564
  this.earlyFlakeDetectionFaultyThreshold = 0
@@ -835,8 +838,7 @@ class CypressPlugin {
835
838
  isCodeCoverageEnabled,
836
839
  isCoverageReportUploadEnabled,
837
840
  isEarlyFlakeDetectionEnabled,
838
- earlyFlakeDetectionNumRetries,
839
- earlyFlakeDetectionSlowTestRetries,
841
+ earlyFlakeDetectionRetryPolicy,
840
842
  earlyFlakeDetectionFaultyThreshold,
841
843
  isFlakyTestRetriesEnabled,
842
844
  flakyTestRetriesCount,
@@ -851,8 +853,7 @@ class CypressPlugin {
851
853
  this.isCodeCoverageEnabled = isCodeCoverageEnabled
852
854
  this.isCoverageReportUploadEnabled = isCoverageReportUploadEnabled
853
855
  this.isEarlyFlakeDetectionEnabled = isEarlyFlakeDetectionEnabled
854
- this.earlyFlakeDetectionNumRetries = earlyFlakeDetectionNumRetries
855
- this.earlyFlakeDetectionSlowTestRetries = earlyFlakeDetectionSlowTestRetries ?? {}
856
+ this.earlyFlakeDetectionRetryPolicy = earlyFlakeDetectionRetryPolicy ?? EMPTY_EFD_RETRY_POLICY
856
857
  this.earlyFlakeDetectionFaultyThreshold = earlyFlakeDetectionFaultyThreshold
857
858
  this.isKnownTestsEnabled = isKnownTestsEnabled
858
859
  if (isFlakyTestRetriesEnabled && this.isTestIsolationEnabled) {
@@ -900,34 +901,6 @@ class CypressPlugin {
900
901
  return { isAttemptToFix, isDisabled, isQuarantined }
901
902
  }
902
903
 
903
- /**
904
- * Returns how many EFD retries must be scheduled before the first duration is known.
905
- *
906
- * @returns {number}
907
- */
908
- getConfiguredEfdRetryCount () {
909
- const { earlyFlakeDetectionSlowTestRetries } = this
910
- if (!earlyFlakeDetectionSlowTestRetries || !Object.keys(earlyFlakeDetectionSlowTestRetries).length) {
911
- return this.earlyFlakeDetectionNumRetries
912
- }
913
- return getMaxEfdRetryCount(earlyFlakeDetectionSlowTestRetries)
914
- }
915
-
916
- /**
917
- * Returns the selected EFD retry count for a test, or the scheduling count if it has not run yet.
918
- *
919
- * @param {string} testSuite
920
- * @param {string} testName
921
- * @returns {number}
922
- */
923
- getEfdRetryCountForTest (testSuite, testName) {
924
- const testSuiteRetries = this.efdRetryCountByTest[testSuite]
925
- if (!testSuiteRetries || testSuiteRetries[testName] === undefined) {
926
- return this.getConfiguredEfdRetryCount()
927
- }
928
- return testSuiteRetries[testName]
929
- }
930
-
931
904
  /**
932
905
  * Stores the selected EFD retry count for a test after its first execution duration is known.
933
906
  *
@@ -940,7 +913,7 @@ class CypressPlugin {
940
913
  if (!this.efdRetryCountByTest[testSuite]) {
941
914
  this.efdRetryCountByTest[testSuite] = {}
942
915
  }
943
- const retryCount = getEfdRetryCount(duration ?? 0, this.earlyFlakeDetectionSlowTestRetries)
916
+ const retryCount = getEfdRetryCountForDuration(duration ?? 0, this.earlyFlakeDetectionRetryPolicy)
944
917
  this.efdRetryCountByTest[testSuite][testName] = retryCount
945
918
  if (retryCount === 0) {
946
919
  if (!this.efdSlowAbortedTests[testSuite]) {
@@ -961,7 +934,7 @@ class CypressPlugin {
961
934
  */
962
935
  shouldSkipEfdRetry (testSuite, testName, efdRetryIndex) {
963
936
  const testSuiteRetries = this.efdRetryCountByTest[testSuite]
964
- return testSuiteRetries?.[testName] !== undefined && efdRetryIndex > testSuiteRetries[testName]
937
+ return shouldSkipEfdRetry(efdRetryIndex, testSuiteRetries?.[testName])
965
938
  }
966
939
 
967
940
  getTestSuiteSpan ({ testSuite, testSuiteAbsolutePath }) {
@@ -1431,7 +1404,8 @@ class CypressPlugin {
1431
1404
  skippedTestSpan.setTag(ITR_CORRELATION_ID, this.itrCorrelationId)
1432
1405
  }
1433
1406
 
1434
- const { isDisabled, isQuarantined } = this.getTestProperties(spec.relative, cypressTestName)
1407
+ const { isAttemptToFix, isDisabled, isQuarantined } =
1408
+ this.getTestProperties(spec.relative, cypressTestName)
1435
1409
 
1436
1410
  if (isDisabled) {
1437
1411
  skippedTestSpan.setTag(TEST_MANAGEMENT_IS_DISABLED, 'true')
@@ -1439,6 +1413,24 @@ class CypressPlugin {
1439
1413
  skippedTestSpan.setTag(TEST_MANAGEMENT_IS_QUARANTINED, 'true')
1440
1414
  }
1441
1415
 
1416
+ recordTestManagementExecution({
1417
+ testSuite: spec.relative,
1418
+ testName: cypressTestName,
1419
+ status: 'skip',
1420
+ isAttemptToFix,
1421
+ isDisabled,
1422
+ isQuarantined,
1423
+ })
1424
+ if (isAttemptToFix) {
1425
+ recordAttemptToFixExecution(this.attemptToFixExecutions, {
1426
+ testSuite: spec.relative,
1427
+ testName: cypressTestName,
1428
+ status: 'skip',
1429
+ isDisabled,
1430
+ isQuarantined,
1431
+ })
1432
+ }
1433
+
1442
1434
  skippedTestSpan.finish()
1443
1435
  }
1444
1436
 
@@ -1522,6 +1514,15 @@ class CypressPlugin {
1522
1514
  finishedTest.testSpan.setTag(TEST_MANAGEMENT_ATTEMPT_TO_FIX_PASSED, 'false')
1523
1515
  }
1524
1516
  }
1517
+ const testManagementTags = finishedTest.testSpan.context().getTags()
1518
+ recordTestManagementExecution({
1519
+ testSuite: spec.relative,
1520
+ testName,
1521
+ status: testManagementTags[TEST_STATUS] || cypressTestStatus,
1522
+ isAttemptToFix: finishedTest.isAttemptToFix,
1523
+ isDisabled: testManagementTags[TEST_MANAGEMENT_IS_DISABLED] === 'true',
1524
+ isQuarantined: testManagementTags[TEST_MANAGEMENT_IS_QUARANTINED] === 'true',
1525
+ })
1525
1526
  if (this.itrCorrelationId) {
1526
1527
  finishedTest.testSpan.setTag(ITR_CORRELATION_ID, this.itrCorrelationId)
1527
1528
  }
@@ -1671,10 +1672,10 @@ class CypressPlugin {
1671
1672
  return {
1672
1673
  'dd:testSuiteStart': ({ testSuite, testSuiteAbsolutePath }) => {
1673
1674
  const suitePayload = {
1674
- isEarlyFlakeDetectionEnabled: this.isEarlyFlakeDetectionEnabled,
1675
+ isEarlyFlakeDetectionEnabled:
1676
+ this.isEarlyFlakeDetectionEnabled && hasEfdRetries(this.earlyFlakeDetectionRetryPolicy),
1675
1677
  knownTestsForSuite: this.knownTestsByTestSuite?.[testSuite] || [],
1676
- earlyFlakeDetectionNumRetries: this.getConfiguredEfdRetryCount(),
1677
- earlyFlakeDetectionSlowTestRetries: this.earlyFlakeDetectionSlowTestRetries,
1678
+ earlyFlakeDetectionSchedulingRetryCount: this.earlyFlakeDetectionRetryPolicy.schedulingRetryCount,
1678
1679
  isKnownTestsEnabled: this.isKnownTestsEnabled,
1679
1680
  isTestManagementEnabled: this.isTestManagementTestsEnabled,
1680
1681
  testManagementAttemptToFixRetries: this.testManagementAttemptToFixRetries,
@@ -1784,7 +1785,10 @@ class CypressPlugin {
1784
1785
  }
1785
1786
  this.tracer._tracer._exporter.exportCoverage(formattedCoverage)
1786
1787
  }
1787
- const isEfdManagedTest = (isNew || isModified) && this.isEarlyFlakeDetectionEnabled && !isAttemptToFix
1788
+ const isEfdManagedTest = (isNew || isModified) &&
1789
+ this.isEarlyFlakeDetectionEnabled &&
1790
+ hasEfdRetries(this.earlyFlakeDetectionRetryPolicy) &&
1791
+ !isAttemptToFix
1788
1792
  let testStatus = CYPRESS_STATUS_TO_TEST_STATUS[state]
1789
1793
  let didAbortSlowEfdRetries = false
1790
1794
  if (isEfdManagedTest && !isEfdRetry && this.efdRetryCountByTest[testSuite]?.[testName] === undefined) {
@@ -1858,7 +1862,7 @@ class CypressPlugin {
1858
1862
  }
1859
1863
  // Check if all EFD retries failed
1860
1864
  if (isEfdManagedTest) {
1861
- const efdRetryCount = this.getEfdRetryCountForTest(testSuite, testName)
1865
+ const efdRetryCount = this.efdRetryCountByTest[testSuite]?.[testName]
1862
1866
  const isLastEfdAttempt = testStatuses.length === efdRetryCount + 1
1863
1867
  if (efdRetryCount > 0 && isLastEfdAttempt && testStatuses.every(status => status === 'fail')) {
1864
1868
  this.activeTestSpan.setTag(TEST_HAS_FAILED_ALL_RETRIES, 'true')
@@ -1,12 +1,15 @@
1
1
  'use strict'
2
2
 
3
+ // No optional chaining or nullish coalescing in this file: Cypress 12 bundles it with webpack 4,
4
+ // whose parser predates both, and its babel-loader skips node_modules.
5
+
3
6
  let rumFlushWaitMillis = 500
4
7
  let rumTestExecutionIdCookieName
5
8
 
6
9
  let isEarlyFlakeDetectionEnabled = false
7
10
  let isKnownTestsEnabled = false
8
11
  let knownTestsForSuite = []
9
- let earlyFlakeDetectionNumRetries = 0
12
+ let earlyFlakeDetectionSchedulingRetryCount = 0
10
13
  let isTestManagementEnabled = false
11
14
  let testManagementAttemptToFixRetries = 0
12
15
  let testManagementTests = {}
@@ -336,7 +339,7 @@ Cypress.mocha.getRunner().runTests = function (suite, fn) {
336
339
  } else if (isModified && isEarlyFlakeDetectionEnabled) {
337
340
  disableFrameworkRetries(test)
338
341
  retryMessage = 'to detect flakes because it is modified'
339
- retriedTests = getRetriedTests(test, earlyFlakeDetectionNumRetries, [
342
+ retriedTests = getRetriedTests(test, earlyFlakeDetectionSchedulingRetryCount, [
340
343
  '_ddIsModified',
341
344
  '_ddIsEfdRetry',
342
345
  isKnownTestsEnabled && isNewTest(test) && '_ddIsNew',
@@ -344,7 +347,7 @@ Cypress.mocha.getRunner().runTests = function (suite, fn) {
344
347
  } else if (isNew && isEarlyFlakeDetectionEnabled) {
345
348
  disableFrameworkRetries(test)
346
349
  retryMessage = 'to detect flakes because it is new'
347
- retriedTests = getRetriedTests(test, earlyFlakeDetectionNumRetries, ['_ddIsNew', '_ddIsEfdRetry'])
350
+ retriedTests = getRetriedTests(test, earlyFlakeDetectionSchedulingRetryCount, ['_ddIsNew', '_ddIsEfdRetry'])
348
351
  }
349
352
 
350
353
  testsWithRetries.push(...retriedTests)
@@ -428,7 +431,7 @@ before(function () {
428
431
  isEarlyFlakeDetectionEnabled = suiteConfig.isEarlyFlakeDetectionEnabled
429
432
  isKnownTestsEnabled = suiteConfig.isKnownTestsEnabled
430
433
  knownTestsForSuite = suiteConfig.knownTestsForSuite
431
- earlyFlakeDetectionNumRetries = suiteConfig.earlyFlakeDetectionNumRetries
434
+ earlyFlakeDetectionSchedulingRetryCount = suiteConfig.earlyFlakeDetectionSchedulingRetryCount
432
435
  isTestManagementEnabled = suiteConfig.isTestManagementEnabled
433
436
  testManagementAttemptToFixRetries = suiteConfig.testManagementAttemptToFixRetries
434
437
  testManagementTests = suiteConfig.testManagementTests
@@ -64,12 +64,18 @@ class ElectronRequestPlugin extends HttpClientPlugin {
64
64
  const responseHead = ctx.res?._responseHead
65
65
  const { statusCode } = responseHead || {}
66
66
 
67
- for (const header in ctx.req._urlLoaderOptions?.headers || {}) {
68
- reqHeaders[header.name] = header.value
67
+ const requestHeaders = ctx.req._urlLoaderOptions?.headers
68
+ if (requestHeaders) {
69
+ for (const header in requestHeaders) {
70
+ reqHeaders[header.name] = header.value
71
+ }
69
72
  }
70
73
 
71
- for (const header in responseHead?.rawHeaders || {}) {
72
- resHeaders[header.name] = header.value
74
+ const responseHeaders = responseHead?.rawHeaders
75
+ if (responseHeaders) {
76
+ for (const header in responseHeaders) {
77
+ resHeaders[header.name] = header.value
78
+ }
73
79
  }
74
80
 
75
81
  ctx.req = { headers: reqHeaders }
@@ -56,7 +56,7 @@ class HttpClientPlugin extends ClientPlugin {
56
56
  'out.host': hostname,
57
57
  },
58
58
  metrics: {
59
- [CLIENT_PORT_KEY]: Number.parseInt(options.port),
59
+ [CLIENT_PORT_KEY]: Number.parseInt(options.port, 10),
60
60
  },
61
61
  }, false)
62
62
 
@@ -55,7 +55,7 @@ class Http2ClientPlugin extends ClientPlugin {
55
55
  'out.host': sessionDetails.host,
56
56
  },
57
57
  metrics: {
58
- [CLIENT_PORT_KEY]: Number.parseInt(sessionDetails.port),
58
+ [CLIENT_PORT_KEY]: Number.parseInt(sessionDetails.port, 10),
59
59
  },
60
60
  }, false)
61
61
 
@@ -197,7 +197,7 @@ class JestPlugin extends CiPlugin {
197
197
  config._ddRequestErrorTags = this.getSessionRequestErrorTags()
198
198
  config._ddItrCorrelationId = this.itrCorrelationId
199
199
  config._ddIsEarlyFlakeDetectionEnabled = !!this.libraryConfig?.isEarlyFlakeDetectionEnabled
200
- config._ddEarlyFlakeDetectionSlowTestRetries = this.libraryConfig?.earlyFlakeDetectionSlowTestRetries ?? {}
200
+ config._ddEarlyFlakeDetectionRetryPolicy = this.libraryConfig?.earlyFlakeDetectionRetryPolicy
201
201
  config._ddRepositoryRoot = this.repositoryRoot
202
202
  config._ddIsFlakyTestRetriesEnabled = this.libraryConfig?.isFlakyTestRetriesEnabled ?? false
203
203
  config._ddIsTestManagementTestsEnabled = this.libraryConfig?.isTestManagementEnabled ?? false
@@ -299,23 +299,6 @@ class JestPlugin extends CiPlugin {
299
299
  }
300
300
  })
301
301
 
302
- this.addSub('ci:jest:worker-report:telemetry', data => {
303
- const telemetryEvents = JSON.parse(data)
304
- for (const event of telemetryEvents) {
305
- if (event.type === 'ciVisEvent') {
306
- this.telemetry.ciVisEvent(event.name, event.testLevel, {
307
- ...event.tags,
308
- testFramework: event.testFramework,
309
- isUnsupportedCIProvider: event.isUnsupportedCIProvider,
310
- })
311
- } else if (event.type === 'count') {
312
- this.telemetry.count(event.name, event.tags, event.value)
313
- } else if (event.type === 'distribution') {
314
- this.telemetry.distribution(event.name, event.tags, event.measure)
315
- }
316
- }
317
- })
318
-
319
302
  this.addSub('ci:jest:test-suite:finish', ({
320
303
  status,
321
304
  errorMessage,
@@ -15,6 +15,8 @@ const log = require('../../dd-trace/src/log')
15
15
  * [[1, 2, 3], [2, 3, 5]]
16
16
  * 2. An array of objects, e.g.
17
17
  * [{ a: 1, b: 2, expected: 3 }, { a: 2, b: 3, expected: 5}]
18
+ *
19
+ * @param {unknown[]} testParameters `test.each` arguments
18
20
  */
19
21
  function getFormattedJestTestParameters (testParameters) {
20
22
  if (!testParameters || !testParameters.length) {
@@ -29,12 +29,13 @@ class KafkajsProducerPlugin extends ProducerPlugin {
29
29
  /**
30
30
  *
31
31
  * @typedef {object} ProducerResponseItem
32
- * @property {string} topic
32
+ * @property {string} topicName
33
33
  * @property {number} partition
34
34
  * @property {import('kafkajs/utils/long').Long} [offset]
35
35
  * @property {import('kafkajs/utils/long').Long} [baseOffset]
36
36
  *
37
37
  * @param {ProducerResponseItem} response
38
+ * @param {string} [clusterId]
38
39
  * @returns {ProducerBacklog}
39
40
  */
40
41
  transformProduceResponse (response, clusterId) {