-
Notifications
You must be signed in to change notification settings - Fork 470
fix(profiling): workaround for on-CPU Task race condition #15579
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
fix(profiling): workaround for on-CPU Task race condition #15579
Conversation
|
|
Bootstrap import analysisComparison of import times between this PR and base. SummaryThe average import time from this PR is: 249 ± 3 ms. The average import time from base is: 251 ± 2 ms. The import time difference between this PR and base is: -2.6 ± 0.1 ms. Import time breakdownThe following import paths have shrunk:
|
Performance SLOsComparing candidate kowalski/fix-profiling-workaround-for-on-cpu-task-race-condition (7b6ba4f) with baseline kowalski/fix-profiling-correctly-unwind-on-cpu-tasks (5edd9ff) 📈 Performance Regressions (3 suites)📈 iastaspects - 118/118✅ add_aspectTime: ✅ 0.382µs (SLO: <10.000µs 📉 -96.2%) vs baseline: -0.8% Memory: ✅ 38.461MB (SLO: <41.500MB -7.3%) vs baseline: +4.8% ✅ add_inplace_aspectTime: ✅ 0.381µs (SLO: <10.000µs 📉 -96.2%) vs baseline: -0.8% Memory: ✅ 38.594MB (SLO: <41.500MB -7.0%) vs baseline: +5.1% ✅ add_inplace_noaspectTime: ✅ 0.286µs (SLO: <10.000µs 📉 -97.1%) vs baseline: -0.7% Memory: ✅ 38.577MB (SLO: <41.500MB -7.0%) vs baseline: +4.9% ✅ add_noaspectTime: ✅ 0.356µs (SLO: <10.000µs 📉 -96.4%) vs baseline: -1.7% Memory: ✅ 38.552MB (SLO: <41.500MB -7.1%) vs baseline: +5.1% ✅ bytearray_aspectTime: ✅ 1.311µs (SLO: <10.000µs 📉 -86.9%) vs baseline: +0.3% Memory: ✅ 38.575MB (SLO: <41.500MB -7.0%) vs baseline: +5.0% ✅ bytearray_extend_aspectTime: ✅ 1.499µs (SLO: <10.000µs 📉 -85.0%) vs baseline: -0.4% Memory: ✅ 38.810MB (SLO: <41.500MB -6.5%) vs baseline: +5.9% ✅ bytearray_extend_noaspectTime: ✅ 0.618µs (SLO: <10.000µs 📉 -93.8%) vs baseline: ~same Memory: ✅ 38.546MB (SLO: <41.500MB -7.1%) vs baseline: +5.2% ✅ bytearray_noaspectTime: ✅ 0.487µs (SLO: <10.000µs 📉 -95.1%) vs baseline: -0.4% Memory: ✅ 38.838MB (SLO: <41.500MB -6.4%) vs baseline: +5.6% ✅ bytes_aspectTime: ✅ 1.280µs (SLO: <10.000µs 📉 -87.2%) vs baseline: +1.0% Memory: ✅ 38.432MB (SLO: <41.500MB -7.4%) vs baseline: +4.2% ✅ bytes_noaspectTime: ✅ 0.498µs (SLO: <10.000µs 📉 -95.0%) vs baseline: -0.5% Memory: ✅ 38.522MB (SLO: <41.500MB -7.2%) vs baseline: +4.3% ✅ bytesio_aspectTime: ✅ 1.304µs (SLO: <10.000µs 📉 -87.0%) vs baseline: +0.1% Memory: ✅ 38.605MB (SLO: <41.500MB -7.0%) vs baseline: +4.8% ✅ bytesio_noaspectTime: ✅ 0.512µs (SLO: <10.000µs 📉 -94.9%) vs baseline: +1.8% Memory: ✅ 38.708MB (SLO: <41.500MB -6.7%) vs baseline: +5.4% ✅ capitalize_aspectTime: ✅ 0.741µs (SLO: <10.000µs 📉 -92.6%) vs baseline: ~same Memory: ✅ 38.603MB (SLO: <41.500MB -7.0%) vs baseline: +4.6% ✅ capitalize_noaspectTime: ✅ 0.438µs (SLO: <10.000µs 📉 -95.6%) vs baseline: +1.3% Memory: ✅ 38.662MB (SLO: <41.500MB -6.8%) vs baseline: +4.8% ✅ casefold_aspectTime: ✅ 0.740µs (SLO: <10.000µs 📉 -92.6%) vs baseline: +1.1% Memory: ✅ 38.536MB (SLO: <41.500MB -7.1%) vs baseline: +4.7% ✅ casefold_noaspectTime: ✅ 0.368µs (SLO: <10.000µs 📉 -96.3%) vs baseline: -0.5% Memory: ✅ 38.617MB (SLO: <41.500MB -6.9%) vs baseline: +5.1% ✅ decode_aspectTime: ✅ 0.726µs (SLO: <10.000µs 📉 -92.7%) vs baseline: +0.2% Memory: ✅ 38.545MB (SLO: <41.500MB -7.1%) vs baseline: +4.9% ✅ decode_noaspectTime: ✅ 0.419µs (SLO: <10.000µs 📉 -95.8%) vs baseline: -0.1% Memory: ✅ 38.577MB (SLO: <41.500MB -7.0%) vs baseline: +4.4% ✅ encode_aspectTime: ✅ 0.716µs (SLO: <10.000µs 📉 -92.8%) vs baseline: +0.4% Memory: ✅ 38.623MB (SLO: <41.500MB -6.9%) vs baseline: +5.1% ✅ encode_noaspectTime: ✅ 0.409µs (SLO: <10.000µs 📉 -95.9%) vs baseline: +1.0% Memory: ✅ 38.523MB (SLO: <41.500MB -7.2%) vs baseline: +4.3% ✅ format_aspectTime: ✅ 3.461µs (SLO: <10.000µs 📉 -65.4%) vs baseline: +1.0% Memory: ✅ 38.671MB (SLO: <41.500MB -6.8%) vs baseline: +5.0% ✅ format_map_aspectTime: ✅ 3.734µs (SLO: <10.000µs 📉 -62.7%) vs baseline: +4.3% Memory: ✅ 38.669MB (SLO: <41.500MB -6.8%) vs baseline: +4.4% ✅ format_map_noaspectTime: ✅ 0.828µs (SLO: <10.000µs 📉 -91.7%) vs baseline: +0.9% Memory: ✅ 38.621MB (SLO: <41.500MB -6.9%) vs baseline: +5.1% ✅ format_noaspectTime: ✅ 0.594µs (SLO: <10.000µs 📉 -94.1%) vs baseline: -1.0% Memory: ✅ 38.661MB (SLO: <41.500MB -6.8%) vs baseline: +5.0% ✅ index_aspectTime: ✅ 0.354µs (SLO: <10.000µs 📉 -96.5%) vs baseline: +1.2% Memory: ✅ 38.463MB (SLO: <41.500MB -7.3%) vs baseline: +4.5% ✅ index_noaspectTime: ✅ 0.315µs (SLO: <10.000µs 📉 -96.8%) vs baseline: -1.2% Memory: ✅ 38.475MB (SLO: <41.500MB -7.3%) vs baseline: +4.4% ✅ join_aspectTime: ✅ 1.320µs (SLO: <10.000µs 📉 -86.8%) vs baseline: +0.5% Memory: ✅ 38.492MB (SLO: <41.500MB -7.2%) vs baseline: +4.6% ✅ join_noaspectTime: ✅ 0.535µs (SLO: <10.000µs 📉 -94.6%) vs baseline: -0.3% Memory: ✅ 38.717MB (SLO: <41.500MB -6.7%) vs baseline: +5.5% ✅ ljust_aspectTime: ✅ 2.519µs (SLO: <20.000µs 📉 -87.4%) vs baseline: +0.5% Memory: ✅ 38.378MB (SLO: <41.500MB -7.5%) vs baseline: +4.2% ✅ ljust_noaspectTime: ✅ 0.404µs (SLO: <10.000µs 📉 -96.0%) vs baseline: -1.3% Memory: ✅ 38.633MB (SLO: <41.500MB -6.9%) vs baseline: +5.1% ✅ lower_aspectTime: ✅ 2.265µs (SLO: <10.000µs 📉 -77.4%) vs baseline: +1.0% Memory: ✅ 38.535MB (SLO: <41.500MB -7.1%) vs baseline: +4.7% ✅ lower_noaspectTime: ✅ 0.375µs (SLO: <10.000µs 📉 -96.2%) vs baseline: +1.9% Memory: ✅ 38.546MB (SLO: <41.500MB -7.1%) vs baseline: +4.6% ✅ lstrip_aspectTime: ✅ 2.187µs (SLO: <20.000µs 📉 -89.1%) vs baseline: -0.5% Memory: ✅ 38.604MB (SLO: <41.500MB -7.0%) vs baseline: +4.7% ✅ lstrip_noaspectTime: ✅ 0.387µs (SLO: <10.000µs 📉 -96.1%) vs baseline: +0.2% Memory: ✅ 38.577MB (SLO: <41.500MB -7.0%) vs baseline: +4.7% ✅ modulo_aspectTime: ✅ 0.978µs (SLO: <10.000µs 📉 -90.2%) vs baseline: ~same Memory: ✅ 38.766MB (SLO: <41.500MB -6.6%) vs baseline: +5.3% ✅ modulo_aspect_for_bytearray_bytearrayTime: ✅ 1.519µs (SLO: <10.000µs 📉 -84.8%) vs baseline: +2.3% Memory: ✅ 38.424MB (SLO: <41.500MB -7.4%) vs baseline: +4.7% ✅ modulo_aspect_for_bytesTime: ✅ 0.959µs (SLO: <10.000µs 📉 -90.4%) vs baseline: +1.5% Memory: ✅ 38.693MB (SLO: <41.500MB -6.8%) vs baseline: +5.5% ✅ modulo_aspect_for_bytes_bytearrayTime: ✅ 1.173µs (SLO: <10.000µs 📉 -88.3%) vs baseline: -0.2% Memory: ✅ 38.409MB (SLO: <41.500MB -7.4%) vs baseline: +4.4% ✅ modulo_noaspectTime: ✅ 0.668µs (SLO: <10.000µs 📉 -93.3%) vs baseline: -1.0% Memory: ✅ 38.534MB (SLO: <41.500MB -7.1%) vs baseline: +5.1% ✅ replace_aspectTime: ✅ 5.721µs (SLO: <10.000µs 📉 -42.8%) vs baseline: 📈 +15.7% Memory: ✅ 38.617MB (SLO: <41.500MB -6.9%) vs baseline: +4.6% ✅ replace_noaspectTime: ✅ 0.466µs (SLO: <10.000µs 📉 -95.3%) vs baseline: +1.0% Memory: ✅ 38.690MB (SLO: <41.500MB -6.8%) vs baseline: +5.4% ✅ repr_aspectTime: ✅ 0.951µs (SLO: <10.000µs 📉 -90.5%) vs baseline: +0.1% Memory: ✅ 38.620MB (SLO: <41.500MB -6.9%) vs baseline: +5.0% ✅ repr_noaspectTime: ✅ 0.458µs (SLO: <10.000µs 📉 -95.4%) vs baseline: ~same Memory: ✅ 38.715MB (SLO: <41.500MB -6.7%) vs baseline: +5.6% ✅ rstrip_aspectTime: ✅ 1.947µs (SLO: <20.000µs 📉 -90.3%) vs baseline: +6.0% Memory: ✅ 38.594MB (SLO: <41.500MB -7.0%) vs baseline: +4.8% ✅ rstrip_noaspectTime: ✅ 0.385µs (SLO: <10.000µs 📉 -96.1%) vs baseline: +1.2% Memory: ✅ 38.596MB (SLO: <41.500MB -7.0%) vs baseline: +5.2% ✅ slice_aspectTime: ✅ 0.491µs (SLO: <10.000µs 📉 -95.1%) vs baseline: +0.6% Memory: ✅ 38.633MB (SLO: <41.500MB -6.9%) vs baseline: +5.2% ✅ slice_noaspectTime: ✅ 0.451µs (SLO: <10.000µs 📉 -95.5%) vs baseline: +1.0% Memory: ✅ 38.628MB (SLO: <41.500MB -6.9%) vs baseline: +5.2% ✅ stringio_aspectTime: ✅ 1.702µs (SLO: <10.000µs 📉 -83.0%) vs baseline: +1.3% Memory: ✅ 38.654MB (SLO: <41.500MB -6.9%) vs baseline: +5.2% ✅ stringio_noaspectTime: ✅ 0.929µs (SLO: <10.000µs 📉 -90.7%) vs baseline: +1.7% Memory: ✅ 38.539MB (SLO: <41.500MB -7.1%) vs baseline: +4.3% ✅ strip_aspectTime: ✅ 2.181µs (SLO: <20.000µs 📉 -89.1%) vs baseline: -1.2% Memory: ✅ 38.378MB (SLO: <41.500MB -7.5%) vs baseline: +4.3% ✅ strip_noaspectTime: ✅ 0.388µs (SLO: <10.000µs 📉 -96.1%) vs baseline: -0.5% Memory: ✅ 38.577MB (SLO: <41.500MB -7.0%) vs baseline: +4.9% ✅ swapcase_aspectTime: ✅ 2.430µs (SLO: <10.000µs 📉 -75.7%) vs baseline: +0.8% Memory: ✅ 38.560MB (SLO: <41.500MB -7.1%) vs baseline: +5.0% ✅ swapcase_noaspectTime: ✅ 0.542µs (SLO: <10.000µs 📉 -94.6%) vs baseline: +0.6% Memory: ✅ 38.538MB (SLO: <41.500MB -7.1%) vs baseline: +5.0% ✅ title_aspectTime: ✅ 2.368µs (SLO: <10.000µs 📉 -76.3%) vs baseline: ~same Memory: ✅ 38.496MB (SLO: <41.500MB -7.2%) vs baseline: +4.5% ✅ title_noaspectTime: ✅ 0.506µs (SLO: <10.000µs 📉 -94.9%) vs baseline: ~same Memory: ✅ 38.560MB (SLO: <41.500MB -7.1%) vs baseline: +5.0% ✅ translate_aspectTime: ✅ 3.274µs (SLO: <10.000µs 📉 -67.3%) vs baseline: +1.1% Memory: ✅ 38.656MB (SLO: <41.500MB -6.9%) vs baseline: +5.0% ✅ translate_noaspectTime: ✅ 1.043µs (SLO: <10.000µs 📉 -89.6%) vs baseline: ~same Memory: ✅ 38.707MB (SLO: <41.500MB -6.7%) vs baseline: +4.7% ✅ upper_aspectTime: ✅ 2.245µs (SLO: <10.000µs 📉 -77.6%) vs baseline: +0.2% Memory: ✅ 38.378MB (SLO: <41.500MB -7.5%) vs baseline: +3.9% ✅ upper_noaspectTime: ✅ 0.378µs (SLO: <10.000µs 📉 -96.2%) vs baseline: +2.1% Memory: ✅ 38.507MB (SLO: <41.500MB -7.2%) vs baseline: +4.9% 📈 iastaspectsospath - 24/24✅ ospathbasename_aspectTime: ✅ 5.035µs (SLO: <10.000µs 📉 -49.7%) vs baseline: 📈 +20.0% Memory: ✅ 38.594MB (SLO: <41.000MB -5.9%) vs baseline: +5.3% ✅ ospathbasename_noaspectTime: ✅ 1.077µs (SLO: <10.000µs 📉 -89.2%) vs baseline: -1.0% Memory: ✅ 38.555MB (SLO: <41.000MB -6.0%) vs baseline: +5.0% ✅ ospathjoin_aspectTime: ✅ 6.001µs (SLO: <10.000µs 📉 -40.0%) vs baseline: -0.2% Memory: ✅ 38.535MB (SLO: <41.000MB -6.0%) vs baseline: +5.1% ✅ ospathjoin_noaspectTime: ✅ 2.270µs (SLO: <10.000µs 📉 -77.3%) vs baseline: -0.7% Memory: ✅ 38.516MB (SLO: <41.000MB -6.1%) vs baseline: +4.8% ✅ ospathnormcase_aspectTime: ✅ 3.479µs (SLO: <10.000µs 📉 -65.2%) vs baseline: +1.6% Memory: ✅ 38.555MB (SLO: <41.000MB -6.0%) vs baseline: +4.8% ✅ ospathnormcase_noaspectTime: ✅ 0.574µs (SLO: <10.000µs 📉 -94.3%) vs baseline: +0.2% Memory: ✅ 38.594MB (SLO: <41.000MB -5.9%) vs baseline: +5.1% ✅ ospathsplit_aspectTime: ✅ 4.802µs (SLO: <10.000µs 📉 -52.0%) vs baseline: -0.5% Memory: ✅ 38.633MB (SLO: <41.000MB -5.8%) vs baseline: +5.0% ✅ ospathsplit_noaspectTime: ✅ 1.594µs (SLO: <10.000µs 📉 -84.1%) vs baseline: +0.9% Memory: ✅ 38.496MB (SLO: <41.000MB -6.1%) vs baseline: +4.8% ✅ ospathsplitdrive_aspectTime: ✅ 3.675µs (SLO: <10.000µs 📉 -63.2%) vs baseline: +0.7% Memory: ✅ 38.476MB (SLO: <41.000MB -6.2%) vs baseline: +4.7% ✅ ospathsplitdrive_noaspectTime: ✅ 0.695µs (SLO: <10.000µs 📉 -93.0%) vs baseline: -0.4% Memory: ✅ 38.476MB (SLO: <41.000MB -6.2%) vs baseline: +4.9% ✅ ospathsplitext_aspectTime: ✅ 4.537µs (SLO: <10.000µs 📉 -54.6%) vs baseline: +0.4% Memory: ✅ 38.516MB (SLO: <41.000MB -6.1%) vs baseline: +4.9% ✅ ospathsplitext_noaspectTime: ✅ 1.390µs (SLO: <10.000µs 📉 -86.1%) vs baseline: +0.4% Memory: ✅ 38.516MB (SLO: <41.000MB -6.1%) vs baseline: +4.8% 📈 telemetryaddmetric - 30/30✅ 1-count-metric-1-timesTime: ✅ 3.366µs (SLO: <20.000µs 📉 -83.2%) vs baseline: 📈 +17.6% Memory: ✅ 34.662MB (SLO: <35.500MB -2.4%) vs baseline: +4.4% ✅ 1-count-metrics-100-timesTime: ✅ 199.363µs (SLO: <220.000µs -9.4%) vs baseline: -0.7% Memory: ✅ 34.780MB (SLO: <35.500MB -2.0%) vs baseline: +5.0% ✅ 1-distribution-metric-1-timesTime: ✅ 3.199µs (SLO: <20.000µs 📉 -84.0%) vs baseline: ~same Memory: ✅ 34.642MB (SLO: <35.500MB -2.4%) vs baseline: +4.6% ✅ 1-distribution-metrics-100-timesTime: ✅ 213.610µs (SLO: <230.000µs -7.1%) vs baseline: ~same Memory: ✅ 34.760MB (SLO: <35.500MB -2.1%) vs baseline: +4.9% ✅ 1-gauge-metric-1-timesTime: ✅ 2.189µs (SLO: <20.000µs 📉 -89.1%) vs baseline: ~same Memory: ✅ 34.721MB (SLO: <35.500MB -2.2%) vs baseline: +4.7% ✅ 1-gauge-metrics-100-timesTime: ✅ 138.427µs (SLO: <150.000µs -7.7%) vs baseline: -0.4% Memory: ✅ 34.819MB (SLO: <35.500MB 🟡 -1.9%) vs baseline: +5.3% ✅ 1-rate-metric-1-timesTime: ✅ 3.013µs (SLO: <20.000µs 📉 -84.9%) vs baseline: -0.2% Memory: ✅ 34.701MB (SLO: <35.500MB -2.2%) vs baseline: +4.9% ✅ 1-rate-metrics-100-timesTime: ✅ 213.597µs (SLO: <250.000µs 📉 -14.6%) vs baseline: -0.1% Memory: ✅ 34.701MB (SLO: <35.500MB -2.2%) vs baseline: +4.7% ✅ 100-count-metrics-100-timesTime: ✅ 20.224ms (SLO: <22.000ms -8.1%) vs baseline: -0.2% Memory: ✅ 34.780MB (SLO: <35.500MB -2.0%) vs baseline: +5.3% ✅ 100-distribution-metrics-100-timesTime: ✅ 2.235ms (SLO: <2.550ms 📉 -12.4%) vs baseline: +0.2% Memory: ✅ 34.721MB (SLO: <35.500MB -2.2%) vs baseline: +4.7% ✅ 100-gauge-metrics-100-timesTime: ✅ 1.426ms (SLO: <1.550ms -8.0%) vs baseline: +0.6% Memory: ✅ 34.721MB (SLO: <35.500MB -2.2%) vs baseline: +4.7% ✅ 100-rate-metrics-100-timesTime: ✅ 2.197ms (SLO: <2.550ms 📉 -13.8%) vs baseline: ~same Memory: ✅ 34.800MB (SLO: <35.500MB 🟡 -2.0%) vs baseline: +4.9% ✅ flush-1-metricTime: ✅ 4.508µs (SLO: <20.000µs 📉 -77.5%) vs baseline: +0.5% Memory: ✅ 35.114MB (SLO: <35.500MB 🟡 -1.1%) vs baseline: +5.1% ✅ flush-100-metricsTime: ✅ 173.321µs (SLO: <250.000µs 📉 -30.7%) vs baseline: -0.5% Memory: ✅ 35.095MB (SLO: <35.500MB 🟡 -1.1%) vs baseline: +4.7% ✅ flush-1000-metricsTime: ✅ 2.171ms (SLO: <2.500ms 📉 -13.1%) vs baseline: -0.4% Memory: ✅ 35.940MB (SLO: <36.500MB 🟡 -1.5%) vs baseline: +5.0% 🟡 Near SLO Breach (15 suites)🟡 djangosimple - 30/30✅ appsecTime: ✅ 19.505ms (SLO: <22.300ms 📉 -12.5%) vs baseline: -0.1% Memory: ✅ 68.184MB (SLO: <70.500MB -3.3%) vs baseline: +4.8% ✅ exception-replay-enabledTime: ✅ 1.366ms (SLO: <1.450ms -5.8%) vs baseline: +0.5% Memory: ✅ 66.325MB (SLO: <67.500MB 🟡 -1.7%) vs baseline: +5.0% ✅ iastTime: ✅ 19.558ms (SLO: <22.250ms 📉 -12.1%) vs baseline: -0.3% Memory: ✅ 68.341MB (SLO: <70.000MB -2.4%) vs baseline: +5.0% ✅ profilerTime: ✅ 15.485ms (SLO: <16.550ms -6.4%) vs baseline: +0.7% Memory: ✅ 56.418MB (SLO: <57.500MB 🟡 -1.9%) vs baseline: +4.8% ✅ resource-renamingTime: ✅ 19.495ms (SLO: <21.750ms 📉 -10.4%) vs baseline: -0.5% Memory: ✅ 68.243MB (SLO: <70.500MB -3.2%) vs baseline: +5.0% ✅ span-code-originTime: ✅ 20.044ms (SLO: <28.200ms 📉 -28.9%) vs baseline: +1.2% Memory: ✅ 68.188MB (SLO: <71.000MB -4.0%) vs baseline: +5.0% ✅ tracerTime: ✅ 19.551ms (SLO: <21.750ms 📉 -10.1%) vs baseline: ~same Memory: ✅ 68.184MB (SLO: <70.000MB -2.6%) vs baseline: +4.8% ✅ tracer-and-profilerTime: ✅ 21.758ms (SLO: <23.500ms -7.4%) vs baseline: -0.2% Memory: ✅ 69.304MB (SLO: <71.000MB -2.4%) vs baseline: +4.9% ✅ tracer-dont-create-db-spansTime: ✅ 19.599ms (SLO: <21.500ms -8.8%) vs baseline: -0.3% Memory: ✅ 68.203MB (SLO: <70.000MB -2.6%) vs baseline: +4.8% ✅ tracer-minimalTime: ✅ 16.710ms (SLO: <17.500ms -4.5%) vs baseline: -0.3% Memory: ✅ 67.928MB (SLO: <70.000MB -3.0%) vs baseline: +5.1% ✅ tracer-nativeTime: ✅ 19.476ms (SLO: <21.750ms 📉 -10.5%) vs baseline: +0.3% Memory: ✅ 68.184MB (SLO: <72.500MB -6.0%) vs baseline: +4.7% ✅ tracer-no-cachesTime: ✅ 17.595ms (SLO: <19.650ms 📉 -10.5%) vs baseline: +0.2% Memory: ✅ 67.908MB (SLO: <70.000MB -3.0%) vs baseline: +4.6% ✅ tracer-no-databasesTime: ✅ 19.144ms (SLO: <20.100ms -4.8%) vs baseline: ~same Memory: ✅ 67.830MB (SLO: <70.000MB -3.1%) vs baseline: +4.9% ✅ tracer-no-middlewareTime: ✅ 19.231ms (SLO: <21.500ms 📉 -10.6%) vs baseline: ~same Memory: ✅ 68.026MB (SLO: <70.000MB -2.8%) vs baseline: +4.8% ✅ tracer-no-templatesTime: ✅ 19.747ms (SLO: <22.000ms 📉 -10.2%) vs baseline: +1.6% Memory: ✅ 68.143MB (SLO: <70.500MB -3.3%) vs baseline: +4.7% 🟡 errortrackingdjangosimple - 6/6✅ errortracking-enabled-allTime: ✅ 16.297ms (SLO: <19.850ms 📉 -17.9%) vs baseline: ~same Memory: ✅ 69.750MB (SLO: <70.000MB 🟡 -0.4%) vs baseline: +4.8% ✅ errortracking-enabled-userTime: ✅ 16.287ms (SLO: <19.400ms 📉 -16.0%) vs baseline: -0.2% Memory: ✅ 69.835MB (SLO: <70.000MB 🟡 -0.2%) vs baseline: +4.8% ✅ tracer-enabledTime: ✅ 16.385ms (SLO: <19.450ms 📉 -15.8%) vs baseline: +0.2% Memory: ✅ 69.796MB (SLO: <70.000MB 🟡 -0.3%) vs baseline: +4.9% 🟡 errortrackingflasksqli - 6/6✅ errortracking-enabled-allTime: ✅ 2.069ms (SLO: <2.300ms 📉 -10.0%) vs baseline: ~same Memory: ✅ 55.738MB (SLO: <56.500MB 🟡 -1.3%) vs baseline: +4.9% ✅ errortracking-enabled-userTime: ✅ 2.075ms (SLO: <2.250ms -7.8%) vs baseline: ~same Memory: ✅ 55.758MB (SLO: <56.500MB 🟡 -1.3%) vs baseline: +4.8% ✅ tracer-enabledTime: ✅ 2.064ms (SLO: <2.300ms 📉 -10.3%) vs baseline: ~same Memory: ✅ 55.640MB (SLO: <56.500MB 🟡 -1.5%) vs baseline: +4.6% 🟡 flasksimple - 18/18✅ appsec-getTime: ✅ 3.364ms (SLO: <4.750ms 📉 -29.2%) vs baseline: -0.4% Memory: ✅ 55.487MB (SLO: <66.500MB 📉 -16.6%) vs baseline: +4.8% ✅ appsec-postTime: ✅ 2.856ms (SLO: <6.750ms 📉 -57.7%) vs baseline: -0.2% Memory: ✅ 55.583MB (SLO: <66.500MB 📉 -16.4%) vs baseline: +4.6% ✅ appsec-telemetryTime: ✅ 3.386ms (SLO: <4.750ms 📉 -28.7%) vs baseline: +0.4% Memory: ✅ 55.473MB (SLO: <66.500MB 📉 -16.6%) vs baseline: +4.8% ✅ debuggerTime: ✅ 1.871ms (SLO: <2.000ms -6.5%) vs baseline: ~same Memory: ✅ 47.937MB (SLO: <49.500MB -3.2%) vs baseline: +4.9% ✅ iast-getTime: ✅ 1.853ms (SLO: <2.000ms -7.3%) vs baseline: ~same Memory: ✅ 44.595MB (SLO: <49.000MB -9.0%) vs baseline: +5.0% ✅ profilerTime: ✅ 1.905ms (SLO: <2.100ms -9.3%) vs baseline: -0.3% Memory: ✅ 48.801MB (SLO: <50.000MB -2.4%) vs baseline: +4.9% ✅ resource-renamingTime: ✅ 3.347ms (SLO: <3.650ms -8.3%) vs baseline: -0.2% Memory: ✅ 55.512MB (SLO: <56.000MB 🟡 -0.9%) vs baseline: +4.9% ✅ tracerTime: ✅ 3.363ms (SLO: <3.650ms -7.9%) vs baseline: -0.3% Memory: ✅ 55.487MB (SLO: <56.500MB 🟡 -1.8%) vs baseline: +4.8% ✅ tracer-nativeTime: ✅ 3.368ms (SLO: <3.650ms -7.7%) vs baseline: ~same Memory: ✅ 55.508MB (SLO: <60.000MB -7.5%) vs baseline: +5.0% 🟡 flasksqli - 6/6✅ appsec-enabledTime: ✅ 2.061ms (SLO: <4.200ms 📉 -50.9%) vs baseline: -0.3% Memory: ✅ 55.778MB (SLO: <66.000MB 📉 -15.5%) vs baseline: +4.9% ✅ iast-enabledTime: ✅ 2.071ms (SLO: <2.800ms 📉 -26.0%) vs baseline: +0.1% Memory: ✅ 55.778MB (SLO: <62.500MB 📉 -10.8%) vs baseline: +4.9% ✅ tracer-enabledTime: ✅ 2.059ms (SLO: <2.250ms -8.5%) vs baseline: +0.4% Memory: ✅ 55.778MB (SLO: <56.500MB 🟡 -1.3%) vs baseline: +4.8% 🟡 httppropagationextract - 60/60✅ all_styles_all_headersTime: ✅ 81.147µs (SLO: <100.000µs 📉 -18.9%) vs baseline: ~same Memory: ✅ 34.760MB (SLO: <35.500MB -2.1%) vs baseline: +4.4% ✅ b3_headersTime: ✅ 14.248µs (SLO: <20.000µs 📉 -28.8%) vs baseline: -0.2% Memory: ✅ 34.780MB (SLO: <35.500MB -2.0%) vs baseline: +4.6% ✅ b3_single_headersTime: ✅ 13.252µs (SLO: <20.000µs 📉 -33.7%) vs baseline: -1.1% Memory: ✅ 34.819MB (SLO: <35.500MB 🟡 -1.9%) vs baseline: +4.6% ✅ datadog_tracecontext_tracestate_not_propagated_on_trace_id_no_matchTime: ✅ 63.756µs (SLO: <80.000µs 📉 -20.3%) vs baseline: -0.2% Memory: ✅ 34.859MB (SLO: <35.500MB 🟡 -1.8%) vs baseline: +4.9% ✅ datadog_tracecontext_tracestate_propagated_on_trace_id_matchTime: ✅ 69.333µs (SLO: <80.000µs 📉 -13.3%) vs baseline: +4.9% Memory: ✅ 34.800MB (SLO: <35.500MB 🟡 -2.0%) vs baseline: +4.9% ✅ empty_headersTime: ✅ 1.620µs (SLO: <10.000µs 📉 -83.8%) vs baseline: -0.4% Memory: ✅ 34.878MB (SLO: <35.500MB 🟡 -1.8%) vs baseline: +5.0% ✅ full_t_id_datadog_headersTime: ✅ 22.312µs (SLO: <30.000µs 📉 -25.6%) vs baseline: -0.5% Memory: ✅ 34.741MB (SLO: <35.500MB -2.1%) vs baseline: +4.6% ✅ invalid_priority_headerTime: ✅ 6.571µs (SLO: <10.000µs 📉 -34.3%) vs baseline: +0.6% Memory: ✅ 34.800MB (SLO: <35.500MB 🟡 -2.0%) vs baseline: +4.6% ✅ invalid_span_id_headerTime: ✅ 6.596µs (SLO: <10.000µs 📉 -34.0%) vs baseline: +1.0% Memory: ✅ 34.878MB (SLO: <35.500MB 🟡 -1.8%) vs baseline: +4.7% ✅ invalid_tags_headerTime: ✅ 6.532µs (SLO: <10.000µs 📉 -34.7%) vs baseline: +0.3% Memory: ✅ 34.839MB (SLO: <35.500MB 🟡 -1.9%) vs baseline: +4.9% ✅ invalid_trace_id_headerTime: ✅ 6.510µs (SLO: <10.000µs 📉 -34.9%) vs baseline: -0.2% Memory: ✅ 34.918MB (SLO: <35.500MB 🟡 -1.6%) vs baseline: +5.2% ✅ large_header_no_matchesTime: ✅ 27.696µs (SLO: <30.000µs -7.7%) vs baseline: ~same Memory: ✅ 34.839MB (SLO: <35.500MB 🟡 -1.9%) vs baseline: +4.9% ✅ large_valid_headers_allTime: ✅ 28.832µs (SLO: <40.000µs 📉 -27.9%) vs baseline: +0.4% Memory: ✅ 34.819MB (SLO: <35.500MB 🟡 -1.9%) vs baseline: +4.8% ✅ medium_header_no_matchesTime: ✅ 9.941µs (SLO: <20.000µs 📉 -50.3%) vs baseline: +0.9% Memory: ✅ 34.878MB (SLO: <35.500MB 🟡 -1.8%) vs baseline: +4.9% ✅ medium_valid_headers_allTime: ✅ 11.312µs (SLO: <20.000µs 📉 -43.4%) vs baseline: +0.5% Memory: ✅ 34.937MB (SLO: <35.500MB 🟡 -1.6%) vs baseline: +5.5% ✅ none_propagation_styleTime: ✅ 1.725µs (SLO: <10.000µs 📉 -82.7%) vs baseline: +0.6% Memory: ✅ 34.800MB (SLO: <35.500MB 🟡 -2.0%) vs baseline: +4.5% ✅ tracecontext_headersTime: ✅ 34.886µs (SLO: <40.000µs 📉 -12.8%) vs baseline: ~same Memory: ✅ 34.859MB (SLO: <35.500MB 🟡 -1.8%) vs baseline: +4.7% ✅ valid_headers_allTime: ✅ 6.566µs (SLO: <10.000µs 📉 -34.3%) vs baseline: ~same Memory: ✅ 34.859MB (SLO: <35.500MB 🟡 -1.8%) vs baseline: +4.7% ✅ valid_headers_basicTime: ✅ 6.113µs (SLO: <10.000µs 📉 -38.9%) vs baseline: +0.8% Memory: ✅ 34.937MB (SLO: <35.500MB 🟡 -1.6%) vs baseline: +4.9% ✅ wsgi_empty_headersTime: ✅ 1.625µs (SLO: <10.000µs 📉 -83.8%) vs baseline: +0.4% Memory: ✅ 34.918MB (SLO: <35.500MB 🟡 -1.6%) vs baseline: +4.9% ✅ wsgi_invalid_priority_headerTime: ✅ 6.575µs (SLO: <10.000µs 📉 -34.2%) vs baseline: -0.3% Memory: ✅ 34.819MB (SLO: <35.500MB 🟡 -1.9%) vs baseline: +4.4% ✅ wsgi_invalid_span_id_headerTime: ✅ 1.624µs (SLO: <10.000µs 📉 -83.8%) vs baseline: +1.4% Memory: ✅ 34.839MB (SLO: <35.500MB 🟡 -1.9%) vs baseline: +4.4% ✅ wsgi_invalid_tags_headerTime: ✅ 6.565µs (SLO: <10.000µs 📉 -34.4%) vs baseline: -0.4% Memory: ✅ 34.839MB (SLO: <35.500MB 🟡 -1.9%) vs baseline: +4.9% ✅ wsgi_invalid_trace_id_headerTime: ✅ 6.558µs (SLO: <10.000µs 📉 -34.4%) vs baseline: +0.2% Memory: ✅ 34.839MB (SLO: <35.500MB 🟡 -1.9%) vs baseline: +4.6% ✅ wsgi_large_header_no_matchesTime: ✅ 28.735µs (SLO: <40.000µs 📉 -28.2%) vs baseline: -0.3% Memory: ✅ 34.839MB (SLO: <35.500MB 🟡 -1.9%) vs baseline: +4.6% ✅ wsgi_large_valid_headers_allTime: ✅ 30.009µs (SLO: <40.000µs 📉 -25.0%) vs baseline: +0.6% Memory: ✅ 34.800MB (SLO: <35.500MB 🟡 -2.0%) vs baseline: +4.4% ✅ wsgi_medium_header_no_matchesTime: ✅ 10.134µs (SLO: <20.000µs 📉 -49.3%) vs baseline: ~same Memory: ✅ 34.819MB (SLO: <35.500MB 🟡 -1.9%) vs baseline: +4.5% ✅ wsgi_medium_valid_headers_allTime: ✅ 11.553µs (SLO: <20.000µs 📉 -42.2%) vs baseline: ~same Memory: ✅ 34.918MB (SLO: <35.500MB 🟡 -1.6%) vs baseline: +4.9% ✅ wsgi_valid_headers_allTime: ✅ 6.601µs (SLO: <10.000µs 📉 -34.0%) vs baseline: +0.6% Memory: ✅ 34.721MB (SLO: <35.500MB -2.2%) vs baseline: +4.4% ✅ wsgi_valid_headers_basicTime: ✅ 6.136µs (SLO: <10.000µs 📉 -38.6%) vs baseline: +0.3% Memory: ✅ 34.780MB (SLO: <35.500MB -2.0%) vs baseline: +4.9% 🟡 httppropagationinject - 16/16✅ ids_onlyTime: ✅ 21.944µs (SLO: <30.000µs 📉 -26.9%) vs baseline: +5.0% Memory: ✅ 34.780MB (SLO: <35.500MB -2.0%) vs baseline: +4.7% ✅ with_allTime: ✅ 27.902µs (SLO: <40.000µs 📉 -30.2%) vs baseline: +1.0% Memory: ✅ 34.800MB (SLO: <35.500MB 🟡 -2.0%) vs baseline: +4.7% ✅ with_dd_originTime: ✅ 24.692µs (SLO: <30.000µs 📉 -17.7%) vs baseline: +0.5% Memory: ✅ 34.859MB (SLO: <35.500MB 🟡 -1.8%) vs baseline: +4.6% ✅ with_priority_and_originTime: ✅ 24.093µs (SLO: <40.000µs 📉 -39.8%) vs baseline: +0.3% Memory: ✅ 34.839MB (SLO: <35.500MB 🟡 -1.9%) vs baseline: +4.8% ✅ with_sampling_priorityTime: ✅ 20.802µs (SLO: <30.000µs 📉 -30.7%) vs baseline: +0.5% Memory: ✅ 34.918MB (SLO: <35.500MB 🟡 -1.6%) vs baseline: +5.1% ✅ with_tagsTime: ✅ 25.938µs (SLO: <40.000µs 📉 -35.2%) vs baseline: +0.3% Memory: ✅ 34.859MB (SLO: <35.500MB 🟡 -1.8%) vs baseline: +5.3% ✅ with_tags_invalidTime: ✅ 27.222µs (SLO: <40.000µs 📉 -31.9%) vs baseline: -0.3% Memory: ✅ 34.878MB (SLO: <35.500MB 🟡 -1.8%) vs baseline: +5.2% ✅ with_tags_max_sizeTime: ✅ 26.226µs (SLO: <40.000µs 📉 -34.4%) vs baseline: ~same Memory: ✅ 34.918MB (SLO: <35.500MB 🟡 -1.6%) vs baseline: +5.2% 🟡 otelspan - 22/22✅ add-eventTime: ✅ 40.333ms (SLO: <47.150ms 📉 -14.5%) vs baseline: +0.2% Memory: ✅ 39.509MB (SLO: <47.000MB 📉 -15.9%) vs baseline: +5.0% ✅ add-metricsTime: ✅ 261.913ms (SLO: <344.800ms 📉 -24.0%) vs baseline: +0.4% Memory: ✅ 43.862MB (SLO: <47.500MB -7.7%) vs baseline: +4.9% ✅ add-tagsTime: ✅ 316.424ms (SLO: <321.000ms 🟡 -1.4%) vs baseline: -1.1% Memory: ✅ 43.836MB (SLO: <47.500MB -7.7%) vs baseline: +5.3% ✅ get-contextTime: ✅ 80.602ms (SLO: <92.350ms 📉 -12.7%) vs baseline: -0.5% Memory: ✅ 39.844MB (SLO: <46.500MB 📉 -14.3%) vs baseline: +4.7% ✅ is-recordingTime: ✅ 37.867ms (SLO: <44.500ms 📉 -14.9%) vs baseline: -0.5% Memory: ✅ 39.664MB (SLO: <47.500MB 📉 -16.5%) vs baseline: +5.2% ✅ record-exceptionTime: ✅ 58.879ms (SLO: <67.650ms 📉 -13.0%) vs baseline: -0.2% Memory: ✅ 39.995MB (SLO: <47.000MB 📉 -14.9%) vs baseline: +5.2% ✅ set-statusTime: ✅ 44.429ms (SLO: <50.400ms 📉 -11.8%) vs baseline: +0.5% Memory: ✅ 39.284MB (SLO: <47.000MB 📉 -16.4%) vs baseline: +4.4% ✅ startTime: ✅ 38.014ms (SLO: <43.450ms 📉 -12.5%) vs baseline: +2.1% Memory: ✅ 39.405MB (SLO: <47.000MB 📉 -16.2%) vs baseline: +4.7% ✅ start-finishTime: ✅ 82.837ms (SLO: <88.000ms -5.9%) vs baseline: +0.1% Memory: ✅ 37.316MB (SLO: <46.500MB 📉 -19.8%) vs baseline: +4.9% ✅ start-finish-telemetryTime: ✅ 84.129ms (SLO: <89.000ms -5.5%) vs baseline: ~same Memory: ✅ 37.356MB (SLO: <46.500MB 📉 -19.7%) vs baseline: +4.8% ✅ update-nameTime: ✅ 38.946ms (SLO: <45.150ms 📉 -13.7%) vs baseline: +0.2% Memory: ✅ 39.598MB (SLO: <47.000MB 📉 -15.7%) vs baseline: +4.6% 🟡 packagespackageforrootmodulemapping - 4/4✅ cache_offTime: ✅ 344.592ms (SLO: <354.300ms -2.7%) vs baseline: -0.8% Memory: ✅ 41.422MB (SLO: <41.500MB 🟡 -0.2%) vs baseline: +6.3% ✅ cache_onTime: ✅ 0.380µs (SLO: <10.000µs 📉 -96.2%) vs baseline: ~same Memory: ✅ 40.051MB (SLO: <41.000MB -2.3%) vs baseline: +5.7% 🟡 ratelimiter - 12/12✅ defaultsTime: ✅ 2.357µs (SLO: <10.000µs 📉 -76.4%) vs baseline: -0.3% Memory: ✅ 35.193MB (SLO: <35.500MB 🟡 -0.9%) vs baseline: +4.9% ✅ high_rate_limitTime: ✅ 2.419µs (SLO: <10.000µs 📉 -75.8%) vs baseline: -0.3% Memory: ✅ 35.075MB (SLO: <35.500MB 🟡 -1.2%) vs baseline: +4.7% ✅ long_windowTime: ✅ 2.362µs (SLO: <10.000µs 📉 -76.4%) vs baseline: -1.0% Memory: ✅ 35.075MB (SLO: <35.500MB 🟡 -1.2%) vs baseline: +4.6% ✅ low_rate_limitTime: ✅ 2.354µs (SLO: <10.000µs 📉 -76.5%) vs baseline: -0.5% Memory: ✅ 35.095MB (SLO: <35.500MB 🟡 -1.1%) vs baseline: +4.7% ✅ no_rate_limitTime: ✅ 0.828µs (SLO: <10.000µs 📉 -91.7%) vs baseline: -0.3% Memory: ✅ 35.173MB (SLO: <35.500MB 🟡 -0.9%) vs baseline: +5.0% ✅ short_windowTime: ✅ 2.496µs (SLO: <10.000µs 📉 -75.0%) vs baseline: -0.3% Memory: ✅ 35.193MB (SLO: <35.500MB 🟡 -0.9%) vs baseline: +5.0% 🟡 recursivecomputation - 8/8✅ deepTime: ✅ 308.680ms (SLO: <320.950ms -3.8%) vs baseline: ~same Memory: ✅ 35.901MB (SLO: <36.500MB 🟡 -1.6%) vs baseline: +5.1% ✅ deep-profiledTime: ✅ 328.937ms (SLO: <359.150ms -8.4%) vs baseline: +0.4% Memory: ✅ 39.774MB (SLO: <40.500MB 🟡 -1.8%) vs baseline: +4.9% ✅ mediumTime: ✅ 7.005ms (SLO: <7.400ms -5.3%) vs baseline: +0.1% Memory: ✅ 34.741MB (SLO: <35.500MB -2.1%) vs baseline: +4.9% ✅ shallowTime: ✅ 0.947ms (SLO: <1.050ms -9.8%) vs baseline: +1.0% Memory: ✅ 34.741MB (SLO: <35.500MB -2.1%) vs baseline: +4.6% 🟡 samplingrules - 8/8✅ average_matchTime: ✅ 136.400µs (SLO: <290.000µs 📉 -53.0%) vs baseline: -0.8% Memory: ✅ 34.839MB (SLO: <35.500MB 🟡 -1.9%) vs baseline: +5.2% ✅ high_matchTime: ✅ 174.063µs (SLO: <480.000µs 📉 -63.7%) vs baseline: +1.4% Memory: ✅ 34.839MB (SLO: <35.500MB 🟡 -1.9%) vs baseline: +5.2% ✅ low_matchTime: ✅ 99.364µs (SLO: <120.000µs 📉 -17.2%) vs baseline: +1.1% Memory: ✅ 603.625MB (SLO: <700.000MB 📉 -13.8%) vs baseline: +4.9% ✅ very_low_matchTime: ✅ 2.660ms (SLO: <8.500ms 📉 -68.7%) vs baseline: -0.2% Memory: ✅ 71.059MB (SLO: <75.000MB -5.3%) vs baseline: +5.0% 🟡 sethttpmeta - 32/32✅ all-disabledTime: ✅ 10.584µs (SLO: <20.000µs 📉 -47.1%) vs baseline: +0.9% Memory: ✅ 35.429MB (SLO: <36.000MB 🟡 -1.6%) vs baseline: +4.1% ✅ all-enabledTime: ✅ 41.003µs (SLO: <50.000µs 📉 -18.0%) vs baseline: +2.1% Memory: ✅ 35.330MB (SLO: <36.000MB 🟡 -1.9%) vs baseline: +4.5% ✅ collectipvariant_existsTime: ✅ 40.998µs (SLO: <50.000µs 📉 -18.0%) vs baseline: +0.5% Memory: ✅ 35.350MB (SLO: <36.000MB 🟡 -1.8%) vs baseline: +4.0% ✅ no-collectipvariantTime: ✅ 40.137µs (SLO: <50.000µs 📉 -19.7%) vs baseline: +0.4% Memory: ✅ 35.429MB (SLO: <36.000MB 🟡 -1.6%) vs baseline: +4.9% ✅ no-useragentvariantTime: ✅ 38.730µs (SLO: <50.000µs 📉 -22.5%) vs baseline: -0.4% Memory: ✅ 35.291MB (SLO: <36.000MB 🟡 -2.0%) vs baseline: +3.8% ✅ obfuscation-no-queryTime: ✅ 40.783µs (SLO: <50.000µs 📉 -18.4%) vs baseline: +0.3% Memory: ✅ 35.311MB (SLO: <36.000MB 🟡 -1.9%) vs baseline: +4.6% ✅ obfuscation-regular-case-explicit-queryTime: ✅ 75.944µs (SLO: <90.000µs 📉 -15.6%) vs baseline: ~same Memory: ✅ 35.606MB (SLO: <36.500MB -2.5%) vs baseline: +4.8% ✅ obfuscation-regular-case-implicit-queryTime: ✅ 76.638µs (SLO: <90.000µs 📉 -14.8%) vs baseline: +0.1% Memory: ✅ 35.625MB (SLO: <36.500MB -2.4%) vs baseline: +5.0% ✅ obfuscation-send-querystring-disabledTime: ✅ 154.527µs (SLO: <170.000µs -9.1%) vs baseline: +0.1% Memory: ✅ 35.625MB (SLO: <36.500MB -2.4%) vs baseline: +4.6% ✅ obfuscation-worst-case-explicit-queryTime: ✅ 148.763µs (SLO: <160.000µs -7.0%) vs baseline: ~same Memory: ✅ 35.586MB (SLO: <36.500MB -2.5%) vs baseline: +4.7% ✅ obfuscation-worst-case-implicit-queryTime: ✅ 155.159µs (SLO: <170.000µs -8.7%) vs baseline: +0.2% Memory: ✅ 35.783MB (SLO: <36.500MB 🟡 -2.0%) vs baseline: +5.1% ✅ useragentvariant_exists_1Time: ✅ 39.835µs (SLO: <50.000µs 📉 -20.3%) vs baseline: +0.6% Memory: ✅ 35.370MB (SLO: <36.000MB 🟡 -1.8%) vs baseline: +5.0% ✅ useragentvariant_exists_2Time: ✅ 41.079µs (SLO: <50.000µs 📉 -17.8%) vs baseline: +1.0% Memory: ✅ 35.370MB (SLO: <36.000MB 🟡 -1.8%) vs baseline: +4.9% ✅ useragentvariant_exists_3Time: ✅ 40.098µs (SLO: <50.000µs 📉 -19.8%) vs baseline: ~same Memory: ✅ 35.330MB (SLO: <36.000MB 🟡 -1.9%) vs baseline: +4.4% ✅ useragentvariant_not_exists_1Time: ✅ 39.687µs (SLO: <50.000µs 📉 -20.6%) vs baseline: -0.3% Memory: ✅ 35.252MB (SLO: <36.000MB -2.1%) vs baseline: +4.2% ✅ useragentvariant_not_exists_2Time: ✅ 39.449µs (SLO: <50.000µs 📉 -21.1%) vs baseline: -1.2% Memory: ✅ 35.488MB (SLO: <36.000MB 🟡 -1.4%) vs baseline: +5.3% 🟡 span - 26/26✅ add-eventTime: ✅ 18.150ms (SLO: <22.500ms 📉 -19.3%) vs baseline: -0.3% Memory: ✅ 36.870MB (SLO: <53.000MB 📉 -30.4%) vs baseline: +4.8% ✅ add-metricsTime: ✅ 88.313ms (SLO: <93.500ms -5.5%) vs baseline: -0.5% Memory: ✅ 41.066MB (SLO: <53.000MB 📉 -22.5%) vs baseline: +5.0% ✅ add-tagsTime: ✅ 141.588ms (SLO: <155.000ms -8.7%) vs baseline: ~same Memory: ✅ 41.079MB (SLO: <53.000MB 📉 -22.5%) vs baseline: +5.1% ✅ get-contextTime: ✅ 16.929ms (SLO: <20.500ms 📉 -17.4%) vs baseline: -0.3% Memory: ✅ 36.877MB (SLO: <53.000MB 📉 -30.4%) vs baseline: +5.1% ✅ is-recordingTime: ✅ 17.267ms (SLO: <20.500ms 📉 -15.8%) vs baseline: +0.4% Memory: ✅ 36.782MB (SLO: <53.000MB 📉 -30.6%) vs baseline: +4.8% ✅ record-exceptionTime: ✅ 36.679ms (SLO: <40.000ms -8.3%) vs baseline: +0.5% Memory: ✅ 37.241MB (SLO: <53.000MB 📉 -29.7%) vs baseline: +4.6% ✅ set-statusTime: ✅ 18.596ms (SLO: <22.000ms 📉 -15.5%) vs baseline: ~same Memory: ✅ 36.762MB (SLO: <53.000MB 📉 -30.6%) vs baseline: +5.0% ✅ startTime: ✅ 17.289ms (SLO: <20.500ms 📉 -15.7%) vs baseline: +2.6% Memory: ✅ 36.783MB (SLO: <53.000MB 📉 -30.6%) vs baseline: +5.1% ✅ start-finishTime: ✅ 51.216ms (SLO: <52.500ms -2.4%) vs baseline: -0.2% Memory: ✅ 34.819MB (SLO: <35.500MB 🟡 -1.9%) vs baseline: +5.3% ✅ start-finish-telemetryTime: ✅ 52.311ms (SLO: <54.500ms -4.0%) vs baseline: ~same Memory: ✅ 34.662MB (SLO: <35.500MB -2.4%) vs baseline: +4.7% ✅ start-finish-traceid128Time: ✅ 54.235ms (SLO: <57.000ms -4.9%) vs baseline: ~same Memory: ✅ 34.701MB (SLO: <35.500MB -2.2%) vs baseline: +4.7% ✅ start-traceid128Time: ✅ 17.253ms (SLO: <22.500ms 📉 -23.3%) vs baseline: +0.2% Memory: ✅ 36.785MB (SLO: <53.000MB 📉 -30.6%) vs baseline: +4.9% ✅ update-nameTime: ✅ 17.475ms (SLO: <22.000ms 📉 -20.6%) vs baseline: +0.9% Memory: ✅ 36.790MB (SLO: <53.000MB 📉 -30.6%) vs baseline: +5.1% 🟡 tracer - 6/6✅ largeTime: ✅ 29.092ms (SLO: <32.950ms 📉 -11.7%) vs baseline: +0.3% Memory: ✅ 35.901MB (SLO: <36.500MB 🟡 -1.6%) vs baseline: +4.9% ✅ mediumTime: ✅ 2.884ms (SLO: <3.200ms -9.9%) vs baseline: +0.4% Memory: ✅ 34.878MB (SLO: <35.500MB 🟡 -1.8%) vs baseline: +5.3% ✅ smallTime: ✅ 331.014µs (SLO: <370.000µs 📉 -10.5%) vs baseline: +1.7% Memory: ✅ 34.780MB (SLO: <35.500MB -2.0%) vs baseline: +5.0%
|
c49fe88 to
d299788
Compare
9be8865 to
c73e726
Compare
## What does this PR do? More details and investigation results available in https://datadoghq.atlassian.net/browse/PROF-13137 Related PRs * Dependency: #15552 * Dependent: #15579 * Echion PR: P403n1x87/echion#198 This PR fixes the way we sample and capture stacks for on-CPU asyncio Tasks. This is a first step towards fixing _all_ weird (sub-)stacks we are seeing (both in Echion and dd-trace-py), for example this one... ``` background_math_function Task-background_wait background_wait_function sleep ``` ... where in practice, `background_math_function` was executed as part of a Task that was completely unrelated to `Task-background_wait` and should never have appeared in the same stack. This by itself doesn't fix everything (see **The fix(es, actually)**), but, as I said, it's a first step. See [this document](https://docs.google.com/document/d/10HmKhY6tM5j7ojdk7CG8anWsN7qP7IyeZlj3-zAXudM/edit?pli=1&tab=t.9pzrl0uli4g) for more explanations around how this works / is supposed to work, the fix is explained at the bottom here. ## The fix(es, actually) ### Flawed existing logic... The fix logic is the following: * To correctly interleave Task Stacks and Task names, we need to determine the "synchronous Python top-of-stack" that goes on top of the on-CPU Task (if there is an on-CPU Task). * This includes the Python stack that eventually led to doing something like `asyncio.run`, as well as the internal `asyncio` Runner machinery. * We will have to push this on top of every Task Stack we capture (note that the on-CPU Stack will already have it by definition). * To do that, we need to determine which Task is "the on CPU Task" (if any) and process it first, so that we know how "high" the "upper Python stack" is and we can re-use it for subsequent Task unwindings. * To ensure the first Task we unwind is the on-CPU one, we first sort the Leaf Tasks array by on-CPU-ness * Note I'm saying _the_ on CPU Task because, as always in Python, there can only be one thing running at a time. * (Well, that's the case at least in theory – in practice on-CPU-ness may change as we sample and so we could end up with more than one on-CPU Task, but that is fine because it won't change how deep the "upper stack" is) * Once we've done this, we know how high the "top of Stack is" because it is the height of the "pure Python" Stack we get by unwinding the first (top-most) Frame of the on-CPU Task. We need to remember that "height" to push that many items from the Python Thread Stack on top of each Task's Stack. * One final thing to keep in mind is that we "stack" Stacks (hehe) such that if `Task-1` is awaiting `Task-2`, the Stack for `Task-2` goes under that for `Task-1`. We only ever want to add the "pure Python top-of-stack" once per Stack, so we need to do that _once per leaf Task_ after we've recursively unwound awaiting Tasks for the leaf Task. ### ... and a race condition? On top of that – because it's not enough – I think I discovered a rare but very real race condition (which actually was the root cause of that weird, rare but common-in-CI bug with the stack I showed on top). The race condition happens when the pure Python Stack we capture involves some asynchronous Frames, but the associated Task/Coroutine completes or yields before we get to unwinding it. In that case, we assume in Stack interleaving that the Task is running, by doing so we include some Frames from the Python Stack that actually _are not_ in the Stack generated by unwinding the Task, and because we share the same Python Stack for all Tasks (we only use it's "upper part", which is the same for every Task) some Frames from the previously-running-but-now-paused-or-completed Coroutine are leaked to other Tasks. Working around this is not simple; also honestly we should have a discussion around whether we want to properly work around it (which is going to be somewhat difficult, imperfect and probably somewhat costly) or just give up on sampling when we detect something is off. In the interest of keeping things somewhat simple, this will be handled in a separate PR. But I described the bug here anyway, for clarity (temporary PR: KowalskiThomas/echion#43) ### Caveats I realised after the fact that an assumption we implicitly make (that _the on-CPU Task – if it exists – is a Leaf Task_) is actually not generally true. In the case of certain `asyncio` utils, the Parent Task will actually from time to time execute code/be on-CPU to manage the Child Tasks it is awaiting on. This is an edge case, and something that happens rarely, but saying it can never happen is false (and it shows in Profiles). We will also need to figure something out for that – it probably isn't _that_ hard but will require some refactors (probably split the unwinding in two steps: (1) only determine upper Python Stack (2) unwind Tasks strictly speaking, starting from Leaf Tasks). ## Testing The PR adds new tests around on-CPU Tasks and what their Stacks look like The PR also updates a lot of existing tests to output their `DataSummary` as JSON. This is immensely useful to understand what is actually going on when we don't see the expected Stacks (or see the unexpected ones) and I do think it'd be worth keeping. After these changes, the tests that still fail locally and in the CI (flakily) are unrelated to on-CPU Tasks which, I guess, means _mission failed successfully_?
7b6ba4f to
cce06f9
Compare
cce06f9 to
c68bbe7
Compare
Description
Testing
Risks
Additional Notes