Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[ci-visibility] Early flake detection for jest #3956

Merged
merged 7 commits into from
Feb 9, 2024

Conversation

juan-fernandez
Copy link
Collaborator

@juan-fernandez juan-fernandez commented Jan 11, 2024

What does this PR do?

Add early flake detection to jest.

The way it works:

  • When a test is about to be added (add_test event), we check whether it shows up in our list of known tests.
  • If it does, we do nothing.
  • If it doesn't, we'll "copy" the test N times (through this.global.test, which is the function the user calls to define tests).

Motivation

Early flake detection's objective is to detect flakiness before it reaches the main branch. Most of the flakiness from a repository comes from undetected flaky tests that are added to the repository (vs a smaller part which comes from modifications of already existing tests).

By knowing what tests a given test service has run, we can detect which ones are new (that is, being added in the current branch), and run them multiple times. By running them multiple times we can surface flakiness, should there be any.

Plugin Checklist

  • Unit tests.

Security

Datadog employees:

  • If this PR touches code that signs or publishes builds or packages, or handles credentials of any kind, I've requested a review from @DataDog/security-design-and-guidance.
  • This PR doesn't touch any of that.

Unsure? Have a question? Request a review!

Copy link

github-actions bot commented Jan 11, 2024

Overall package size

Self size: 6 MB
Deduped: 61.6 MB
No deduping: 62.36 MB

Dependency sizes

name version self size total size
@datadog/native-iast-taint-tracking 1.6.4 16.43 MB 16.44 MB
@datadog/native-appsec 7.0.0 14.51 MB 14.52 MB
@datadog/pprof 5.0.0 9.59 MB 10.44 MB
protobufjs 7.2.5 2.77 MB 6.56 MB
@datadog/native-iast-rewriter 2.2.3 2.19 MB 2.28 MB
@opentelemetry/core 1.14.0 872.87 kB 1.47 MB
@datadog/native-metrics 2.0.0 898.77 kB 1.3 MB
@opentelemetry/api 1.4.1 780.32 kB 780.32 kB
import-in-the-middle 1.7.3 67.62 kB 731.01 kB
pprof-format 2.0.7 588.12 kB 588.12 kB
msgpack-lite 0.1.26 201.16 kB 281.59 kB
opentracing 0.14.7 194.81 kB 194.81 kB
semver 7.5.4 93.4 kB 123.8 kB
@datadog/sketches-js 2.1.0 109.9 kB 109.9 kB
lodash.sortby 4.7.0 75.76 kB 75.76 kB
lru-cache 7.14.0 74.95 kB 74.95 kB
ipaddr.js 2.1.0 60.23 kB 60.23 kB
ignore 5.2.4 51.22 kB 51.22 kB
int64-buffer 0.1.10 49.18 kB 49.18 kB
shell-quote 1.8.1 44.96 kB 44.96 kB
istanbul-lib-coverage 3.2.0 29.34 kB 29.34 kB
tlhunter-sorted-set 0.1.0 24.94 kB 24.94 kB
limiter 1.1.5 23.17 kB 23.17 kB
dc-polyfill 0.1.4 23.1 kB 23.1 kB
retry 0.13.1 18.85 kB 18.85 kB
node-abort-controller 3.1.1 16.89 kB 16.89 kB
jest-docblock 29.7.0 8.99 kB 12.76 kB
crypto-randomuuid 1.0.0 11.18 kB 11.18 kB
path-to-regexp 0.1.7 6.78 kB 6.78 kB
koalas 1.0.2 6.47 kB 6.47 kB
methods 1.1.2 5.29 kB 5.29 kB
module-details-from-path 1.0.3 4.47 kB 4.47 kB

🤖 This report was automatically generated by heaviest-objects-in-the-universe

Copy link

codecov bot commented Jan 11, 2024

Codecov Report

All modified and coverable lines are covered by tests ✅

Comparison is base (b4f5edb) 83.92% compared to head (6460898) 85.15%.
Report is 8 commits behind head on master.

Additional details and impacted files
@@            Coverage Diff             @@
##           master    #3956      +/-   ##
==========================================
+ Coverage   83.92%   85.15%   +1.23%     
==========================================
  Files         107      243     +136     
  Lines        4330    10504    +6174     
  Branches       33       33              
==========================================
+ Hits         3634     8945    +5311     
- Misses        696     1559     +863     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@pr-commenter
Copy link

pr-commenter bot commented Jan 11, 2024

Benchmarks

Benchmark execution time: 2024-02-07 14:18:39

Comparing candidate commit 6460898 in PR branch juan-fernandez/early-flake-detection with baseline commit b4f5edb in branch master.

Found 1 performance improvements and 0 performance regressions! Performance is the same for 259 metrics, 6 unstable metrics.

scenario:plugin-graphql-with-depth-on-max-18

  • 🟩 max_rss_usage [-112.105MB; -109.399MB] or [-11.806%; -11.521%]

@juan-fernandez juan-fernandez force-pushed the juan-fernandez/early-flake-detection branch 2 times, most recently from 6302b85 to eb96dd4 Compare January 29, 2024 10:56
@juan-fernandez juan-fernandez force-pushed the juan-fernandez/early-flake-detection branch from 2208e26 to 45662e0 Compare January 31, 2024 11:10
@juan-fernandez juan-fernandez force-pushed the juan-fernandez/early-flake-detection branch 2 times, most recently from da8ee90 to 61c3e1a Compare February 5, 2024 17:57
@juan-fernandez juan-fernandez changed the title [ci-visibility] [wip] [do not merge] Early flake detection for jest [ci-visibility] Early flake detection for jest Feb 5, 2024
...jestCommonOptions,
testFile: 'ci-visibility/run-jest.mjs',
runTestsWithCoverageCommand: `node --loader=${hookFile} ./ci-visibility/run-jest.mjs`,
type: 'esm'
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

esm tests were being skipped altogether. Until we add them back this is noise, so I'm removing it

@@ -676,9 +676,7 @@ describe('CI Visibility Exporter', () => {
ciVisibilityExporter._resolveCanUseCiVisProtocol(false)
ciVisibilityExporter._libraryConfig = { isEarlyFlakeDetectionEnabled: true }
ciVisibilityExporter.getKnownTests({}, (err) => {
expect(err.message).to.include(
'Known tests can not be requested because CI Visibility protocol can not be used'
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

no need to do this: if CI Vis protocol can't be used, the library settings can't be fetched, so we will not even reach this situation

@juan-fernandez juan-fernandez force-pushed the juan-fernandez/early-flake-detection branch from 34b76b3 to 89fd074 Compare February 6, 2024 12:45
@juan-fernandez juan-fernandez force-pushed the juan-fernandez/early-flake-detection branch from 89fd074 to d4d6eec Compare February 6, 2024 12:46
// Add tests to be retried to the list of tests to run
for (let retryIndex = 0; retryIndex < earlyFlakeDetectionNumRetries; retryIndex++) {
if (this.global.test) {
this.global.test(getEfdTestName(event.testName, retryIndex), event.fn, event.timeout)
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is the hacky part: if we detect that the test is new, we'll call this.global.test right here, which is like defining a new test test('...')

@@ -62,6 +68,7 @@ const specStatusToTestStatus = {

const asyncResources = new WeakMap()
const originalTestFns = new WeakMap()
const retriedTestsToNumAttempts = new Map()
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

retriedTestsToNumAttempts is used to track how many times a test has been retried

@@ -90,6 +97,14 @@ function getTestEnvironmentOptions (config) {
return {}
}

function getEfdTestName (testName, numAttempt) {
return `${EFD_STRING} (#${numAttempt}): ${testName}`
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

to make it as explicit as possible why the test is being retried

} = remoteConfiguration
return {
isCodeCoverageEnabled,
isSuitesSkippingEnabled,
isItrEnabled,
requireGit,
isEarlyFlakeDetectionEnabled: isEarlyFlakeDetectionEnabled && this._config.isEarlyFlakeDetectionEnabled
isEarlyFlakeDetectionEnabled: isEarlyFlakeDetectionEnabled && this._config.isEarlyFlakeDetectionEnabled,
earlyFlakeDetectionNumRetries
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

improvements unrelated to the feature in this file

@juan-fernandez juan-fernandez marked this pull request as ready for review February 7, 2024 15:15
Copy link
Contributor

@romainkomorn-exdatadog romainkomorn-exdatadog left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Couple of nits but overall it makes sense to me.

@@ -14,7 +14,10 @@ const {
TEST_ITR_UNSKIPPABLE,
TEST_ITR_FORCED_RUN,
TEST_CODE_OWNERS,
ITR_CORRELATION_ID
ITR_CORRELATION_ID,
TEST_IS_NEW,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is the concept of a new test meaningful beyond EFD? I'm tempted to suggest this should be TEST_EARLY_FLAKE_IS_NEW .

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd say so. We've had issues in the past where we've namespaced tags only to realise that they were more general. I think that's a bigger problem than having a "general" tag only being applied to a feature / subproduct (but I don't even think that's going to be an issue here)

@@ -11,6 +11,8 @@ const {
getErrorTypeFromStatusCode
} = require('../telemetry')

const DEFAULT_NUM_RETRIES_EARLY_FLAKE_DETECTION = 2
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: DEFAULT_EARLY_FLAKE_DETECTION_NUM_RETRIES would match earlyFlakeDetectionNumRetries better.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@juan-fernandez juan-fernandez merged commit 8ec0cfe into master Feb 9, 2024
110 of 111 checks passed
@juan-fernandez juan-fernandez deleted the juan-fernandez/early-flake-detection branch February 9, 2024 12:17
@tlhunter tlhunter mentioned this pull request Feb 13, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants