Skip to content

chore(telemetry): track parent processes across forks#16839

Merged
gh-worker-dd-mergequeue-cf854d[bot] merged 12 commits intomainfrom
munir/implement-stable-runtime-id
Mar 25, 2026
Merged

chore(telemetry): track parent processes across forks#16839
gh-worker-dd-mergequeue-cf854d[bot] merged 12 commits intomainfrom
munir/implement-stable-runtime-id

Conversation

@mabdinur
Copy link
Copy Markdown
Contributor

Description

Implements session identifier headers for instrumentation telemetry as part of the Stable Service
Instance Identifier RFC. Each telemetry request now includes:

  • DD-Session-ID: current process runtime ID (always present)
  • DD-Root-Session-ID: original ancestor's runtime ID (forked processes only)
  • DD-Parent-Session-ID: immediate parent's runtime ID (forked processes only)

This enables the backend to correlate related processes across fork trees without relying on
runtime_id regeneration.

_PARENT_RUNTIME_ID tracking is added to ddtrace/internal/runtime alongside env var seeding
(_DD_ROOT_SESSION_ID, _DD_PARENT_SESSION_ID) to support multiprocessing spawn/forkserver
start methods.

Testing

  • tests/tracer/runtime/test_runtime_id.py::test_parent_runtime_id — validates
    get_parent_runtime_id() is None in the root process and correctly tracks the immediate
    parent across nested forks
  • tests/telemetry/test_telemetry.py::test_session_id_headers_across_forks — uses the test
    agent to capture telemetry requests from a parent → child → grandchild fork tree and asserts
    the correct structure of all three session headers

Risks

The new headers are additive — existing payload fields (runtime_id) are unchanged. No impact
to profiling, DI, crash tracking, or remote config.

Additional Notes

DD-Root-Session-ID and DD-Parent-Session-ID are omitted from root process requests per the
RFC spec: if DD-Root-Session-ID is absent, the backend assumes root_session_id == session_id.

@datadog-datadog-prod-us1-2

This comment has been minimized.

@pr-commenter
Copy link
Copy Markdown

pr-commenter bot commented Mar 10, 2026

Performance SLOs

Comparing candidate munir/implement-stable-runtime-id (6da2d4a) with baseline main (e061106)

🟡 Near SLO Breach (2 suites)
🟡 djangosimple - 30/30

✅ appsec

Time: ✅ 19.718ms (SLO: <22.300ms 📉 -11.6%) vs baseline: ~same

Memory: ✅ 68.636MB (SLO: <73.500MB -6.6%) vs baseline: +4.7%


✅ exception-replay-enabled

Time: ✅ 1.398ms (SLO: <1.450ms -3.6%) vs baseline: +0.3%

Memory: ✅ 66.743MB (SLO: <71.500MB -6.7%) vs baseline: +4.8%


✅ iast

Time: ✅ 19.707ms (SLO: <22.250ms 📉 -11.4%) vs baseline: -0.2%

Memory: ✅ 68.637MB (SLO: <75.000MB -8.5%) vs baseline: +4.7%


✅ profiler

Time: ✅ 15.189ms (SLO: <16.550ms -8.2%) vs baseline: +0.2%

Memory: ✅ 60.380MB (SLO: <61.000MB 🟡 -1.0%) vs baseline: +4.8%


✅ resource-renaming

Time: ✅ 19.628ms (SLO: <21.750ms -9.8%) vs baseline: -0.1%

Memory: ✅ 68.615MB (SLO: <73.500MB -6.6%) vs baseline: +4.8%


✅ span-code-origin

Time: ✅ 20.159ms (SLO: <28.200ms 📉 -28.5%) vs baseline: +1.6%

Memory: ✅ 68.531MB (SLO: <75.000MB -8.6%) vs baseline: +4.5%


✅ tracer

Time: ✅ 19.672ms (SLO: <21.750ms -9.6%) vs baseline: -0.1%

Memory: ✅ 68.767MB (SLO: <75.000MB -8.3%) vs baseline: +4.9%


✅ tracer-and-profiler

Time: ✅ 20.990ms (SLO: <23.500ms 📉 -10.7%) vs baseline: ~same

Memory: ✅ 70.720MB (SLO: <75.000MB -5.7%) vs baseline: +4.7%


✅ tracer-dont-create-db-spans

Time: ✅ 19.833ms (SLO: <21.500ms -7.8%) vs baseline: +0.5%

Memory: ✅ 68.716MB (SLO: <75.000MB -8.4%) vs baseline: +4.8%


✅ tracer-minimal

Time: ✅ 16.784ms (SLO: <17.500ms -4.1%) vs baseline: -0.3%

Memory: ✅ 68.633MB (SLO: <75.000MB -8.5%) vs baseline: +4.8%


✅ tracer-native

Time: ✅ 19.661ms (SLO: <21.750ms -9.6%) vs baseline: +0.2%

Memory: ✅ 68.601MB (SLO: <72.500MB -5.4%) vs baseline: +4.8%


✅ tracer-no-caches

Time: ✅ 17.598ms (SLO: <19.650ms 📉 -10.4%) vs baseline: +0.2%

Memory: ✅ 68.749MB (SLO: <75.000MB -8.3%) vs baseline: +5.0%


✅ tracer-no-databases

Time: ✅ 19.335ms (SLO: <20.100ms -3.8%) vs baseline: +0.2%

Memory: ✅ 68.721MB (SLO: <75.000MB -8.4%) vs baseline: +4.9%


✅ tracer-no-middleware

Time: ✅ 19.432ms (SLO: <21.500ms -9.6%) vs baseline: +0.2%

Memory: ✅ 68.715MB (SLO: <75.000MB -8.4%) vs baseline: +5.0%


✅ tracer-no-templates

Time: ✅ 19.821ms (SLO: <22.000ms -9.9%) vs baseline: +2.0%

Memory: ✅ 68.788MB (SLO: <73.500MB -6.4%) vs baseline: +5.1%


🟡 recursivecomputation - 8/8

✅ deep

Time: ✅ 310.764ms (SLO: <320.950ms -3.2%) vs baseline: ~same

Memory: ✅ 37.493MB (SLO: <38.750MB -3.2%) vs baseline: +5.1%


