Skip to content

[Tracer] Add OTLP adoption markers to trace payloads - #9310

Open
mhlidd wants to merge 7 commits into
masterfrom
matthew.li/otlp-adoption-markers
Open

mhlidd wants to merge 7 commits into
masterfrom
matthew.li/otlp-adoption-markers

Conversation

@mhlidd

@mhlidd mhlidd commented Sep 24, 2026 •

Copy link
Copy Markdown
Contributor

Summary of changes

Adds two wire markers that let the backend attribute ingested spans to the SDK's export path and semantic conventions:

  • _dd.sdk.otlp_export — written once per payload (not per span): on the first span of the first chunk by SpanMessagePackFormatter with value "false", and as an OTLP resource attribute with value "true" by OtlpMapper.
  • datadog.sdk.semantics — OTLP resource attribute, "otel" when DD_TRACE_OTEL_SEMANTICS_ENABLED is enabled, "datadog" otherwise.

Reason for change

Today "how many customers run Datadog SDKs emitting OTLP" is answered by dd.trace.intake.ingested_spans tagged with sdk_name/span_source, which are inferred at ingest time rather than declared by the tracer. The datadogreceiver hardcodes telemetry.sdk.name:Datadog on native payloads it converts, so a native payload that merely passed through a Collector is indistinguishable from one a Datadog SDK exported over OTLP, and span_source records the endpoint the payload reached, not the tracer's export mode.

Declaring the export mode and the semantics mode on the wire lets the backend resolve them into explicit tags (datadog.sdk.otlp_export, datadog.sdk.semantics) and measure OTLP and OTel-semantics adoption directly. This mirrors the dd-trace-java implementation in DataDog/dd-trace-java#12516.

Implementation details

  • Tags.SdkOtlpExport (_dd.sdk.otlp_export) and Tags.SdkSemantics (datadog.sdk.semantics).
  • SpanMessagePackFormatter: the existing process-tags write and the new marker now share a single payload-scoped block, gated on model.IsFirstSpanInChunk && model.TraceChunk.IsFirstChunkInPayload, with the process-tags null checks nested inside it. The marker therefore costs one meta entry per payload rather than one per span. It is written unconditionally within that block — it deliberately does not inherit the process-tags gating, because an absent marker is indistinguishable from an older tracer at intake. Reaching this formatter means the payload uses the native Datadog encoding, so the value is a constant "false" — the encodings are mutually exclusive in this tracer (TracesEncoding), unlike dd-trace-java, which reads a config flag because a MultiWriter can export both ways.
  • OtlpMapper.EmitResourceAttributesFromTraceChunk: emits _dd.sdk.otlp_export=true (reaching this mapper means the payload leaves over OTLP) and datadog.sdk.semantics, sourced from a new TraceChunkModel.OtelSemanticsEnabled populated alongside ClientComputedStats.
  • Both keys are dropped in the span-attribute processor, so a user tag of the same name is not echoed onto spans where it could contradict the resource-scoped values (equivalent to IGNORED_GLOBAL_TAGS in dd-trace-java).
  • This tracer has no v0.5 or v1 msgpack trace format — /v0.4/traces is the only native endpoint and TracesEncoding has exactly three members — so only the v0.4 formatter and the two OTLP serializers are touched.

datadog.sdk.semantics is emitted on the OTLP path only, matching dd-trace-java. Native-export users are therefore not counted for semantics adoption; extending the native path would need a separate marker and is out of scope here.

Test coverage

  • SpanMessagePackFormatterTests.SdkOtlpExport_IsWrittenOncePerPayload: flushes two traces into a single payload and asserts exactly one marker across the whole payload, on the first span of the first chunk. Covers both halves of the gate (IsFirstSpanInChunk and IsFirstChunkInPayload).
  • OtlpMapperTests: the export marker is "true" on the resource, datadog.sdk.semantics switches between "otel" and "datadog" with DD_TRACE_OTEL_SEMANTICS_ENABLED, and neither key is emitted as a span attribute when a span carries a tag of the same name.
  • Tests that assert exact tag counts or byte-compare serialized chunks were updated for the extra payload-scoped entry: TagsListTests now excludes payload-scoped tags from its count assertions, and AgentWriterTests / CI.Agent.ApmAgentWriterTests build their expected chunks with isFirstChunkInPayload: true, matching what SpanBuffer actually does (they previously defaulted to false, so the expectation was already wrong — the marker only made it visible).
  • CI Visibility framework tests (XUnitTests, NUnitTests, MsTestV2Tests) strip the marker alongside process tags before their remaining-tag assertions.

Snapshots

  • VerifyHelper scrubs _dd.sdk.otlp_export from both the APM and CI Visibility span scrubbers, and SpanTagAssertion marks it optional. The marker lands on whichever span is first in the payload, which is not stable across architectures, so it must never be pinned in a snapshot.
  • SmokeTestScenario.DefaultSnapshotIgnoredAttrs ignores meta._dd.sdk.otlp_export, alongside meta._dd.tags.process which is payload-scoped for the same reason.
  • 102 of the changed files are regenerated Verify snapshots and carry only the two new OTLP resource attributes. They are mechanical; the hand-written changes are the 15 source files listed in the diff outside tracer/test/snapshots/.

Other details

  • Coordinated change: this PR emits the markers; the Agent hoists _dd.sdk.otlp_export into the outgoing payload, logs-backend propagates it into chunk tags, and dd-go resolves it into the datadog.sdk.otlp_export metric tag.
  • The metric tag datadog.sdk.otlp_export and the wire marker _dd.sdk.otlp_export are named differently on purpose — same concept, two layers.
  • AgentWriterTests.ComputeSize still constructs its chunk with the default isFirstChunkInPayload: false, so it under-reports the first chunk by 26 bytes. It only sizes maxBufferSize for the buffer-full tests, whose "room for exactly one trace" intent is preserved, so it was left alone.

🤖 Generated with Claude Code

Adds two wire markers so the intake can attribute ingested spans to the
SDK's export path and semantics instead of inferring them from
telemetry.sdk.name.

- _dd.sdk.otlp_export: written once per payload on the first span of the
  first chunk by the MessagePack formatter (always "false", since
  reaching it means native Datadog encoding), and as an OTLP resource
  attribute set to "true" on the OTLP export path.
- datadog.sdk.semantics: OTLP resource attribute, "otel" when
  DD_TRACE_OTEL_SEMANTICS_ENABLED is set, "datadog" otherwise.

Both keys are suppressed as span attributes so a user tag of the same
name cannot contradict the resource-scoped values.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@mhlidd mhlidd added the AI Generated Largely based on code generated by an AI or LLM. This label is the same across all dd-trace-* repos label Sep 24, 2026
mhlidd and others added 2 commits September 24, 2026 13:50
Fold the _dd.sdk.otlp_export write and the process tags write into a
single "first span of the first chunk" condition, with the process tags
null checks nested inside it. The export marker stays unconditional:
an absent marker is indistinguishable from an older tracer at intake,
so it must not inherit the process tags gating.

Also move the _dd.sdk.otlp_export entry to the end of the
DefaultTagAssertions chain to keep the diff off unrelated lines.

No change to the serialized payload: msgpack maps are unordered and both
readers key by name.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
SdkOtlpExport_IsWrittenOncePerPayload only exercised a single trace
chunk, so it verified IsFirstSpanInChunk but never
IsFirstChunkInPayload. Dropping the latter half of the gate would have
written one marker per chunk and still passed.

Flush two traces into one payload and assert exactly one
_dd.sdk.otlp_export marker across the whole payload, on the first span
of the first chunk.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@dd-trace-dotnet-ci-bot

dd-trace-dotnet-ci-bot Bot commented Sep 24, 2026 •

Copy link
Copy Markdown

Execution-Time Benchmarks Report ⏱️

Execution-time results for samples comparing This PR (9310) and master.

✅ No regressions detected

📄 View the full report (charts + all metrics) →

@pr-commenter

pr-commenter Bot commented Sep 24, 2026 •

Copy link
Copy Markdown

Benchmarks

Benchmark execution time: 2026-09-25 19:43:24

Comparing candidate commit 36c3b83 in PR branch matthew.li/otlp-adoption-markers with baseline commit 4919c62 in branch master.

📊 Benchmarking dashboard

Found 0 performance improvements and 11 performance regressions! Performance is the same for 61 metrics, 0 unstable metrics, 73 known flaky benchmarks, 53 flaky benchmarks without significant changes.

Explanation

This is an A/B test comparing a candidate commit's performance against that of a baseline commit. Performance changes are noted in the tables below as:

  • 🟩 = significantly better candidate vs. baseline
  • 🟥 = significantly worse candidate vs. baseline

We compute a confidence interval (CI) over the relative difference of means between metrics from the candidate and baseline commits, considering the baseline as the reference.

If the CI is entirely outside the configured SIGNIFICANT_IMPACT_THRESHOLD (or the deprecated UNCONFIDENCE_THRESHOLD), the change is considered significant.

Feel free to reach out to #apm-benchmarking-platform on Slack if you have any questions.

More details about the CI and significant changes

You can imagine this CI as a range of values that is likely to contain the true difference of means between the candidate and baseline commits.

CIs of the difference of means are often centered around 0%, because often changes are not that big:

---------------------------------(------|---^--------)-------------------------------->
                              -0.6%    0%  0.3%     +1.2%
                                 |          |        |
         lower bound of the CI --'          |        |
sample mean (center of the CI) -------------'        |
         upper bound of the CI ----------------------'

As described above, a change is considered significant if the CI is entirely outside the configured SIGNIFICANT_IMPACT_THRESHOLD (or the deprecated UNCONFIDENCE_THRESHOLD).

For instance, for an execution time metric, this confidence interval indicates a significantly worse performance:

----------------------------------------|---------|---(---------^---------)---------->
                                       0%        1%  1.3%      2.2%      3.1%
                                                  |   |         |         |
       significant impact threshold --------------'   |         |         |
                      lower bound of CI --------------'         |         |
       sample mean (center of the CI) --------------------------'         |
                      upper bound of CI ----------------------------------'

scenario:Benchmarks.Trace.DbCommandBenchmark.ExecuteNonQuery net472

  • 🟥 allocated_mem [+87 bytes; +88 bytes] or [+9.290%; +9.300%]
  • 🟥 throughput [-28951.923op/s; -26070.492op/s] or [-8.154%; -7.343%]

scenario:Benchmarks.Trace.DbCommandBenchmark.ExecuteNonQuery net6.0

  • 🟥 allocated_mem [+87 bytes; +88 bytes] or [+8.939%; +8.950%]

scenario:Benchmarks.Trace.DbCommandBenchmark.ExecuteNonQuery netcoreapp3.1

  • 🟥 allocated_mem [+87 bytes; +88 bytes] or [+9.009%; +9.021%]
  • 🟥 throughput [-35585.467op/s; -27578.090op/s] or [-8.796%; -6.817%]

scenario:Benchmarks.Trace.HttpClientBenchmark.SendAsync net472

  • 🟥 allocated_mem [+296 bytes; +297 bytes] or [+10.196%; +10.207%]
  • 🟥 throughput [-10010.173op/s; -9737.561op/s] or [-11.427%; -11.116%]

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

  • 🟥 allocated_mem [+191 bytes; +192 bytes] or [+9.052%; +9.064%]

scenario:Benchmarks.Trace.HttpClientBenchmark.SendAsync netcoreapp3.1

  • 🟥 allocated_mem [+191 bytes; +192 bytes] or [+7.267%; +7.279%]
  • 🟥 throughput [-11728.851op/s; -10552.616op/s] or [-9.307%; -8.374%]

scenario:Benchmarks.Trace.NLogBenchmark.EnrichedLog net472

  • 🟥 throughput [-8755.895op/s; -7883.996op/s] or [-6.707%; -6.039%]

Known flaky benchmarks

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

scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_RecordException_Sampled net472

  • 🟩 throughput [+6486.227op/s; +7051.975op/s] or [+5.595%; +6.083%]

scenario:Benchmarks.Trace.ActivityBenchmark.StartStopWithChild net472

  • 🟥 throughput [-9449.953op/s; -8980.200op/s] or [-11.205%; -10.648%]

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

  • 🟥 throughput [-9522.520op/s; -7042.631op/s] or [-8.004%; -5.920%]

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

  • 🟥 throughput [-12545.883op/s; -11447.819op/s] or [-12.756%; -11.640%]

scenario:Benchmarks.Trace.AgentWriterBenchmark.WriteAndFlushEnrichedTraces net472

  • 🟥 allocated_mem [+1.605KB; +1.605KB] or [+48.760%; +48.776%]
  • 🟥 execution_time [+305.426ms; +308.407ms] or [+151.563%; +153.043%]
  • 🟥 throughput [-54.440op/s; -50.064op/s] or [-9.795%; -9.007%]

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

  • 🟥 allocated_mem [+1.012KB; +1.012KB] or [+37.524%; +37.537%]
  • 🟥 execution_time [+371.620ms; +376.818ms] or [+293.603%; +297.709%]
  • 🟩 throughput [+70.633op/s; +73.646op/s] or [+9.313%; +9.710%]

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

  • 🟥 allocated_mem [+1.088KB; +1.088KB] or [+40.343%; +40.355%]
  • 🟥 execution_time [+394.605ms; +399.599ms] or [+349.210%; +353.630%]

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

  • 🟥 allocated_mem [+4.749KB; +4.750KB] or [+99.987%; +100.003%]
  • 🟥 throughput [-60522.520op/s; -60155.159op/s] or [-47.090%; -46.804%]

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

  • 🟥 allocated_mem [+3.872KB; +3.872KB] or [+81.884%; +81.895%]
  • 🟥 throughput [-62036.595op/s; -59024.750op/s] or [-45.283%; -43.085%]

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

  • 🟥 allocated_mem [+4.600KB; +4.600KB] or [+99.468%; +99.481%]
  • 🟥 throughput [-49708.718op/s; -47465.138op/s] or [-44.942%; -42.914%]

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

  • 🟥 allocated_mem [+1.372KB; +1.372KB] or [+111.007%; +111.023%]
  • 🟥 throughput [-289335.456op/s; -285164.241op/s] or [-29.543%; -29.117%]

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

  • 🟥 allocated_mem [+535 bytes; +536 bytes] or [+43.787%; +43.796%]
  • 🟩 execution_time [-26.572ms; -21.704ms] or [-11.850%; -9.679%]
  • 🟥 throughput [-101561.288op/s; -78309.435op/s] or [-10.850%; -8.366%]

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

  • 🟥 allocated_mem [+1.336KB; +1.336KB] or [+110.585%; +110.599%]
  • 🟥 throughput [-174517.863op/s; -158674.249op/s] or [-25.075%; -22.798%]

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

  • 🟥 allocated_mem [+3.378KB; +3.378KB] or [+89.003%; +89.017%]
  • 🟥 throughput [-72962.048op/s; -72175.578op/s] or [-49.103%; -48.573%]

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

  • 🟥 allocated_mem [+3.336KB; +3.336KB] or [+88.150%; +88.161%]
  • 🟥 throughput [-75029.755op/s; -72141.615op/s] or [-47.740%; -45.903%]

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

  • 🟥 allocated_mem [+3.264KB; +3.264KB] or [+88.493%; +88.506%]
  • 🟥 throughput [-56055.036op/s; -53416.923op/s] or [-44.655%; -42.554%]

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

  • 🟩 throughput [+182987.425op/s; +227123.868op/s] or [+6.102%; +7.573%]

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

  • 🟩 execution_time [-18.704ms; -14.372ms] or [-8.622%; -6.625%]

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

  • 🟩 allocated_mem [-13.759KB; -13.757KB] or [-42.326%; -42.318%]
  • 🟥 execution_time [+300.187ms; +300.853ms] or [+149.993%; +150.326%]
  • 🟩 throughput [+1062.248op/s; +1078.662op/s] or [+11.732%; +11.914%]

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

  • 🟩 allocated_mem [-13.722KB; -13.718KB] or [-42.341%; -42.329%]
  • 🟥 execution_time [+299.703ms; +302.842ms] or [+151.141%; +152.724%]
  • 🟩 throughput [+2253.890op/s; +2472.132op/s] or [+17.239%; +18.908%]

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

  • 🟩 allocated_mem [-13.722KB; -13.718KB] or [-42.341%; -42.329%]
  • 🟥 execution_time [+300.348ms; +302.958ms] or [+151.292%; +152.607%]
  • 🟩 throughput [+1804.423op/s; +1932.470op/s] or [+17.421%; +18.657%]

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

  • 🟥 execution_time [+295.851ms; +296.762ms] or [+145.310%; +145.758%]
  • 🟩 throughput [+588.112op/s; +598.976op/s] or [+15.591%; +15.879%]

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

  • 🟥 execution_time [+300.334ms; +301.879ms] or [+146.822%; +147.578%]
  • 🟩 throughput [+2669.646op/s; +2776.242op/s] or [+38.785%; +40.334%]

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

  • 🟥 execution_time [+301.513ms; +303.579ms] or [+150.696%; +151.728%]
  • 🟩 throughput [+1422.657op/s; +1438.480op/s] or [+28.239%; +28.553%]

scenario:Benchmarks.Trace.Asm.AppSecWafBenchmark.RunWafRealisticBenchmark net472

  • 🟩 execution_time [-144.972µs; -139.636µs] or [-29.765%; -28.669%]
  • 🟩 throughput [+829.807op/s; +868.045op/s] or [+40.415%; +42.278%]

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

  • 🟩 execution_time [-132.461µs; -105.758µs] or [-30.380%; -24.256%]
  • 🟩 throughput [+794.825op/s; +917.774op/s] or [+34.556%; +39.901%]

scenario:Benchmarks.Trace.Asm.AppSecWafBenchmark.RunWafRealisticBenchmark netcoreapp3.1

  • 🟩 execution_time [-142.646µs; -120.658µs] or [-30.562%; -25.851%]
  • 🟩 throughput [+777.095op/s; +859.778op/s] or [+35.872%; +39.689%]

scenario:Benchmarks.Trace.Asm.AppSecWafBenchmark.RunWafRealisticBenchmarkWithAttack net472

  • 🟩 execution_time [-126.570µs; -122.670µs] or [-34.173%; -33.120%]
  • 🟩 throughput [+1349.181op/s; +1390.384op/s] or [+49.967%; +51.493%]

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

  • 🟩 execution_time [-98.501µs; -74.838µs] or [-31.446%; -23.892%]
  • 🟩 throughput [+1105.549op/s; +1309.880op/s] or [+34.463%; +40.833%]

scenario:Benchmarks.Trace.Asm.AppSecWafBenchmark.RunWafRealisticBenchmarkWithAttack netcoreapp3.1

  • 🟩 execution_time [-137.937µs; -115.535µs] or [-37.734%; -31.606%]
  • 🟩 throughput [+1332.958op/s; +1470.521op/s] or [+47.835%; +52.771%]

scenario:Benchmarks.Trace.AspNetCoreBenchmark.SendRequest net472

  • 🟥 execution_time [+299.600ms; +300.371ms] or [+149.531%; +149.916%]

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

  • 🟥 execution_time [+418.794ms; +425.580ms] or [+455.037%; +462.411%]
  • 🟩 throughput [+641.178op/s; +842.514op/s] or [+5.269%; +6.923%]

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

  • unstable execution_time [+153.665ms; +205.917ms] or [+116.676%; +156.351%]

scenario:Benchmarks.Trace.CIVisibilityProtocolWriterBenchmark.WriteAndFlushEnrichedTraces net472

  • unstable execution_time [+271.710ms; +306.301ms] or [+124.929%; +140.834%]
  • 🟥 throughput [-497.550op/s; -458.663op/s] or [-45.083%; -41.559%]

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

  • unstable execution_time [+200.852ms; +334.144ms] or [+85.595%; +142.398%]
  • 🟥 throughput [-667.904op/s; -584.466op/s] or [-44.549%; -38.984%]

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

  • 🟥 execution_time [+327.253ms; +336.378ms] or [+195.736%; +201.193%]
  • 🟥 throughput [-410.472op/s; -369.712op/s] or [-28.581%; -25.743%]

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

  • 🟥 execution_time [+136.942µs; +149.495µs] or [+9.408%; +10.270%]
  • 🟥 throughput [-63.993op/s; -58.881op/s] or [-9.315%; -8.571%]

scenario:Benchmarks.Trace.CharSliceBenchmark.OriginalCharSlice net472

  • 🟥 execution_time [+157.689µs; +176.021µs] or [+6.159%; +6.875%]
  • 🟥 throughput [-25.091op/s; -22.608op/s] or [-6.423%; -5.788%]

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

  • unstable throughput [-4.865op/s; +21.157op/s] or [-1.918%; +8.343%]

scenario:Benchmarks.Trace.ElasticsearchBenchmark.CallElasticsearch net472

  • 🟥 allocated_mem [+88 bytes; +89 bytes] or [+11.094%; +11.104%]
  • 🟥 execution_time [+302.019ms; +303.716ms] or [+152.091%; +152.945%]

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

  • 🟥 allocated_mem [+87 bytes; +88 bytes] or [+11.101%; +11.112%]
  • 🟥 execution_time [+299.794ms; +302.528ms] or [+150.227%; +151.598%]

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

  • 🟥 allocated_mem [+87 bytes; +88 bytes] or [+11.101%; +11.112%]
  • 🟥 execution_time [+301.184ms; +304.295ms] or [+151.302%; +152.865%]

scenario:Benchmarks.Trace.ElasticsearchBenchmark.CallElasticsearchAsync net472

  • 🟥 allocated_mem [+87 bytes; +88 bytes] or [+10.235%; +10.247%]
  • 🟥 execution_time [+302.449ms; +304.157ms] or [+151.880%; +152.737%]
  • 🟥 throughput [-25377.492op/s; -23792.672op/s] or [-8.502%; -7.971%]

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

  • 🟥 allocated_mem [+87 bytes; +88 bytes] or [+11.451%; +11.465%]
  • 🟥 execution_time [+298.431ms; +300.495ms] or [+147.561%; +148.581%]
  • 🟥 throughput [-51474.832op/s; -45806.368op/s] or [-8.294%; -7.380%]

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

  • 🟥 allocated_mem [+87 bytes; +88 bytes] or [+10.469%; +10.481%]
  • 🟥 execution_time [+302.050ms; +305.907ms] or [+153.092%; +155.047%]

scenario:Benchmarks.Trace.GraphQLBenchmark.ExecuteAsync net472

  • 🟥 allocated_mem [+88 bytes; +89 bytes] or [+10.268%; +10.280%]
  • 🟥 execution_time [+301.836ms; +304.432ms] or [+151.494%; +152.797%]
  • 🟥 throughput [-28851.206op/s; -26580.776op/s] or [-7.485%; -6.896%]

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

  • 🟥 allocated_mem [+87 bytes; +88 bytes] or [+9.730%; +9.743%]
  • 🟥 execution_time [+301.051ms; +303.738ms] or [+150.046%; +151.386%]

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

  • 🟥 allocated_mem [+87 bytes; +88 bytes] or [+9.730%; +9.743%]
  • 🟥 execution_time [+300.202ms; +302.759ms] or [+149.348%; +150.620%]
  • 🟥 throughput [-33836.744op/s; -28279.613op/s] or [-8.009%; -6.694%]

scenario:Benchmarks.Trace.ILoggerBenchmark.EnrichedLog net472

  • 🟥 allocated_mem [+88 bytes; +89 bytes] or [+5.504%; +5.513%]
  • 🟥 throughput [-25533.397op/s; -23292.179op/s] or [-10.268%; -9.366%]

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

  • 🟥 allocated_mem [+87 bytes; +88 bytes] or [+5.160%; +5.169%]
  • 🟩 execution_time [-17.279ms; -13.592ms] or [-8.035%; -6.320%]

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

  • 🟥 allocated_mem [+87 bytes; +88 bytes] or [+5.136%; +5.148%]

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

  • unstable execution_time [+11.928µs; +56.718µs] or [+2.946%; +14.010%]

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

  • 🟩 allocated_mem [-21.357KB; -21.334KB] or [-7.790%; -7.782%]
  • unstable execution_time [-33.067µs; +24.986µs] or [-6.536%; +4.938%]
  • unstable throughput [-86.778op/s; +113.772op/s] or [-4.330%; +5.677%]

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

  • 🟩 allocated_mem [-18.949KB; -18.930KB] or [-6.908%; -6.901%]
  • unstable execution_time [-65.227µs; -1.638µs] or [-11.303%; -0.284%]
  • unstable throughput [+24.414op/s; +205.751op/s] or [+1.395%; +11.755%]

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

  • 🟥 execution_time [+7.967µs; +12.120µs] or [+18.831%; +28.648%]
  • 🟥 throughput [-5446.512op/s; -3603.955op/s] or [-22.928%; -15.172%]

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

  • unstable execution_time [-14.577µs; -6.369µs] or [-22.616%; -9.881%]
  • unstable throughput [+1706.061op/s; +3439.291op/s] or [+10.467%; +21.101%]

scenario:Benchmarks.Trace.Log4netBenchmark.EnrichedLog net472

  • 🟥 execution_time [+302.566ms; +304.082ms] or [+152.934%; +153.700%]

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

  • 🟥 execution_time [+304.809ms; +307.163ms] or [+155.147%; +156.345%]

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

  • 🟥 execution_time [+298.206ms; +301.080ms] or [+149.289%; +150.728%]

scenario:Benchmarks.Trace.RedisBenchmark.SendReceive net472

  • 🟥 allocated_mem [+87 bytes; +88 bytes] or [+8.432%; +8.443%]
  • 🟥 throughput [-58462.844op/s; -56204.109op/s] or [-16.184%; -15.559%]

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

  • 🟥 allocated_mem [+87 bytes; +88 bytes] or [+8.456%; +8.467%]

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

  • 🟥 allocated_mem [+87 bytes; +88 bytes] or [+8.456%; +8.466%]
  • 🟥 throughput [-34639.368op/s; -23517.700op/s] or [-8.198%; -5.566%]

scenario:Benchmarks.Trace.SerilogBenchmark.EnrichedLog net472

  • 🟥 execution_time [+297.170ms; +298.914ms] or [+148.113%; +148.982%]

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

  • 🟥 allocated_mem [+88 bytes; +88 bytes] or [+5.502%; +5.512%]
  • 🟥 execution_time [+301.754ms; +303.034ms] or [+151.526%; +152.169%]

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

  • 🟥 allocated_mem [+87 bytes; +88 bytes] or [+5.333%; +5.343%]
  • 🟥 execution_time [+302.438ms; +305.262ms] or [+153.377%; +154.809%]

scenario:Benchmarks.Trace.SingleSpanAspNetCoreBenchmark.SingleSpanAspNetCore net472

  • 🟥 execution_time [+300.375ms; +301.194ms] or [+149.828%; +150.237%]
  • 🟩 throughput [+60846061.268op/s; +61150595.352op/s] or [+44.312%; +44.534%]

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

  • 🟥 execution_time [+418.232ms; +423.816ms] or [+520.146%; +527.090%]

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

  • 🟥 execution_time [+299.705ms; +300.797ms] or [+149.486%; +150.031%]

scenario:Benchmarks.Trace.SpanBenchmark.StartFinishSpan net472

  • 🟥 throughput [-90315.228op/s; -77066.742op/s] or [-8.267%; -7.055%]

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

  • 🟩 throughput [+27803.226op/s; +34172.925op/s] or [+5.049%; +6.205%]

scenario:Benchmarks.Trace.TraceAnnotationsBenchmark.RunOnMethodBegin net472

  • 🟥 allocated_mem [+87 bytes; +88 bytes] or [+14.421%; +14.433%]
  • 🟥 throughput [-92004.476op/s; -87129.034op/s] or [-13.465%; -12.752%]

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

  • 🟥 allocated_mem [+87 bytes; +88 bytes] or [+13.576%; +13.589%]

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

  • 🟥 allocated_mem [+87 bytes; +88 bytes] or [+13.576%; +13.587%]
  • 🟥 throughput [-79210.388op/s; -64490.797op/s] or [-11.060%; -9.005%]

