Skip to content

Add container tags hash to DBM queries (if enabled)#8061

Open
vandonr wants to merge 22 commits intomasterfrom
vandonr/process2
Open

Add container tags hash to DBM queries (if enabled)#8061
vandonr wants to merge 22 commits intomasterfrom
vandonr/process2

Conversation

@vandonr
Copy link
Contributor

@vandonr vandonr commented Jan 14, 2026

Summary of changes

Add the ability to write the container tags hash to DBM queries + to the related span.
The goal is that DBM would then query the spans bearing that hash, and then use the container tags on this (those) spans(s) to enrich the queries with it.
This is controlled by a setting that is disabled by default, and would be enabled if propagation mode is "service" or greater

see RFC: https://docs.google.com/document/d/15GtNOKGBCt6Dc-HsDNnMmCdZwhewFQx8yUlI9in5n3M
related PR in python: DataDog/dd-trace-py#15293

Reason for change

Implementation details

Test coverage

Adding a test in DbScopeFactoryTests.cs forced me to inject the value from pretty high, which I find a bit "dirty", but at least we don't have to rely on global static instance in tests.

Other details

vandonr and others added 10 commits December 2, 2025 18:03
## Summary of changes
Replaced custom mutex guard with `std::lock_guard`, using
`std::recursive_mutex` instead of `CRITICAL_SECTION` in windows and
`std::mutex` with railings in Linux

## Reason for change
Some locks have been spotted in smoke test wich could be cause by the
lack of thread recursive lock in the `std::mutex`

## Implementation details

## Test coverage

## Other details
<!-- Fixes #{issue} -->


<!--  ⚠️ Note:

Where possible, please obtain 2 approvals prior to merging. Unless
CODEOWNERS specifies otherwise, for external teams it is typically best
to have one review from a team member, and one review from apm-dotnet.
Trivial changes do not require 2 reviews.

MergeQueue is NOT enabled in this repository. If you have write access
to the repo, the PR has 1-2 approvals (see above), and all of the
required checks have passed, you can use the Squash and Merge button to
merge the PR. If you don't have write access, or you need help, reach
out in the #apm-dotnet channel in Slack.
-->
@vandonr vandonr requested review from a team as code owners January 14, 2026 15:03
Copy link

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 4fd01fab6f

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines 104 to +108
else
{
// PropagateDataViaComment (service) - this injects varius trace information as a comment in the query
if (tracer.Settings.InjectSqlBasehash && !string.IsNullOrEmpty(baseHash))
{
tags.BaseHash = baseHash;

Choose a reason for hiding this comment

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

P2 Badge Set BaseHash even when DBM comment already present

This new BaseHash tagging only happens in the else branch when the command text is not already DBM-injected. In the cached‑command scenario (or when users pre‑inject DBM comments), alreadyInjected is true, so _dd.propagated_hash is never set on subsequent spans even though the query still carries ddsh in the SQL comment. If DBM looks up container tags by scanning recent spans for that hash, later queries can’t be enriched once the first span ages out. Consider setting tags.BaseHash whenever the feature is enabled (and baseHash is non‑empty), regardless of the alreadyInjected branch.

Useful? React with 👍 / 👎.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

hmm, yes, that's an interesting point, but I'm not sure we care, we only need one span with the hash to get the values, so we don't really need to tag all spans. I think in practice it works well like this.

@pr-commenter
Copy link

pr-commenter bot commented Jan 14, 2026

Benchmarks

Benchmark execution time: 2026-03-10 10:14:54

Comparing candidate commit 92e4c6e in PR branch vandonr/process2 with baseline commit 59db4b3 in branch master.

Found 4 performance improvements and 12 performance regressions! Performance is the same for 157 metrics, 19 unstable metrics.

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

  • 🟥 execution_time [+85.916ms; +86.279ms] or [+70.959%; +71.258%]

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

  • 🟩 execution_time [-85.879ms; -85.682ms] or [-43.732%; -43.631%]

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

  • 🟩 execution_time [-27.550ms; -22.567ms] or [-12.293%; -10.070%]

scenario:Benchmarks.Trace.AspNetCoreBenchmark.SendRequest netcoreapp3.1

  • 🟥 throughput [-1428.074op/s; -599.780op/s] or [-13.717%; -5.761%]

scenario:Benchmarks.Trace.CIVisibilityProtocolWriterBenchmark.WriteAndFlushEnrichedTraces net472

  • 🟥 execution_time [+18.843ms; +25.371ms] or [+8.638%; +11.630%]
  • 🟥 throughput [-108.598op/s; -80.514op/s] or [-10.572%; -7.838%]

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

  • 🟥 throughput [-211.279op/s; -168.587op/s] or [-13.266%; -10.585%]
  • 🟩 execution_time [-63.333ms; -58.232ms] or [-28.649%; -26.342%]

scenario:Benchmarks.Trace.CharSliceBenchmark.OptimizedCharSliceWithPool net472

  • 🟥 execution_time [+62.381µs; +65.552µs] or [+5.478%; +5.756%]
  • 🟥 throughput [-47.875op/s; -45.525op/s] or [-5.452%; -5.184%]

scenario:Benchmarks.Trace.CharSliceBenchmark.OptimizedCharSliceWithPool net6.0

  • 🟥 execution_time [+100.959µs; +113.521µs] or [+9.745%; +10.957%]
  • 🟥 throughput [-96.354op/s; -84.956op/s] or [-9.981%; -8.800%]

scenario:Benchmarks.Trace.CharSliceBenchmark.OriginalCharSlice net472

  • 🟥 execution_time [+131.928µs; +136.486µs] or [+5.138%; +5.316%]

scenario:Benchmarks.Trace.DbCommandBenchmark.ExecuteNonQuery net472

  • 🟥 throughput [-31499.052op/s; -29649.634op/s] or [-8.318%; -7.830%]

scenario:Benchmarks.Trace.Log4netBenchmark.EnrichedLog netcoreapp3.1

  • 🟥 execution_time [+23.854ms; +29.146ms] or [+13.870%; +16.947%]

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

  • 🟩 execution_time [-18.089ms; -13.751ms] or [-8.376%; -6.367%]

@vandonr
Copy link
Contributor Author

vandonr commented Jan 15, 2026

I just realized I need to put process tags in there too

@vandonr vandonr marked this pull request as draft January 15, 2026 14:53
Copy link
Collaborator

@bouwkast bouwkast left a comment

Choose a reason for hiding this comment

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

I think the main question that I have is that it appears this is correctly following the RFC in how we propagate the hash, but the merged Python implementation recomputes the hash.

But the RFC isn't precise enough in describing the hash and expected behavior / requirements for me to know which is correct really

if (!string.IsNullOrEmpty(baseHash))
{
propagatorStringBuilder.Append(',').Append(SqlCommentBaseHash).Append("='").Append(Uri.EscapeDataString(baseHash)).Append('\'');
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

If I understand the Python implementation correctly they appear to be recomputing the hash:
https://github.com/DataDog/dd-trace-py/blob/b5008005cd637a07e5c249f8d60ed07ee8328dc5/ddtrace/internal/process_tags/__init__.py#L92-L94

I think based on the linked document that the method here of just passing in the has as given from the agent is the correct approach, but seeing that Python has been merged I'm wondering if the approach has been changed outside of the RFC? If not, I think that the Python implementation must not work.

From the RFC:

The agent would compute a hash on low cardinality container tags that can be used to identify a workload

The agent will then propagate that hash to the tracing libraries that can then use it to complete outbound communications with container information

Could we validate this?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

the hash is recomputed here because it's only injected from the instrumentation site, where we get it fresh from the global instance, so if the global instance changes, we'd pick up the latest one.
However, here I just implemented container tags, but I realized as you were reviewing that I need to add proces tags in there too (like in python), so there will be some computation to do.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

basically, the agent computes a hash that's ready to use based on container tags, but we also need to pack process tags in that hash, which is why there is a re-hashing step needed in the tracer (then)

Copy link
Collaborator

Choose a reason for hiding this comment

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

Okay 👍

I also noticed we were putting it as a string compared to python, but also noticed that the RFC actually seems to point to that Python PR as being the source of truth so I think that answers both this comment and the one I just left here

Copy link
Contributor Author

Choose a reason for hiding this comment

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

after some investigation and discussion (here), we agreed that storing the hash in b64 was the best compromise, and python will align on that.
I amended the RFC to specify that the value should be in meta (as a tag), and the python code will be updated.

Base automatically changed from vandonr/process3 to master February 3, 2026 18:49
@dd-trace-dotnet-ci-bot
Copy link

dd-trace-dotnet-ci-bot bot commented Feb 4, 2026

Execution-Time Benchmarks Report ⏱️

Execution-time results for samples comparing This PR (8061) 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.39 ± (74.41 - 74.71) ms74.51 ± (74.44 - 74.81) ms+0.2%✅⬆️
.NET Framework 4.8 - Bailout
duration79.78 ± (79.58 - 79.94) ms78.39 ± (78.23 - 78.58) ms-1.7%
.NET Framework 4.8 - CallTarget+Inlining+NGEN
duration1076.78 ± (1079.28 - 1086.68) ms1079.01 ± (1079.90 - 1085.42) ms+0.2%✅⬆️
.NET Core 3.1 - Baseline
process.internal_duration_ms22.71 ± (22.67 - 22.75) ms22.59 ± (22.55 - 22.63) ms-0.5%
process.time_to_main_ms86.02 ± (85.83 - 86.21) ms85.67 ± (85.45 - 85.89) ms-0.4%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.91 ± (10.91 - 10.91) MB10.91 ± (10.90 - 10.91) MB-0.0%
runtime.dotnet.threads.count12 ± (12 - 12)12 ± (12 - 12)+0.0%
.NET Core 3.1 - Bailout
process.internal_duration_ms22.66 ± (22.63 - 22.70) ms22.55 ± (22.50 - 22.59) ms-0.5%
process.time_to_main_ms87.21 ± (87.06 - 87.36) ms87.00 ± (86.81 - 87.19) ms-0.2%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.94 ± (10.94 - 10.95) MB10.94 ± (10.94 - 10.95) MB-0.0%
runtime.dotnet.threads.count13 ± (13 - 13)13 ± (13 - 13)+0.0%
.NET Core 3.1 - CallTarget+Inlining+NGEN
process.internal_duration_ms246.25 ± (242.16 - 250.35) ms256.38 ± (252.89 - 259.87) ms+4.1%✅⬆️
process.time_to_main_ms490.46 ± (489.76 - 491.16) ms489.84 ± (489.18 - 490.51) ms-0.1%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed47.65 ± (47.63 - 47.67) MB47.65 ± (47.62 - 47.67) MB-0.0%
runtime.dotnet.threads.count28 ± (28 - 28)28 ± (28 - 28)+0.8%✅⬆️
.NET 6 - Baseline
process.internal_duration_ms21.47 ± (21.43 - 21.51) ms21.53 ± (21.49 - 21.57) ms+0.3%✅⬆️
process.time_to_main_ms74.43 ± (74.25 - 74.60) ms75.30 ± (75.14 - 75.47) ms+1.2%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.62 ± (10.62 - 10.63) MB10.63 ± (10.63 - 10.64) MB+0.1%✅⬆️
runtime.dotnet.threads.count10 ± (10 - 10)10 ± (10 - 10)+0.0%
.NET 6 - Bailout
process.internal_duration_ms21.55 ± (21.50 - 21.60) ms21.45 ± (21.40 - 21.51) ms-0.5%
process.time_to_main_ms76.37 ± (76.21 - 76.54) ms76.20 ± (76.03 - 76.36) ms-0.2%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.68 ± (10.67 - 10.68) MB10.74 ± (10.74 - 10.74) MB+0.6%✅⬆️
runtime.dotnet.threads.count11 ± (11 - 11)11 ± (11 - 11)+0.0%
.NET 6 - CallTarget+Inlining+NGEN
process.internal_duration_ms252.32 ± (248.83 - 255.81) ms253.06 ± (249.63 - 256.49) ms+0.3%✅⬆️
process.time_to_main_ms473.46 ± (472.82 - 474.11) ms470.84 ± (470.17 - 471.51) ms-0.6%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed48.39 ± (48.37 - 48.41) MB48.36 ± (48.34 - 48.39) MB-0.1%
runtime.dotnet.threads.count28 ± (28 - 28)28 ± (28 - 28)+0.0%
.NET 8 - Baseline
process.internal_duration_ms19.60 ± (19.57 - 19.64) ms19.69 ± (19.64 - 19.74) ms+0.4%✅⬆️
process.time_to_main_ms73.61 ± (73.47 - 73.75) ms74.13 ± (73.94 - 74.31) ms+0.7%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed7.67 ± (7.66 - 7.67) MB7.66 ± (7.65 - 7.66) MB-0.1%
runtime.dotnet.threads.count10 ± (10 - 10)10 ± (10 - 10)+0.0%
.NET 8 - Bailout
process.internal_duration_ms19.64 ± (19.59 - 19.68) ms19.81 ± (19.76 - 19.86) ms+0.9%✅⬆️
process.time_to_main_ms75.36 ± (75.19 - 75.52) ms75.26 ± (75.15 - 75.38) ms-0.1%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed7.73 ± (7.71 - 7.74) MB7.72 ± (7.71 - 7.73) MB-0.1%
runtime.dotnet.threads.count11 ± (11 - 11)11 ± (11 - 11)+0.0%
.NET 8 - CallTarget+Inlining+NGEN
process.internal_duration_ms190.89 ± (189.95 - 191.83) ms190.06 ± (189.04 - 191.08) ms-0.4%
process.time_to_main_ms457.23 ± (456.27 - 458.19) ms453.84 ± (453.08 - 454.60) ms-0.7%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed36.10 ± (36.05 - 36.15) MB36.18 ± (36.14 - 36.23) MB+0.2%✅⬆️
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
duration193.56 ± (193.52 - 194.32) ms193.48 ± (193.56 - 194.59) ms-0.0%
.NET Framework 4.8 - Bailout
duration197.64 ± (197.69 - 198.49) ms197.50 ± (197.17 - 197.65) ms-0.1%
.NET Framework 4.8 - CallTarget+Inlining+NGEN
duration1146.51 ± (1148.07 - 1155.43) ms1155.26 ± (1155.96 - 1164.22) ms+0.8%✅⬆️
.NET Core 3.1 - Baseline
process.internal_duration_ms189.13 ± (188.74 - 189.52) ms187.91 ± (187.50 - 188.31) ms-0.6%
process.time_to_main_ms81.89 ± (81.68 - 82.10) ms81.44 ± (81.22 - 81.66) ms-0.5%
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed16.06 ± (16.04 - 16.09) MB16.08 ± (16.05 - 16.10) MB+0.1%✅⬆️
runtime.dotnet.threads.count20 ± (20 - 20)20 ± (20 - 20)+0.1%✅⬆️
.NET Core 3.1 - Bailout
process.internal_duration_ms189.33 ± (188.89 - 189.78) ms188.04 ± (187.59 - 188.49) ms-0.7%
process.time_to_main_ms83.51 ± (83.30 - 83.73) ms82.82 ± (82.62 - 83.02) ms-0.8%
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed16.08 ± (16.06 - 16.11) MB16.11 ± (16.08 - 16.14) MB+0.2%✅⬆️
runtime.dotnet.threads.count21 ± (20 - 21)21 ± (20 - 21)-0.2%
.NET Core 3.1 - CallTarget+Inlining+NGEN
process.internal_duration_ms437.11 ± (434.15 - 440.06) ms441.78 ± (439.56 - 444.00) ms+1.1%✅⬆️
process.time_to_main_ms476.81 ± (476.23 - 477.39) ms478.68 ± (478.03 - 479.33) ms+0.4%✅⬆️
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed57.93 ± (57.81 - 58.04) MB57.98 ± (57.86 - 58.09) MB+0.1%✅⬆️
runtime.dotnet.threads.count29 ± (29 - 30)29 ± (29 - 29)-0.1%
.NET 6 - Baseline
process.internal_duration_ms192.40 ± (192.08 - 192.73) ms192.08 ± (191.75 - 192.42) ms-0.2%
process.time_to_main_ms70.73 ± (70.53 - 70.93) ms70.72 ± (70.52 - 70.93) ms-0.0%
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed16.12 ± (15.98 - 16.26) MB16.18 ± (16.06 - 16.31) MB+0.4%✅⬆️
runtime.dotnet.threads.count19 ± (18 - 19)19 ± (19 - 19)+0.6%✅⬆️
.NET 6 - Bailout
process.internal_duration_ms192.72 ± (192.25 - 193.18) ms192.14 ± (191.68 - 192.59) ms-0.3%
process.time_to_main_ms71.88 ± (71.70 - 72.06) ms71.68 ± (71.50 - 71.85) ms-0.3%
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed16.43 ± (16.40 - 16.45) MB16.32 ± (16.23 - 16.41) MB-0.6%
runtime.dotnet.threads.count20 ± (20 - 20)20 ± (20 - 20)-0.7%
.NET 6 - CallTarget+Inlining+NGEN
process.internal_duration_ms454.63 ± (452.75 - 456.52) ms453.64 ± (451.88 - 455.40) ms-0.2%
process.time_to_main_ms451.57 ± (450.87 - 452.27) ms453.07 ± (452.36 - 453.77) ms+0.3%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed57.94 ± (57.84 - 58.03) MB57.80 ± (57.69 - 57.90) MB-0.2%
runtime.dotnet.threads.count29 ± (29 - 29)29 ± (29 - 29)+0.3%✅⬆️
.NET 8 - Baseline
process.internal_duration_ms190.36 ± (190.02 - 190.69) ms190.98 ± (190.60 - 191.37) ms+0.3%✅⬆️
process.time_to_main_ms70.17 ± (69.96 - 70.39) ms70.21 ± (70.00 - 70.42) ms+0.1%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed11.75 ± (11.72 - 11.78) MB11.76 ± (11.73 - 11.78) MB+0.1%✅⬆️
runtime.dotnet.threads.count18 ± (18 - 18)18 ± (18 - 18)-0.4%
.NET 8 - Bailout
process.internal_duration_ms189.62 ± (189.26 - 189.98) ms188.91 ± (188.53 - 189.29) ms-0.4%
process.time_to_main_ms71.03 ± (70.89 - 71.16) ms70.98 ± (70.85 - 71.11) ms-0.1%
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed11.84 ± (11.81 - 11.88) MB11.80 ± (11.76 - 11.84) MB-0.3%
runtime.dotnet.threads.count19 ± (19 - 19)19 ± (19 - 19)-0.6%
.NET 8 - CallTarget+Inlining+NGEN
process.internal_duration_ms368.38 ± (367.01 - 369.74) ms366.90 ± (365.35 - 368.46) ms-0.4%
process.time_to_main_ms434.42 ± (433.78 - 435.06) ms437.37 ± (436.50 - 438.23) ms+0.7%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed47.85 ± (47.81 - 47.89) MB47.89 ± (47.85 - 47.92) MB+0.1%✅⬆️
runtime.dotnet.threads.count29 ± (29 - 29)29 ± (29 - 29)-0.2%
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 (8061) - mean (75ms)  : 72, 77
    master - mean (75ms)  : 73, 77

    section Bailout
    This PR (8061) - mean (78ms)  : 77, 80
    master - mean (80ms)  : 78, 82

    section CallTarget+Inlining+NGEN
    This PR (8061) - mean (1,083ms)  : 1043, 1122
    master - mean (1,083ms)  : 1029, 1136

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 (8061) - mean (115ms)  : 112, 119
    master - mean (116ms)  : 111, 121

    section Bailout
    This PR (8061) - mean (116ms)  : 114, 119
    master - mean (117ms)  : 115, 119

    section CallTarget+Inlining+NGEN
    This PR (8061) - mean (773ms)  : 714, 832
    master - mean (765ms)  : 696, 833

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

    section Bailout
    This PR (8061) - mean (104ms)  : 102, 106
    master - mean (105ms)  : 102, 107

    section CallTarget+Inlining+NGEN
    This PR (8061) - mean (758ms)  : 699, 817
    master - mean (757ms)  : 694, 820

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

    section Bailout
    This PR (8061) - mean (103ms)  : 101, 104
    master - mean (103ms)  : 100, 105

    section CallTarget+Inlining+NGEN
    This PR (8061) - mean (673ms)  : 657, 689
    master - mean (679ms)  : 659, 700

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 (8061) - mean (194ms)  : 188, 200
    master - mean (194ms)  : 189, 198

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

    section CallTarget+Inlining+NGEN
    This PR (8061) - mean (1,160ms)  : 1101, 1219
    master - mean (1,152ms)  : 1098, 1206

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 (8061) - mean (278ms)  : 272, 283
    master - mean (280ms)  : 270, 290

    section Bailout
    This PR (8061) - mean (280ms)  : 273, 286
    master - mean (282ms)  : 275, 288

    section CallTarget+Inlining+NGEN
    This PR (8061) - mean (950ms)  : 913, 986
    master - mean (947ms)  : 902, 991

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

    section Bailout
    This PR (8061) - mean (272ms)  : 266, 278
    master - mean (273ms)  : 266, 279

    section CallTarget+Inlining+NGEN
    This PR (8061) - mean (936ms)  : 907, 964
    master - mean (937ms)  : 908, 966

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

    section Bailout
    This PR (8061) - mean (270ms)  : 264, 276
    master - mean (270ms)  : 265, 276

    section CallTarget+Inlining+NGEN
    This PR (8061) - mean (834ms)  : 814, 854
    master - mean (833ms)  : 807, 859

Loading

@vandonr vandonr marked this pull request as ready for review February 5, 2026 13:33
Copy link

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8ace897557

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

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