Skip to content

fix(tracing): format _dd.p.ksr with decimal notation instead of scientific notation#17086

Merged
gh-worker-dd-mergequeue-cf854d[bot] merged 4 commits intomainfrom
brian.marks/fix-ksr-scientific-notation
Mar 25, 2026
Merged

fix(tracing): format _dd.p.ksr with decimal notation instead of scientific notation#17086
gh-worker-dd-mergequeue-cf854d[bot] merged 4 commits intomainfrom
brian.marks/fix-ksr-scientific-notation

Conversation

@bm1549
Copy link
Copy Markdown
Contributor

@bm1549 bm1549 commented Mar 24, 2026

Description

Fix _dd.p.ksr span tag formatting for very small sampling rates. Previously, rates below 0.001 were formatted using Python's :.6g format which outputs scientific notation (e.g. 0.000001"1e-06"). This changes to explicit integer-level rounding and :.6f formatting to always produce decimal notation with up to 6 decimal digits, trailing zeros stripped.

Related PRs:

Fixes APMAPI-1869

Testing

  • Added parametrized unit tests in tests/tracer/test_sampler.py::test_ksr_formatting covering:
    • Rate 1.0 → "1" (trailing zeros stripped)
    • Rate 0.000001 → "0.000001" (6 decimal precision boundary)
    • Rate 0.0000001 → "0" (below precision, rounds to zero)
    • Rate 0.0000005 → "0.000001" (rounds up to one millionth)
    • Rate 0.5 → "0.5" (simple case)
    • Rate 0.7654321 → "0.765432" (truncation at 6 decimal places)
  • These match the system test cases in Activate _dd.p.ksr tests for all languages system-tests#6466

Risks

None — the formatting change only affects _dd.p.ksr string values for very small rates. Values ≥ 0.001 produce identical output to the previous :.6g format.

Additional Notes

Uses math.floor(rate * 1e6 + 0.5) / 1e6 instead of round(rate * 1e6) / 1e6 to avoid Python's banker's rounding which would round 0.0000005 down to 0 instead of up to 0.000001.

bm1549 and others added 2 commits March 23, 2026 20:49
…tific notation

Very small sampling rates (e.g. 0.000001) were formatted using Python's
:.6g format which outputs scientific notation like "1e-06". This changes
to explicit rounding at the integer level and :.6f formatting to always
produce decimal notation with up to 6 decimal digits, trailing zeros
stripped (e.g. "0.000001").

Fixes APMAPI-1869

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@bm1549 bm1549 added the AI Generated Largely based on code generated by an AI or LLM. This label is the same across all dd-trace-* repos label Mar 24, 2026
@cit-pr-commenter-54b7da
Copy link
Copy Markdown

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

Codeowners resolved as

ddtrace/internal/sampling.py                                            @DataDog/apm-sdk-capabilities-python
releasenotes/notes/fix-ksr-scientific-notation-e7d1adabe548eb40.yaml    @DataDog/apm-python
tests/tracer/test_sampler.py                                            @DataDog/apm-sdk-capabilities-python @DataDog/apm-core-python

@datadog-prod-us1-6
Copy link
Copy Markdown

datadog-prod-us1-6 bot commented Mar 24, 2026

✅ Tests

🎉 All green!

❄️ No new flaky tests detected
🧪 All tests passed

This comment will be updated automatically if new data arrives.
🔗 Commit SHA: fbfb615 | Docs | Datadog PR Page | Was this helpful? React with 👍/👎 or give us feedback!

@pr-commenter
Copy link
Copy Markdown

pr-commenter bot commented Mar 24, 2026

Performance SLOs

Comparing candidate brian.marks/fix-ksr-scientific-notation (fbfb615) with baseline main (e49a662)

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

✅ appsec

Time: ✅ 19.703ms (SLO: <22.300ms 📉 -11.6%) vs baseline: +0.3%

Memory: ✅ 68.746MB (SLO: <73.500MB -6.5%) vs baseline: +5.1%


✅ exception-replay-enabled

Time: ✅ 1.399ms (SLO: <1.450ms -3.5%) vs baseline: -0.3%

Memory: ✅ 66.720MB (SLO: <71.500MB -6.7%) vs baseline: +4.7%


✅ iast

Time: ✅ 19.735ms (SLO: <22.250ms 📉 -11.3%) vs baseline: ~same

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


✅ profiler

Time: ✅ 15.145ms (SLO: <16.550ms -8.5%) vs baseline: +0.1%

Memory: ✅ 60.457MB (SLO: <61.000MB 🟡 -0.9%) vs baseline: +4.9%


✅ resource-renaming

Time: ✅ 19.613ms (SLO: <21.750ms -9.8%) vs baseline: ~same

Memory: ✅ 68.720MB (SLO: <73.500MB -6.5%) vs baseline: +5.0%


✅ span-code-origin

Time: ✅ 20.087ms (SLO: <28.200ms 📉 -28.8%) vs baseline: +0.9%

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


✅ tracer

Time: ✅ 19.749ms (SLO: <21.750ms -9.2%) vs baseline: +0.4%

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


✅ tracer-and-profiler

Time: ✅ 21.067ms (SLO: <23.500ms 📉 -10.4%) vs baseline: -0.3%

Memory: ✅ 70.709MB (SLO: <75.000MB -5.7%) vs baseline: +4.8%


✅ tracer-dont-create-db-spans

Time: ✅ 19.796ms (SLO: <21.500ms -7.9%) vs baseline: ~same

Memory: ✅ 68.814MB (SLO: <75.000MB -8.2%) vs baseline: +5.1%


✅ tracer-minimal

Time: ✅ 16.760ms (SLO: <17.500ms -4.2%) vs baseline: ~same

Memory: ✅ 68.566MB (SLO: <75.000MB -8.6%) vs baseline: +4.7%


✅ tracer-native

Time: ✅ 19.656ms (SLO: <21.750ms -9.6%) vs baseline: +0.5%

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


✅ tracer-no-caches

Time: ✅ 17.627ms (SLO: <19.650ms 📉 -10.3%) vs baseline: +0.5%

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


✅ tracer-no-databases

Time: ✅ 19.299ms (SLO: <20.100ms -4.0%) vs baseline: ~same

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


✅ tracer-no-middleware

Time: ✅ 19.402ms (SLO: <21.500ms -9.8%) vs baseline: +0.1%

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


✅ tracer-no-templates

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

Memory: ✅ 68.836MB (SLO: <73.500MB -6.3%) vs baseline: +5.0%


🟡 recursivecomputation - 8/8

✅ deep

Time: ✅ 310.980ms (SLO: <320.950ms -3.1%) vs baseline: -0.2%

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


✅ deep-profiled

Time: ✅ 328.699ms (SLO: <359.150ms -8.5%) vs baseline: ~same

Memory: ✅ 43.745MB (SLO: <46.000MB -4.9%) vs baseline: +4.5%


✅ medium

Time: ✅ 7.297ms (SLO: <7.400ms 🟡 -1.4%) vs baseline: +0.1%

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


✅ shallow

Time: ✅ 1.015ms (SLO: <1.050ms -3.3%) vs baseline: +1.6%

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

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

⚠️ context_with_data_listeners

Time: ⚠️ 13.602µs (SLO: <20.000µs 📉 -32.0%) vs baseline: ~same

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


✅ context_with_data_no_listeners

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

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


✅ get_item_exists

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

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


✅ get_item_missing

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

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


✅ set_item

Time: ✅ 24.250µs (SLO: <30.000µs 📉 -19.2%) vs baseline: -0.7%

Memory: ✅ 36.255MB (SLO: <38.000MB -4.6%) vs baseline: +4.5%

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

✅ errortracking-enabled-all

Time: ✅ 16.324ms (SLO: <19.850ms 📉 -17.8%) vs baseline: ~same

Memory: ✅ 68.262MB (SLO: <75.000MB -9.0%) vs baseline: +5.2%


✅ errortracking-enabled-user

Time: ✅ 16.391ms (SLO: <19.400ms 📉 -15.5%) vs baseline: +0.2%

Memory: ✅ 68.380MB (SLO: <75.000MB -8.8%) vs baseline: +5.3%


✅ tracer-enabled

Time: ✅ 16.293ms (SLO: <19.450ms 📉 -16.2%) vs baseline: -0.1%

Memory: ✅ 68.125MB (SLO: <75.000MB -9.2%) vs baseline: +4.8%


errortrackingflasksqli - 6/6

✅ errortracking-enabled-all

Time: ✅ 2.081ms (SLO: <2.300ms -9.5%) vs baseline: -0.5%

Memory: ✅ 55.660MB (SLO: <60.000MB -7.2%) vs baseline: +4.9%


✅ errortracking-enabled-user

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

Memory: ✅ 55.679MB (SLO: <60.000MB -7.2%) vs baseline: +5.0%


✅ tracer-enabled

Time: ✅ 2.081ms (SLO: <2.300ms -9.5%) vs baseline: ~same

Memory: ✅ 56.033MB (SLO: <60.000MB -6.6%) vs baseline: +5.4%


flasksimple - 18/18

✅ appsec-get

Time: ✅ 3.372ms (SLO: <4.750ms 📉 -29.0%) vs baseline: +0.5%

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


✅ appsec-post

Time: ✅ 2.870ms (SLO: <6.750ms 📉 -57.5%) vs baseline: +0.2%

Memory: ✅ 55.857MB (SLO: <66.500MB 📉 -16.0%) vs baseline: +4.8%


✅ appsec-telemetry

Time: ✅ 3.376ms (SLO: <4.750ms 📉 -28.9%) vs baseline: +1.1%

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


✅ debugger

Time: ✅ 1.874ms (SLO: <2.000ms -6.3%) vs baseline: -0.1%

Memory: ✅ 49.347MB (SLO: <51.500MB -4.2%) vs baseline: +5.5%


✅ iast-get

Time: ✅ 1.867ms (SLO: <2.000ms -6.6%) vs baseline: ~same

Memory: ✅ 46.005MB (SLO: <49.000MB -6.1%) vs baseline: +5.0%


✅ profiler

Time: ✅ 1.926ms (SLO: <2.100ms -8.3%) vs baseline: -0.2%

Memory: ✅ 52.354MB (SLO: <53.500MB -2.1%) vs baseline: +4.8%


✅ resource-renaming

Time: ✅ 3.334ms (SLO: <3.650ms -8.7%) vs baseline: ~same

Memory: ✅ 55.758MB (SLO: <60.000MB -7.1%) vs baseline: +4.8%


✅ tracer

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

Memory: ✅ 55.718MB (SLO: <60.000MB -7.1%) vs baseline: +4.8%


✅ tracer-native

Time: ✅ 3.338ms (SLO: <3.650ms -8.6%) vs baseline: ~same

Memory: ✅ 55.737MB (SLO: <60.000MB -7.1%) vs baseline: +4.8%


flasksqli - 6/6

✅ appsec-enabled

Time: ✅ 2.075ms (SLO: <4.200ms 📉 -50.6%) vs baseline: -0.2%

Memory: ✅ 55.876MB (SLO: <66.000MB 📉 -15.3%) vs baseline: +4.9%


✅ iast-enabled

Time: ✅ 2.080ms (SLO: <2.800ms 📉 -25.7%) vs baseline: -0.1%

Memory: ✅ 55.837MB (SLO: <62.500MB 📉 -10.7%) vs baseline: +4.8%


✅ tracer-enabled

Time: ✅ 2.071ms (SLO: <2.250ms -8.0%) vs baseline: ~same

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


forktime - 4/4

✅ baseline

Time: ✅ 1.944ms (SLO: <3.000ms 📉 -35.2%) vs baseline: +3.9%

Memory: ✅ 29.275MB (SLO: <33.000MB 📉 -11.3%) vs baseline: +4.8%


✅ configured

Time: ✅ 8.746ms (SLO: <13.000ms 📉 -32.7%) vs baseline: +0.1%

Memory: ✅ 55.821MB (SLO: <60.000MB -7.0%) vs baseline: +4.6%


httppropagationextract - 60/60

✅ all_styles_all_headers

Time: ✅ 80.498µs (SLO: <100.000µs 📉 -19.5%) vs baseline: +5.2%

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


✅ b3_headers

Time: ✅ 12.842µs (SLO: <20.000µs 📉 -35.8%) vs baseline: -0.6%

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


✅ b3_single_headers

Time: ✅ 11.879µs (SLO: <20.000µs 📉 -40.6%) vs baseline: +0.1%

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


✅ datadog_tracecontext_tracestate_not_propagated_on_trace_id_no_match

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

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


✅ datadog_tracecontext_tracestate_propagated_on_trace_id_match

Time: ✅ 63.194µs (SLO: <80.000µs 📉 -21.0%) vs baseline: ~same

Memory: ✅ 36.785MB (SLO: <38.000MB -3.2%) vs baseline: +6.0%


✅ empty_headers

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

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


✅ full_t_id_datadog_headers

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

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


✅ invalid_priority_header

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

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


✅ invalid_span_id_header

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

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


✅ invalid_tags_header

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

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


✅ invalid_trace_id_header

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

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


✅ large_header_no_matches

Time: ✅ 27.213µs (SLO: <30.000µs -9.3%) vs baseline: +0.8%

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


✅ large_valid_headers_all

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

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


✅ medium_header_no_matches

Time: ✅ 9.192µs (SLO: <20.000µs 📉 -54.0%) vs baseline: +0.2%

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


✅ medium_valid_headers_all

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

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


✅ none_propagation_style

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

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


✅ tracecontext_headers

Time: ✅ 32.631µs (SLO: <40.000µs 📉 -18.4%) vs baseline: -0.4%

Memory: ✅ 36.785MB (SLO: <38.000MB -3.2%) vs baseline: +6.0%


✅ valid_headers_all

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

Memory: ✅ 36.785MB (SLO: <38.000MB -3.2%) vs baseline: +6.3%


✅ valid_headers_basic

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

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


✅ wsgi_empty_headers

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

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


✅ wsgi_invalid_priority_header

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

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


✅ wsgi_invalid_span_id_header

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

Memory: ✅ 36.785MB (SLO: <38.000MB -3.2%) vs baseline: +6.1%


✅ wsgi_invalid_tags_header

Time: ✅ 5.926µs (SLO: <10.000µs 📉 -40.7%) vs baseline: -0.9%

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


✅ wsgi_invalid_trace_id_header

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

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


✅ wsgi_large_header_no_matches

Time: ✅ 28.417µs (SLO: <40.000µs 📉 -29.0%) vs baseline: +1.4%

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


✅ wsgi_large_valid_headers_all

Time: ✅ 29.545µs (SLO: <40.000µs 📉 -26.1%) vs baseline: +1.4%

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


✅ wsgi_medium_header_no_matches

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

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


✅ wsgi_medium_valid_headers_all

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

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


✅ wsgi_valid_headers_all

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

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


✅ wsgi_valid_headers_basic

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

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


httppropagationinject - 16/16

✅ ids_only

Time: ✅ 20.979µs (SLO: <30.000µs 📉 -30.1%) vs baseline: +4.7%

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


✅ with_all

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

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


✅ with_dd_origin

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

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


✅ with_priority_and_origin

Time: ✅ 23.605µs (SLO: <40.000µs 📉 -41.0%) vs baseline: +1.7%

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


✅ with_sampling_priority

Time: ✅ 20.249µs (SLO: <30.000µs 📉 -32.5%) vs baseline: +0.4%

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


✅ with_tags

Time: ✅ 25.125µs (SLO: <40.000µs 📉 -37.2%) vs baseline: +0.9%

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


✅ with_tags_invalid

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

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


✅ with_tags_max_size

Time: ✅ 25.666µs (SLO: <40.000µs 📉 -35.8%) vs baseline: +0.4%

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


otelsdkspan - 24/24

✅ add-event

Time: ✅ 40.587ms (SLO: <42.000ms -3.4%) vs baseline: ~same

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


✅ add-link

Time: ✅ 36.470ms (SLO: <38.550ms -5.4%) vs baseline: +0.4%

Memory: ✅ 39.243MB (SLO: <40.750MB -3.7%) vs baseline: +5.3%


✅ add-metrics

Time: ✅ 221.752ms (SLO: <232.000ms -4.4%) vs baseline: +0.7%

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


✅ add-tags

Time: ✅ 212.412ms (SLO: <221.600ms -4.1%) vs baseline: +1.2%

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


✅ get-context

Time: ✅ 29.010ms (SLO: <31.300ms -7.3%) vs baseline: -0.2%

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


✅ is-recording

Time: ✅ 29.070ms (SLO: <31.000ms -6.2%) vs baseline: -0.3%

Memory: ✅ 39.164MB (SLO: <40.750MB -3.9%) vs baseline: +5.0%


✅ record-exception

Time: ✅ 63.183ms (SLO: <65.850ms -4.1%) vs baseline: ~same

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


✅ set-status

Time: ✅ 31.846ms (SLO: <34.150ms -6.7%) vs baseline: +0.2%

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


✅ start

Time: ✅ 29.363ms (SLO: <30.150ms -2.6%) vs baseline: +1.9%

Memory: ✅ 39.164MB (SLO: <40.750MB -3.9%) vs baseline: +4.8%


✅ start-finish

Time: ✅ 33.911ms (SLO: <35.350ms -4.1%) vs baseline: -0.3%

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


✅ start-finish-telemetry

Time: ✅ 34.117ms (SLO: <35.450ms -3.8%) vs baseline: +1.0%

Memory: ✅ 39.164MB (SLO: <40.750MB -3.9%) vs baseline: +4.9%


✅ update-name

Time: ✅ 31.030ms (SLO: <33.400ms -7.1%) vs baseline: +0.5%

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


otelspan - 22/22

✅ add-event

Time: ✅ 38.285ms (SLO: <47.150ms 📉 -18.8%) vs baseline: +1.4%

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


✅ add-metrics

Time: ✅ 259.884ms (SLO: <344.800ms 📉 -24.6%) vs baseline: +0.7%

Memory: ✅ 45.874MB (SLO: <47.500MB -3.4%) vs baseline: +5.1%


✅ add-tags

Time: ✅ 307.385ms (SLO: <330.000ms -6.9%) vs baseline: +0.4%

Memory: ✅ 45.898MB (SLO: <47.500MB -3.4%) vs baseline: +5.2%


✅ get-context

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

Memory: ✅ 41.583MB (SLO: <46.500MB 📉 -10.6%) vs baseline: +5.1%


✅ is-recording

Time: ✅ 36.638ms (SLO: <44.500ms 📉 -17.7%) vs baseline: +1.1%

Memory: ✅ 41.427MB (SLO: <47.500MB 📉 -12.8%) vs baseline: +5.7%


✅ record-exception

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

Memory: ✅ 41.845MB (SLO: <47.000MB 📉 -11.0%) vs baseline: +5.2%


✅ set-status

Time: ✅ 43.106ms (SLO: <50.400ms 📉 -14.5%) vs baseline: +0.7%

Memory: ✅ 41.449MB (SLO: <47.000MB 📉 -11.8%) vs baseline: +5.7%


✅ start

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

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


✅ start-finish

Time: ✅ 84.982ms (SLO: <90.000ms -5.6%) vs baseline: ~same

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


✅ start-finish-telemetry

Time: ✅ 86.817ms (SLO: <91.000ms -4.6%) vs baseline: +0.6%

Memory: ✅ 38.869MB (SLO: <46.500MB 📉 -16.4%) vs baseline: +5.0%


✅ update-name

Time: ✅ 37.823ms (SLO: <45.150ms 📉 -16.2%) vs baseline: +1.4%

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


ratelimiter - 12/12

✅ defaults

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

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


✅ high_rate_limit

Time: ✅ 2.455µs (SLO: <10.000µs 📉 -75.4%) vs baseline: +1.4%

Memory: ✅ 36.687MB (SLO: <38.000MB -3.5%)


✅ long_window

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

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


✅ low_rate_limit

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

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


✅ no_rate_limit

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

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


✅ short_window

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

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


samplingrules - 8/8

✅ average_match

Time: ✅ 147.666µs (SLO: <290.000µs 📉 -49.1%) vs baseline: -0.3%

Memory: ✅ 36.294MB (SLO: <38.000MB -4.5%) vs baseline: +5.0%


✅ high_match

Time: ✅ 193.696µs (SLO: <480.000µs 📉 -59.6%) vs baseline: +0.1%

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


✅ low_match

Time: ✅ 99.496µs (SLO: <120.000µs 📉 -17.1%) vs baseline: ~same

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


✅ very_low_match

Time: ✅ 2.908ms (SLO: <8.500ms 📉 -65.8%) vs baseline: +1.0%

Memory: ✅ 78.845MB (SLO: <85.000MB -7.2%) vs baseline: +4.7%


sethttpmeta - 32/32

✅ all-disabled

Time: ✅ 9.863µs (SLO: <20.000µs 📉 -50.7%) vs baseline: +0.8%

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


✅ all-enabled

Time: ✅ 40.470µs (SLO: <50.000µs 📉 -19.1%) vs baseline: +2.0%

Memory: ✅ 37.336MB (SLO: <38.750MB -3.6%) vs baseline: +5.5%


✅ collectipvariant_exists

Time: ✅ 40.534µs (SLO: <50.000µs 📉 -18.9%) vs baseline: +1.1%

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


✅ no-collectipvariant

Time: ✅ 39.594µs (SLO: <50.000µs 📉 -20.8%) vs baseline: +0.7%

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


✅ no-useragentvariant

Time: ✅ 38.230µs (SLO: <50.000µs 📉 -23.5%) vs baseline: -0.3%

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


✅ obfuscation-no-query

Time: ✅ 39.897µs (SLO: <50.000µs 📉 -20.2%) vs baseline: -0.1%

Memory: ✅ 37.316MB (SLO: <38.750MB -3.7%) vs baseline: +5.1%


✅ obfuscation-regular-case-explicit-query

Time: ✅ 76.100µs (SLO: <90.000µs 📉 -15.4%) vs baseline: +0.4%

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


✅ obfuscation-regular-case-implicit-query

Time: ✅ 76.680µs (SLO: <90.000µs 📉 -14.8%) vs baseline: +0.2%

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


✅ obfuscation-send-querystring-disabled

Time: ✅ 154.705µs (SLO: <170.000µs -9.0%) vs baseline: +0.3%

Memory: ✅ 37.552MB (SLO: <38.750MB -3.1%) vs baseline: +4.9%


✅ obfuscation-worst-case-explicit-query

Time: ✅ 149.182µs (SLO: <160.000µs -6.8%) vs baseline: +0.5%

Memory: ✅ 37.591MB (SLO: <38.750MB -3.0%) vs baseline: +5.2%


✅ obfuscation-worst-case-implicit-query

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

Memory: ✅ 37.650MB (SLO: <38.750MB -2.8%) vs baseline: +5.3%


✅ useragentvariant_exists_1

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

Memory: ✅ 37.336MB (SLO: <38.750MB -3.6%) vs baseline: +5.2%


✅ useragentvariant_exists_2

Time: ✅ 39.940µs (SLO: <50.000µs 📉 -20.1%) vs baseline: +0.3%

Memory: ✅ 37.415MB (SLO: <38.750MB -3.4%) vs baseline: +5.8%


✅ useragentvariant_exists_3

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

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


✅ useragentvariant_not_exists_1

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

Memory: ✅ 37.395MB (SLO: <38.750MB -3.5%) vs baseline: +5.4%


✅ useragentvariant_not_exists_2

Time: ✅ 39.215µs (SLO: <50.000µs 📉 -21.6%) vs baseline: +0.1%

Memory: ✅ 37.139MB (SLO: <38.750MB -4.2%) vs baseline: +4.7%


span - 26/26

✅ add-event

Time: ✅ 17.541ms (SLO: <22.500ms 📉 -22.0%) vs baseline: +0.7%

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


✅ add-metrics

Time: ✅ 86.572ms (SLO: <93.500ms -7.4%) vs baseline: -0.3%

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


✅ add-tags

Time: ✅ 146.080ms (SLO: <155.000ms -5.8%) vs baseline: +1.2%

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


✅ get-context

Time: ✅ 16.737ms (SLO: <20.500ms 📉 -18.4%) vs baseline: +1.0%

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


✅ is-recording

Time: ✅ 16.956ms (SLO: <20.500ms 📉 -17.3%) vs baseline: +1.4%

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


✅ record-exception

Time: ✅ 36.028ms (SLO: <41.000ms 📉 -12.1%) vs baseline: +1.4%

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


✅ set-status

Time: ✅ 18.699ms (SLO: <22.000ms 📉 -15.0%) vs baseline: +1.7%

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


✅ start

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

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


✅ start-finish

Time: ✅ 53.626ms (SLO: <56.000ms -4.2%) vs baseline: -0.6%

Memory: ✅ 36.294MB (SLO: <38.000MB -4.5%) vs baseline: +5.1%


✅ start-finish-telemetry

Time: ✅ 54.968ms (SLO: <58.000ms -5.2%) vs baseline: ~same

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


✅ start-finish-traceid128

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

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


✅ start-traceid128

Time: ✅ 16.719ms (SLO: <22.500ms 📉 -25.7%) vs baseline: +1.4%

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


✅ update-name

Time: ✅ 17.267ms (SLO: <22.000ms 📉 -21.5%) vs baseline: +1.7%

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


telemetryaddmetric - 29/29

✅ 1-count-metric-1-times

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

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


✅ 1-count-metrics-100-times

Time: ✅ 149.902µs (SLO: <220.000µs 📉 -31.9%) vs baseline: -1.1%

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


✅ 1-distribution-metric-1-times

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

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


✅ 1-distribution-metrics-100-times

Time: ✅ 164.699µs (SLO: <230.000µs 📉 -28.4%) vs baseline: -1.0%

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


✅ 1-gauge-metric-1-times

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

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


✅ 1-gauge-metrics-100-times

Time: ✅ 135.154µs (SLO: <150.000µs -9.9%) vs baseline: -0.4%

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


✅ 1-rate-metric-1-times

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


✅ 1-rate-metrics-100-times

Time: ✅ 161.927µs (SLO: <250.000µs 📉 -35.2%) vs baseline: -0.9%

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


✅ 100-count-metrics-100-times

Time: ✅ 15.421ms (SLO: <22.000ms 📉 -29.9%) vs baseline: +1.4%

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


✅ 100-distribution-metrics-100-times

Time: ✅ 1.756ms (SLO: <2.550ms 📉 -31.1%) vs baseline: +0.5%

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


✅ 100-gauge-metrics-100-times

Time: ✅ 1.422ms (SLO: <1.550ms -8.3%) vs baseline: ~same

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


✅ 100-rate-metrics-100-times

Time: ✅ 1.720ms (SLO: <2.550ms 📉 -32.6%) vs baseline: +0.4%

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


✅ flush-1-metric

Time: ✅ 3.684µs (SLO: <20.000µs 📉 -81.6%) vs baseline: +3.7%

Memory: ✅ 36.785MB (SLO: <38.000MB -3.2%) vs baseline: +5.4%


✅ flush-100-metrics

Time: ✅ 182.460µs (SLO: <250.000µs 📉 -27.0%) vs baseline: +5.4%

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


✅ flush-1000-metrics

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

Memory: ✅ 37.434MB (SLO: <38.750MB -3.4%) vs baseline: +4.8%


tracer - 6/6

✅ large

Time: ✅ 31.293ms (SLO: <32.950ms -5.0%) vs baseline: ~same

Memory: ✅ 37.454MB (SLO: <39.250MB -4.6%) vs baseline: +4.9%


✅ medium

Time: ✅ 3.083ms (SLO: <3.200ms -3.7%) vs baseline: ~same

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


✅ small

Time: ✅ 359.598µs (SLO: <370.000µs -2.8%) vs baseline: +3.5%

Memory: ✅ 36.313MB (SLO: <38.750MB -6.3%) vs baseline: +5.1%

ℹ️ 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

The _set_attribute method stores string tags in span._meta, not
span.context._meta. The CI failure showed the KSR values were correct
but the assertion was reading from the wrong location.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@bm1549 bm1549 marked this pull request as ready for review March 24, 2026 01:43
@bm1549 bm1549 requested review from a team as code owners March 24, 2026 01:43
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: 4505c37328

ℹ️ 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: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Copy link
Copy Markdown
Collaborator

@emmettbutler emmettbutler left a comment

Choose a reason for hiding this comment

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

seems well-scoped and appropriate

@gh-worker-dd-mergequeue-cf854d gh-worker-dd-mergequeue-cf854d bot merged commit abcd55e into main Mar 25, 2026
1021 checks passed
@gh-worker-dd-mergequeue-cf854d gh-worker-dd-mergequeue-cf854d bot deleted the brian.marks/fix-ksr-scientific-notation branch March 25, 2026 17:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

AI Generated Largely based on code generated by an AI or LLM. This label is the same across all dd-trace-* repos

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants