Skip to content

Add Multi-Azure Function Unique Named Pipe Configuration#8164

Merged
Lewis-E merged 50 commits into
masterfrom
lewis/SVLS-8244/add-multifunction-named-pipes
May 6, 2026
Merged

Add Multi-Azure Function Unique Named Pipe Configuration#8164
Lewis-E merged 50 commits into
masterfrom
lewis/SVLS-8244/add-multifunction-named-pipes

Conversation

@Lewis-E

@Lewis-E Lewis-E commented Feb 5, 2026

Copy link
Copy Markdown
Contributor

Summary of changes

Reason for change

  • Improve support for running multiple Azure Functions in the same hosting plan. [jira]

Implementation details

For Azure Functions, the tracer loads first, then the compat layer, and then the compat layer launches a rust binary to act as the agent. Additionally, the client may or may not be using the DogstatsD client, and it is also possible to have the compat layer and DogstatsD in place without the tracer. We need to coordinate named pipes across all three/four of these codebases, noting that the tracer will use DogstatsD's pipe for runtime metrics if available.

Given this order of operations, and that we want this to work with immutable configuration, the tracer should set pipe names for the compatibility layer via instrumentation if the tracer is present.

  1. Tracer loads -- pipe name is generated
  2. We check the presence of the compat layer + windows configs (using undocumented envvar DD_SERVERLESS_COMPAT_BINARY_PATH if necessary to adapt to Azure changes) to see if named pipes can be used or if we should rely on TCP
  3. Compat layer loads
  4. Tracer uses instrumentation to force the compat layer to generate the pipe names ,
  5. Compat layer passes the name to the mini-agent tracer and dogstatsd .
Scenario Pipe generated? Transport Result
New tracer + no compat at all No (binary not found) TCP Works
New tracer + old compat (< 1.5) No (version check fails) TCP Works
New tracer + new compat (≥ 1.5) Yes Named pipe Works (integration coordinates)
New tracer + dev compat (0.0.0) Yes Named pipe Works (integration coordinates)
Old tracer + no compat No TCP Works
Old tracer + old compat (< 1.5) No TCP Works (neither side knows about pipes)
Old tracer + new compat (≥ 1.5) No TCP Broken — tracer sends via TCP, but compat binary listens on pipe only. Requires more serverless-components changes.
Old tracer + dev compat (0.0.0) No TCP Not supported

Test coverage

  • Self Monitoring
  • New Unit Tests

@pr-commenter

pr-commenter Bot commented Feb 6, 2026

Copy link
Copy Markdown

Benchmarks

Benchmark execution time: 2026-04-30 21:56:00

Comparing candidate commit c1dc086 in PR branch lewis/SVLS-8244/add-multifunction-named-pipes with baseline commit bf5d176 in branch master.

Found 0 performance improvements and 0 performance regressions! Performance is the same for 27 metrics, 0 unstable metrics, 60 known flaky benchmarks, 27 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 ----------------------------------'

Known flaky benchmarks

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

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

  • 🟩 throughput [+8972.222op/s; +11194.971op/s] or [+7.542%; +9.410%]

scenario:Benchmarks.Trace.AgentWriterBenchmark.WriteAndFlushEnrichedTraces net472

  • 🟥 execution_time [+321.170ms; +324.709ms] or [+159.376%; +161.132%]
  • 🟥 throughput [-42.039op/s; -38.427op/s] or [-7.564%; -6.914%]

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

  • 🟥 execution_time [+379.535ms; +381.366ms] or [+299.856%; +301.303%]
  • 🟩 throughput [+95.202op/s; +98.294op/s] or [+12.552%; +12.960%]

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

  • 🟥 execution_time [+395.183ms; +396.755ms] or [+349.722%; +351.113%]

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

  • 🟥 allocated_mem [+1.308KB; +1.308KB] or [+27.529%; +27.541%]

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

  • 🟥 allocated_mem [+471 bytes; +472 bytes] or [+9.977%; +9.987%]
  • 🟩 execution_time [-16.153ms; -11.982ms] or [-7.544%; -5.596%]
  • 🟩 throughput [+8432.304op/s; +11213.965op/s] or [+6.155%; +8.186%]

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

  • 🟥 allocated_mem [+1.272KB; +1.272KB] or [+27.502%; +27.510%]

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

  • 🟥 allocated_mem [+1.307KB; +1.307KB] or [+105.746%; +105.759%]
  • 🟥 throughput [-258447.197op/s; -255311.313op/s] or [-26.389%; -26.069%]

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

  • 🟥 allocated_mem [+471 bytes; +472 bytes] or [+38.558%; +38.566%]
  • 🟩 execution_time [-26.287ms; -21.448ms] or [-11.723%; -9.565%]

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

  • 🟥 allocated_mem [+1.272KB; +1.272KB] or [+105.292%; +105.304%]
  • 🟥 throughput [-144713.800op/s; -128306.061op/s] or [-20.793%; -18.435%]

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

  • 🟩 throughput [+10794.576op/s; +13721.639op/s] or [+6.868%; +8.731%]

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

  • 🟩 throughput [+10668.015op/s; +13353.519op/s] or [+8.498%; +10.638%]

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

  • 🟩 throughput [+507295.678op/s; +519832.443op/s] or [+16.915%; +17.333%]

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

  • 🟩 execution_time [-18.462ms; -14.079ms] or [-8.511%; -6.490%]
  • 🟩 throughput [+183515.170op/s; +239147.862op/s] or [+7.284%; +9.492%]

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

  • 🟥 execution_time [+300.008ms; +300.689ms] or [+149.904%; +150.244%]

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

  • 🟥 execution_time [+299.532ms; +302.686ms] or [+151.055%; +152.645%]

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

  • 🟥 execution_time [+299.452ms; +301.824ms] or [+150.841%; +152.036%]

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

  • 🟥 execution_time [+297.266ms; +298.031ms] or [+146.006%; +146.381%]

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

  • 🟥 execution_time [+292.370ms; +293.851ms] or [+142.929%; +143.653%]

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

  • 🟥 execution_time [+300.481ms; +302.010ms] or [+150.180%; +150.944%]

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

  • 🟥 execution_time [+22.083µs; +45.708µs] or [+7.050%; +14.592%]
  • 🟥 throughput [-425.751op/s; -226.980op/s] or [-13.272%; -7.076%]

scenario:Benchmarks.Trace.AspNetCoreBenchmark.SendRequest net472

  • 🟥 execution_time [+300.251ms; +300.951ms] or [+149.856%; +150.206%]

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

  • unstable execution_time [+359.475ms; +396.317ms] or [+390.585%; +430.615%]
  • 🟩 throughput [+1151.109op/s; +1290.629op/s] or [+9.459%; +10.605%]

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

  • unstable execution_time [+335.024ms; +362.382ms] or [+254.380%; +275.154%]
  • 🟩 throughput [+671.556op/s; +876.278op/s] or [+6.501%; +8.483%]

scenario:Benchmarks.Trace.CIVisibilityProtocolWriterBenchmark.WriteAndFlushEnrichedTraces net472

  • unstable execution_time [+320.736ms; +345.450ms] or [+147.471%; +158.835%]
  • 🟥 throughput [-525.854op/s; -492.622op/s] or [-47.647%; -44.636%]

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

  • unstable execution_time [+205.763ms; +339.008ms] or [+87.687%; +144.471%]
  • 🟥 throughput [-676.400op/s; -592.822op/s] or [-45.116%; -39.541%]

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

  • 🟥 execution_time [+349.164ms; +357.655ms] or [+208.840%; +213.919%]
  • 🟥 throughput [-423.642op/s; -387.384op/s] or [-29.498%; -26.973%]

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

  • unstable throughput [+0.784op/s; +61.322op/s] or [+0.146%; +11.446%]

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

  • 🟩 execution_time [-160.920µs; -124.114µs] or [-8.152%; -6.287%]
  • 🟩 throughput [+35.791op/s; +45.546op/s] or [+7.066%; +8.991%]

scenario:Benchmarks.Trace.ElasticsearchBenchmark.CallElasticsearch net472

  • 🟥 execution_time [+301.994ms; +303.602ms] or [+152.079%; +152.888%]

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

  • 🟥 execution_time [+302.255ms; +303.439ms] or [+151.461%; +152.054%]

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

  • 🟥 execution_time [+301.647ms; +304.732ms] or [+151.535%; +153.084%]

scenario:Benchmarks.Trace.ElasticsearchBenchmark.CallElasticsearchAsync net472

  • 🟥 execution_time [+302.574ms; +303.922ms] or [+151.942%; +152.620%]

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

  • 🟥 execution_time [+297.801ms; +300.696ms] or [+147.249%; +148.681%]

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

  • 🟥 execution_time [+302.182ms; +305.964ms] or [+153.159%; +155.076%]

scenario:Benchmarks.Trace.GraphQLBenchmark.ExecuteAsync net472

  • 🟥 execution_time [+302.196ms; +304.002ms] or [+151.675%; +152.582%]

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

  • 🟥 execution_time [+298.358ms; +300.325ms] or [+148.704%; +149.684%]
  • 🟩 throughput [+37867.625op/s; +43798.393op/s] or [+7.519%; +8.697%]

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

  • 🟥 execution_time [+300.336ms; +302.780ms] or [+149.415%; +150.630%]

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

  • 🟩 execution_time [-15.771ms; -12.118ms] or [-7.334%; -5.635%]

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

  • unstable execution_time [+4.100µs; +45.211µs] or [+1.013%; +11.167%]

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

  • 🟩 allocated_mem [-20.271KB; -20.250KB] or [-7.394%; -7.387%]
  • unstable execution_time [-50.144µs; +1.817µs] or [-9.911%; +0.359%]

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

  • 🟩 allocated_mem [-19.737KB; -19.721KB] or [-7.195%; -7.189%]

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

  • unstable execution_time [+6.037µs; +10.292µs] or [+14.269%; +24.327%]
  • 🟥 throughput [-4588.806op/s; -2785.349op/s] or [-19.317%; -11.725%]

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

  • unstable execution_time [-14.588µs; -7.636µs] or [-22.634%; -11.846%]
  • 🟩 throughput [+1934.501op/s; +3384.195op/s] or [+11.869%; +20.763%]

scenario:Benchmarks.Trace.Log4netBenchmark.EnrichedLog net472

  • 🟥 execution_time [+302.240ms; +303.210ms] or [+152.769%; +153.259%]

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

  • 🟥 execution_time [+303.394ms; +305.542ms] or [+154.427%; +155.520%]

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

  • 🟥 execution_time [+299.750ms; +302.304ms] or [+150.062%; +151.341%]

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

  • 🟩 throughput [+27549.492op/s; +30705.619op/s] or [+5.215%; +5.812%]

scenario:Benchmarks.Trace.SerilogBenchmark.EnrichedLog net472

  • 🟥 execution_time [+300.056ms; +301.750ms] or [+149.551%; +150.395%]

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

  • 🟥 execution_time [+300.614ms; +302.109ms] or [+150.954%; +151.705%]

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

  • 🟥 execution_time [+303.338ms; +305.587ms] or [+153.833%; +154.974%]

scenario:Benchmarks.Trace.SingleSpanAspNetCoreBenchmark.SingleSpanAspNetCore net472

  • 🟥 execution_time [+300.493ms; +301.335ms] or [+149.887%; +150.308%]
  • 🟩 throughput [+61207254.481op/s; +61462702.238op/s] or [+44.575%; +44.761%]

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

  • unstable execution_time [+339.998ms; +387.173ms] or [+422.848%; +481.518%]
  • 🟩 throughput [+974.191op/s; +1146.016op/s] or [+7.531%; +8.859%]

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

  • 🟥 execution_time [+299.657ms; +300.598ms] or [+149.462%; +149.932%]

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

  • 🟩 throughput [+82494.997op/s; +91237.156op/s] or [+7.702%; +8.519%]

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

  • 🟩 throughput [+53032.618op/s; +72855.251op/s] or [+6.138%; +8.433%]

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

  • 🟩 throughput [+71956.863op/s; +102315.637op/s] or [+5.570%; +7.919%]

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

  • 🟩 throughput [+82808.610op/s; +91395.840op/s] or [+8.224%; +9.077%]

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

  • 🟩 throughput [+35225.627op/s; +43146.636op/s] or [+6.396%; +7.835%]

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

  • 🟩 throughput [+89535.455op/s; +106800.605op/s] or [+10.003%; +11.932%]

Known flaky benchmarks without significant changes:

  • scenario:Benchmarks.Trace.ActivityBenchmark.StartStopWithChild net472
  • scenario:Benchmarks.Trace.ActivityBenchmark.StartStopWithChild netcoreapp3.1
  • 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.OriginalCharSlice net472
  • scenario:Benchmarks.Trace.CharSliceBenchmark.OriginalCharSlice netcoreapp3.1
  • scenario:Benchmarks.Trace.ILoggerBenchmark.EnrichedLog net472
  • scenario:Benchmarks.Trace.ILoggerBenchmark.EnrichedLog netcoreapp3.1
  • scenario:Benchmarks.Trace.Iast.StringAspectsBenchmark.StringConcatBenchmark net472
  • scenario:Benchmarks.Trace.RedisBenchmark.SendReceive net472
  • scenario:Benchmarks.Trace.RedisBenchmark.SendReceive netcoreapp3.1
  • scenario:Benchmarks.Trace.SpanBenchmark.StartFinishScope net472
  • scenario:Benchmarks.Trace.SpanBenchmark.StartFinishSpan net472
  • scenario:Benchmarks.Trace.SpanBenchmark.StartFinishTwoScopes net472
  • scenario:Benchmarks.Trace.SpanBenchmark.StartFinishTwoScopes netcoreapp3.1
  • scenario:Benchmarks.Trace.TraceAnnotationsBenchmark.RunOnMethodBegin net472
  • scenario:Benchmarks.Trace.TraceAnnotationsBenchmark.RunOnMethodBegin netcoreapp3.1

@dd-trace-dotnet-ci-bot

dd-trace-dotnet-ci-bot Bot commented Feb 6, 2026

Copy link
Copy Markdown

Execution-Time Benchmarks Report ⏱️

Execution-time results for samples comparing This PR (8164) 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
duration72.97 ± (73.19 - 73.72) ms72.45 ± (72.48 - 72.82) ms-0.7%
.NET Framework 4.8 - Bailout
duration77.88 ± (77.80 - 78.25) ms76.89 ± (76.84 - 77.18) ms-1.3%
.NET Framework 4.8 - CallTarget+Inlining+NGEN
duration1129.57 ± (1127.40 - 1134.32) ms1129.44 ± (1126.43 - 1132.62) ms-0.0%
.NET Core 3.1 - Baseline
process.internal_duration_ms22.53 ± (22.48 - 22.58) ms22.48 ± (22.44 - 22.52) ms-0.2%
process.time_to_main_ms85.03 ± (84.80 - 85.26) ms84.72 ± (84.52 - 84.92) ms-0.4%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.91 ± (10.90 - 10.91) MB10.92 ± (10.92 - 10.93) MB+0.1%✅⬆️
runtime.dotnet.threads.count12 ± (12 - 12)12 ± (12 - 12)+0.0%
.NET Core 3.1 - Bailout
process.internal_duration_ms22.84 ± (22.78 - 22.91) ms22.83 ± (22.77 - 22.89) ms-0.1%
process.time_to_main_ms89.87 ± (89.56 - 90.18) ms89.34 ± (89.04 - 89.64) ms-0.6%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.90 ± (10.89 - 10.90) MB10.95 ± (10.95 - 10.95) MB+0.5%✅⬆️
runtime.dotnet.threads.count13 ± (13 - 13)13 ± (13 - 13)+0.0%
.NET Core 3.1 - CallTarget+Inlining+NGEN
process.internal_duration_ms204.31 ± (203.76 - 204.86) ms205.09 ± (204.54 - 205.65) ms+0.4%✅⬆️
process.time_to_main_ms565.92 ± (564.54 - 567.30) ms570.06 ± (568.71 - 571.41) ms+0.7%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed49.79 ± (49.77 - 49.81) MB49.76 ± (49.73 - 49.79) MB-0.1%
runtime.dotnet.threads.count28 ± (28 - 28)28 ± (28 - 28)-0.1%
.NET 6 - Baseline
process.internal_duration_ms21.61 ± (21.53 - 21.68) ms21.17 ± (21.13 - 21.20) ms-2.0%
process.time_to_main_ms76.62 ± (76.23 - 77.00) ms73.62 ± (73.46 - 73.79) ms-3.9%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.63 ± (10.63 - 10.63) MB10.63 ± (10.63 - 10.63) MB+0.0%✅⬆️
runtime.dotnet.threads.count10 ± (10 - 10)10 ± (10 - 10)+0.0%
.NET 6 - Bailout
process.internal_duration_ms21.60 ± (21.52 - 21.68) ms21.51 ± (21.46 - 21.57) ms-0.4%
process.time_to_main_ms77.74 ± (77.40 - 78.07) ms77.19 ± (76.88 - 77.49) ms-0.7%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.74 ± (10.73 - 10.74) MB10.76 ± (10.76 - 10.76) MB+0.2%✅⬆️
runtime.dotnet.threads.count11 ± (11 - 11)11 ± (11 - 11)+0.0%
.NET 6 - CallTarget+Inlining+NGEN
process.internal_duration_ms353.58 ± (351.73 - 355.43) ms351.47 ± (349.37 - 353.57) ms-0.6%
process.time_to_main_ms563.08 ± (561.67 - 564.49) ms566.37 ± (564.57 - 568.18) ms+0.6%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed50.85 ± (50.82 - 50.87) MB51.09 ± (51.07 - 51.11) MB+0.5%✅⬆️
runtime.dotnet.threads.count28 ± (28 - 28)28 ± (28 - 28)-0.5%
.NET 8 - Baseline
process.internal_duration_ms19.53 ± (19.49 - 19.57) ms19.46 ± (19.43 - 19.50) ms-0.3%
process.time_to_main_ms73.42 ± (73.25 - 73.58) ms73.53 ± (73.36 - 73.70) ms+0.2%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed7.66 ± (7.66 - 7.67) MB7.69 ± (7.69 - 7.70) MB+0.4%✅⬆️
runtime.dotnet.threads.count10 ± (10 - 10)10 ± (10 - 10)+0.0%
.NET 8 - Bailout
process.internal_duration_ms19.76 ± (19.71 - 19.81) ms19.79 ± (19.73 - 19.84) ms+0.1%✅⬆️
process.time_to_main_ms75.55 ± (75.29 - 75.82) ms75.98 ± (75.72 - 76.24) ms+0.6%✅⬆️
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed7.71 ± (7.71 - 7.72) MB7.73 ± (7.73 - 7.73) MB+0.2%✅⬆️
runtime.dotnet.threads.count11 ± (11 - 11)11 ± (11 - 11)+0.0%
.NET 8 - CallTarget+Inlining+NGEN
process.internal_duration_ms280.99 ± (277.86 - 284.11) ms280.62 ± (278.07 - 283.17) ms-0.1%
process.time_to_main_ms524.44 ± (522.99 - 525.89) ms522.38 ± (521.06 - 523.70) ms-0.4%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed37.84 ± (37.81 - 37.87) MB37.86 ± (37.83 - 37.89) MB+0.0%✅⬆️
runtime.dotnet.threads.count27 ± (27 - 27)27 ± (27 - 27)+0.2%✅⬆️

HttpMessageHandler

Metric Master (Mean ± 95% CI) Current (Mean ± 95% CI) Change Status
.NET Framework 4.8 - Baseline
duration202.76 ± (202.56 - 203.69) ms202.28 ± (202.42 - 203.75) ms-0.2%
.NET Framework 4.8 - Bailout
duration207.32 ± (207.32 - 208.43) ms207.59 ± (206.81 - 208.00) ms+0.1%✅⬆️
.NET Framework 4.8 - CallTarget+Inlining+NGEN
duration1240.99 ± (1241.12 - 1247.49) ms1248.91 ± (1247.34 - 1254.16) ms+0.6%✅⬆️
.NET Core 3.1 - Baseline
process.internal_duration_ms198.85 ± (198.24 - 199.46) ms197.46 ± (196.88 - 198.03) ms-0.7%
process.time_to_main_ms86.65 ± (86.31 - 86.98) ms85.92 ± (85.60 - 86.23) ms-0.8%
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed15.98 ± (15.97 - 16.00) MB16.02 ± (16.00 - 16.03) MB+0.2%✅⬆️
runtime.dotnet.threads.count20 ± (20 - 20)20 ± (20 - 20)+1.2%✅⬆️
.NET Core 3.1 - Bailout
process.internal_duration_ms196.43 ± (195.91 - 196.95) ms196.99 ± (196.33 - 197.66) ms+0.3%✅⬆️
process.time_to_main_ms86.84 ± (86.55 - 87.14) ms87.49 ± (87.19 - 87.78) ms+0.7%✅⬆️
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed16.14 ± (16.12 - 16.16) MB16.09 ± (16.08 - 16.11) MB-0.3%
runtime.dotnet.threads.count21 ± (20 - 21)21 ± (21 - 21)+1.1%✅⬆️
.NET Core 3.1 - CallTarget+Inlining+NGEN
process.internal_duration_ms381.22 ± (379.89 - 382.56) ms383.78 ± (382.39 - 385.17) ms+0.7%✅⬆️
process.time_to_main_ms574.76 ± (573.16 - 576.36) ms578.55 ± (576.70 - 580.41) ms+0.7%✅⬆️
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed58.38 ± (58.32 - 58.44) MB58.51 ± (58.38 - 58.63) MB+0.2%✅⬆️
runtime.dotnet.threads.count30 ± (30 - 30)30 ± (30 - 30)-0.1%
.NET 6 - Baseline
process.internal_duration_ms201.27 ± (200.74 - 201.80) ms203.05 ± (202.43 - 203.66) ms+0.9%✅⬆️
process.time_to_main_ms74.46 ± (74.20 - 74.71) ms75.31 ± (75.03 - 75.59) ms+1.1%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed16.28 ± (16.27 - 16.30) MB16.31 ± (16.29 - 16.33) MB+0.2%✅⬆️
runtime.dotnet.threads.count19 ± (19 - 19)19 ± (19 - 19)-1.0%
.NET 6 - Bailout
process.internal_duration_ms201.26 ± (200.81 - 201.70) ms201.71 ± (201.13 - 202.29) ms+0.2%✅⬆️
process.time_to_main_ms75.28 ± (75.05 - 75.50) ms76.06 ± (75.79 - 76.32) ms+1.0%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed16.30 ± (16.28 - 16.32) MB16.32 ± (16.30 - 16.33) MB+0.1%✅⬆️
runtime.dotnet.threads.count20 ± (20 - 20)20 ± (20 - 20)+0.8%✅⬆️
.NET 6 - CallTarget+Inlining+NGEN
process.internal_duration_ms570.70 ± (568.04 - 573.36) ms570.97 ± (568.43 - 573.50) ms+0.0%✅⬆️
process.time_to_main_ms564.97 ± (563.75 - 566.20) ms566.70 ± (565.36 - 568.04) ms+0.3%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed61.91 ± (61.88 - 61.95) MB61.83 ± (61.80 - 61.87) MB-0.1%
runtime.dotnet.threads.count31 ± (31 - 31)31 ± (31 - 31)-0.2%
.NET 8 - Baseline
process.internal_duration_ms199.51 ± (198.97 - 200.06) ms200.94 ± (200.35 - 201.52) ms+0.7%✅⬆️
process.time_to_main_ms73.60 ± (73.36 - 73.85) ms74.09 ± (73.82 - 74.35) ms+0.7%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed11.67 ± (11.65 - 11.68) MB11.67 ± (11.65 - 11.68) MB+0.0%✅⬆️
runtime.dotnet.threads.count18 ± (18 - 18)19 ± (19 - 19)+1.3%✅⬆️
.NET 8 - Bailout
process.internal_duration_ms200.79 ± (200.28 - 201.31) ms200.34 ± (199.78 - 200.90) ms-0.2%
process.time_to_main_ms75.48 ± (75.24 - 75.72) ms74.99 ± (74.76 - 75.21) ms-0.6%
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed11.68 ± (11.66 - 11.69) MB11.74 ± (11.72 - 11.75) MB+0.5%✅⬆️
runtime.dotnet.threads.count20 ± (20 - 20)20 ± (19 - 20)-0.2%
.NET 8 - CallTarget+Inlining+NGEN
process.internal_duration_ms495.25 ± (490.23 - 500.27) ms493.91 ± (490.51 - 497.32) ms-0.3%
process.time_to_main_ms532.19 ± (530.68 - 533.71) ms527.42 ± (526.22 - 528.62) ms-0.9%
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed51.55 ± (51.50 - 51.59) MB51.54 ± (51.51 - 51.58) MB-0.0%
runtime.dotnet.threads.count30 ± (30 - 30)30 ± (30 - 30)-0.9%
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 (8164) - mean (73ms)  : 70, 75
    master - mean (73ms)  : 69, 77

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

    section CallTarget+Inlining+NGEN
    This PR (8164) - mean (1,130ms)  : 1085, 1174
    master - mean (1,131ms)  : 1082, 1180

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 (8164) - mean (114ms)  : 110, 119
    master - mean (115ms)  : 110, 120

    section Bailout
    This PR (8164) - mean (120ms)  : 114, 125
    master - mean (120ms)  : 114, 125

    section CallTarget+Inlining+NGEN
    This PR (8164) - mean (813ms)  : 781, 844
    master - mean (808ms)  : 780, 837

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

    section Bailout
    This PR (8164) - mean (106ms)  : 99, 112
    master - mean (106ms)  : 101, 112

    section CallTarget+Inlining+NGEN
    This PR (8164) - mean (950ms)  : 909, 990
    master - mean (946ms)  : 913, 979

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

    section Bailout
    This PR (8164) - mean (104ms)  : 99, 109
    master - mean (103ms)  : 98, 109

    section CallTarget+Inlining+NGEN
    This PR (8164) - mean (837ms)  : 788, 886
    master - mean (835ms)  : 779, 891

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 (8164) - mean (203ms)  : 193, 213
    master - mean (203ms)  : 195, 212

    section Bailout
    This PR (8164) - mean (207ms)  : 198, 217
    master - mean (208ms)  : 200, 216

    section CallTarget+Inlining+NGEN
    This PR (8164) - mean (1,251ms)  : 1201, 1301
    master - mean (1,244ms)  : 1197, 1292

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 (8164) - mean (294ms)  : 281, 308
    master - mean (295ms)  : 282, 307

    section Bailout
    This PR (8164) - mean (295ms)  : 282, 309
    master - mean (293ms)  : 285, 301

    section CallTarget+Inlining+NGEN
    This PR (8164) - mean (1,004ms)  : 974, 1034
    master - mean (998ms)  : 973, 1024

Loading
HttpMessageHandler (.NET 6)
gantt
    title Execution time (ms) HttpMessageHandler (.NET 6)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8164) - mean (288ms)  : 275, 302
    master - mean (285ms)  : 275, 296

    section Bailout
    This PR (8164) - mean (288ms)  : 276, 299
    master - mean (286ms)  : 274, 298

    section CallTarget+Inlining+NGEN
    This PR (8164) - mean (1,178ms)  : 1126, 1230
    master - mean (1,167ms)  : 1122, 1211

Loading
HttpMessageHandler (.NET 8)
gantt
    title Execution time (ms) HttpMessageHandler (.NET 8)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8164) - mean (286ms)  : 273, 299
    master - mean (284ms)  : 273, 295

    section Bailout
    This PR (8164) - mean (287ms)  : 275, 299
    master - mean (288ms)  : 275, 301

    section CallTarget+Inlining+NGEN
    This PR (8164) - mean (1,058ms)  : 1001, 1115
    master - mean (1,060ms)  : 987, 1133

Loading

@Lewis-E Lewis-E force-pushed the lewis/SVLS-8244/add-multifunction-named-pipes branch 2 times, most recently from aaff9b5 to 08a6c72 Compare February 12, 2026 15:09
@Lewis-E Lewis-E force-pushed the lewis/SVLS-8244/add-multifunction-named-pipes branch 3 times, most recently from 2fcae54 to edb4121 Compare March 6, 2026 18:23
@Lewis-E Lewis-E marked this pull request as ready for review March 6, 2026 18:57
@Lewis-E Lewis-E requested review from a team as code owners March 6, 2026 18:57
@Lewis-E Lewis-E requested a review from duncanpharvey March 6, 2026 18:57

@duncanpharvey duncanpharvey left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

We check the presence of the compat layer + windows configs (using undocumented envvar DD_SERVERLESS_COMPAT_BINARY_PATH if necessary to adapt to Azure changes) to see if named pipes can be used or if we should rely on TCP

What is meant by this? I don't see DD_SERVERLESS_COMPAT_BINARY_PATH in any of the PR changes.

Comment thread tracer/src/Datadog.Trace/Configuration/ExporterSettings.cs Outdated
@duncanpharvey

Copy link
Copy Markdown
Contributor

Should this dependency for Datadog.Serverless.Compat also be updated as part of this PR?

<PackageReference Include="Datadog.Serverless.Compat" Version="1.2.0" PrivateAssets="none" />

@lucaspimentel

Copy link
Copy Markdown
Member

@codex review

Comment thread tracer/src/Datadog.Trace/Configuration/ExporterSettings.cs Outdated
&& !Util.EnvironmentHelpers.IsUsingAzureAppServicesSiteExtension()
&& IsCompatLayerAvailableWithPipeSupport())
{
var baseName = Util.EnvironmentHelpers.GetEnvironmentVariable(ConfigurationKeys.TracesPipeName);

@lucaspimentel lucaspimentel Mar 23, 2026

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.

This is only reading the "base" name from environment variables, but the tracer can be configured in other ways (e.g. config files), and those configs would be ignored there. Instead of reading from env vars directly, I think you can read the user setting from rawSettings.TracesPipeName, passed in via parameter.

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.

Agreed, but we also need to make sure we record the new "calculated" value in telemetry as well

@lucaspimentel lucaspimentel Mar 24, 2026

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.

Looks like my comment is addressed (no reading env vars directly), but I'll leave this open for Andrew's comment (configuration telemetry).

Comment thread tracer/src/Datadog.Trace/Configuration/ExporterSettings.cs Outdated
Comment thread tracer/src/Datadog.Trace/Configuration/ExporterSettings.cs Outdated
Comment thread tracer/src/Datadog.Trace/Configuration/ExporterSettings.cs Outdated
Comment thread tracer/src/Datadog.Trace/Configuration/ExporterSettings.cs Outdated

@andrewlock andrewlock 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.

LGTM in general, but there's some specific things to address before we merge it (mostly already highlighted by Lucas)

  • We should only target existing major versions, and bump support later, otherwise we need strict backward and forward compatibility, which is very hard to maintain and very easy to screw up 😅
  • We shouldn't have static state if we can help it. If we want to cache things, we typically handle that by:
    • Move the calculating and storage of the value to a helper type as instance methods.
    • Create a "singleton" instance of the helper
    • Pass the singleton in to the constructor (or, if this gives too much blast radius, allow passing in a null value for the helper, and grab the singleton in the body. This isn't the preferred approach, but it's sometimes the practical one)
  • We need to ensure we record the new calculated values in telemetry
  • The instrumentation seems a little overly complex considering the behaviours we need and the failure cases

Comment thread tracer/src/Datadog.Trace/Configuration/ExporterSettings.cs Outdated
Comment thread tracer/src/Datadog.Trace/Configuration/ExporterSettings.cs Outdated
&& !Util.EnvironmentHelpers.IsUsingAzureAppServicesSiteExtension()
&& IsCompatLayerAvailableWithPipeSupport())
{
var baseName = Util.EnvironmentHelpers.GetEnvironmentVariable(ConfigurationKeys.TracesPipeName);

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.

Agreed, but we also need to make sure we record the new "calculated" value in telemetry as well

Comment thread tracer/src/Datadog.Trace/Configuration/ExporterSettings.cs Outdated
Comment thread tracer/src/Datadog.Trace/Configuration/ExporterSettings.cs Outdated
@Lewis-E Lewis-E force-pushed the lewis/SVLS-8244/add-multifunction-named-pipes branch from c9b7aee to 1df4f5a Compare March 24, 2026 18:55
Comment thread tracer/src/Datadog.Trace/Configuration/ExporterSettings.cs Outdated
Lewis-E and others added 20 commits April 30, 2026 13:03
+ Maximum Version change

Co-authored-by: Andrew Lock <andrewlock.net@gmail.com>
StringUtil.IsNullOrEmpty has [NotNullWhen(false)] so the compiler
already knows the value is non-null in the false branch.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…SERVERLESS_COMPAT_PATH config key

Update supported_calltargets.g.json and generated_calltargets.g.cpp to
reflect MaximumVersion change from 2.*.* to 1.*.*. Add
DD_SERVERLESS_COMPAT_PATH to supported-configurations.yaml and restore
ConfigurationKeys usage in ServerlessCompatPipeNameHelper.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Version 1.4.0 adds the CalculateTracePipeName and
CalculateDogStatsDPipeName methods that the tracer instruments
for named pipe coordination.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ests

- Update version range comments from 2.*.* to 1.*.* in both integrations
- Update DD_SERVERLESS_COMPAT_PATH documentation for linux default path
- Rewrite ServerlessCompatIntegrationTests: remove reflection-based tests
  for removed cache fields, add Theory-based tests for exception
  passthrough and fallback behavior with exact value assertions

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…typo, use SkipOn in tests

- Move ServerlessCompatPipeNameHelper from ClrProfiler.AutoInstrumentation.Serverless
  to Datadog.Trace.Serverless to avoid Configuration depending on instrumentation code
- Fix "compatability" -> "compatibility" typo in YAML documentation
- Replace silent early-return platform guards with SkipOn/SkippableFact
  so Windows-only tests show as skipped instead of silently passing

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Compat 1.4.0 isn't published yet and has a dependency on these tracer
changes. Keep the 1.2.0 dependency — the instrumentation silently skips
when the target methods don't exist, and IsCompatLayerAvailableWithPipeSupport
gates on >= 1.4.0 at runtime. The dependency will be bumped when compat
1.4.0 is published.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Master #8231 extracted serverless platform detection from
EnvironmentHelpers into dedicated cached classes under
Datadog.Trace.Serverless. Update the Azure-Functions pipe-name
generation gate to call AzureInfo.Instance.IsAzureFunction and
IsUsingSiteExtension instead of the removed EnvironmentHelpers
methods.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Addresses review feedback: a customer-set TracesPipeName/MetricsPipeName
(from any configuration source) should pass through verbatim even when
running in Azure Functions, even though this can cause pipe-name
collisions across multiple function instances sharing a plan. We only
fabricate a GUID-suffixed default pipe name when the customer has not
configured one themselves.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…rebase

Post-rebase reconciliation: master's trace_filter additions took conflict
priority during rebase, dropping the ServerlessCompat integration_name tag
entries. Re-add them in both integration_name tag groups and shift downstream
indices by +2.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Previous attempt missed `var index = N + ((int)tag1 * M) + (int)tag2;` forms.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Regenerated via Nuke (Restore + CompileManagedSrc). Both integration_name
tag groups now reflect 85 entries instead of 84.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Customer code calling Tracer.Configure triggers ExporterSettings
reconstruction. With the previous static-GUID generator, each rebuild
produced a new pipe name that no longer matched what the Serverless
Compat layer already bound to.

SettingsManager now computes the gating (Windows + Azure Function +
compat layer 1.4+) once at startup, generates GUIDs, and freezes them
into an immutable ServerlessCompatPipeNames record passed to every
ExporterSettings construction. DD_SERVERLESS_COMPAT_PATH moved into
Raw via the telemetry-enabled ConfigurationBuilder so it shows up in
config telemetry. Integration callbacks drop try/catch + null chains
and short-circuit when no tracer pipe name is configured. Log levels
aligned with Andrew's review (Debug for missing compat layer, Error
for unexpected failures).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Per Andrew's review: unit tests should not depend on Tracer.Instance
global state. The removed case relied on Tracer.Instance defaulting
to unconfigured pipe names, which is unsafe — any prior test could
have left the singleton in an unrelated state. The non-exception
path is covered end-to-end by integration tests elsewhere. The
exception-guard test stays since it short-circuits before reaching
Tracer.Instance.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The helper's only caller (SettingsManager.CreatePipeNames) already
does the Windows short-circuit as the first gate in its condition
chain. The internal RuntimeInformation.IsOSPlatform check was
unreachable in practice and duplicated the rule in two places.

Drops the System.Runtime.InteropServices import and the
#if !NETFRAMEWORK guard. Tests that assumed a platform-gated
behavior are now cross-platform, bringing 10 previously-skipped
cases into every run.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
…lculatedPipeName, and comment improvements. Updated expected ServerlessCompat version for NamedPipe instrumentation from 1.4 to 1.5
@Lewis-E Lewis-E force-pushed the lewis/SVLS-8244/add-multifunction-named-pipes branch from f7657ca to ad59f32 Compare April 30, 2026 17:09
@Lewis-E Lewis-E merged commit 1e6fec9 into master May 6, 2026
139 checks passed
@Lewis-E Lewis-E deleted the lewis/SVLS-8244/add-multifunction-named-pipes branch May 6, 2026 13:35
@github-actions github-actions Bot added this to the vNext-v3 milestone May 6, 2026
@lucaspimentel lucaspimentel restored the lewis/SVLS-8244/add-multifunction-named-pipes branch May 6, 2026 14:25
@lucaspimentel lucaspimentel deleted the lewis/SVLS-8244/add-multifunction-named-pipes branch May 6, 2026 14:28
Lewis-E added a commit that referenced this pull request May 12, 2026
## Summary

- Bumps the `Datadog.Serverless.Compat` `PackageReference` in
`tracer/src/Datadog.AzureFunctions/Datadog.AzureFunctions.csproj` from
`1.4.0` → `1.5.0`.
- 1.5.0 ships multifunction named-pipe coordination for .NET on Azure
Functions Premium plans. It bundles the
[`datadog-serverless-compat/v0.24.0`](https://github.com/DataDog/serverless-components/releases/tag/datadog-serverless-compat%2Fv0.24.0)
binary, which contains the dual TCP+pipe listener
([serverless-components#94](DataDog/serverless-components#94))
and best-effort TCP-8126 bind
([serverless-components#129](DataDog/serverless-components#129))
— both required to land the named-pipe path merged in
[#8164](#8164).

## Test plan

- [ ] CI green (csproj-only change; should be a no-op outside of
`Datadog.AzureFunctions` packaging)
- [ ] Confirm a built `Datadog.AzureFunctions` package resolves
`Datadog.Serverless.Compat 1.5.0` from NuGet at restore time

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants