Skip to content

Conversation

@tonyredondo
Copy link
Member

Summary of changes

  • Added Exception Replay–specific agentless configuration keys and settings so snapshots can bypass the local agent when explicitly enabled.
  • Introduced an agentless transport helper (with request header injection) and taught SnapshotUploadApi/ExceptionReplay to use static debugger intakes when the agent is absent.
  • Prevented symbol uploader initialization while in agentless ER mode.
  • Expanded unit coverage for the new configuration/transport behavior, including header verification and custom intake overrides.

Reason for change

For complete Test Optimization + Exception Replay integration in environments without the Datadog Agent need a documented path to send snapshots directly to Datadog without impacting Shared Debugger/DI behaviors. The plan isolates ER agentless support, reusing DD_API_KEY/DD_SITE, and ensures we do not silently initialize features (symbol uploads) that still require the agent/RCM.

Implementation details

  • ConfigurationKeys.Debugger + ExceptionReplaySettings now surface DD_EXCEPTION_REPLAY_AGENTLESS_ENABLED/DD_EXCEPTION_REPLAY_AGENTLESS_URL, defaulting to datadoghq.com and the existing DD_API_KEY.
  • ExceptionReplayTransportFactory creates either the existing agent transport or an HTTPS transport that injects DD-API-KEY, DD-EVP-ORIGIN=dd-trace-dotnet, and a per-request DD-REQUEST-ID, honouring site overrides.
  • SnapshotUploadApi accepts a static endpoint so ER can bypass discovery when agentless, and ExceptionReplay wires the new transport info through DebuggerUploadApiFactory.
  • DebuggerManager now emits a clear log and skips symbol uploader initialization whenever ER is agentless, avoiding futile RCM attempts.

Test coverage

  • New test suite has been added.
  • Snapshot uploader tests (SnapshotUploadApiTests) continue to validate static endpoint behavior.
  • New transport tests verify header injection + override URL parsing without exposing additional public APIs.

Other details

  • Agentless mode still logs that symbol uploads are unavailable; long-term support would require backend work to accept symbol payloads without RCM.

@datadog-datadog-prod-us1

This comment has been minimized.

@tonyredondo tonyredondo marked this pull request as ready for review November 24, 2025 17:35
@tonyredondo tonyredondo requested review from a team as code owners November 24, 2025 17:35
@pr-commenter
Copy link

pr-commenter bot commented Nov 24, 2025

Benchmarks

Benchmarks Report for benchmark platform 🐌

Benchmarks for #7859 compared to master:

  • 2 benchmarks are slower, with geometric mean 2.052
  • 1 benchmarks have fewer allocations
  • 4 benchmarks have more allocations

The following thresholds were used for comparing the benchmark speeds:

  • Mann–Whitney U test with statistical test for significance of 5%
  • Only results indicating a difference greater than 10% and 0.3 ns are considered.

Allocation changes below 0.5% are ignored.

Benchmark details

Benchmarks.Trace.ActivityBenchmark - Same speed ✔️ Fewer allocations 🎉

Fewer allocations 🎉 in #7859

Benchmark Base Allocated Diff Allocated Change Change %
Benchmarks.Trace.ActivityBenchmark.StartStopWithChild‑net472 6.06 KB 6.02 KB -38 B -0.63%

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master StartStopWithChild net6.0 10.2μs 57.4ns 381ns 0 0 0 5.52 KB
master StartStopWithChild netcoreapp3.1 13.7μs 45.6ns 171ns 0 0 0 5.7 KB
master StartStopWithChild net472 22.6μs 121ns 686ns 0.966 0.322 0.107 6.06 KB
#7859 StartStopWithChild net6.0 10.8μs 53.2ns 282ns 0 0 0 5.53 KB
#7859 StartStopWithChild netcoreapp3.1 13.8μs 68.8ns 284ns 0 0 0 5.7 KB
#7859 StartStopWithChild net472 22μs 117ns 651ns 1.04 0.345 0.115 6.02 KB
Benchmarks.Trace.AgentWriterBenchmark - Unknown 🤷 Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master WriteAndFlushEnrichedTraces net6.0 N/A N/A N/A NaN NaN NaN 0 b
master WriteAndFlushEnrichedTraces netcoreapp3.1 N/A N/A N/A NaN NaN NaN 0 b
master WriteAndFlushEnrichedTraces net472 N/A N/A N/A NaN NaN NaN 0 b
#7859 WriteAndFlushEnrichedTraces net6.0 N/A N/A N/A NaN NaN NaN 0 b
#7859 WriteAndFlushEnrichedTraces netcoreapp3.1 N/A N/A N/A NaN NaN NaN 0 b
#7859 WriteAndFlushEnrichedTraces net472 N/A N/A N/A NaN NaN NaN 0 b
Benchmarks.Trace.Asm.AppSecBodyBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master AllCycleSimpleBody net6.0 1.09μs 5.7ns 28.5ns 0 0 0 1.22 KB
master AllCycleSimpleBody netcoreapp3.1 1.45μs 7.29ns 34.2ns 0 0 0 1.2 KB
master AllCycleSimpleBody net472 1.05μs 0.311ns 1.12ns 0.193 0 0 1.23 KB
master AllCycleMoreComplexBody net6.0 7.11μs 32.7ns 131ns 0 0 0 4.72 KB
master AllCycleMoreComplexBody netcoreapp3.1 9.14μs 32.4ns 126ns 0 0 0 4.62 KB
master AllCycleMoreComplexBody net472 7.62μs 6.87ns 26.6ns 0.724 0 0 4.74 KB
master ObjectExtractorSimpleBody net6.0 324ns 1.21ns 4.7ns 0 0 0 280 B
master ObjectExtractorSimpleBody netcoreapp3.1 399ns 2.11ns 8.44ns 0 0 0 272 B
master ObjectExtractorSimpleBody net472 304ns 0.251ns 0.972ns 0.0436 0 0 281 B
master ObjectExtractorMoreComplexBody net6.0 6.37μs 4.96ns 19.2ns 0 0 0 3.78 KB
master ObjectExtractorMoreComplexBody netcoreapp3.1 8.02μs 38.7ns 155ns 0 0 0 3.69 KB
master ObjectExtractorMoreComplexBody net472 6.71μs 3.53ns 13.2ns 0.573 0 0 3.8 KB
#7859 AllCycleSimpleBody net6.0 1.1μs 2.78ns 10.8ns 0 0 0 1.22 KB
#7859 AllCycleSimpleBody netcoreapp3.1 1.43μs 7.99ns 51.2ns 0 0 0 1.2 KB
#7859 AllCycleSimpleBody net472 1.04μs 0.161ns 0.581ns 0.194 0 0 1.23 KB
#7859 AllCycleMoreComplexBody net6.0 7.1μs 36.6ns 172ns 0 0 0 4.72 KB
#7859 AllCycleMoreComplexBody netcoreapp3.1 8.89μs 42.6ns 176ns 0 0 0 4.62 KB
#7859 AllCycleMoreComplexBody net472 7.53μs 2.14ns 8.27ns 0.752 0 0 4.74 KB
#7859 ObjectExtractorSimpleBody net6.0 318ns 1.81ns 12.8ns 0 0 0 280 B
#7859 ObjectExtractorSimpleBody netcoreapp3.1 396ns 2.04ns 10ns 0 0 0 272 B
#7859 ObjectExtractorSimpleBody net472 301ns 0.214ns 0.828ns 0.0436 0 0 281 B
#7859 ObjectExtractorMoreComplexBody net6.0 6.33μs 28ns 108ns 0 0 0 3.78 KB
#7859 ObjectExtractorMoreComplexBody netcoreapp3.1 7.92μs 28.9ns 112ns 0 0 0 3.69 KB
#7859 ObjectExtractorMoreComplexBody net472 6.67μs 1.1ns 4.26ns 0.602 0 0 3.8 KB
Benchmarks.Trace.Asm.AppSecEncoderBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master EncodeArgs net6.0 77.5μs 34.9ns 130ns 0 0 0 32.4 KB
master EncodeArgs netcoreapp3.1 98.2μs 59.3ns 230ns 0 0 0 32.4 KB
master EncodeArgs net472 109μs 7.62ns 27.5ns 4.89 0 0 32.51 KB
master EncodeLegacyArgs net6.0 146μs 43.2ns 167ns 0 0 0 2.15 KB
master EncodeLegacyArgs netcoreapp3.1 197μs 181ns 626ns 0 0 0 2.14 KB
master EncodeLegacyArgs net472 266μs 22ns 85.4ns 0 0 0 2.16 KB
#7859 EncodeArgs net6.0 77.6μs 197ns 765ns 0 0 0 32.4 KB
#7859 EncodeArgs netcoreapp3.1 97.2μs 200ns 773ns 0 0 0 32.4 KB
#7859 EncodeArgs net472 110μs 63.3ns 245ns 4.94 0 0 32.51 KB
#7859 EncodeLegacyArgs net6.0 143μs 85.2ns 330ns 0 0 0 2.15 KB
#7859 EncodeLegacyArgs netcoreapp3.1 199μs 176ns 680ns 0 0 0 2.15 KB
#7859 EncodeLegacyArgs net472 262μs 147ns 548ns 0 0 0 2.16 KB
Benchmarks.Trace.Asm.AppSecWafBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master RunWafRealisticBenchmark net6.0 428μs 2.03μs 10.3μs 0 0 0 5.82 KB
master RunWafRealisticBenchmark netcoreapp3.1 473μs 3.69μs 35μs 0 0 0 4.58 KB
master RunWafRealisticBenchmark net472 493μs 518ns 1.94μs 0 0 0 0 b
master RunWafRealisticBenchmarkWithAttack net6.0 315μs 996ns 3.59μs 0 0 0 2.54 KB
master RunWafRealisticBenchmarkWithAttack netcoreapp3.1 356μs 3.4μs 33μs 0 0 0 2.32 KB
master RunWafRealisticBenchmarkWithAttack net472 370μs 183ns 658ns 0 0 0 0 b
#7859 RunWafRealisticBenchmark net6.0 461μs 1.28μs 4.63μs 0 0 0 5.82 KB
#7859 RunWafRealisticBenchmark netcoreapp3.1 479μs 3.86μs 37.4μs 0 0 0 4.58 KB
#7859 RunWafRealisticBenchmark net472 527μs 514ns 1.85μs 0 0 0 0 b
#7859 RunWafRealisticBenchmarkWithAttack net6.0 356μs 2.1μs 20.8μs 0 0 0 2.54 KB
#7859 RunWafRealisticBenchmarkWithAttack netcoreapp3.1 356μs 3.21μs 30.8μs 0 0 0 2.32 KB
#7859 RunWafRealisticBenchmarkWithAttack net472 398μs 518ns 1.94μs 0 0 0 0 b
Benchmarks.Trace.AspNetCoreBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master SendRequest net6.0 60.8μs 37.8ns 136ns 0 0 0 14.52 KB
master SendRequest netcoreapp3.1 72.1μs 262ns 1.23μs 0 0 0 17.42 KB
master SendRequest net472 0.0113ns 0.0027ns 0.0105ns 0 0 0 0 b
#7859 SendRequest net6.0 61.6μs 44.9ns 162ns 0 0 0 14.52 KB
#7859 SendRequest netcoreapp3.1 72.5μs 162ns 585ns 0 0 0 17.42 KB
#7859 SendRequest net472 0.16ns 0.00396ns 0.0153ns 0 0 0 0 b
Benchmarks.Trace.CharSliceBenchmark - Slower ⚠️ Same allocations ✔️

Slower ⚠️ in #7859

Benchmark diff/base Base Median (ns) Diff Median (ns) Modality
Benchmarks.Trace.CharSliceBenchmark.OptimizedCharSlice‑netcoreapp3.1 1.651 1,719,500.00 2,839,200.00

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master OriginalCharSlice net6.0 1.96ms 1.05μs 4.07μs 0 0 0 640.98 KB
master OriginalCharSlice netcoreapp3.1 4ms 1.3μs 4.87μs 0 0 0 640.1 KB
master OriginalCharSlice net472 2.61ms 712ns 2.47μs 0 0 0 647.17 KB
master OptimizedCharSlice net6.0 1.57ms 2.12μs 8.2μs 0 0 0 304 B
master OptimizedCharSlice netcoreapp3.1 1.72ms 757ns 4.96μs 0 0 0 104 B
master OptimizedCharSlice net472 2.1ms 742ns 2.87μs 0 0 0 0 b
master OptimizedCharSliceWithPool net6.0 1.06ms 1.04μs 4.03μs 0 0 0 304 B
master OptimizedCharSliceWithPool netcoreapp3.1 1.86ms 1.86μs 7.2μs 0 0 0 104 B
master OptimizedCharSliceWithPool net472 1.17ms 330ns 1.19μs 0 0 0 0 b
#7859 OriginalCharSlice net6.0 1.96ms 2.1μs 8.15μs 0 0 0 640.98 KB
#7859 OriginalCharSlice netcoreapp3.1 3.96ms 974ns 3.51μs 0 0 0 640.1 KB
#7859 OriginalCharSlice net472 2.56ms 744ns 2.88μs 0 0 0 647.17 KB
#7859 OptimizedCharSlice net6.0 1.41ms 1.15μs 4.44μs 0 0 0 304 B
#7859 OptimizedCharSlice netcoreapp3.1 2.84ms 1.13μs 4.07μs 0 0 0 104 B
#7859 OptimizedCharSlice net472 2.12ms 1.99μs 7.69μs 0 0 0 0 b
#7859 OptimizedCharSliceWithPool net6.0 1.17ms 478ns 1.72μs 0 0 0 304 B
#7859 OptimizedCharSliceWithPool netcoreapp3.1 1.91ms 2.24μs 8.67μs 0 0 0 104 B
#7859 OptimizedCharSliceWithPool net472 1.17ms 584ns 2.18μs 0 0 0 0 b
Benchmarks.Trace.CIVisibilityProtocolWriterBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master WriteAndFlushEnrichedTraces net6.0 779μs 3.73μs 15.4μs 0 0 0 42 KB
master WriteAndFlushEnrichedTraces netcoreapp3.1 749μs 4.22μs 30.1μs 0 0 0 41.81 KB
master WriteAndFlushEnrichedTraces net472 851μs 2.35μs 8.46μs 8.33 0 0 56.25 KB
#7859 WriteAndFlushEnrichedTraces net6.0 710μs 1.6μs 6.19μs 0 0 0 41.89 KB
#7859 WriteAndFlushEnrichedTraces netcoreapp3.1 730μs 1.07μs 3.84μs 0 0 0 41.8 KB
#7859 WriteAndFlushEnrichedTraces net472 942μs 2.39μs 8.95μs 8.33 0 0 56.42 KB
Benchmarks.Trace.DbCommandBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master ExecuteNonQuery net6.0 2.01μs 10.3ns 47.2ns 0 0 0 1.02 KB
master ExecuteNonQuery netcoreapp3.1 2.57μs 8.92ns 34.6ns 0 0 0 1.02 KB
master ExecuteNonQuery net472 2.69μs 1.1ns 4.11ns 0.149 0 0 987 B
#7859 ExecuteNonQuery net6.0 1.94μs 0.732ns 2.64ns 0 0 0 1.02 KB
#7859 ExecuteNonQuery netcoreapp3.1 2.54μs 11.8ns 47.4ns 0 0 0 1.02 KB
#7859 ExecuteNonQuery net472 2.68μs 1.38ns 5.33ns 0.147 0 0 987 B
Benchmarks.Trace.ElasticsearchBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master CallElasticsearch net6.0 1.78μs 9.16ns 43.9ns 0 0 0 1.03 KB
master CallElasticsearch netcoreapp3.1 2.21μs 10.6ns 43.9ns 0 0 0 1.03 KB
master CallElasticsearch net472 3.46μs 5.36ns 20.7ns 0.157 0 0 1.04 KB
master CallElasticsearchAsync net6.0 1.82μs 0.439ns 1.7ns 0 0 0 1.01 KB
master CallElasticsearchAsync netcoreapp3.1 2.4μs 11.2ns 46.1ns 0 0 0 1.08 KB
master CallElasticsearchAsync net472 3.62μs 0.952ns 3.69ns 0.164 0 0 1.1 KB
#7859 CallElasticsearch net6.0 1.84μs 1.24ns 4.63ns 0 0 0 1.03 KB
#7859 CallElasticsearch netcoreapp3.1 2.37μs 6.29ns 23.5ns 0 0 0 1.03 KB
#7859 CallElasticsearch net472 3.4μs 2.31ns 8.66ns 0.154 0 0 1.04 KB
#7859 CallElasticsearchAsync net6.0 1.79μs 5.47ns 21.2ns 0 0 0 1.01 KB
#7859 CallElasticsearchAsync netcoreapp3.1 2.48μs 8.5ns 32.9ns 0 0 0 1.08 KB
#7859 CallElasticsearchAsync net472 3.68μs 4.89ns 18.9ns 0.169 0 0 1.1 KB
Benchmarks.Trace.GraphQLBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master ExecuteAsync net6.0 1.86μs 8.56ns 33.1ns 0 0 0 952 B
master ExecuteAsync netcoreapp3.1 2.45μs 6.92ns 25.9ns 0 0 0 952 B
master ExecuteAsync net472 2.56μs 0.927ns 3.47ns 0.141 0 0 915 B
#7859 ExecuteAsync net6.0 1.79μs 8.47ns 36ns 0 0 0 952 B
#7859 ExecuteAsync netcoreapp3.1 2.48μs 10.6ns 41.1ns 0 0 0 952 B
#7859 ExecuteAsync net472 2.52μs 1.77ns 6.61ns 0.14 0 0 915 B
Benchmarks.Trace.HttpClientBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master SendAsync net6.0 7.05μs 3.85ns 14.9ns 0 0 0 2.36 KB
master SendAsync netcoreapp3.1 8.47μs 24.3ns 91ns 0 0 0 2.9 KB
master SendAsync net472 12.2μs 15.4ns 59.6ns 0.487 0 0 3.18 KB
#7859 SendAsync net6.0 6.8μs 2.79ns 9.66ns 0 0 0 2.36 KB
#7859 SendAsync netcoreapp3.1 8.74μs 40.4ns 157ns 0 0 0 2.9 KB
#7859 SendAsync net472 12.5μs 9.24ns 35.8ns 0.498 0 0 3.18 KB
Benchmarks.Trace.Iast.StringAspectsBenchmark - Slower ⚠️ More allocations ⚠️

Slower ⚠️ in #7859

Benchmark diff/base Base Median (ns) Diff Median (ns) Modality
Benchmarks.Trace.Iast.StringAspectsBenchmark.StringConcatAspectBenchmark‑netcoreapp3.1 2.549 512,300.00 1,306,050.00

More allocations ⚠️ in #7859

Benchmark Base Allocated Diff Allocated Change Change %
Benchmarks.Trace.Iast.StringAspectsBenchmark.StringConcatAspectBenchmark‑netcoreapp3.1 274.94 KB 317.93 KB 42.98 KB 15.63%
Benchmarks.Trace.Iast.StringAspectsBenchmark.StringConcatAspectBenchmark‑net6.0 260.15 KB 275.49 KB 15.34 KB 5.90%
Benchmarks.Trace.Iast.StringAspectsBenchmark.StringConcatAspectBenchmark‑net472 283.58 KB 290.31 KB 6.74 KB 2.38%
Benchmarks.Trace.Iast.StringAspectsBenchmark.StringConcatBenchmark‑net6.0 43.5 KB 43.76 KB 264 B 0.61%

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master StringConcatBenchmark net6.0 49.3μs 291ns 2.65μs 0 0 0 43.5 KB
master StringConcatBenchmark netcoreapp3.1 50.2μs 284ns 1.84μs 0 0 0 42.68 KB
master StringConcatBenchmark net472 57.3μs 306ns 1.56μs 0 0 0 57.34 KB
master StringConcatAspectBenchmark net6.0 470μs 2.16μs 7.77μs 0 0 0 260.15 KB
master StringConcatAspectBenchmark netcoreapp3.1 514μs 1.33μs 4.79μs 0 0 0 274.94 KB
master StringConcatAspectBenchmark net472 403μs 2.07μs 9.92μs 0 0 0 283.58 KB
#7859 StringConcatBenchmark net6.0 46.1μs 266ns 1.9μs 0 0 0 43.76 KB
#7859 StringConcatBenchmark netcoreapp3.1 51.4μs 349ns 3.27μs 0 0 0 42.81 KB
#7859 StringConcatBenchmark net472 58.2μs 213ns 798ns 0 0 0 57.34 KB
#7859 StringConcatAspectBenchmark net6.0 461μs 2.28μs 10.4μs 0 0 0 275.49 KB
#7859 StringConcatAspectBenchmark netcoreapp3.1 1.31ms 2.83μs 10.6μs 0 0 0 317.93 KB
#7859 StringConcatAspectBenchmark net472 405μs 2.11μs 10.1μs 0 0 0 290.31 KB
Benchmarks.Trace.ILoggerBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master EnrichedLog net6.0 2.74μs 5.4ns 20.9ns 0 0 0 1.7 KB
master EnrichedLog netcoreapp3.1 3.59μs 17.3ns 69ns 0 0 0 1.7 KB
master EnrichedLog net472 3.98μs 5.98ns 23.2ns 0.255 0 0 1.64 KB
#7859 EnrichedLog net6.0 2.69μs 12.9ns 54.6ns 0 0 0 1.7 KB
#7859 EnrichedLog netcoreapp3.1 3.62μs 11.9ns 44.5ns 0 0 0 1.7 KB
#7859 EnrichedLog net472 3.92μs 2.55ns 9.89ns 0.253 0 0 1.64 KB
Benchmarks.Trace.Log4netBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master EnrichedLog net6.0 123μs 80.3ns 301ns 0 0 0 4.31 KB
master EnrichedLog netcoreapp3.1 126μs 154ns 597ns 0 0 0 4.31 KB
master EnrichedLog net472 167μs 68.9ns 249ns 0 0 0 4.52 KB
#7859 EnrichedLog net6.0 123μs 72.6ns 281ns 0 0 0 4.31 KB
#7859 EnrichedLog netcoreapp3.1 127μs 79.6ns 276ns 0 0 0 4.31 KB
#7859 EnrichedLog net472 169μs 69.3ns 268ns 0 0 0 4.52 KB
Benchmarks.Trace.NLogBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master EnrichedLog net6.0 5.01μs 15.8ns 61.2ns 0 0 0 2.26 KB
master EnrichedLog netcoreapp3.1 6.76μs 19.4ns 72.7ns 0 0 0 2.26 KB
master EnrichedLog net472 7.71μs 5.74ns 22.2ns 0.309 0 0 2.08 KB
#7859 EnrichedLog net6.0 4.93μs 22.9ns 88.6ns 0 0 0 2.26 KB
#7859 EnrichedLog netcoreapp3.1 6.8μs 27.4ns 106ns 0 0 0 2.26 KB
#7859 EnrichedLog net472 7.88μs 8.63ns 33.4ns 0.315 0 0 2.08 KB
Benchmarks.Trace.RedisBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master SendReceive net6.0 1.99μs 9.57ns 39.5ns 0 0 0 1.2 KB
master SendReceive netcoreapp3.1 2.57μs 12.9ns 54.8ns 0 0 0 1.2 KB
master SendReceive net472 3.09μs 2.31ns 8.93ns 0.184 0 0 1.2 KB
#7859 SendReceive net6.0 2.03μs 10.4ns 46.6ns 0 0 0 1.2 KB
#7859 SendReceive netcoreapp3.1 2.58μs 12.8ns 58.7ns 0 0 0 1.2 KB
#7859 SendReceive net472 3.12μs 2.29ns 8.88ns 0.188 0 0 1.2 KB
Benchmarks.Trace.SerilogBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master EnrichedLog net6.0 4.52μs 3.24ns 12.6ns 0 0 0 1.58 KB
master EnrichedLog netcoreapp3.1 5.75μs 5.7ns 22.1ns 0 0 0 1.63 KB
master EnrichedLog net472 6.39μs 7.17ns 27.8ns 0.316 0 0 2.03 KB
#7859 EnrichedLog net6.0 4.27μs 17ns 65.9ns 0 0 0 1.58 KB
#7859 EnrichedLog netcoreapp3.1 5.67μs 13.8ns 51.5ns 0 0 0 1.63 KB
#7859 EnrichedLog net472 6.49μs 7.44ns 28.8ns 0.291 0 0 2.03 KB
Benchmarks.Trace.SpanBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master StartFinishSpan net6.0 822ns 4.39ns 22.4ns 0 0 0 576 B
master StartFinishSpan netcoreapp3.1 984ns 4.9ns 22.4ns 0 0 0 576 B
master StartFinishSpan net472 899ns 0.272ns 1.05ns 0.0906 0 0 578 B
master StartFinishScope net6.0 1.01μs 0.182ns 0.704ns 0 0 0 696 B
master StartFinishScope netcoreapp3.1 1.14μs 5.93ns 29.6ns 0 0 0 696 B
master StartFinishScope net472 1.11μs 0.318ns 1.14ns 0.1 0 0 658 B
#7859 StartFinishSpan net6.0 808ns 3.69ns 14.8ns 0 0 0 576 B
#7859 StartFinishSpan netcoreapp3.1 984ns 4.85ns 21.7ns 0 0 0 576 B
#7859 StartFinishSpan net472 903ns 0.0457ns 0.165ns 0.0901 0 0 578 B
#7859 StartFinishScope net6.0 942ns 2.01ns 7.24ns 0 0 0 696 B
#7859 StartFinishScope netcoreapp3.1 1.14μs 6.28ns 37.1ns 0 0 0 696 B
#7859 StartFinishScope net472 1.09μs 0.223ns 0.863ns 0.104 0 0 658 B
Benchmarks.Trace.TraceAnnotationsBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master RunOnMethodBegin net6.0 1.09μs 5.77ns 31ns 0 0 0 696 B
master RunOnMethodBegin netcoreapp3.1 1.45μs 7.23ns 33.1ns 0 0 0 696 B
master RunOnMethodBegin net472 1.41μs 1.7ns 6.15ns 0.0987 0 0 658 B
#7859 RunOnMethodBegin net6.0 1.08μs 5.5ns 24.6ns 0 0 0 696 B
#7859 RunOnMethodBegin netcoreapp3.1 1.39μs 6.92ns 30.2ns 0 0 0 696 B
#7859 RunOnMethodBegin net472 1.45μs 0.737ns 2.85ns 0.101 0 0 658 B

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

dd-trace-dotnet-ci-bot bot commented Nov 24, 2025

Execution-Time Benchmarks Report ⏱️

Execution-time results for samples comparing This PR (7859) 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
duration74.40 ± (74.47 - 75.23) ms75.47 ± (75.42 - 76.12) ms+1.4%✅⬆️
.NET Framework 4.8 - Bailout
duration80.15 ± (80.08 - 80.80) ms79.83 ± (79.72 - 80.32) ms-0.4%
.NET Framework 4.8 - CallTarget+Inlining+NGEN
duration1061.68 ± (1061.32 - 1068.47) ms1072.94 ± (1071.93 - 1080.20) ms+1.1%✅⬆️
.NET Core 3.1 - Baseline
process.internal_duration_ms23.03 ± (22.94 - 23.11) ms22.93 ± (22.86 - 23.00) ms-0.4%
process.time_to_main_ms88.29 ± (87.88 - 88.69) ms87.72 ± (87.37 - 88.08) ms-0.6%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.95 ± (10.94 - 10.95) MB10.93 ± (10.93 - 10.93) MB-0.2%
runtime.dotnet.threads.count12 ± (12 - 12)12 ± (12 - 12)+0.0%
.NET Core 3.1 - Bailout
process.internal_duration_ms22.82 ± (22.76 - 22.89) ms22.95 ± (22.87 - 23.03) ms+0.6%✅⬆️
process.time_to_main_ms89.38 ± (89.01 - 89.76) ms89.84 ± (89.41 - 90.26) ms+0.5%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.98 ± (10.98 - 10.98) MB10.97 ± (10.97 - 10.98) MB-0.0%
runtime.dotnet.threads.count13 ± (13 - 13)13 ± (13 - 13)+0.0%
.NET Core 3.1 - CallTarget+Inlining+NGEN
process.internal_duration_ms222.87 ± (221.46 - 224.27) ms221.04 ± (219.54 - 222.54) ms-0.8%
process.time_to_main_ms503.54 ± (502.44 - 504.64) ms502.45 ± (501.25 - 503.65) ms-0.2%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed47.89 ± (47.86 - 47.91) MB47.98 ± (47.96 - 48.00) MB+0.2%✅⬆️
runtime.dotnet.threads.count28 ± (28 - 28)28 ± (28 - 28)-0.1%
.NET 6 - Baseline
process.internal_duration_ms21.76 ± (21.69 - 21.82) ms21.77 ± (21.70 - 21.83) ms+0.0%✅⬆️
process.time_to_main_ms77.03 ± (76.75 - 77.31) ms77.21 ± (76.91 - 77.51) ms+0.2%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.63 ± (10.63 - 10.63) MB10.65 ± (10.65 - 10.65) MB+0.2%✅⬆️
runtime.dotnet.threads.count10 ± (10 - 10)10 ± (10 - 10)+0.0%
.NET 6 - Bailout
process.internal_duration_ms21.49 ± (21.43 - 21.55) ms21.44 ± (21.37 - 21.52) ms-0.2%
process.time_to_main_ms76.68 ± (76.39 - 76.97) ms77.13 ± (76.68 - 77.57) ms+0.6%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.68 ± (10.67 - 10.68) MB10.75 ± (10.75 - 10.75) MB+0.7%✅⬆️
runtime.dotnet.threads.count11 ± (11 - 11)11 ± (11 - 11)+0.0%
.NET 6 - CallTarget+Inlining+NGEN
process.internal_duration_ms212.47 ± (211.38 - 213.57) ms212.36 ± (211.33 - 213.40) ms-0.1%
process.time_to_main_ms471.73 ± (470.67 - 472.78) ms470.12 ± (469.07 - 471.17) ms-0.3%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed48.12 ± (48.09 - 48.16) MB48.18 ± (48.15 - 48.20) MB+0.1%✅⬆️
runtime.dotnet.threads.count28 ± (28 - 28)28 ± (28 - 28)+0.0%✅⬆️
.NET 8 - Baseline
process.internal_duration_ms20.04 ± (19.97 - 20.11) ms19.98 ± (19.92 - 20.04) ms-0.3%
process.time_to_main_ms76.84 ± (76.49 - 77.18) ms76.29 ± (75.97 - 76.62) ms-0.7%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed7.70 ± (7.70 - 7.71) MB7.67 ± (7.66 - 7.67) MB-0.5%
runtime.dotnet.threads.count10 ± (10 - 10)10 ± (10 - 10)+0.0%
.NET 8 - Bailout
process.internal_duration_ms19.81 ± (19.75 - 19.86) ms19.86 ± (19.80 - 19.93) ms+0.3%✅⬆️
process.time_to_main_ms76.57 ± (76.29 - 76.85) ms76.24 ± (75.90 - 76.57) ms-0.4%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed7.74 ± (7.74 - 7.75) MB7.72 ± (7.72 - 7.73) MB-0.2%
runtime.dotnet.threads.count11 ± (11 - 11)11 ± (11 - 11)+0.0%
.NET 8 - CallTarget+Inlining+NGEN
process.internal_duration_ms194.84 ± (193.71 - 195.97) ms192.91 ± (191.89 - 193.93) ms-1.0%
process.time_to_main_ms458.46 ± (457.43 - 459.49) ms456.12 ± (455.14 - 457.11) ms-0.5%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed36.51 ± (36.47 - 36.55) MB36.40 ± (36.36 - 36.44) MB-0.3%
runtime.dotnet.threads.count27 ± (27 - 27)27 ± (27 - 27)+0.1%✅⬆️

HttpMessageHandler

Metric Master (Mean ± 95% CI) Current (Mean ± 95% CI) Change Status
.NET Framework 4.8 - Baseline
duration193.54 ± (193.58 - 194.38) ms193.12 ± (193.08 - 194.09) ms-0.2%
.NET Framework 4.8 - Bailout
duration196.79 ± (196.70 - 197.15) ms196.48 ± (196.39 - 196.99) ms-0.2%
.NET Framework 4.8 - CallTarget+Inlining+NGEN
duration1111.46 ± (1117.39 - 1126.64) ms1110.40 ± (1109.22 - 1118.93) ms-0.1%
.NET Core 3.1 - Baseline
process.internal_duration_ms188.34 ± (188.01 - 188.67) ms188.39 ± (188.04 - 188.73) ms+0.0%✅⬆️
process.time_to_main_ms80.62 ± (80.45 - 80.80) ms80.80 ± (80.60 - 80.99) ms+0.2%✅⬆️
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed16.12 ± (16.09 - 16.15) MB16.05 ± (16.03 - 16.08) MB-0.4%
runtime.dotnet.threads.count20 ± (19 - 20)20 ± (20 - 20)+0.5%✅⬆️
.NET Core 3.1 - Bailout
process.internal_duration_ms187.18 ± (186.88 - 187.47) ms187.29 ± (187.05 - 187.53) ms+0.1%✅⬆️
process.time_to_main_ms82.02 ± (81.90 - 82.13) ms82.09 ± (81.96 - 82.21) ms+0.1%✅⬆️
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed16.18 ± (16.15 - 16.21) MB16.21 ± (16.17 - 16.24) MB+0.2%✅⬆️
runtime.dotnet.threads.count21 ± (21 - 21)20 ± (20 - 20)-1.8%
.NET Core 3.1 - CallTarget+Inlining+NGEN
process.internal_duration_ms393.98 ± (391.82 - 396.14) ms398.27 ± (395.77 - 400.76) ms+1.1%✅⬆️
process.time_to_main_ms474.57 ± (474.01 - 475.13) ms474.57 ± (473.96 - 475.17) ms-0.0%
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed58.54 ± (58.40 - 58.69) MB58.52 ± (58.38 - 58.66) MB-0.0%
runtime.dotnet.threads.count29 ± (29 - 30)29 ± (29 - 29)-0.0%
.NET 6 - Baseline
process.internal_duration_ms194.02 ± (193.57 - 194.46) ms192.39 ± (191.99 - 192.79) ms-0.8%
process.time_to_main_ms70.57 ± (70.38 - 70.77) ms70.03 ± (69.86 - 70.19) ms-0.8%
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed16.39 ± (16.35 - 16.42) MB16.26 ± (16.16 - 16.36) MB-0.8%
runtime.dotnet.threads.count19 ± (19 - 19)18 ± (18 - 19)-3.4%
.NET 6 - Bailout
process.internal_duration_ms192.34 ± (192.07 - 192.60) ms191.10 ± (190.80 - 191.41) ms-0.6%
process.time_to_main_ms71.07 ± (70.99 - 71.15) ms70.72 ± (70.62 - 70.83) ms-0.5%
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed16.44 ± (16.37 - 16.51) MB15.99 ± (15.83 - 16.16) MB-2.7%
runtime.dotnet.threads.count20 ± (20 - 20)19 ± (19 - 19)-3.5%
.NET 6 - CallTarget+Inlining+NGEN
process.internal_duration_ms407.44 ± (405.36 - 409.53) ms409.84 ± (408.02 - 411.66) ms+0.6%✅⬆️
process.time_to_main_ms442.60 ± (442.01 - 443.20) ms443.76 ± (443.12 - 444.40) ms+0.3%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed58.86 ± (58.72 - 59.01) MB59.24 ± (59.12 - 59.35) MB+0.6%✅⬆️
runtime.dotnet.threads.count30 ± (29 - 30)29 ± (29 - 30)-0.2%
.NET 8 - Baseline
process.internal_duration_ms190.88 ± (190.49 - 191.26) ms190.97 ± (190.60 - 191.34) ms+0.0%✅⬆️
process.time_to_main_ms69.70 ± (69.52 - 69.89) ms69.79 ± (69.56 - 70.01) ms+0.1%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed11.72 ± (11.70 - 11.75) MB11.75 ± (11.72 - 11.78) MB+0.2%✅⬆️
runtime.dotnet.threads.count18 ± (18 - 18)18 ± (18 - 18)-0.8%
.NET 8 - Bailout
process.internal_duration_ms189.60 ± (189.39 - 189.80) ms189.92 ± (189.62 - 190.22) ms+0.2%✅⬆️
process.time_to_main_ms70.29 ± (70.20 - 70.37) ms70.47 ± (70.36 - 70.58) ms+0.3%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed11.82 ± (11.79 - 11.85) MB11.79 ± (11.77 - 11.81) MB-0.2%
runtime.dotnet.threads.count19 ± (19 - 19)19 ± (19 - 19)+0.5%✅⬆️
.NET 8 - CallTarget+Inlining+NGEN
process.internal_duration_ms367.25 ± (365.83 - 368.66) ms364.54 ± (362.82 - 366.25) ms-0.7%
process.time_to_main_ms430.23 ± (429.64 - 430.81) ms427.51 ± (426.82 - 428.20) ms-0.6%
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed47.95 ± (47.92 - 47.98) MB47.93 ± (47.89 - 47.96) MB-0.0%
runtime.dotnet.threads.count29 ± (29 - 29)29 ± (29 - 29)-0.1%
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 (7859) - mean (76ms)  : 71, 81
    master - mean (75ms)  : 69, 81

    section Bailout
    This PR (7859) - mean (80ms)  : 76, 84
    master - mean (80ms)  : 75, 86

    section CallTarget+Inlining+NGEN
    This PR (7859) - mean (1,076ms)  : 1014, 1138
    master - mean (1,065ms)  : 1013, 1117

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 (7859) - mean (118ms)  : 112, 125
    master - mean (119ms)  : 111, 127

    section Bailout
    This PR (7859) - mean (120ms)  : 111, 130
    master - mean (120ms)  : 113, 127

    section CallTarget+Inlining+NGEN
    This PR (7859) - mean (766ms)  : 722, 809
    master - mean (765ms)  : 733, 797

Loading
FakeDbCommand (.NET 6)
gantt
    title Execution time (ms) FakeDbCommand (.NET 6)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (7859) - mean (106ms)  : 101, 112
    master - mean (106ms)  : 101, 112

    section Bailout
    This PR (7859) - mean (105ms)  : 99, 112
    master - mean (105ms)  : 100, 111

    section CallTarget+Inlining+NGEN
    This PR (7859) - mean (722ms)  : 692, 751
    master - mean (722ms)  : 688, 755

Loading
FakeDbCommand (.NET 8)
gantt
    title Execution time (ms) FakeDbCommand (.NET 8)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (7859) - mean (105ms)  : 99, 111
    master - mean (106ms)  : 99, 112

    section Bailout
    This PR (7859) - mean (105ms)  : 98, 111
    master - mean (105ms)  : 100, 110

    section CallTarget+Inlining+NGEN
    This PR (7859) - mean (690ms)  : 666, 714
    master - mean (696ms)  : 666, 725

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 (7859) - mean (194ms)  : 189, 199
    master - mean (194ms)  : 190, 198

    section Bailout
    This PR (7859) - mean (197ms)  : 194, 200
    master - mean (197ms)  : 195, 199

    section CallTarget+Inlining+NGEN
    This PR (7859) - mean (1,114ms)  : 1062, 1166
    master - mean (1,122ms)  : 1051, 1193

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 (7859) - mean (278ms)  : 273, 282
    master - mean (277ms)  : 273, 282

    section Bailout
    This PR (7859) - mean (278ms)  : 275, 281
    master - mean (277ms)  : 273, 282

    section CallTarget+Inlining+NGEN
    This PR (7859) - mean (909ms)  : 860, 959
    master - mean (909ms)  : 866, 952

Loading
HttpMessageHandler (.NET 6)
gantt
    title Execution time (ms) HttpMessageHandler (.NET 6)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (7859) - mean (271ms)  : 265, 276
    master - mean (273ms)  : 266, 279

    section Bailout
    This PR (7859) - mean (270ms)  : 266, 273
    master - mean (271ms)  : 268, 274

    section CallTarget+Inlining+NGEN
    This PR (7859) - mean (886ms)  : 856, 916
    master - mean (884ms)  : 841, 926

Loading
HttpMessageHandler (.NET 8)
gantt
    title Execution time (ms) HttpMessageHandler (.NET 8)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (7859) - mean (271ms)  : 264, 277
    master - mean (270ms)  : 263, 277

    section Bailout
    This PR (7859) - mean (270ms)  : 266, 274
    master - mean (269ms)  : 266, 273

    section CallTarget+Inlining+NGEN
    This PR (7859) - mean (823ms)  : 803, 844
    master - mean (829ms)  : 808, 849

Loading

@tonyredondo tonyredondo changed the title [Debugger] Add agent-less support to Exception Replay [Debugger-Test Optimization] Add agent-less support to ER Nov 25, 2025
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.

3 participants