Skip to content

Allow generating a snapshot of the MSI contents#8270

Merged
andrewlock merged 3 commits into
masterfrom
andrew/msi-snapshot
Mar 13, 2026
Merged

Allow generating a snapshot of the MSI contents#8270
andrewlock merged 3 commits into
masterfrom
andrew/msi-snapshot

Conversation

@andrewlock

@andrewlock andrewlock commented Mar 4, 2026

Copy link
Copy Markdown
Member

Summary of changes

Adds a "snapshot generator" for the MSI contents

Reason for change

We've discussed updating/switching to newer versions of Wix, and we want to make sure we don't regress anything

Implementation details

Uses the WixToolset.Dtf.WindowsInstaller nuget package to read the contents of the MSI. We then scrub values which we expect to change (version numbers, filesizes etc) and dump the values out as a yaml file (could have done any format, we already had a transient reference to yamldotnet, I just made it explicit)

Test coverage

Tested with a couple of MSIs from master, and they pass.

Other details

I considered an alternative, where we try to understand the impact of installing the MSI, which on the surface is what we really care about, but seemed like a much harder prospect 😅

@andrewlock andrewlock added the area:builds project files, build scripts, pipelines, versioning, releases, packages label Mar 4, 2026
@pr-commenter

pr-commenter Bot commented Mar 4, 2026

Copy link
Copy Markdown

Benchmarks

Benchmark execution time: 2026-03-06 11:56:05

Comparing candidate commit 2b3dfb6 in PR branch andrew/msi-snapshot with baseline commit 76f3785 in branch master.

Found 9 performance improvements and 6 performance regressions! Performance is the same for 162 metrics, 15 unstable metrics.

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

  • 🟩 execution_time [-80.366ms; -80.011ms] or [-39.716%; -39.541%]

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

  • 🟩 throughput [+631.098op/s; +1467.826op/s] or [+6.729%; +15.650%]

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

  • 🟩 execution_time [-50.528ms; -48.200ms] or [-24.387%; -23.263%]
  • 🟩 throughput [+145.593op/s; +163.816op/s] or [+9.922%; +11.164%]

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

  • 🟥 throughput [-313.520op/s; -279.816op/s] or [-18.842%; -16.816%]

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

  • 🟥 throughput [-189.145op/s; -138.229op/s] or [-36.572%; -26.727%]

scenario:Benchmarks.Trace.ElasticsearchBenchmark.CallElasticsearchAsync net472

  • 🟩 throughput [+28203.352op/s; +30312.983op/s] or [+9.984%; +10.731%]

scenario:Benchmarks.Trace.GraphQLBenchmark.ExecuteAsync net472

  • 🟩 throughput [+20602.837op/s; +23843.961op/s] or [+5.450%; +6.308%]

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

  • 🟥 throughput [-375.769op/s; -188.122op/s] or [-17.861%; -8.942%]

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

  • 🟥 execution_time [+37.422ms; +38.703ms] or [+23.472%; +24.276%]

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

  • 🟥 throughput [-12037.956op/s; -10415.582op/s] or [-6.612%; -5.721%]

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

  • 🟥 execution_time [+16.086ms; +17.367ms] or [+20.633%; +22.276%]

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

  • 🟩 throughput [+17662489.650op/s; +19043647.485op/s] or [+7.821%; +8.433%]

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

  • 🟩 execution_time [-16.751ms; -12.798ms] or [-7.905%; -6.039%]

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

  • 🟩 execution_time [-17.520ms; -13.611ms] or [-8.143%; -6.326%]

@dd-trace-dotnet-ci-bot

dd-trace-dotnet-ci-bot Bot commented Mar 4, 2026

Copy link
Copy Markdown

Execution-Time Benchmarks Report ⏱️

Execution-time results for samples comparing This PR (8270) 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.09 ± (75.07 - 75.36) ms74.81 ± (74.83 - 75.19) ms-0.4%
.NET Framework 4.8 - Bailout
duration79.17 ± (79.06 - 79.39) ms78.88 ± (78.70 - 79.09) ms-0.4%
.NET Framework 4.8 - CallTarget+Inlining+NGEN
duration1084.74 ± (1085.98 - 1091.80) ms1075.88 ± (1076.94 - 1083.41) ms-0.8%
.NET Core 3.1 - Baseline
process.internal_duration_ms22.84 ± (22.80 - 22.88) ms22.59 ± (22.55 - 22.62) ms-1.1%
process.time_to_main_ms86.51 ± (86.33 - 86.69) ms85.19 ± (85.00 - 85.39) ms-1.5%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.92 ± (10.92 - 10.92) MB10.92 ± (10.92 - 10.92) MB-0.0%
runtime.dotnet.threads.count12 ± (12 - 12)12 ± (12 - 12)+0.0%
.NET Core 3.1 - Bailout
process.internal_duration_ms22.80 ± (22.75 - 22.84) ms22.55 ± (22.51 - 22.60) ms-1.1%
process.time_to_main_ms88.18 ± (87.97 - 88.40) ms86.44 ± (86.29 - 86.59) ms-2.0%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.95 ± (10.95 - 10.96) MB10.95 ± (10.95 - 10.96) MB-0.0%
runtime.dotnet.threads.count13 ± (13 - 13)13 ± (13 - 13)+0.0%
.NET Core 3.1 - CallTarget+Inlining+NGEN
process.internal_duration_ms239.09 ± (235.14 - 243.05) ms239.92 ± (235.93 - 243.91) ms+0.3%✅⬆️
process.time_to_main_ms492.10 ± (491.42 - 492.79) ms493.81 ± (493.07 - 494.55) ms+0.3%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed47.59 ± (47.56 - 47.61) MB47.62 ± (47.60 - 47.64) MB+0.1%✅⬆️
runtime.dotnet.threads.count28 ± (28 - 28)28 ± (28 - 28)+0.0%✅⬆️
.NET 6 - Baseline
process.internal_duration_ms21.73 ± (21.69 - 21.77) ms21.57 ± (21.53 - 21.62) ms-0.7%
process.time_to_main_ms75.69 ± (75.51 - 75.87) ms75.50 ± (75.32 - 75.68) ms-0.3%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.64 ± (10.64 - 10.64) MB10.64 ± (10.64 - 10.65) MB+0.0%✅⬆️
runtime.dotnet.threads.count10 ± (10 - 10)10 ± (10 - 10)+0.0%
.NET 6 - Bailout
process.internal_duration_ms21.60 ± (21.55 - 21.65) ms21.46 ± (21.42 - 21.50) ms-0.6%
process.time_to_main_ms76.71 ± (76.52 - 76.90) ms76.40 ± (76.20 - 76.59) ms-0.4%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.67 ± (10.67 - 10.68) MB10.76 ± (10.75 - 10.76) MB+0.8%✅⬆️
runtime.dotnet.threads.count11 ± (11 - 11)11 ± (11 - 11)+0.0%
.NET 6 - CallTarget+Inlining+NGEN
process.internal_duration_ms257.69 ± (254.48 - 260.90) ms246.54 ± (242.53 - 250.55) ms-4.3%
process.time_to_main_ms476.91 ± (476.21 - 477.61) ms477.50 ± (476.88 - 478.12) ms+0.1%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed48.31 ± (48.29 - 48.33) MB48.33 ± (48.31 - 48.35) MB+0.0%✅⬆️
runtime.dotnet.threads.count28 ± (28 - 28)28 ± (28 - 28)+0.0%
.NET 8 - Baseline
process.internal_duration_ms19.74 ± (19.71 - 19.78) ms19.88 ± (19.85 - 19.92) ms+0.7%✅⬆️
process.time_to_main_ms74.80 ± (74.64 - 74.95) ms74.88 ± (74.71 - 75.05) ms+0.1%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed7.68 ± (7.67 - 7.68) MB7.70 ± (7.69 - 7.71) MB+0.3%✅⬆️
runtime.dotnet.threads.count10 ± (10 - 10)10 ± (10 - 10)+0.0%
.NET 8 - Bailout
process.internal_duration_ms19.67 ± (19.62 - 19.71) ms19.94 ± (19.89 - 19.98) ms+1.4%✅⬆️
process.time_to_main_ms75.29 ± (75.15 - 75.43) ms76.04 ± (75.88 - 76.20) ms+1.0%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed7.76 ± (7.75 - 7.77) MB7.73 ± (7.73 - 7.74) MB-0.3%
runtime.dotnet.threads.count11 ± (11 - 11)11 ± (11 - 11)+0.0%
.NET 8 - CallTarget+Inlining+NGEN
process.internal_duration_ms190.96 ± (190.26 - 191.66) ms190.07 ± (189.33 - 190.81) ms-0.5%
process.time_to_main_ms456.81 ± (456.13 - 457.48) ms456.72 ± (456.01 - 457.42) ms-0.0%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed36.12 ± (36.09 - 36.16) MB36.17 ± (36.13 - 36.21) MB+0.1%✅⬆️
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
duration194.26 ± (194.27 - 195.06) ms194.20 ± (194.19 - 195.16) ms-0.0%
.NET Framework 4.8 - Bailout
duration198.90 ± (198.73 - 199.42) ms198.23 ± (197.92 - 198.51) ms-0.3%
.NET Framework 4.8 - CallTarget+Inlining+NGEN
duration1148.23 ± (1150.99 - 1159.20) ms1148.52 ± (1149.48 - 1157.75) ms+0.0%✅⬆️
.NET Core 3.1 - Baseline
process.internal_duration_ms188.69 ± (188.26 - 189.13) ms188.49 ± (188.08 - 188.90) ms-0.1%
process.time_to_main_ms81.92 ± (81.67 - 82.17) ms81.72 ± (81.48 - 81.96) ms-0.2%
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed16.12 ± (16.10 - 16.15) MB16.13 ± (16.11 - 16.15) MB+0.0%✅⬆️
runtime.dotnet.threads.count20 ± (20 - 20)20 ± (20 - 20)-0.0%
.NET Core 3.1 - Bailout
process.internal_duration_ms188.22 ± (187.89 - 188.55) ms188.35 ± (187.90 - 188.81) ms+0.1%✅⬆️
process.time_to_main_ms82.78 ± (82.63 - 82.93) ms82.97 ± (82.79 - 83.15) ms+0.2%✅⬆️
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed16.19 ± (16.16 - 16.22) MB16.26 ± (16.23 - 16.28) MB+0.4%✅⬆️
runtime.dotnet.threads.count21 ± (21 - 21)21 ± (20 - 21)-0.0%
.NET Core 3.1 - CallTarget+Inlining+NGEN
process.internal_duration_ms442.28 ± (439.99 - 444.56) ms440.15 ± (438.02 - 442.29) ms-0.5%
process.time_to_main_ms477.87 ± (477.18 - 478.57) ms475.51 ± (474.93 - 476.09) ms-0.5%
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed57.99 ± (57.87 - 58.12) MB58.17 ± (58.05 - 58.29) MB+0.3%✅⬆️
runtime.dotnet.threads.count29 ± (29 - 29)29 ± (29 - 30)+0.1%✅⬆️
.NET 6 - Baseline
process.internal_duration_ms193.51 ± (193.06 - 193.96) ms191.98 ± (191.63 - 192.34) ms-0.8%
process.time_to_main_ms71.37 ± (71.13 - 71.60) ms70.51 ± (70.35 - 70.67) ms-1.2%
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed16.18 ± (16.05 - 16.30) MB16.41 ± (16.38 - 16.44) MB+1.5%✅⬆️
runtime.dotnet.threads.count19 ± (18 - 19)19 ± (19 - 19)+1.3%✅⬆️
.NET 6 - Bailout
process.internal_duration_ms192.04 ± (191.72 - 192.36) ms191.17 ± (190.81 - 191.53) ms-0.5%
process.time_to_main_ms72.03 ± (71.90 - 72.16) ms71.58 ± (71.42 - 71.73) ms-0.6%
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed16.31 ± (16.22 - 16.41) MB16.39 ± (16.31 - 16.47) MB+0.5%✅⬆️
runtime.dotnet.threads.count20 ± (20 - 20)20 ± (20 - 20)-0.5%
.NET 6 - CallTarget+Inlining+NGEN
process.internal_duration_ms452.30 ± (450.16 - 454.43) ms452.38 ± (450.55 - 454.20) ms+0.0%✅⬆️
process.time_to_main_ms452.33 ± (451.79 - 452.88) ms451.95 ± (451.41 - 452.48) ms-0.1%
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed58.11 ± (58.01 - 58.22) MB58.00 ± (57.89 - 58.10) MB-0.2%
runtime.dotnet.threads.count29 ± (29 - 29)29 ± (29 - 29)+0.1%✅⬆️
.NET 8 - Baseline
process.internal_duration_ms190.22 ± (189.91 - 190.53) ms191.76 ± (191.32 - 192.19) ms+0.8%✅⬆️
process.time_to_main_ms70.24 ± (70.04 - 70.43) ms70.43 ± (70.21 - 70.65) ms+0.3%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed11.70 ± (11.68 - 11.72) MB11.81 ± (11.78 - 11.84) MB+1.0%✅⬆️
runtime.dotnet.threads.count18 ± (18 - 18)18 ± (18 - 18)+0.3%✅⬆️
.NET 8 - Bailout
process.internal_duration_ms189.65 ± (189.35 - 189.95) ms190.23 ± (189.92 - 190.55) ms+0.3%✅⬆️
process.time_to_main_ms71.23 ± (71.09 - 71.37) ms71.19 ± (71.07 - 71.32) ms-0.1%
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed11.78 ± (11.75 - 11.81) MB11.84 ± (11.81 - 11.87) MB+0.5%✅⬆️
runtime.dotnet.threads.count19 ± (19 - 19)19 ± (19 - 19)-0.1%
.NET 8 - CallTarget+Inlining+NGEN
process.internal_duration_ms370.27 ± (368.82 - 371.71) ms367.16 ± (366.00 - 368.32) ms-0.8%
process.time_to_main_ms435.29 ± (434.68 - 435.89) ms437.12 ± (436.29 - 437.95) ms+0.4%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed47.78 ± (47.74 - 47.81) MB47.81 ± (47.78 - 47.84) MB+0.1%✅⬆️
runtime.dotnet.threads.count29 ± (29 - 29)29 ± (29 - 29)+0.5%✅⬆️
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 (8270) - mean (75ms)  : 72, 78
    master - mean (75ms)  : 73, 77

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

    section CallTarget+Inlining+NGEN
    This PR (8270) - mean (1,080ms)  : 1033, 1127
    master - mean (1,089ms)  : 1047, 1130

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 (8270) - mean (115ms)  : 112, 118
    master - mean (117ms)  : 113, 120

    section Bailout
    This PR (8270) - mean (116ms)  : 114, 118
    master - mean (118ms)  : 115, 121

    section CallTarget+Inlining+NGEN
    This PR (8270) - mean (774ms)  : 712, 837
    master - mean (766ms)  : 708, 823

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

    section Bailout
    This PR (8270) - mean (105ms)  : 102, 107
    master - mean (105ms)  : 103, 107

    section CallTarget+Inlining+NGEN
    This PR (8270) - mean (757ms)  : 682, 832
    master - mean (768ms)  : 707, 828

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

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

    section CallTarget+Inlining+NGEN
    This PR (8270) - mean (684ms)  : 656, 712
    master - mean (681ms)  : 651, 712

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 (8270) - mean (195ms)  : 188, 202
    master - mean (195ms)  : 191, 199

    section Bailout
    This PR (8270) - mean (198ms)  : 195, 201
    master - mean (199ms)  : 196, 202

    section CallTarget+Inlining+NGEN
    This PR (8270) - mean (1,154ms)  : 1092, 1215
    master - mean (1,155ms)  : 1095, 1215

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 (8270) - mean (279ms)  : 274, 284
    master - mean (279ms)  : 272, 286

    section Bailout
    This PR (8270) - mean (280ms)  : 272, 288
    master - mean (279ms)  : 275, 284

    section CallTarget+Inlining+NGEN
    This PR (8270) - mean (949ms)  : 911, 987
    master - mean (950ms)  : 913, 986

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

    section Bailout
    This PR (8270) - mean (271ms)  : 266, 275
    master - mean (272ms)  : 269, 276

    section CallTarget+Inlining+NGEN
    This PR (8270) - mean (934ms)  : 907, 962
    master - mean (934ms)  : 903, 965

Loading
HttpMessageHandler (.NET 8)
gantt
    title Execution time (ms) HttpMessageHandler (.NET 8)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8270) - mean (272ms)  : 266, 278
    master - mean (270ms)  : 265, 275

    section Bailout
    This PR (8270) - mean (271ms)  : 267, 275
    master - mean (270ms)  : 266, 275

    section CallTarget+Inlining+NGEN
    This PR (8270) - mean (836ms)  : 810, 862
    master - mean (836ms)  : 813, 859

Loading

@andrewlock
andrewlock force-pushed the andrew/msi-snapshot branch from ba74861 to e8bba96 Compare March 4, 2026 17:27
@andrewlock andrewlock mentioned this pull request Mar 5, 2026
@andrewlock
andrewlock marked this pull request as ready for review March 5, 2026 18:08
@andrewlock
andrewlock requested a review from a team as a code owner March 5, 2026 18:08

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

Copy link
Copy Markdown

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: 14e4b48bcf

ℹ️ 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 thread tracer/build/_build/Build.Steps.cs Outdated
@andrewlock
andrewlock force-pushed the andrew/msi-snapshot branch from 14e4b48 to 2b3dfb6 Compare March 6, 2026 11:14
Version: ''
LibDdwaf.32:
Attributes: 1536
Component_: Datadog.Tracer.Native.32

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Gonna be honest, not sure what I'm lookin at entirely here but all the other components are teh same as the main yaml thing

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

not sure what I'm lookin at entirely here

You and me both 😅 It's basically the "internal tables" of the MSI, so shouldn't change, I just wanted to make sure I could tell if the WiX

Gonna be honest, not sure what I'm lookin at entirely here but all the other components are teh same as the main yaml thing

As best as I can tell, it's because of how this is currently configured - ddwaf is added to the same component as the tracer:

<Component Win64="$(var.Win64)" Id="Datadog.Tracer.Native.32">
<File Id="Datadog.Tracer.Native.32"
Source="$(var.MonitoringHomeDirectory)\win-x86\Datadog.Tracer.Native.dll"
Checksum="yes">
</File>
<File Id="LibDdwaf.32"
Source="$(var.MonitoringHomeDirectory)\win-x86\ddwaf.dll"
Checksum="yes">
</File>
</Component>

I don't think it should be, because it's the only case of this pattern we have, but also, I guess it doesn't matter 😅

@lucaspimentel lucaspimentel left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

nice

@andrewlock
andrewlock merged commit bd78f50 into master Mar 13, 2026
137 checks passed
@andrewlock
andrewlock deleted the andrew/msi-snapshot branch March 13, 2026 09:49
@github-actions github-actions Bot added this to the vNext-v3 milestone Mar 13, 2026
andrewlock added a commit that referenced this pull request Mar 13, 2026
## Summary of changes

Updates our MSI project to use [Wix
5.x.x](https://docs.firegiant.com/wix/whatsnew/#whats-new-in-wix-v5)
instead of Wix 3

## Reason for change

[Wix 3 was deprecated a year ago](https://docs.firegiant.com/wix/wix3/),
and is generally clunky and hard to use, as it relies on a global
install + .NET Framework 3.5. The newer versions of Wix use newer
SDK-style projects, are deployed as nuget packages, and can just be
built with a normal `dotnet build`

- Wix 4: Quite a big change
- Wix 5: Pretty much back-compatible with 4
- Wix 6: [Shifted licensing
model](https://docs.firegiant.com/wix/whatsnew/#open-source-maintenance-fee)
- we need to look into this if we want to upgrade further.
- Wix 7: As above 

## Implementation details

This was entirely 🤖 driven, but [there's also a .NET
tool](https://docs.firegiant.com/wix/whatsnew/#convert-wix-authoring-from-the-command-line)
to help with the conversion. _Mostly_ the changes are just "annoying",
e.g. moving values from being element text to a `Value` property, etc.

## Test coverage

At the end of the day, the generated MSI is _essentially_ the same as
confirmed by the snapshots created in #8270. The changes all appear to
be benign changes in hashing algorithms, or renaming of wix properties.

What's more, I tested the install, and it _looks_ the same (and works),
and the MSI tests all pass, which is obviously the important thing! 😄

<img width="495" height="387" alt="image"
src="https://github.com/user-attachments/assets/54995470-b846-419c-9f18-e07c1daae127"
/>
<img width="495" height="387" alt="image"
src="https://github.com/user-attachments/assets/0997801f-7143-4c25-88d4-d66ad2404968"
/>
<img width="495" height="387" alt="image"
src="https://github.com/user-attachments/assets/63381b12-f312-4b45-9ae3-d2c77b23d377"
/>
<img width="495" height="387" alt="image"
src="https://github.com/user-attachments/assets/320758a9-f0b7-42e8-a1db-4c8b4b8514ad"
/>
<img width="495" height="387" alt="image"
src="https://github.com/user-attachments/assets/65e1fa04-f02e-42bf-8fcd-efe704000901"
/>


## Other details

The removal of the `Win64="yes"` and `Win64="$(var.Win64)"` attributes
were the main thing I was unsure about. There _is_ [a `Bitness`
attribute now](https://docs.firegiant.com/wix/schema/wxs/component/),
with values `default`, `always32`, or `always64`, which is pretty much
equivalent. However, seeing as we _only_ produce an x64 installer, and
not an x86 installer, I think this is essentially just legacy cruft
which is ok to remove. We _might_ regret that choice if/when we need an
arm64 installer, but I think we'll need to look at everything again at
that point anyway, so I don't think it's worth worrying about 😄

---------

Co-authored-by: Claude <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:builds project files, build scripts, pipelines, versioning, releases, packages

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants