Skip to content

warmup the nyc cache before running the tests - #8130

Merged
BridgeAR merged 5 commits into
masterfrom
nyc-cache-warmup
Apr 28, 2026
Merged

warmup the nyc cache before running the tests#8130
BridgeAR merged 5 commits into
masterfrom
nyc-cache-warmup

Conversation

@rochdev

@rochdev rochdev commented Apr 28, 2026

Copy link
Copy Markdown
Member

What does this PR do?

Warmup the nyc cache before running the tests.

Motivation

When running our tests, we defer calling tracer.init() until the first call to agent.load(). This means that the cost of instrumenting all of the project files for code coverage is deferred until that moment, which can be quite heavy without an existing nyc cache. This causes the first beforeEach to call agent.load() to sometimes take more than 5 seconds and ultimately timeout. By warming up the cache before running the tests, we avoid this issue entirely. Not all files are included in the warmup to keep it fast.

Additional Notes

Before the change, running the Express test locally without any cache made agent.load() take 2.3s compared to 230ms with the cache. With the partial warmup, it now takes ~400ms instead. Not as good as a full warmup, but good enough and takes way less time to generate.

@github-actions

github-actions Bot commented Apr 28, 2026

Copy link
Copy Markdown
Contributor

Overall package size

Self size: 5.56 MB
Deduped: 6.4 MB
No deduping: 6.4 MB

Dependency sizes | name | version | self size | total size | |------|---------|-----------|------------| | import-in-the-middle | 3.0.1 | 82.56 kB | 817.39 kB | | dc-polyfill | 0.1.10 | 26.73 kB | 26.73 kB |

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

@datadog-official

datadog-official Bot commented Apr 28, 2026

Copy link
Copy Markdown

Tests

🎉 All green!

❄️ No new flaky tests detected
🧪 All tests passed

🎯 Code Coverage (details)
Patch Coverage: 100.00%
Overall Coverage: 68.08% (-0.10%)

This comment will be updated automatically if new data arrives.
🔗 Commit SHA: f77a447 | Docs | Datadog PR Page | Give us feedback!

@codecov

codecov Bot commented Apr 28, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 73.81%. Comparing base (4cefbaf) to head (f77a447).
⚠️ Report is 1 commits behind head on master.

Additional details and impacted files
@@            Coverage Diff             @@
##           master    #8130      +/-   ##
==========================================
- Coverage   73.82%   73.81%   -0.01%     
==========================================
  Files         784      784              
  Lines       36369    36369              
==========================================
- Hits        26848    26847       -1     
- Misses       9521     9522       +1     
Flag Coverage Δ
aiguard-macos 36.38% <ø> (-0.10%) ⬇️
aiguard-ubuntu 36.49% <ø> (-0.09%) ⬇️
aiguard-windows 36.29% <ø> (-0.09%) ⬇️
apm-capabilities-tracing-macos 48.17% <ø> (ø)
apm-capabilities-tracing-ubuntu-active 48.19% <ø> (ø)
apm-capabilities-tracing-ubuntu-latest 48.16% <ø> (ø)
apm-capabilities-tracing-ubuntu-maintenance 48.19% <ø> (ø)
apm-capabilities-tracing-ubuntu-oldest 48.17% <ø> (-0.01%) ⬇️
apm-capabilities-tracing-windows 47.99% <ø> (ø)
apm-integrations-child-process 36.04% <ø> (-0.09%) ⬇️
apm-integrations-couchbase-18 35.07% <ø> (-0.09%) ⬇️
apm-integrations-couchbase-eol 35.09% <ø> (-0.12%) ⬇️
apm-integrations-oracledb 35.10% <ø> (-0.09%) ⬇️
appsec-express 52.73% <ø> (-0.10%) ⬇️
appsec-fastify 49.21% <ø> (-0.07%) ⬇️
appsec-graphql 49.50% <ø> (-0.16%) ⬇️
appsec-kafka 41.97% <ø> (-0.08%) ⬇️
appsec-ldapjs 41.31% <ø> (-0.08%) ⬇️
appsec-lodash 41.34% <ø> (-0.08%) ⬇️
appsec-macos 56.76% <ø> (-0.06%) ⬇️
appsec-mongodb-core 45.63% <ø> (-0.08%) ⬇️
appsec-mongoose 46.50% <ø> (-0.08%) ⬇️
appsec-mysql 48.69% <ø> (-0.07%) ⬇️
appsec-node-serialize 40.51% <ø> (-0.08%) ⬇️
appsec-passport 44.52% <ø> (-0.08%) ⬇️
appsec-postgres 48.28% <ø> (-0.19%) ⬇️
appsec-sourcing 40.01% <ø> (-0.08%) ⬇️
appsec-stripe 42.24% <ø> (-0.08%) ⬇️
appsec-template 40.68% <ø> (-0.08%) ⬇️
appsec-ubuntu 56.84% <ø> (-0.06%) ⬇️
appsec-windows 56.65% <ø> (-0.06%) ⬇️
instrumentations-instrumentation-bluebird 29.75% <ø> (-0.09%) ⬇️
instrumentations-instrumentation-body-parser 37.64% <ø> (-0.09%) ⬇️
instrumentations-instrumentation-child_process 35.41% <ø> (-0.09%) ⬇️
instrumentations-instrumentation-cookie-parser 31.68% <ø> (-0.09%) ⬇️
instrumentations-instrumentation-express 31.90% <ø> (-0.09%) ⬇️
instrumentations-instrumentation-express-mongo-sanitize 31.80% <ø> (-0.09%) ⬇️
instrumentations-instrumentation-express-session 37.27% <ø> (-0.09%) ⬇️
instrumentations-instrumentation-fs 29.43% <ø> (-0.09%) ⬇️
instrumentations-instrumentation-generic-pool 30.53% <ø> (ø)
instrumentations-instrumentation-http 36.88% <ø> (-0.08%) ⬇️
instrumentations-instrumentation-knex 29.72% <ø> (-0.09%) ⬇️
instrumentations-instrumentation-light-my-request 37.20% <ø> (-0.09%) ⬇️
instrumentations-instrumentation-mongoose 30.82% <ø> (-0.09%) ⬇️
instrumentations-instrumentation-multer 37.41% <ø> (-0.09%) ⬇️
instrumentations-instrumentation-mysql2 35.38% <ø> (-0.09%) ⬇️
instrumentations-instrumentation-passport 41.17% <ø> (-0.08%) ⬇️
instrumentations-instrumentation-passport-http 40.87% <ø> (-0.08%) ⬇️
instrumentations-instrumentation-passport-local 41.38% <ø> (-0.08%) ⬇️
instrumentations-instrumentation-pg 34.91% <ø> (-0.09%) ⬇️
instrumentations-instrumentation-promise 29.68% <ø> (-0.10%) ⬇️
instrumentations-instrumentation-promise-js 29.69% <ø> (-0.10%) ⬇️
instrumentations-instrumentation-q 29.72% <ø> (-0.09%) ⬇️
instrumentations-instrumentation-url 29.69% <ø> (-0.09%) ⬇️
instrumentations-instrumentation-when 29.70% <ø> (-0.10%) ⬇️
llmobs-ai 38.35% <ø> (-0.09%) ⬇️
llmobs-anthropic 37.82% <ø> (-0.09%) ⬇️
llmobs-bedrock 37.06% <ø> (-0.08%) ⬇️
llmobs-google-genai 37.49% <ø> (-0.08%) ⬇️
llmobs-langchain 37.10% <ø> (+0.03%) ⬆️
llmobs-openai 41.18% <ø> (-0.08%) ⬇️
llmobs-vertex-ai 37.67% <ø> (-0.09%) ⬇️
platform-core 30.03% <ø> (ø)
platform-esbuild 32.83% <ø> (ø)
platform-instrumentations-misc 40.01% <ø> (ø)
platform-shimmer 35.72% <ø> (ø)
platform-unit-guardrails 31.39% <ø> (ø)
platform-webpack 20.73% <ø> (ø)
plugins-azure-durable-functions 25.36% <ø> (ø)
plugins-azure-event-hubs 25.51% <ø> (ø)
plugins-azure-service-bus 24.92% <ø> (ø)
plugins-bullmq 40.68% <ø> (-0.09%) ⬇️
plugins-cassandra 35.24% <ø> (-0.09%) ⬇️
plugins-cookie 26.47% <ø> (ø)
plugins-cookie-parser 26.28% <ø> (ø)
plugins-crypto 25.70% <ø> (ø)
plugins-dd-trace-api 35.35% <ø> (-0.09%) ⬇️
plugins-express-mongo-sanitize 26.42% <ø> (ø)
plugins-express-session 26.24% <ø> (ø)
plugins-fastify 39.25% <ø> (-0.09%) ⬇️
plugins-fetch 35.76% <ø> (-0.08%) ⬇️
plugins-fs 35.64% <ø> (-0.09%) ⬇️
plugins-generic-pool 25.40% <ø> (ø)
plugins-google-cloud-pubsub 42.99% <ø> (-0.08%) ⬇️
plugins-grpc 38.01% <ø> (-0.09%) ⬇️
plugins-handlebars 26.46% <ø> (ø)
plugins-hapi 37.25% <ø> (-0.09%) ⬇️
plugins-hono 37.50% <ø> (-0.09%) ⬇️
plugins-ioredis 35.68% <ø> (-0.09%) ⬇️
plugins-knex 26.14% <ø> (ø)
plugins-langgraph 35.03% <ø> (-0.09%) ⬇️
plugins-ldapjs 24.02% <ø> (ø)
plugins-light-my-request 25.88% <ø> (ø)
plugins-limitd-client 29.98% <ø> (-0.09%) ⬇️
plugins-lodash 25.47% <ø> (ø)
plugins-mariadb 36.55% <ø> (-0.09%) ⬇️
plugins-memcached 35.33% <ø> (-0.09%) ⬇️
plugins-microgateway-core 36.34% <ø> (-0.09%) ⬇️
plugins-modelcontextprotocol-sdk 34.27% <ø> (-0.09%) ⬇️
plugins-moleculer 38.03% <ø> (-0.09%) ⬇️
plugins-mongodb 36.50% <ø> (-0.20%) ⬇️
plugins-mongodb-core 36.13% <ø> (-0.09%) ⬇️
plugins-mongoose 36.01% <ø> (-0.17%) ⬇️
plugins-multer 26.24% <ø> (ø)
plugins-mysql 36.42% <ø> (-0.09%) ⬇️
plugins-mysql2 36.40% <ø> (-0.09%) ⬇️
plugins-node-serialize 26.51% <ø> (ø)
plugins-opensearch 35.00% <ø> (-0.09%) ⬇️
plugins-passport-http 26.30% <ø> (ø)
plugins-pino 31.78% <ø> (-0.09%) ⬇️
plugins-postgres 34.39% <ø> (-0.09%) ⬇️
plugins-process 25.70% <ø> (ø)
plugins-pug 26.47% <ø> (ø)
plugins-redis 35.89% <ø> (-0.09%) ⬇️
plugins-router 39.90% <ø> (-0.09%) ⬇️
plugins-sequelize 25.18% <ø> (ø)
plugins-test-and-upstream-amqp10 35.52% <ø> (-0.23%) ⬇️
plugins-test-and-upstream-amqplib 40.82% <ø> (-0.09%) ⬇️
plugins-test-and-upstream-apollo 36.51% <ø> (-0.08%) ⬇️
plugins-test-and-upstream-avsc 35.41% <ø> (-0.09%) ⬇️
plugins-test-and-upstream-bunyan 31.13% <ø> (-0.09%) ⬇️
plugins-test-and-upstream-connect 37.84% <ø> (-0.09%) ⬇️
plugins-test-and-upstream-graphql 37.18% <ø> (-0.09%) ⬇️
plugins-test-and-upstream-koa 37.45% <ø> (-0.09%) ⬇️
plugins-test-and-upstream-protobufjs 35.63% <ø> (-0.09%) ⬇️
plugins-test-and-upstream-rhea 40.90% <ø> (-0.12%) ⬇️
plugins-undici 36.51% <ø> (-0.09%) ⬇️
plugins-url 25.70% <ø> (ø)
plugins-valkey 35.36% <ø> (-0.09%) ⬇️
plugins-vm 25.70% <ø> (ø)
plugins-winston 31.45% <ø> (-0.22%) ⬇️
plugins-ws 38.97% <ø> (-0.09%) ⬇️
profiling-macos 37.83% <ø> (-0.54%) ⬇️
profiling-ubuntu 37.99% <ø> (-0.54%) ⬇️
profiling-windows 38.92% <ø> (-0.52%) ⬇️
serverless-azure-functions-client 25.25% <ø> (ø)
serverless-azure-functions-eventhubs 25.25% <ø> (ø)
serverless-azure-functions-servicebus 25.25% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

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

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@pr-commenter

pr-commenter Bot commented Apr 28, 2026

Copy link
Copy Markdown

Benchmarks

Benchmark execution time: 2026-04-28 02:11:26

Comparing candidate commit f77a447 in PR branch nyc-cache-warmup with baseline commit 4cefbaf in branch master.

Found 0 performance improvements and 0 performance regressions! Performance is the same for 1341 metrics, 103 unstable metrics.

@rochdev
rochdev marked this pull request as ready for review April 28, 2026 01:35
@rochdev
rochdev requested a review from a team as a code owner April 28, 2026 01:35

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b9847d4440

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread package.json Outdated
"test:integration:bun": "mocha --timeout 60000 \"integration-tests/bun/*.spec.js\"",
"test:integration:cucumber": "mocha --timeout 60000 \"integration-tests/cucumber/*.spec.js\"",
"test:integration:cypress": "mocha --timeout 60000 \"integration-tests/cypress/${SPEC:-cypress-*}.spec.js\"",
"test:integration:cypress": "mocha --timeout 60000 \"integration-tests/cypress/*.spec.js\"",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Restore SPEC filtering in Cypress integration script

Removing ${SPEC:-cypress-*} from this script makes the SPEC environment variable a no-op, but the integration-cypress job in .github/workflows/test-optimization.yml still sets SPEC: ${{ matrix.spec }} for sharding. With the new glob, every matrix leg runs all Cypress integration specs instead of one, which significantly inflates CI runtime and flake exposure and invalidates the intended per-spec matrix split.

Useful? React with 👍 / 👎.

Comment thread package.json Outdated
"test:integration:jest": "mocha --timeout 60000 \"integration-tests/jest/*.spec.js\"",
"test:integration:mocha": "mocha --timeout 60000 \"integration-tests/mocha/*.spec.js\"",
"test:integration:playwright": "mocha --timeout 60000 \"integration-tests/playwright/${SPEC:-playwright-*}.spec.js\"",
"test:integration:playwright": "mocha --timeout 60000 \"integration-tests/playwright/*.spec.js\"",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Restore SPEC filtering in Playwright integration script

This change drops ${SPEC:-playwright-*} even though .github/workflows/test-optimization.yml passes SPEC: ${{ matrix.spec }} in the integration-playwright matrix. As a result, each matrix leg now executes every Playwright integration spec instead of the targeted one, multiplying job duration and retry surface while defeating the matrix's spec-level partitioning.

Useful? React with 👍 / 👎.

@pabloerhard pabloerhard left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM, but wouldn’t this hide the issue that our init is now occasionally taking longer than 5s and therefore failing? Is this expected as the codebase grows?

@BridgeAR BridgeAR left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM, this is a good idea and will reduce the main flakiness!

I wonder if it would make sense to move this inside of the workflows at a later point.

@BridgeAR

Copy link
Copy Markdown
Member

@pabloerhard the init just took longer due to the NYC instrumentation. Without that, it will be faster.

We can theoretically reduce the time budget from 5 seconds to a smaller number, if we make sure all our setups are fast enough.

@BridgeAR
BridgeAR merged commit 8fc99d0 into master Apr 28, 2026
873 checks passed
@BridgeAR
BridgeAR deleted the nyc-cache-warmup branch April 28, 2026 07:25
dd-octo-sts Bot pushed a commit that referenced this pull request Apr 29, 2026
* warmup the nyc cache before running the tests

* hide warmup output
@dd-octo-sts dd-octo-sts Bot mentioned this pull request Apr 29, 2026
BridgeAR pushed a commit that referenced this pull request Apr 30, 2026
* warmup the nyc cache before running the tests

* hide warmup output
rochdev added a commit that referenced this pull request May 6, 2026
c8 uses V8's built-in coverage instead of source-level instrumentation,
so there is no per-file cold-instrumentation cost during the first test
of a suite — that's the recurring `Timeout of 5000ms exceeded` flake
we've been chasing on plugin tests. The nyc cache warmup added in #8130
becomes unnecessary and is removed.

Side benefits:
- Native ESM coverage works out of the box (the four .mjs files in
  nyc.config.js's include were never instrumented under nyc's CJS-only
  hook).
- yarn.lock loses ~520 lines of nyc/istanbul transitive deps.

Tradeoffs:
- Higher peak memory under load — V8 keeps coverage maps for every
  loaded script. Should be fine on standard CI runners.
- Branch counts come from V8 block coverage rather than istanbul AST
  instrumentation; reports may shift slightly.

`scripts/run-c8.js` mirrors the per-Node-version-and-script output dir
naming that `nyc.config.js` was doing dynamically (so multiple Node
versions running sequentially in one job don't collide); static config
lives in `.c8rc.json`. `verify-coverage.js` keeps working unchanged
because the output layout (`coverage/node-${version}${label}/lcov.info`)
is identical.

Smoke-tested locally: `npm run test:core:ci` produces the expected lcov
artifacts and `verify-coverage.js` passes.
rochdev added a commit that referenced this pull request May 6, 2026
c8 uses V8's built-in coverage instead of source-level instrumentation,
so there is no per-file cold-instrumentation cost during the first test
of a suite — that's the recurring `Timeout of 5000ms exceeded` flake
we've been chasing on plugin tests. The nyc cache warmup added in #8130
becomes unnecessary and is removed.

Side benefits:
- Native ESM coverage works out of the box (the four .mjs files in
  nyc.config.js's include were never instrumented under nyc's CJS-only
  hook).
- yarn.lock loses ~520 lines of nyc/istanbul transitive deps.

Tradeoffs:
- Higher peak memory under load — V8 keeps coverage maps for every
  loaded script. Should be fine on standard CI runners.
- Branch counts come from V8 block coverage rather than istanbul AST
  instrumentation; reports may shift slightly.

`scripts/run-c8.js` mirrors the per-Node-version-and-script output dir
naming that `nyc.config.js` was doing dynamically (so multiple Node
versions running sequentially in one job don't collide); static config
lives in `.c8rc.json`. `verify-coverage.js` keeps working unchanged
because the output layout (`coverage/node-${version}${label}/lcov.info`)
is identical.

Smoke-tested locally: `npm run test:core:ci` produces the expected lcov
artifacts and `verify-coverage.js` passes.
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