Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .github/workflows/generate-package-versions.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,11 @@ jobs:
with:
python-version: "3.14"

- name: Setup Python 3.15
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
with:
python-version: "3.15"

- name: Set up QEMU
uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # v4.0.0

Expand Down
25 changes: 25 additions & 0 deletions .gitlab-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -645,13 +645,38 @@ profiling_native:
parallel:
matrix:
- PYTHON_VERSION: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"]
MEMCPY_MODE: ["default"]
SANITIZER: ["safety", "thread", ""]
# Valgrind on subset only: ASAN/LSAN (in "safety") already cover leaks, buffer overflows,
# and use-after-free. Valgrind's main added value is detecting uninitialized memory usage,
# which is worth checking on a few versions without the slowdown on all runs.
# If needed, please add more versions to the list.
- PYTHON_VERSION: ["3.12", "3.14"]
MEMCPY_MODE: ["default"]
SANITIZER: ["valgrind"]
- PYTHON_VERSION: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"]
MEMCPY_MODE: ["fast"]
SANITIZER: ["safety", "thread"]

# AIDEV-TODO(py315): fold 3.15 back into the profiling_native matrix once the
# dd/images/dd-trace-py/profiling_native base image installs a Python 3.15
# pyenv version. Today it only carries 3.9–3.14, so PYENV_VERSION=3.15 fails
# with "pyenv: version `3.15' is not installed". allow_failure keeps the
# pipeline green while the upstream image catches up; delete this job and
# re-add "3.15" to the PYTHON_VERSION arrays above once the image is updated.
profiling_native_py315:
extends: .profiling_native_base
allow_failure: true
retry: 2
rules: !reference [profiling_native, rules]
parallel:
matrix:
- PYTHON_VERSION: ["3.15"]
MEMCPY_MODE: ["default"]
SANITIZER: ["safety", "thread", "", "valgrind"]
- PYTHON_VERSION: ["3.15"]
MEMCPY_MODE: ["fast"]
SANITIZER: ["safety", "thread"]

test-dd-sts:
stage: tests
Expand Down
20 changes: 20 additions & 0 deletions .gitlab/package.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,11 @@ variables:
- "cp312-cp312"
- "cp313-cp313"
- "cp314-cp314"
# AIDEV-TODO(py315): cp315-cp315 is built in the separate "build linux cp315"
# job with allow_failure: true until the manylinux base image ships a
# cp315-cp315 interpreter (pypa/manylinux upstream; current image only
# exposes cp38-cp314 via manylinux-interpreters). Move the tag back into
# this anchor and delete the cp315 job once the image supports it.

.AARCH64_IMAGES: &AARCH64_IMAGES
- "v85383414-751efc0-manylinux2014_aarch64"
Expand Down Expand Up @@ -130,6 +135,21 @@ variables:
IMAGE_TAG: *AARCH64_IMAGES
DD_SERVERLESS_BUILD: "1"

# AIDEV-TODO(py315): fold back into "build linux" once the manylinux image ships
# a cp315-cp315 interpreter. allow_failure keeps the pipeline green while the
# upstream pypa/manylinux image is catching up to CPython 3.15.
"build linux cp315":
extends: "build linux"
allow_failure: true
parallel:
matrix:
- ARCH_TAG: "amd64"
PYTHON_TAG: "cp315-cp315"
IMAGE_TAG: *X86_64_IMAGES
- ARCH_TAG: "arm64"
PYTHON_TAG: "cp315-cp315"
IMAGE_TAG: *AARCH64_IMAGES