Known flaky benchmarks without significant changes:

  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan netcoreapp3.1
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_AddEvent_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_AddEvent_Sampled net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_AddEvent_Sampled netcoreapp3.1
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_GetContext_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_GetContext_Sampled net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_GetContext_Sampled netcoreapp3.1
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_SetAttributes_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_SetAttributes_Sampled net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_SetAttributes_Sampled netcoreapp3.1
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_SetStatus_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_SetStatus_Sampled net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_SetStatus_Sampled netcoreapp3.1
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_UpdateName_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_UpdateName_Sampled net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.ActivityBenchmark.StartSpan_UpdateName_Sampled netcoreapp3.1
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan netcoreapp3.1
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_AddEvent_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_AddEvent_Sampled net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_AddEvent_Sampled netcoreapp3.1
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_GetContext_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_GetContext_Sampled net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_GetContext_Sampled netcoreapp3.1
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_RecordException_Sampled net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_RecordException_Sampled netcoreapp3.1
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_SetAttributes_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_SetAttributes_Sampled net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_SetAttributes_Sampled netcoreapp3.1
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_SetStatus_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_SetStatus_Sampled net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_SetStatus_Sampled netcoreapp3.1
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_UpdateName_Sampled net472
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_UpdateName_Sampled net6.0
  • scenario:Benchmarks.OpenTelemetry.InstrumentedApi.Trace.TelemetrySpanBenchmark.StartSpan_UpdateName_Sampled netcoreapp3.1
  • scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.ObjectExtractorSimpleBody net472
  • scenario:Benchmarks.Trace.CharSliceBenchmark.OptimizedCharSlice net472
  • scenario:Benchmarks.Trace.CharSliceBenchmark.OptimizedCharSlice netcoreapp3.1
  • scenario:Benchmarks.Trace.CharSliceBenchmark.OptimizedCharSliceWithPool net472
  • scenario:Benchmarks.Trace.CharSliceBenchmark.OptimizedCharSliceWithPool net6.0
  • scenario:Benchmarks.Trace.CharSliceBenchmark.OptimizedCharSliceWithPool netcoreapp3.1
  • scenario:Benchmarks.Trace.CharSliceBenchmark.OriginalCharSlice net6.0
  • scenario:Benchmarks.Trace.Iast.StringAspectsBenchmark.StringConcatBenchmark net472
  • scenario:Benchmarks.Trace.SpanBenchmark.StartFinishScope net472
  • scenario:Benchmarks.Trace.SpanBenchmark.StartFinishScope net6.0
  • scenario:Benchmarks.Trace.SpanBenchmark.StartFinishScope netcoreapp3.1
  • scenario:Benchmarks.Trace.SpanBenchmark.StartFinishSpan net6.0
  • scenario:Benchmarks.Trace.SpanBenchmark.StartFinishSpan netcoreapp3.1
  • scenario:Benchmarks.Trace.SpanBenchmark.StartFinishTwoScopes net472
  • scenario:Benchmarks.Trace.SpanBenchmark.StartFinishTwoScopes netcoreapp3.1

mhlidd and others added 2 commits September 24, 2026 15:26
_dd.sdk.otlp_export is written once per payload, which broke tests
asserting exact tag counts and tests byte-comparing serialized chunks.

- TagsListTests: exclude payload-scoped tags from count assertions
- AgentWriter/ApmAgentWriter tests: build expectations with
  isFirstChunkInPayload: true, matching SpanBuffer's real behaviour
- CI XUnit/NUnit/MsTestV2 tests: strip the marker alongside process tags

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Adds the two new OTLP resource attributes (_dd.sdk.otlp_export,
datadog.sdk.semantics) and the native msgpack _dd.sdk.otlp_export
meta entry to the snapshots that assert on them, regenerated from
Azure DevOps build 209972.

Also ignores meta._dd.sdk.otlp_export in the smoke test snapshot
comparison, alongside meta._dd.tags.process, since both are written
once per payload rather than on every span.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

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.

75 occurrences of :

+          },
+          {
+            "key": "_dd.sdk.otlp_export",
+            "value": {
+              "stringValue": "true"
+            }
+          },
+          {
+            "key": "datadog.sdk.semantics",
+            "value": {
+              "stringValue": "datadog"
+            }

27 occurrences of :

+          },
+          {
+            "key": "_dd.sdk.otlp_export",
+            "value": {
+              "stringValue": "true"
+            }
+          },
+          {
+            "key": "datadog.sdk.semantics",
+            "value": {
+              "stringValue": "otel"
+            }

_dd.sdk.otlp_export is written to the first span of a payload, and
which span that is is not stable, so pinning it in a snapshot fails
on any machine that orders spans differently (x64 snapshots vs arm64
runs).

ScrubCIVisibilityTags already drops _dd.tags.process for exactly this
reason; drop the export marker alongside it and remove the lines it
had already been baked into.

The existing Tags.Remove(SdkOtlpExport) calls in the CI test files
stay: they run on the spans used for the tag-count assertions, not on
the copy taken for the snapshot.

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

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot review overview

🟡 Changes recommended

Reserved marker names can still be emitted through numeric metric overloads as span attributes.

Get a fresh assessment by requesting another Copilot review.

Review effort: Lite
Findings: 1 Medium severity

Open (1)
What changed in this PR

Adds OTLP export and semantic-convention adoption markers to native and OTLP trace payloads.

Changes:

  • Defines payload and resource marker keys.
  • Emits markers through MessagePack and OTLP serializers.
  • Updates tests, snapshots, and verification helpers.
File Reviewed change
tracer/​test/​snapshots/​XUnitTests.SubmitTraces_packageVersion=all.verified.txt Updates payload snapshot expectations.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.OtelSemantics.__method=GET_path=_status-code_500.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.OtelSemantics.__method=GET_path=_status-code_400.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.OtelSemantics.__method=GET_path=_status-code_302.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.OtelSemantics.__method=GET_path=_rewrite-me.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.OtelSemantics.__method=GET_path=_ping.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.OtelSemantics.__method=GET_path=_path-base_api_delay_0.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.OtelSemantics.__method=GET_path=_bad-request.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.OtelSemantics.__method=GET_path=_api_delay_0.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.OtelSemantics.__method=GET_path=_api_delay_0-token=SUPER-SECRET-TOKEN-VALUE.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.OtelSemantics.__method=GET_path=_api_delay_0-id=1.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.OtelSemantics.__method=GET_path=_.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.OtelSemantics.__method=FOO_path=_ping.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.DatadogSemantics.WithFF.__method=GET_path=_status-code_500.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.DatadogSemantics.WithFF.__method=GET_path=_status-code_400.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.DatadogSemantics.WithFF.__method=GET_path=_status-code_302.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.DatadogSemantics.WithFF.__method=GET_path=_rewrite-me.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.DatadogSemantics.WithFF.__method=GET_path=_ping.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.DatadogSemantics.WithFF.__method=GET_path=_path-base_api_delay_0.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.DatadogSemantics.WithFF.__method=GET_path=_bad-request.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.DatadogSemantics.WithFF.__method=GET_path=_api_delay_0.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.DatadogSemantics.WithFF.__method=GET_path=_api_delay_0-token=SUPER-SECRET-TOKEN-VALUE.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.DatadogSemantics.WithFF.__method=GET_path=_api_delay_0-id=1.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.DatadogSemantics.WithFF.__method=GET_path=_.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.DatadogSemantics.WithFF.__method=FOO_path=_ping.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.DatadogSemantics.SingleSpan.__method=GET_path=_status-code_500.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.DatadogSemantics.SingleSpan.__method=GET_path=_status-code_400.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.DatadogSemantics.SingleSpan.__method=GET_path=_status-code_302.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.DatadogSemantics.SingleSpan.__method=GET_path=_rewrite-me.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.DatadogSemantics.SingleSpan.__method=GET_path=_ping.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.DatadogSemantics.SingleSpan.__method=GET_path=_path-base_api_delay_0.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.DatadogSemantics.SingleSpan.__method=GET_path=_bad-request.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.DatadogSemantics.SingleSpan.__method=GET_path=_api_delay_0.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.DatadogSemantics.SingleSpan.__method=GET_path=_api_delay_0-token=SUPER-SECRET-TOKEN-VALUE.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.DatadogSemantics.SingleSpan.__method=GET_path=_api_delay_0-id=1.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.DatadogSemantics.SingleSpan.__method=GET_path=_.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.DatadogSemantics.SingleSpan.__method=FOO_path=_ping.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.DatadogSemantics.NoFF.__method=GET_path=_status-code_500.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.DatadogSemantics.NoFF.__method=GET_path=_status-code_400.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.DatadogSemantics.NoFF.__method=GET_path=_status-code_302.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.DatadogSemantics.NoFF.__method=GET_path=_rewrite-me.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.DatadogSemantics.NoFF.__method=GET_path=_ping.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.DatadogSemantics.NoFF.__method=GET_path=_path-base_api_delay_0.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.DatadogSemantics.NoFF.__method=GET_path=_bad-request.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.DatadogSemantics.NoFF.__method=GET_path=_api_delay_0.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.DatadogSemantics.NoFF.__method=GET_path=_api_delay_0-token=SUPER-SECRET-TOKEN-VALUE.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.DatadogSemantics.NoFF.__method=GET_path=_api_delay_0-id=1.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.DatadogSemantics.NoFF.__method=GET_path=_.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMvc31Tests.DatadogSemantics.NoFF.__method=FOO_path=_ping.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.OtelSemantics.__method=GET_path=_status-code_500.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.OtelSemantics.__method=GET_path=_status-code_400.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.OtelSemantics.__method=GET_path=_status-code_302.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.OtelSemantics.__method=GET_path=_rewrite-me.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.OtelSemantics.__method=GET_path=_ping.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.OtelSemantics.__method=GET_path=_path-base_api_delay_0.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.OtelSemantics.__method=GET_path=_bad-request.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.OtelSemantics.__method=GET_path=_api_delay_0.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.OtelSemantics.__method=GET_path=_api_delay_0-token=SUPER-SECRET-TOKEN-VALUE.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.OtelSemantics.__method=GET_path=_api_delay_0-id=1.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.OtelSemantics.__method=GET_path=_.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.OtelSemantics.__method=FOO_path=_ping.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.DatadogSemantics.WithFF.__method=GET_path=_status-code_500.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.DatadogSemantics.WithFF.__method=GET_path=_status-code_400.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.DatadogSemantics.WithFF.__method=GET_path=_status-code_302.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.DatadogSemantics.WithFF.__method=GET_path=_rewrite-me.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.DatadogSemantics.WithFF.__method=GET_path=_ping.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.DatadogSemantics.WithFF.__method=GET_path=_path-base_api_delay_0.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.DatadogSemantics.WithFF.__method=GET_path=_bad-request.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.DatadogSemantics.WithFF.__method=GET_path=_api_delay_0.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.DatadogSemantics.WithFF.__method=GET_path=_api_delay_0-token=SUPER-SECRET-TOKEN-VALUE.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.DatadogSemantics.WithFF.__method=GET_path=_api_delay_0-id=1.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.DatadogSemantics.WithFF.__method=GET_path=_.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.DatadogSemantics.WithFF.__method=FOO_path=_ping.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.DatadogSemantics.SingleSpan.__method=GET_path=_status-code_500.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.DatadogSemantics.SingleSpan.__method=GET_path=_status-code_400.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.DatadogSemantics.SingleSpan.__method=GET_path=_status-code_302.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.DatadogSemantics.SingleSpan.__method=GET_path=_rewrite-me.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.DatadogSemantics.SingleSpan.__method=GET_path=_ping.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.DatadogSemantics.SingleSpan.__method=GET_path=_path-base_api_delay_0.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.DatadogSemantics.SingleSpan.__method=GET_path=_bad-request.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.DatadogSemantics.SingleSpan.__method=GET_path=_api_delay_0.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.DatadogSemantics.SingleSpan.__method=GET_path=_api_delay_0-token=SUPER-SECRET-TOKEN-VALUE.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.DatadogSemantics.SingleSpan.__method=GET_path=_api_delay_0-id=1.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.DatadogSemantics.SingleSpan.__method=GET_path=_.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.DatadogSemantics.SingleSpan.__method=FOO_path=_ping.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.DatadogSemantics.NoFF.__method=GET_path=_status-code_500.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.DatadogSemantics.NoFF.__method=GET_path=_status-code_400.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.DatadogSemantics.NoFF.__method=GET_path=_status-code_302.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.DatadogSemantics.NoFF.__method=GET_path=_rewrite-me.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.DatadogSemantics.NoFF.__method=GET_path=_ping.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.DatadogSemantics.NoFF.__method=GET_path=_path-base_api_delay_0.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.DatadogSemantics.NoFF.__method=GET_path=_bad-request.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.DatadogSemantics.NoFF.__method=GET_path=_api_delay_0.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.DatadogSemantics.NoFF.__method=GET_path=_api_delay_0-token=SUPER-SECRET-TOKEN-VALUE.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.DatadogSemantics.NoFF.__method=GET_path=_api_delay_0-id=1.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.DatadogSemantics.NoFF.__method=GET_path=_.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OtlpAspNetCoreMinimalApisTests.DatadogSemantics.NoFF.__method=FOO_path=_ping.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OpenTelemetryWebRequestTests.SubmitsOtlpTraces_OtelSemantics_Net5.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OpenTelemetryWebRequestTests.SubmitsOtlpTraces_Net5.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OpenTelemetrySdkTests.SubmitsOtlpTraces_DD.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OpenTelemetrySdkTests.SubmitsOtlpTraces_DD_OtelSemantics.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OpenTelemetryHttpClientTests.SubmitsOtlpTraces.verified.txt Updates OTLP resource markers.
tracer/​test/​snapshots/​OpenTelemetryHttpClientTests.SubmitsOtlpTraces_OtelSemantics.verified.txt Updates OTLP resource markers.
tracer/​test/​Datadog.Trace.Tests/​Tagging/​TagsListTests.cs Adjusts tag-count assertions.
tracer/​test/​Datadog.Trace.Tests/​OpenTelemetry/​OtlpMapperTests.cs Tests resource markers and filtering.
tracer/​test/​Datadog.Trace.Tests/​Agent/​MessagePack/​SpanMessagePackFormatterTests.cs Tests payload-scoped native markers.
tracer/​test/​Datadog.Trace.Tests/​Agent/​AgentWriterTests.cs Updates payload expectations.
tracer/​test/​Datadog.Trace.TestHelpers/​SpanTagAssertion.cs Allows the native marker.
tracer/​test/​Datadog.Trace.TestHelpers.SharedSource/​VerifyHelper.cs Scrubs payload-scoped markers.
tracer/​test/​Datadog.Trace.ClrProfiler.IntegrationTests/​CI/​XUnitTests.cs Updates integration assertions.
tracer/​test/​Datadog.Trace.ClrProfiler.IntegrationTests/​CI/​NUnitTests.cs Updates integration assertions.
tracer/​test/​Datadog.Trace.ClrProfiler.IntegrationTests/​CI/​MsTestV2Tests.cs Updates integration assertions.
tracer/​test/​Datadog.Trace.ClrProfiler.IntegrationTests/​CI/​Agent/​ApmAgentWriterTests.cs Updates native payload expectations.
tracer/​src/​Datadog.Trace/​Tags.cs Defines adoption marker keys.
tracer/​src/​Datadog.Trace/​OpenTelemetry/​OtlpMapper.cs Emits resource markers and filters span attributes.
tracer/​src/​Datadog.Trace/​Agent/​MessagePack/​TraceChunkModel.cs Carries semantic settings into serialization.
tracer/​src/​Datadog.Trace/​Agent/​MessagePack/​SpanMessagePackFormatter.cs Writes the native marker once per payload.
tracer/​build/​_build/​SmokeTests/​SmokeTestScenario.cs Ignores the marker in smoke snapshots.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread tracer/src/Datadog.Trace/OpenTelemetry/OtlpMapper.cs Outdated
Keeps the payload-scoped comment in SpanMessagePackFormatter, reworded
from "Process tags" since the block now covers the export marker too.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@mhlidd
mhlidd marked this pull request as ready for review September 25, 2026 18:49
@mhlidd
mhlidd requested review from a team as code owners September 25, 2026 18:49
@mhlidd
mhlidd requested review from anna-git and vandonr and removed request for a team September 25, 2026 18:49

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

AI Generated Largely based on code generated by an AI or LLM. This label is the same across all dd-trace-* repos

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants