Skip to content

chore(py3.15): official support, SSI, and profiling reno - #19254

Draft
vlad-scherbich wants to merge 9 commits into
vlad/315-profiling-dev-toolingfrom
vlad/315-official-support
Draft

chore(py3.15): official support, SSI, and profiling reno#19254
vlad-scherbich wants to merge 9 commits into
vlad/315-profiling-dev-toolingfrom
vlad/315-official-support

Conversation

@vlad-scherbich

@vlad-scherbich vlad-scherbich commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

prev: #19273 | next: (stack tip)

Summary

Stack tip: declare official Python 3.15 support in packaging, lib-injection SSI allow-list (formerly #19274), and profiling Reno note (formerly #19275). Merge last after profiling functional work lands.

Layer This PR
Compiled
Armed SSI wheel list
Observable requires-python, reno, customer-facing 3.15 support

Test plan

  • CI green on this branch
  • Reno fragment validates

Tracker

@datadog-official

datadog-official Bot commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Pipelines  Tests

Unblock PR with BitsAI

⚠️ Warnings

🚦 14 Pipeline jobs failed

System Tests | tracer-release / End-to-end #1 / openai-py@2.0.0 1 — ❌ 2 tests failed · 🔧 Needs a code fix, caused by this PR

View in Datadog · View in GitHub Actions

2 failed tests. AssertionError: expected a before-model ai_guard span with target 'prompt'.

Showing tests most relevant to this failure.

❌ tests.integration_frameworks.llm.openai.test_openai_ai_guard.TestOpenAiAiGuard.test_before_model_validation[openai-py@2.0.0] from system_tests_suite   View in Datadog
AssertionError: expected a before-model ai_guard span with target 'prompt'
assert []

self = <tests.integration_frameworks.llm.openai.test_openai_ai_guard.TestOpenAiAiGuard object at 0x7f5ca8f6f590>
test_agent = <utils.docker_fixtures._test_agent.TestAgentAPI object at 0x7f5c99883410>
test_client = <utils.docker_fixtures._test_clients._test_client_framework_integrations.FrameworkTestClientApi object at 0x7f5c99926ff0>

    def test_before_model_validation(self, test_agent: TestAgentAPI, test_client: FrameworkTestClientApi):
        """The prompt is evaluated by AI Guard before the OpenAI model is called."""
        with test_agent.vcr_context():
...
↳ and 1 more — View all
System Tests | tracer-release / End-to-end #2 / flask-poc 2 — ❌ 1 test failed · 🔧 Needs a code fix, caused by this PR

View in Datadog · View in GitHub Actions

1 failed test. AssertionError: 'ai_guard.http.client_ip' not found in span metadata during anomaly detection validation in tests/ai_guard/test_ai_guard_sdk.py:63.

Showing tests most relevant to this failure.

❌ tests.ai_guard.test_ai_guard_sdk.Test_AnomalyDetectionTags.test_anomaly_detection_tags[flask-poc] from system_tests_suite   View in Datadog
AssertionError: 'ai_guard.http.client_ip' not found in '{'ai_guard.target': 'prompt', 'ai_guard.usr.session_id': 's12345', '_dd.svc_src': 'm', 'ai_guard.action': 'ALLOW', 'env': 'system-tests', 'ai_guard.reason': 'No rule match.', 'ai_guard.http.useragent': 'system_tests rid/WLWZYQZPITFDKSXZLTHUPMEDQVUUHCDBXWRJ', 'version': '1.0.0', 'ai_guard.usr.id': 'u12345', 'key2': 'val2', 'ai_guard.redacted': 'false', 'key1': 'val1'}'
assert 'ai_guard.http.client_ip' in {'_dd.svc_src': 'm', 'ai_guard.action': 'ALLOW', 'ai_guard.http.useragent': 'system_tests rid/WLWZYQZPITFDKSXZLTHUPMEDQVUUHCDBXWRJ', 'ai_guard.reason': 'No rule match.', ...}

self = <tests.ai_guard.test_ai_guard_sdk.Test_AnomalyDetectionTags object at 0x7f9692fd5820>

    def test_anomaly_detection_tags(self):
        """Test that AI Guard spans carry anomaly detection attributes copied from the root span.
    
        Verifies that http.client_ip, network.client.ip, http.useragent, usr.id and usr.session.id
        are all present on the AI Guard span with the ai_guard. prefix, and that their values
...
DataDog/apm-reliability/dd-trace-py | build linux serverless: [amd64, cp315-cp315, v113741238-d2b8243-manylinux2014_x86_64, 1] — 🔧 Needs a code fix, caused by this PR

View in Datadog · View in GitLab

View all 14 failed jobs.

📋 Copy prompt for your agent
CI on my pull request is failing. Help me find and fix the root cause of each failing job below — they were flagged as caused by changes in this PR, so focus on the diff. For each job, explain the failure and propose a fix.

Branch: vlad/315-official-support

System Tests | tracer-release / End-to-end #1 / openai-py@2.0.0 1
Commit: 77818bccf209b6ded03537731835f69538234c05
Error (code / test):
2 failed tests. AssertionError: expected a before-model ai_guard span with target 'prompt'.
CI job: https://github.com/DataDog/dd-trace-py/actions/runs/32522616464/job/96900283871

System Tests | tracer-release / End-to-end #2 / flask-poc 2
Commit: 77818bccf209b6ded03537731835f69538234c05
Error (code / test):
1 failed test. AssertionError: 'ai_guard.http.client_ip' not found in span metadata during anomaly detection validation in tests/ai_guard/test_ai_guard_sdk.py:63.
CI job: https://github.com/DataDog/dd-trace-py/actions/runs/32522616464/job/96900283551

Plus 1 more failing job not shown here.

ℹ️ Info

No other issues found (see more)

❄️ No new flaky tests detected

Useful? React with 👍 / 👎

This comment will be updated automatically if new data arrives.
🔗 Commit SHA: d3cb48c | Docs | View more details | Give us feedback!

@vlad-scherbich
vlad-scherbich force-pushed the vlad/315-official-support branch from d40d842 to 79cdd04 Compare July 23, 2026 14:13
@vlad-scherbich
vlad-scherbich changed the base branch from main to vlad/315-ci-autoregen-lockfiles July 23, 2026 14:18
@vlad-scherbich
vlad-scherbich force-pushed the vlad/315-ci-autoregen-lockfiles branch from 39f57c0 to e18f65a Compare July 23, 2026 14:31
@vlad-scherbich
vlad-scherbich force-pushed the vlad/315-official-support branch from 79cdd04 to 20b8031 Compare July 23, 2026 14:31
@vlad-scherbich
vlad-scherbich force-pushed the vlad/315-official-support branch from 20b8031 to e3095a6 Compare July 24, 2026 01:25
@vlad-scherbich
vlad-scherbich changed the base branch from vlad/315-ci-autoregen-lockfiles to vlad/315-profiling-release-note July 24, 2026 01:25
@vlad-scherbich
vlad-scherbich deleted the branch vlad/315-profiling-dev-tooling July 24, 2026 01:25
@cit-pr-commenter-54b7da

cit-pr-commenter-54b7da Bot commented Jul 24, 2026

Copy link
Copy Markdown

Codeowners resolved as

Resolved from the full PR diff against vlad/315-profiling-dev-tooling using the target branch CODEOWNERS file.
CODEOWNERS team requests not listed below are not required by the current file set.

.riot/requirements/128e1e1.txt                                          @DataDog/apm-python
.riot/requirements/1857594.txt                                          @DataDog/apm-python
lib-injection/dl_wheels.py                                              @DataDog/apm-core-python
lib-injection/sources/requirements.csv                                  @DataDog/apm-core-python
lib-injection/sources/sitecustomize.py                                  @DataDog/apm-core-python
pyproject.toml                                                          @DataDog/python-guild
releasenotes/notes/profiling-python315-support-5910a6a4e623716b.yaml    @DataDog/apm-python
requirements.csv                                                        @DataDog/apm-core-python
scripts/integration_registry/registry.yaml                              @DataDog/apm-idm-python
scripts/py315-stack/PROFILING_STACK.md                                  @DataDog/python-guild
scripts/py315-stack/pr-numbers.env                                      @DataDog/python-guild
supported_versions.json                                                 @DataDog/apm-core-python @DataDog/apm-idm-python

@cit-pr-commenter-54b7da

cit-pr-commenter-54b7da Bot commented Jul 24, 2026

Copy link
Copy Markdown

Circular import analysis

⚠️ Existing circular imports

There are 3 circular imports that already exist on the base branch and have not been changed by this PR.

ddtrace.llmobs -> ddtrace.llmobs._evaluators -> ddtrace.llmobs._evaluators.format -> ddtrace.llmobs._experiment -> ddtrace.llmobs
ddtrace.errortracking._handled_exceptions.bytecode_injector -> ddtrace.errortracking._handled_exceptions.callbacks -> ddtrace.errortracking._handled_exceptions.collector -> ddtrace.errortracking._handled_exceptions.bytecode_reporting -> ddtrace.errortracking._handled_exceptions.bytecode_injector
ddtrace.appsec._asm_request_context -> ddtrace.appsec._iast._iast_request_context_base -> ddtrace.appsec._iast._iast_env -> ddtrace.appsec._iast.reporter -> ddtrace.appsec._exploit_prevention.stack_traces -> ddtrace.appsec._asm_request_context

vlad-scherbich added a commit that referenced this pull request Jul 24, 2026
Update pr-numbers, generate-pr-urls, MANUAL_EXISTING_PRS, and rebuild-stack
to reflect linear stack with peripheral/profiling before packaging (#19254).
Replacement PRs #19267#19275 supersede wrongly-merged #19255#19259.
@vlad-scherbich vlad-scherbich changed the title Vlad/315 official support chore(py3.15): declare official Python 3.15 support in packaging Aug 21, 2026
vlad-scherbich added a commit that referenced this pull request Aug 21, 2026
Update pr-numbers, generate-pr-urls, MANUAL_EXISTING_PRS, and rebuild-stack
to reflect linear stack with peripheral/profiling before packaging (#19254).
Replacement PRs #19267#19275 supersede wrongly-merged #19255#19259.
@vlad-scherbich
vlad-scherbich force-pushed the vlad/315-profiling-release-note branch from e525437 to e8ce368 Compare August 21, 2026 04:53
@vlad-scherbich
vlad-scherbich force-pushed the vlad/315-official-support branch from e3095a6 to 2f5e955 Compare August 21, 2026 04:53
@cit-pr-commenter-54b7da

Copy link
Copy Markdown

Dependency direction analysis

⚠️ Existing dependency direction violations

There are 250 dependency direction violations that already exist on the base branch and have not been changed by this PR.

Show existing violations (showing 5 of 250 highest severity)
ddtrace.internal.tracemethods -×-> ddtrace.trace  (internal-core -> product:tracing, score=135)
ddtrace.appsec._contrib.flask -×-> ddtrace.trace  (product:appsec -> product:tracing, score=133)
ddtrace.llmobs._integrations.openai_agents -×-> ddtrace.trace  (product:llmobs -> product:tracing, score=133)
ddtrace.internal.ci_visibility.filters -×-> ddtrace.trace  (product:ci_visibility -> product:tracing, score=133)
ddtrace.internal.openfeature._span_enrichment -×-> ddtrace.trace  (product:openfeature -> product:tracing, score=133)

To see all violations, download the layers-base.json and layers-pr.json artifacts from this CI job and run:

uv run --script scripts/import-analysis/layers.py compare layers-base.json layers-pr.json

@cit-pr-commenter-54b7da

cit-pr-commenter-54b7da Bot commented Aug 21, 2026

Copy link
Copy Markdown

Dependency direction analysis

⚠️ Existing dependency direction violations

There are 250 dependency direction violations that already exist on the base branch and have not been changed by this PR.

Show existing violations (showing 5 of 250 highest severity)
ddtrace.internal.tracemethods -×-> ddtrace.trace  (internal-core -> product:tracing, score=135)
ddtrace.profiling.collector.stack -×-> ddtrace.trace  (product:profiling -> product:tracing, score=133)
ddtrace.llmobs._integrations.claude_agent_sdk -×-> ddtrace.trace  (product:llmobs -> product:tracing, score=133)
ddtrace.internal.ci_visibility.recorder -×-> ddtrace.trace  (product:ci_visibility -> product:tracing, score=133)
ddtrace.internal.opentelemetry.trace -×-> ddtrace.trace  (product:opentelemetry -> product:tracing, score=133)

To see all violations, download the layers-base.json and layers-pr.json artifacts from this CI job and run:

uv run --script scripts/import-analysis/layers.py compare layers-base.json layers-pr.json

@pr-commenter

pr-commenter Bot commented Aug 21, 2026

Copy link
Copy Markdown

Benchmarks

Benchmark execution time: 2026-08-21 20:40:07

Comparing candidate commit d3cb48c in PR branch vlad/315-official-support with baseline commit 69baea3 in branch main.

📊 Benchmarking dashboard

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

Explanation

This is an A/B test comparing a candidate commit's performance against that of a baseline commit. Performance changes are noted in the tables below as:

  • 🟩 = significantly better candidate vs. baseline
  • 🟥 = significantly worse candidate vs. baseline

We compute a confidence interval (CI) over the relative difference of means between metrics from the candidate and baseline commits, considering the baseline as the reference.

If the CI is entirely outside the configured SIGNIFICANT_IMPACT_THRESHOLD (or the deprecated UNCONFIDENCE_THRESHOLD), the change is considered significant.

Feel free to reach out to #apm-benchmarking-platform on Slack if you have any questions.

More details about the CI and significant changes

You can imagine this CI as a range of values that is likely to contain the true difference of means between the candidate and baseline commits.

CIs of the difference of means are often centered around 0%, because often changes are not that big:

---------------------------------(------|---^--------)-------------------------------->
                              -0.6%    0%  0.3%     +1.2%
                                 |          |        |
         lower bound of the CI --'          |        |
sample mean (center of the CI) -------------'        |
         upper bound of the CI ----------------------'

As described above, a change is considered significant if the CI is entirely outside the configured SIGNIFICANT_IMPACT_THRESHOLD (or the deprecated UNCONFIDENCE_THRESHOLD).

For instance, for an execution time metric, this confidence interval indicates a significantly worse performance:

----------------------------------------|---------|---(---------^---------)---------->
                                       0%        1%  1.3%      2.2%      3.1%
                                                  |   |         |         |
       significant impact threshold --------------'   |         |         |
                      lower bound of CI --------------'         |         |
       sample mean (center of the CI) --------------------------'         |
                      upper bound of CI ----------------------------------'

scenario:httppropagationextract-empty_headers

  • 🟥 execution_time [+109.292ns; +139.147ns] or [+10.623%; +13.525%]

scenario:httppropagationinject-ids_only

  • 🟥 execution_time [+1.654µs; +1.814µs] or [+8.560%; +9.387%]

scenario:iastaspects-casefold_noaspect

  • 🟥 execution_time [+39.096µs; +48.896µs] or [+15.847%; +19.820%]

scenario:iastaspects-strip_aspect

  • 🟥 execution_time [+27.642µs; +34.534µs] or [+9.646%; +12.051%]

scenario:iastaspects-title_aspect

  • 🟥 execution_time [+44.527µs; +53.202µs] or [+16.833%; +20.112%]

scenario:iastaspectsospath-ospathbasename_aspect

  • 🟥 execution_time [+109.724µs; +119.781µs] or [+27.558%; +30.084%]

scenario:iastaspectssplit-rsplit_aspect

  • 🟥 execution_time [+16.258µs; +21.253µs] or [+11.283%; +14.749%]

scenario:span-start

  • 🟥 execution_time [+1.372ms; +1.564ms] or [+9.168%; +10.455%]

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

  • 🟥 execution_time [+419.617ns; +454.337ns] or [+15.999%; +17.323%]

scenario:tracer-small

  • 🟥 execution_time [+24.933µs; +29.088µs] or [+7.390%; +8.621%]

Unstable benchmarks

These benchmarks have a confidence interval too wide to call a change; treat them as noise rather than signal.

scenario:coreapiscenario-context_with_data_listeners

  • unstable execution_time [-695.973ns; +782.773ns] or [-6.375%; +7.170%]

scenario:coreapiscenario-core_dispatch_1_listener

  • unstable execution_time [-30.089ns; +35.991ns] or [-4.937%; +5.905%]

scenario:coreapiscenario-core_dispatch_50_listeners

  • unstable execution_time [-1605.718ns; +1687.147ns] or [-9.480%; +9.960%]

scenario:coreapiscenario-core_dispatch_exception_listeners

  • unstable execution_time [-1213.244ns; +1323.368ns] or [-9.135%; +9.964%]

scenario:coreapiscenario-core_dispatch_listeners

  • unstable execution_time [-321.433ns; +326.843ns] or [-8.794%; +8.942%]

scenario:coreapiscenario-core_dispatch_no_args_listeners

  • unstable execution_time [-256.996ns; +244.988ns] or [-8.866%; +8.452%]

scenario:coreapiscenario-core_dispatch_with_results_1_listener

  • unstable execution_time [-77.335ns; +67.982ns] or [-6.803%; +5.980%]

scenario:coreapiscenario-core_dispatch_with_results_50_listeners

  • unstable execution_time [-3823.080ns; +4114.293ns] or [-9.506%; +10.230%]

scenario:coreapiscenario-core_dispatch_with_results_listeners

  • unstable execution_time [-804.353ns; +746.544ns] or [-9.955%; +9.239%]

scenario:packagesupdateimporteddependencies-import_many_stdlib_cached

  • unstable execution_time [-61512.100ns; +59772.931ns] or [-9.579%; +9.308%]

vlad-scherbich added a commit that referenced this pull request Aug 21, 2026
Update pr-numbers, generate-pr-urls, MANUAL_EXISTING_PRS, and rebuild-stack
to reflect linear stack with peripheral/profiling before packaging (#19254).
Replacement PRs #19267#19275 supersede wrongly-merged #19255#19259.
@vlad-scherbich
vlad-scherbich force-pushed the vlad/315-profiling-release-note branch from e8ce368 to 3302918 Compare August 21, 2026 17:43
@vlad-scherbich
vlad-scherbich force-pushed the vlad/315-official-support branch 3 times, most recently from 30a5636 to 54d95fa Compare August 21, 2026 18:43
@vlad-scherbich
vlad-scherbich changed the base branch from vlad/315-profiling-release-note to vlad/315-profiling-dev-tooling August 21, 2026 18:44
@vlad-scherbich vlad-scherbich changed the title chore(py3.15): declare official Python 3.15 support in packaging chore(py3.15): official support, SSI, and profiling reno Aug 21, 2026
Bump sitecustomize allow-list to 3.16 (strict less-than) and add 3.15 to
dl_wheels supported_versions. Supersedes #17977 (GAP-01); merge after the
profiling stack lands.
Customer-facing Reno fragment for when the profiling stack ships (GAP-02).
@vlad-scherbich
vlad-scherbich force-pushed the vlad/315-official-support branch from 54d95fa to e0feb3a Compare August 21, 2026 19:42
@vlad-scherbich
vlad-scherbich force-pushed the vlad/315-official-support branch from e0feb3a to 4e3885a Compare August 21, 2026 19:44
Rebase left merge conflict markers in orphaned 222bcd0.txt while the
active riot hash 1857594 had no .txt lockfile. This broke
check_requirements_lockfiles and build_base_venvs [3.15], blocking
cp315 wheel uploads to S3.
Restore 128b106/128e1e1 lockfiles dropped during stack rebase and fix
CRLF line endings in requirements.csv that failed check-diff on Linux CI.
compile-and-prune-test-requirements deletes lockfiles whose riot hashes
no longer exist; leaving 114 orphans caused check_requirements_lockfiles
to fail on every pipeline run.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant