Skip to content

Introduce Datadog.Trace.Build.g.sln to reduce size of artifacts copied between stages#8610

Merged
andrewlock merged 5 commits into
masterfrom
andrew/reduce-ci-copying
May 20, 2026
Merged

Introduce Datadog.Trace.Build.g.sln to reduce size of artifacts copied between stages#8610
andrewlock merged 5 commits into
masterfrom
andrew/reduce-ci-copying

Conversation

@andrewlock

Copy link
Copy Markdown
Member

Summary of changes

  • Introduce .artifactignore to prevent uploading .cs files etc which we don't need
  • Introduce Datadog.Trace.Build.g.sln (counterpoint of Datadog.Trace.Samples.g.sln)
  • Reduce size of copied artifacts

Reason for change

In CI, we currently build the sample applications in a separate distinct stage. However, as our Datadog.Trace.sln references all the samples, the "restore" step in the "standard" build restores all the packages for all the samples.

What's worse, is that we then end up copying these packages between all the subsequent stages (unit tests, integration tests etc). That significantly increases the size of the artifacts, and they aren't actually needed.

Additionally, because we upload the whole working directory, we're also uploading all the repo files like .cs and .md files. We filter these out when we do the download, so this is just wasted space and time going into the upload.

Implementation details

This is an AI assisted revisit of work I tried a long time ago - turns out we'd already done most of the leg work to make this simpler.

  • Add an .artifactignore file - only upload bin/obj/packages/artifacts
  • As well as generating the "samples" solution which we use in the "build-samples" stage, we also generate a "build" solution, which is essentially the "inverse" of the Samples solution.
  • Update build to use the "build" solution for most things
  • Fix some cases that should have already been using the samples solution (mostly debugger bits)
  • Remove the "don't restore" step for some of the cases which now need it. This seems to generally be the simplest solution for edge cases where a sample is referenced directly by a test project, rather than trying to have the sample appear in both sln files or something similar, but we may want/need to revisit that. For now, as long as the CI passes, I think it's ok.

Test coverage

I did a "full" build (all products) here - as long as that looks to be working, and there's no obvious "zero-length" stages or anything similar, then we should be good 🤞

Artifact Size on master Size with Build.g.sln Reduction
windows 13782 MB 8323 MB -5.5 GB (-40%)
linux-x64 9227 MB 4736 MB -4.5 GB (-49%)
linux-musl-x64 9239 MB 4748 MB -4.5 GB (-49%)
linux-arm64 9240 MB 4708 MB -4.5 GB (-49%)
linux-x64-r2r 9240 MB 4749 MB -4.5 GB (-49%)
linux-arm64-r2r 9258 MB 4726 MB -4.5 GB (-49%)
linux-musl-arm64 9267 MB 4731 MB -4.5 GB (-49%)
macos 8646 MB 3684 MB -5.0 GB (-57%)

Other details

I think there's various follow up steps as well , e.g. to stop needing the obj folder at all, or to use artifact layout everywhere, (all as precursors to potentially migrating to GitLab FWIW 🙈)

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

pr-commenter Bot commented May 12, 2026

Copy link
Copy Markdown

Benchmarks

Benchmark execution time: 2026-05-12 15:22:25

Comparing candidate commit 8b05a4a in PR branch andrew/reduce-ci-copying with baseline commit 7ad43ab in branch master.

Some scenarios are present only in baseline or only in candidate runs. If you didn't create or remove some scenarios in your branch, this maybe a sign of crashed benchmarks 💥💥💥
Check Gitlab CI job log to find if any benchmark has crashed.

Scenarios present only in baseline:

  • Benchmarks.OpenTelemetry.Api.Trace.ActivityBenchmark.StartSpan netcoreapp3.1
  • Benchmarks.OpenTelemetry.Api.Trace.ActivityBenchmark.StartSpan_AddEvent_Sampled net472
  • Benchmarks.OpenTelemetry.Api.Trace.TelemetrySpanBenchmark.StartSpan_UpdateName_Sampled netcoreapp3.1
  • Benchmarks.OpenTelemetry.Api.Trace.ActivityBenchmark.StartSpan_AddEvent_Sampled netcoreapp3.1
  • Benchmarks.OpenTelemetry.Api.Trace.TelemetrySpanBenchmark.StartSpan_UpdateName_Sampled net6.0
  • Benchmarks.OpenTelemetry.Api.Trace.TelemetrySpanBenchmark.StartSpan_GetContext_Sampled net472
  • Benchmarks.OpenTelemetry.Api.Trace.TelemetrySpanBenchmark.StartSpan_RecordException_Sampled netcoreapp3.1
  • Benchmarks.OpenTelemetry.Api.Trace.ActivityBenchmark.StartSpan_SetStatus_Sampled net6.0
  • Benchmarks.OpenTelemetry.Api.Trace.TelemetrySpanBenchmark.StartSpan netcoreapp3.1
  • Benchmarks.OpenTelemetry.Api.Trace.ActivityBenchmark.StartSpan_SetStatus_Sampled netcoreapp3.1
  • Benchmarks.OpenTelemetry.Api.Trace.TelemetrySpanBenchmark.StartSpan_SetStatus_Sampled net472
  • Benchmarks.OpenTelemetry.Api.Trace.ActivityBenchmark.StartSpan_UpdateName_Sampled net472
  • Benchmarks.OpenTelemetry.Api.Trace.ActivityBenchmark.StartSpan_UpdateName_Sampled net6.0
  • Benchmarks.OpenTelemetry.Api.Trace.TelemetrySpanBenchmark.StartSpan_RecordException_Sampled net472
  • Benchmarks.OpenTelemetry.Api.Trace.ActivityBenchmark.StartSpan_GetContext_Sampled net6.0
  • Benchmarks.OpenTelemetry.Api.Trace.ActivityBenchmark.StartSpan_UpdateName_Sampled netcoreapp3.1
  • Benchmarks.OpenTelemetry.Api.Trace.TelemetrySpanBenchmark.StartSpan_SetStatus_Sampled net6.0
  • Benchmarks.OpenTelemetry.Api.Trace.ActivityBenchmark.StartSpan_GetContext_Sampled net472
  • Benchmarks.OpenTelemetry.Api.Trace.ActivityBenchmark.StartSpan net472
  • Benchmarks.OpenTelemetry.Api.Trace.TelemetrySpanBenchmark.StartSpan_GetContext_Sampled net6.0
  • Benchmarks.OpenTelemetry.Api.Trace.TelemetrySpanBenchmark.StartSpan net472
  • Benchmarks.OpenTelemetry.Api.Trace.TelemetrySpanBenchmark.StartSpan_UpdateName_Sampled net472
  • Benchmarks.OpenTelemetry.Api.Trace.ActivityBenchmark.StartSpan_SetAttributes_Sampled netcoreapp3.1
  • Benchmarks.OpenTelemetry.Api.Trace.TelemetrySpanBenchmark.StartSpan_SetAttributes_Sampled net472
  • Benchmarks.OpenTelemetry.Api.Trace.TelemetrySpanBenchmark.StartSpan_SetAttributes_Sampled netcoreapp3.1
  • Benchmarks.OpenTelemetry.Api.Trace.TelemetrySpanBenchmark.StartSpan net6.0
  • Benchmarks.OpenTelemetry.Api.Trace.ActivityBenchmark.StartSpan net6.0
  • Benchmarks.OpenTelemetry.Api.Trace.ActivityBenchmark.StartSpan_SetStatus_Sampled net472
  • Benchmarks.OpenTelemetry.Api.Trace.TelemetrySpanBenchmark.StartSpan_AddEvent_Sampled net472
  • Benchmarks.OpenTelemetry.Api.Trace.ActivityBenchmark.StartSpan_GetContext_Sampled netcoreapp3.1
  • Benchmarks.OpenTelemetry.Api.Trace.TelemetrySpanBenchmark.StartSpan_RecordException_Sampled net6.0
  • Benchmarks.OpenTelemetry.Api.Trace.TelemetrySpanBenchmark.StartSpan_AddEvent_Sampled net6.0
  • Benchmarks.OpenTelemetry.Api.Trace.ActivityBenchmark.StartSpan_SetAttributes_Sampled net472
  • Benchmarks.OpenTelemetry.Api.Trace.ActivityBenchmark.StartSpan_AddEvent_Sampled net6.0
  • Benchmarks.OpenTelemetry.Api.Trace.TelemetrySpanBenchmark.StartSpan_SetAttributes_Sampled net6.0
  • Benchmarks.OpenTelemetry.Api.Trace.TelemetrySpanBenchmark.StartSpan_GetContext_Sampled netcoreapp3.1
  • Benchmarks.OpenTelemetry.Api.Trace.ActivityBenchmark.StartSpan_SetAttributes_Sampled net6.0
  • Benchmarks.OpenTelemetry.Api.Trace.TelemetrySpanBenchmark.StartSpan_AddEvent_Sampled netcoreapp3.1
  • Benchmarks.OpenTelemetry.Api.Trace.TelemetrySpanBenchmark.StartSpan_SetStatus_Sampled netcoreapp3.1

Found 3 performance improvements and 3 performance regressions! Performance is the same for 48 metrics, 18 unstable metrics, 89 known flaky benchmarks, 37 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.OpenTelemetry.InstrumentedApi.Trace.TracerBenchmark.StartActiveSpan net6.0

  • 🟩 allocated_mem [-144 bytes; -143 bytes] or [-9.188%; -9.180%]

scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TracerBenchmark.StartRootSpan net6.0

  • 🟩 allocated_mem [-144 bytes; -143 bytes] or [-9.188%; -9.180%]

scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TracerBenchmark.StartSpan_GetCurrentSpan net6.0

  • 🟥 allocated_mem [+143 bytes; +144 bytes] or [+10.108%; +10.117%]

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

  • 🟥 throughput [-69314.820op/s; -62649.218op/s] or [-47.087%; -42.559%]
  • 🟩 execution_time [-39.883ms; -25.664ms] or [-19.792%; -12.735%]

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

  • 🟥 throughput [-57704.670op/s; -41977.743op/s] or [-28.933%; -21.048%]

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.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan net6.0

  • unstable execution_time [-4.823ms; +22.727ms] or [-3.382%; +15.938%]
  • unstable throughput [-34250.204op/s; -11667.444op/s] or [-18.132%; -6.177%]

scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan netcoreapp3.1

  • unstable execution_time [+4.433ms; +42.333ms] or [+3.899%; +37.240%]

scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_AddEvent_Sampled net6.0

  • unstable execution_time [-20.561ms; -3.097ms] or [-14.439%; -2.175%]

scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_AddEvent_Sampled netcoreapp3.1

  • unstable execution_time [-17461.225µs; +17808.593µs] or [-15.553%; +15.862%]

scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_GetContext_Sampled net6.0

  • unstable execution_time [-6.706ms; +19.114ms] or [-5.011%; +14.283%]
  • unstable throughput [-9819.320op/s; +15596.005op/s] or [-5.739%; +9.115%]

scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_SetAttributes_Sampled netcoreapp3.1

  • unstable execution_time [+9.019ms; +34.096ms] or [+9.833%; +37.172%]

scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_SetStatus_Sampled net6.0

  • unstable execution_time [-7.599ms; +30.199ms] or [-5.422%; +21.548%]
  • unstable throughput [-17588.352op/s; +12218.122op/s] or [-9.975%; +6.929%]

scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_SetStatus_Sampled netcoreapp3.1

  • unstable execution_time [-40.099ms; -0.802ms] or [-30.102%; -0.602%]

scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_UpdateName_Sampled net6.0

  • unstable execution_time [-50.542ms; -13.959ms] or [-29.415%; -8.124%]
  • unstable throughput [+7379.644op/s; +35277.634op/s] or [+4.798%; +22.934%]

scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_UpdateName_Sampled netcoreapp3.1

  • unstable execution_time [+30.822ms; +59.624ms] or [+33.775%; +65.337%]

scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan net6.0

  • unstable execution_time [+12.776ms; +40.874ms] or [+8.942%; +28.607%]
  • unstable throughput [-49729.879op/s; -29760.318op/s] or [-27.619%; -16.528%]

scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan netcoreapp3.1

  • unstable execution_time [-16.023ms; +18.349ms] or [-14.003%; +16.035%]

scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_AddEvent_Sampled net6.0

  • 🟥 allocated_mem [+143 bytes; +144 bytes] or [+8.332%; +8.340%]
  • unstable execution_time [-14467.610µs; +14713.246µs] or [-9.328%; +9.486%]
  • unstable throughput [-3172.449op/s; +13445.417op/s] or [-2.306%; +9.774%]

scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_AddEvent_Sampled netcoreapp3.1

  • unstable execution_time [+8.654ms; +33.996ms] or [+9.798%; +38.489%]

scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_GetContext_Sampled net6.0

  • unstable execution_time [-10.050ms; +12.335ms] or [-7.185%; +8.818%]
  • unstable throughput [-7887.549op/s; +11304.250op/s] or [-5.084%; +7.286%]

scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_GetContext_Sampled netcoreapp3.1

  • unstable execution_time [-42.355ms; -2.950ms] or [-31.750%; -2.211%]

scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_RecordException_Sampled net6.0

  • unstable execution_time [+6.627ms; +39.358ms] or [+5.642%; +33.507%]
  • unstable throughput [-33166.976op/s; -9636.113op/s] or [-25.672%; -7.459%]

scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_RecordException_Sampled netcoreapp3.1

  • unstable execution_time [+8.317ms; +34.941ms] or [+9.335%; +39.217%]

scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_SetAttributes_Sampled net6.0

  • unstable execution_time [-4.252ms; +26.701ms] or [-2.756%; +17.305%]
  • unstable throughput [-11005.650op/s; +4797.080op/s] or [-9.263%; +4.038%]

scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_SetAttributes_Sampled netcoreapp3.1

  • unstable execution_time [-31.586ms; -6.257ms] or [-28.226%; -5.591%]

scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_SetStatus_Sampled net6.0

  • unstable execution_time [-28.336ms; -2.309ms] or [-18.205%; -1.483%]
  • unstable throughput [-6122.933op/s; +13256.162op/s] or [-4.237%; +9.174%]

scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_SetStatus_Sampled netcoreapp3.1

  • unstable execution_time [+14.066ms; +39.068ms] or [+16.349%; +45.410%]

scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_UpdateName_Sampled net6.0

  • unstable execution_time [+20.887ms; +41.264ms] or [+16.914%; +33.415%]

scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_UpdateName_Sampled netcoreapp3.1

  • unstable execution_time [-34.258ms; -8.835ms] or [-31.009%; -7.997%]

scenario:Benchmarks.Trace.ActivityBenchmark.StartStopWithChild net472

  • 🟥 throughput [-9439.249op/s; -8730.981op/s] or [-11.192%; -10.352%]

scenario:Benchmarks.Trace.ActivityBenchmark.StartStopWithChild net6.0

  • unstable execution_time [-54.262ms; -33.879ms] or [-27.071%; -16.902%]
  • 🟥 throughput [-51353.822op/s; -40064.128op/s] or [-43.165%; -33.675%]

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

  • unstable execution_time [-72.532ms; -44.268ms] or [-36.481%; -22.266%]

scenario:Benchmarks.Trace.AgentWriterBenchmark.WriteAndFlushEnrichedTraces net472

  • 🟥 execution_time [+311.429ms; +328.001ms] or [+154.542%; +162.766%]
  • 🟥 throughput [-57.594op/s; -45.103op/s] or [-10.362%; -8.115%]

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

  • unstable execution_time [+122.318ms; +168.177ms] or [+96.638%; +132.870%]
  • unstable throughput [-50.097op/s; +35.680op/s] or [-6.605%; +4.704%]

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

  • 🟥 execution_time [+81.918ms; +85.611ms] or [+72.495%; +75.763%]

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

  • 🟥 allocated_mem [+1.308KB; +1.308KB] or [+27.528%; +27.540%]

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

  • 🟥 allocated_mem [+439 bytes; +440 bytes] or [+9.299%; +9.310%]
  • 🟩 execution_time [-75.630ms; -61.417ms] or [-35.322%; -28.684%]

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

  • 🟥 allocated_mem [+1.272KB; +1.272KB] or [+27.500%; +27.510%]
  • 🟩 execution_time [-30.980ms; -14.209ms] or [-14.752%; -6.766%]

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

  • 🟥 allocated_mem [+1.307KB; +1.307KB] or [+105.743%; +105.758%]
  • 🟥 throughput [-261660.052op/s; -256785.168op/s] or [-26.717%; -26.219%]

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

  • 🟥 allocated_mem [+439 bytes; +440 bytes] or [+35.945%; +35.954%]
  • unstable execution_time [-74.687ms; -48.115ms] or [-33.307%; -21.457%]
  • unstable throughput [-324718.191op/s; -211993.577op/s] or [-34.690%; -22.648%]

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

  • 🟥 allocated_mem [+1.272KB; +1.272KB] or [+105.288%; +105.304%]
  • 🟩 execution_time [-90.718ms; -86.269ms] or [-45.283%; -43.062%]
  • 🟥 throughput [-129282.619op/s; -112431.326op/s] or [-18.575%; -16.154%]

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

  • 🟩 execution_time [-40.831ms; -21.403ms] or [-20.602%; -10.799%]
  • unstable throughput [-26258.162op/s; -10533.512op/s] or [-16.708%; -6.702%]

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

  • 🟩 execution_time [-48.023ms; -28.775ms] or [-24.484%; -14.670%]
  • 🟩 throughput [+9895.469op/s; +12624.646op/s] or [+7.883%; +10.057%]

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

  • 🟩 execution_time [-68.123ms; -48.347ms] or [-33.682%; -23.904%]
  • unstable throughput [-104299.805op/s; +209254.788op/s] or [-3.478%; +6.977%]

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

  • unstable execution_time [-83.330ms; -57.580ms] or [-38.412%; -26.542%]
  • 🟩 throughput [+139579.174op/s; +196607.639op/s] or [+5.540%; +7.804%]

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

  • 🟥 execution_time [+301.316ms; +315.332ms] or [+150.557%; +157.561%]

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

  • unstable execution_time [+174.739ms; +221.573ms] or [+88.121%; +111.740%]

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

  • 🟥 execution_time [+301.297ms; +307.954ms] or [+151.770%; +155.123%]

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

  • 🟥 execution_time [+298.489ms; +312.180ms] or [+146.606%; +153.330%]

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

  • 🟥 execution_time [+280.210ms; +297.002ms] or [+136.984%; +145.194%]

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

  • 🟥 execution_time [+277.336ms; +292.367ms] or [+138.612%; +146.125%]

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

  • 🟥 execution_time [+23.207µs; +46.870µs] or [+7.409%; +14.963%]
  • 🟥 throughput [-435.627op/s; -236.538op/s] or [-13.580%; -7.374%]

scenario:Benchmarks.Trace.AspNetCoreBenchmark.SendRequest net472

  • 🟥 execution_time [+299.573ms; +300.490ms] or [+149.518%; +149.976%]

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

  • unstable execution_time [+363.170ms; +382.784ms] or [+394.599%; +415.911%]
  • 🟥 throughput [-6940.547op/s; -6726.831op/s] or [-57.031%; -55.275%]

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

  • unstable execution_time [+233.936ms; +308.769ms] or [+177.625%; +234.445%]
  • 🟥 throughput [-1375.658op/s; -1125.126op/s] or [-13.317%; -10.892%]

scenario:Benchmarks.Trace.CIVisibilityProtocolWriterBenchmark.WriteAndFlushEnrichedTraces net472

  • 🟥 execution_time [+298.042ms; +312.845ms] or [+137.037%; +143.843%]
  • 🟥 throughput [-682.765op/s; -665.857op/s] or [-61.865%; -60.333%]

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

  • unstable execution_time [-49.053ms; +84.507ms] or [-20.904%; +36.013%]
  • 🟥 throughput [-703.366op/s; -614.550op/s] or [-46.915%; -40.991%]

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

  • 🟥 allocated_mem [+2.305KB; +2.308KB] or [+5.442%; +5.450%]
  • 🟥 execution_time [+341.107ms; +349.361ms] or [+204.021%; +208.959%]
  • 🟥 throughput [-728.525op/s; -694.483op/s] or [-50.726%; -48.356%]

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

  • 🟩 execution_time [-187.011µs; -168.291µs] or [-9.473%; -8.525%]
  • 🟩 throughput [+47.405op/s; +53.158op/s] or [+9.358%; +10.494%]

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

  • 🟩 execution_time [-238.886µs; -231.682µs] or [-6.058%; -5.875%]
  • 🟩 throughput [+15.841op/s; +16.345op/s] or [+6.247%; +6.445%]

scenario:Benchmarks.Trace.ElasticsearchBenchmark.CallElasticsearch net472

  • 🟥 execution_time [+302.065ms; +314.823ms] or [+152.114%; +158.539%]

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

  • unstable execution_time [+198.632ms; +253.159ms] or [+99.535%; +126.858%]

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

  • 🟥 execution_time [+298.447ms; +305.140ms] or [+149.927%; +153.289%]

scenario:Benchmarks.Trace.ElasticsearchBenchmark.CallElasticsearchAsync net472

  • 🟥 execution_time [+304.616ms; +318.067ms] or [+152.968%; +159.723%]

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

  • unstable execution_time [+215.540ms; +238.427ms] or [+106.575%; +117.892%]

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

  • 🟥 execution_time [+304.815ms; +311.695ms] or [+154.493%; +157.981%]

scenario:Benchmarks.Trace.GraphQLBenchmark.ExecuteAsync net472

  • 🟥 execution_time [+303.768ms; +318.127ms] or [+152.464%; +159.671%]

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

  • 🟥 execution_time [+302.050ms; +309.126ms] or [+150.544%; +154.071%]
  • 🟩 throughput [+47702.155op/s; +56334.056op/s] or [+9.472%; +11.186%]

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

  • 🟥 execution_time [+303.900ms; +310.492ms] or [+151.188%; +154.467%]

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

  • unstable execution_time [-103.672ms; -81.136ms] or [-48.208%; -37.728%]
  • unstable throughput [-66863.176op/s; -27270.944op/s] or [-18.342%; -7.481%]

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

  • unstable execution_time [-88.052ms; -65.613ms] or [-44.168%; -32.912%]

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

  • 🟩 allocated_mem [-25.999KB; -25.977KB] or [-9.484%; -9.476%]
  • unstable execution_time [-67.092µs; -10.790µs] or [-13.260%; -2.133%]
  • unstable throughput [+61.169op/s; +264.275op/s] or [+3.052%; +13.187%]

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

  • 🟩 allocated_mem [-16.368KB; -16.348KB] or [-5.967%; -5.960%]
  • 🟩 execution_time [-109.762µs; -56.051µs] or [-19.021%; -9.713%]
  • 🟩 throughput [+205.232op/s; +351.477op/s] or [+11.725%; +20.080%]

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

  • unstable execution_time [+2.210µs; +6.969µs] or [+5.223%; +16.472%]

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

  • unstable execution_time [-13.066µs; -3.448µs] or [-20.271%; -5.350%]
  • unstable throughput [+1107.149op/s; +3093.863op/s] or [+6.793%; +18.982%]

scenario:Benchmarks.Trace.Log4netBenchmark.EnrichedLog net472

  • 🟥 execution_time [+306.365ms; +321.523ms] or [+154.854%; +162.516%]

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

  • unstable execution_time [+277.539ms; +299.927ms] or [+141.267%; +152.662%]

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

  • 🟥 execution_time [+304.928ms; +311.473ms] or [+152.654%; +155.931%]

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

  • unstable execution_time [-59.354ms; -31.603ms] or [-29.668%; -15.796%]
  • unstable throughput [-212840.983op/s; -143813.395op/s] or [-40.286%; -27.221%]

scenario:Benchmarks.Trace.RedisBenchmark.SendReceive netcoreapp3.1

  • unstable execution_time [-56.089ms; -25.395ms] or [-28.431%; -12.873%]

scenario:Benchmarks.Trace.SerilogBenchmark.EnrichedLog net472

  • 🟥 execution_time [+301.424ms; +312.887ms] or [+150.233%; +155.946%]

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

  • 🟥 execution_time [+305.281ms; +313.254ms] or [+153.297%; +157.301%]

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

  • 🟥 execution_time [+307.013ms; +312.935ms] or [+155.697%; +158.700%]

scenario:Benchmarks.Trace.SingleSpanAspNetCoreBenchmark.SingleSpanAspNetCore net472

  • 🟥 execution_time [+299.885ms; +300.672ms] or [+149.584%; +149.977%]
  • 🟩 throughput [+65009668.414op/s; +65319074.598op/s] or [+47.344%; +47.569%]

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

  • unstable execution_time [+374.718ms; +386.297ms] or [+466.028%; +480.429%]
  • 🟥 throughput [-7371.348op/s; -7163.452op/s] or [-56.984%; -55.377%]

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

  • 🟥 execution_time [+297.313ms; +300.394ms] or [+148.293%; +149.830%]
  • 🟥 throughput [-18622279.223op/s; -17080903.981op/s] or [-8.248%; -7.566%]

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

  • unstable execution_time [-89.503ms; -66.292ms] or [-43.837%; -32.469%]
  • unstable throughput [-125907.411op/s; +2163.129op/s] or [-11.756%; +0.202%]

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

  • unstable execution_time [-72.353ms; -44.868ms] or [-36.611%; -22.704%]

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

  • unstable execution_time [-64.724ms; -39.954ms] or [-33.722%; -20.816%]
  • unstable throughput [-258883.728op/s; -86803.294op/s] or [-20.038%; -6.719%]

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

  • unstable execution_time [-57.770ms; -28.946ms] or [-28.383%; -14.221%]
  • 🟩 throughput [+63744.703op/s; +77274.679op/s] or [+6.331%; +7.675%]

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

  • unstable execution_time [-73.528ms; -49.703ms] or [-36.719%; -24.821%]
  • unstable throughput [-101805.592op/s; -27128.902op/s] or [-18.486%; -4.926%]

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

  • unstable execution_time [-71.920ms; -45.076ms] or [-36.135%; -22.648%]

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

  • unstable execution_time [-100.519ms; -77.292ms] or [-50.277%; -38.660%]
  • unstable throughput [-86195.655op/s; +29544.033op/s] or [-9.630%; +3.301%]

scenario:Benchmarks.Trace.TraceAnnotationsBenchmark.RunOnMethodBegin netcoreapp3.1

  • unstable execution_time [-34.094ms; -10.304ms] or [-17.316%; -5.233%]

Known flaky benchmarks without significant changes:

  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_AddEvent_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_GetContext_Sampled net472
  • 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_SetStatus_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_UpdateName_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_AddEvent_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_GetContext_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_RecordException_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_SetAttributes_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_SetStatus_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_UpdateName_Sampled net472
  • scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.ObjectExtractorMoreComplexBody net472
  • scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.ObjectExtractorSimpleBody net472
  • scenario:Benchmarks.Trace.Asm.AppSecWafBenchmark.RunWafRealisticBenchmark net472
  • scenario:Benchmarks.Trace.Asm.AppSecWafBenchmark.RunWafRealisticBenchmark net6.0
  • scenario:Benchmarks.Trace.Asm.AppSecWafBenchmark.RunWafRealisticBenchmark netcoreapp3.1
  • scenario:Benchmarks.Trace.Asm.AppSecWafBenchmark.RunWafRealisticBenchmarkWithAttack net472
  • scenario:Benchmarks.Trace.Asm.AppSecWafBenchmark.RunWafRealisticBenchmarkWithAttack netcoreapp3.1
  • 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.ILoggerBenchmark.EnrichedLog net472
  • scenario:Benchmarks.Trace.Iast.StringAspectsBenchmark.StringConcatAspectBenchmark net472
  • scenario:Benchmarks.Trace.Iast.StringAspectsBenchmark.StringConcatBenchmark net472
  • scenario:Benchmarks.Trace.RedisBenchmark.SendReceive net472
  • scenario:Benchmarks.Trace.SpanBenchmark.StartFinishScope net472
  • scenario:Benchmarks.Trace.SpanBenchmark.StartFinishSpan net472
  • scenario:Benchmarks.Trace.SpanBenchmark.StartFinishTwoScopes net472
  • scenario:Benchmarks.Trace.TraceAnnotationsBenchmark.RunOnMethodBegin net472

@dd-trace-dotnet-ci-bot

dd-trace-dotnet-ci-bot Bot commented May 12, 2026

Copy link
Copy Markdown

Execution-Time Benchmarks Report ⏱️

Execution-time results for samples comparing This PR (8610) 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.07 ± (74.95 - 75.52) ms72.40 ± (72.51 - 72.84) ms-3.5%
.NET Framework 4.8 - Bailout
duration78.16 ± (78.29 - 78.79) ms78.69 ± (78.65 - 79.13) ms+0.7%✅⬆️
.NET Framework 4.8 - CallTarget+Inlining+NGEN
duration1101.81 ± (1098.67 - 1105.95) ms1097.96 ± (1102.37 - 1111.34) ms-0.3%
.NET Core 3.1 - Baseline
process.internal_duration_ms22.80 ± (22.74 - 22.86) ms22.72 ± (22.67 - 22.78) ms-0.3%
process.time_to_main_ms86.94 ± (86.60 - 87.28) ms86.08 ± (85.75 - 86.40) ms-1.0%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.92 ± (10.91 - 10.92) MB10.91 ± (10.91 - 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.50 ± (22.46 - 22.54) ms22.65 ± (22.60 - 22.69) ms+0.7%✅⬆️
process.time_to_main_ms86.08 ± (85.87 - 86.29) ms87.94 ± (87.66 - 88.21) ms+2.2%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.94 ± (10.93 - 10.94) MB10.94 ± (10.94 - 10.94) MB+0.0%✅⬆️
runtime.dotnet.threads.count13 ± (13 - 13)13 ± (13 - 13)+0.0%
.NET Core 3.1 - CallTarget+Inlining+NGEN
process.internal_duration_ms214.90 ± (213.96 - 215.83) ms212.63 ± (211.80 - 213.46) ms-1.1%
process.time_to_main_ms543.27 ± (541.95 - 544.59) ms538.40 ± (537.03 - 539.76) ms-0.9%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed48.39 ± (48.35 - 48.42) MB48.30 ± (48.26 - 48.34) MB-0.2%
runtime.dotnet.threads.count28 ± (28 - 28)28 ± (28 - 28)+0.8%✅⬆️
.NET 6 - Baseline
process.internal_duration_ms21.78 ± (21.72 - 21.85) ms21.35 ± (21.30 - 21.39) ms-2.0%
process.time_to_main_ms77.33 ± (77.04 - 77.61) ms74.89 ± (74.61 - 75.17) ms-3.2%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.62 ± (10.61 - 10.62) MB10.63 ± (10.63 - 10.63) MB+0.1%✅⬆️
runtime.dotnet.threads.count10 ± (10 - 10)10 ± (10 - 10)+0.0%
.NET 6 - Bailout
process.internal_duration_ms21.28 ± (21.23 - 21.32) ms21.44 ± (21.38 - 21.49) ms+0.8%✅⬆️
process.time_to_main_ms75.80 ± (75.56 - 76.03) ms76.82 ± (76.56 - 77.08) ms+1.4%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.74 ± (10.73 - 10.74) MB10.74 ± (10.74 - 10.75) MB+0.1%✅⬆️
runtime.dotnet.threads.count11 ± (11 - 11)11 ± (11 - 11)+0.0%
.NET 6 - CallTarget+Inlining+NGEN
process.internal_duration_ms375.86 ± (373.45 - 378.28) ms377.81 ± (375.57 - 380.06) ms+0.5%✅⬆️
process.time_to_main_ms540.89 ± (539.46 - 542.33) ms539.91 ± (538.65 - 541.17) ms-0.2%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed49.75 ± (49.72 - 49.77) MB49.91 ± (49.89 - 49.94) MB+0.3%✅⬆️
runtime.dotnet.threads.count28 ± (28 - 28)28 ± (28 - 28)-0.1%
.NET 8 - Baseline
process.internal_duration_ms19.73 ± (19.68 - 19.79) ms19.44 ± (19.41 - 19.47) ms-1.5%
process.time_to_main_ms75.16 ± (74.87 - 75.44) ms72.92 ± (72.74 - 73.09) ms-3.0%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed7.65 ± (7.64 - 7.65) MB7.65 ± (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.79 ± (19.75 - 19.84) ms19.82 ± (19.77 - 19.88) ms+0.1%✅⬆️
process.time_to_main_ms76.54 ± (76.29 - 76.79) ms76.77 ± (76.51 - 77.03) ms+0.3%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed7.70 ± (7.69 - 7.71) MB7.71 ± (7.70 - 7.72) MB+0.1%✅⬆️
runtime.dotnet.threads.count11 ± (11 - 11)11 ± (11 - 11)+0.0%
.NET 8 - CallTarget+Inlining+NGEN
process.internal_duration_ms296.60 ± (293.77 - 299.44) ms294.42 ± (291.98 - 296.85) ms-0.7%
process.time_to_main_ms500.25 ± (498.58 - 501.91) ms499.43 ± (498.19 - 500.67) ms-0.2%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed36.91 ± (36.88 - 36.95) MB36.86 ± (36.83 - 36.89) MB-0.1%
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
duration190.63 ± (190.63 - 191.42) ms192.06 ± (192.11 - 193.02) ms+0.7%✅⬆️
.NET Framework 4.8 - Bailout
duration193.95 ± (193.79 - 194.22) ms194.45 ± (194.46 - 195.24) ms+0.3%✅⬆️
.NET Framework 4.8 - CallTarget+Inlining+NGEN
duration1162.11 ± (1163.51 - 1170.15) ms1159.82 ± (1160.04 - 1166.02) ms-0.2%
.NET Core 3.1 - Baseline
process.internal_duration_ms184.27 ± (183.92 - 184.63) ms184.29 ± (184.02 - 184.56) ms+0.0%✅⬆️
process.time_to_main_ms79.98 ± (79.80 - 80.16) ms80.07 ± (79.87 - 80.27) ms+0.1%✅⬆️
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed16.16 ± (16.07 - 16.26) MB16.16 ± (16.13 - 16.18) MB-0.1%
runtime.dotnet.threads.count20 ± (19 - 20)20 ± (20 - 20)+0.3%✅⬆️
.NET Core 3.1 - Bailout
process.internal_duration_ms183.73 ± (183.51 - 183.94) ms183.83 ± (183.57 - 184.09) ms+0.1%✅⬆️
process.time_to_main_ms81.10 ± (81.00 - 81.19) ms80.92 ± (80.83 - 81.01) ms-0.2%
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed16.19 ± (16.11 - 16.26) MB16.14 ± (16.06 - 16.22) MB-0.3%
runtime.dotnet.threads.count21 ± (20 - 21)20 ± (20 - 21)-0.1%
.NET Core 3.1 - CallTarget+Inlining+NGEN
process.internal_duration_ms374.97 ± (373.76 - 376.18) ms373.15 ± (371.79 - 374.50) ms-0.5%
process.time_to_main_ms517.73 ± (516.52 - 518.94) ms515.08 ± (514.21 - 515.96) ms-0.5%
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed57.22 ± (57.16 - 57.28) MB57.17 ± (57.11 - 57.23) MB-0.1%
runtime.dotnet.threads.count30 ± (30 - 30)30 ± (30 - 30)+0.0%✅⬆️
.NET 6 - Baseline
process.internal_duration_ms188.53 ± (188.27 - 188.78) ms188.48 ± (188.28 - 188.68) ms-0.0%
process.time_to_main_ms69.51 ± (69.38 - 69.65) ms69.77 ± (69.64 - 69.89) ms+0.4%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed15.67 ± (15.50 - 15.84) MB15.79 ± (15.62 - 15.96) MB+0.7%✅⬆️
runtime.dotnet.threads.count18 ± (18 - 18)18 ± (17 - 18)-1.0%
.NET 6 - Bailout
process.internal_duration_ms188.00 ± (187.81 - 188.19) ms187.81 ± (187.62 - 188.00) ms-0.1%
process.time_to_main_ms70.42 ± (70.34 - 70.50) ms70.52 ± (70.45 - 70.59) ms+0.1%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed15.89 ± (15.72 - 16.07) MB15.73 ± (15.55 - 15.90) MB-1.0%
runtime.dotnet.threads.count19 ± (19 - 19)19 ± (18 - 19)-1.7%
.NET 6 - CallTarget+Inlining+NGEN
process.internal_duration_ms583.93 ± (580.12 - 587.73) ms585.13 ± (581.18 - 589.08) ms+0.2%✅⬆️
process.time_to_main_ms511.79 ± (511.05 - 512.53) ms512.79 ± (511.93 - 513.64) ms+0.2%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed61.11 ± (61.01 - 61.20) MB61.22 ± (61.13 - 61.31) MB+0.2%✅⬆️
runtime.dotnet.threads.count31 ± (31 - 31)31 ± (31 - 31)+0.0%✅⬆️
.NET 8 - Baseline
process.internal_duration_ms185.53 ± (185.28 - 185.78) ms185.59 ± (185.36 - 185.82) ms+0.0%✅⬆️
process.time_to_main_ms68.71 ± (68.56 - 68.86) ms68.80 ± (68.65 - 68.94) ms+0.1%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed11.69 ± (11.61 - 11.77) MB11.55 ± (11.43 - 11.66) MB-1.2%
runtime.dotnet.threads.count18 ± (17 - 18)17 ± (17 - 18)-0.7%
.NET 8 - Bailout
process.internal_duration_ms184.89 ± (184.71 - 185.08) ms184.97 ± (184.82 - 185.13) ms+0.0%✅⬆️
process.time_to_main_ms69.59 ± (69.52 - 69.66) ms69.74 ± (69.69 - 69.80) ms+0.2%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed11.76 ± (11.68 - 11.83) MB11.45 ± (11.33 - 11.57) MB-2.6%
runtime.dotnet.threads.count19 ± (18 - 19)18 ± (18 - 18)-2.6%
.NET 8 - CallTarget+Inlining+NGEN
process.internal_duration_ms508.80 ± (505.16 - 512.44) ms513.82 ± (511.19 - 516.45) ms+1.0%✅⬆️
process.time_to_main_ms470.35 ± (469.69 - 471.02) ms472.53 ± (471.85 - 473.22) ms+0.5%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed50.57 ± (50.53 - 50.61) MB50.60 ± (50.56 - 50.64) MB+0.1%✅⬆️
runtime.dotnet.threads.count29 ± (29 - 29)29 ± (29 - 29)-0.3%
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 (8610) - mean (73ms)  : 70, 75
    master - mean (75ms)  : 71, 79

    section Bailout
    This PR (8610) - mean (79ms)  : 75, 82
    master - mean (79ms)  : 75, 82

    section CallTarget+Inlining+NGEN
    This PR (8610) - mean (1,107ms)  : 1039, 1174
    master - mean (1,102ms)  : 1049, 1156

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 (8610) - mean (116ms)  : 110, 122
    master - mean (117ms)  : 111, 124

    section Bailout
    This PR (8610) - mean (118ms)  : 113, 122
    master - mean (115ms)  : 112, 118

    section CallTarget+Inlining+NGEN
    This PR (8610) - mean (788ms)  : 758, 818
    master - mean (795ms)  : 767, 822

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

    section Bailout
    This PR (8610) - mean (105ms)  : 100, 110
    master - mean (104ms)  : 99, 108

    section CallTarget+Inlining+NGEN
    This PR (8610) - mean (945ms)  : 909, 982
    master - mean (946ms)  : 911, 981

Loading
FakeDbCommand (.NET 8)
gantt
    title Execution time (ms) FakeDbCommand (.NET 8)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8610) - mean (100ms)  : 96, 104
    master - mean (103ms)  : 97, 110

    section Bailout
    This PR (8610) - mean (104ms)  : 99, 110
    master - mean (105ms)  : 99, 110

    section CallTarget+Inlining+NGEN
    This PR (8610) - mean (827ms)  : 784, 871
    master - mean (827ms)  : 783, 871

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 (8610) - mean (193ms)  : 188, 197
    master - mean (191ms)  : 187, 195

    section Bailout
    This PR (8610) - mean (195ms)  : 191, 199
    master - mean (194ms)  : 192, 196

    section CallTarget+Inlining+NGEN
    This PR (8610) - mean (1,163ms)  : 1119, 1207
    master - mean (1,167ms)  : 1118, 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 (8610) - mean (272ms)  : 268, 276
    master - mean (272ms)  : 268, 277

    section Bailout
    This PR (8610) - mean (273ms)  : 269, 276
    master - mean (273ms)  : 270, 275

    section CallTarget+Inlining+NGEN
    This PR (8610) - mean (929ms)  : 912, 945
    master - mean (935ms)  : 909, 960

Loading
HttpMessageHandler (.NET 6)
gantt
    title Execution time (ms) HttpMessageHandler (.NET 6)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8610) - mean (266ms)  : 263, 270
    master - mean (266ms)  : 262, 270

    section Bailout
    This PR (8610) - mean (266ms)  : 264, 269
    master - mean (266ms)  : 264, 269

    section CallTarget+Inlining+NGEN
    This PR (8610) - mean (1,125ms)  : 1062, 1187
    master - mean (1,124ms)  : 1068, 1179

Loading
HttpMessageHandler (.NET 8)
gantt
    title Execution time (ms) HttpMessageHandler (.NET 8)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8610) - mean (264ms)  : 259, 269
    master - mean (264ms)  : 259, 268

    section Bailout
    This PR (8610) - mean (264ms)  : 261, 267
    master - mean (264ms)  : 261, 266

    section CallTarget+Inlining+NGEN
    This PR (8610) - mean (1,018ms)  : 977, 1060
    master - mean (1,011ms)  : 960, 1062

Loading

@andrewlock
andrewlock marked this pull request as ready for review May 12, 2026 16:24
@andrewlock
andrewlock requested a review from a team as a code owner May 12, 2026 16:24

@bouwkast bouwkast left a comment

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.

Nice!

@andrewlock
andrewlock merged commit f0be997 into master May 20, 2026
136 checks passed
@andrewlock
andrewlock deleted the andrew/reduce-ci-copying branch May 20, 2026 10:49
@github-actions github-actions Bot added this to the vNext-v3 milestone May 20, 2026
andrewlock added a commit that referenced this pull request May 28, 2026
## Summary of changes

Set `UseArtifactsOutput` for all `tracer/` libraries

## Reason for change

`UseArtifactsOutput` puts all the build output [nested in a top-level
directory](https://learn.microsoft.com/en-us/dotnet/core/sdk/artifacts-output).
We are already using this for samples and in _some_ places. This PR
extends it to use in more of the tracer build.

```
📁 artifacts
    └──📂 <Type of output>
        └──📂 <Project name>
            └──📂 <Pivot>
```

The advantage of this approach is it neatly scopes the output of a stage
in the `artifacts/bin`, `artifacts/obj` or `artifacts/packages` folder
(for example). This is convenient in _general_ (I use artifact layout in
personal projects wherever possible), but it's particularly useful in
CI, especially if/when we need to migrate the build to gitlab.

## Implementation details

Get the 🤖 to make the change. As long as CI keeps working, we can still
build locally, and the artifacts look the same, ultimately, we're good 👍

## Test coverage

This is the test. Also had the agent do some analysis of the artifacts
to make sure it's ok, and tested locally.

## Other details

Stacked on:
- #8610

Will add more to the stack (e.g. profiling assets later)

Requires:
- DataDog/serverless-tools#126
andrewlock added a commit that referenced this pull request Jun 1, 2026
## Summary of changes

Follows on from #8636, moves more build outputs into the artifacts
folder

## Reason for change

Today, build outputs end up scattered throughput the repository, because
of how the defaults work for .NET, and how we're using a very "bespoke"
way of building (i.e. we're not just doing `dotnet build`). That makes
it tricky to track where things are built to in CI particularly, and
will hamper any attempts to modify CI (e.g. to move to GitLab).

## Implementation details

Had 🤖 look for everything that wasn't going to the `artifacts/` folder,
and move it, so that we can more easily include/exclude it from
artifacts. Took a _relatively_ conservative approach in places (e.g. to
the profiler assets)

Final results look like this:

```
artifacts/
  ├─📂 bin/
  ├─📂 obj/
  ├─📂 publish/
  ├─📂 package/
  ├─📂 build_data/
  ├─📂 monitoring-home/
  ├─📂 native-bin/
  ├─📂 native-obj/
  ├─📂 native-symbols/
  ├─📂 ProfilerResources/
  ├─📂 profiler-build/
  ├─📂 output/
  ├─📂 deps/
  └─📂 vcpkg/
```

The important thing is that we can exclude most of these when doing the
"upload working directory" step

## Test coverage

This is the test - if the build still passes I think we're ok.

## Other details

Stacked on 
- #8610
- #8636

---------

Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
andrewlock added a commit that referenced this pull request Jun 1, 2026
## Summary of changes

Update all the launchsettings.json to point to the new output path in
#8680

## Reason for change

We moved the default output folder in #8680, but there were already
enough changes in that PR, so I didn't want to clutter it up with these
simple changes.

## Implementation details

🤖 converted `shared\bin` to `artifacts`

## Test coverage

N/A - it's only for local testing (personally I would probably remove
all of these files completely, but some people like them)

## Other details

Stacked on 

- #8610
- #8636
- #8680

---------

Co-authored-by: Claude Opus 4.7 <[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