Skip to content

Move running of smoke tests to Nuke#8271

Open
andrewlock wants to merge 61 commits intomasterfrom
andrew/ci/move-smoke-tests-to-nuke
Open

Move running of smoke tests to Nuke#8271
andrewlock wants to merge 61 commits intomasterfrom
andrew/ci/move-smoke-tests-to-nuke

Conversation

@andrewlock
Copy link
Member

@andrewlock andrewlock commented Mar 4, 2026

Summary of changes

Instead of most of the logic for running smoke tests being embedded in the yaml and bash inside yaml, move the building and running of smoke tests into Nuke.

Reason for change

The previous design had some downsides:

  • Very tied to Azure Devops. If we want to migrate to gitlab at some point, this should make it easier, because devops is "doing less"
  • Hard to run smoke tests locally. If you wanted to investigate a scenario, you'd have to decode all the docker, docker compose, and bash scripts that you needed to run to get something resembling the test setup.
  • There was a lot of duplication, because it's hard to remove that in a clean way from some of the yaml without creating loads of fine-grained steps (which have their own difficulties). Moving to C# makes it easy to (for example) have try-catch blocks, custom retries etc
  • Bash in YAML is kind of ewww

Implementation details

I initially tried to implement this over a year ago, using TestContainers, but tl;dr; I ran into a bunch of limitations that I couldn't get past (APIs that we needed, which just didn't exist, differences between windows/linux etc), so I abandoned it. Until 🤖 made exploring these things easier again!

The latest approach uses the https://github.com/dotnet/Docker.DotNet/ project, which provides a strongly-typed way to call the docker HTTP API (which is what TestContainers actually uses under the hood - it even uses this project). This made it much easier to convert the explicit steps that we are doing currently in bash/yaml/docker-compose to being simple C# methods.

At a high level, the implementation roughly follows what we have today, but it's tied much less to the azure devops infrastructure, as we just run our Nuke tasks in the same way we do today (i.e. directly on the box for Windows, in a docker container for Linux).

A high level overview:

  • The GenerateVariables stage still generates the matrix of variables, but it only needs to generate a category (e.g. LinuxX64Installer/WindowsFleetInstallerIis), and an associated scenario (the specific test, e.g. ubuntu, .NET 10, .deb).
  • Renamed the stages (and associated matricies) to make them more consistent e.g.. smoke_<x64|arm64|win|macos>_<installer|nuget|fleet>_tests. We can easily tweak this if we prefer
  • To run a test (e.g. locally) build.ps1 RunArtifactSmokeTests -SmokeTestCategory "LinuxX64Installer" -SmokeTestScenario "someScenario"
  • All of the work for building the images, building/pulling the test agent/running the smoke tests/running crash tests/Doing snapshot verification is handled by Nuke. We have automatic retries around all the parts that could fail (i.e. anything docker or HTTP related)

That also means we can delete various things

  • All the old stages in the pipelin
  • The old run-snapshot-test.yml
  • The entries in the docker-compose (the test-agent is actually still used in a few places, so those stay)

Also includes a few tiny tweaks and cleanup (commented in the files as appropriate)

Test coverage

The same hopefully!? I've run the full sweet of tests several times, and spot checked various of the tests to make sure everything looks ok, and as far as I can tell, it does! Also temporarily modified the snapshots to confirm that causes everything to fail too

Other details

The big one which I didn't/couldn't easily convert is the macos smoke tests. These are written completely differently today, because they don't run in containers (which means we have to handle a whole bunch of different issues) and rather just duplicate a whole bunch of logic. It's probably not worth the effort to port them into Nuke at the moment, but I'm open to doing it in a follow up if people feel one way or the other.

The other thing is that I didn't move the "downloading of artifacts" into the nuke job, though technically we could, and it would make running locally even easier. My reason for not doing that was that it ties the nuke side to the azure devops side completely then, and if we rename an artifact in the yaml (for some reason) it's far more likely we'll forget it on the c# side.

@andrewlock andrewlock requested a review from a team as a code owner March 4, 2026 15:37
@andrewlock andrewlock added area:builds project files, build scripts, pipelines, versioning, releases, packages AI Generated Largely based on code generated by an AI or LLM. This label is the same across all dd-trace-* repos labels Mar 4, 2026
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: 6598bb787a

ℹ️ 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".

COPY --chown=$APP_UID --from=builder /empty/ /var/log/datadog/dotnet/

# Ensure /app is writable by the non-root user (for completed.txt marker)
COPY --chown=$APP_UID --from=builder /empty/ /app/
Copy link
Member Author

Choose a reason for hiding this comment

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

This is a funny one, I don't think it can ever have been working, so I think this is fine

cd /install; \
Expand-Archive 'c:\install\windows-tracer-home.zip' -DestinationPath 'c:\monitoring-home\'; \
c:\install\installer\Datadog.FleetInstaller.exe install-version --home-path c:\monitoring-home; \
c:\install\Datadog.FleetInstaller.exe install-version --home-path c:\monitoring-home; \
Copy link
Member Author

Choose a reason for hiding this comment

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

dropping the installer intermediate directory just makes the artifact download step a bit simpler


return scenarios.SelectMany(x => x);

// ─────────────────────────────────────────────────────────
Copy link
Member Author

Choose a reason for hiding this comment

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

This is essentially the same matrix of tests we ran previously

throw new Exception("Failed to download telemetry forwarder");
}

static string GetDotnetSdkVersion(AbsolutePath rootDirectory)
Copy link
Member Author

Choose a reason for hiding this comment

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

Could be handy elsewhere too tbh, though I haven't used it anywhere yet

? "Successfully submitted metric"
: "Failed to submit metric";
log.Warning("{Result} {MetricName} to {Uri}. Response was: Code: {ResponseStatusCode}. Response: {ResponseContent}. Payload sent was: \"{Payload}\"", result, metricName, uri, response.StatusCode, responseContent, payload);
var level = response.IsSuccessStatusCode ? LogEventLevel.Debug : LogEventLevel.Warning;
Copy link
Member Author

Choose a reason for hiding this comment

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

This was incorrectly logging as a warning even for success, which causes it to show up in the azdo logs

@pr-commenter
Copy link

pr-commenter bot commented Mar 5, 2026

Benchmarks

Benchmark execution time: 2026-03-06 15:00:15

Comparing candidate commit a8f3d3b in PR branch andrew/ci/move-smoke-tests-to-nuke with baseline commit 76f3785 in branch master.

Found 11 performance improvements and 6 performance regressions! Performance is the same for 157 metrics, 18 unstable metrics.

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

  • 🟩 execution_time [-81.362ms; -81.008ms] or [-40.208%; -40.034%]

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

  • 🟥 execution_time [+15.563ms; +21.991ms] or [+7.795%; +11.015%]

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

  • 🟩 execution_time [-16.096ms; -11.522ms] or [-7.683%; -5.499%]

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

  • 🟩 execution_time [-24.003ms; -18.097ms] or [-11.019%; -8.308%]

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

  • 🟩 execution_time [-51.753ms; -49.613ms] or [-24.978%; -23.945%]
  • 🟩 throughput [+160.488op/s; +176.160op/s] or [+10.937%; +12.005%]

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

  • 🟥 throughput [-265.087op/s; -232.562op/s] or [-15.931%; -13.976%]

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

  • 🟥 throughput [-185.210op/s; -135.951op/s] or [-35.811%; -26.287%]

scenario:Benchmarks.Trace.ElasticsearchBenchmark.CallElasticsearchAsync net472

  • 🟩 throughput [+33689.148op/s; +35714.333op/s] or [+11.927%; +12.643%]

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

  • 🟥 execution_time [+10.916ms; +16.209ms] or [+5.488%; +8.148%]

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

  • 🟩 execution_time [-9.393µs; -6.083µs] or [-19.082%; -12.357%]
  • 🟩 throughput [+2910.327op/s; +4092.563op/s] or [+14.112%; +19.844%]

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

  • 🟥 execution_time [+13.129ms; +15.885ms] or [+8.235%; +9.964%]

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

  • 🟥 throughput [-17082.153op/s; -13176.707op/s] or [-7.046%; -5.435%]

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

  • 🟩 throughput [+14239274.756op/s; +15633296.607op/s] or [+6.306%; +6.923%]

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

  • 🟩 execution_time [-18.875ms; -13.259ms] or [-8.885%; -6.242%]

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

  • 🟩 execution_time [-19.638ms; -15.730ms] or [-9.127%; -7.311%]

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

dd-trace-dotnet-ci-bot bot commented Mar 5, 2026

Execution-Time Benchmarks Report ⏱️

Execution-time results for samples comparing This PR (8271) 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) ms77.01 ± (77.04 - 77.36) ms+2.6%✅⬆️
.NET Framework 4.8 - Bailout
duration79.17 ± (79.06 - 79.39) ms81.22 ± (81.17 - 81.55) ms+2.6%✅⬆️
.NET Framework 4.8 - CallTarget+Inlining+NGEN
duration1084.74 ± (1085.98 - 1091.80) ms1098.37 ± (1098.64 - 1104.81) ms+1.3%✅⬆️
.NET Core 3.1 - Baseline
process.internal_duration_ms22.84 ± (22.80 - 22.88) ms23.09 ± (23.04 - 23.13) ms+1.1%✅⬆️
process.time_to_main_ms86.51 ± (86.33 - 86.69) ms88.60 ± (88.39 - 88.82) ms+2.4%✅⬆️
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) ms23.07 ± (23.02 - 23.12) ms+1.2%✅⬆️
process.time_to_main_ms88.18 ± (87.97 - 88.40) ms90.15 ± (89.94 - 90.36) ms+2.2%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.95 ± (10.95 - 10.96) MB10.96 ± (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) ms245.34 ± (241.12 - 249.56) ms+2.6%✅⬆️
process.time_to_main_ms492.10 ± (491.42 - 492.79) ms506.15 ± (505.35 - 506.95) ms+2.9%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed47.59 ± (47.56 - 47.61) MB47.65 ± (47.63 - 47.68) 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) ms22.22 ± (22.16 - 22.27) ms+2.2%✅⬆️
process.time_to_main_ms75.69 ± (75.51 - 75.87) ms77.63 ± (77.43 - 77.82) ms+2.6%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.64 ± (10.64 - 10.64) MB10.64 ± (10.63 - 10.64) 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) ms22.13 ± (22.08 - 22.18) ms+2.5%✅⬆️
process.time_to_main_ms76.71 ± (76.52 - 76.90) ms78.72 ± (78.51 - 78.93) ms+2.6%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.67 ± (10.67 - 10.68) MB10.75 ± (10.75 - 10.76) MB+0.7%✅⬆️
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) ms257.38 ± (253.67 - 261.08) ms-0.1%
process.time_to_main_ms476.91 ± (476.21 - 477.61) ms484.01 ± (482.99 - 485.04) ms+1.5%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed48.31 ± (48.29 - 48.33) MB48.34 ± (48.32 - 48.36) MB+0.1%✅⬆️
runtime.dotnet.threads.count28 ± (28 - 28)28 ± (28 - 28)+0.0%
.NET 8 - Baseline
process.internal_duration_ms19.74 ± (19.71 - 19.78) ms20.25 ± (20.21 - 20.30) ms+2.6%✅⬆️
process.time_to_main_ms74.80 ± (74.64 - 74.95) ms76.66 ± (76.50 - 76.82) ms+2.5%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed7.68 ± (7.67 - 7.68) MB7.68 ± (7.67 - 7.68) MB+0.0%✅⬆️
runtime.dotnet.threads.count10 ± (10 - 10)10 ± (10 - 10)+0.0%
.NET 8 - Bailout
process.internal_duration_ms19.67 ± (19.62 - 19.71) ms20.51 ± (20.46 - 20.56) ms+4.3%✅⬆️
process.time_to_main_ms75.29 ± (75.15 - 75.43) ms78.71 ± (78.52 - 78.90) ms+4.5%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed7.76 ± (7.75 - 7.77) MB7.76 ± (7.75 - 7.77) MB+0.0%✅⬆️
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) ms194.63 ± (193.86 - 195.39) ms+1.9%✅⬆️
process.time_to_main_ms456.81 ± (456.13 - 457.48) ms464.47 ± (463.75 - 465.19) ms+1.7%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed36.12 ± (36.09 - 36.16) MB36.18 ± (36.15 - 36.22) MB+0.2%✅⬆️
runtime.dotnet.threads.count27 ± (27 - 27)27 ± (27 - 27)-0.3%

HttpMessageHandler

Metric Master (Mean ± 95% CI) Current (Mean ± 95% CI) Change Status
.NET Framework 4.8 - Baseline
duration194.26 ± (194.27 - 195.06) ms197.09 ± (197.04 - 197.96) ms+1.5%✅⬆️
.NET Framework 4.8 - Bailout
duration198.90 ± (198.73 - 199.42) ms199.87 ± (199.37 - 200.22) ms+0.5%✅⬆️
.NET Framework 4.8 - CallTarget+Inlining+NGEN
duration1148.23 ± (1150.99 - 1159.20) ms1156.50 ± (1158.99 - 1167.40) ms+0.7%✅⬆️
.NET Core 3.1 - Baseline
process.internal_duration_ms188.69 ± (188.26 - 189.13) ms190.29 ± (189.88 - 190.70) ms+0.8%✅⬆️
process.time_to_main_ms81.92 ± (81.67 - 82.17) ms82.98 ± (82.73 - 83.24) ms+1.3%✅⬆️
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed16.12 ± (16.10 - 16.15) MB16.06 ± (16.04 - 16.08) MB-0.4%
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) ms189.84 ± (189.36 - 190.33) ms+0.9%✅⬆️
process.time_to_main_ms82.78 ± (82.63 - 82.93) ms84.02 ± (83.82 - 84.21) ms+1.5%✅⬆️
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed16.19 ± (16.16 - 16.22) MB16.13 ± (16.10 - 16.16) MB-0.3%
runtime.dotnet.threads.count21 ± (21 - 21)21 ± (20 - 21)-0.2%
.NET Core 3.1 - CallTarget+Inlining+NGEN
process.internal_duration_ms442.28 ± (439.99 - 444.56) ms445.17 ± (442.89 - 447.46) ms+0.7%✅⬆️
process.time_to_main_ms477.87 ± (477.18 - 478.57) ms482.01 ± (481.24 - 482.78) ms+0.9%✅⬆️
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed57.99 ± (57.87 - 58.12) MB57.89 ± (57.77 - 58.00) MB-0.2%
runtime.dotnet.threads.count29 ± (29 - 29)29 ± (29 - 29)-0.0%
.NET 6 - Baseline
process.internal_duration_ms193.51 ± (193.06 - 193.96) ms193.73 ± (193.28 - 194.18) ms+0.1%✅⬆️
process.time_to_main_ms71.37 ± (71.13 - 71.60) ms71.49 ± (71.29 - 71.68) ms+0.2%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed16.18 ± (16.05 - 16.30) MB16.33 ± (16.24 - 16.42) MB+0.9%✅⬆️
runtime.dotnet.threads.count19 ± (18 - 19)18 ± (18 - 19)-1.2%
.NET 6 - Bailout
process.internal_duration_ms192.04 ± (191.72 - 192.36) ms193.45 ± (193.16 - 193.75) ms+0.7%✅⬆️
process.time_to_main_ms72.03 ± (71.90 - 72.16) ms72.22 ± (72.09 - 72.36) ms+0.3%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed16.31 ± (16.22 - 16.41) MB16.27 ± (16.15 - 16.38) MB-0.3%
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) ms453.47 ± (451.30 - 455.65) ms+0.3%✅⬆️
process.time_to_main_ms452.33 ± (451.79 - 452.88) ms454.71 ± (454.19 - 455.22) ms+0.5%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed58.11 ± (58.01 - 58.22) MB58.18 ± (58.06 - 58.31) MB+0.1%✅⬆️
runtime.dotnet.threads.count29 ± (29 - 29)29 ± (29 - 29)+0.2%✅⬆️
.NET 8 - Baseline
process.internal_duration_ms190.22 ± (189.91 - 190.53) ms191.34 ± (191.00 - 191.67) ms+0.6%✅⬆️
process.time_to_main_ms70.24 ± (70.04 - 70.43) ms71.02 ± (70.82 - 71.23) ms+1.1%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed11.70 ± (11.68 - 11.72) MB11.77 ± (11.75 - 11.79) MB+0.6%✅⬆️
runtime.dotnet.threads.count18 ± (18 - 18)18 ± (18 - 18)-0.1%
.NET 8 - Bailout
process.internal_duration_ms189.65 ± (189.35 - 189.95) ms192.01 ± (191.61 - 192.41) ms+1.2%✅⬆️
process.time_to_main_ms71.23 ± (71.09 - 71.37) ms72.08 ± (71.90 - 72.25) ms+1.2%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed11.78 ± (11.75 - 11.81) MB11.77 ± (11.74 - 11.79) MB-0.1%
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) ms369.34 ± (367.75 - 370.93) ms-0.3%
process.time_to_main_ms435.29 ± (434.68 - 435.89) ms440.10 ± (439.38 - 440.83) ms+1.1%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed47.78 ± (47.74 - 47.81) MB47.88 ± (47.84 - 47.92) MB+0.2%✅⬆️
runtime.dotnet.threads.count29 ± (29 - 29)29 ± (29 - 29)+0.6%✅⬆️
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 (8271) - mean (77ms)  : 75, 80
    master - mean (75ms)  : 73, 77

    section Bailout
    This PR (8271) - mean (81ms)  : 79, 84
    master - mean (79ms)  : 78, 81

    section CallTarget+Inlining+NGEN
    This PR (8271) - mean (1,102ms)  : 1056, 1148
    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 (8271) - mean (119ms)  : 115, 123
    master - mean (117ms)  : 113, 120

    section Bailout
    This PR (8271) - mean (120ms)  : 117, 123
    master - mean (118ms)  : 115, 121

    section CallTarget+Inlining+NGEN
    This PR (8271) - mean (790ms)  : 721, 858
    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 (8271) - mean (107ms)  : 104, 110
    master - mean (104ms)  : 101, 107

    section Bailout
    This PR (8271) - mean (107ms)  : 105, 110
    master - mean (105ms)  : 103, 107

    section CallTarget+Inlining+NGEN
    This PR (8271) - mean (770ms)  : 688, 852
    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 (8271) - mean (105ms)  : 102, 108
    master - mean (103ms)  : 100, 105

    section Bailout
    This PR (8271) - mean (107ms)  : 105, 110
    master - mean (103ms)  : 101, 105

    section CallTarget+Inlining+NGEN
    This PR (8271) - mean (696ms)  : 667, 725
    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 (8271) - mean (197ms)  : 192, 203
    master - mean (195ms)  : 191, 199

    section Bailout
    This PR (8271) - mean (200ms)  : 196, 204
    master - mean (199ms)  : 196, 202

    section CallTarget+Inlining+NGEN
    This PR (8271) - mean (1,163ms)  : 1101, 1226
    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 (8271) - mean (283ms)  : 274, 291
    master - mean (279ms)  : 272, 286

    section Bailout
    This PR (8271) - mean (283ms)  : 276, 289
    master - mean (279ms)  : 275, 284

    section CallTarget+Inlining+NGEN
    This PR (8271) - mean (954ms)  : 899, 1009
    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 (8271) - mean (274ms)  : 268, 280
    master - mean (274ms)  : 268, 279

    section Bailout
    This PR (8271) - mean (274ms)  : 270, 277
    master - mean (272ms)  : 269, 276

    section CallTarget+Inlining+NGEN
    This PR (8271) - mean (939ms)  : 908, 971
    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 (8271) - mean (272ms)  : 267, 278
    master - mean (270ms)  : 265, 275

    section Bailout
    This PR (8271) - mean (274ms)  : 268, 280
    master - mean (270ms)  : 266, 275

    section CallTarget+Inlining+NGEN
    This PR (8271) - mean (842ms)  : 819, 864
    master - mean (836ms)  : 813, 859

Loading

@andrewlock andrewlock force-pushed the andrew/ci/move-smoke-tests-to-nuke branch from ba98d2f to 7134150 Compare March 6, 2026 12:32
}
}

//
Copy link
Collaborator

Choose a reason for hiding this comment

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

probably we can remove this comment

GenerateLinuxSmokeTestsArm64Matrix();
GenerateLinuxChiseledInstallerSmokeTestsMatrix();
GenerateLinuxChiseledInstallerArm64SmokeTestsMatrix();
GenerateNukeSmokeTestsMatricies();
Copy link
Collaborator

Choose a reason for hiding this comment

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

typo, right?

Copy link
Member Author

Choose a reason for hiding this comment

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

True, it should be Matrices

ForceRemove = true,
};

for (var attempt = 1; attempt <= MaxRetries; attempt++)
Copy link
Collaborator

Choose a reason for hiding this comment

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

Could we use the RetryAsync helper method here for consistency?

Copy link
Member Author

Choose a reason for hiding this comment

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

Yep, I blame the AI 😂

HostConfig = new HostConfig
{
Init = true,
Binds = new List<string>
Copy link
Collaborator

Choose a reason for hiding this comment

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

In the prvious method, we were using isWindowsScenario, but not here, should we?

Copy link
Member Author

Choose a reason for hiding this comment

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

We don't (can't, I believe) run crash-test scenario on Windows I believe, but it doesn't hurt 👍 I actually thought I already made that change 😅

Copy link
Collaborator

@NachoEchevarria NachoEchevarria left a comment

Choose a reason for hiding this comment

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

Amazing work. Thanks! While I totally understand that this needs to be a large PR, it's hard to analyze everything in depth. Still, if CI passes, I think that we are pretty covered.

@andrewlock andrewlock force-pushed the andrew/ci/move-smoke-tests-to-nuke branch from b758de1 to a8f3d3b Compare March 6, 2026 14:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

AI Generated Largely based on code generated by an AI or LLM. This label is the same across all dd-trace-* repos area:builds project files, build scripts, pipelines, versioning, releases, packages

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants