Skip to content

MSI file upgrade fix - #9164

Draft
gleocadie wants to merge 2 commits into
masterfrom
gleocadie/msi-companion-file-upgrade-fix
Draft

gleocadie wants to merge 2 commits into
masterfrom
gleocadie/msi-companion-file-upgrade-fix

Conversation

@gleocadie

Copy link
Copy Markdown
Collaborator

Summary of changes

Reason for change

Implementation details

Test coverage

Other details

gleocadie and others added 2 commits September 2, 2026 10:52
datadog_profiling_ffi.dll and ddwaf.dll carry no VERSIONINFO resource of their
own, so Windows Installer's file-replacement logic on upgrade falls back to
comparing created-vs-modified timestamps instead of versions. Combined with
MajorUpgrade having no Schedule (RemoveExistingProducts runs at 1401,
afterInstallValidate, before components get a chance to be removed outright),
an in-place upgrade could leave a stale copy of either DLL on disk next to
freshly-upgraded, version-matched managed/native modules -- this is exactly
what happened in the field: a two-year-old libdatadog v20.0.0
datadog_profiling_ffi.dll survived an upgrade to a tracer built against
libdatadog v25.0.0, and the resulting FFI struct-layout (ABI) mismatch
crashed the process with an access violation inside a static initializer at
startup, before the managed `catch (Exception)` around it could ever run.

Make both DLLs `CompanionFile`s of the versioned native module they already
ship alongside in the same directory (Datadog.Trace.ClrProfiler.Native and
Datadog.Tracer.Native respectively), so their upgrade replacement decision
always inherits that file's real version instead of falling back to the
unversioned-file heuristic:

- shared/Files.wxs: delete the standalone Shared.Files.Libdatadog.{32,64}
  component groups; move the libdatadog `<File>` into
  Datadog.Trace.ClrProfiler.Native{,.32}'s own component as a CompanionFile
  (a companion must live in the same component as the file whose version
  governs it -- that's the whole mechanism).
- Product.wxs: drop the two now-dangling ComponentGroupRefs.
- Tracer/Files.wxs: ddwaf.dll (x86) was already co-located with
  Datadog.Tracer.Native.32 in one component, so that side is a one-attribute
  change. ddwaf.dll (x64) was NOT actually co-located with Datadog.Tracer.Native
  despite looking that way in the component group -- they were two separate
  <Component> elements -- so that side needed an actual merge into one
  component first. (Confirmed independently from the current
  msi-x64.verified.yml File table: LibDdwaf.32's Component_ is already
  Datadog.Tracer.Native.32, but LibDdwaf's is still LibDdwaf.)
- Both merged/modified components get an explicit Component `Id` matching
  their primary file's Id, mirroring the existing Datadog.Tracer.Native.32
  precedent, since WiX's keypath-by-first-file default is otherwise implicit.
- Companion files drop `Checksum="yes"` (mutually exclusive with companion
  versioning); the primary/versioned files keep it.
- No `File` Id was renamed (WiX derives the 8.3 short name from it).

Bonus effect: removing the standalone libdatadog components (and merging
ddwaf.dll's x64 component into Datadog.Tracer.Native) changes their
auto-generated component GUIDs out of existence, so on the transition upgrade
specifically, RemoveExistingProducts deletes the old orphaned files outright
and the new ones install fresh -- CompanionFile is what then keeps every
upgrade after that one correct.

Still needed before merge (requires a Windows machine, not available in this
environment): regenerate tracer/build/_build/MsiValidation/msi-x64.verified.yml
via `.\tracer\build.cmd BuildMsi`. Expected diff: libdatadog{,.32} and LibDdwaf's
`Version` column goes from '' to their companion's file Id (the File table's
Version column doubles as the companion key), their `Component_` changes to
the merged component, and the two removed components disappear from the
Component table.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
There is currently no upgrade test anywhere in the Windows MSI smoke suite --
every existing scenario does a single fresh `msiexec /qn /i` into a clean
container, which is exactly why the previous commit's bug shipped undetected.

Add a "WindowsMsi" scenario that installs the last release to ship libdatadog
v20.0.0 (3.33.0, the exact "old" version from the crash report this is a
regression test for) first, to create a genuinely aged on-disk state, then
upgrades in place to the locally-built MSI under test:

- smoke.windows.upgrade.dockerfile (new): modeled on smoke.windows.dockerfile.
  Downloads and installs the pinned previous release from GitHub releases
  (same URL shape already used by tracer/samples/WindowsContainer/Dockerfile),
  upgrades to the local build, then asserts -- as a build-time step, so a
  mismatch fails the image build itself -- that datadog_profiling_ffi.dll and
  ddwaf.dll under the installed win-x64 both hash-match this same build's own
  monitoring home (windows-tracer-home.zip, already staged into the smoke test
  artifacts dir alongside the MSI for the existing WindowsTracerHome scenario).
  SHA256 comparison is cheaper and more robust than parsing the PE debug GUID,
  and catches a stale file regardless of whether it happens to crash on
  startup.
- SmokeTestScenario.cs: add an optional `PreviousReleaseVersion` to
  WindowsMsiScenario; only set for this one scenario.
- SmokeTestScenarios.cs: one extra representative scenario (x64, net8.0) in
  WindowsMsiScenarios() -- the upgrade mechanism under test lives entirely in
  the MSI/WiX layer, not in the .NET runtime, so the full runtime x
  32-bit-or-not matrix the other WindowsMsi scenarios use would be redundant
  here.
- SmokeTestRunner.Builder.cs: BuildWindowsMsiImageAsync branches on
  PreviousReleaseVersion to build from the new Dockerfile instead (no
  dd-dotnet variant for this one -- irrelevant to what's under test).

No changes needed to .azure-pipelines/ultimate-pipeline.yml: smoke_win_msi_matrix
is generated dynamically from WindowsMsiScenarios() by
Build.VariableGenerations.cs's EmitMatrix, and the existing smoke_win_msi_tests
stage (gated on isMainOrReleaseBranch / run_all_installer_tests /
isDockerImageBumpPr) already consumes that matrix generically -- this new
scenario picks up a CI job automatically.

Verified the touched C# compiles clean (`dotnet build tracer/build/_build`);
the Docker/msiexec/PowerShell path itself needs a Windows machine with Docker
Windows-container support to actually exercise, which isn't available in this
environment.
@dd-trace-dotnet-ci-bot

Copy link
Copy Markdown

Execution-Time Benchmarks Report ⏱️

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

✅ No regressions detected

📄 View the full report (charts + all metrics) →

@pr-commenter

pr-commenter Bot commented Sep 2, 2026

Copy link
Copy Markdown

Benchmarks

Benchmark execution time: 2026-09-02 12:21:43

Comparing candidate commit 0ee6819 in PR branch gleocadie/msi-companion-file-upgrade-fix with baseline commit 0738536 in branch master.

📊 Benchmarking dashboard

Found 1 performance improvements and 1 performance regressions! Performance is the same for 70 metrics, 0 unstable metrics, 68 known flaky benchmarks, 58 flaky benchmarks without significant changes.

Explanation

This is an A/B test comparing a candidate commit's performance against that of a baseline commit. Performance changes are noted in the tables below as:

  • 🟩 = significantly better candidate vs. baseline
  • 🟥 = significantly worse candidate vs. baseline

We compute a confidence interval (CI) over the relative difference of means between metrics from the candidate and baseline commits, considering the baseline as the reference.

If the CI is entirely outside the configured SIGNIFICANT_IMPACT_THRESHOLD (or the deprecated UNCONFIDENCE_THRESHOLD), the change is considered significant.

Feel free to reach out to #apm-benchmarking-platform on Slack if you have any questions.

More details about the CI and significant changes

You can imagine this CI as a range of values that is likely to contain the true difference of means between the candidate and baseline commits.

CIs of the difference of means are often centered around 0%, because often changes are not that big:

---------------------------------(------|---^--------)-------------------------------->
                              -0.6%    0%  0.3%     +1.2%
                                 |          |        |
         lower bound of the CI --'          |        |
sample mean (center of the CI) -------------'        |
         upper bound of the CI ----------------------'

As described above, a change is considered significant if the CI is entirely outside the configured SIGNIFICANT_IMPACT_THRESHOLD (or the deprecated UNCONFIDENCE_THRESHOLD).

For instance, for an execution time metric, this confidence interval indicates a significantly worse performance:

----------------------------------------|---------|---(---------^---------)---------->
                                       0%        1%  1.3%      2.2%      3.1%
                                                  |   |         |         |
       significant impact threshold --------------'   |         |         |
                      lower bound of CI --------------'         |         |
       sample mean (center of the CI) --------------------------'         |
                      upper bound of CI ----------------------------------'

scenario:Benchmarks.Trace.HttpClientBenchmark.SendAsync net472

  • 🟥 throughput [-6401.810op/s; -5717.780op/s] or [-7.308%; -6.527%]

scenario:Benchmarks.Trace.HttpClientBenchmark.SendAsync net6.0

  • 🟩 throughput [+7910.383op/s; +9336.633op/s] or [+5.374%; +6.343%]

Known flaky benchmarks

These benchmarks are marked as flaky and will not trigger a failure. Modify FLAKY_BENCHMARKS_REGEX to control which benchmarks are marked as flaky.

scenario:Benchmarks.Trace.ActivityBenchmark.StartStopWithChild net472

  • 🟥 throughput [-7230.381op/s; -6583.702op/s] or [-8.573%; -7.806%]

scenario:Benchmarks.Trace.ActivityBenchmark.StartStopWithChild netcoreapp3.1

  • 🟥 throughput [-7653.341op/s; -6085.594op/s] or [-7.782%; -6.188%]

scenario:Benchmarks.Trace.AgentWriterBenchmark.WriteAndFlushEnrichedTraces net472

  • 🟥 allocated_mem [+1.573KB; +1.573KB] or [+47.789%; +47.804%]
  • 🟥 execution_time [+305.043ms; +307.543ms] or [+151.373%; +152.613%]
  • 🟥 throughput [-53.689op/s; -49.610op/s] or [-9.660%; -8.926%]

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

  • 🟥 allocated_mem [+1.012KB; +1.012KB] or [+37.524%; +37.537%]
  • 🟥 execution_time [+368.887ms; +372.067ms] or [+291.443%; +293.955%]
  • 🟩 throughput [+75.880op/s; +81.301op/s] or [+10.004%; +10.719%]

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

  • 🟥 allocated_mem [+1.088KB; +1.088KB] or [+40.343%; +40.355%]
  • 🟥 execution_time [+391.101ms; +395.601ms] or [+346.110%; +350.091%]

scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.AllCycleMoreComplexBody net472

  • 🟥 allocated_mem [+4.725KB; +4.726KB] or [+99.482%; +99.497%]
  • 🟥 throughput [-60883.994op/s; -60496.294op/s] or [-47.371%; -47.069%]

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

  • 🟥 allocated_mem [+3.848KB; +3.848KB] or [+81.379%; +81.391%]
  • 🟩 execution_time [-15.699ms; -11.535ms] or [-7.332%; -5.387%]
  • 🟥 throughput [-60137.805op/s; -57376.788op/s] or [-43.897%; -41.882%]

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

  • 🟥 allocated_mem [+4.576KB; +4.576KB] or [+98.954%; +98.966%]
  • 🟥 throughput [-49951.675op/s; -47686.417op/s] or [-45.162%; -43.114%]

scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.AllCycleSimpleBody net472

  • 🟥 allocated_mem [+1.348KB; +1.348KB] or [+109.063%; +109.078%]
  • 🟥 throughput [-303013.203op/s; -300177.770op/s] or [-30.939%; -30.650%]

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

  • 🟥 allocated_mem [+511 bytes; +512 bytes] or [+41.822%; +41.834%]
  • 🟩 execution_time [-26.805ms; -21.940ms] or [-11.954%; -9.784%]
  • 🟥 throughput [-117289.193op/s; -94732.152op/s] or [-12.530%; -10.120%]

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

  • 🟥 allocated_mem [+1.312KB; +1.312KB] or [+108.600%; +108.616%]
  • 🟥 throughput [-174815.142op/s; -158387.735op/s] or [-25.118%; -22.757%]

scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.ObjectExtractorMoreComplexBody net472

  • 🟥 allocated_mem [+3.378KB; +3.378KB] or [+89.003%; +89.017%]
  • 🟥 throughput [-72630.782op/s; -71872.182op/s] or [-48.880%; -48.369%]

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

  • 🟥 allocated_mem [+3.336KB; +3.336KB] or [+88.150%; +88.161%]
  • 🟥 throughput [-72624.414op/s; -69738.281op/s] or [-46.210%; -44.373%]

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

  • 🟥 allocated_mem [+3.264KB; +3.264KB] or [+88.493%; +88.506%]
  • 🟥 throughput [-56651.604op/s; -54024.388op/s] or [-45.130%; -43.037%]

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

  • 🟩 throughput [+341907.149op/s; +362118.473op/s] or [+11.401%; +12.075%]

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

  • 🟩 execution_time [-19.272ms; -14.940ms] or [-8.884%; -6.887%]

scenario:Benchmarks.Trace.Asm.AppSecEncoderBenchmark.EncodeArgs net472

  • 🟩 allocated_mem [-13.759KB; -13.757KB] or [-42.326%; -42.318%]
  • 🟥 execution_time [+300.569ms; +301.305ms] or [+150.184%; +150.552%]
  • 🟩 throughput [+997.788op/s; +1024.048op/s] or [+11.020%; +11.311%]

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

  • 🟩 allocated_mem [-13.722KB; -13.718KB] or [-42.341%; -42.329%]
  • 🟥 execution_time [+300.704ms; +303.808ms] or [+151.646%; +153.211%]
  • 🟩 throughput [+2339.020op/s; +2556.194op/s] or [+17.890%; +19.551%]

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

  • 🟩 allocated_mem [-13.722KB; -13.718KB] or [-42.341%; -42.329%]
  • 🟥 execution_time [+300.730ms; +303.097ms] or [+151.484%; +152.676%]
  • 🟩 throughput [+1785.915op/s; +1912.344op/s] or [+17.242%; +18.463%]

scenario:Benchmarks.Trace.Asm.AppSecEncoderBenchmark.EncodeLegacyArgs net472

  • 🟥 execution_time [+295.155ms; +296.218ms] or [+144.969%; +145.490%]
  • 🟩 throughput [+520.232op/s; +562.236op/s] or [+13.792%; +14.905%]

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

  • 🟥 execution_time [+296.436ms; +298.109ms] or [+144.917%; +145.734%]
  • 🟩 throughput [+2748.575op/s; +2807.458op/s] or [+39.932%; +40.787%]

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

  • 🟥 execution_time [+300.654ms; +302.261ms] or [+150.267%; +151.069%]
  • 🟩 throughput [+1365.587op/s; +1395.762op/s] or [+27.106%; +27.705%]

scenario:Benchmarks.Trace.Asm.AppSecWafBenchmark.RunWafRealisticBenchmark net472

  • 🟩 execution_time [-145.368µs; -140.516µs] or [-29.846%; -28.850%]
  • 🟩 throughput [+836.842op/s; +871.069op/s] or [+40.758%; +42.425%]

scenario:Benchmarks.Trace.Asm.AppSecWafBenchmark.RunWafRealisticBenchmark net6.0

  • 🟩 execution_time [-138.464µs; -111.842µs] or [-31.757%; -25.651%]
  • 🟩 throughput [+856.567op/s; +977.930op/s] or [+37.240%; +42.517%]

scenario:Benchmarks.Trace.Asm.AppSecWafBenchmark.RunWafRealisticBenchmark netcoreapp3.1

  • 🟩 execution_time [-140.008µs; -117.968µs] or [-29.997%; -25.275%]
  • 🟩 throughput [+753.261op/s; +836.883op/s] or [+34.772%; +38.632%]

scenario:Benchmarks.Trace.Asm.AppSecWafBenchmark.RunWafRealisticBenchmarkWithAttack net472

  • 🟩 execution_time [-127.265µs; -123.007µs] or [-34.361%; -33.211%]
  • 🟩 throughput [+1354.126op/s; +1403.797op/s] or [+50.151%; +51.990%]

scenario:Benchmarks.Trace.Asm.AppSecWafBenchmark.RunWafRealisticBenchmarkWithAttack net6.0

  • 🟩 execution_time [-101.142µs; -77.488µs] or [-32.290%; -24.738%]
  • 🟩 throughput [+1157.750op/s; +1361.842op/s] or [+36.090%; +42.453%]

scenario:Benchmarks.Trace.Asm.AppSecWafBenchmark.RunWafRealisticBenchmarkWithAttack netcoreapp3.1

  • 🟩 execution_time [-136.103µs; -113.725µs] or [-37.232%; -31.111%]
  • 🟩 throughput [+1301.614op/s; +1437.939op/s] or [+46.710%; +51.602%]

scenario:Benchmarks.Trace.AspNetCoreBenchmark.SendRequest net472

  • 🟥 execution_time [+299.962ms; +300.887ms] or [+149.712%; +150.174%]

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

  • 🟥 execution_time [+409.452ms; +418.346ms] or [+444.886%; +454.550%]
  • 🟩 throughput [+731.165op/s; +945.620op/s] or [+6.008%; +7.770%]

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

  • unstable execution_time [+251.109ms; +315.206ms] or [+190.664%; +239.333%]

scenario:Benchmarks.Trace.CIVisibilityProtocolWriterBenchmark.WriteAndFlushEnrichedTraces net472

  • unstable execution_time [+324.184ms; +367.174ms] or [+149.057%; +168.823%]
  • 🟥 throughput [-518.267op/s; -476.783op/s] or [-46.960%; -43.201%]

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

  • unstable execution_time [+145.607ms; +291.706ms] or [+62.051%; +124.313%]
  • 🟥 throughput [-672.648op/s; -589.239op/s] or [-44.866%; -39.302%]

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

  • 🟥 allocated_mem [+2.201KB; +2.205KB] or [+5.198%; +5.207%]
  • 🟥 execution_time [+339.365ms; +349.700ms] or [+202.980%; +209.161%]
  • 🟥 throughput [-397.412op/s; -359.645op/s] or [-27.671%; -25.042%]

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

  • 🟩 execution_time [-170.729µs; -131.384µs] or [-8.649%; -6.655%]
  • 🟩 throughput [+37.246op/s; +48.199op/s] or [+7.353%; +9.515%]

scenario:Benchmarks.Trace.ElasticsearchBenchmark.CallElasticsearch net472

  • 🟥 execution_time [+302.073ms; +303.611ms] or [+152.118%; +152.893%]

scenario:Benchmarks.Trace.ElasticsearchBenchmark.CallElasticsearch net6.0

  • 🟥 execution_time [+300.086ms; +302.748ms] or [+150.374%; +151.707%]

scenario:Benchmarks.Trace.ElasticsearchBenchmark.CallElasticsearch netcoreapp3.1

  • 🟥 execution_time [+300.553ms; +304.260ms] or [+150.985%; +152.847%]

scenario:Benchmarks.Trace.ElasticsearchBenchmark.CallElasticsearchAsync net472

  • 🟥 execution_time [+300.886ms; +302.324ms] or [+151.095%; +151.817%]

scenario:Benchmarks.Trace.ElasticsearchBenchmark.CallElasticsearchAsync net6.0

  • 🟥 execution_time [+297.579ms; +299.822ms] or [+147.140%; +148.249%]

scenario:Benchmarks.Trace.ElasticsearchBenchmark.CallElasticsearchAsync netcoreapp3.1

  • 🟥 execution_time [+301.308ms; +305.485ms] or [+152.716%; +154.833%]

scenario:Benchmarks.Trace.GraphQLBenchmark.ExecuteAsync net472

  • 🟥 execution_time [+300.819ms; +303.535ms] or [+150.984%; +152.347%]

scenario:Benchmarks.Trace.GraphQLBenchmark.ExecuteAsync net6.0

  • 🟥 execution_time [+300.748ms; +302.518ms] or [+149.895%; +150.777%]
  • 🟩 throughput [+52245.880op/s; +57795.980op/s] or [+10.374%; +11.476%]

scenario:Benchmarks.Trace.GraphQLBenchmark.ExecuteAsync netcoreapp3.1

  • 🟥 execution_time [+299.146ms; +301.896ms] or [+148.823%; +150.191%]

scenario:Benchmarks.Trace.ILoggerBenchmark.EnrichedLog net472

  • 🟥 throughput [-22774.307op/s; -18813.079op/s] or [-9.158%; -7.565%]

scenario:Benchmarks.Trace.ILoggerBenchmark.EnrichedLog net6.0

  • 🟩 execution_time [-17.233ms; -13.597ms] or [-8.013%; -6.323%]

scenario:Benchmarks.Trace.Iast.StringAspectsBenchmark.StringConcatAspectBenchmark net472

  • unstable execution_time [+4.687µs; +54.272µs] or [+1.158%; +13.405%]

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

  • 🟩 allocated_mem [-17.748KB; -17.725KB] or [-6.474%; -6.466%]
  • unstable execution_time [-7.057µs; +50.488µs] or [-1.395%; +9.979%]

scenario:Benchmarks.Trace.Iast.StringAspectsBenchmark.StringConcatAspectBenchmark netcoreapp3.1

  • unstable execution_time [-42.704µs; +18.935µs] or [-7.400%; +3.281%]

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

  • unstable execution_time [+8.160µs; +13.195µs] or [+19.288%; +31.188%]
  • 🟥 throughput [-5621.154op/s; -3621.438op/s] or [-23.663%; -15.245%]

scenario:Benchmarks.Trace.Iast.StringAspectsBenchmark.StringConcatBenchmark netcoreapp3.1

  • unstable execution_time [-12.740µs; -4.702µs] or [-19.765%; -7.295%]
  • unstable throughput [+1089.580op/s; +2868.307op/s] or [+6.685%; +17.598%]

scenario:Benchmarks.Trace.Log4netBenchmark.EnrichedLog net472

  • 🟥 execution_time [+303.300ms; +305.285ms] or [+153.304%; +154.308%]

scenario:Benchmarks.Trace.Log4netBenchmark.EnrichedLog net6.0

  • 🟥 execution_time [+301.689ms; +304.451ms] or [+153.559%; +154.964%]

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

  • 🟥 execution_time [+297.550ms; +300.557ms] or [+148.961%; +150.466%]

scenario:Benchmarks.Trace.RedisBenchmark.SendReceive net6.0

  • 🟩 throughput [+34821.987op/s; +39221.762op/s] or [+6.591%; +7.424%]

scenario:Benchmarks.Trace.SerilogBenchmark.EnrichedLog net472

  • 🟥 execution_time [+299.977ms; +302.133ms] or [+149.512%; +150.586%]

scenario:Benchmarks.Trace.SerilogBenchmark.EnrichedLog net6.0

  • 🟥 execution_time [+302.307ms; +304.698ms] or [+151.804%; +153.005%]

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

  • 🟥 execution_time [+303.875ms; +305.956ms] or [+154.106%; +155.161%]

scenario:Benchmarks.Trace.SingleSpanAspNetCoreBenchmark.SingleSpanAspNetCore net472

  • 🟥 execution_time [+300.487ms; +301.676ms] or [+149.884%; +150.477%]
  • 🟩 throughput [+66060696.426op/s; +66475370.909op/s] or [+48.109%; +48.411%]

scenario:Benchmarks.Trace.SingleSpanAspNetCoreBenchmark.SingleSpanAspNetCore net6.0

  • unstable execution_time [+332.878ms; +399.018ms] or [+413.993%; +496.250%]

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

  • 🟥 execution_time [+299.560ms; +300.711ms] or [+149.413%; +149.988%]
  • 🟩 throughput [+14347933.988op/s; +17449095.509op/s] or [+6.355%; +7.729%]

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

  • 🟩 throughput [+88552.701op/s; +96764.975op/s] or [+8.268%; +9.035%]

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

  • 🟩 throughput [+47078.796op/s; +67407.720op/s] or [+5.449%; +7.802%]

scenario:Benchmarks.Trace.SpanBenchmark.StartFinishSpan net472

  • 🟥 throughput [-67665.054op/s; -60247.796op/s] or [-6.194%; -5.515%]

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

  • 🟩 throughput [+66390.970op/s; +97510.751op/s] or [+5.139%; +7.548%]

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

  • 🟩 throughput [+76491.526op/s; +85045.628op/s] or [+7.597%; +8.446%]

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

  • 🟩 throughput [+48169.235op/s; +53192.761op/s] or [+8.747%; +9.659%]

scenario:Benchmarks.Trace.TraceAnnotationsBenchmark.RunOnMethodBegin net6.0

  • 🟩 throughput [+46871.960op/s; +73662.115op/s] or [+5.237%; +8.230%]

Known flaky benchmarks without significant changes:

  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan netcoreapp3.1
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_AddEvent_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_AddEvent_Sampled net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_AddEvent_Sampled netcoreapp3.1
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_GetContext_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_GetContext_Sampled net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_GetContext_Sampled netcoreapp3.1
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_SetAttributes_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_SetAttributes_Sampled net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_SetAttributes_Sampled netcoreapp3.1
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_SetStatus_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_SetStatus_Sampled net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_SetStatus_Sampled netcoreapp3.1
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_UpdateName_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_UpdateName_Sampled net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_UpdateName_Sampled netcoreapp3.1
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan netcoreapp3.1
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_AddEvent_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_AddEvent_Sampled net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_AddEvent_Sampled netcoreapp3.1
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_GetContext_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_GetContext_Sampled net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_GetContext_Sampled netcoreapp3.1
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_RecordException_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_RecordException_Sampled net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_RecordException_Sampled netcoreapp3.1
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_SetAttributes_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_SetAttributes_Sampled net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_SetAttributes_Sampled netcoreapp3.1
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_SetStatus_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_SetStatus_Sampled net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_SetStatus_Sampled netcoreapp3.1
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_UpdateName_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_UpdateName_Sampled net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_UpdateName_Sampled netcoreapp3.1
  • scenario:Benchmarks.Trace.ActivityBenchmark.StartStopWithChild net6.0
  • scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.ObjectExtractorSimpleBody net472
  • scenario:Benchmarks.Trace.CharSliceBenchmark.OptimizedCharSlice net472
  • scenario:Benchmarks.Trace.CharSliceBenchmark.OptimizedCharSlice net6.0
  • scenario:Benchmarks.Trace.CharSliceBenchmark.OptimizedCharSlice netcoreapp3.1
  • scenario:Benchmarks.Trace.CharSliceBenchmark.OptimizedCharSliceWithPool net472
  • scenario:Benchmarks.Trace.CharSliceBenchmark.OptimizedCharSliceWithPool net6.0
  • scenario:Benchmarks.Trace.CharSliceBenchmark.OptimizedCharSliceWithPool netcoreapp3.1
  • scenario:Benchmarks.Trace.CharSliceBenchmark.OriginalCharSlice net472
  • scenario:Benchmarks.Trace.CharSliceBenchmark.OriginalCharSlice netcoreapp3.1
  • scenario:Benchmarks.Trace.ILoggerBenchmark.EnrichedLog netcoreapp3.1
  • scenario:Benchmarks.Trace.Iast.StringAspectsBenchmark.StringConcatBenchmark net472
  • scenario:Benchmarks.Trace.RedisBenchmark.SendReceive net472
  • scenario:Benchmarks.Trace.RedisBenchmark.SendReceive netcoreapp3.1
  • scenario:Benchmarks.Trace.SpanBenchmark.StartFinishScope net472
  • scenario:Benchmarks.Trace.SpanBenchmark.StartFinishTwoScopes net472
  • scenario:Benchmarks.Trace.SpanBenchmark.StartFinishTwoScopes netcoreapp3.1
  • scenario:Benchmarks.Trace.TraceAnnotationsBenchmark.RunOnMethodBegin net472
  • scenario:Benchmarks.Trace.TraceAnnotationsBenchmark.RunOnMethodBegin netcoreapp3.1

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant