Skip to content

Conversation

@bwoebi
Copy link
Contributor

@bwoebi bwoebi commented Sep 29, 2025

Also move Span structures to v04, to make space for v1 spans (which will eventually become the new default). TraceData is also going to be used in the V1 implementation, to carry around byte arrays and strings alike, separate from the indexed offsets into the big vector.
This trivially allows directly working on tinybytes data or u8 slices, depending on the input, rather than requiring a copy-conversion at the end for tinybytes input. This is a major performance penalty (benchmarks say about 20% gain - I'm really confused why the regression introduced by #1004 was deemed acceptable).

This also addresses "APMSP-1941 - Replace Bytes with a wrapper that borrows the underlying".

Note that this PR partially reverts #1139 by @shreyamalpani - but instead provides the ability to pass an endpoint directly when sending.
This was done by the deliberate choice to remove Clone from Span, which is quite an expensive operation and should simply never be done. Especially the goal is for v1 spans to possibly store the backing storage for strings alongside the actual TracerPayload (which v1 has), at which point such an operation would be prohibitively expensive.

Also move Span structures to v04, to make space for v1 spans (which will eventually become the new default).
TraceData is also going to be used in the V1 implementation, to carry around byte arrays and strings alike, separate from the indexed offsets into the big vector.

Signed-off-by: Bob Weinand <bob.weinand@datadoghq.com>
@pr-commenter
Copy link

pr-commenter bot commented Sep 29, 2025

Benchmarks

Comparison

Benchmark execution time: 2026-01-16 19:47:29

Comparing candidate commit 2f92752 in PR branch bob/tracedata with baseline commit 51c8cb4 in branch main.

Found 6 performance improvements and 7 performance regressions! Performance is the same for 40 metrics, 2 unstable metrics.

scenario:benching deserializing traces from msgpack to their internal representation

  • 🟩 execution_time [-13.882ms; -13.145ms] or [-22.282%; -21.099%]

scenario:benching serializing traces from their internal representation to msgpack

  • 🟥 execution_time [+910.139µs; +921.656µs] or [+6.518%; +6.600%]

scenario:concentrator/add_spans_to_concentrator

  • 🟩 execution_time [-624.276µs; -617.545µs] or [-5.619%; -5.558%]

scenario:credit_card/is_card_number/378282246310005

  • 🟥 execution_time [+9.398µs; +9.685µs] or [+13.704%; +14.122%]
  • 🟥 throughput [-1807709.341op/s; -1754518.201op/s] or [-12.396%; -12.031%]

scenario:credit_card/is_card_number/x371413321323331

  • 🟩 execution_time [-401.413ns; -398.057ns] or [-6.237%; -6.185%]
  • 🟩 throughput [+10244816.194op/s; +10335216.628op/s] or [+6.594%; +6.652%]

scenario:credit_card/is_card_number_no_luhn/x371413321323331

  • 🟩 execution_time [-399.789ns; -397.390ns] or [-6.212%; -6.175%]
  • 🟩 throughput [+10228142.320op/s; +10292572.450op/s] or [+6.582%; +6.624%]

scenario:normalization/normalize_service/normalize_service/A0000000000000000000000000000000000000000000000000...

  • 🟥 execution_time [+39.568µs; +39.791µs] or [+7.988%; +8.033%]
  • 🟥 throughput [-150147.486op/s; -149290.358op/s] or [-7.438%; -7.395%]

scenario:normalization/normalize_service/normalize_service/Test Conversion 0f Weird !@#$%^&**() Characters

  • 🟥 execution_time [+26.539µs; +26.612µs] or [+15.835%; +15.878%]
  • 🟥 throughput [-817617.806op/s; -815536.228op/s] or [-13.704%; -13.669%]

Candidate

Candidate benchmark details

Group 1

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz 2f92752 1759316611 bob/tracedata
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
benching serializing traces from their internal representation to msgpack execution_time 14.836ms 14.880ms ± 0.030ms 14.874ms ± 0.013ms 14.890ms 14.917ms 14.998ms 15.063ms 1.27% 2.552 9.784 0.20% 0.002ms 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
benching serializing traces from their internal representation to msgpack execution_time [14.876ms; 14.885ms] or [-0.028%; +0.028%] None None None

Group 2

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz 2f92752 1759316611 bob/tracedata
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
benching string interning on wordpress profile execution_time 158.125µs 159.045µs ± 0.850µs 158.963µs ± 0.154µs 159.121µs 159.408µs 160.217µs 170.239µs 7.09% 11.571 149.200 0.53% 0.060µs 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
benching string interning on wordpress profile execution_time [158.927µs; 159.163µs] or [-0.074%; +0.074%] None None None

Group 3

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz 2f92752 1759316611 bob/tracedata
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
sql/obfuscate_sql_string execution_time 87.286µs 87.629µs ± 0.359µs 87.568µs ± 0.072µs 87.645µs 87.889µs 89.132µs 91.419µs 4.40% 7.505 68.306 0.41% 0.025µs 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
sql/obfuscate_sql_string execution_time [87.580µs; 87.679µs] or [-0.057%; +0.057%] None None None

Group 4

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz 2f92752 1759316611 bob/tracedata
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
credit_card/is_card_number/ execution_time 3.893µs 3.912µs ± 0.003µs 3.911µs ± 0.002µs 3.913µs 3.917µs 3.919µs 3.920µs 0.22% -0.542 6.963 0.07% 0.000µs 1 200
credit_card/is_card_number/ throughput 255113595.888op/s 255643547.767op/s ± 190600.418op/s 255676145.417op/s ± 101750.483op/s 255759029.186op/s 255862330.577op/s 255937032.756op/s 256840861.422op/s 0.46% 0.561 7.079 0.07% 13477.485op/s 1 200
credit_card/is_card_number/ 3782-8224-6310-005 execution_time 76.702µs 78.414µs ± 0.815µs 78.374µs ± 0.486µs 78.811µs 79.735µs 80.245µs 82.298µs 5.01% 0.780 2.126 1.04% 0.058µs 1 200
credit_card/is_card_number/ 3782-8224-6310-005 throughput 12151015.478op/s 12754181.463op/s ± 131642.174op/s 12759405.950op/s ± 79079.614op/s 12844122.394op/s 12942679.204op/s 13032668.385op/s 13037436.490op/s 2.18% -0.675 1.739 1.03% 9308.507op/s 1 200
credit_card/is_card_number/ 378282246310005 execution_time 69.818µs 70.952µs ± 0.630µs 70.898µs ± 0.396µs 71.299µs 71.954µs 72.235µs 74.444µs 5.00% 0.944 3.481 0.89% 0.045µs 1 200
credit_card/is_card_number/ 378282246310005 throughput 13432863.548op/s 14095056.563op/s ± 124259.039op/s 14104697.928op/s ± 78687.699op/s 14180742.067op/s 14288059.065op/s 14312019.728op/s 14322911.773op/s 1.55% -0.829 2.835 0.88% 8786.441op/s 1 200
credit_card/is_card_number/37828224631 execution_time 3.895µs 3.912µs ± 0.003µs 3.912µs ± 0.002µs 3.914µs 3.917µs 3.920µs 3.939µs 0.71% 2.139 21.600 0.09% 0.000µs 1 200
credit_card/is_card_number/37828224631 throughput 253843767.451op/s 255613317.556op/s ± 222857.735op/s 255639809.608op/s ± 115380.442op/s 255735355.417op/s 255851910.829op/s 255932476.042op/s 256733583.735op/s 0.43% -2.089 21.276 0.09% 15758.422op/s 1 200
credit_card/is_card_number/378282246310005 execution_time 76.918µs 78.122µs ± 0.780µs 77.987µs ± 0.522µs 78.594µs 79.433µs 80.298µs 80.566µs 3.31% 0.635 0.125 1.00% 0.055µs 1 200
credit_card/is_card_number/378282246310005 throughput 12412207.685op/s 12801773.280op/s ± 126979.086op/s 12822711.118op/s ± 85314.170op/s 12881252.305op/s 12982207.231op/s 12990821.187op/s 13000924.880op/s 1.39% -0.585 0.022 0.99% 8978.777op/s 1 200
credit_card/is_card_number/37828224631000521389798 execution_time 52.142µs 52.206µs ± 0.053µs 52.198µs ± 0.020µs 52.222µs 52.274µs 52.303µs 52.787µs 1.13% 6.876 71.792 0.10% 0.004µs 1 200
credit_card/is_card_number/37828224631000521389798 throughput 18944172.215op/s 19154873.717op/s ± 19212.135op/s 19157999.917op/s ± 7475.396op/s 19164241.442op/s 19172118.276op/s 19175654.723op/s 19178470.249op/s 0.11% -6.797 70.595 0.10% 1358.503op/s 1 200
credit_card/is_card_number/x371413321323331 execution_time 6.026µs 6.036µs ± 0.012µs 6.034µs ± 0.003µs 6.037µs 6.045µs 6.104µs 6.117µs 1.37% 4.716 25.586 0.19% 0.001µs 1 200
credit_card/is_card_number/x371413321323331 throughput 163486991.043op/s 165666950.024op/s ± 314207.499op/s 165732044.297op/s ± 70479.696op/s 165798040.527op/s 165867730.426op/s 165892552.982op/s 165934914.058op/s 0.12% -4.686 25.279 0.19% 22217.825op/s 1 200
credit_card/is_card_number_no_luhn/ execution_time 3.891µs 3.911µs ± 0.003µs 3.911µs ± 0.001µs 3.913µs 3.915µs 3.917µs 3.918µs 0.17% -1.994 16.135 0.07% 0.000µs 1 200
credit_card/is_card_number_no_luhn/ throughput 255240337.676op/s 255678471.987op/s ± 175359.514op/s 255674189.723op/s ± 92455.139op/s 255773541.315op/s 255906889.206op/s 255946548.528op/s 257031836.162op/s 0.53% 2.023 16.395 0.07% 12399.790op/s 1 200
credit_card/is_card_number_no_luhn/ 3782-8224-6310-005 execution_time 63.968µs 64.416µs ± 0.168µs 64.393µs ± 0.083µs 64.503µs 64.707µs 64.922µs 64.952µs 0.87% 0.627 1.105 0.26% 0.012µs 1 200
credit_card/is_card_number_no_luhn/ 3782-8224-6310-005 throughput 15396009.039op/s 15524303.913op/s ± 40389.101op/s 15529593.482op/s ± 20105.793op/s 15546323.213op/s 15581309.908op/s 15618633.843op/s 15632805.442op/s 0.66% -0.606 1.078 0.26% 2855.941op/s 1 200
credit_card/is_card_number_no_luhn/ 378282246310005 execution_time 58.099µs 58.320µs ± 0.138µs 58.278µs ± 0.079µs 58.403µs 58.587µs 58.680µs 58.728µs 0.77% 0.884 -0.010 0.24% 0.010µs 1 200
credit_card/is_card_number_no_luhn/ 378282246310005 throughput 17027679.880op/s 17146790.319op/s ± 40404.457op/s 17159265.621op/s ± 23118.836op/s 17176897.075op/s 17194149.777op/s 17203078.155op/s 17212044.989op/s 0.31% -0.875 -0.028 0.24% 2857.027op/s 1 200
credit_card/is_card_number_no_luhn/37828224631 execution_time 3.894µs 3.912µs ± 0.002µs 3.911µs ± 0.001µs 3.913µs 3.916µs 3.917µs 3.918µs 0.17% -1.287 10.420 0.06% 0.000µs 1 200
credit_card/is_card_number_no_luhn/37828224631 throughput 255239853.592op/s 255653494.686op/s ± 161007.522op/s 255663043.907op/s ± 87909.833op/s 255743374.079op/s 255861371.767op/s 255939068.591op/s 256773982.861op/s 0.43% 1.307 10.574 0.06% 11384.951op/s 1 200
credit_card/is_card_number_no_luhn/378282246310005 execution_time 54.574µs 54.839µs ± 0.215µs 54.763µs ± 0.118µs 54.979µs 55.202µs 55.374µs 56.038µs 2.33% 1.486 3.833 0.39% 0.015µs 1 200
credit_card/is_card_number_no_luhn/378282246310005 throughput 17844991.964op/s 18235454.811op/s ± 71080.887op/s 18260482.501op/s ± 39521.160op/s 18290988.944op/s 18310109.760op/s 18319688.980op/s 18323842.984op/s 0.35% -1.445 3.549 0.39% 5026.178op/s 1 200
credit_card/is_card_number_no_luhn/37828224631000521389798 execution_time 52.142µs 52.205µs ± 0.033µs 52.200µs ± 0.019µs 52.220µs 52.273µs 52.294µs 52.308µs 0.21% 0.873 0.629 0.06% 0.002µs 1 200
credit_card/is_card_number_no_luhn/37828224631000521389798 throughput 19117662.141op/s 19155234.729op/s ± 12017.416op/s 19157226.702op/s ± 6838.254op/s 19163717.335op/s 19171493.427op/s 19176331.805op/s 19178449.177op/s 0.11% -0.869 0.622 0.06% 849.760op/s 1 200
credit_card/is_card_number_no_luhn/x371413321323331 execution_time 6.028µs 6.037µs ± 0.008µs 6.035µs ± 0.003µs 6.039µs 6.044µs 6.072µs 6.108µs 1.21% 4.964 34.816 0.13% 0.001µs 1 200
credit_card/is_card_number_no_luhn/x371413321323331 throughput 163715554.647op/s 165652526.499op/s ± 219169.459op/s 165695542.791op/s ± 74843.038op/s 165761352.430op/s 165836190.485op/s 165876600.523op/s 165892086.447op/s 0.12% -4.916 34.218 0.13% 15497.621op/s 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
credit_card/is_card_number/ execution_time [3.911µs; 3.912µs] or [-0.010%; +0.010%] None None None
credit_card/is_card_number/ throughput [255617132.382op/s; 255669963.152op/s] or [-0.010%; +0.010%] None None None
credit_card/is_card_number/ 3782-8224-6310-005 execution_time [78.301µs; 78.527µs] or [-0.144%; +0.144%] None None None
credit_card/is_card_number/ 3782-8224-6310-005 throughput [12735937.124op/s; 12772425.802op/s] or [-0.143%; +0.143%] None None None
credit_card/is_card_number/ 378282246310005 execution_time [70.865µs; 71.040µs] or [-0.123%; +0.123%] None None None
credit_card/is_card_number/ 378282246310005 throughput [14077835.455op/s; 14112277.670op/s] or [-0.122%; +0.122%] None None None
credit_card/is_card_number/37828224631 execution_time [3.912µs; 3.913µs] or [-0.012%; +0.012%] None None None
credit_card/is_card_number/37828224631 throughput [255582431.617op/s; 255644203.494op/s] or [-0.012%; +0.012%] None None None
credit_card/is_card_number/378282246310005 execution_time [78.014µs; 78.230µs] or [-0.138%; +0.138%] None None None
credit_card/is_card_number/378282246310005 throughput [12784175.200op/s; 12819371.360op/s] or [-0.137%; +0.137%] None None None
credit_card/is_card_number/37828224631000521389798 execution_time [52.199µs; 52.213µs] or [-0.014%; +0.014%] None None None
credit_card/is_card_number/37828224631000521389798 throughput [19152211.100op/s; 19157536.334op/s] or [-0.014%; +0.014%] None None None
credit_card/is_card_number/x371413321323331 execution_time [6.035µs; 6.038µs] or [-0.027%; +0.027%] None None None
credit_card/is_card_number/x371413321323331 throughput [165623403.887op/s; 165710496.162op/s] or [-0.026%; +0.026%] None None None
credit_card/is_card_number_no_luhn/ execution_time [3.911µs; 3.912µs] or [-0.009%; +0.009%] None None None
credit_card/is_card_number_no_luhn/ throughput [255654168.845op/s; 255702775.129op/s] or [-0.010%; +0.010%] None None None
credit_card/is_card_number_no_luhn/ 3782-8224-6310-005 execution_time [64.392µs; 64.439µs] or [-0.036%; +0.036%] None None None
credit_card/is_card_number_no_luhn/ 3782-8224-6310-005 throughput [15518706.372op/s; 15529901.454op/s] or [-0.036%; +0.036%] None None None
credit_card/is_card_number_no_luhn/ 378282246310005 execution_time [58.301µs; 58.339µs] or [-0.033%; +0.033%] None None None
credit_card/is_card_number_no_luhn/ 378282246310005 throughput [17141190.650op/s; 17152389.988op/s] or [-0.033%; +0.033%] None None None
credit_card/is_card_number_no_luhn/37828224631 execution_time [3.911µs; 3.912µs] or [-0.009%; +0.009%] None None None
credit_card/is_card_number_no_luhn/37828224631 throughput [255631180.592op/s; 255675808.780op/s] or [-0.009%; +0.009%] None None None
credit_card/is_card_number_no_luhn/378282246310005 execution_time [54.809µs; 54.869µs] or [-0.054%; +0.054%] None None None
credit_card/is_card_number_no_luhn/378282246310005 throughput [18225603.684op/s; 18245305.938op/s] or [-0.054%; +0.054%] None None None
credit_card/is_card_number_no_luhn/37828224631000521389798 execution_time [52.201µs; 52.210µs] or [-0.009%; +0.009%] None None None
credit_card/is_card_number_no_luhn/37828224631000521389798 throughput [19153569.231op/s; 19156900.227op/s] or [-0.009%; +0.009%] None None None
credit_card/is_card_number_no_luhn/x371413321323331 execution_time [6.036µs; 6.038µs] or [-0.018%; +0.018%] None None None
credit_card/is_card_number_no_luhn/x371413321323331 throughput [165622151.720op/s; 165682901.278op/s] or [-0.018%; +0.018%] None None None

Group 5

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz 2f92752 1759316611 bob/tracedata
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
normalization/normalize_trace/test_trace execution_time 240.740ns 252.454ns ± 13.624ns 245.351ns ± 3.002ns 257.768ns 281.278ns 287.973ns 289.330ns 17.92% 1.324 0.277 5.38% 0.963ns 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
normalization/normalize_trace/test_trace execution_time [250.566ns; 254.343ns] or [-0.748%; +0.748%] None None None

Group 6

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz 2f92752 1759316611 bob/tracedata
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
normalization/normalize_name/normalize_name/Too-Long-.Too-Long-.Too-Long-.Too-Long-.Too-Long-.Too-Lo... execution_time 186.449µs 186.874µs ± 0.269µs 186.843µs ± 0.132µs 186.986µs 187.203µs 187.417µs 188.880µs 1.09% 3.390 21.717 0.14% 0.019µs 1 200
normalization/normalize_name/normalize_name/Too-Long-.Too-Long-.Too-Long-.Too-Long-.Too-Long-.Too-Lo... throughput 5294359.786op/s 5351217.192op/s ± 7672.291op/s 5352092.418op/s ± 3774.703op/s 5355625.948op/s 5360018.940op/s 5362869.703op/s 5363406.310op/s 0.21% -3.338 21.243 0.14% 542.513op/s 1 200
normalization/normalize_name/normalize_name/bad-name execution_time 17.594µs 17.688µs ± 0.037µs 17.686µs ± 0.022µs 17.708µs 17.757µs 17.778µs 17.796µs 0.62% 0.383 0.295 0.21% 0.003µs 1 200
normalization/normalize_name/normalize_name/bad-name throughput 56191580.235op/s 56535624.000op/s ± 117163.035op/s 56542716.958op/s ± 69436.217op/s 56611632.076op/s 56704350.776op/s 56782087.791op/s 56836146.643op/s 0.52% -0.369 0.286 0.21% 8284.678op/s 1 200
normalization/normalize_name/normalize_name/good execution_time 9.960µs 10.067µs ± 0.045µs 10.065µs ± 0.021µs 10.088µs 10.122µs 10.159µs 10.484µs 4.16% 3.935 34.902 0.45% 0.003µs 1 200
normalization/normalize_name/normalize_name/good throughput 95387400.271op/s 99331571.262op/s ± 436841.603op/s 99354875.998op/s ± 212235.117op/s 99549519.534op/s 99861101.806op/s 100093928.910op/s 100396912.680op/s 1.05% -3.658 31.708 0.44% 30889.366op/s 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
normalization/normalize_name/normalize_name/Too-Long-.Too-Long-.Too-Long-.Too-Long-.Too-Long-.Too-Lo... execution_time [186.836µs; 186.911µs] or [-0.020%; +0.020%] None None None
normalization/normalize_name/normalize_name/Too-Long-.Too-Long-.Too-Long-.Too-Long-.Too-Long-.Too-Lo... throughput [5350153.886op/s; 5352280.498op/s] or [-0.020%; +0.020%] None None None
normalization/normalize_name/normalize_name/bad-name execution_time [17.683µs; 17.693µs] or [-0.029%; +0.029%] None None None
normalization/normalize_name/normalize_name/bad-name throughput [56519386.330op/s; 56551861.670op/s] or [-0.029%; +0.029%] None None None
normalization/normalize_name/normalize_name/good execution_time [10.061µs; 10.074µs] or [-0.062%; +0.062%] None None None
normalization/normalize_name/normalize_name/good throughput [99271029.217op/s; 99392113.306op/s] or [-0.061%; +0.061%] None None None

Group 7

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz 2f92752 1759316611 bob/tracedata
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
two way interface execution_time 17.676µs 26.007µs ± 10.157µs 17.897µs ± 0.119µs 35.045µs 45.114µs 47.138µs 69.068µs 285.92% 0.899 0.209 38.96% 0.718µs 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
two way interface execution_time [24.599µs; 27.415µs] or [-5.413%; +5.413%] None None None

Group 8

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz 2f92752 1759316611 bob/tracedata
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
ip_address/quantize_peer_ip_address_benchmark execution_time 4.998µs 5.067µs ± 0.037µs 5.059µs ± 0.027µs 5.104µs 5.124µs 5.127µs 5.129µs 1.39% 0.336 -1.384 0.72% 0.003µs 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
ip_address/quantize_peer_ip_address_benchmark execution_time [5.062µs; 5.072µs] or [-0.101%; +0.101%] None None None

Group 9

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz 2f92752 1759316611 bob/tracedata
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
concentrator/add_spans_to_concentrator execution_time 10.455ms 10.489ms ± 0.016ms 10.487ms ± 0.011ms 10.500ms 10.516ms 10.527ms 10.565ms 0.74% 0.710 1.510 0.15% 0.001ms 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
concentrator/add_spans_to_concentrator execution_time [10.487ms; 10.491ms] or [-0.021%; +0.021%] None None None

Group 10

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz 2f92752 1759316611 bob/tracedata
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
tags/replace_trace_tags execution_time 2.390µs 2.439µs ± 0.021µs 2.436µs ± 0.006µs 2.442µs 2.492µs 2.501µs 2.505µs 2.81% 1.180 2.544 0.84% 0.001µs 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
tags/replace_trace_tags execution_time [2.436µs; 2.441µs] or [-0.117%; +0.117%] None None None

Group 11

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz 2f92752 1759316611 bob/tracedata
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
receiver_entry_point/report/2597 execution_time 6.300ms 6.616ms ± 0.067ms 6.626ms ± 0.018ms 6.645ms 6.678ms 6.696ms 6.791ms 2.49% -2.651 8.711 1.01% 0.005ms 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
receiver_entry_point/report/2597 execution_time [6.606ms; 6.625ms] or [-0.140%; +0.140%] None None None

Group 12

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz 2f92752 1759316611 bob/tracedata
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
normalization/normalize_service/normalize_service/A0000000000000000000000000000000000000000000000000... execution_time 534.084µs 535.032µs ± 0.501µs 534.987µs ± 0.249µs 535.222µs 535.663µs 536.433µs 539.293µs 0.80% 3.450 25.309 0.09% 0.035µs 1 200
normalization/normalize_service/normalize_service/A0000000000000000000000000000000000000000000000000... throughput 1854278.573op/s 1869047.391op/s ± 1745.484op/s 1869204.298op/s ± 868.653op/s 1870076.851op/s 1870977.821op/s 1871731.152op/s 1872364.853op/s 0.17% -3.408 24.839 0.09% 123.424op/s 1 200
normalization/normalize_service/normalize_service/Data🐨dog🐶 繋がっ⛰てて execution_time 379.922µs 380.742µs ± 0.371µs 380.683µs ± 0.227µs 380.951µs 381.311µs 381.513µs 383.088µs 0.63% 1.478 6.736 0.10% 0.026µs 1 200
normalization/normalize_service/normalize_service/Data🐨dog🐶 繋がっ⛰てて throughput 2610366.583op/s 2626453.235op/s ± 2553.389op/s 2626857.818op/s ± 1564.167op/s 2628295.758op/s 2629822.849op/s 2630635.428op/s 2632119.526op/s 0.20% -1.459 6.595 0.10% 180.552op/s 1 200
normalization/normalize_service/normalize_service/Test Conversion 0f Weird !@#$%^&**() Characters execution_time 193.729µs 194.179µs ± 0.232µs 194.174µs ± 0.125µs 194.285µs 194.500µs 194.697µs 196.045µs 0.96% 2.593 19.231 0.12% 0.016µs 1 200
normalization/normalize_service/normalize_service/Test Conversion 0f Weird !@#$%^&**() Characters throughput 5100875.861op/s 5149889.078op/s ± 6146.876op/s 5150010.314op/s ± 3303.434op/s 5153749.748op/s 5158115.481op/s 5161550.766op/s 5161854.008op/s 0.23% -2.542 18.720 0.12% 434.650op/s 1 200
normalization/normalize_service/normalize_service/[empty string] execution_time 35.966µs 36.123µs ± 0.060µs 36.119µs ± 0.037µs 36.162µs 36.217µs 36.262µs 36.339µs 0.61% 0.136 0.524 0.17% 0.004µs 1 200
normalization/normalize_service/normalize_service/[empty string] throughput 27518434.979op/s 27683227.353op/s ± 46195.660op/s 27686019.221op/s ± 28736.828op/s 27708043.215op/s 27757545.215op/s 27799368.800op/s 27803939.403op/s 0.43% -0.123 0.512 0.17% 3266.526op/s 1 200
normalization/normalize_service/normalize_service/test_ASCII execution_time 44.895µs 45.088µs ± 0.161µs 45.077µs ± 0.165µs 45.238µs 45.345µs 45.406µs 45.448µs 0.82% 0.309 -1.233 0.36% 0.011µs 1 200
normalization/normalize_service/normalize_service/test_ASCII throughput 22002947.906op/s 22179241.031op/s ± 78936.032op/s 22184153.120op/s ± 81077.388op/s 22266042.344op/s 22272153.917op/s 22273506.889op/s 22273980.353op/s 0.40% -0.302 -1.241 0.36% 5581.620op/s 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
normalization/normalize_service/normalize_service/A0000000000000000000000000000000000000000000000000... execution_time [534.963µs; 535.102µs] or [-0.013%; +0.013%] None None None
normalization/normalize_service/normalize_service/A0000000000000000000000000000000000000000000000000... throughput [1868805.484op/s; 1869289.298op/s] or [-0.013%; +0.013%] None None None
normalization/normalize_service/normalize_service/Data🐨dog🐶 繋がっ⛰てて execution_time [380.691µs; 380.793µs] or [-0.013%; +0.013%] None None None
normalization/normalize_service/normalize_service/Data🐨dog🐶 繋がっ⛰てて throughput [2626099.360op/s; 2626807.110op/s] or [-0.013%; +0.013%] None None None
normalization/normalize_service/normalize_service/Test Conversion 0f Weird !@#$%^&**() Characters execution_time [194.147µs; 194.211µs] or [-0.017%; +0.017%] None None None
normalization/normalize_service/normalize_service/Test Conversion 0f Weird !@#$%^&**() Characters throughput [5149037.180op/s; 5150740.976op/s] or [-0.017%; +0.017%] None None None
normalization/normalize_service/normalize_service/[empty string] execution_time [36.115µs; 36.131µs] or [-0.023%; +0.023%] None None None
normalization/normalize_service/normalize_service/[empty string] throughput [27676825.079op/s; 27689629.628op/s] or [-0.023%; +0.023%] None None None
normalization/normalize_service/normalize_service/test_ASCII execution_time [45.066µs; 45.110µs] or [-0.049%; +0.049%] None None None
normalization/normalize_service/normalize_service/test_ASCII throughput [22168301.256op/s; 22190180.806op/s] or [-0.049%; +0.049%] None None None

Group 13

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz 2f92752 1759316611 bob/tracedata
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
redis/obfuscate_redis_string execution_time 33.710µs 34.351µs ± 1.029µs 33.894µs ± 0.091µs 34.011µs 36.542µs 36.571µs 37.751µs 11.38% 1.707 1.070 2.99% 0.073µs 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
redis/obfuscate_redis_string execution_time [34.208µs; 34.493µs] or [-0.415%; +0.415%] None None None

Group 14

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz 2f92752 1759316611 bob/tracedata
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
write only interface execution_time 1.172µs 3.197µs ± 1.412µs 2.996µs ± 0.026µs 3.020µs 3.649µs 13.704µs 14.740µs 391.94% 7.356 55.280 44.06% 0.100µs 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
write only interface execution_time [3.001µs; 3.392µs] or [-6.122%; +6.122%] None None None

Group 15

cpu_model git_commit_sha git_commit_date git_branch
Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz 2f92752 1759316611 bob/tracedata
scenario metric min mean ± sd median ± mad p75 p95 p99 max peak_to_median_ratio skewness kurtosis cv sem runs sample_size
benching deserializing traces from msgpack to their internal representation execution_time 48.474ms 48.789ms ± 1.406ms 48.606ms ± 0.067ms 48.687ms 48.812ms 53.179ms 64.937ms 33.60% 9.675 98.984 2.87% 0.099ms 1 200
scenario metric 95% CI mean Shapiro-Wilk pvalue Ljung-Box pvalue (lag=1) Dip test pvalue
benching deserializing traces from msgpack to their internal representation execution_time [48.594ms; 48.984ms] or [-0.399%; +0.399%] None None None

Baseline

Omitted due to size.

@codecov-commenter
Copy link

codecov-commenter commented Sep 29, 2025

Codecov Report

❌ Patch coverage is 95.65972% with 25 lines in your changes missing coverage. Please review.
✅ Project coverage is 71.58%. Comparing base (0b59f64) to head (2f92752).
⚠️ Report is 1 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #1247      +/-   ##
==========================================
- Coverage   71.66%   71.58%   -0.09%     
==========================================
  Files         355      357       +2     
  Lines       56312    56252      -60     
==========================================
- Hits        40358    40266      -92     
- Misses      15954    15986      +32     
Components Coverage Δ
datadog-crashtracker 49.33% <ø> (+0.04%) ⬆️
datadog-crashtracker-ffi 5.93% <ø> (ø)
datadog-alloc 98.73% <ø> (ø)
data-pipeline 90.44% <94.11%> (-0.01%) ⬇️
data-pipeline-ffi 88.19% <ø> (ø)
ddcommon 84.29% <ø> (ø)
ddcommon-ffi 73.84% <ø> (ø)
ddtelemetry 59.98% <ø> (-0.04%) ⬇️
ddtelemetry-ffi 21.24% <ø> (ø)
dogstatsd-client 83.26% <ø> (ø)
datadog-ipc 82.39% <ø> (-0.11%) ⬇️
datadog-profiling 76.90% <ø> (ø)
datadog-profiling-ffi 62.12% <ø> (ø)
datadog-sidecar 36.71% <100.00%> (-0.48%) ⬇️
datdog-sidecar-ffi 9.61% <ø> (-2.26%) ⬇️
spawn-worker 55.35% <ø> (ø)
tinybytes 93.06% <ø> (+0.84%) ⬆️
datadog-trace-normalization 98.24% <ø> (ø)
datadog-trace-obfuscation 94.17% <ø> (ø)
datadog-trace-protobuf 59.65% <ø> (ø)
datadog-trace-utils 89.60% <95.69%> (-0.17%) ⬇️
datadog-tracer-flare 54.52% <ø> (ø)
datadog-log 76.31% <ø> (ø)
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@dd-octo-sts
Copy link

dd-octo-sts bot commented Sep 29, 2025

Artifact Size Benchmark Report

aarch64-alpine-linux-musl
Artifact Baseline Commit Change
/aarch64-alpine-linux-musl/lib/libdatadog_profiling.so 7.19 MB 7.19 MB 0% (0 B) 👌
/aarch64-alpine-linux-musl/lib/libdatadog_profiling.a 70.99 MB 70.98 MB --.02% (-15.34 KB) 💪
aarch64-unknown-linux-gnu
Artifact Baseline Commit Change
/aarch64-unknown-linux-gnu/lib/libdatadog_profiling.so 9.25 MB 9.25 MB -0% (-608 B) 👌
/aarch64-unknown-linux-gnu/lib/libdatadog_profiling.a 83.30 MB 83.29 MB -0% (-8.06 KB) 👌
libdatadog-x64-windows
Artifact Baseline Commit Change
/libdatadog-x64-windows/debug/dynamic/datadog_profiling_ffi.dll 18.39 MB 18.39 MB --.04% (-8.50 KB) 💪
/libdatadog-x64-windows/debug/dynamic/datadog_profiling_ffi.lib 65.77 KB 65.77 KB 0% (0 B) 👌
/libdatadog-x64-windows/debug/dynamic/datadog_profiling_ffi.pdb 125.09 MB 124.78 MB --.24% (-320.00 KB) 💪
/libdatadog-x64-windows/debug/static/datadog_profiling_ffi.lib 654.42 MB 652.33 MB --.31% (-2.08 MB) 💪
/libdatadog-x64-windows/release/dynamic/datadog_profiling_ffi.dll 5.88 MB 5.87 MB --.07% (-4.50 KB) 💪
/libdatadog-x64-windows/release/dynamic/datadog_profiling_ffi.lib 65.77 KB 65.77 KB 0% (0 B) 👌
/libdatadog-x64-windows/release/dynamic/datadog_profiling_ffi.pdb 17.37 MB 17.37 MB --.04% (-8.00 KB) 💪
/libdatadog-x64-windows/release/static/datadog_profiling_ffi.lib 32.21 MB 32.20 MB --.04% (-15.77 KB) 💪
libdatadog-x86-windows
Artifact Baseline Commit Change
/libdatadog-x86-windows/debug/dynamic/datadog_profiling_ffi.dll 15.68 MB 15.67 MB --.05% (-9.00 KB) 💪
/libdatadog-x86-windows/debug/dynamic/datadog_profiling_ffi.lib 66.79 KB 66.79 KB 0% (0 B) 👌
/libdatadog-x86-windows/debug/dynamic/datadog_profiling_ffi.pdb 127.41 MB 127.05 MB --.27% (-360.00 KB) 💪
/libdatadog-x86-windows/debug/static/datadog_profiling_ffi.lib 644.54 MB 642.44 MB --.32% (-2.10 MB) 💪
/libdatadog-x86-windows/release/dynamic/datadog_profiling_ffi.dll 4.49 MB 4.49 MB --.03% (-1.50 KB) 💪
/libdatadog-x86-windows/release/dynamic/datadog_profiling_ffi.lib 66.79 KB 66.79 KB 0% (0 B) 👌
/libdatadog-x86-windows/release/dynamic/datadog_profiling_ffi.pdb 18.50 MB 18.49 MB --.04% (-8.00 KB) 💪
/libdatadog-x86-windows/release/static/datadog_profiling_ffi.lib 30.25 MB 30.23 MB --.04% (-15.45 KB) 💪
x86_64-alpine-linux-musl
Artifact Baseline Commit Change
/x86_64-alpine-linux-musl/lib/libdatadog_profiling.a 63.64 MB 63.63 MB --.02% (-16.38 KB) 💪
/x86_64-alpine-linux-musl/lib/libdatadog_profiling.so 8.51 MB 8.50 MB --.09% (-8.00 KB) 💪
x86_64-unknown-linux-gnu
Artifact Baseline Commit Change
/x86_64-unknown-linux-gnu/lib/libdatadog_profiling.a 78.07 MB 78.06 MB --.01% (-11.28 KB) 💪
/x86_64-unknown-linux-gnu/lib/libdatadog_profiling.so 9.85 MB 9.85 MB -0% (-392 B) 👌

}
/// TraceData implementation using `Bytes` and `BytesString`.
#[derive(Default, Debug, Clone, PartialEq, Serialize)]
pub struct TinyData;
Copy link
Contributor Author

Choose a reason for hiding this comment

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

I don't know about the name. If you have better suggestions, feel free.

Copy link
Contributor

Choose a reason for hiding this comment

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

I think BytesData is better.

/// Trait representing a tuple of (Text, Bytes) types used for different underlying data structures.
/// Note: The functions are internal to the msgpack decoder and should not be used directly: they're
/// only exposed here due to the inavailability of min_specialization in stable Rust.
pub trait TraceData: Default + Debug + Clone + PartialEq + Serialize {
Copy link
Contributor

Choose a reason for hiding this comment

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

Why the Clone and PartialEq?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

PartialEq is necessary because v04::Span is PartialEq. And yeah, generic types need to have all these derives of the context they are used in, otherwise #[derive] doesn't work.
I have no idea though why I added Clone. Removing.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

No, Clone is needed for some cases where we have to clone spans (e.g. benchmarks and some tests).

Copy link
Contributor

Choose a reason for hiding this comment

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

Yeah, would be nice to mark PartialEq and Clone as test convenience things.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

How? Like by a comment? or a cfg_attr?

Copy link
Contributor

Choose a reason for hiding this comment

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

I'm not sure if there's a best practice for conditional trait requirements. You can of course make some other trait which is defined twice behind a #[cfg(test)] gates, one with and one without the extra requirements.

Copy link
Contributor

Choose a reason for hiding this comment

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

I don't think it's important enough to warrant conditional trait requirements. Was just an observation that it's only used from tests as far as I can see.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Yeah, cfg_attr doesn't work anyway, that'd need at least a feature flag. That's ugly.

@bwoebi bwoebi force-pushed the bob/tracedata branch 2 times, most recently from 06bacc7 to 9bbe018 Compare September 30, 2025 13:40
Signed-off-by: Bob Weinand <bob.weinand@datadoghq.com>
@datadog-official
Copy link

datadog-official bot commented Sep 30, 2025

✅ Tests

🎉 All green!

❄️ No new flaky tests detected
🧪 All tests passed

This comment will be updated automatically if new data arrives.
🔗 Commit SHA: 2f92752 | Docs | Datadog PR Page | Was this helpful? Give us feedback!

Signed-off-by: Bob Weinand <bob.weinand@datadoghq.com>
Signed-off-by: Bob Weinand <bob.weinand@datadoghq.com>
Copy link
Contributor

@VianneyRuhlmann VianneyRuhlmann left a comment

Choose a reason for hiding this comment

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

Thanks for adding the TraceData trait, it's a nice addition and makes even more sense with V1.

The span::Span was supposed to be a common interface for spans regardless of the encoding. It made sense with v04 and v05 as they have basically the same fields but since v1 has different fields (e.g. attributes vs meta/metrics) we probably won't be able to share a common representation. This also means we will have to reimplement all trace utils for v1 span.

Regarding the changes to the decoder I'm not a fan of having unsafe functions implemented on the SpanBytes. Also I think these changes should be addressed in a separate PR as they're not tied to the addition of TraceData.

state.serialize_field("array_value", &wrapped_value)?;
}
}
fn get_mut_slice(buf: &mut Self::Bytes) -> &mut &'static [u8];
Copy link
Contributor

Choose a reason for hiding this comment

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

I feel like these functions should be implemented on the type of the buffer rather than on the TraceData type. Maybe in Buffer(B) B shouldn't be T::Bytes but a different type that implements a trait to be deserialized to Span<(T::Text,T::Bytes)>

Copy link
Contributor Author

@bwoebi bwoebi Oct 1, 2025

Choose a reason for hiding this comment

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

That's mostly for convenience for now, so that Buffer -> T::Text works trivially. I wanted to not overcomplicate it, unless there's a real need for that. But it should not be overly problematic to change that in future if needed (e.g. you could then add a BufferData trait which holds (Out: TraceData, In: BufferInput) or such). Thanks to this already being T, it would be then a simple find T: TraceData & replace by a new T: BufferData operation at most places and returning T::Out::Text/Bytes then.

Comment on lines +64 to +66
/// `T` is the type used to represent strings in the span, it can be either owned (e.g. BytesString)
/// or borrowed (e.g. &str). To define a generic function taking any `Span<T>` you can use the
/// [`SpanValue`] trait:
Copy link
Contributor

Choose a reason for hiding this comment

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

Doc needs to be updated to match the change to TraceData


/// Internal Buffer used to wrap msgpack data for decoding.
/// Provides a couple accessors to extract data from the buffer.
pub struct Buffer<T: TraceData>(T::Bytes);
Copy link
Contributor

Choose a reason for hiding this comment

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

Why can't we use &[u8] for the buffer ?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

We need to at least store the Bytes reference to construct the Bytes/BytesString object.

use zstd::stream::write::Encoder;

#[derive(Debug, Clone)]
#[derive(Debug)]
Copy link
Contributor

Choose a reason for hiding this comment

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

The changes to send_data are not linked to TraceData. Could you put them in a separate PR ?

Copy link
Contributor Author

@bwoebi bwoebi Oct 1, 2025

Choose a reason for hiding this comment

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

They are, because it relied on Clone on the Span, and TraceData is not meant to be Clone outside of testing. (but these changes are also relatively minor)

})
#[inline]
fn get_mut_slice<'b>(buf: &'b mut &'a [u8]) -> &'b mut &'static [u8] {
unsafe { std::mem::transmute::<&'b mut &[u8], &'b mut &'static [u8]>(buf) }
Copy link
Contributor

Choose a reason for hiding this comment

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

This function is unsafe and should at least be marked as such.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Yeah, the generic variant on the trait probably should be.

@bwoebi
Copy link
Contributor Author

bwoebi commented Oct 1, 2025

This also means we will have to reimplement all trace utils for v1 span.

My plan is to have a projection with some functions which is compatible with all versions of the spans. Meaning that adding a float attribute will reroute to metrics, everything else to string.

That's why moving the span to v04 (and add a new span to v1), then we can add a common projection which routes accordingly, agnostic to the actual backend span used. I definitely want to avoid re-implementing everything.

@bwoebi
Copy link
Contributor Author

bwoebi commented Oct 1, 2025

Also I think these changes should be addressed in a separate PR as they're not tied to the addition of TraceData.

They sort of are, because the point of this PR is to also make use of TraceData, especially the meta_struct part making use of TraceData::Bytes.

@github-actions
Copy link

This pull request has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. To override this behavior, add the keep-open label or update the PR.

@github-actions github-actions bot added the stale Used by actions/stale to identify PRs that have been inactive for 90+ days label Jan 10, 2026
@github-actions github-actions bot removed the stale Used by actions/stale to identify PRs that have been inactive for 90+ days label Jan 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants