Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Create a better OperationName for Activity/OpenTelemetry #4700

Merged
merged 45 commits into from
Nov 14, 2023

Conversation

bouwkast
Copy link
Contributor

@bouwkast bouwkast commented Oct 5, 2023

Summary of changes

This change aims to craft a more suitable value for our OperationName for OpenTelemetry Spans/Activity. I'm using OpenTelemetry Span and Activity interchangeably here. With this change, the default OperationName will now be calculated from a combination of Activity.Kind and various tags/tag values within Activity.Tags.

This changes the default Span.OperationName from being mapped to the Activity.OperationName to one that more closely resembles the standard Datadog OperationName.

Reason for change

Before this, the OperationName was set to one of the following:

  • Value of the tag operation.name on the Activity.Tags, if present
  • Value of Activity.OperationName
  • Value of $"{Activity.Source.Name}.{Activity.Kind}" only when DD_TRACE_OTEL_LEGACY_OPERATION_NAME_ENABLED was set to true
  • Value of $"opentelemetry.{Activity.Kind}" if Activity.Source.Name isn't available and DD_TRACE_OTEL_LEGACY_OPERATION_NAME_ENABLED was set to true

The default was changed to Activity.OperationName to better align with other Datadog tracing libraries instead of $"{Activity.Source.Name}.{Activity.Kind}". This change produced less than desirable OperationName values.

Implementation details

By default, OperationName will now be calculated from a combination of Activity.Kind and various tags/tag values within Activity.Tags.

For example, an Activity with an Activity.Kind of Server and a tag of http.request.method will result in an OperationName of http.server.request.

Refer to our unit tests to see more mapping examples of potential OperationName values.

Setting the OperationName from Activity will now be controlled by the following:

  • If the tag operation.name is present with a value, the OperationName will be set to that.
    • All other mappings will be ignored for the OperationName.
  • If DD_TRACE_OTEL_LEGACY_OPERATION_NAME_ENABLED is set to false (default), the OperationName will be determined based on Activity.Kind and various tags in Activity.Tags.
  • If DD_TRACE_OTEL_LEGACY_OPERATION_NAME_ENABLED is set to true the OperationName will be set to $"{Activity.Source.Name}.{Activity.Kind}" or $"opentelemetry.{Activity.Kind}"

Users that currently have DD_TRACE_OTEL_LEGACY_OPERATION_NAME_ENABLED set to true (not the default) shouldn't see a change in their OperationName values from this and they will remain as $"{Activity.Source.Name}.{Activity.Kind}" or $"opentelemetry.{Activity.Kind}".

I've added an OpenTelemetryTags implementation - this seems a bit different that other ...Tags classes as it isn't really the tags that one will see on these spans, it is all of the tags that are used for the mapping. When the Activity is closed we copy the tags over to the backing Span.

I've also made it so that ActivityStarted requires an OpenTelemetryTags instead of an ITags to ensure that we will be able to do the mapping. Also made it so that AzureServiceBusTags inherits from OpenTelemetryTags so that it gets mapped too.

Test coverage

  • Copied the parametric test data into unit tests
  • Additionally added unit tests that assert that the "reserved" attributes map correctly
  • Added same data to the OpenTelemetrySdk and NetActivitySdk Samples
  • Updated various snapshots that use Activity for manual instrumentation
  • AzureServiceBus checks and snapshots have been updated for the new operation name

Other details

I need to validate that the parametric tests actually pass locally, I'll do that before this gets merged.

  • OperationName parametric tests pass (I tested locally with the NuGet built from one of these runs)

@datadog-ddstaging
Copy link

datadog-ddstaging bot commented Oct 5, 2023

Datadog Report

Branch report: steven/otel-operation-name
Commit report: 30913b2

dd-trace-dotnet: 488 Failed (0 Known Flaky), 0 New Flaky, 304138 Passed, 1060 Skipped, 30m 26.65s Wall Time

❌ Failed Tests (488)

This report shows up to 5 failed tests.

  • SubmitTraces - Datadog.Trace.ClrProfiler.IntegrationTests.GrpcLegacyTests - Details

    Expand for error
     Results do not match.
     Differences:
     Received: GrpcLegacy.SubmitTraces_httpclient=False.SchemaV1.received.txt
     Verified: GrpcLegacy.SubmitTraces_httpclient=False.SchemaV1.verified.txt
     Received Content:
     [
       {
         TraceId: Id_1,
         SpanId: Id_2,
         Name: internal,
     ...
    
  • SubmitTraces - Datadog.Trace.ClrProfiler.IntegrationTests.GrpcLegacyTests - Details

    Expand for error
     Results do not match.
     Differences:
     Received: GrpcLegacy.SubmitTraces_httpclient=False.SchemaV0.received.txt
     Verified: GrpcLegacy.SubmitTraces_httpclient=False.SchemaV0.verified.txt
     Received Content:
     [
       {
         TraceId: Id_1,
         SpanId: Id_2,
         Name: internal,
     ...
    
  • SubmitTraces - Datadog.Trace.ClrProfiler.IntegrationTests.GrpcLegacyTests - Details

    Expand for error
     Results do not match.
     Differences:
     Received: GrpcLegacy.SubmitTraces_httpclient=False.SchemaV0.received.txt
     Verified: GrpcLegacy.SubmitTraces_httpclient=False.SchemaV0.verified.txt
     Received Content:
     [
       {
         TraceId: Id_1,
         SpanId: Id_2,
         Name: internal,
     ...
    
  • SubmitTraces - Datadog.Trace.ClrProfiler.IntegrationTests.GrpcLegacyTests - Details

    Expand for error
     Results do not match.
     Differences:
     Received: GrpcLegacy.SubmitTraces_httpclient=False.SchemaV1.received.txt
     Verified: GrpcLegacy.SubmitTraces_httpclient=False.SchemaV1.verified.txt
     Received Content:
     [
       {
         TraceId: Id_1,
         SpanId: Id_2,
         Name: internal,
     ...
    
  • SubmitTraces - Datadog.Trace.ClrProfiler.IntegrationTests.GrpcLegacyTests - Details

    Expand for error
     Results do not match.
     Differences:
     Received: GrpcLegacy.SubmitTraces_httpclient=False.SchemaV0.received.txt
     Verified: GrpcLegacy.SubmitTraces_httpclient=False.SchemaV0.verified.txt
     Received Content:
     [
       {
         TraceId: Id_1,
         SpanId: Id_2,
         Name: internal,
     ...
    

@andrewlock
Copy link
Member

andrewlock commented Oct 5, 2023

Execution-Time Benchmarks Report ⏱️

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:

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

gantt
    title Execution time (ms) FakeDbCommand (.NET Framework 4.6.2) 
    dateFormat  X
    axisFormat %s
    todayMarker off
    section Baseline
    This PR (4700) - mean (71ms)  : 61, 82
     .   : milestone, 71,
    master - mean (71ms)  : 63, 78
     .   : milestone, 71,

    section CallTarget+Inlining+NGEN
    This PR (4700) - mean (997ms)  : 977, 1017
     .   : milestone, 997,
    master - mean (999ms)  : 978, 1020
     .   : milestone, 999,

Loading
gantt
    title Execution time (ms) FakeDbCommand (.NET Core 3.1) 
    dateFormat  X
    axisFormat %s
    todayMarker off
    section Baseline
    This PR (4700) - mean (106ms)  : 103, 109
     .   : milestone, 106,
    master - mean (106ms)  : 103, 109
     .   : milestone, 106,

    section CallTarget+Inlining+NGEN
    This PR (4700) - mean (692ms)  : 676, 709
     .   : milestone, 692,
    master - mean (694ms)  : 670, 717
     .   : milestone, 694,

Loading
gantt
    title Execution time (ms) FakeDbCommand (.NET 6) 
    dateFormat  X
    axisFormat %s
    todayMarker off
    section Baseline
    This PR (4700) - mean (90ms)  : 87, 94
     .   : milestone, 90,
    master - mean (90ms)  : 87, 93
     .   : milestone, 90,

    section CallTarget+Inlining+NGEN
    This PR (4700) - mean (654ms)  : 633, 675
     .   : milestone, 654,
    master - mean (659ms)  : 636, 682
     .   : milestone, 659,

Loading
gantt
    title Execution time (ms) HttpMessageHandler (.NET Framework 4.6.2) 
    dateFormat  X
    axisFormat %s
    todayMarker off
    section Baseline
    This PR (4700) - mean (187ms)  : 185, 190
     .   : milestone, 187,
    master - mean (187ms)  : 185, 190
     .   : milestone, 187,

    section CallTarget+Inlining+NGEN
    This PR (4700) - mean (1,105ms)  : 1079, 1131
     .   : milestone, 1105,
    master - mean (1,109ms)  : 1082, 1136
     .   : milestone, 1109,

Loading
gantt
    title Execution time (ms) HttpMessageHandler (.NET Core 3.1) 
    dateFormat  X
    axisFormat %s
    todayMarker off
    section Baseline
    This PR (4700) - mean (271ms)  : 268, 275
     .   : milestone, 271,
    master - mean (272ms)  : 267, 277
     .   : milestone, 272,

    section CallTarget+Inlining+NGEN
    This PR (4700) - mean (1,056ms)  : 1023, 1089
     .   : milestone, 1056,
    master - mean (1,057ms)  : 1027, 1087
     .   : milestone, 1057,

Loading
gantt
    title Execution time (ms) HttpMessageHandler (.NET 6) 
    dateFormat  X
    axisFormat %s
    todayMarker off
    section Baseline
    This PR (4700) - mean (263ms)  : 259, 266
     .   : milestone, 263,
    master - mean (262ms)  : 259, 265
     .   : milestone, 262,

    section CallTarget+Inlining+NGEN
    This PR (4700) - mean (1,027ms)  : 1004, 1051
     .   : milestone, 1027,
    master - mean (1,032ms)  : 1005, 1059
     .   : milestone, 1032,

Loading

@andrewlock
Copy link
Member

andrewlock commented Oct 5, 2023

Benchmarks Report 🐌

Benchmarks for #4700 compared to master:

  • 4 benchmarks are faster, with geometric mean 1.151
  • 5 benchmarks are slower, with geometric mean 1.188
  • 5 benchmarks have more allocations

The following thresholds were used for comparing the benchmark speeds:

  • Mann–Whitney U test with statistical test for significance of 5%
  • Only results indicating a difference greater than 10% and 0.3 ns are considered.

Allocation changes below 0.5% are ignored.

Benchmark details

Benchmarks.Trace.ActivityBenchmark - Same speed ✔️ More allocations ⚠️

More allocations ⚠️ in #4700

Benchmark Base Allocated Diff Allocated Change Change %
Benchmarks.Trace.ActivityBenchmark.StartStopWithChild‑net472 7.66 KB 7.95 KB 292 B 3.81%
Benchmarks.Trace.ActivityBenchmark.StartStopWithChild‑netcoreapp3.1 7.38 KB 7.57 KB 191 B 2.59%
Benchmarks.Trace.ActivityBenchmark.StartStopWithChild‑net6.0 7.29 KB 7.48 KB 187 B 2.56%

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master StartStopWithChild net6.0 8.14μs 42.1ns 202ns 0.0197 0.0079 0 7.29 KB
master StartStopWithChild netcoreapp3.1 10.3μs 56.9ns 341ns 0.0312 0.0156 0.0052 7.38 KB
master StartStopWithChild net472 15.7μs 51ns 197ns 1.28 0.311 0.0934 7.66 KB
#4700 StartStopWithChild net6.0 8.59μs 45.7ns 263ns 0.0222 0.00889 0 7.48 KB
#4700 StartStopWithChild netcoreapp3.1 10.6μs 57.1ns 318ns 0.0321 0.016 0.00534 7.57 KB
#4700 StartStopWithChild net472 17.1μs 47.7ns 185ns 1.32 0.325 0.103 7.95 KB
Benchmarks.Trace.AgentWriterBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master WriteAndFlushEnrichedTraces net6.0 497μs 243ns 940ns 0 0 0 2.7 KB
master WriteAndFlushEnrichedTraces netcoreapp3.1 644μs 289ns 1.12μs 0 0 0 2.7 KB
master WriteAndFlushEnrichedTraces net472 802μs 562ns 2.18μs 0.398 0 0 3.3 KB
#4700 WriteAndFlushEnrichedTraces net6.0 487μs 221ns 854ns 0 0 0 2.7 KB
#4700 WriteAndFlushEnrichedTraces netcoreapp3.1 646μs 291ns 1.13μs 0 0 0 2.7 KB
#4700 WriteAndFlushEnrichedTraces net472 796μs 177ns 664ns 0.398 0 0 3.3 KB
Benchmarks.Trace.Asm.AppSecBodyBenchmark - Faster 🎉 Same allocations ✔️

Faster 🎉 in #4700

Benchmark base/diff Base Median (ns) Diff Median (ns) Modality
Benchmarks.Trace.Asm.AppSecBodyBenchmark.ObjectExtractorMoreComplexBody‑netcoreapp3.1 1.179 4,276.37 3,625.58

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master AllCycleSimpleBody net6.0 44.3μs 78.3ns 303ns 0.0221 0 0 2.02 KB
master AllCycleSimpleBody netcoreapp3.1 45.5μs 185ns 715ns 0.0229 0 0 2 KB
master AllCycleSimpleBody net472 46.3μs 24.7ns 85.5ns 0.326 0 0 2.07 KB
master AllCycleMoreComplexBody net6.0 206μs 71.1ns 276ns 0.103 0 0 8.37 KB
master AllCycleMoreComplexBody netcoreapp3.1 210μs 83.6ns 324ns 0.105 0 0 8.26 KB
master AllCycleMoreComplexBody net472 217μs 85.3ns 319ns 1.28 0 0 8.43 KB
master ObjectExtractorSimpleBody net6.0 131ns 0.105ns 0.392ns 0.00393 0 0 280 B
master ObjectExtractorSimpleBody netcoreapp3.1 211ns 0.364ns 1.36ns 0.00376 0 0 272 B
master ObjectExtractorSimpleBody net472 159ns 0.103ns 0.397ns 0.0446 0 0 281 B
master ObjectExtractorMoreComplexBody net6.0 2.76μs 1.35ns 5.22ns 0.0527 0 0 3.78 KB
master ObjectExtractorMoreComplexBody netcoreapp3.1 4.28μs 1.45ns 5.62ns 0.0492 0 0 3.69 KB
master ObjectExtractorMoreComplexBody net472 3.5μs 2.75ns 10.3ns 0.602 0.00525 0 3.8 KB
#4700 AllCycleSimpleBody net6.0 43.8μs 45.4ns 176ns 0.0215 0 0 2.02 KB
#4700 AllCycleSimpleBody netcoreapp3.1 46.1μs 88.5ns 343ns 0.023 0 0 2 KB
#4700 AllCycleSimpleBody net472 46.5μs 136ns 528ns 0.319 0 0 2.07 KB
#4700 AllCycleMoreComplexBody net6.0 205μs 64.2ns 249ns 0.103 0 0 8.37 KB
#4700 AllCycleMoreComplexBody netcoreapp3.1 210μs 93.8ns 351ns 0.105 0 0 8.26 KB
#4700 AllCycleMoreComplexBody net472 215μs 162ns 626ns 1.28 0 0 8.43 KB
#4700 ObjectExtractorSimpleBody net6.0 143ns 0.0774ns 0.3ns 0.00395 0 0 280 B
#4700 ObjectExtractorSimpleBody netcoreapp3.1 211ns 0.16ns 0.6ns 0.00374 0 0 272 B
#4700 ObjectExtractorSimpleBody net472 154ns 0.137ns 0.531ns 0.0446 0 0 281 B
#4700 ObjectExtractorMoreComplexBody net6.0 2.74μs 0.953ns 3.57ns 0.0523 0 0 3.78 KB
#4700 ObjectExtractorMoreComplexBody netcoreapp3.1 3.63μs 1.44ns 5.57ns 0.0506 0 0 3.69 KB
#4700 ObjectExtractorMoreComplexBody net472 3.5μs 2.69ns 10.4ns 0.603 0.00526 0 3.8 KB
Benchmarks.Trace.Asm.AppSecWafBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master RunWaf(args=NestedMap (10)) net6.0 12.9μs 3.31ns 12.8ns 0.129 0 0 9.42 KB
master RunWaf(args=NestedMap (10)) netcoreapp3.1 20.4μs 48.2ns 174ns 0.122 0 0 9.41 KB
master RunWaf(args=NestedMap (10)) net472 29.9μs 8.65ns 33.5ns 1.49 0.0149 0 9.47 KB
master RunWafWithAttack(args=Neste(...)tack) [22]) net6.0 76.5μs 32.9ns 123ns 0.195 0 0 15.76 KB
master RunWafWithAttack(args=Neste(...)tack) [22]) netcoreapp3.1 86.4μs 174ns 673ns 0.218 0 0 15.71 KB
master RunWafWithAttack(args=Neste(...)tack) [22]) net472 101μs 92.7ns 359ns 2.51 0 0 16.03 KB
master RunWaf(args=NestedMap (100)) net6.0 24.4μs 10.3ns 38.4ns 0.27 0 0 19.66 KB
master RunWaf(args=NestedMap (100)) netcoreapp3.1 39μs 13.8ns 53.5ns 0.273 0 0 20.41 KB
master RunWaf(args=NestedMap (100)) net472 58.3μs 26.1ns 101ns 3.26 0.0583 0 20.62 KB
master RunWafWithAttack(args=Neste(...)tack) [23]) net6.0 91.4μs 35ns 121ns 0.363 0 0 26 KB
master RunWafWithAttack(args=Neste(...)tack) [23]) netcoreapp3.1 111μs 81.6ns 316ns 0.334 0 0 26.71 KB
master RunWafWithAttack(args=Neste(...)tack) [23]) net472 130μs 233ns 902ns 4.27 0.0648 0 27.18 KB
master RunWaf(args=NestedMap (20)) net6.0 24μs 23.9ns 92.5ns 0.276 0 0 19.39 KB
master RunWaf(args=NestedMap (20)) netcoreapp3.1 38.9μs 11.7ns 42.3ns 0.253 0 0 19.83 KB
master RunWaf(args=NestedMap (20)) net472 56.6μs 29.2ns 113ns 3.17 0.0566 0 20.03 KB
master RunWafWithAttack(args=Neste(...)tack) [22]) net6.0 92.6μs 36.8ns 138ns 0.369 0 0 25.74 KB
master RunWafWithAttack(args=Neste(...)tack) [22]) netcoreapp3.1 110μs 37.5ns 130ns 0.328 0 0 26.14 KB
master RunWafWithAttack(args=Neste(...)tack) [22]) net472 132μs 152ns 589ns 4.18 0.0654 0 26.59 KB
#4700 RunWaf(args=NestedMap (10)) net6.0 12.7μs 4.55ns 17ns 0.133 0 0 9.42 KB
#4700 RunWaf(args=NestedMap (10)) netcoreapp3.1 20.1μs 4.18ns 15.6ns 0.121 0 0 9.41 KB
#4700 RunWaf(args=NestedMap (10)) net472 29.9μs 9.05ns 33.9ns 1.5 0 0 9.47 KB
#4700 RunWafWithAttack(args=Neste(...)tack) [22]) net6.0 77μs 45.2ns 169ns 0.203 0 0 15.76 KB
#4700 RunWafWithAttack(args=Neste(...)tack) [22]) netcoreapp3.1 87.4μs 114ns 427ns 0.215 0 0 15.71 KB
#4700 RunWafWithAttack(args=Neste(...)tack) [22]) net472 100μs 38.7ns 150ns 2.5 0 0 16.03 KB
#4700 RunWaf(args=NestedMap (100)) net6.0 24.4μs 11.7ns 45.3ns 0.27 0 0 19.66 KB
#4700 RunWaf(args=NestedMap (100)) netcoreapp3.1 39.4μs 7.73ns 26.8ns 0.275 0 0 20.41 KB
#4700 RunWaf(args=NestedMap (100)) net472 56.7μs 28.7ns 111ns 3.25 0.0565 0 20.62 KB
#4700 RunWafWithAttack(args=Neste(...)tack) [23]) net6.0 92.4μs 223ns 864ns 0.365 0 0 26 KB
#4700 RunWafWithAttack(args=Neste(...)tack) [23]) netcoreapp3.1 111μs 120ns 466ns 0.332 0 0 26.71 KB
#4700 RunWafWithAttack(args=Neste(...)tack) [23]) net472 133μs 85.6ns 320ns 4.28 0.0658 0 27.18 KB
#4700 RunWaf(args=NestedMap (20)) net6.0 24.2μs 8.35ns 32.3ns 0.266 0 0 19.39 KB
#4700 RunWaf(args=NestedMap (20)) netcoreapp3.1 39.2μs 10.9ns 41ns 0.273 0 0 19.83 KB
#4700 RunWaf(args=NestedMap (20)) net472 56.2μs 28.2ns 109ns 3.16 0.056 0 20.03 KB
#4700 RunWafWithAttack(args=Neste(...)tack) [22]) net6.0 90.6μs 44.1ns 165ns 0.321 0 0 25.74 KB
#4700 RunWafWithAttack(args=Neste(...)tack) [22]) netcoreapp3.1 110μs 101ns 376ns 0.332 0 0 26.14 KB
#4700 RunWafWithAttack(args=Neste(...)tack) [22]) net472 131μs 138ns 535ns 4.19 0.0645 0 26.59 KB
Benchmarks.Trace.AspNetCoreBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master SendRequest net6.0 171μs 173ns 672ns 0.17 0 0 18.04 KB
master SendRequest netcoreapp3.1 189μs 290ns 1.12μs 0.186 0 0 20.2 KB
master SendRequest net472 0.000213ns 0.000155ns 0.000602ns 0 0 0 0 b
#4700 SendRequest net6.0 168μs 188ns 702ns 0.168 0 0 18.04 KB
#4700 SendRequest netcoreapp3.1 189μs 135ns 486ns 0.189 0 0 20.2 KB
#4700 SendRequest net472 0.000129ns 8.56E‑05ns 0.000331ns 0 0 0 0 b
Benchmarks.Trace.CIVisibilityProtocolWriterBenchmark - Same speed ✔️ More allocations ⚠️

More allocations ⚠️ in #4700

Benchmark Base Allocated Diff Allocated Change Change %
Benchmarks.Trace.CIVisibilityProtocolWriterBenchmark.WriteAndFlushEnrichedTraces‑net6.0 41.46 KB 41.81 KB 345 B 0.83%
Benchmarks.Trace.CIVisibilityProtocolWriterBenchmark.WriteAndFlushEnrichedTraces‑netcoreapp3.1 41.63 KB 41.89 KB 263 B 0.63%

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master WriteAndFlushEnrichedTraces net6.0 534μs 628ns 2.26μs 0.566 0 0 41.46 KB
master WriteAndFlushEnrichedTraces netcoreapp3.1 651μs 1.14μs 4.43μs 0.327 0 0 41.63 KB
master WriteAndFlushEnrichedTraces net472 838μs 2.54μs 9.85μs 8.17 2.45 0.408 53.24 KB
#4700 WriteAndFlushEnrichedTraces net6.0 548μs 2μs 7.73μs 0.576 0 0 41.81 KB
#4700 WriteAndFlushEnrichedTraces netcoreapp3.1 662μs 1.56μs 6.05μs 0.327 0 0 41.89 KB
#4700 WriteAndFlushEnrichedTraces net472 820μs 3.33μs 12.5μs 8.45 2.53 0.422 53.24 KB
Benchmarks.Trace.DbCommandBenchmark - Slower ⚠️ Same allocations ✔️

Slower ⚠️ in #4700

Benchmark diff/base Base Median (ns) Diff Median (ns) Modality
Benchmarks.Trace.DbCommandBenchmark.ExecuteNonQuery‑net6.0 1.128 955.80 1,078.33

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master ExecuteNonQuery net6.0 956ns 0.872ns 3.38ns 0.0107 0 0 768 B
master ExecuteNonQuery netcoreapp3.1 1.3μs 0.476ns 1.78ns 0.0102 0 0 768 B
master ExecuteNonQuery net472 1.66μs 4.23ns 16.4ns 0.116 0 0 730 B
#4700 ExecuteNonQuery net6.0 1.08μs 1.16ns 4.5ns 0.0109 0 0 768 B
#4700 ExecuteNonQuery netcoreapp3.1 1.37μs 0.308ns 1.15ns 0.0102 0 0 768 B
#4700 ExecuteNonQuery net472 1.62μs 0.408ns 1.58ns 0.116 0.00081 0 730 B
Benchmarks.Trace.ElasticsearchBenchmark - Slower ⚠️ Same allocations ✔️

Slower ⚠️ in #4700

Benchmark diff/base Base Median (ns) Diff Median (ns) Modality
Benchmarks.Trace.ElasticsearchBenchmark.CallElasticsearchAsync‑net6.0 1.150 1,144.19 1,316.33

Faster 🎉 in #4700

Benchmark base/diff Base Median (ns) Diff Median (ns) Modality
Benchmarks.Trace.ElasticsearchBenchmark.CallElasticsearch‑net6.0 1.114 1,166.23 1,046.88

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master CallElasticsearch net6.0 1.17μs 0.688ns 2.66ns 0.0128 0 0 936 B
master CallElasticsearch netcoreapp3.1 1.39μs 0.813ns 2.93ns 0.0125 0 0 936 B
master CallElasticsearch net472 2.32μs 0.682ns 2.64ns 0.151 0 0 955 B
master CallElasticsearchAsync net6.0 1.14μs 0.379ns 1.47ns 0.0127 0 0 912 B
master CallElasticsearchAsync netcoreapp3.1 1.51μs 1.81ns 7ns 0.0134 0 0 984 B
master CallElasticsearchAsync net472 2.46μs 1.62ns 6.26ns 0.16 0 0 1.01 KB
#4700 CallElasticsearch net6.0 1.05μs 0.545ns 2.11ns 0.0132 0 0 936 B
#4700 CallElasticsearch netcoreapp3.1 1.38μs 0.908ns 3.4ns 0.0128 0 0 936 B
#4700 CallElasticsearch net472 2.36μs 0.957ns 3.71ns 0.152 0 0 955 B
#4700 CallElasticsearchAsync net6.0 1.32μs 0.601ns 2.25ns 0.0124 0 0 912 B
#4700 CallElasticsearchAsync netcoreapp3.1 1.39μs 0.867ns 3.36ns 0.0131 0 0 984 B
#4700 CallElasticsearchAsync net472 2.42μs 0.69ns 2.58ns 0.16 0 0 1.01 KB
Benchmarks.Trace.GraphQLBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master ExecuteAsync net6.0 1.31μs 0.572ns 2.14ns 0.0125 0 0 912 B
master ExecuteAsync netcoreapp3.1 1.52μs 0.472ns 1.77ns 0.0121 0 0 912 B
master ExecuteAsync net472 1.74μs 0.833ns 3.23ns 0.138 0 0 875 B
#4700 ExecuteAsync net6.0 1.22μs 0.637ns 2.38ns 0.0126 0 0 912 B
#4700 ExecuteAsync netcoreapp3.1 1.37μs 2.83ns 10.2ns 0.0122 0 0 912 B
#4700 ExecuteAsync net472 1.66μs 0.774ns 2.9ns 0.139 0 0 875 B
Benchmarks.Trace.HttpClientBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master SendAsync net6.0 3.8μs 1.3ns 5.04ns 0.0265 0 0 1.9 KB
master SendAsync netcoreapp3.1 4.61μs 1.8ns 6.99ns 0.0323 0 0 2.43 KB
master SendAsync net472 7.05μs 3.77ns 14.6ns 0.474 0 0 2.99 KB
#4700 SendAsync net6.0 3.69μs 1.41ns 5.29ns 0.0259 0 0 1.9 KB
#4700 SendAsync netcoreapp3.1 4.52μs 7.02ns 27.2ns 0.0316 0 0 2.43 KB
#4700 SendAsync net472 7.06μs 1.98ns 7.66ns 0.475 0 0 2.99 KB
Benchmarks.Trace.ILoggerBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master EnrichedLog net6.0 1.34μs 0.635ns 2.46ns 0.0221 0 0 1.57 KB
master EnrichedLog netcoreapp3.1 2.08μs 1.27ns 4.92ns 0.0208 0 0 1.57 KB
master EnrichedLog net472 2.34μs 3.15ns 12.2ns 0.236 0 0 1.49 KB
#4700 EnrichedLog net6.0 1.33μs 0.554ns 2.07ns 0.0219 0 0 1.57 KB
#4700 EnrichedLog netcoreapp3.1 1.88μs 1.18ns 4.57ns 0.0216 0 0 1.57 KB
#4700 EnrichedLog net472 2.3μs 2.35ns 9.11ns 0.237 0 0 1.49 KB
Benchmarks.Trace.Log4netBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master EnrichedLog net6.0 111μs 90.3ns 350ns 0.0553 0 0 4.21 KB
master EnrichedLog netcoreapp3.1 119μs 195ns 754ns 0.0588 0 0 4.21 KB
master EnrichedLog net472 146μs 78ns 281ns 0.655 0.218 0 4.38 KB
#4700 EnrichedLog net6.0 111μs 59ns 229ns 0.0554 0 0 4.21 KB
#4700 EnrichedLog netcoreapp3.1 117μs 250ns 902ns 0 0 0 4.21 KB
#4700 EnrichedLog net472 146μs 53.2ns 199ns 0.658 0.219 0 4.38 KB
Benchmarks.Trace.NLogBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master EnrichedLog net6.0 2.95μs 1.05ns 4.08ns 0.0297 0 0 2.13 KB
master EnrichedLog netcoreapp3.1 3.96μs 1.54ns 5.98ns 0.0277 0 0 2.13 KB
master EnrichedLog net472 4.53μs 3.6ns 13.9ns 0.305 0 0 1.93 KB
#4700 EnrichedLog net6.0 2.88μs 0.936ns 3.63ns 0.0288 0 0 2.13 KB
#4700 EnrichedLog netcoreapp3.1 3.9μs 1.78ns 6.89ns 0.0294 0 0 2.13 KB
#4700 EnrichedLog net472 4.6μs 1.31ns 5.09ns 0.305 0 0 1.93 KB
Benchmarks.Trace.RedisBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master SendReceive net6.0 1.29μs 0.633ns 2.28ns 0.0154 0 0 1.1 KB
master SendReceive netcoreapp3.1 1.55μs 0.592ns 2.21ns 0.0148 0 0 1.1 KB
master SendReceive net472 1.95μs 1.16ns 4.33ns 0.176 0 0 1.12 KB
#4700 SendReceive net6.0 1.3μs 0.731ns 2.83ns 0.0156 0 0 1.1 KB
#4700 SendReceive netcoreapp3.1 1.61μs 1.02ns 3.94ns 0.0149 0 0 1.1 KB
#4700 SendReceive net472 2.02μs 3.69ns 12.8ns 0.177 0 0 1.12 KB
Benchmarks.Trace.SerilogBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master EnrichedLog net6.0 2.62μs 1.08ns 4.2ns 0.021 0 0 1.53 KB
master EnrichedLog netcoreapp3.1 3.6μs 1.39ns 5.4ns 0.0197 0 0 1.58 KB
master EnrichedLog net472 3.97μs 1.7ns 6.37ns 0.309 0 0 1.96 KB
#4700 EnrichedLog net6.0 2.54μs 0.89ns 3.33ns 0.0216 0 0 1.53 KB
#4700 EnrichedLog netcoreapp3.1 3.56μs 1.43ns 5.53ns 0.0214 0 0 1.58 KB
#4700 EnrichedLog net472 4.12μs 1.61ns 6.22ns 0.31 0 0 1.96 KB
Benchmarks.Trace.SpanBenchmark - Slower ⚠️ Same allocations ✔️

Slower ⚠️ in #4700

Benchmark diff/base Base Median (ns) Diff Median (ns) Modality
Benchmarks.Trace.SpanBenchmark.StartFinishSpan‑net6.0 1.369 395.77 541.67
Benchmarks.Trace.SpanBenchmark.StartFinishScope‑netcoreapp3.1 1.184 672.86 796.95 several?

Faster 🎉 in #4700

Benchmark base/diff Base Median (ns) Diff Median (ns) Modality
Benchmarks.Trace.SpanBenchmark.StartFinishScope‑net472 1.194 879.03 736.21
Benchmarks.Trace.SpanBenchmark.StartFinishScope‑net6.0 1.119 525.86 470.09

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master StartFinishSpan net6.0 396ns 0.157ns 0.587ns 0.00743 0 0 536 B
master StartFinishSpan netcoreapp3.1 586ns 0.257ns 0.995ns 0.00731 0 0 536 B
master StartFinishSpan net472 673ns 0.211ns 0.817ns 0.0854 0 0 538 B
master StartFinishScope net6.0 526ns 0.185ns 0.715ns 0.00919 0 0 656 B
master StartFinishScope netcoreapp3.1 673ns 0.271ns 1.05ns 0.00893 0 0 656 B
master StartFinishScope net472 879ns 0.407ns 1.58ns 0.0981 0 0 618 B
#4700 StartFinishSpan net6.0 542ns 0.148ns 0.573ns 0.0074 0 0 536 B
#4700 StartFinishSpan netcoreapp3.1 531ns 0.337ns 1.31ns 0.00727 0 0 536 B
#4700 StartFinishSpan net472 619ns 0.194ns 0.728ns 0.0854 0 0 538 B
#4700 StartFinishScope net6.0 470ns 0.174ns 0.675ns 0.00915 0 0 656 B
#4700 StartFinishScope netcoreapp3.1 781ns 4.23ns 24.3ns 0.00867 0 0 656 B
#4700 StartFinishScope net472 736ns 0.63ns 2.44ns 0.098 0 0 618 B
Benchmarks.Trace.TraceAnnotationsBenchmark - Slower ⚠️ Same allocations ✔️

Slower ⚠️ in #4700

Benchmark diff/base Base Median (ns) Diff Median (ns) Modality
Benchmarks.Trace.TraceAnnotationsBenchmark.RunOnMethodBegin‑netcoreapp3.1 1.126 714.51 804.25

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master RunOnMethodBegin net6.0 560ns 0.306ns 1.19ns 0.00913 0 0 656 B
master RunOnMethodBegin netcoreapp3.1 715ns 0.199ns 0.771ns 0.0088 0 0 656 B
master RunOnMethodBegin net472 953ns 0.487ns 1.82ns 0.0977 0 0 618 B
#4700 RunOnMethodBegin net6.0 580ns 0.166ns 0.622ns 0.00923 0 0 656 B
#4700 RunOnMethodBegin netcoreapp3.1 804ns 0.544ns 2.04ns 0.00893 0 0 656 B
#4700 RunOnMethodBegin net472 915ns 0.285ns 1.1ns 0.0978 0 0 618 B

@github-actions
Copy link
Contributor

github-actions bot commented Oct 6, 2023

Snapshots difference summary

The following differences have been observed in committed snapshots. It is meant to help the reviewer.
The diff is simplistic, so please check some files anyway while we improve it.

2 occurrences of :

-    Name: SendMessageToProcessorAsync,
+    Name: internal,

116 occurrences of :

+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet,

18 occurrences of :

-    Name: Message,
+    Name: producer,

9 occurrences of :

+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
[...]
-    Name: ServiceBusSender.Send,
+    Name: servicebus.publish,

5 occurrences of :

+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
[...]
-    Name: ServiceBusReceiver.Receive,
+    Name: servicebus.receive,

8 occurrences of :

-    Name: ServiceBusProcessor.ProcessMessage,
+    Name: servicebus.process,

30 occurrences of :

-    Name: ServiceBusReceiver.Complete,
+    Name: servicebus.settle,

1 occurrences of :

+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
[...]
-    Name: FirstSessionId - Producer,
+    Name: internal,

8 occurrences of :

+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
[...]
-    Name: Message,
+    Name: producer,

1 occurrences of :

+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
[...]
-    Name: SecondSessionId - Producer,
+    Name: internal,

1 occurrences of :

+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
[...]
-    Name: ProcessorSessionId - Producer,
+    Name: internal,

2 occurrences of :

-    Name: ServiceBusSessionReceiver.RenewSessionLock,
+    Name: client.request,

2 occurrences of :

-    Name: ServiceBusSessionReceiver.SetSessionState,
+    Name: client.request,

2 occurrences of :

-    Name: ServiceBusSessionReceiver.GetSessionState,
+    Name: client.request,

18 occurrences of :

-    Name: ServiceBusReceiver.Receive,
+    Name: servicebus.receive,

2 occurrences of :

-    Name: ServiceBusSessionProcessor.ProcessSessionMessage,
+    Name: servicebus.process,

1 occurrences of :

+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
[...]
-    Name: TestSenderSchedulingAsync,
+    Name: internal,

2 occurrences of :

+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
[...]
-    Name: ServiceBusSender.Schedule,
+    Name: servicebus.publish,

1 occurrences of :

+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
[...]
-    Name: ServiceBusSender.Cancel,
+    Name: client.request,

4 occurrences of :

+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet

2 occurrences of :

-    Name: ServiceBusSender.Cancel,
+    Name: client.request,

1 occurrences of :

+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
[...]
-    Name: SendIndividualMessageAsync,
+    Name: internal,

1 occurrences of :

+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
[...]
-    Name: ServiceBusReceiver.Peek,
+    Name: servicebus.receive,

2 occurrences of :

-    Name: ServiceBusReceiver.RenewMessageLock,
+    Name: client.request,

2 occurrences of :

-    Name: ServiceBusReceiver.Abandon,
+    Name: servicebus.settle,

14 occurrences of :

-    Name: ServiceBusReceiver.Defer,
+    Name: servicebus.settle,

6 occurrences of :

-    Name: ServiceBusReceiver.ReceiveDeferred,
+    Name: servicebus.receive,

2 occurrences of :

-    Name: ServiceBusReceiver.DeadLetter,
+    Name: servicebus.settle,

2 occurrences of :

-    Name: SendBatchMessagesAsync - IEnumerable_ServiceBusMessage,
+    Name: internal,

2 occurrences of :

-    Name: SendBatchMessagesAsync - ServiceBusMessageBatch,
+    Name: internal,

2 occurrences of :

-    Name: ServiceBusReceiver.Peek,
+    Name: servicebus.receive,

2 occurrences of :

-    Name: SendMessageToTopicAsync,
+    Name: internal,

9 occurrences of :

+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet,
[...]
-    Name: ServiceBusSender.Send,
+    Name: servicebus.publish,

5 occurrences of :

+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet,
[...]
-    Name: ServiceBusReceiver.Receive,
+    Name: servicebus.receive,

1 occurrences of :

+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet,
[...]
-    Name: FirstSessionId - Producer,
+    Name: internal,

8 occurrences of :

+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet,
[...]
-    Name: Message,
+    Name: producer,

1 occurrences of :

+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet,
[...]
-    Name: SecondSessionId - Producer,
+    Name: internal,

1 occurrences of :

+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet,
[...]
-    Name: ProcessorSessionId - Producer,
+    Name: internal,

1 occurrences of :

+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet,
[...]
-    Name: TestSenderSchedulingAsync,
+    Name: internal,

2 occurrences of :

+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet,
[...]
-    Name: ServiceBusSender.Schedule,
+    Name: servicebus.publish,

1 occurrences of :

+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet,
[...]
-    Name: ServiceBusSender.Cancel,
+    Name: client.request,

1 occurrences of :

+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet,
[...]
-    Name: SendIndividualMessageAsync,
+    Name: internal,

1 occurrences of :

+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet,
[...]
-    Name: ServiceBusReceiver.Peek,
+    Name: servicebus.receive,

2 occurrences of :

-    Name: SendBothStreamingRequest,
+    Name: internal,

2 occurrences of :

-    Name: SendClientStreamingRequest,
+    Name: internal,

2 occurrences of :

-    Name: SendErrors_Cancelled,
+    Name: internal,

2 occurrences of :

-    Name: SendErrors_DataLoss,
+    Name: internal,

2 occurrences of :

-    Name: SendErrors_NotFound,
+    Name: internal,

2 occurrences of :

-    Name: SendErrors_Throw,
+    Name: internal,

2 occurrences of :

-    Name: SendErrorsAsync_Cancelled,
+    Name: internal,

2 occurrences of :

-    Name: SendErrorsAsync_DataLoss,
+    Name: internal,

2 occurrences of :

-    Name: SendErrorsAsync_NotFound,
+    Name: internal,

2 occurrences of :

-    Name: SendErrorsAsync_Throw,
+    Name: internal,

2 occurrences of :

-    Name: SendServerStreamingRequest,
+    Name: internal,

2 occurrences of :

-    Name: SendUnaryRequest,
+    Name: internal,

2 occurrences of :

-    Name: SendUnaryRequestAsync,
+    Name: internal,

2 occurrences of :

-    Name: SendVerySlowRequest,
+    Name: internal,

2 occurrences of :

-    Name: SendVerySlowRequestAsync,
+    Name: internal,

6 occurrences of :

-    Name: Main(),
+    Name: internal,

12 occurrences of :

-    Name: sync-calls,
+    Name: internal,

6 occurrences of :

-    Name: async-calls,
+    Name: internal,

4 occurrences of :

-    Name: sync-calls-execute,
+    Name: internal,

4 occurrences of :

-    Name: async-calls-execute,
+    Name: internal,

1 occurrences of :

-    Name: Ctor1,
+    Name: server.request,

1 occurrences of :

-    Name: Ctor2,
+    Name: server.request,

1 occurrences of :

-    Name: Ctor3,
+    Name: server.request,

1 occurrences of :

-    Name: Ctor4,
+    Name: server.request,

1 occurrences of :

-    Name: ErrorSpan,
+    Name: internal,

1 occurrences of :

-    Name: OkSpan,
+    Name: internal,

1 occurrences of :

-    Name: UnsetStatusSpan,
+    Name: internal,

1 occurrences of :

-    Name: ParentSpan,
+    Name: internal,

1 occurrences of :

-    Name: ChildSpan,
+    Name: internal,

1 occurrences of :

-    Name: W3CParentSpan,
+    Name: internal,

1 occurrences of :

-    Name: W3CChildSpan,
+    Name: internal,

1 occurrences of :

-    Name: MiscSpan,
+    Name: internal,

1 occurrences of :

-    Name: MiscSpan2,
+    Name: internal,

1 occurrences of :

-    Name: Parent-NonW3CId,
+    Name: internal,

1 occurrences of :

-    Name: Child-NonW3CId,
+    Name: internal,

1 occurrences of :

-    Name: RootSpan,
+    Name: operationnameoverride,
+    Resource: ResourceNameOverride,
+    Service: ServiceNameOverride,
+    Type: SpanTypeOverride,
+    Tags: {
+      env: integration_tests,
+      http.request.method: GET,
+      language: dotnet,
+      otel.library.name: Samples.NetActivitySdk,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_5,
+      runtime-id: Guid_2,
+      span.kind: server,
+      _dd.base_service: Samples.NetActivitySdk,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet,
+      _dd.p.dm: -0,
+      _dd.p.tid: 1234567890abcdef
+    },
+    Metrics: {
+      process_id: 0,
+      _dd.agent_psr: 1.0,
+      _dd.top_level: 1.0,
+      _dd.tracer_kr: 1.0,
+      _dd1.sr.eausr: 1.0,
+      _sampling_priority_v1: 1.0
+    }
+  },
+  {
+    TraceId: Id_23,
+    SpanId: Id_24,
+    Name: internal,

12 occurrences of :

-      otel.trace_id: Guid_5,
+      otel.trace_id: Guid_6,

1 occurrences of :

-    TraceId: Id_21,
-    SpanId: Id_23,
-    Name: Saying hello!,
+    TraceId: Id_23,
+    SpanId: Id_25,
+    Name: saying hello!,
[...]
-    ParentId: Id_22,
+    ParentId: Id_24,

1 occurrences of :

-    TraceId: Id_21,
-    SpanId: Id_24,
-    Name: SetTagsActivity,
+    TraceId: Id_23,
+    SpanId: Id_26,
+    Name: internal,
[...]
-    ParentId: Id_22,
+    ParentId: Id_24,

1 occurrences of :

-    TraceId: Id_21,
-    SpanId: Id_25,
-    Name: NameEvent,
+    TraceId: Id_23,
+    SpanId: Id_27,
+    Name: internal,
[...]
-    ParentId: Id_22,
+    ParentId: Id_24,
[...]
-      otel.trace_id: Guid_5,
+      otel.trace_id: Guid_6,

1 occurrences of :

-    TraceId: Id_21,
-    SpanId: Id_26,
-    Name: AddBaggage,
+    TraceId: Id_23,
+    SpanId: Id_28,
+    Name: internal,
[...]
-    ParentId: Id_22,
+    ParentId: Id_24,
[...]
-      otel.trace_id: Guid_5,
+      otel.trace_id: Guid_6,

1 occurrences of :

-    TraceId: Id_21,
-    SpanId: Id_27,
-    Name: NameDateEvent,
+    TraceId: Id_23,
+    SpanId: Id_29,
+    Name: http.server.request,
+    Resource: operation name should be-> http.server.request,
+    Service: Samples.NetActivitySdk,
+    Type: web,
+    ParentId: Id_24,
+    Tags: {
+      env: integration_tests,
+      http.request.method: GET,
+      language: dotnet,
+      otel.library.name: Samples.NetActivitySdk,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_6,
+      span.kind: server,
+      version: 1.0.0,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_23,
+    SpanId: Id_30,
+    Name: http.client.request,
+    Resource: operation name should be-> http.client.request,
+    Service: Samples.NetActivitySdk,
+    Type: http,
+    ParentId: Id_24,
+    Tags: {
+      env: integration_tests,
+      http.request.method: GET,
+      language: dotnet,
+      otel.library.name: Samples.NetActivitySdk,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_6,
+      span.kind: client,
+      version: 1.0.0,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_23,
+    SpanId: Id_31,
+    Name: redis.query,
+    Resource: operation name should be-> redis.query,
+    Service: Samples.NetActivitySdk,
+    Type: db,
+    ParentId: Id_24,
+    Tags: {
+      db.system: Redis,
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: Samples.NetActivitySdk,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_6,
+      span.kind: client,
+      version: 1.0.0,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_23,
+    SpanId: Id_32,
+    Name: kafka.receive,
+    Resource: operation name should be-> kafka.receive,
+    Service: Samples.NetActivitySdk,
+    Type: http,
+    ParentId: Id_24,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      messaging.operation: Receive,
+      messaging.system: Kafka,
+      otel.library.name: Samples.NetActivitySdk,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_6,
+      span.kind: client,
+      version: 1.0.0,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_23,
+    SpanId: Id_33,
+    Name: kafka.receive,
+    Resource: operation name should be-> kafka.receive,
+    Service: Samples.NetActivitySdk,
+    Type: web,
+    ParentId: Id_24,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      messaging.operation: Receive,
+      messaging.system: Kafka,
+      otel.library.name: Samples.NetActivitySdk,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_6,
+      span.kind: server,
+      version: 1.0.0,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_23,
+    SpanId: Id_34,
+    Name: kafka.receive,
+    Resource: operation name should be-> kafka.receive,
+    Service: Samples.NetActivitySdk,
+    Type: custom,
+    ParentId: Id_24,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      messaging.operation: Receive,
+      messaging.system: Kafka,
+      otel.library.name: Samples.NetActivitySdk,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_6,
+      span.kind: producer,
+      version: 1.0.0,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_23,
+    SpanId: Id_35,
+    Name: kafka.receive,
+    Resource: operation name should be-> kafka.receive,
+    Service: Samples.NetActivitySdk,
+    Type: custom,
+    ParentId: Id_24,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      messaging.operation: Receive,
+      messaging.system: Kafka,
+      otel.library.name: Samples.NetActivitySdk,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_6,
+      span.kind: consumer,
+      version: 1.0.0,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_23,
+    SpanId: Id_36,
+    Name: aws.s3.request,
+    Resource: operation name should be-> aws.s3.request,
+    Service: Samples.NetActivitySdk,
+    Type: http,
+    ParentId: Id_24,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: Samples.NetActivitySdk,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_6,
+      rpc.service: S3,
+      rpc.system: aws-api,
+      span.kind: client,
+      version: 1.0.0,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_23,
+    SpanId: Id_37,
+    Name: aws.client.request,
+    Resource: operation name should be-> aws.client.request,
+    Service: Samples.NetActivitySdk,
+    Type: http,
+    ParentId: Id_24,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: Samples.NetActivitySdk,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_6,
+      rpc.system: aws-api,
+      span.kind: client,
+      version: 1.0.0,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_23,
+    SpanId: Id_38,
+    Name: grpc.client.request,
+    Resource: operation name should be-> grpc.client.request,
+    Service: Samples.NetActivitySdk,
+    Type: http,
+    ParentId: Id_24,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: Samples.NetActivitySdk,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_6,
+      rpc.system: GRPC,
+      span.kind: client,
+      version: 1.0.0,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_23,
+    SpanId: Id_39,
+    Name: grpc.server.request,
+    Resource: operation name should be-> grpc.server.request,
+    Service: Samples.NetActivitySdk,
+    Type: web,
+    ParentId: Id_24,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: Samples.NetActivitySdk,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_6,
+      rpc.system: GRPC,
+      span.kind: server,
+      version: 1.0.0,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_23,
+    SpanId: Id_40,
+    Name: aws.my-function.invoke,
+    Resource: operation name should be-> aws.my-function.invoke,
+    Service: Samples.NetActivitySdk,
+    Type: http,
+    ParentId: Id_24,
+    Tags: {
+      env: integration_tests,
+      faas.invoked_name: My-Function,
+      faas.invoked_provider: aws,
+      language: dotnet,
+      otel.library.name: Samples.NetActivitySdk,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_6,
+      span.kind: client,
+      version: 1.0.0,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_23,
+    SpanId: Id_41,
+    Name: datasource.invoke,
+    Resource: operation name should be-> datasource.invoke,
+    Service: Samples.NetActivitySdk,
+    Type: web,
+    ParentId: Id_24,
+    Tags: {
+      env: integration_tests,
+      faas.trigger: Datasource,
+      language: dotnet,
+      otel.library.name: Samples.NetActivitySdk,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_6,
+      span.kind: server,
+      version: 1.0.0,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_23,
+    SpanId: Id_42,
+    Name: graphql.server.request,
+    Resource: operation name should be-> graphql.server.request,
+    Service: Samples.NetActivitySdk,
+    Type: web,
+    ParentId: Id_24,
+    Tags: {
+      env: integration_tests,
+      graphql.operation.type: query,
+      language: dotnet,
+      otel.library.name: Samples.NetActivitySdk,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_6,
+      span.kind: server,
+      version: 1.0.0,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_23,
+    SpanId: Id_43,
+    Name: amqp.server.request,
+    Resource: operation name should be-> amqp.server.request,
+    Service: Samples.NetActivitySdk,
+    Type: web,
+    ParentId: Id_24,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      network.protocol.name: Amqp,
+      otel.library.name: Samples.NetActivitySdk,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_6,
+      span.kind: server,
+      version: 1.0.0,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_23,
+    SpanId: Id_44,
+    Name: server.request,
+    Resource: operation name should be-> server.request,
+    Service: Samples.NetActivitySdk,
+    Type: web,
+    ParentId: Id_24,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: Samples.NetActivitySdk,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_6,
+      span.kind: server,
+      version: 1.0.0,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_23,
+    SpanId: Id_45,
+    Name: amqp.client.request,
+    Resource: operation name should be-> amqp.client.request,
+    Service: Samples.NetActivitySdk,
+    Type: http,
+    ParentId: Id_24,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      network.protocol.name: Amqp,
+      otel.library.name: Samples.NetActivitySdk,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_6,
+      span.kind: client,
+      version: 1.0.0,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_23,
+    SpanId: Id_46,
+    Name: client.request,
+    Resource: operation name should be-> client.request,
+    Service: Samples.NetActivitySdk,
+    Type: http,
+    ParentId: Id_24,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: Samples.NetActivitySdk,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_6,
+      span.kind: client,
+      version: 1.0.0,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_23,
+    SpanId: Id_47,
+    Name: internal,
+    Resource: operation name should be-> internal,
+    Service: Samples.NetActivitySdk,
+    Type: custom,
+    ParentId: Id_24,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: Samples.NetActivitySdk,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_6,
+      span.kind: internal,
+      version: 1.0.0,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_23,
+    SpanId: Id_48,
+    Name: consumer,
+    Resource: operation name should be-> consumer,
+    Service: Samples.NetActivitySdk,
+    Type: custom,
+    ParentId: Id_24,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: Samples.NetActivitySdk,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_6,
+      span.kind: consumer,
+      version: 1.0.0,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_23,
+    SpanId: Id_49,
+    Name: producer,
+    Resource: operation name should be-> producer,
+    Service: Samples.NetActivitySdk,
+    Type: custom,
+    ParentId: Id_24,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: Samples.NetActivitySdk,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_6,
+      span.kind: producer,
+      version: 1.0.0,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_23,
+    SpanId: Id_50,
+    Name: internal,
[...]
-    ParentId: Id_25,
+    ParentId: Id_27,
[...]
-      otel.trace_id: Guid_5,
+      otel.trace_id: Guid_6,

1 occurrences of :

-    TraceId: Id_21,
-    SpanId: Id_28,
-    Name: SetBaggage,
+    TraceId: Id_23,
+    SpanId: Id_51,
+    Name: internal,
[...]
-    ParentId: Id_26,
+    ParentId: Id_28,
[...]
-      otel.trace_id: Guid_5,
+      otel.trace_id: Guid_6,

1 occurrences of :

-    TraceId: Id_21,
-    SpanId: Id_29,
-    Name: EmptyTagsEvent,
+    TraceId: Id_23,
+    SpanId: Id_52,
+    Name: internal,
[...]
-    ParentId: Id_27,
+    ParentId: Id_50,
[...]
-      otel.trace_id: Guid_5,
+      otel.trace_id: Guid_6,

1 occurrences of :

-    TraceId: Id_21,
-    SpanId: Id_30,
-    Name: TagsEvent,
+    TraceId: Id_23,
+    SpanId: Id_53,
+    Name: internal,
[...]
-    ParentId: Id_29,
+    ParentId: Id_52,
[...]
-      otel.trace_id: Guid_5,
+      otel.trace_id: Guid_6,

1 occurrences of :

-    TraceId: Id_21,
-    SpanId: Id_31,
-    Name: MultipleEvents,
+    TraceId: Id_23,
+    SpanId: Id_54,
+    Name: internal,
[...]
-    ParentId: Id_30,
+    ParentId: Id_53,
[...]
-      otel.trace_id: Guid_5,
+      otel.trace_id: Guid_6,

2 occurrences of :

-    Name: Saying hello!,
+    Name: internal,
+    Resource: OperationNameRootSpan,
+    Service: MyServiceName,
+    Type: custom,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      runtime-id: Guid_2,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: internal,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet,
+      _dd.p.dm: -0,
+      _dd.p.tid: 1234567890abcdef
+    },
+    Metrics: {
+      process_id: 0,
+      _dd.agent_psr: 1.0,
+      _dd.top_level: 1.0,
+      _dd.tracer_kr: 1.0,
+      _sampling_priority_v1: 1.0
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_3,
+    Name: http.server.request,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: web,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      http.request.method: GET,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: server,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_4,
+    Name: http.client.request,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: http,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      http.request.method: GET,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: client,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_5,
+    Name: redis.query,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: db,
+    ParentId: Id_2,
+    Tags: {
+      db.system: Redis,
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: client,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_6,
+    Name: kafka.receive,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: http,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      messaging.operation: Receive,
+      messaging.system: Kafka,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: client,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_7,
+    Name: kafka.receive,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: web,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      messaging.operation: Receive,
+      messaging.system: Kafka,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: server,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_8,
+    Name: kafka.receive,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: custom,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      messaging.operation: Receive,
+      messaging.system: Kafka,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: producer,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_9,
+    Name: kafka.receive,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: custom,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      messaging.operation: Receive,
+      messaging.system: Kafka,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: consumer,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_10,
+    Name: aws.s3.request,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: http,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      rpc.service: S3,
+      rpc.system: aws-api,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: client,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_11,
+    Name: aws.client.request,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: http,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      rpc.system: aws-api,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: client,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_12,
+    Name: grpc.client.request,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: http,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      rpc.system: GRPC,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: client,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_13,
+    Name: grpc.server.request,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: web,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      rpc.system: GRPC,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: server,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_14,
+    Name: aws.my-function.invoke,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: http,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      faas.invoked_name: My-Function,
+      faas.invoked_provider: aws,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: client,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_15,
+    Name: datasource.invoke,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: web,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      faas.trigger: Datasource,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: server,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_16,
+    Name: graphql.server.request,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: web,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      graphql.operation.type: query,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: server,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_17,
+    Name: amqp.server.request,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: web,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      network.protocol.name: Amqp,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: server,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_18,
+    Name: server.request,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: web,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: server,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_19,
+    Name: amqp.client.request,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: http,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      network.protocol.name: Amqp,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: client,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_20,
+    Name: client.request,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: http,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: client,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_21,
+    Name: internal,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: custom,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: internal,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_22,
+    Name: consumer,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: custom,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: consumer,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_23,
+    Name: producer,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: custom,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: producer,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_24,
+    Name: operationnameoverride,
+    Resource: ResourceNameOverride,
+    Service: ServiceNameOverride,
+    Type: SpanTypeOverride,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      http.request.method: GET,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      runtime-id: Guid_2,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: server,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    },
+    Metrics: {
+      _dd.top_level: 1.0,
+      _dd1.sr.eausr: 1.0
+    }
+  },
+  {
+    TraceId: Id_25,
+    SpanId: Id_26,
+    Name: saying hello!,

27 occurrences of :

-      otel.trace_id: Guid_1,
+      otel.trace_id: Guid_4,

6 occurrences of :

-    TraceId: Id_1,
-    SpanId: Id_3,
-    Name: StartSpan,
+    TraceId: Id_25,
+    SpanId: Id_27,
+    Name: internal,
[...]
-    ParentId: Id_2,
+    ParentId: Id_26,
[...]
-      otel.trace_id: Guid_1,
+      otel.trace_id: Guid_4,

6 occurrences of :

-    TraceId: Id_1,
-    SpanId: Id_4,
-    Name: StartSpan2,
+    TraceId: Id_25,
+    SpanId: Id_28,
+    Name: internal,
[...]
-    ParentId: Id_2,
+    ParentId: Id_26,
[...]
-      otel.trace_id: Guid_1,
+      otel.trace_id: Guid_4,

6 occurrences of :

-    TraceId: Id_1,
-    SpanId: Id_5,
-    Name: StartRootSpan,
+    TraceId: Id_25,
+    SpanId: Id_29,
+    Name: internal,
[...]
-    ParentId: Id_2,
+    ParentId: Id_26,
[...]
-      otel.trace_id: Guid_1,
+      otel.trace_id: Guid_4,

6 occurrences of :

-    TraceId: Id_1,
-    SpanId: Id_6,
-    Name: InnerSpanOk,
+    TraceId: Id_25,
+    SpanId: Id_30,
+    Name: internal,
[...]
-    ParentId: Id_2,
+    ParentId: Id_26,
[...]
-      otel.trace_id: Guid_1,
+      otel.trace_id: Guid_4,

6 occurrences of :

-    TraceId: Id_1,
-    SpanId: Id_7,
-    Name: InnerSpanError,
+    TraceId: Id_25,
+    SpanId: Id_31,
+    Name: internal,
[...]
-    ParentId: Id_2,
+    ParentId: Id_26,

6 occurrences of :

-    TraceId: Id_1,
-    SpanId: Id_8,
-    Name: InnerSpan,
+    TraceId: Id_25,
+    SpanId: Id_32,
+    Name: internal,
[...]
-    ParentId: Id_2,
+    ParentId: Id_26,

6 occurrences of :

-    TraceId: Id_1,
-    SpanId: Id_9,
-    Name: Response,
+    TraceId: Id_25,
+    SpanId: Id_33,
+    Name: internal,
[...]
-    ParentId: Id_2,
+    ParentId: Id_26,
[...]
-      otel.trace_id: Guid_1,
+      otel.trace_id: Guid_4,

6 occurrences of :

-    TraceId: Id_1,
-    SpanId: Id_10,
-    Name: StartActiveSpan.Child,
+    TraceId: Id_25,
+    SpanId: Id_34,
+    Name: internal,
[...]
-    ParentId: Id_3,
+    ParentId: Id_27,
[...]
-      otel.trace_id: Guid_1,
+      otel.trace_id: Guid_4,

6 occurrences of :

-    TraceId: Id_11,
-    SpanId: Id_12,
-    Name: SayHello2,
+    TraceId: Id_35,
+    SpanId: Id_36,
+    Name: internal,

9 occurrences of :

-      otel.trace_id: Guid_4,
+      otel.trace_id: Guid_5,

6 occurrences of :

-    TraceId: Id_13,
-    SpanId: Id_14,
-    Name: SayHello3,
+    TraceId: Id_37,
+    SpanId: Id_38,
+    Name: internal,

6 occurrences of :

-    TraceId: Id_15,
-    SpanId: Id_16,
-    Name: Transform,
+    TraceId: Id_39,
+    SpanId: Id_40,
+    Name: internal,

9 occurrences of :

-      otel.trace_id: Guid_6,
+      otel.trace_id: Guid_7,

4 occurrences of :

-    Name: Saying hello!,
+    Name: internal,
+    Resource: OperationNameRootSpan,
+    Service: MyServiceName,
+    Type: custom,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      runtime-id: Guid_2,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: internal,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet,
+      _dd.p.dm: -0,
+      _dd.p.tid: 1234567890abcdef
+    },
+    Metrics: {
+      process_id: 0,
+      _dd.agent_psr: 1.0,
+      _dd.top_level: 1.0,
+      _dd.tracer_kr: 1.0,
+      _sampling_priority_v1: 1.0
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_3,
+    Name: http.server.request,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: web,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      http.request.method: GET,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: server,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_4,
+    Name: http.client.request,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: http,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      http.request.method: GET,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: client,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_5,
+    Name: redis.query,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: db,
+    ParentId: Id_2,
+    Tags: {
+      db.system: Redis,
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: client,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_6,
+    Name: kafka.receive,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: http,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      messaging.operation: Receive,
+      messaging.system: Kafka,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: client,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_7,
+    Name: kafka.receive,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: web,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      messaging.operation: Receive,
+      messaging.system: Kafka,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: server,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_8,
+    Name: kafka.receive,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: custom,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      messaging.operation: Receive,
+      messaging.system: Kafka,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: producer,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_9,
+    Name: kafka.receive,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: custom,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      messaging.operation: Receive,
+      messaging.system: Kafka,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: consumer,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_10,
+    Name: aws.s3.request,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: http,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      rpc.service: S3,
+      rpc.system: aws-api,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: client,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_11,
+    Name: aws.client.request,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: http,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      rpc.system: aws-api,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: client,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_12,
+    Name: grpc.client.request,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: http,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      rpc.system: GRPC,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: client,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_13,
+    Name: grpc.server.request,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: web,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      rpc.system: GRPC,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: server,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_14,
+    Name: aws.my-function.invoke,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: http,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      faas.invoked_name: My-Function,
+      faas.invoked_provider: aws,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: client,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_15,
+    Name: datasource.invoke,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: web,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      faas.trigger: Datasource,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: server,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_16,
+    Name: graphql.server.request,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: web,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      graphql.operation.type: query,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: server,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_17,
+    Name: amqp.server.request,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: web,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      network.protocol.name: Amqp,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: server,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_18,
+    Name: server.request,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: web,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: server,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_19,
+    Name: amqp.client.request,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: http,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      network.protocol.name: Amqp,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: client,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_20,
+    Name: client.request,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: http,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: client,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_21,
+    Name: internal,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: custom,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: internal,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_22,
+    Name: consumer,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: custom,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: consumer,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_23,
+    Name: producer,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: custom,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: producer,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_24,
+    Name: operationnameoverride,
+    Resource: ResourceNameOverride,
+    Service: ServiceNameOverride,
+    Type: SpanTypeOverride,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      http.request.method: GET,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      runtime-id: Guid_2,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: server,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    },
+    Metrics: {
+      _dd.top_level: 1.0,
+      _dd1.sr.eausr: 1.0
+    }
+  },
+  {
+    TraceId: Id_25,
+    SpanId: Id_26,
+    Name: saying hello!,

2 occurrences of :

-    Name: Saying hello!,
+    Name: MyServiceName.internal,
+    Resource: OperationNameRootSpan,
+    Service: MyServiceName,
+    Type: custom,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      runtime-id: Guid_2,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: internal,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet,
+      _dd.p.dm: -0,
+      _dd.p.tid: 1234567890abcdef
+    },
+    Metrics: {
+      process_id: 0,
+      _dd.agent_psr: 1.0,
+      _dd.top_level: 1.0,
+      _dd.tracer_kr: 1.0,
+      _sampling_priority_v1: 1.0
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_3,
+    Name: MyServiceName.server,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: web,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      http.request.method: GET,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: server,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_4,
+    Name: MyServiceName.client,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: http,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      http.request.method: GET,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: client,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_5,
+    Name: MyServiceName.client,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: db,
+    ParentId: Id_2,
+    Tags: {
+      db.system: Redis,
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: client,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_6,
+    Name: MyServiceName.client,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: http,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      messaging.operation: Receive,
+      messaging.system: Kafka,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: client,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_7,
+    Name: MyServiceName.server,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: web,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      messaging.operation: Receive,
+      messaging.system: Kafka,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: server,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_8,
+    Name: MyServiceName.producer,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: custom,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      messaging.operation: Receive,
+      messaging.system: Kafka,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: producer,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_9,
+    Name: MyServiceName.consumer,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: custom,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      messaging.operation: Receive,
+      messaging.system: Kafka,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: consumer,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_10,
+    Name: MyServiceName.client,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: http,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      rpc.service: S3,
+      rpc.system: aws-api,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: client,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_11,
+    Name: MyServiceName.client,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: http,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      rpc.system: aws-api,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: client,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_12,
+    Name: MyServiceName.client,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: http,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      rpc.system: GRPC,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: client,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_13,
+    Name: MyServiceName.server,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: web,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      rpc.system: GRPC,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: server,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_14,
+    Name: MyServiceName.client,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: http,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      faas.invoked_name: My-Function,
+      faas.invoked_provider: aws,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: client,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_15,
+    Name: MyServiceName.server,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: web,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      faas.trigger: Datasource,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: server,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_16,
+    Name: MyServiceName.server,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: web,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      graphql.operation.type: query,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: server,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_17,
+    Name: MyServiceName.server,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: web,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      network.protocol.name: Amqp,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: server,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_18,
+    Name: MyServiceName.server,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: web,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: server,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_19,
+    Name: MyServiceName.client,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: http,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      network.protocol.name: Amqp,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: client,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_20,
+    Name: MyServiceName.client,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: http,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: client,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_21,
+    Name: MyServiceName.internal,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: custom,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: internal,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_22,
+    Name: MyServiceName.consumer,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: custom,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: consumer,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_23,
+    Name: MyServiceName.producer,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: custom,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: producer,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_24,
+    Name: operationnameoverride,
+    Resource: ResourceNameOverride,
+    Service: ServiceNameOverride,
+    Type: SpanTypeOverride,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      http.request.method: GET,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      runtime-id: Guid_2,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: server,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    },
+    Metrics: {
+      _dd.top_level: 1.0,
+      _dd1.sr.eausr: 1.0
+    }
+  },
+  {
+    TraceId: Id_25,
+    SpanId: Id_26,
+    Name: saying hello!,

3 occurrences of :

-    TraceId: Id_1,
-    SpanId: Id_3,
+    TraceId: Id_25,
+    SpanId: Id_27,
[...]
-    ParentId: Id_2,
+    ParentId: Id_26,
[...]
-      otel.trace_id: Guid_1,
+      otel.trace_id: Guid_4,

3 occurrences of :

-    TraceId: Id_1,
-    SpanId: Id_4,
+    TraceId: Id_25,
+    SpanId: Id_28,
[...]
-    ParentId: Id_2,
+    ParentId: Id_26,
[...]
-      otel.trace_id: Guid_1,
+      otel.trace_id: Guid_4,

3 occurrences of :

-    TraceId: Id_1,
-    SpanId: Id_5,
+    TraceId: Id_25,
+    SpanId: Id_29,
[...]
-    ParentId: Id_2,
+    ParentId: Id_26,
[...]
-      otel.trace_id: Guid_1,
+      otel.trace_id: Guid_4,

3 occurrences of :

-    TraceId: Id_1,
-    SpanId: Id_6,
+    TraceId: Id_25,
+    SpanId: Id_30,
[...]
-    ParentId: Id_2,
+    ParentId: Id_26,
[...]
-      otel.trace_id: Guid_1,
+      otel.trace_id: Guid_4,

3 occurrences of :

-    TraceId: Id_1,
-    SpanId: Id_7,
+    TraceId: Id_25,
+    SpanId: Id_31,
[...]
-    ParentId: Id_2,
+    ParentId: Id_26,

3 occurrences of :

-    TraceId: Id_1,
-    SpanId: Id_8,
+    TraceId: Id_25,
+    SpanId: Id_32,
[...]
-    ParentId: Id_2,
+    ParentId: Id_26,

3 occurrences of :

-    TraceId: Id_1,
-    SpanId: Id_9,
+    TraceId: Id_25,
+    SpanId: Id_33,
[...]
-    ParentId: Id_2,
+    ParentId: Id_26,
[...]
-      otel.trace_id: Guid_1,
+      otel.trace_id: Guid_4,

3 occurrences of :

-    TraceId: Id_1,
-    SpanId: Id_10,
+    TraceId: Id_25,
+    SpanId: Id_34,
[...]
-    ParentId: Id_3,
+    ParentId: Id_27,
[...]
-      otel.trace_id: Guid_1,
+      otel.trace_id: Guid_4,

3 occurrences of :

-    TraceId: Id_11,
-    SpanId: Id_12,
+    TraceId: Id_35,
+    SpanId: Id_36,

3 occurrences of :

-    TraceId: Id_13,
-    SpanId: Id_14,
+    TraceId: Id_37,
+    SpanId: Id_38,

3 occurrences of :

-    TraceId: Id_15,
-    SpanId: Id_16,
+    TraceId: Id_39,
+    SpanId: Id_40,

1 occurrences of :

-    Name: Saying hello!,
+    Name: MyServiceName.internal,
+    Resource: OperationNameRootSpan,
+    Service: MyServiceName,
+    Type: custom,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      runtime-id: Guid_2,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: internal,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet,
+      _dd.p.dm: -0,
+      _dd.p.tid: 1234567890abcdef
+    },
+    Metrics: {
+      process_id: 0,
+      _dd.agent_psr: 1.0,
+      _dd.top_level: 1.0,
+      _dd.tracer_kr: 1.0,
+      _sampling_priority_v1: 1.0
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_3,
+    Name: MyServiceName.server,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: web,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      http.request.method: GET,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: server,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_4,
+    Name: MyServiceName.client,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: http,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      http.request.method: GET,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: client,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_5,
+    Name: MyServiceName.client,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: db,
+    ParentId: Id_2,
+    Tags: {
+      db.system: Redis,
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: client,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_6,
+    Name: MyServiceName.client,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: http,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      messaging.operation: Receive,
+      messaging.system: Kafka,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: client,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_7,
+    Name: MyServiceName.server,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: web,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      messaging.operation: Receive,
+      messaging.system: Kafka,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: server,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_8,
+    Name: MyServiceName.producer,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: custom,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      messaging.operation: Receive,
+      messaging.system: Kafka,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: producer,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_9,
+    Name: MyServiceName.consumer,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: custom,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      messaging.operation: Receive,
+      messaging.system: Kafka,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: consumer,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_10,
+    Name: MyServiceName.client,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: http,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      rpc.service: S3,
+      rpc.system: aws-api,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: client,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_11,
+    Name: MyServiceName.client,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: http,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      rpc.system: aws-api,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: client,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_12,
+    Name: MyServiceName.client,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: http,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      rpc.system: GRPC,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: client,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_13,
+    Name: MyServiceName.server,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: web,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      rpc.system: GRPC,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: server,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_14,
+    Name: MyServiceName.client,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: http,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      faas.invoked_name: My-Function,
+      faas.invoked_provider: aws,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: client,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_15,
+    Name: MyServiceName.server,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: web,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      faas.trigger: Datasource,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: server,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_16,
+    Name: MyServiceName.server,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: web,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      graphql.operation.type: query,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: server,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_17,
+    Name: MyServiceName.server,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: web,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      network.protocol.name: Amqp,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: server,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_18,
+    Name: MyServiceName.server,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: web,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: server,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_19,
+    Name: MyServiceName.client,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: http,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      network.protocol.name: Amqp,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: client,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_20,
+    Name: MyServiceName.client,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: http,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: client,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_21,
+    Name: MyServiceName.internal,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: custom,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: internal,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_22,
+    Name: MyServiceName.consumer,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: custom,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: consumer,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_23,
+    Name: MyServiceName.producer,
+    Resource: ResourceName,
+    Service: MyServiceName,
+    Type: custom,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: producer,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    }
+  },
+  {
+    TraceId: Id_1,
+    SpanId: Id_24,
+    Name: operationnameoverride,
+    Resource: ResourceNameOverride,
+    Service: ServiceNameOverride,
+    Type: SpanTypeOverride,
+    ParentId: Id_2,
+    Tags: {
+      env: integration_tests,
+      http.request.method: GET,
+      language: dotnet,
+      otel.library.name: MyServiceName,
+      otel.status_code: STATUS_CODE_UNSET,
+      otel.trace_id: Guid_1,
+      runtime-id: Guid_2,
+      service.instance.id: Guid_3,
+      service.name: MyServiceName,
+      service.version: 1.0.x,
+      span.kind: server,
+      telemetry.sdk.language: dotnet,
+      telemetry.sdk.name: opentelemetry,
+      telemetry.sdk.version: sdk-version,
+      _dd.base_service: CustomServiceName,
+      _dd.git.commit.sha: aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb,
+      _dd.git.repository_url: https://github.com/DataDog/dd-trace-dotnet
+    },
+    Metrics: {
+      _dd.top_level: 1.0,
+      _dd1.sr.eausr: 1.0
+    }
+  },
+  {
+    TraceId: Id_25,
+    SpanId: Id_26,
+    Name: saying hello!,

1 occurrences of :

-    Name: GetAsync,
+    Name: internal,

1 occurrences of :

-    Name: HttpListener.ReceivedRequest,
+    Name: internal,

26 occurrences of :

-    Name: WebClient,
+    Name: internal,

@andrewlock
Copy link
Member

andrewlock commented Oct 6, 2023

Throughput/Crank Report:zap:

Throughput results for AspNetCoreSimpleController comparing the following branches/commits:

Cases where throughput results for the PR are worse than latest master (5% drop or greater), results are shown in red.

Note that these results are based on a single point-in-time result for each branch. For full results, see one of the many, many dashboards!

gantt
    title Throughput Linux x64 (Total requests) 
    dateFormat  X
    axisFormat %s
    section Baseline
    This PR (4700) (11.149M)   : 0, 11149434
    master (11.313M)   : 0, 11313032
    benchmarks/2.9.0 (11.206M)   : 0, 11205757

    section Automatic
    This PR (4700) (7.522M)   : crit ,0, 7522336
    master (7.927M)   : 0, 7927283
    benchmarks/2.9.0 (8.195M)   : 0, 8195151

    section Trace stats
    This PR (4700) (7.874M)   : 0, 7874396
    master (8.134M)   : 0, 8133654

    section Manual
    This PR (4700) (9.846M)   : 0, 9845592
    master (9.716M)   : 0, 9715816

    section Manual + Automatic
    This PR (4700) (7.433M)   : 0, 7433168
    master (7.390M)   : 0, 7389541

    section Version Conflict
    This PR (4700) (6.902M)   : 0, 6902355
    master (6.724M)   : 0, 6723974

Loading
gantt
    title Throughput Linux arm64 (Total requests) 
    dateFormat  X
    axisFormat %s
    section Baseline
    This PR (4700) (9.469M)   : 0, 9469300
    master (9.505M)   : 0, 9504703
    benchmarks/2.9.0 (9.617M)   : 0, 9617265

    section Automatic
    This PR (4700) (6.510M)   : 0, 6510452
    master (6.736M)   : 0, 6735587

    section Trace stats
    This PR (4700) (6.825M)   : 0, 6824529
    master (6.915M)   : 0, 6915011

    section Manual
    This PR (4700) (8.232M)   : 0, 8232075
    master (8.457M)   : 0, 8456919

    section Manual + Automatic
    This PR (4700) (6.328M)   : 0, 6327811
    master (6.373M)   : 0, 6372696

    section Version Conflict
    This PR (4700) (5.827M)   : 0, 5827106
    master (5.816M)   : 0, 5815884

Loading
gantt
    title Throughput Windows x64 (Total requests) 
    dateFormat  X
    axisFormat %s
    section Baseline
    This PR (4700) (9.911M)   : 0, 9910784
    master (10.235M)   : 0, 10234929
    benchmarks/2.9.0 (10.172M)   : 0, 10172062

    section Automatic
    This PR (4700) (6.483M)   : crit ,0, 6483185
    master (7.217M)   : 0, 7217154
    benchmarks/2.9.0 (7.462M)   : 0, 7462407

    section Trace stats
    This PR (4700) (7.418M)   : 0, 7418151
    master (7.589M)   : 0, 7588710

    section Manual
    This PR (4700) (9.004M)   : crit ,0, 9004354
    master (9.631M)   : 0, 9630935

    section Manual + Automatic
    This PR (4700) (6.963M)   : crit ,0, 6963344
    master (7.406M)   : 0, 7406461

    section Version Conflict
    This PR (4700) (6.485M)   : 0, 6485113
    master (6.786M)   : 0, 6786446

Loading
gantt
    title Throughput Linux x64 (ASM) (Total requests) 
    dateFormat  X
    axisFormat %s
    section Baseline
    master (7.394M)   : 0, 7394086
    benchmarks/2.9.0 (7.868M)   : 0, 7868377

    section No attack
    master (2.103M)   : 0, 2102824
    benchmarks/2.9.0 (3.213M)   : 0, 3212808

    section Attack
    master (1.661M)   : 0, 1660712
    benchmarks/2.9.0 (2.484M)   : 0, 2484244

    section Blocking
    master (3.418M)   : 0, 3417691

    section IAST default
    master (6.479M)   : 0, 6478556

    section IAST full
    master (5.946M)   : 0, 5945586

    section Base vuln
    master (0.975M)   : 0, 974518

    section IAST vuln
    master (0.859M)   : 0, 859378

Loading

@datadog-ddstaging
Copy link

datadog-ddstaging bot commented Nov 1, 2023

Datadog Report

Branch report: steven/otel-operation-name
Commit report: 2aa1b75

dd-trace-dotnet: 0 Failed, 0 New Flaky, 298861 Passed, 762 Skipped, 35m 47.44s Wall Time

@bouwkast bouwkast force-pushed the steven/otel-operation-name branch 3 times, most recently from b6903e4 to cc48dbd Compare November 6, 2023 20:37
Copy link
Contributor Author

@bouwkast bouwkast left a comment

Choose a reason for hiding this comment

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

There several snapshots that got updated - some I'd say are more important than others to review. Specifically:

  • AzureServiceBus snapshots
  • OpenTelemetrySdk snapshots
  • NetActivitySdk snapshots

As all of these have examples of the new operation name mapping - AzureServiceBus ones especially that is just an OpenTelemetry instrumentation.


namespace Datadog.Trace.Tagging
{
internal partial class OpenTelemetryTags : CommonTags
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Should I copy over the AnalyticsSampleRate and SetAnalyticsSampleRate from InstrumentationTags?

[Metric(Trace.Tags.Analytics)]
public double? AnalyticsSampleRate { get; set; }
public void SetAnalyticsSampleRate(IntegrationId integration, ImmutableTracerSettings settings, bool enabledWithGlobalSetting)
{
if (settings != null)
{
#pragma warning disable 618 // App analytics is deprecated, but still used
AnalyticsSampleRate = settings.GetIntegrationAnalyticsSampleRate(integration, enabledWithGlobalSetting);
#pragma warning restore 618
}

I didn't inherit from InstrumentationTags as the SpanKind needs to be settable

Copy link
Member

Choose a reason for hiding this comment

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

That's an interesting question. I wonder if we should be calling SetAnalyticsSampleRate on the Otel tags when we create them 🤔 For example, I see that the AzureServiceBusTags have it, which suggests we should to me.

In that case I suggest moving the SetAnalyticsSampleRate tags from AzureServiceBusTags to here

Copy link
Collaborator

Choose a reason for hiding this comment

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

Hmm I'm not sure what we're supposed to do with SetAnalyticsSampleRate and honestly it's been a while since I really understood what this is doing. 🆘 @lucaspimentel

Based on my current understanding, we would set this based on the SpanKind:

  • Client/Producer: tags.SetAnalyticsSampleRate(IntegrationId, tracer.Settings, enabledWithGlobalSetting: false)
  • Server/Consumer: tags.SetAnalyticsSampleRate(IntegrationId, tracer.Settings, enabledWithGlobalSetting: true)
  • Internal: ???

Copy link
Member

@lucaspimentel lucaspimentel Nov 10, 2023

Choose a reason for hiding this comment

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

Internal spans would also be enabledWithGlobalSetting: false. Only server spans should have their Analytics enabled with the global setting, and I think we can consider consumer spans similar to server spans in this context (they're both the entry point into a service).

server/consumer: true
else: false

.Matches(Type, "http"))
.Tags(s => s
.Matches("az.namespace", "Microsoft.ServiceBus")
.IsPresent("az.schema_url")
.IsOptional("messaging.destination.name")
.IfPresentMatchesOneOf("messaging.operation", "publish", "receive", "settle")
.IfPresentMatchesOneOf("messaging.operation", "publish", "settle")
Copy link
Contributor Author

Choose a reason for hiding this comment

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

I didn't see receive in any of the snapshots for messaging.operation before/after this so I removed it - unsure if that is the right thing to do, but thought it may be confusing to see client.request in there and no name with receive in it.

Copy link
Collaborator

Choose a reason for hiding this comment

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

Good find, I think it was accidentally included there on my first implementation. Thanks for cleaning it up!

.Matches(Type, "http"))
.Tags(s => s
.Matches("az.namespace", "Microsoft.ServiceBus")
.IsPresent("az.schema_url")
.IsOptional("messaging.destination.name")
.IfPresentMatchesOneOf("messaging.operation", "publish", "receive", "settle")
.IfPresentMatchesOneOf("messaging.operation", "publish", "settle")
Copy link
Contributor Author

Choose a reason for hiding this comment

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

I didn't see receive in any of the snapshots for messaging.operation before/after this so I removed it - unsure if that is the right thing to do, but thought it may be confusing to see client.request in there and no name with receive in it.

Copy link
Collaborator

Choose a reason for hiding this comment

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

Yep looks good, thanks for the cleanup!

@@ -13,7 +13,7 @@ namespace Datadog.Trace.Tagging
{
// Re-implement InstrumentationTags so the built-in Activity can copy over SpanKind
// without being limited by our tags infrastructure
internal partial class AzureServiceBusTags : CommonTags
internal partial class AzureServiceBusTags : OpenTelemetryTags
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Just wanted to flag this to make sure I'm not doing something wrong here by inheriting from OpenTelemetryTags and removing the [Tag] from SpanKind and removing MessagingOperation entirely from this class.

It seems to work fine, but just want to double check.

Copy link
Member

Choose a reason for hiding this comment

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

Yeah, I think this this is fine 👍 I just checked the generated code, and it shows that that AzureServiceBusTags are not printing [SpanKind] any more, but it then calls the base. methods, which do.

[Collection(nameof(OpenTelemetryOperationNameMapperTests))]
public class OpenTelemetryOperationNameMapperTests
{
// Note: These test cases were copy/pasted from parametric tests (with some find/replace to make it work here)
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Copy link
Member

Choose a reason for hiding this comment

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

:chef-kiss:

One comment I have is AFAICT that these tests don't test the order of the detection when you have "conflicting" tags.

An "alternative" approach you may want to consider is having a span that has "all" the tags, and then check that "removing" a tag moves you onto the next span type.

e.g.

  • db.System=Redis
  • http.request.method=GET

With both these tags, you get http.<server|client>.request. With the http tag removed you get redis.query.

This would apply to the parametric tests to, and you could potentially "build" the test data from the data you have here for each iteration. Just a thought!

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Okay I tried doing this in f26a152

I didn't realize that with inherited Tags classes you can't access the RemoveTag call when setting a value to null so it seems a bit hacky as I have to recreate the tags each time I remove one.

@bouwkast bouwkast changed the title Map OpenTelemetry spans to a better OperationName (WIP) Create a better OperationName for Activity/OpenTelemetry Nov 9, 2023
@bouwkast bouwkast marked this pull request as ready for review November 9, 2023 21:31
@bouwkast bouwkast requested a review from a team as a code owner November 9, 2023 21:31
Copy link
Member

@andrewlock andrewlock left a comment

Choose a reason for hiding this comment

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

Nice, LGTM, though I'll defer to Zach for the final word!


namespace Datadog.Trace.Tagging
{
internal partial class OpenTelemetryTags : CommonTags
Copy link
Member

Choose a reason for hiding this comment

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

That's an interesting question. I wonder if we should be calling SetAnalyticsSampleRate on the Otel tags when we create them 🤔 For example, I see that the AzureServiceBusTags have it, which suggests we should to me.

In that case I suggest moving the SetAnalyticsSampleRate tags from AzureServiceBusTags to here

@@ -13,7 +13,7 @@ namespace Datadog.Trace.Tagging
{
// Re-implement InstrumentationTags so the built-in Activity can copy over SpanKind
// without being limited by our tags infrastructure
internal partial class AzureServiceBusTags : CommonTags
internal partial class AzureServiceBusTags : OpenTelemetryTags
Copy link
Member

Choose a reason for hiding this comment

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

Yeah, I think this this is fine 👍 I just checked the generated code, and it shows that that AzureServiceBusTags are not printing [SpanKind] any more, but it then calls the base. methods, which do.

@@ -21,7 +22,7 @@ public bool ShouldListenTo(string sourceName, string? version)

public void ActivityStarted<T>(string sourceName, T activity)
where T : IActivity
=> ActivityHandlerCommon.ActivityStarted(sourceName, activity, tags: null, out _);
=> ActivityHandlerCommon.ActivityStarted(sourceName, activity, tags: new OpenTelemetryTags(), out _);
Copy link
Member

Choose a reason for hiding this comment

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

I'm not super sure whether or not that'll cause issues,

In terms of using inheritance, that should be absolutely fine, we do it with various tags 🙂

The only downside to the approach I can see is the increased memory footprint of the big fat OpenTelemetryTags instances 😄

}
else if (tags.IsMessaging())
{
operationName = $"{tags.MessagingSystem}.{tags.MessagingOperation}";
Copy link
Member

Choose a reason for hiding this comment

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

More a question for the RFC rather than this PR, but is it still preferable to use tags.MessagingSystem (for example) if we're missing tags.MessagingOperation?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I think the semantics that we are going off of from OpenTelemetry (still says their status is Experimental) have it that messaging.operation and messaging.system are required tags: https://opentelemetry.io/docs/specs/semconv/messaging/messaging-spans/#messaging-attributes

But after I got the AzureServiceBus stuff ported over yesterday I think I saw messaging.system tags with no messaging.operation and they led to client.request operation names. So maybe it would be preferable, but I'm not 100% sure what to do.

Copy link
Member

Choose a reason for hiding this comment

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

A question for @zacharycmontoya perhaps then

Copy link
Collaborator

Choose a reason for hiding this comment

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

I think it makes sense for the other operation names to be client.request. messaging.operation should be one of a fixed, well-known set, so if a span doesn't have a corresponding operation then it's not really interacting with a message. I left comments below about the existing AzureServiceBus "Message" span where we may intelligently decorate it. Otherwise, client.request (low-cardinality) with different resource names seems fine to me.

Comment on lines +71 to +74
else if (tags.IsGraphQLServer())
{
operationName = "graphql.server.request";
}
Copy link
Member

Choose a reason for hiding this comment

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

We can't recognize IsGraphQLClient()?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Good question, the semantics for this just have it as GraphQL Server: https://opentelemetry.io/docs/specs/semconv/database/graphql/

When I made the parametric tests I looked at the PR that added the spec (OpenTelemetry) for this and there was some discussion around whether or not it should also be for client open-telemetry/opentelemetry-specification#2456 (comment)

tracer/src/Datadog.Trace/Activity/OperationNameMapper.cs Outdated Show resolved Hide resolved
/// <summary>
/// Helper class to map <see cref="SpanKinds"/> and various tags on an <c>Activity</c> or OpenTelemetry Span to a <see cref="Span.OperationName"/>.
/// </summary>
internal static class OperationNameMapper
Copy link
Member

Choose a reason for hiding this comment

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

Really nice and declarative 👍

@@ -236,7 +236,7 @@ public static Result IsAzureServiceBusInboundV0(this MockSpan span) => Result.Fr

public static Result IsAzureServiceBusOutboundV0(this MockSpan span) => Result.FromSpan(span)
.Properties(s => s
.Matches(Name, "Message")
.Matches(Name, "producer")
Copy link
Member

Choose a reason for hiding this comment

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

Would be interested in what Zach says about this one, because IIRC the way the Message span is used is... interesting...

Copy link
Collaborator

Choose a reason for hiding this comment

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

For these particular ones, the ResourceName is still "Message" so I think this is fine. My one suggestion here is to add a Matches clause to assert that the name is always "Message", but unless you have other suggestions it's not worth the CI cycles and re-approval loop 😅

Copy link
Collaborator

Choose a reason for hiding this comment

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

Interestingly, the latest messaging conventions (because they're always a-changing) includes a new operation name for create which would correspond to these spans: https://opentelemetry.io/docs/specs/semconv/messaging/messaging-spans/#operation-names

If the Azure SDK updates to setting this as the messaging.operation attribute, then our operation name logic will (correctly) update the operation name to servicebus.create

I do wonder if we should get ahead of that and just add the messaging.operation attribute ourselves 🤔 Thoughts?

Copy link
Collaborator

Choose a reason for hiding this comment

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

I think we could have this discussion and potentially follow-up work in a separate PR

[Collection(nameof(OpenTelemetryOperationNameMapperTests))]
public class OpenTelemetryOperationNameMapperTests
{
// Note: These test cases were copy/pasted from parametric tests (with some find/replace to make it work here)
Copy link
Member

Choose a reason for hiding this comment

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

:chef-kiss:

One comment I have is AFAICT that these tests don't test the order of the detection when you have "conflicting" tags.

An "alternative" approach you may want to consider is having a span that has "all" the tags, and then check that "removing" a tag moves you onto the next span type.

e.g.

  • db.System=Redis
  • http.request.method=GET

With both these tags, you get http.<server|client>.request. With the http tag removed you get redis.query.

This would apply to the parametric tests to, and you could potentially "build" the test data from the data you have here for each iteration. Just a thought!

Comment on lines +517 to +518
Name: http.server.request,
Resource: operation name should be-> http.server.request,
Copy link
Member

Choose a reason for hiding this comment

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

Nice 👍

Copy link
Collaborator

Choose a reason for hiding this comment

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

Beautiful 😍

tags.Add("service.name", "ServiceNameOverride");
tags.Add("span.type", "SpanTypeOverride");
tags.Add("analytics.event", "true"); // metric-> _dd1.sr.eausr: 1.0
using var activity = _source.StartActivity(name: "This name should not be in the snapshot", kind: ActivityKind.Server, tags: tags);
Copy link
Collaborator

Choose a reason for hiding this comment

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

Nice!

Copy link
Collaborator

@zacharycmontoya zacharycmontoya left a comment

Choose a reason for hiding this comment

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

LGTM, nice work!

For OpenTelemetry and Activity 5+ we'll always have some span.kind
value as Activity.Kind is guranteed.

For older Activity objects that lack the .Kind property there may
not be a value, but we'll default the OperationName to "internal"
instead of "otel_unknown" in those cases.
Copy link
Collaborator

@zacharycmontoya zacharycmontoya left a comment

Choose a reason for hiding this comment

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

Thumbs up again 👍🏼

@bouwkast bouwkast merged commit dbee006 into master Nov 14, 2023
54 checks passed
@bouwkast bouwkast deleted the steven/otel-operation-name branch November 14, 2023 14:55
@github-actions github-actions bot added this to the vNext milestone Nov 14, 2023
@andrewlock andrewlock added area:tracer The core tracer library (Datadog.Trace, does not include OpenTracing, native code, or integrations) area:opentelemetry OpenTelemetry support labels Nov 21, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area:opentelemetry OpenTelemetry support area:tracer The core tracer library (Datadog.Trace, does not include OpenTracing, native code, or integrations)
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants