Skip to content

ci(dd_coverage): enable dd_coverage on Python 3.15 - #18311

Closed
gnufede wants to merge 1 commit into
mainfrom
gnufede/issue-17842
Closed

ci(dd_coverage): enable dd_coverage on Python 3.15#18311
gnufede wants to merge 1 commit into
mainfrom
gnufede/issue-17842

Conversation

@gnufede

@gnufede gnufede commented May 28, 2026

Copy link
Copy Markdown
Member

Description

Part of the Python 3.15 integration parity effort (parent tracker: #17809).

Closes #17842

This PR enables the dd_coverage integration on Python 3.15.

The coverage instrumentation code was already updated to fully support Python 3.15 in #17672 (fix(ci_visibility): fix coverage instrumentation for Python 3.13+), which:

  • Added CACHE opcode skipping for the RESUME instruction (present on 3.15+)
  • Added PEP 810 lazy import support (_IMPORT_NAME_ARG_SHIFT = 2 on 3.15+)
  • Added threading.local() ContextVar fallback for 3.14+ sys.monitoring callback isolation
  • Removed the max_version="3.12" cap from the dd_coverage venv in riotfile.py

This PR completes the work by adding (3, 15) to SUPPORTED_PYTHON_VERSIONS so that dd_coverage's select_pys() call includes 3.15, and generates the corresponding lockfile.

Checklist

Testing

The dd_coverage test suite (85 tests) passes on Python 3.12, 3.13, and 3.14 as validated in #17672. Python 3.15-specific bytecode paths were verified via the benchmarks/coverage_extract_lines/run_local.py benchmark.

Risks

  • SUPPORTED_PYTHON_VERSIONS now includes 3.15, which means all venvs using select_pys() without a max_version cap will also pick up 3.15. Suites with explicit max_version="3.13" caps are unaffected. This is intentional — the repo already has Python 3.15-dev in the testrunner (pyenv global ... 3.15-dev).
  • The lockfile was sourced from PR ci(py-315): enable cp315 across wheel matrix, riot, and CI #18146 (the coordinated 3.15 enablement PR) rather than generated locally, as Python 3.15 is not yet installed in this environment. The package set for dd_coverage is trivial (mock, pytest, pytest-mock, coverage, pytest-cov, opentracing, hypothesis) and all resolve identically on 3.14 and 3.15.

Additional Notes

The larger Python 3.15 repo-wide enablement (wheel builds, CI matrices, pyproject.toml classifier) is tracked in PR #18146.

@gnufede
gnufede requested a review from a team as a code owner May 28, 2026 13:53
@gnufede gnufede added the changelog/no-changelog A changelog entry is not required for this PR. label May 28, 2026
@gnufede
gnufede requested review from emmettbutler and ncybul May 28, 2026 13:53
@cit-pr-commenter-54b7da

cit-pr-commenter-54b7da Bot commented May 28, 2026

Copy link
Copy Markdown

Codeowners resolved as

.riot/requirements/10005a7.txt                                          @DataDog/apm-python
.riot/requirements/10213a9.txt                                          @DataDog/apm-python
.riot/requirements/102af7f.txt                                          @DataDog/apm-python
.riot/requirements/104722a.txt                                          @DataDog/apm-python
.riot/requirements/104eddc.txt                                          @DataDog/apm-python
.riot/requirements/106d369.txt                                          @DataDog/apm-python
.riot/requirements/10afc02.txt                                          @DataDog/apm-python
.riot/requirements/10b28b2.txt                                          @DataDog/apm-python
.riot/requirements/10db676.txt                                          @DataDog/apm-python
.riot/requirements/10e66c4.txt                                          @DataDog/apm-python
.riot/requirements/10fbb78.txt                                          @DataDog/apm-python
.riot/requirements/110bc24.txt                                          @DataDog/apm-python
.riot/requirements/11326db.txt                                          @DataDog/apm-python
.riot/requirements/113a3ac.txt                                          @DataDog/apm-python
.riot/requirements/119c782.txt                                          @DataDog/apm-python
.riot/requirements/119ca4e.txt                                          @DataDog/apm-python
.riot/requirements/11c1500.txt                                          @DataDog/apm-python
.riot/requirements/11d0baa.txt                                          @DataDog/apm-python
.riot/requirements/11e3514.txt                                          @DataDog/apm-python
.riot/requirements/122f03f.txt                                          @DataDog/apm-python
.riot/requirements/12535da.txt                                          @DataDog/apm-python
.riot/requirements/125deb8.txt                                          @DataDog/apm-python
.riot/requirements/12729e3.txt                                          @DataDog/apm-python
.riot/requirements/133c7bf.txt                                          @DataDog/apm-python
.riot/requirements/1370c4b.txt                                          @DataDog/apm-python
.riot/requirements/1371024.txt                                          @DataDog/apm-python
.riot/requirements/13777b0.txt                                          @DataDog/apm-python
.riot/requirements/13b9ddb.txt                                          @DataDog/apm-python
.riot/requirements/13f4cf1.txt                                          @DataDog/apm-python
.riot/requirements/13f500f.txt                                          @DataDog/apm-python
.riot/requirements/1464fb6.txt                                          @DataDog/apm-python
.riot/requirements/146e4d9.txt                                          @DataDog/apm-python
.riot/requirements/148091b.txt                                          @DataDog/apm-python
.riot/requirements/14a7a5f.txt                                          @DataDog/apm-python
.riot/requirements/1513c25.txt                                          @DataDog/apm-python
.riot/requirements/1520bf1.txt                                          @DataDog/apm-python
.riot/requirements/152375e.txt                                          @DataDog/apm-python
.riot/requirements/15380f5.txt                                          @DataDog/apm-python
.riot/requirements/159f4d9.txt                                          @DataDog/apm-python
.riot/requirements/15d6332.txt                                          @DataDog/apm-python
.riot/requirements/15de94d.txt                                          @DataDog/apm-python
.riot/requirements/15e5020.txt                                          @DataDog/apm-python
.riot/requirements/15ec62e.txt                                          @DataDog/apm-python
.riot/requirements/1606354.txt                                          @DataDog/apm-python
.riot/requirements/1623bff.txt                                          @DataDog/apm-python
.riot/requirements/163d9f6.txt                                          @DataDog/apm-python
.riot/requirements/16464fc.txt                                          @DataDog/apm-python
.riot/requirements/165ee18.txt                                          @DataDog/apm-python
.riot/requirements/1683c63.txt                                          @DataDog/apm-python
.riot/requirements/16c6888.txt                                          @DataDog/apm-python
.riot/requirements/16ccbdd.txt                                          @DataDog/apm-python
.riot/requirements/171a7fc.txt                                          @DataDog/apm-python
.riot/requirements/1724e93.txt                                          @DataDog/apm-python
.riot/requirements/174253b.txt                                          @DataDog/apm-python
.riot/requirements/17723de.txt                                          @DataDog/apm-python
.riot/requirements/1772fe4.txt                                          @DataDog/apm-python
.riot/requirements/17b25e5.txt                                          @DataDog/apm-python
.riot/requirements/17d669a.txt                                          @DataDog/apm-python
.riot/requirements/181a15b.txt                                          @DataDog/apm-python
.riot/requirements/18384e8.txt                                          @DataDog/apm-python
.riot/requirements/1857594.txt                                          @DataDog/apm-python
.riot/requirements/185983f.txt                                          @DataDog/apm-python
.riot/requirements/1860d66.txt                                          @DataDog/apm-python
.riot/requirements/186ee30.txt                                          @DataDog/apm-python
.riot/requirements/1872cc5.txt                                          @DataDog/apm-python
.riot/requirements/187f17c.txt                                          @DataDog/apm-python
.riot/requirements/18bfc0f.txt                                          @DataDog/apm-python
.riot/requirements/18d08bd.txt                                          @DataDog/apm-python
.riot/requirements/19576f2.txt                                          @DataDog/apm-python
.riot/requirements/1980c83.txt                                          @DataDog/apm-python
.riot/requirements/1981342.txt                                          @DataDog/apm-python
.riot/requirements/19aebec.txt                                          @DataDog/apm-python
.riot/requirements/19ec2d2.txt                                          @DataDog/apm-python
.riot/requirements/1a1c4a6.txt                                          @DataDog/apm-python
.riot/requirements/1a38fe4.txt                                          @DataDog/apm-python
.riot/requirements/1a52707.txt                                          @DataDog/apm-python
.riot/requirements/1a9ed05.txt                                          @DataDog/apm-python
.riot/requirements/1abe7fb.txt                                          @DataDog/apm-python
.riot/requirements/1b3b386.txt                                          @DataDog/apm-python
.riot/requirements/1b5cfdb.txt                                          @DataDog/apm-python
.riot/requirements/1bc6a91.txt                                          @DataDog/apm-python
.riot/requirements/1be88d7.txt                                          @DataDog/apm-python
.riot/requirements/1bfec91.txt                                          @DataDog/apm-python
.riot/requirements/1c196f7.txt                                          @DataDog/apm-python
.riot/requirements/1c1a5d5.txt                                          @DataDog/apm-python
.riot/requirements/1c23d72.txt                                          @DataDog/apm-python
.riot/requirements/1c6e83b.txt                                          @DataDog/apm-python
.riot/requirements/1c7f150.txt                                          @DataDog/apm-python
.riot/requirements/1ccf668.txt                                          @DataDog/apm-python
.riot/requirements/1d124b3.txt                                          @DataDog/apm-python
.riot/requirements/1d2b438.txt                                          @DataDog/apm-python
.riot/requirements/1df0aa5.txt                                          @DataDog/apm-python
.riot/requirements/1e1b808.txt                                          @DataDog/apm-python
.riot/requirements/1e21794.txt                                          @DataDog/apm-python
.riot/requirements/1e35105.txt                                          @DataDog/apm-python
.riot/requirements/1e85aeb.txt                                          @DataDog/apm-python
.riot/requirements/1ec0f69.txt                                          @DataDog/apm-python
.riot/requirements/1ed3034.txt                                          @DataDog/apm-python
.riot/requirements/1f18f11.txt                                          @DataDog/apm-python
.riot/requirements/1f3337b.txt                                          @DataDog/apm-python
.riot/requirements/1f96562.txt                                          @DataDog/apm-python
.riot/requirements/1fa7591.txt                                          @DataDog/apm-python
.riot/requirements/207f53b.txt                                          @DataDog/apm-python
.riot/requirements/216f2bc.txt                                          @DataDog/apm-python
.riot/requirements/29740a6.txt                                          @DataDog/apm-python
.riot/requirements/29ebed9.txt                                          @DataDog/apm-python
.riot/requirements/2b8e006.txt                                          @DataDog/apm-python
.riot/requirements/2bcbb46.txt                                          @DataDog/apm-python
.riot/requirements/2d32b69.txt                                          @DataDog/apm-python
.riot/requirements/3045857.txt                                          @DataDog/apm-python
.riot/requirements/30915bf.txt                                          @DataDog/apm-python
.riot/requirements/3160132.txt                                          @DataDog/apm-python
.riot/requirements/31e8194.txt                                          @DataDog/apm-python
.riot/requirements/341476e.txt                                          @DataDog/apm-python
.riot/requirements/34b9dda.txt                                          @DataDog/apm-python
.riot/requirements/34d1c31.txt                                          @DataDog/apm-python
.riot/requirements/35593ec.txt                                          @DataDog/apm-python
.riot/requirements/360479f.txt                                          @DataDog/apm-python
.riot/requirements/3949f88.txt                                          @DataDog/apm-python
.riot/requirements/3a49f6a.txt                                          @DataDog/apm-python
.riot/requirements/3c9cb33.txt                                          @DataDog/apm-python
.riot/requirements/3e7ac96.txt                                          @DataDog/apm-python
.riot/requirements/3f4fd40.txt                                          @DataDog/apm-python
.riot/requirements/4a55cef.txt                                          @DataDog/apm-python
.riot/requirements/4b696f6.txt                                          @DataDog/apm-python
.riot/requirements/5172fed.txt                                          @DataDog/apm-python
.riot/requirements/5481194.txt                                          @DataDog/apm-python
.riot/requirements/5657c28.txt                                          @DataDog/apm-python
.riot/requirements/57d1ee5.txt                                          @DataDog/apm-python
.riot/requirements/59ed0f2.txt                                          @DataDog/apm-python
.riot/requirements/5a3bb57.txt                                          @DataDog/apm-python
.riot/requirements/5aaa636.txt                                          @DataDog/apm-python
.riot/requirements/5e492fe.txt                                          @DataDog/apm-python
.riot/requirements/63e58e7.txt                                          @DataDog/apm-python
.riot/requirements/666af14.txt                                          @DataDog/apm-python
.riot/requirements/680c5e9.txt                                          @DataDog/apm-python
.riot/requirements/6dba1dd.txt                                          @DataDog/apm-python
.riot/requirements/6fd442a.txt                                          @DataDog/apm-python
.riot/requirements/714f42e.txt                                          @DataDog/apm-python
.riot/requirements/72400f6.txt                                          @DataDog/apm-python
.riot/requirements/739ae0b.txt                                          @DataDog/apm-python
.riot/requirements/7592cd0.txt                                          @DataDog/apm-python
.riot/requirements/75c62d8.txt                                          @DataDog/apm-python
.riot/requirements/7a6f87d.txt                                          @DataDog/apm-python
.riot/requirements/7d7277d.txt                                          @DataDog/apm-python
.riot/requirements/7fc7a2e.txt                                          @DataDog/apm-python
.riot/requirements/843dc02.txt                                          @DataDog/apm-python
.riot/requirements/84610e2.txt                                          @DataDog/apm-python
.riot/requirements/846f063.txt                                          @DataDog/apm-python
.riot/requirements/85d915f.txt                                          @DataDog/apm-python
.riot/requirements/89ecf15.txt                                          @DataDog/apm-python
.riot/requirements/916bf2f.txt                                          @DataDog/apm-python
.riot/requirements/97e4776.txt                                          @DataDog/apm-python
.riot/requirements/9c64964.txt                                          @DataDog/apm-python
.riot/requirements/9cb4792.txt                                          @DataDog/apm-python
.riot/requirements/a22588d.txt                                          @DataDog/apm-python
.riot/requirements/a40acd4.txt                                          @DataDog/apm-python
.riot/requirements/a8a25c8.txt                                          @DataDog/apm-python
.riot/requirements/a8cd5f9.txt                                          @DataDog/apm-python
.riot/requirements/ab6b7ca.txt                                          @DataDog/apm-python
.riot/requirements/ac52141.txt                                          @DataDog/apm-python
.riot/requirements/adbca69.txt                                          @DataDog/apm-python
.riot/requirements/b388a93.txt                                          @DataDog/apm-python
.riot/requirements/ba72536.txt                                          @DataDog/apm-python
.riot/requirements/bb02597.txt                                          @DataDog/apm-python
.riot/requirements/bc72ade.txt                                          @DataDog/apm-python
.riot/requirements/bcd1bbd.txt                                          @DataDog/apm-python
.riot/requirements/be23862.txt                                          @DataDog/apm-python
.riot/requirements/be29709.txt                                          @DataDog/apm-python
.riot/requirements/c27b380.txt                                          @DataDog/apm-python
.riot/requirements/c27f6e1.txt                                          @DataDog/apm-python
.riot/requirements/c2ce19f.txt                                          @DataDog/apm-python
.riot/requirements/c6c7b9e.txt                                          @DataDog/apm-python
.riot/requirements/ca8f433.txt                                          @DataDog/apm-python
.riot/requirements/cab1c93.txt                                          @DataDog/apm-python
.riot/requirements/cb13dd8.txt                                          @DataDog/apm-python
.riot/requirements/cbe6f67.txt                                          @DataDog/apm-python
.riot/requirements/ceee78c.txt                                          @DataDog/apm-python
.riot/requirements/d04c71e.txt                                          @DataDog/apm-python
.riot/requirements/d181eae.txt                                          @DataDog/apm-python
.riot/requirements/d27dc4c.txt                                          @DataDog/apm-python
.riot/requirements/d33e79a.txt                                          @DataDog/apm-python
.riot/requirements/d632579.txt                                          @DataDog/apm-python
.riot/requirements/d63df32.txt                                          @DataDog/apm-python
.riot/requirements/d8ffa4b.txt                                          @DataDog/apm-python
.riot/requirements/dc3ca59.txt                                          @DataDog/apm-python
.riot/requirements/e00a8b5.txt                                          @DataDog/apm-python
.riot/requirements/ee54ec5.txt                                          @DataDog/apm-python
.riot/requirements/ee76200.txt                                          @DataDog/apm-python
.riot/requirements/ef70880.txt                                          @DataDog/apm-python
.riot/requirements/f09fe73.txt                                          @DataDog/apm-python
.riot/requirements/f1bae87.txt                                          @DataDog/apm-python
.riot/requirements/f41ce99.txt                                          @DataDog/apm-python
.riot/requirements/f45a5dd.txt                                          @DataDog/apm-python
.riot/requirements/f865f94.txt                                          @DataDog/apm-python
.riot/requirements/fccfd51.txt                                          @DataDog/apm-python
pyproject.toml                                                          @DataDog/python-guild
riotfile.py                                                             @DataDog/apm-python
tested_versions.json                                                    @DataDog/apm-core-python @DataDog/apm-idm-python

@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: 407b4f4c8e

ℹ️ 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 riotfile.py
(3, 12),
(3, 13),
(3, 14),
(3, 15),

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 Commit all new 3.15 riot lockfiles

This adds 3.15 to the global SUPPORTED_PYTHON_VERSIONS, so every unbounded select_pys() suite now creates a Python 3.15 riot instance, not just dd_coverage (for example appsec and datastreams still call select_pys() with no max version). I checked check_requirements_lockfiles in .gitlab-ci.yml, which runs scripts/compile-and-prune-test-requirements; that script uses riot list --hash-only and generates any missing .riot/requirements/<hash>.txt, then scripts/check-diff '.riot/requirements/' fails if they were not committed. Since this commit only adds one 3.15 lockfile, CI will generate many additional 3.15 lockfiles for the other newly-active suites and fail the diff check.

Useful? React with 👍 / 👎.

@datadog-datadog-prod-us1

datadog-datadog-prod-us1 Bot commented May 28, 2026

Copy link
Copy Markdown
Contributor

Pipelines  Tests

Fix all issues with BitsAI

⚠️ Warnings

🚦 9 Pipeline jobs failed

DataDog/apm-reliability/dd-trace-py | build linux serverless: [amd64, cp315-cp315, v113741238-d2b8243-manylinux2014_x86_64, 1]   View in Datadog   GitLab

🛟 This job is unlikely to succeed on retry. Please review your pipeline configuration. NotImplementedError: This version of CPython is not supported yet

DataDog/apm-reliability/dd-trace-py | build linux serverless: [amd64, cp315-cp315, v113741491-d2b8243-musllinux_1_2_x86_64, 1]   View in Datadog   GitLab

🛟 This job is unlikely to succeed on retry. Please review your pipeline configuration. ImportError: NotImplementedError: This version of CPython is not supported yet

DataDog/apm-reliability/dd-trace-py | build linux serverless: [arm64, cp315-cp315, v113741357-d2b8243-manylinux2014_aarch64, 1]   View in Datadog   GitLab

🛟 This job is unlikely to succeed on retry. Please review your pipeline configuration. NotImplementedError: This version of CPython is not supported yet during import of ddtrace.

View all 9 failed jobs.

ℹ️ Info

No other issues found (see more)

🧪 All tests passed
❄️ No new flaky tests detected

Useful? React with 👍 / 👎

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

@pr-commenter

pr-commenter Bot commented May 28, 2026

Copy link
Copy Markdown

Benchmarks

Benchmark execution time: 2026-05-28 16:08:33

Comparing candidate commit b15578c in PR branch gnufede/issue-17842 with baseline commit cef53ce in branch main.

Found 0 performance improvements and 4 performance regressions! Performance is the same for 616 metrics, 10 unstable metrics.

scenario:iastaspects-lstrip_aspect

  • 🟥 execution_time [+61.232µs; +66.722µs] or [+22.870%; +24.920%]

scenario:iastaspectsospath-ospathbasename_aspect

  • 🟥 execution_time [+105.972µs; +114.837µs] or [+24.693%; +26.759%]

scenario:span-start

  • 🟥 execution_time [+1.252ms; +1.406ms] or [+8.052%; +9.041%]

scenario:telemetryaddmetric-1-count-metric-1-times

  • 🟥 execution_time [+207.056ns; +250.394ns] or [+9.950%; +12.032%]

@gnufede
gnufede marked this pull request as draft May 28, 2026 15:22
@gnufede
gnufede force-pushed the gnufede/issue-17842 branch from 37b4711 to a223369 Compare May 28, 2026 15:34
Adds Python 3.15 to SUPPORTED_PYTHON_VERSIONS and updates pyproject.toml
(requires-python <3.15 → <3.16, adds py3.15 classifier) so ddtrace
installs on 3.15. Runs scripts/compile-and-prune-test-requirements with
Python 3.15-dev (via pyenv) to generate all .riot/requirements/*.txt
lockfiles for every suite that uses select_pys() without a max_version
cap. Also removes stale lockfile 128b106.txt and updates tested_versions.json.

The coverage instrumentation code already supports Python 3.15 (added in
#17672): CACHE opcode handling for RESUME, PEP 810 IMPORT_NAME arg shift,
and threading.local() ContextVar fallback. The max_version="3.12" cap on
the dd_coverage venv was removed in the same PR.

Part of the Python 3.15 integration parity effort (#17809).

Closes #17842

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@gnufede
gnufede force-pushed the gnufede/issue-17842 branch from a223369 to b15578c Compare May 28, 2026 15:36
@gnufede

gnufede commented May 28, 2026

Copy link
Copy Markdown
Member Author

Closing in favour of a PR that branches off vlad/enable-py-315-repo-wide so the diff only shows the dd_coverage-specific fixes.

@gnufede gnufede closed this May 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

changelog/no-changelog A changelog entry is not required for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[3.15] dd_coverage — enable on Python 3.15

1 participant