Skip to content

[WIP] Add CLI-based AutoInstrumentation Generator#8291

Closed
bouwkast wants to merge 9 commits intomasterfrom
steven/auto-instrumentation-gen-cli
Closed

[WIP] Add CLI-based AutoInstrumentation Generator#8291
bouwkast wants to merge 9 commits intomasterfrom
steven/auto-instrumentation-gen-cli

Conversation

@bouwkast
Copy link
Copy Markdown
Collaborator

Summary of changes

Currently a WIP, will need some more time

Idea here is to be able to encode our code generation for auto-instrumentations into a CLI

This would allow us to do a couple of things pretty easily:

  • Tie into our version update PRs and be able to determine whether the API surface we instrument has changed without having to investigate ourselves / rely on tests
  • Provide a means for AI-based tools to auto-instrument APIs but with our deterministic code generation instead of the AI tool generating the code themselves.

Reason for change

Implementation details

Test coverage

Other details

bouwkast and others added 9 commits March 11, 2026 16:36
Split the Avalonia GUI generator into a 3-project architecture:
- Core library (Generator.Core): shared generation logic with zero UI deps
- CLI tool (Generator.Cli): scriptable command-line interface via System.CommandLine
- Refactored GUI: delegates to Core for all generation

The CLI enables scripted/AI-assisted instrumentation workflows — generate
CallTarget boilerplate from assembly inspection without the GUI. Integrated
into Nuke build system as RunInstrumentationGeneratorCli target.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move option variables to fields, inline execution logic into the handler,
and extract config overrides into ApplyCliOverrides. No functional change
to CLI behavior.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use JsonSerializer.Serialize with anonymous types instead of manual
StringBuilder JSON construction. Eliminates incomplete JsonEscape helper
and uses the in-box System.Text.Json (no new dependency for net10.0).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Serialize the entire config object instead of only 3 fields, so LLM
consumers can see all auto-detected flag values and know exactly which
flags to override on follow-up invocations.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Every enable flag (--async-method-end, --duck-*, etc.) now has a
--no-* counterpart that explicitly disables it. Disable flags are
applied after enable flags so --no-* always wins, allowing selective
override of auto-detected defaults without resorting to --no-auto-detect.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Accepts a JSON string matching the 'configuration' block from --json
output, allowing an LLM to take auto-detected config from a first run,
modify specific fields, and pass it back. Individual CLI flags still
override on top. Replaces the need for --no-* counterparts on every flag.

Example workflow:
  1. Run with --json, inspect the configuration block
  2. Modify the JSON (e.g., set createOnAsyncMethodEnd to false)
  3. Re-run with --config '{"createOnAsyncMethodEnd": false, ...}'

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
AssemblyPath, TypeName, MethodName, OutputPath, ParameterTypes, and
GeneratorArgs are null when other targets run. Mark them as string? to
suppress nullability warnings. The .Requires() guards ensure they are
non-null when RunInstrumentationGeneratorCli executes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…d --list-keys

Remove all 21 duck-type Option<bool> fields and the 120-line ApplyCliOverrides
method from GenerateCommand. Replace with three configuration mechanisms:
- --set key=value (repeatable) for fine-grained overrides
- --config-file path.json for file-based config (auto-extracts from --json envelope)
- --list-keys to discover available configuration keys with defaults

Keep --no-method-begin, --no-method-end, --async-method-end as shortcut flags.
Add ConfigurationApplier with reflection-based property mapping, case-insensitive
lookup, and fuzzy-match suggestions for typos.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@bouwkast bouwkast 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 11, 2026
@pr-commenter
Copy link
Copy Markdown

pr-commenter bot commented Mar 11, 2026

Benchmarks

Benchmark execution time: 2026-03-11 22:31:09

Comparing candidate commit 7e1e887 in PR branch steven/auto-instrumentation-gen-cli with baseline commit 489fc21 in branch master.

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

scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.AllCycleSimpleBody net6.0

  • 🟩 execution_time [-27.825ms; -21.471ms] or [-12.722%; -9.817%]

scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.AllCycleSimpleBody netcoreapp3.1

  • 🟩 execution_time [-19.625ms; -13.282ms] or [-9.112%; -6.167%]

scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.ObjectExtractorSimpleBody net6.0

  • 🟩 execution_time [-25.533ms; -19.135ms] or [-11.627%; -8.713%]

scenario:Benchmarks.Trace.Asm.AppSecEncoderBenchmark.EncodeLegacyArgs net6.0

  • 🟩 execution_time [-28.039ms; -27.702ms] or [-13.648%; -13.484%]

scenario:Benchmarks.Trace.Asm.AppSecEncoderBenchmark.EncodeLegacyArgs netcoreapp3.1

  • 🟩 execution_time [-20.135ms; -19.725ms] or [-10.006%; -9.803%]

scenario:Benchmarks.Trace.AspNetCoreBenchmark.SendRequest net6.0

  • 🟥 execution_time [+98.842ms; +100.453ms] or [+101.797%; +103.456%]

scenario:Benchmarks.Trace.CIVisibilityProtocolWriterBenchmark.WriteAndFlushEnrichedTraces net6.0

  • 🟥 execution_time [+16.842ms; +20.256ms] or [+10.072%; +12.113%]
  • 🟥 throughput [-254.888op/s; -224.506op/s] or [-16.642%; -14.658%]

scenario:Benchmarks.Trace.CIVisibilityProtocolWriterBenchmark.WriteAndFlushEnrichedTraces netcoreapp3.1

  • 🟩 throughput [+135.281op/s; +202.701op/s] or [+9.556%; +14.319%]

scenario:Benchmarks.Trace.CharSliceBenchmark.OptimizedCharSliceWithPool netcoreapp3.1

  • 🟥 execution_time [+103.353µs; +111.420µs] or [+5.549%; +5.983%]
  • 🟥 throughput [-30.365op/s; -28.177op/s] or [-5.655%; -5.248%]

scenario:Benchmarks.Trace.DbCommandBenchmark.ExecuteNonQuery net6.0

  • 🟥 execution_time [+16.342ms; +17.130ms] or [+8.279%; +8.678%]

scenario:Benchmarks.Trace.ElasticsearchBenchmark.CallElasticsearchAsync net472

  • 🟩 throughput [+18187.393op/s; +19497.927op/s] or [+6.309%; +6.764%]

scenario:Benchmarks.Trace.GraphQLBenchmark.ExecuteAsync net472

  • 🟩 throughput [+28198.040op/s; +33120.645op/s] or [+7.501%; +8.810%]

scenario:Benchmarks.Trace.Iast.StringAspectsBenchmark.StringConcatBenchmark net6.0

  • 🟥 execution_time [+2.307µs; +5.890µs] or [+5.378%; +13.735%]

scenario:Benchmarks.Trace.SingleSpanAspNetCoreBenchmark.SingleSpanAspNetCore netcoreapp3.1

  • 🟥 throughput [-16135767.835op/s; -14845324.657op/s] or [-6.690%; -6.155%]

scenario:Benchmarks.Trace.SpanBenchmark.StartFinishScope net6.0

  • 🟥 execution_time [+15.011ms; +20.153ms] or [+7.596%; +10.198%]

scenario:Benchmarks.Trace.SpanBenchmark.StartFinishSpan net6.0

  • 🟩 execution_time [-27.232ms; -23.789ms] or [-12.321%; -10.764%]

scenario:Benchmarks.Trace.SpanBenchmark.StartFinishSpan netcoreapp3.1

  • 🟥 execution_time [+14.159ms; +18.484ms] or [+7.227%; +9.435%]

scenario:Benchmarks.Trace.SpanBenchmark.StartFinishTwoScopes net6.0

  • 🟥 execution_time [+16.071ms; +21.225ms] or [+8.057%; +10.640%]

scenario:Benchmarks.Trace.TraceAnnotationsBenchmark.RunOnMethodBegin netcoreapp3.1

  • 🟩 execution_time [-15.592ms; -12.034ms] or [-7.400%; -5.711%]

@dd-trace-dotnet-ci-bot
Copy link
Copy Markdown

Execution-Time Benchmarks Report ⏱️

Execution-time results for samples comparing This PR (8291) and master.

✅ No regressions detected - check the details below

Full Metrics Comparison

FakeDbCommand

Metric Master (Mean ± 95% CI) Current (Mean ± 95% CI) Change Status
.NET Framework 4.8 - Baseline
duration75.80 ± (75.78 - 76.10) ms74.15 ± (74.23 - 74.53) ms-2.2%
.NET Framework 4.8 - Bailout
duration81.01 ± (80.70 - 81.12) ms78.50 ± (78.18 - 78.53) ms-3.1%
.NET Framework 4.8 - CallTarget+Inlining+NGEN
duration1110.16 ± (1111.84 - 1118.18) ms1085.69 ± (1087.07 - 1093.48) ms-2.2%
.NET Core 3.1 - Baseline
process.internal_duration_ms23.57 ± (23.52 - 23.62) ms22.98 ± (22.93 - 23.02) ms-2.5%
process.time_to_main_ms89.76 ± (89.58 - 89.93) ms86.99 ± (86.80 - 87.17) ms-3.1%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.90 ± (10.89 - 10.90) MB10.90 ± (10.89 - 10.90) MB+0.0%✅⬆️
runtime.dotnet.threads.count12 ± (12 - 12)12 ± (12 - 12)+0.0%
.NET Core 3.1 - Bailout
process.internal_duration_ms23.45 ± (23.40 - 23.51) ms22.96 ± (22.91 - 23.01) ms-2.1%
process.time_to_main_ms90.74 ± (90.50 - 90.98) ms88.24 ± (88.05 - 88.44) ms-2.8%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.93 ± (10.92 - 10.93) MB10.93 ± (10.92 - 10.93) MB-0.0%
runtime.dotnet.threads.count13 ± (13 - 13)13 ± (13 - 13)+0.0%
.NET Core 3.1 - CallTarget+Inlining+NGEN
process.internal_duration_ms242.35 ± (238.27 - 246.44) ms250.22 ± (246.19 - 254.26) ms+3.2%✅⬆️
process.time_to_main_ms509.16 ± (508.42 - 509.89) ms494.96 ± (494.27 - 495.66) ms-2.8%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed47.55 ± (47.53 - 47.58) MB47.60 ± (47.58 - 47.62) MB+0.1%✅⬆️
runtime.dotnet.threads.count28 ± (28 - 28)28 ± (28 - 28)+0.0%✅⬆️
.NET 6 - Baseline
process.internal_duration_ms22.00 ± (21.95 - 22.04) ms21.54 ± (21.50 - 21.58) ms-2.1%
process.time_to_main_ms76.79 ± (76.60 - 76.99) ms74.40 ± (74.22 - 74.58) ms-3.1%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.61 ± (10.61 - 10.61) MB10.62 ± (10.61 - 10.62) MB+0.1%✅⬆️
runtime.dotnet.threads.count10 ± (10 - 10)10 ± (10 - 10)+0.0%
.NET 6 - Bailout
process.internal_duration_ms21.95 ± (21.90 - 22.00) ms21.49 ± (21.45 - 21.53) ms-2.1%
process.time_to_main_ms78.56 ± (78.36 - 78.76) ms75.84 ± (75.65 - 76.02) ms-3.5%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.73 ± (10.72 - 10.73) MB10.73 ± (10.73 - 10.73) MB+0.0%✅⬆️
runtime.dotnet.threads.count11 ± (11 - 11)11 ± (11 - 11)+0.0%
.NET 6 - CallTarget+Inlining+NGEN
process.internal_duration_ms260.98 ± (257.92 - 264.04) ms258.13 ± (255.71 - 260.55) ms-1.1%
process.time_to_main_ms479.95 ± (479.24 - 480.67) ms468.33 ± (467.72 - 468.95) ms-2.4%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed48.25 ± (48.23 - 48.27) MB48.33 ± (48.31 - 48.36) MB+0.2%✅⬆️
runtime.dotnet.threads.count28 ± (28 - 28)28 ± (28 - 28)-0.2%
.NET 8 - Baseline
process.internal_duration_ms20.24 ± (20.19 - 20.29) ms19.78 ± (19.75 - 19.81) ms-2.3%
process.time_to_main_ms76.21 ± (76.03 - 76.38) ms74.18 ± (74.03 - 74.33) ms-2.7%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed7.64 ± (7.64 - 7.65) MB7.68 ± (7.67 - 7.69) MB+0.5%✅⬆️
runtime.dotnet.threads.count10 ± (10 - 10)10 ± (10 - 10)+0.0%
.NET 8 - Bailout
process.internal_duration_ms20.41 ± (20.35 - 20.47) ms19.84 ± (19.79 - 19.88) ms-2.8%
process.time_to_main_ms78.15 ± (77.96 - 78.33) ms75.27 ± (75.10 - 75.44) ms-3.7%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed7.73 ± (7.72 - 7.74) MB7.71 ± (7.71 - 7.72) MB-0.2%
runtime.dotnet.threads.count11 ± (11 - 11)11 ± (11 - 11)+0.0%
.NET 8 - CallTarget+Inlining+NGEN
process.internal_duration_ms195.54 ± (194.76 - 196.33) ms192.06 ± (191.24 - 192.88) ms-1.8%
process.time_to_main_ms466.35 ± (465.65 - 467.04) ms455.22 ± (454.49 - 455.95) ms-2.4%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed36.17 ± (36.13 - 36.22) MB36.18 ± (36.14 - 36.22) MB+0.0%✅⬆️
runtime.dotnet.threads.count27 ± (27 - 27)27 ± (27 - 27)-0.0%

HttpMessageHandler

Metric Master (Mean ± 95% CI) Current (Mean ± 95% CI) Change Status
.NET Framework 4.8 - Baseline
duration196.47 ± (196.35 - 197.40) ms194.42 ± (194.46 - 195.34) ms-1.0%
.NET Framework 4.8 - Bailout
duration200.39 ± (199.95 - 200.87) ms197.80 ± (197.62 - 198.36) ms-1.3%
.NET Framework 4.8 - CallTarget+Inlining+NGEN
duration1166.41 ± (1166.42 - 1174.10) ms1143.86 ± (1144.95 - 1151.49) ms-1.9%
.NET Core 3.1 - Baseline
process.internal_duration_ms189.24 ± (188.81 - 189.67) ms188.88 ± (188.47 - 189.30) ms-0.2%
process.time_to_main_ms81.57 ± (81.32 - 81.81) ms80.86 ± (80.62 - 81.10) ms-0.9%
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed16.12 ± (16.10 - 16.15) MB16.11 ± (16.09 - 16.14) MB-0.1%
runtime.dotnet.threads.count20 ± (20 - 20)20 ± (19 - 20)-0.2%
.NET Core 3.1 - Bailout
process.internal_duration_ms189.50 ± (189.13 - 189.88) ms188.30 ± (187.94 - 188.65) ms-0.6%
process.time_to_main_ms83.29 ± (83.07 - 83.50) ms82.18 ± (82.02 - 82.34) ms-1.3%
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed16.13 ± (16.10 - 16.16) MB16.20 ± (16.17 - 16.23) MB+0.5%✅⬆️
runtime.dotnet.threads.count21 ± (20 - 21)21 ± (21 - 21)+0.5%✅⬆️
.NET Core 3.1 - CallTarget+Inlining+NGEN
process.internal_duration_ms443.93 ± (441.47 - 446.40) ms439.74 ± (437.76 - 441.72) ms-0.9%
process.time_to_main_ms479.79 ± (479.19 - 480.39) ms476.00 ± (475.43 - 476.58) ms-0.8%
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed57.69 ± (57.58 - 57.81) MB58.12 ± (57.99 - 58.25) MB+0.7%✅⬆️
runtime.dotnet.threads.count29 ± (29 - 29)29 ± (29 - 29)-0.0%
.NET 6 - Baseline
process.internal_duration_ms194.29 ± (193.90 - 194.68) ms192.70 ± (192.37 - 193.03) ms-0.8%
process.time_to_main_ms70.85 ± (70.62 - 71.07) ms70.40 ± (70.22 - 70.58) ms-0.6%
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed16.35 ± (16.32 - 16.38) MB16.15 ± (16.01 - 16.28) MB-1.2%
runtime.dotnet.threads.count19 ± (19 - 19)18 ± (18 - 19)-3.8%
.NET 6 - Bailout
process.internal_duration_ms193.44 ± (193.00 - 193.89) ms192.83 ± (192.50 - 193.15) ms-0.3%
process.time_to_main_ms71.97 ± (71.80 - 72.15) ms71.23 ± (71.14 - 71.31) ms-1.0%
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed16.40 ± (16.37 - 16.43) MB16.23 ± (16.11 - 16.36) MB-1.0%
runtime.dotnet.threads.count20 ± (20 - 20)20 ± (20 - 20)-1.7%
.NET 6 - CallTarget+Inlining+NGEN
process.internal_duration_ms458.30 ± (456.70 - 459.90) ms453.80 ± (452.14 - 455.45) ms-1.0%
process.time_to_main_ms457.34 ± (456.74 - 457.93) ms454.50 ± (453.93 - 455.07) ms-0.6%
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed58.10 ± (57.98 - 58.21) MB57.96 ± (57.85 - 58.07) MB-0.2%
runtime.dotnet.threads.count29 ± (29 - 29)29 ± (29 - 29)-0.0%
.NET 8 - Baseline
process.internal_duration_ms191.81 ± (191.52 - 192.10) ms189.80 ± (189.39 - 190.20) ms-1.0%
process.time_to_main_ms70.80 ± (70.56 - 71.04) ms69.58 ± (69.35 - 69.82) ms-1.7%
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed11.75 ± (11.73 - 11.78) MB11.75 ± (11.72 - 11.78) MB-0.1%
runtime.dotnet.threads.count18 ± (18 - 18)18 ± (18 - 18)-0.1%
.NET 8 - Bailout
process.internal_duration_ms191.30 ± (190.92 - 191.67) ms189.72 ± (189.29 - 190.14) ms-0.8%
process.time_to_main_ms71.39 ± (71.25 - 71.53) ms70.72 ± (70.56 - 70.87) ms-0.9%
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed11.81 ± (11.78 - 11.84) MB11.79 ± (11.76 - 11.82) MB-0.2%
runtime.dotnet.threads.count19 ± (19 - 19)19 ± (19 - 19)+0.3%✅⬆️
.NET 8 - CallTarget+Inlining+NGEN
process.internal_duration_ms369.48 ± (368.09 - 370.86) ms368.15 ± (366.81 - 369.48) ms-0.4%
process.time_to_main_ms438.87 ± (437.91 - 439.82) ms435.76 ± (435.02 - 436.49) ms-0.7%
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed47.78 ± (47.74 - 47.81) MB47.75 ± (47.71 - 47.79) MB-0.0%
runtime.dotnet.threads.count29 ± (29 - 29)29 ± (29 - 29)-0.3%
Comparison explanation

Execution-time benchmarks measure the whole time it takes to execute a program, and are intended to measure the one-off costs. Cases where the execution time results for the PR are worse than latest master results are highlighted in **red**. The following thresholds were used for comparing the execution times:

  • Welch test with statistical test for significance of 5%
  • Only results indicating a difference greater than 5% and 5 ms are considered.

Note that these results are based on a single point-in-time result for each branch. For full results, see the dashboard.

Graphs show the p99 interval based on the mean and StdDev of the test run, as well as the mean value of the run (shown as a diamond below the graph).

Duration charts
FakeDbCommand (.NET Framework 4.8)
gantt
    title Execution time (ms) FakeDbCommand (.NET Framework 4.8)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8291) - mean (74ms)  : 72, 77
    master - mean (76ms)  : 74, 78

    section Bailout
    This PR (8291) - mean (78ms)  : 77, 80
    master - mean (81ms)  : 79, 83

    section CallTarget+Inlining+NGEN
    This PR (8291) - mean (1,090ms)  : 1044, 1136
    master - mean (1,115ms)  : 1069, 1161

Loading
FakeDbCommand (.NET Core 3.1)
gantt
    title Execution time (ms) FakeDbCommand (.NET Core 3.1)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8291) - mean (117ms)  : 114, 120
    master - mean (121ms)  : 117, 124

    section Bailout
    This PR (8291) - mean (118ms)  : 116, 121
    master - mean (121ms)  : 118, 124

    section CallTarget+Inlining+NGEN
    This PR (8291) - mean (777ms)  : 719, 835
    master - mean (787ms)  : 721, 852

Loading
FakeDbCommand (.NET 6)
gantt
    title Execution time (ms) FakeDbCommand (.NET 6)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8291) - mean (102ms)  : 99, 106
    master - mean (105ms)  : 102, 109

    section Bailout
    This PR (8291) - mean (104ms)  : 101, 107
    master - mean (107ms)  : 105, 109

    section CallTarget+Inlining+NGEN
    This PR (8291) - mean (754ms)  : 708, 801
    master - mean (773ms)  : 719, 828

Loading
FakeDbCommand (.NET 8)
gantt
    title Execution time (ms) FakeDbCommand (.NET 8)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8291) - mean (102ms)  : 99, 105
    master - mean (104ms)  : 101, 108

    section Bailout
    This PR (8291) - mean (103ms)  : 101, 105
    master - mean (106ms)  : 104, 108

    section CallTarget+Inlining+NGEN
    This PR (8291) - mean (676ms)  : 655, 697
    master - mean (693ms)  : 674, 713

Loading
HttpMessageHandler (.NET Framework 4.8)
gantt
    title Execution time (ms) HttpMessageHandler (.NET Framework 4.8)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8291) - mean (195ms)  : 190, 200
    master - mean (197ms)  : 190, 204

    section Bailout
    This PR (8291) - mean (198ms)  : 194, 202
    master - mean (200ms)  : 195, 206

    section CallTarget+Inlining+NGEN
    This PR (8291) - mean (1,148ms)  : 1102, 1195
    master - mean (1,170ms)  : 1116, 1225

Loading
HttpMessageHandler (.NET Core 3.1)
gantt
    title Execution time (ms) HttpMessageHandler (.NET Core 3.1)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8291) - mean (278ms)  : 271, 286
    master - mean (279ms)  : 273, 286

    section Bailout
    This PR (8291) - mean (279ms)  : 274, 283
    master - mean (281ms)  : 275, 287

    section CallTarget+Inlining+NGEN
    This PR (8291) - mean (946ms)  : 910, 981
    master - mean (954ms)  : 908, 999

Loading
HttpMessageHandler (.NET 6)
gantt
    title Execution time (ms) HttpMessageHandler (.NET 6)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8291) - mean (271ms)  : 266, 276
    master - mean (274ms)  : 267, 281

    section Bailout
    This PR (8291) - mean (272ms)  : 268, 276
    master - mean (274ms)  : 267, 281

    section CallTarget+Inlining+NGEN
    This PR (8291) - mean (936ms)  : 907, 965
    master - mean (948ms)  : 910, 986

Loading
HttpMessageHandler (.NET 8)
gantt
    title Execution time (ms) HttpMessageHandler (.NET 8)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8291) - mean (269ms)  : 261, 278
    master - mean (272ms)  : 267, 278

    section Bailout
    This PR (8291) - mean (270ms)  : 265, 275
    master - mean (272ms)  : 267, 277

    section CallTarget+Inlining+NGEN
    This PR (8291) - mean (835ms)  : 820, 851
    master - mean (841ms)  : 817, 865

Loading

@bouwkast
Copy link
Copy Markdown
Collaborator Author

splitting into these

#8312
#8313

@bouwkast bouwkast closed this Mar 16, 2026
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.

1 participant