DataDog / dd-trace-dotnet

.NET Client Library for Datadog APM
https://docs.datadoghq.com/tracing/
Apache License 2.0
437 stars 137 forks source link

Load the tracer/profiler after guardrails checks #5968

Open kevingosse opened 1 month ago

kevingosse commented 1 month ago

Summary of changes

Instead of loading the native trace/profiler as soon as the native loader is loaded, wait until we've checked the target runtime/process name.

Reason for change

When returning an error code from ICorProfilerCallback::Initialize, .NET unloads the native loader. However, the native tracer/profiler stay in memory (because .NET is not aware of them). Therefore it makes sense to perform as many checks as possible before actually loading them. Plus that's less work to do in the most common failure cases (blocklisted process).

There are still cases where we're not unloading the native tracer/profiler even though we should (for instance, if their Initialize method failed). However they're trickier to get right (we must make sure there's no background thread running, for instance the logger) so I'll leave that for a future PR.

Implementation details

Moved the LoadConfiguration/LoadClassFactory/LoadInstance methods of the dynamic dispatcher into a single Initialize method.

Test coverage

Other details

datadog-ddstaging[bot] commented 1 month ago

Datadog Report

Branch report: kevin/better_loader Commit report: a1fdf2e Test service: dd-trace-dotnet

:x: 118 Failed (8 Known Flaky), 349922 Passed, 1526 Skipped, 9h 27m 18.66s Total Time :hourglass: 1 Performance Regression

:x: Failed Tests (118)

This report shows up to 5 failed tests.

  • SubmitsTraces - Datadog.Trace.ClrProfiler.IntegrationTests.AWS.AwsLambdaTests - Details
<details>
<summary>Expand for error</summary>

```
Expected relevantSpans to contain at least 76 item(s) because we want to ensure that we don't timeout while waiting for spans from the mock tracer agent, but found 0: {empty}.
```
</details>

:hourglass: Performance Regressions vs Default Branch (1)

andrewlock commented 4 weeks ago

Execution-Time Benchmarks Report :stopwatch:

Execution-time results for samples comparing the following branches/commits:

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 shown in red. The following thresholds were used for comparing the execution times:

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).

gantt
    title Execution time (ms) FakeDbCommand (.NET Framework 4.6.2) 
    dateFormat  X
    axisFormat %s
    todayMarker off
    section Baseline
    This PR (5968) - mean (70ms)  : 68, 72
     .   : milestone, 70,
    master - mean (69ms)  : 67, 72
     .   : milestone, 69,

    section CallTarget+Inlining+NGEN
    This PR (5968) - mean (1,099ms)  : 1078, 1120
     .   : milestone, 1099,
    master - mean (1,100ms)  : 1075, 1126
     .   : milestone, 1100,
gantt
    title Execution time (ms) FakeDbCommand (.NET Core 3.1) 
    dateFormat  X
    axisFormat %s
    todayMarker off
    section Baseline
    This PR (5968) - mean (109ms)  : 106, 111
     .   : milestone, 109,
    master - mean (108ms)  : 106, 110
     .   : milestone, 108,

    section CallTarget+Inlining+NGEN
    This PR (5968) - mean (768ms)  : 753, 784
     .   : milestone, 768,
    master - mean (764ms)  : 750, 779
     .   : milestone, 764,
gantt
    title Execution time (ms) FakeDbCommand (.NET 6) 
    dateFormat  X
    axisFormat %s
    todayMarker off
    section Baseline
    This PR (5968) - mean (92ms)  : 89, 94
     .   : milestone, 92,
    master - mean (91ms)  : 89, 94
     .   : milestone, 91,

    section CallTarget+Inlining+NGEN
    This PR (5968) - mean (728ms)  : 712, 744
     .   : milestone, 728,
    master - mean (726ms)  : 709, 743
     .   : milestone, 726,
gantt
    title Execution time (ms) HttpMessageHandler (.NET Framework 4.6.2) 
    dateFormat  X
    axisFormat %s
    todayMarker off
    section Baseline
    This PR (5968) - mean (190ms)  : 187, 193
     .   : milestone, 190,
    master - mean (190ms)  : 186, 193
     .   : milestone, 190,

    section CallTarget+Inlining+NGEN
    This PR (5968) - mean (1,192ms)  : 1173, 1212
     .   : milestone, 1192,
    master - mean (1,192ms)  : 1166, 1219
     .   : milestone, 1192,
gantt
    title Execution time (ms) HttpMessageHandler (.NET Core 3.1) 
    dateFormat  X
    axisFormat %s
    todayMarker off
    section Baseline
    This PR (5968) - mean (275ms)  : 271, 279
     .   : milestone, 275,
    master - mean (276ms)  : 272, 280
     .   : milestone, 276,

    section CallTarget+Inlining+NGEN
    This PR (5968) - mean (938ms)  : 918, 958
     .   : milestone, 938,
    master - mean (939ms)  : 922, 956
     .   : milestone, 939,
gantt
    title Execution time (ms) HttpMessageHandler (.NET 6) 
    dateFormat  X
    axisFormat %s
    todayMarker off
    section Baseline
    This PR (5968) - mean (265ms)  : 260, 269
     .   : milestone, 265,
    master - mean (264ms)  : 261, 268
     .   : milestone, 264,

    section CallTarget+Inlining+NGEN
    This PR (5968) - mean (926ms)  : 901, 951
     .   : milestone, 926,
    master - mean (924ms)  : 906, 942
     .   : milestone, 924,
andrewlock commented 4 weeks ago

Benchmarks Report for tracer :snail:

Benchmarks for #5968 compared to master:

The following thresholds were used for comparing the benchmark speeds:

Allocation changes below 0.5% are ignored.

Benchmark details

Benchmarks.Trace.ActivityBenchmark - Same speed :heavy_check_mark: Same allocations :heavy_check_mark: ### Raw results | Branch | Method | Toolchain | Mean | StdError | StdDev | Gen 0 | Gen 1 | Gen 2 | Allocated | |---------|---------------------------- |-------------- |---------:|---------:|--------:|-------:|------:|------:|----------:| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`StartStopWithChild`|net6.0|7.81μs|44.1ns|296ns|0.0117| 0.0039|0|5.43 KB| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`StartStopWithChild`|netcoreapp3.1|9.96μs|50.8ns|313ns|0.0197| 0.00985|0|5.62 KB| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`StartStopWithChild`|net472|16μs|49.2ns|191ns|1.01| 0.306|0.0942|6.07 KB| |#5968|`StartStopWithChild`|net6.0|7.65μs|42.5ns|266ns|0.0182| 0.00728|0|5.43 KB| |#5968|`StartStopWithChild`|netcoreapp3.1|9.96μs|54.9ns|329ns|0.0146| 0.00485|0|5.62 KB| |#5968|`StartStopWithChild`|net472|16μs|49.1ns|190ns|1.01| 0.296|0.0959|6.06 KB|
Benchmarks.Trace.AgentWriterBenchmark - Same speed :heavy_check_mark: Same allocations :heavy_check_mark: ### Raw results | Branch | Method | Toolchain | Mean | StdError | StdDev | Gen 0 | Gen 1 | Gen 2 | Allocated | |---------|---------------------------- |-------------- |---------:|---------:|--------:|-------:|------:|------:|----------:| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`WriteAndFlushEnrichedTraces`|net6.0|456μs|290ns|1.12μs|0| 0|0|2.7 KB| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`WriteAndFlushEnrichedTraces`|netcoreapp3.1|631μs|351ns|1.36μs|0| 0|0|2.7 KB| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`WriteAndFlushEnrichedTraces`|net472|818μs|679ns|2.63μs|0.411| 0|0|3.3 KB| |#5968|`WriteAndFlushEnrichedTraces`|net6.0|463μs|465ns|1.8μs|0| 0|0|2.7 KB| |#5968|`WriteAndFlushEnrichedTraces`|netcoreapp3.1|642μs|275ns|990ns|0| 0|0|2.7 KB| |#5968|`WriteAndFlushEnrichedTraces`|net472|834μs|297ns|1.11μs|0.414| 0|0|3.3 KB|
Benchmarks.Trace.AspNetCoreBenchmark - Same speed :heavy_check_mark: Same allocations :heavy_check_mark: ### Raw results | Branch | Method | Toolchain | Mean | StdError | StdDev | Gen 0 | Gen 1 | Gen 2 | Allocated | |---------|---------------------------- |-------------- |---------:|---------:|--------:|-------:|------:|------:|----------:| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`SendRequest`|net6.0|208μs|1.19μs|9.77μs|0.196| 0|0|18.45 KB| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`SendRequest`|netcoreapp3.1|226μs|1.1μs|4.9μs|0.212| 0|0|20.61 KB| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`SendRequest`|net472|0.000135ns|9.49E‑05ns|0.000342ns|0| 0|0|0 b| |#5968|`SendRequest`|net6.0|209μs|1.22μs|10.9μs|0.242| 0|0|18.45 KB| |#5968|`SendRequest`|netcoreapp3.1|235μs|1.35μs|10.5μs|0.236| 0|0|20.61 KB| |#5968|`SendRequest`|net472|0.00181ns|0.000817ns|0.00316ns|0| 0|0|0 b|
Benchmarks.Trace.CIVisibilityProtocolWriterBenchmark - Same speed :heavy_check_mark: Same allocations :heavy_check_mark: ### Raw results | Branch | Method | Toolchain | Mean | StdError | StdDev | Gen 0 | Gen 1 | Gen 2 | Allocated | |---------|---------------------------- |-------------- |---------:|---------:|--------:|-------:|------:|------:|----------:| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`WriteAndFlushEnrichedTraces`|net6.0|563μs|2.98μs|15.2μs|0.568| 0|0|41.64 KB| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`WriteAndFlushEnrichedTraces`|netcoreapp3.1|694μs|3.6μs|20.4μs|0.353| 0|0|41.73 KB| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`WriteAndFlushEnrichedTraces`|net472|839μs|2.72μs|10.2μs|8.19| 2.59|0.431|53.31 KB| |#5968|`WriteAndFlushEnrichedTraces`|net6.0|574μs|3.14μs|17.5μs|0.551| 0|0|41.68 KB| |#5968|`WriteAndFlushEnrichedTraces`|netcoreapp3.1|728μs|3.81μs|19.4μs|0.365| 0|0|41.6 KB| |#5968|`WriteAndFlushEnrichedTraces`|net472|847μs|3.88μs|16μs|8.13| 2.57|0.428|53.32 KB|
Benchmarks.Trace.DbCommandBenchmark - Same speed :heavy_check_mark: Same allocations :heavy_check_mark: ### Raw results | Branch | Method | Toolchain | Mean | StdError | StdDev | Gen 0 | Gen 1 | Gen 2 | Allocated | |---------|---------------------------- |-------------- |---------:|---------:|--------:|-------:|------:|------:|----------:| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`ExecuteNonQuery`|net6.0|1.3μs|0.824ns|2.97ns|0.0143| 0|0|1.02 KB| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`ExecuteNonQuery`|netcoreapp3.1|1.71μs|1.98ns|7.68ns|0.0136| 0|0|1.02 KB| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`ExecuteNonQuery`|net472|2.09μs|1.43ns|5.54ns|0.156| 0|0|987 B| |#5968|`ExecuteNonQuery`|net6.0|1.36μs|1.7ns|6.57ns|0.0142| 0|0|1.02 KB| |#5968|`ExecuteNonQuery`|netcoreapp3.1|1.75μs|0.8ns|2.99ns|0.014| 0|0|1.02 KB| |#5968|`ExecuteNonQuery`|net472|2.07μs|3.52ns|13.6ns|0.156| 0|0|987 B|
Benchmarks.Trace.ElasticsearchBenchmark - Slower :warning: Same allocations :heavy_check_mark: #### Slower :warning: in #5968 | Benchmark | diff/base | Base Median (ns) | Diff Median (ns) | Modality | |:----------|-----------:|-----------:|--------:|--------:| | Benchmarks.Trace.ElasticsearchBenchmark.CallElasticsearch‑net6.0 | 1.132 | 1,141.69 | 1,292.93 | ### Raw results | Branch | Method | Toolchain | Mean | StdError | StdDev | Gen 0 | Gen 1 | Gen 2 | Allocated | |---------|---------------------------- |-------------- |---------:|---------:|--------:|-------:|------:|------:|----------:| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`CallElasticsearch`|net6.0|1.14μs|0.707ns|2.74ns|0.0137| 0|0|976 B| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`CallElasticsearch`|netcoreapp3.1|1.47μs|1.22ns|4.41ns|0.0132| 0|0|976 B| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`CallElasticsearch`|net472|2.57μs|2.18ns|8.43ns|0.157| 0|0|995 B| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`CallElasticsearchAsync`|net6.0|1.3μs|0.799ns|2.99ns|0.0129| 0|0|952 B| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`CallElasticsearchAsync`|netcoreapp3.1|1.57μs|0.71ns|2.66ns|0.0142| 0|0|1.02 KB| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`CallElasticsearchAsync`|net472|2.74μs|1.95ns|7.55ns|0.166| 0|0|1.05 KB| |#5968|`CallElasticsearch`|net6.0|1.29μs|1.32ns|4.94ns|0.0136| 0|0|976 B| |#5968|`CallElasticsearch`|netcoreapp3.1|1.47μs|0.607ns|2.19ns|0.0132| 0|0|976 B| |#5968|`CallElasticsearch`|net472|2.53μs|2.51ns|9.74ns|0.157| 0|0|995 B| |#5968|`CallElasticsearchAsync`|net6.0|1.23μs|2.13ns|7.98ns|0.013| 0|0|952 B| |#5968|`CallElasticsearchAsync`|netcoreapp3.1|1.69μs|0.594ns|2.3ns|0.0144| 0|0|1.02 KB| |#5968|`CallElasticsearchAsync`|net472|2.72μs|1.54ns|5.78ns|0.166| 0|0|1.05 KB|
Benchmarks.Trace.GraphQLBenchmark - Same speed :heavy_check_mark: Same allocations :heavy_check_mark: ### Raw results | Branch | Method | Toolchain | Mean | StdError | StdDev | Gen 0 | Gen 1 | Gen 2 | Allocated | |---------|---------------------------- |-------------- |---------:|---------:|--------:|-------:|------:|------:|----------:| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`ExecuteAsync`|net6.0|1.19μs|0.785ns|3.04ns|0.0131| 0|0|952 B| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`ExecuteAsync`|netcoreapp3.1|1.61μs|1.45ns|5.44ns|0.0122| 0|0|952 B| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`ExecuteAsync`|net472|1.84μs|2.08ns|8.05ns|0.145| 0|0|915 B| |#5968|`ExecuteAsync`|net6.0|1.25μs|1.19ns|4.44ns|0.0131| 0|0|952 B| |#5968|`ExecuteAsync`|netcoreapp3.1|1.64μs|2.07ns|7.76ns|0.0123| 0|0|952 B| |#5968|`ExecuteAsync`|net472|1.74μs|1.15ns|4.46ns|0.145| 0|0|915 B|
Benchmarks.Trace.HttpClientBenchmark - Same speed :heavy_check_mark: Same allocations :heavy_check_mark: ### Raw results | Branch | Method | Toolchain | Mean | StdError | StdDev | Gen 0 | Gen 1 | Gen 2 | Allocated | |---------|---------------------------- |-------------- |---------:|---------:|--------:|-------:|------:|------:|----------:| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`SendAsync`|net6.0|4.34μs|2.05ns|7.68ns|0.0303| 0|0|2.22 KB| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`SendAsync`|netcoreapp3.1|5.22μs|2.12ns|8.23ns|0.0365| 0|0|2.76 KB| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`SendAsync`|net472|7.79μs|4.57ns|17.1ns|0.499| 0|0|3.15 KB| |#5968|`SendAsync`|net6.0|4.34μs|0.887ns|3.32ns|0.0302| 0|0|2.22 KB| |#5968|`SendAsync`|netcoreapp3.1|5.04μs|2.2ns|8.53ns|0.0352| 0|0|2.76 KB| |#5968|`SendAsync`|net472|7.73μs|2.36ns|9.15ns|0.496| 0|0|3.15 KB|
Benchmarks.Trace.ILoggerBenchmark - Same speed :heavy_check_mark: Same allocations :heavy_check_mark: ### Raw results | Branch | Method | Toolchain | Mean | StdError | StdDev | Gen 0 | Gen 1 | Gen 2 | Allocated | |---------|---------------------------- |-------------- |---------:|---------:|--------:|-------:|------:|------:|----------:| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`EnrichedLog`|net6.0|1.47μs|1.98ns|7.67ns|0.0231| 0|0|1.64 KB| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`EnrichedLog`|netcoreapp3.1|2.23μs|1.52ns|5.88ns|0.022| 0|0|1.64 KB| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`EnrichedLog`|net472|2.48μs|1.74ns|6.75ns|0.25| 0|0|1.57 KB| |#5968|`EnrichedLog`|net6.0|1.45μs|1.78ns|6.65ns|0.023| 0|0|1.64 KB| |#5968|`EnrichedLog`|netcoreapp3.1|2.04μs|1.16ns|4.32ns|0.0225| 0|0|1.64 KB| |#5968|`EnrichedLog`|net472|2.62μs|1.68ns|6.49ns|0.249| 0|0|1.57 KB|
Benchmarks.Trace.Log4netBenchmark - Same speed :heavy_check_mark: Same allocations :heavy_check_mark: ### Raw results | Branch | Method | Toolchain | Mean | StdError | StdDev | Gen 0 | Gen 1 | Gen 2 | Allocated | |---------|---------------------------- |-------------- |---------:|---------:|--------:|-------:|------:|------:|----------:| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`EnrichedLog`|net6.0|113μs|70.2ns|263ns|0.0559| 0|0|4.28 KB| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`EnrichedLog`|netcoreapp3.1|118μs|115ns|447ns|0| 0|0|4.28 KB| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`EnrichedLog`|net472|146μs|174ns|673ns|0.657| 0.219|0|4.46 KB| |#5968|`EnrichedLog`|net6.0|114μs|211ns|818ns|0.057| 0|0|4.28 KB| |#5968|`EnrichedLog`|netcoreapp3.1|119μs|208ns|806ns|0| 0|0|4.28 KB| |#5968|`EnrichedLog`|net472|146μs|170ns|657ns|0.658| 0.219|0|4.46 KB|
Benchmarks.Trace.NLogBenchmark - Same speed :heavy_check_mark: Same allocations :heavy_check_mark: ### Raw results | Branch | Method | Toolchain | Mean | StdError | StdDev | Gen 0 | Gen 1 | Gen 2 | Allocated | |---------|---------------------------- |-------------- |---------:|---------:|--------:|-------:|------:|------:|----------:| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`EnrichedLog`|net6.0|3.05μs|1.38ns|5.15ns|0.0312| 0|0|2.2 KB| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`EnrichedLog`|netcoreapp3.1|4.51μs|6.69ns|25.9ns|0.0289| 0|0|2.2 KB| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`EnrichedLog`|net472|4.81μs|2.2ns|8.53ns|0.32| 0|0|2.02 KB| |#5968|`EnrichedLog`|net6.0|3.07μs|1.08ns|4.2ns|0.0308| 0|0|2.2 KB| |#5968|`EnrichedLog`|netcoreapp3.1|4.08μs|1.76ns|6.83ns|0.0305| 0|0|2.2 KB| |#5968|`EnrichedLog`|net472|4.88μs|1.36ns|5.28ns|0.319| 0|0|2.02 KB|
Benchmarks.Trace.RedisBenchmark - Same speed :heavy_check_mark: Same allocations :heavy_check_mark: ### Raw results | Branch | Method | Toolchain | Mean | StdError | StdDev | Gen 0 | Gen 1 | Gen 2 | Allocated | |---------|---------------------------- |-------------- |---------:|---------:|--------:|-------:|------:|------:|----------:| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`SendReceive`|net6.0|1.38μs|0.697ns|2.7ns|0.0159| 0|0|1.14 KB| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`SendReceive`|netcoreapp3.1|1.7μs|0.666ns|2.58ns|0.0152| 0|0|1.14 KB| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`SendReceive`|net472|2.08μs|0.591ns|2.29ns|0.183| 0|0|1.16 KB| |#5968|`SendReceive`|net6.0|1.24μs|0.684ns|2.65ns|0.0157| 0|0|1.14 KB| |#5968|`SendReceive`|netcoreapp3.1|1.75μs|1.29ns|4.82ns|0.0149| 0|0|1.14 KB| |#5968|`SendReceive`|net472|2.05μs|0.809ns|3.13ns|0.183| 0.00102|0|1.16 KB|
Benchmarks.Trace.SerilogBenchmark - Same speed :heavy_check_mark: Same allocations :heavy_check_mark: ### Raw results | Branch | Method | Toolchain | Mean | StdError | StdDev | Gen 0 | Gen 1 | Gen 2 | Allocated | |---------|---------------------------- |-------------- |---------:|---------:|--------:|-------:|------:|------:|----------:| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`EnrichedLog`|net6.0|2.64μs|0.675ns|2.61ns|0.0224| 0|0|1.6 KB| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`EnrichedLog`|netcoreapp3.1|3.94μs|1.91ns|7.41ns|0.0218| 0|0|1.65 KB| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`EnrichedLog`|net472|4.48μs|2.88ns|11.2ns|0.322| 0|0|2.04 KB| |#5968|`EnrichedLog`|net6.0|2.69μs|1.03ns|4ns|0.0229| 0|0|1.6 KB| |#5968|`EnrichedLog`|netcoreapp3.1|3.95μs|1.55ns|6.02ns|0.0218| 0|0|1.65 KB| |#5968|`EnrichedLog`|net472|4.43μs|2.4ns|9.28ns|0.323| 0|0|2.04 KB|
Benchmarks.Trace.SpanBenchmark - Same speed :heavy_check_mark: Same allocations :heavy_check_mark: ### Raw results | Branch | Method | Toolchain | Mean | StdError | StdDev | Gen 0 | Gen 1 | Gen 2 | Allocated | |---------|---------------------------- |-------------- |---------:|---------:|--------:|-------:|------:|------:|----------:| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`StartFinishSpan`|net6.0|400ns|0.295ns|1.14ns|0.00805| 0|0|576 B| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`StartFinishSpan`|netcoreapp3.1|553ns|0.459ns|1.78ns|0.00794| 0|0|576 B| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`StartFinishSpan`|net472|698ns|0.614ns|2.38ns|0.0915| 0|0|578 B| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`StartFinishScope`|net6.0|524ns|0.382ns|1.48ns|0.00977| 0|0|696 B| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`StartFinishScope`|netcoreapp3.1|732ns|0.859ns|3.33ns|0.00913| 0|0|696 B| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`StartFinishScope`|net472|846ns|0.963ns|3.73ns|0.104| 0|0|658 B| |#5968|`StartFinishSpan`|net6.0|403ns|0.145ns|0.562ns|0.00804| 0|0|576 B| |#5968|`StartFinishSpan`|netcoreapp3.1|610ns|0.184ns|0.711ns|0.00794| 0|0|576 B| |#5968|`StartFinishSpan`|net472|701ns|0.525ns|2.03ns|0.0916| 0|0|578 B| |#5968|`StartFinishScope`|net6.0|480ns|0.143ns|0.536ns|0.00969| 0|0|696 B| |#5968|`StartFinishScope`|netcoreapp3.1|681ns|0.305ns|1.18ns|0.00933| 0|0|696 B| |#5968|`StartFinishScope`|net472|875ns|0.694ns|2.69ns|0.104| 0|0|658 B|
Benchmarks.Trace.TraceAnnotationsBenchmark - Same speed :heavy_check_mark: Same allocations :heavy_check_mark: ### Raw results | Branch | Method | Toolchain | Mean | StdError | StdDev | Gen 0 | Gen 1 | Gen 2 | Allocated | |---------|---------------------------- |-------------- |---------:|---------:|--------:|-------:|------:|------:|----------:| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`RunOnMethodBegin`|net6.0|666ns|0.512ns|1.91ns|0.0097| 0|0|696 B| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`RunOnMethodBegin`|netcoreapp3.1|985ns|0.775ns|3ns|0.00927| 0|0|696 B| |[master](https://github.com/DataDog/dd-trace-dotnet/tree/0bcf8424d6056b71be3638478bcd8377234c1d20)|`RunOnMethodBegin`|net472|1.11μs|1.25ns|4.84ns|0.105| 0|0|658 B| |#5968|`RunOnMethodBegin`|net6.0|663ns|0.432ns|1.67ns|0.00967| 0|0|696 B| |#5968|`RunOnMethodBegin`|netcoreapp3.1|925ns|0.506ns|1.82ns|0.00931| 0|0|696 B| |#5968|`RunOnMethodBegin`|net472|1.16μs|0.353ns|1.37ns|0.104| 0|0|658 B|