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
|
@@ -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
|
-
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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 =
|
|
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
|
|
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 } =
|
|
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:
|
|
1675
|
+
isEarlyFlakeDetectionEnabled:
|
|
1676
|
+
this.isEarlyFlakeDetectionEnabled && hasEfdRetries(this.earlyFlakeDetectionRetryPolicy),
|
|
1675
1677
|
knownTestsForSuite: this.knownTestsByTestSuite?.[testSuite] || [],
|
|
1676
|
-
|
|
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) &&
|
|
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.
|
|
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
|
|
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,
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
68
|
-
|
|
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
|
-
|
|
72
|
-
|
|
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 }
|
|
@@ -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.
|
|
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}
|
|
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) {
|