"build macos":
extends: .build_base
tags: [ "macos:sonoma-$ARCH_TAG", "specific:true" ]
Expand Down
1 change: 1 addition & 0 deletions .gitlab/templates/build-base-venvs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,4 @@ build_base_venvs:
- ddtrace/_version.py
- ddtrace/**/*.so*
- ddtrace/internal/datadog/profiling/test/test_*
- ddtrace/internal/datadog/profiling/test/py315/test_*
Original file line number Diff line number Diff line change
Expand Up @@ -2,34 +2,25 @@
# This file is autogenerated by pip-compile with Python 3.15
# by the following command:
#
# pip-compile --allow-unsafe --no-annotate .riot/requirements/f09fe73.in
# pip-compile --allow-unsafe --no-annotate .riot/requirements/1857594.in
#
attrs==26.1.0
coverage[toml]==7.13.5
execnet==2.1.2
gevent==26.4.0
greenlet==3.5.0
httpretty==1.1.4
hypothesis==6.45.0
iniconfig==2.3.0
mock==5.2.0
opentracing==2.4.0
packaging==26.2
packaging==26.1
pluggy==1.6.0
py-cpuinfo==9.0.0
pyfakefs==6.2.0
pygments==2.20.0
pytest==8.4.2
pytest-asyncio==0.23.8
pytest-benchmark==5.2.3
pytest-cov==7.1.0
pytest-mock==3.15.1
pytest-randomly==4.1.0
pytest-xdist==3.8.0
python-json-logger==2.0.7
sortedcontainers==2.4.0
uwsgi==2.0.31
wrapt==2.1.2
zope-event==5.0
zope-interface==7.2

Expand Down
34 changes: 34 additions & 0 deletions .riot/requirements/1c6cb02.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#
# This file is autogenerated by pip-compile with Python 3.15
# by the following command:
#
# pip-compile --allow-unsafe --no-annotate .riot/requirements/1c6cb02.in
#
attrs==26.1.0
coverage[toml]==7.13.5
gunicorn==25.3.0
hypothesis==6.45.0
iniconfig==2.3.0
jsonschema==4.26.0
jsonschema-specifications==2025.9.1
mock==5.2.0
numpy==2.4.4
opentracing==2.4.0
packaging==26.1
pluggy==1.6.0
protobuf==7.34.1
py-cpuinfo==8.0.0
pygments==2.20.0
pytest==9.0.3
pytest-asyncio==0.21.1
pytest-benchmark==5.2.3
pytest-cov==7.1.0
pytest-cpp==2.6.0
pytest-mock==3.15.1
pytest-randomly==4.1.0
referencing==0.37.0
rpds-py==0.30.0
sortedcontainers==2.4.0
uvloop==0.22.1
uwsgi==2.0.31
zstandard==0.25.0
33 changes: 33 additions & 0 deletions .riot/requirements/95077af.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#
# This file is autogenerated by pip-compile with Python 3.15
# by the following command:
#
# pip-compile --allow-unsafe --no-annotate .riot/requirements/95077af.in
#
attrs==26.1.0
coverage[toml]==7.13.5
gunicorn==25.3.0
hypothesis==6.45.0
iniconfig==2.3.0
jsonschema==4.26.0
jsonschema-specifications==2025.9.1
mock==5.2.0
numpy==2.4.4
opentracing==2.4.0
packaging==26.1
pluggy==1.6.0
protobuf==7.34.1
py-cpuinfo==8.0.0
pygments==2.20.0
pytest==9.0.3
pytest-asyncio==0.21.1
pytest-benchmark==5.2.3
pytest-cov==7.1.0
pytest-cpp==2.6.0
pytest-mock==3.15.1
pytest-randomly==4.1.0
referencing==0.37.0
rpds-py==0.30.0
sortedcontainers==2.4.0
uwsgi==2.0.31
zstandard==0.25.0
37 changes: 37 additions & 0 deletions .riot/requirements/e26245b.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#
# This file is autogenerated by pip-compile with Python 3.15
# by the following command:
#
# pip-compile --allow-unsafe --no-annotate .riot/requirements/e26245b.in
#
attrs==26.1.0
coverage[toml]==7.13.5
gevent==26.4.0
greenlet==3.4.0
gunicorn[gevent]==25.3.0
hypothesis==6.45.0
iniconfig==2.3.0
jsonschema==4.26.0
jsonschema-specifications==2025.9.1
mock==5.2.0
numpy==2.4.4
opentracing==2.4.0
packaging==26.1
pluggy==1.6.0
protobuf==7.34.1
py-cpuinfo==8.0.0
pygments==2.20.0
pytest==9.0.3
pytest-asyncio==0.21.1
pytest-benchmark==5.2.3
pytest-cov==7.1.0
pytest-cpp==2.6.0
pytest-mock==3.15.1
pytest-randomly==4.1.0
referencing==0.37.0
rpds-py==0.30.0
sortedcontainers==2.4.0
uwsgi==2.0.31
zope-event==6.1
zope-interface==8.3
zstandard==0.25.0
2 changes: 1 addition & 1 deletion hatch.toml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ cmakeformat_check = [
"bash scripts/cmake-format.sh"
]
cmakeformat_fix = [
"bash scripts/cmake-format.sh --fix"
"bash scripts/cmake-format.sh --fix {args}"
]
cformat_check = [
"bash scripts/cformat.sh"
Expand Down
23 changes: 12 additions & 11 deletions lib-injection/sources/requirements.csv
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
Dependency,Version Specifier,Python Version
bytecode,">=0.17.0,<1",python_version>='3.14.0'
bytecode,">=0.16.0,<1",python_version>='3.13.0'
bytecode,">=0.15.1,<1",python_version~='3.12.0'
bytecode,">=0.14.0,<1",python_version~='3.11.0'
bytecode,">=0.13.0,<1",python_version<'3.11'
envier,~=0.6.1,
opentelemetry-api,">=1,<2",
wrapt,">=1,<3",
opentracing,">=2,<3",
opentelemetry-exporter-otlp,">=1,<2",
Dependency,Version Specifier,Python Version
bytecode @ https://github.com/p403n1x87/bytecode/archive/refs/heads/feat/python-315.tar.gz,,python_version>='3.15'
bytecode,">=0.17.0,<1",python_version>='3.14' and python_version<'3.15'
bytecode,">=0.16.0,<1",python_version>='3.13' and python_version<'3.15'
bytecode,">=0.15.1,<1",python_version~='3.12.0'
bytecode,">=0.14.0,<1",python_version~='3.11.0'
bytecode,">=0.13.0,<1",python_version<'3.11'
envier,~=0.6.1,
opentelemetry-api,">=1,<2",
wrapt,">=1,<3",
opentracing,">=2,<3",
opentelemetry-exporter-otlp,">=1,<2",
23 changes: 12 additions & 11 deletions requirements.csv
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
Dependency,Version Specifier,Python Version
bytecode,">=0.17.0,<1",python_version>='3.14.0'
bytecode,">=0.16.0,<1",python_version>='3.13.0'
bytecode,">=0.15.1,<1",python_version~='3.12.0'
bytecode,">=0.14.0,<1",python_version~='3.11.0'
bytecode,">=0.13.0,<1",python_version<'3.11'
envier,~=0.6.1,
opentelemetry-api,">=1,<2",
wrapt,">=1,<3",
opentracing,">=2,<3",
opentelemetry-exporter-otlp,">=1,<2",
Dependency,Version Specifier,Python Version
bytecode @ https://github.com/p403n1x87/bytecode/archive/refs/heads/feat/python-315.tar.gz,,python_version>='3.15'
bytecode,">=0.17.0,<1",python_version>='3.14' and python_version<'3.15'
bytecode,">=0.16.0,<1",python_version>='3.13' and python_version<'3.15'
bytecode,">=0.15.1,<1",python_version~='3.12.0'
bytecode,">=0.14.0,<1",python_version~='3.11.0'
bytecode,">=0.13.0,<1",python_version<'3.11'
envier,~=0.6.1,
opentelemetry-api,">=1,<2",
wrapt,">=1,<3",
opentracing,">=2,<3",
opentelemetry-exporter-otlp,">=1,<2",
36 changes: 28 additions & 8 deletions riotfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
(3, 12),
(3, 13),
(3, 14),
(3, 15),
]


Expand Down Expand Up @@ -73,9 +72,9 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT
"""Helper to select python versions from the list of versions we support

>>> select_pys()
['3.9', '3.10', '3.11', '3.12', '3.13', '3.14', '3.15']
['3.9', '3.10', '3.11', '3.12', '3.13', '3.14']
>>> select_pys(min_version='3')
['3.9', '3.10', '3.11', '3.12', '3.13', '3.14', '3.15']
['3.9', '3.10', '3.11', '3.12', '3.13', '3.14']
>>> select_pys(max_version='3')
[]
>>> select_pys(min_version='3.9', max_version='3.10')
Expand All @@ -102,6 +101,12 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT
"DD_PYTEST_USE_NEW_PLUGIN": "true",
"DD_TRACE_COMPUTE_STATS": "false",
"DD_CODE_ORIGIN_FOR_SPANS_ENABLED": "false",
# TODO(py-315): pyo3 0.27.x (max Python 3.14) is used by several transitive deps
# (e.g. rpds-py) that ship only as source dists for Python 3.15. This flag tells
# pyo3-build-config to proceed using the stable ABI, allowing those packages to
# build until they ship pre-built 3.15 wheels or upgrade to pyo3 0.28+.
# Harmless on Python 3.9-3.14 (pyo3 natively supports those, so the flag is a no-op).
"PYO3_USE_ABI3_FORWARD_COMPATIBILITY": "1",
}
if _nightly_build:
_base_env["DD_CIVISIBILITY_CODE_COVERAGE_REPORT_UPLOAD_ENABLED"] = "1"
Expand Down Expand Up @@ -578,7 +583,11 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT
pys=select_pys(min_version="3.9", max_version="3.11"),
),
Venv(
pys=select_pys(min_version="3.12"),
# TODO(py-315): 3.15 explicitly opted in (not yet in
# SUPPORTED_PYTHON_VERSIONS). Crashtracker native code is
# validated on 3.15 via the PyFrame_GetBack guard; see
# releasenotes/notes/profiling-python315-support-*.yaml.
pys=select_pys(min_version="3.12") + ["3.15"],
env={
"PYTHONWARNINGS": "ignore:.*fork.*:DeprecationWarning::",
},
Expand Down Expand Up @@ -3750,9 +3759,9 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT
),
],
),
# Python 3.14 - protobuf 4.22.0 is not compatible (TypeError: Metaclasses with custom tp_new)
# Python 3.14+ - protobuf 4.22.0 is not compatible (TypeError: Metaclasses with custom tp_new)
Venv(
pys="3.14",
pys=["3.14", "3.15"],
pkgs={"uwsgi": latest},
venvs=[
Venv(
Expand Down Expand Up @@ -3796,6 +3805,11 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT
Venv(
name="profile-memalloc",
command="python -m tests.profiling.run pytest -v --no-cov --capture=no --benchmark-disable {cmdargs} tests/profiling/collector/test_memalloc.py tests/profiling/test_memalloc_fork.py", # noqa: E501
# TODO(py-315): Python 3.15 is intentionally excluded — setup.py
# skips _memalloc (and all profiling Cython extensions) for 3.15
# until the manylinux build image carries a 3.15 pyenv version.
# Re-add "3.15" here once both the build image and _memalloc
# compilation are unblocked.
pys=select_pys(),
env={
"DD_PROFILING_MEMALLOC_ASSERT_ON_REENTRY": "1",
Expand Down Expand Up @@ -4372,7 +4386,6 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT
pkgs={
"requests": latest,
"httpx": latest,
"tornado": "~=6.5",
},
env={
"DD_TRACE_AGENT_URL": "http://testagent:9126",
Expand All @@ -4382,7 +4395,14 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT
"DD_API_SECURITY_SAMPLE_DELAY": "0",
"DD_PATCH_MODULES": "unittest:false",
},
pys=["3.10", "3.14"],
venvs=[
Venv(
pys=["3.10", "3.14"],
pkgs={
"tornado": "~=6.5",
},
),
],
),
Venv(
name="appsec_iast_native",
Expand Down
Loading
Loading