✅ deep-profiled

Time: ✅ 329.277ms (SLO: <359.150ms -8.3%) vs baseline: +0.2%

Memory: ✅ 43.942MB (SLO: <46.000MB -4.5%) vs baseline: +5.0%


✅ medium

Time: ✅ 7.302ms (SLO: <7.400ms 🟡 -1.3%) vs baseline: ~same

Memory: ✅ 36.451MB (SLO: <38.000MB -4.1%) vs baseline: +5.1%


✅ shallow

Time: ✅ 1.019ms (SLO: <1.050ms -2.9%) vs baseline: +1.7%

Memory: ✅ 36.372MB (SLO: <38.000MB -4.3%) vs baseline: +5.3%

⚠️ Unstable Tests (1 suite)
⚠️ coreapiscenario - 10/10 (1 unstable)

⚠️ context_with_data_listeners

Time: ⚠️ 13.686µs (SLO: <20.000µs 📉 -31.6%) vs baseline: +0.2%

Memory: ✅ 36.333MB (SLO: <38.000MB -4.4%) vs baseline: +4.8%


✅ context_with_data_no_listeners

Time: ✅ 3.584µs (SLO: <10.000µs 📉 -64.2%) vs baseline: -1.2%

Memory: ✅ 36.353MB (SLO: <38.000MB -4.3%) vs baseline: +5.1%


✅ get_item_exists

Time: ✅ 0.584µs (SLO: <10.000µs 📉 -94.2%) vs baseline: +0.2%

Memory: ✅ 36.353MB (SLO: <38.000MB -4.3%) vs baseline: +5.1%


✅ get_item_missing

Time: ✅ 0.643µs (SLO: <10.000µs 📉 -93.6%) vs baseline: +1.0%

Memory: ✅ 36.274MB (SLO: <38.000MB -4.5%) vs baseline: +4.8%


✅ set_item

Time: ✅ 24.380µs (SLO: <30.000µs 📉 -18.7%) vs baseline: -0.4%

Memory: ✅ 36.274MB (SLO: <38.000MB -4.5%) vs baseline: +4.9%

✅ All Tests Passing (15 suites)
errortrackingdjangosimple - 6/6

✅ errortracking-enabled-all

Time: ✅ 16.362ms (SLO: <19.850ms 📉 -17.6%) vs baseline: +0.1%

Memory: ✅ 68.597MB (SLO: <75.000MB -8.5%) vs baseline: +5.5%


✅ errortracking-enabled-user

Time: ✅ 16.347ms (SLO: <19.400ms 📉 -15.7%) vs baseline: -0.2%

Memory: ✅ 68.577MB (SLO: <75.000MB -8.6%) vs baseline: +5.5%


✅ tracer-enabled

Time: ✅ 16.355ms (SLO: <19.450ms 📉 -15.9%) vs baseline: ~same

Memory: ✅ 68.223MB (SLO: <75.000MB -9.0%) vs baseline: +5.0%


errortrackingflasksqli - 6/6

✅ errortracking-enabled-all

Time: ✅ 2.085ms (SLO: <2.300ms -9.4%) vs baseline: +0.2%

Memory: ✅ 55.699MB (SLO: <60.000MB -7.2%) vs baseline: +4.7%


✅ errortracking-enabled-user

Time: ✅ 2.092ms (SLO: <2.250ms -7.0%) vs baseline: ~same

Memory: ✅ 55.620MB (SLO: <60.000MB -7.3%) vs baseline: +4.6%


✅ tracer-enabled

Time: ✅ 2.078ms (SLO: <2.300ms -9.7%) vs baseline: -0.2%

Memory: ✅ 56.112MB (SLO: <60.000MB -6.5%) vs baseline: +5.6%


flasksimple - 18/18

✅ appsec-get

Time: ✅ 3.357ms (SLO: <4.750ms 📉 -29.3%) vs baseline: -0.5%

Memory: ✅ 55.718MB (SLO: <66.500MB 📉 -16.2%) vs baseline: +4.7%


✅ appsec-post

Time: ✅ 2.866ms (SLO: <6.750ms 📉 -57.5%) vs baseline: -0.1%

Memory: ✅ 55.937MB (SLO: <66.500MB 📉 -15.9%) vs baseline: +4.7%


✅ appsec-telemetry

Time: ✅ 3.363ms (SLO: <4.750ms 📉 -29.2%) vs baseline: +0.6%

Memory: ✅ 55.721MB (SLO: <66.500MB 📉 -16.2%) vs baseline: +4.7%


✅ debugger

Time: ✅ 1.875ms (SLO: <2.000ms -6.3%) vs baseline: ~same

Memory: ✅ 49.350MB (SLO: <51.500MB -4.2%) vs baseline: +5.0%


✅ iast-get

Time: ✅ 1.870ms (SLO: <2.000ms -6.5%) vs baseline: +0.2%

Memory: ✅ 45.989MB (SLO: <49.000MB -6.1%) vs baseline: +5.1%


✅ profiler

Time: ✅ 1.911ms (SLO: <2.100ms -9.0%) vs baseline: ~same

Memory: ✅ 52.398MB (SLO: <53.500MB -2.1%) vs baseline: +4.9%


✅ resource-renaming

Time: ✅ 3.335ms (SLO: <3.650ms -8.6%) vs baseline: +0.1%

Memory: ✅ 55.600MB (SLO: <60.000MB -7.3%) vs baseline: +4.4%


✅ tracer

Time: ✅ 3.345ms (SLO: <3.650ms -8.3%) vs baseline: ~same

Memory: ✅ 55.721MB (SLO: <60.000MB -7.1%) vs baseline: +4.7%


✅ tracer-native

Time: ✅ 3.346ms (SLO: <3.650ms -8.3%) vs baseline: +0.3%

Memory: ✅ 55.779MB (SLO: <60.000MB -7.0%) vs baseline: +4.8%


flasksqli - 6/6

✅ appsec-enabled

Time: ✅ 2.071ms (SLO: <4.200ms 📉 -50.7%) vs baseline: -0.1%

Memory: ✅ 55.797MB (SLO: <66.000MB 📉 -15.5%) vs baseline: +4.8%


✅ iast-enabled

Time: ✅ 2.085ms (SLO: <2.800ms 📉 -25.5%) vs baseline: ~same

Memory: ✅ 56.014MB (SLO: <62.500MB 📉 -10.4%) vs baseline: +5.2%


✅ tracer-enabled

Time: ✅ 2.077ms (SLO: <2.250ms -7.7%) vs baseline: +0.3%

Memory: ✅ 55.856MB (SLO: <60.000MB -6.9%) vs baseline: +4.9%


forktime - 4/4

✅ baseline

Time: ✅ 1.935ms (SLO: <3.000ms 📉 -35.5%) vs baseline: +3.5%

Memory: ✅ 29.236MB (SLO: <33.000MB 📉 -11.4%) vs baseline: +4.2%


✅ configured

Time: ✅ 8.684ms (SLO: <13.000ms 📉 -33.2%) vs baseline: +0.3%

Memory: ✅ 56.217MB (SLO: <60.000MB -6.3%) vs baseline: +5.2%


httppropagationextract - 60/60

✅ all_styles_all_headers

Time: ✅ 76.473µs (SLO: <100.000µs 📉 -23.5%) vs baseline: -0.4%

Memory: ✅ 36.412MB (SLO: <38.000MB -4.2%) vs baseline: +5.2%


✅ b3_headers

Time: ✅ 12.800µs (SLO: <20.000µs 📉 -36.0%) vs baseline: -0.3%

Memory: ✅ 36.530MB (SLO: <38.000MB -3.9%) vs baseline: +5.5%


✅ b3_single_headers

Time: ✅ 11.882µs (SLO: <20.000µs 📉 -40.6%) vs baseline: ~same

Memory: ✅ 36.372MB (SLO: <38.000MB -4.3%) vs baseline: +5.0%


✅ datadog_tracecontext_tracestate_not_propagated_on_trace_id_no_match

Time: ✅ 61.579µs (SLO: <80.000µs 📉 -23.0%) vs baseline: +0.3%

Memory: ✅ 36.353MB (SLO: <38.000MB -4.3%) vs baseline: +5.1%


✅ datadog_tracecontext_tracestate_propagated_on_trace_id_match

Time: ✅ 63.259µs (SLO: <80.000µs 📉 -20.9%) vs baseline: +0.2%

Memory: ✅ 36.353MB (SLO: <38.000MB -4.3%) vs baseline: +4.6%


✅ empty_headers

Time: ✅ 1.299µs (SLO: <10.000µs 📉 -87.0%) vs baseline: +0.5%

Memory: ✅ 36.471MB (SLO: <38.000MB -4.0%) vs baseline: +5.4%


✅ full_t_id_datadog_headers

Time: ✅ 21.265µs (SLO: <30.000µs 📉 -29.1%) vs baseline: +0.1%

Memory: ✅ 36.353MB (SLO: <38.000MB -4.3%) vs baseline: +4.9%


✅ invalid_priority_header

Time: ✅ 5.896µs (SLO: <10.000µs 📉 -41.0%) vs baseline: ~same

Memory: ✅ 36.884MB (SLO: <38.000MB -2.9%) vs baseline: +6.4%


✅ invalid_span_id_header

Time: ✅ 5.901µs (SLO: <10.000µs 📉 -41.0%) vs baseline: +0.3%

Memory: ✅ 36.746MB (SLO: <38.000MB -3.3%) vs baseline: +6.0%


✅ invalid_tags_header

Time: ✅ 5.905µs (SLO: <10.000µs 📉 -41.0%) vs baseline: +0.6%

Memory: ✅ 36.805MB (SLO: <38.000MB -3.1%) vs baseline: +5.9%


✅ invalid_trace_id_header

Time: ✅ 5.901µs (SLO: <10.000µs 📉 -41.0%) vs baseline: +0.6%

Memory: ✅ 36.510MB (SLO: <38.000MB -3.9%) vs baseline: +5.4%


✅ large_header_no_matches

Time: ✅ 26.943µs (SLO: <30.000µs 📉 -10.2%) vs baseline: ~same

Memory: ✅ 36.510MB (SLO: <38.000MB -3.9%) vs baseline: +5.3%


✅ large_valid_headers_all

Time: ✅ 28.034µs (SLO: <40.000µs 📉 -29.9%) vs baseline: +0.3%

Memory: ✅ 36.766MB (SLO: <38.000MB -3.2%) vs baseline: +6.2%


✅ medium_header_no_matches

Time: ✅ 9.248µs (SLO: <20.000µs 📉 -53.8%) vs baseline: +0.5%

Memory: ✅ 36.333MB (SLO: <38.000MB -4.4%) vs baseline: +4.8%


✅ medium_valid_headers_all

Time: ✅ 10.685µs (SLO: <20.000µs 📉 -46.6%) vs baseline: +0.9%

Memory: ✅ 36.707MB (SLO: <38.000MB -3.4%) vs baseline: +5.9%


✅ none_propagation_style

Time: ✅ 1.391µs (SLO: <10.000µs 📉 -86.1%) vs baseline: -1.0%

Memory: ✅ 36.333MB (SLO: <38.000MB -4.4%) vs baseline: +4.8%


✅ tracecontext_headers

Time: ✅ 32.706µs (SLO: <40.000µs 📉 -18.2%) vs baseline: +0.3%

Memory: ✅ 36.431MB (SLO: <38.000MB -4.1%) vs baseline: +5.0%


✅ valid_headers_all

Time: ✅ 5.977µs (SLO: <10.000µs 📉 -40.2%) vs baseline: +1.3%

Memory: ✅ 36.628MB (SLO: <38.000MB -3.6%) vs baseline: +5.7%


✅ valid_headers_basic

Time: ✅ 5.468µs (SLO: <10.000µs 📉 -45.3%) vs baseline: ~same

Memory: ✅ 36.431MB (SLO: <38.000MB -4.1%) vs baseline: +5.3%


✅ wsgi_empty_headers

Time: ✅ 1.298µs (SLO: <10.000µs 📉 -87.0%) vs baseline: +0.7%

Memory: ✅ 36.549MB (SLO: <38.000MB -3.8%) vs baseline: +5.6%


✅ wsgi_invalid_priority_header

Time: ✅ 5.928µs (SLO: <10.000µs 📉 -40.7%) vs baseline: ~same

Memory: ✅ 36.825MB (SLO: <38.000MB -3.1%) vs baseline: +6.1%


✅ wsgi_invalid_span_id_header

Time: ✅ 1.302µs (SLO: <10.000µs 📉 -87.0%) vs baseline: +0.7%

Memory: ✅ 36.844MB (SLO: <38.000MB -3.0%) vs baseline: +6.3%


✅ wsgi_invalid_tags_header

Time: ✅ 5.965µs (SLO: <10.000µs 📉 -40.4%) vs baseline: +0.4%

Memory: ✅ 36.726MB (SLO: <38.000MB -3.4%) vs baseline: +5.9%


✅ wsgi_invalid_trace_id_header

Time: ✅ 5.919µs (SLO: <10.000µs 📉 -40.8%) vs baseline: -0.6%

Memory: ✅ 36.549MB (SLO: <38.000MB -3.8%) vs baseline: +5.2%


✅ wsgi_large_header_no_matches

Time: ✅ 27.925µs (SLO: <40.000µs 📉 -30.2%) vs baseline: -0.7%

Memory: ✅ 36.707MB (SLO: <38.000MB -3.4%) vs baseline: +5.5%


✅ wsgi_large_valid_headers_all

Time: ✅ 29.123µs (SLO: <40.000µs 📉 -27.2%) vs baseline: ~same

Memory: ✅ 36.687MB (SLO: <38.000MB -3.5%) vs baseline: +5.4%


✅ wsgi_medium_header_no_matches

Time: ✅ 9.498µs (SLO: <20.000µs 📉 -52.5%) vs baseline: +0.4%

Memory: ✅ 36.766MB (SLO: <38.000MB -3.2%) vs baseline: +5.9%


✅ wsgi_medium_valid_headers_all

Time: ✅ 11.004µs (SLO: <20.000µs 📉 -45.0%) vs baseline: +1.3%

Memory: ✅ 36.805MB (SLO: <38.000MB -3.1%) vs baseline: +6.1%


✅ wsgi_valid_headers_all

Time: ✅ 5.967µs (SLO: <10.000µs 📉 -40.3%) vs baseline: +0.6%

Memory: ✅ 36.766MB (SLO: <38.000MB -3.2%) vs baseline: +6.2%


✅ wsgi_valid_headers_basic

Time: ✅ 5.472µs (SLO: <10.000µs 📉 -45.3%) vs baseline: -0.7%

Memory: ✅ 36.667MB (SLO: <38.000MB -3.5%) vs baseline: +5.9%


httppropagationinject - 16/16

✅ ids_only

Time: ✅ 20.920µs (SLO: <30.000µs 📉 -30.3%) vs baseline: +3.9%

Memory: ✅ 36.431MB (SLO: <38.000MB -4.1%) vs baseline: +4.9%


✅ with_all

Time: ✅ 27.421µs (SLO: <40.000µs 📉 -31.4%) vs baseline: +1.9%

Memory: ✅ 36.372MB (SLO: <38.000MB -4.3%) vs baseline: +4.9%


✅ with_dd_origin

Time: ✅ 24.099µs (SLO: <30.000µs 📉 -19.7%) vs baseline: +0.9%

Memory: ✅ 36.431MB (SLO: <38.000MB -4.1%) vs baseline: +5.3%


✅ with_priority_and_origin

Time: ✅ 23.386µs (SLO: <40.000µs 📉 -41.5%) vs baseline: +0.7%

Memory: ✅ 36.490MB (SLO: <38.000MB -4.0%) vs baseline: +5.4%


✅ with_sampling_priority

Time: ✅ 20.337µs (SLO: <30.000µs 📉 -32.2%) vs baseline: +1.3%

Memory: ✅ 36.431MB (SLO: <38.000MB -4.1%) vs baseline: +5.3%


✅ with_tags

Time: ✅ 25.335µs (SLO: <40.000µs 📉 -36.7%) vs baseline: +1.5%

Memory: ✅ 36.372MB (SLO: <38.000MB -4.3%) vs baseline: +5.0%


✅ with_tags_invalid

Time: ✅ 26.686µs (SLO: <40.000µs 📉 -33.3%) vs baseline: +1.2%

Memory: ✅ 36.530MB (SLO: <38.000MB -3.9%) vs baseline: +5.3%


✅ with_tags_max_size

Time: ✅ 25.900µs (SLO: <40.000µs 📉 -35.2%) vs baseline: +2.2%

Memory: ✅ 36.490MB (SLO: <38.000MB -4.0%) vs baseline: +5.3%


otelsdkspan - 24/24

✅ add-event

Time: ✅ 40.509ms (SLO: <42.000ms -3.5%) vs baseline: +0.3%

Memory: ✅ 39.066MB (SLO: <40.750MB -4.1%) vs baseline: +5.4%


✅ add-link

Time: ✅ 36.136ms (SLO: <38.550ms -6.3%) vs baseline: -0.6%

Memory: ✅ 39.145MB (SLO: <40.750MB -3.9%) vs baseline: +6.0%


✅ add-metrics

Time: ✅ 218.678ms (SLO: <232.000ms -5.7%) vs baseline: -1.0%

Memory: ✅ 39.223MB (SLO: <40.750MB -3.7%) vs baseline: +6.1%


✅ add-tags

Time: ✅ 213.254ms (SLO: <221.600ms -3.8%) vs baseline: +1.8%

Memory: ✅ 39.105MB (SLO: <40.750MB -4.0%) vs baseline: +5.9%


✅ get-context

Time: ✅ 28.903ms (SLO: <31.300ms -7.7%) vs baseline: -0.7%

Memory: ✅ 39.066MB (SLO: <40.750MB -4.1%) vs baseline: +5.3%


✅ is-recording

Time: ✅ 29.147ms (SLO: <31.000ms -6.0%) vs baseline: +0.4%

Memory: ✅ 39.046MB (SLO: <40.750MB -4.2%) vs baseline: +5.5%


✅ record-exception

Time: ✅ 63.300ms (SLO: <65.850ms -3.9%) vs baseline: +0.3%

Memory: ✅ 39.086MB (SLO: <40.750MB -4.1%) vs baseline: +4.9%


✅ set-status

Time: ✅ 31.970ms (SLO: <34.150ms -6.4%) vs baseline: -0.2%

Memory: ✅ 39.125MB (SLO: <40.750MB -4.0%) vs baseline: +5.8%


✅ start

Time: ✅ 29.289ms (SLO: <30.150ms -2.9%) vs baseline: +2.4%

Memory: ✅ 39.145MB (SLO: <40.750MB -3.9%) vs baseline: +6.0%


✅ start-finish

Time: ✅ 34.163ms (SLO: <35.350ms -3.4%) vs baseline: +1.3%

Memory: ✅ 39.145MB (SLO: <40.750MB -3.9%) vs baseline: +5.4%


✅ start-finish-telemetry

Time: ✅ 33.901ms (SLO: <35.450ms -4.4%) vs baseline: -1.0%

Memory: ✅ 39.184MB (SLO: <40.750MB -3.8%) vs baseline: +5.4%


✅ update-name

Time: ✅ 31.081ms (SLO: <33.400ms -6.9%) vs baseline: -0.4%

Memory: ✅ 39.105MB (SLO: <40.750MB -4.0%) vs baseline: +5.5%


otelspan - 22/22

✅ add-event

Time: ✅ 38.225ms (SLO: <47.150ms 📉 -18.9%) vs baseline: +0.9%

Memory: ✅ 41.488MB (SLO: <47.000MB 📉 -11.7%) vs baseline: +5.5%


✅ add-metrics

Time: ✅ 259.419ms (SLO: <344.800ms 📉 -24.8%) vs baseline: -0.2%

Memory: ✅ 45.916MB (SLO: <47.500MB -3.3%) vs baseline: +5.4%


✅ add-tags

Time: ✅ 307.975ms (SLO: <330.000ms -6.7%) vs baseline: +1.0%

Memory: ✅ 45.854MB (SLO: <47.500MB -3.5%) vs baseline: +5.2%


✅ get-context

Time: ✅ 80.674ms (SLO: <92.350ms 📉 -12.6%) vs baseline: ~same

Memory: ✅ 41.738MB (SLO: <46.500MB 📉 -10.2%) vs baseline: +5.2%


✅ is-recording

Time: ✅ 36.506ms (SLO: <44.500ms 📉 -18.0%) vs baseline: +0.6%

Memory: ✅ 41.205MB (SLO: <47.500MB 📉 -13.3%) vs baseline: +4.9%


✅ record-exception

Time: ✅ 56.778ms (SLO: <67.650ms 📉 -16.1%) vs baseline: +0.5%

Memory: ✅ 41.885MB (SLO: <47.000MB 📉 -10.9%) vs baseline: +5.5%


✅ set-status

Time: ✅ 43.147ms (SLO: <50.400ms 📉 -14.4%) vs baseline: +1.1%

Memory: ✅ 41.426MB (SLO: <47.000MB 📉 -11.9%) vs baseline: +5.5%


✅ start

Time: ✅ 37.302ms (SLO: <43.450ms 📉 -14.2%) vs baseline: +4.6%

Memory: ✅ 41.377MB (SLO: <47.000MB 📉 -12.0%) vs baseline: +5.1%


✅ start-finish

Time: ✅ 84.885ms (SLO: <90.000ms -5.7%) vs baseline: ~same

Memory: ✅ 39.046MB (SLO: <46.500MB 📉 -16.0%) vs baseline: +5.5%


✅ start-finish-telemetry

Time: ✅ 86.563ms (SLO: <91.000ms -4.9%) vs baseline: +0.1%

Memory: ✅ 38.968MB (SLO: <46.500MB 📉 -16.2%) vs baseline: +5.6%


✅ update-name

Time: ✅ 37.747ms (SLO: <45.150ms 📉 -16.4%) vs baseline: +0.9%

Memory: ✅ 41.313MB (SLO: <47.000MB 📉 -12.1%) vs baseline: +5.5%


ratelimiter - 12/12

✅ defaults

Time: ✅ 2.359µs (SLO: <10.000µs 📉 -76.4%) vs baseline: +1.0%

Memory: ✅ 36.648MB (SLO: <38.000MB -3.6%) vs baseline: +5.2%


✅ high_rate_limit

Time: ✅ 2.431µs (SLO: <10.000µs 📉 -75.7%) vs baseline: +0.5%

Memory: ✅ 36.608MB (SLO: <38.000MB -3.7%) vs baseline: +5.1%


✅ long_window

Time: ✅ 2.354µs (SLO: <10.000µs 📉 -76.5%) vs baseline: +0.1%

Memory: ✅ 36.687MB (SLO: <38.000MB -3.5%) vs baseline: +5.4%


✅ low_rate_limit

Time: ✅ 2.368µs (SLO: <10.000µs 📉 -76.3%) vs baseline: -0.3%

Memory: ✅ 36.667MB (SLO: <38.000MB -3.5%) vs baseline: +5.2%


✅ no_rate_limit

Time: ✅ 0.834µs (SLO: <10.000µs 📉 -91.7%) vs baseline: -0.5%

Memory: ✅ 36.648MB (SLO: <38.000MB -3.6%) vs baseline: +5.2%


✅ short_window

Time: ✅ 2.486µs (SLO: <10.000µs 📉 -75.1%) vs baseline: -0.2%

Memory: ✅ 36.628MB (SLO: <38.000MB -3.6%) vs baseline: +5.3%


samplingrules - 8/8

✅ average_match

Time: ✅ 146.048µs (SLO: <290.000µs 📉 -49.6%) vs baseline: -0.8%

Memory: ✅ 36.274MB (SLO: <38.000MB -4.5%) vs baseline: +4.7%


✅ high_match

Time: ✅ 189.734µs (SLO: <480.000µs 📉 -60.5%) vs baseline: -1.4%

Memory: ✅ 36.274MB (SLO: <38.000MB -4.5%) vs baseline: +4.8%


✅ low_match

Time: ✅ 99.776µs (SLO: <120.000µs 📉 -16.9%) vs baseline: -0.3%

Memory: ✅ 701.660MB (SLO: <780.000MB 📉 -10.0%) vs baseline: +4.8%


✅ very_low_match

Time: ✅ 2.888ms (SLO: <8.500ms 📉 -66.0%) vs baseline: -1.2%

Memory: ✅ 78.924MB (SLO: <85.000MB -7.1%) vs baseline: +5.0%


sethttpmeta - 32/32

✅ all-disabled

Time: ✅ 9.939µs (SLO: <20.000µs 📉 -50.3%) vs baseline: +1.0%

Memory: ✅ 37.277MB (SLO: <38.750MB -3.8%) vs baseline: +5.4%


✅ all-enabled

Time: ✅ 40.279µs (SLO: <50.000µs 📉 -19.4%) vs baseline: +1.4%

Memory: ✅ 37.159MB (SLO: <38.750MB -4.1%) vs baseline: +5.0%


✅ collectipvariant_exists

Time: ✅ 40.257µs (SLO: <50.000µs 📉 -19.5%) vs baseline: -0.4%

Memory: ✅ 37.238MB (SLO: <38.750MB -3.9%) vs baseline: +5.0%


✅ no-collectipvariant

Time: ✅ 39.506µs (SLO: <50.000µs 📉 -21.0%) vs baseline: +0.2%

Memory: ✅ 37.218MB (SLO: <38.750MB -4.0%) vs baseline: +5.1%


✅ no-useragentvariant

Time: ✅ 38.477µs (SLO: <50.000µs 📉 -23.0%) vs baseline: +0.6%

Memory: ✅ 37.257MB (SLO: <38.750MB -3.9%) vs baseline: +5.1%


✅ obfuscation-no-query

Time: ✅ 40.046µs (SLO: <50.000µs 📉 -19.9%) vs baseline: +0.9%

Memory: ✅ 37.218MB (SLO: <38.750MB -4.0%) vs baseline: +5.3%


✅ obfuscation-regular-case-explicit-query

Time: ✅ 75.879µs (SLO: <90.000µs 📉 -15.7%) vs baseline: -0.1%

Memory: ✅ 37.631MB (SLO: <38.750MB -2.9%) vs baseline: +5.2%


✅ obfuscation-regular-case-implicit-query

Time: ✅ 76.366µs (SLO: <90.000µs 📉 -15.1%) vs baseline: -0.2%

Memory: ✅ 37.513MB (SLO: <38.750MB -3.2%) vs baseline: +4.8%


✅ obfuscation-send-querystring-disabled

Time: ✅ 154.348µs (SLO: <170.000µs -9.2%) vs baseline: +0.1%

Memory: ✅ 37.532MB (SLO: <38.750MB -3.1%) vs baseline: +4.6%


✅ obfuscation-worst-case-explicit-query

Time: ✅ 148.451µs (SLO: <160.000µs -7.2%) vs baseline: -0.2%

Memory: ✅ 37.729MB (SLO: <38.750MB -2.6%) vs baseline: +5.5%


✅ obfuscation-worst-case-implicit-query

Time: ✅ 155.135µs (SLO: <170.000µs -8.7%) vs baseline: +0.1%

Memory: ✅ 37.631MB (SLO: <38.750MB -2.9%) vs baseline: +5.2%


✅ useragentvariant_exists_1

Time: ✅ 39.187µs (SLO: <50.000µs 📉 -21.6%) vs baseline: ~same

Memory: ✅ 37.198MB (SLO: <38.750MB -4.0%) vs baseline: +5.1%


✅ useragentvariant_exists_2

Time: ✅ 39.906µs (SLO: <50.000µs 📉 -20.2%) vs baseline: ~same

Memory: ✅ 37.179MB (SLO: <38.750MB -4.1%) vs baseline: +5.1%


✅ useragentvariant_exists_3

Time: ✅ 39.530µs (SLO: <50.000µs 📉 -20.9%) vs baseline: +0.2%

Memory: ✅ 37.159MB (SLO: <38.750MB -4.1%) vs baseline: +5.0%


✅ useragentvariant_not_exists_1

Time: ✅ 39.164µs (SLO: <50.000µs 📉 -21.7%) vs baseline: +0.2%

Memory: ✅ 37.179MB (SLO: <38.750MB -4.1%) vs baseline: +4.7%


✅ useragentvariant_not_exists_2

Time: ✅ 39.157µs (SLO: <50.000µs 📉 -21.7%) vs baseline: +0.6%

Memory: ✅ 37.159MB (SLO: <38.750MB -4.1%) vs baseline: +5.1%


span - 26/26

✅ add-event

Time: ✅ 17.469ms (SLO: <22.500ms 📉 -22.4%) vs baseline: +0.5%

Memory: ✅ 38.654MB (SLO: <53.000MB 📉 -27.1%) vs baseline: +5.3%


✅ add-metrics

Time: ✅ 86.790ms (SLO: <93.500ms -7.2%) vs baseline: +0.9%

Memory: ✅ 43.183MB (SLO: <53.000MB 📉 -18.5%) vs baseline: +5.3%


✅ add-tags

Time: ✅ 144.499ms (SLO: <155.000ms -6.8%) vs baseline: +0.1%

Memory: ✅ 43.101MB (SLO: <53.000MB 📉 -18.7%) vs baseline: +4.9%


✅ get-context

Time: ✅ 16.740ms (SLO: <20.500ms 📉 -18.3%) vs baseline: +1.2%

Memory: ✅ 38.502MB (SLO: <53.000MB 📉 -27.4%) vs baseline: +4.7%


✅ is-recording

Time: ✅ 16.871ms (SLO: <20.500ms 📉 -17.7%) vs baseline: +1.3%

Memory: ✅ 38.454MB (SLO: <53.000MB 📉 -27.4%) vs baseline: +4.7%


✅ record-exception

Time: ✅ 35.768ms (SLO: <41.000ms 📉 -12.8%) vs baseline: +0.7%

Memory: ✅ 39.153MB (SLO: <53.000MB 📉 -26.1%) vs baseline: +5.0%


✅ set-status

Time: ✅ 18.560ms (SLO: <22.000ms 📉 -15.6%) vs baseline: +1.1%

Memory: ✅ 38.562MB (SLO: <53.000MB 📉 -27.2%) vs baseline: +5.1%


✅ start

Time: ✅ 17.405ms (SLO: <20.500ms 📉 -15.1%) vs baseline: +5.6%

Memory: ✅ 38.572MB (SLO: <53.000MB 📉 -27.2%) vs baseline: +5.2%


✅ start-finish

Time: ✅ 54.018ms (SLO: <56.000ms -3.5%) vs baseline: +0.2%

Memory: ✅ 36.333MB (SLO: <38.000MB -4.4%) vs baseline: +5.1%


✅ start-finish-telemetry

Time: ✅ 54.833ms (SLO: <58.000ms -5.5%) vs baseline: -1.0%

Memory: ✅ 36.313MB (SLO: <38.000MB -4.4%) vs baseline: +4.7%


✅ start-finish-traceid128

Time: ✅ 56.231ms (SLO: <60.000ms -6.3%) vs baseline: ~same

Memory: ✅ 36.353MB (SLO: <38.000MB -4.3%) vs baseline: +5.1%


✅ start-traceid128

Time: ✅ 16.768ms (SLO: <22.500ms 📉 -25.5%) vs baseline: +2.0%

Memory: ✅ 38.583MB (SLO: <53.000MB 📉 -27.2%) vs baseline: +5.4%


✅ update-name

Time: ✅ 17.370ms (SLO: <22.000ms 📉 -21.0%) vs baseline: +1.6%

Memory: ✅ 38.541MB (SLO: <53.000MB 📉 -27.3%) vs baseline: +4.9%


telemetryaddmetric - 30/30

✅ 1-count-metric-1-times

Time: ✅ 2.255µs (SLO: <20.000µs 📉 -88.7%) vs baseline: +8.9%

Memory: ✅ 36.667MB (SLO: <38.000MB -3.5%) vs baseline: +5.8%


✅ 1-count-metrics-100-times

Time: ✅ 149.661µs (SLO: <220.000µs 📉 -32.0%) vs baseline: -0.4%

Memory: ✅ 36.628MB (SLO: <38.000MB -3.6%) vs baseline: +5.8%


✅ 1-distribution-metric-1-times

Time: ✅ 2.442µs (SLO: <20.000µs 📉 -87.8%) vs baseline: +0.5%

Memory: ✅ 36.530MB (SLO: <38.000MB -3.9%) vs baseline: +5.7%


✅ 1-distribution-metrics-100-times

Time: ✅ 163.510µs (SLO: <230.000µs 📉 -28.9%) vs baseline: -1.4%

Memory: ✅ 36.589MB (SLO: <38.000MB -3.7%) vs baseline: +5.7%


✅ 1-gauge-metric-1-times

Time: ✅ 1.963µs (SLO: <20.000µs 📉 -90.2%) vs baseline: +1.7%

Memory: ✅ 36.667MB (SLO: <38.000MB -3.5%) vs baseline: +5.9%


✅ 1-gauge-metrics-100-times

Time: ✅ 136.464µs (SLO: <150.000µs -9.0%) vs baseline: +0.5%

Memory: ✅ 36.648MB (SLO: <38.000MB -3.6%) vs baseline: +6.1%


✅ 1-rate-metric-1-times

Time: ✅ 2.245µs (SLO: <20.000µs 📉 -88.8%) vs baseline: +2.2%

Memory: ✅ 36.392MB (SLO: <38.000MB -4.2%) vs baseline: +5.3%


✅ 1-rate-metrics-100-times

Time: ✅ 163.189µs (SLO: <250.000µs 📉 -34.7%) vs baseline: -0.6%

Memory: ✅ 36.648MB (SLO: <38.000MB -3.6%) vs baseline: +6.2%


✅ 100-count-metrics-100-times

Time: ✅ 15.453ms (SLO: <22.000ms 📉 -29.8%) vs baseline: +1.2%

Memory: ✅ 36.589MB (SLO: <38.000MB -3.7%) vs baseline: +5.8%


✅ 100-distribution-metrics-100-times

Time: ✅ 1.769ms (SLO: <2.550ms 📉 -30.6%) vs baseline: +1.8%

Memory: ✅ 36.667MB (SLO: <38.000MB -3.5%) vs baseline: +6.1%


✅ 100-gauge-metrics-100-times

Time: ✅ 1.419ms (SLO: <1.550ms -8.4%) vs baseline: +0.4%

Memory: ✅ 36.648MB (SLO: <38.000MB -3.6%) vs baseline: +6.1%


✅ 100-rate-metrics-100-times

Time: ✅ 1.702ms (SLO: <2.550ms 📉 -33.2%) vs baseline: -0.1%

Memory: ✅ 36.608MB (SLO: <38.000MB -3.7%) vs baseline: +5.8%


✅ flush-1-metric

Time: ✅ 3.713µs (SLO: <20.000µs 📉 -81.4%) vs baseline: +5.4%

Memory: ✅ 36.746MB (SLO: <38.000MB -3.3%) vs baseline: +5.3%


✅ flush-100-metrics

Time: ✅ 179.220µs (SLO: <250.000µs 📉 -28.3%) vs baseline: +3.5%

Memory: ✅ 36.687MB (SLO: <38.000MB -3.5%) vs baseline: +5.0%


✅ flush-1000-metrics

Time: ✅ 2.241ms (SLO: <2.500ms 📉 -10.3%) vs baseline: +2.9%

Memory: ✅ 37.493MB (SLO: <38.750MB -3.2%) vs baseline: +5.5%


tracer - 6/6

✅ large

Time: ✅ 30.098ms (SLO: <32.950ms -8.7%) vs baseline: -0.3%

Memory: ✅ 37.709MB (SLO: <39.250MB -3.9%) vs baseline: +5.0%


✅ medium

Time: ✅ 2.965ms (SLO: <3.200ms -7.3%) vs baseline: -0.5%

Memory: ✅ 36.372MB (SLO: <38.750MB -6.1%) vs baseline: +4.6%


✅ small

Time: ✅ 349.353µs (SLO: <370.000µs -5.6%) vs baseline: +4.3%

Memory: ✅ 36.333MB (SLO: <38.750MB -6.2%) vs baseline: +4.9%

ℹ️ Scenarios Missing SLO Configuration (26 scenarios)

The following scenarios exist in candidate data but have no SLO thresholds configured:

  • coreapiscenario-core_dispatch_listeners
  • coreapiscenario-core_dispatch_no_listeners
  • coreapiscenario-core_dispatch_with_results_listeners
  • coreapiscenario-core_dispatch_with_results_no_listeners
  • djangosimple-baseline
  • errortrackingdjangosimple-baseline
  • errortrackingflasksqli-baseline
  • flasksimple-baseline
  • flasksqli-baseline
  • sethttpmeta-obfuscation-disabled
  • startup-baseline
  • startup-baseline_django
  • startup-baseline_flask
  • startup-ddtrace_run
  • startup-ddtrace_run_appsec
  • startup-ddtrace_run_profiling
  • startup-ddtrace_run_runtime_metrics
  • startup-ddtrace_run_send_span
  • startup-ddtrace_run_telemetry_disabled
  • startup-ddtrace_run_telemetry_enabled
  • startup-import_ddtrace
  • startup-import_ddtrace_auto
  • startup-import_ddtrace_auto_django
  • startup-import_ddtrace_auto_flask
  • startup-import_ddtrace_django
  • startup-import_ddtrace_flask

@mabdinur mabdinur added the changelog/no-changelog A changelog entry is not required for this PR. label Mar 10, 2026
@mabdinur mabdinur changed the title chore(telemetry): track parent processes chore(telemetry): track parent processes across forks Mar 11, 2026
Co-authored-by: Munir Abdinur <[email protected]>
@cit-pr-commenter-54b7da
Copy link
Copy Markdown

cit-pr-commenter-54b7da bot commented Mar 11, 2026

Codeowners resolved as

ddtrace/internal/runtime/__init__.py                                    @DataDog/apm-sdk-capabilities-python
ddtrace/internal/telemetry/writer.py                                    @DataDog/apm-python
tests/telemetry/test_telemetry.py                                       @DataDog/apm-python
tests/tracer/runtime/test_runtime_id.py                                 @DataDog/apm-sdk-capabilities-python @DataDog/apm-core-python

@mabdinur mabdinur marked this pull request as ready for review March 16, 2026 21:18
@mabdinur mabdinur requested review from a team as code owners March 16, 2026 21:18
Copy link
Copy Markdown

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

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: e1e5f7187e

ℹ️ About Codex in GitHub

Your team has set up Codex to 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 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Co-authored-by: Munir Abdinur <[email protected]>
Co-authored-by: Munir Abdinur <[email protected]>
gh-worker-dd-mergequeue-cf854d bot pushed a commit to DataDog/dd-trace-go that referenced this pull request Mar 20, 2026
## Summary

Implements the [Stable Service Instance Identifier RFC](https://docs.google.com/document/d/1ECKj9_NnwaKYtFqm3p3Rlpicx5d-OQcdj9kI2jvRqVU) for Go instrumentation telemetry.

- **`DD-Session-ID`**: always present on every telemetry request, set to the current `runtime_id`
- **`DD-Root-Session-ID`**: present only in child processes, inherited via `_DD_ROOT_GO_SESSION_ID` env var. Omitted when equal to session ID — backend infers root = self when absent
- **Auto-propagation**: `globalconfig.init()` sets `_DD_ROOT_GO_SESSION_ID` in `os.Environ()` so child processes spawned via `os/exec` inherit it automatically without any user-side calls

## Changes

- `internal/globalconfig/globalconfig.go`: adds `rootSessionID` field, `init()` reads/sets `_DD_ROOT_GO_SESSION_ID` (internal env var, not in supported_configurations), `RootSessionID()` getter
- `internal/telemetry/internal/writer.go`: adds `DD-Session-ID` (always) and `DD-Root-Session-ID` (child processes only) to pre-baked telemetry headers
- Tests for both globalconfig (including cross-process propagation) and writer

## Related

- System-tests PR: DataDog/system-tests#6510
- Node.js PR: DataDog/dd-trace-js#7821
- dd-trace-py fork tracking: DataDog/dd-trace-py#16839
- dd-trace-py spawn tracking: DataDog/dd-trace-py#16842

Co-authored-by: ayan.khan <[email protected]>
@mabdinur
Copy link
Copy Markdown
Contributor Author

/merge -f

@gh-worker-devflow-routing-ef8351
Copy link
Copy Markdown

gh-worker-devflow-routing-ef8351 bot commented Mar 25, 2026

View all feedbacks in Devflow UI.

2026-03-25 15:20:24 UTC ℹ️ Start processing command /merge -f


2026-03-25 15:20:26 UTC ❌ MergeQueue

You need to provide a reason for skipping checks

@mabdinur
Copy link
Copy Markdown
Contributor Author

/merge -f PR has been stuck in merge queue for over a week

@gh-worker-devflow-routing-ef8351
Copy link
Copy Markdown

View all feedbacks in Devflow UI.

2026-03-25 15:22:21 UTC ℹ️ Start processing command /merge -f PR has been stuck in merge queue for over a week
If you need support, contact us on Slack #devflow!


2026-03-25 15:22:22 UTCDevflow: /merge -f PR has been stuck in merge queue for over a week

Arguments errors:

  • --skip-checks: field is a boolean, but a value was provided. To set it to false, you need to omit it.

If you need support, contact us on Slack #devflow with those details!

@cit-pr-commenter-54b7da
Copy link
Copy Markdown

Circular import analysis

⚠️ Existing circular imports

The following circular imports already exist on the base branch and have not been changed by this PR:

ddtrace -> ddtrace.internal.datastreams -> ddtrace
ddtrace.internal.datastreams -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.datastreams
ddtrace -> ddtrace.trace -> ddtrace._trace.tracer -> ddtrace.internal.datastreams -> ddtrace

@gh-worker-dd-mergequeue-cf854d gh-worker-dd-mergequeue-cf854d bot merged commit e103911 into main Mar 25, 2026
1056 checks passed
@gh-worker-dd-mergequeue-cf854d gh-worker-dd-mergequeue-cf854d bot deleted the munir/implement-stable-runtime-id branch March 25, 2026 16:52
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 participants