Skip to content

fix(otel): unify OTLP endpoint and protocol resolution - #9505

Merged
vpellan merged 11 commits into
masterfrom
milan.garnier/otlp-unify-endpoint-protocol
Oct 30, 2026
Merged

vpellan merged 11 commits into
masterfrom
milan.garnier/otlp-unify-endpoint-protocol

Conversation

@MilanGarnier

@MilanGarnier MilanGarnier commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

Summary of changes

Traces, metrics and logs now resolve their OTLP endpoint and protocol through one code path, ExporterSettings.GetOtlpTransport, which also records the resolved values in configuration telemetry. Logs used to be resolved separately in TracerSettings, with their own rules.

Every signal now behaves the same way:

  • Endpoint: the signal endpoint (OTEL_EXPORTER_OTLP_{SIGNAL}_ENDPOINT) if valid. Otherwise OTEL_EXPORTER_OTLP_ENDPOINT, used as-is for gRPC and with v1/<signal> appended for HTTP, keeping any base path as the OTLP/HTTP spec requires. Like the OpenTelemetry .NET SDK, v1/<signal> is not appended again if the endpoint already ends with it. Otherwise http://<DD_AGENT_HOST>:4317 (gRPC) or http://<DD_AGENT_HOST>:4318/v1/<signal> (HTTP), based on the signal's protocol, with localhost as the default host. An empty value counts as unset, and an invalid one falls back to the next option with a validation warning.
  • Protocol: the signal protocol, otherwise OTEL_EXPORTER_OTLP_PROTOCOL, otherwise the signal default (traces http/json, metrics http/protobuf, logs grpc). Values are matched case-insensitively, an empty value counts as unset, and an unsupported value falls back to the signal default with a validation warning. The logs exporter only serializes protobuf, so http/json becomes http/protobuf with a warning.
  • Telemetry: each OTEL_EXPORTER_OTLP_{SIGNAL}_ENDPOINT and _PROTOCOL key reports the value its exporter actually uses. When that value is not the one set on the key, its origin is calculated if derived from the general settings (or, for logs, if http/json was replaced) and default otherwise.

Reason for change

Bugs fixed by the shared code path:

  • Logs dropped the base path of OTEL_EXPORTER_OTLP_ENDPOINT: http://collector:4318/mycollector sent logs to http://collector:4318/v1/logs (APMAPI-2620).
  • Logs with protocol http/protobuf and no endpoint were sent to port 4317 unless OTEL_EXPORTER_OTLP_PROTOCOL was also http/protobuf, because the port came from the general protocol.
  • An empty or invalid logs endpoint threw instead of falling back to the general endpoint or the default.
  • Traces and metrics matched protocol values case-sensitively, logs case-insensitively (APMAPI-2489).
  • An empty traces or metrics protocol selected the signal default instead of inheriting OTEL_EXPORTER_OTLP_PROTOCOL.
  • Unsupported protocols fell back to the default without any warning for traces and metrics.
  • A general http/json protocol made logs fall back to grpc.
  • Traces and metrics appended v1/<signal> again to a general endpoint that already ended with it (http://collector:4318/v1/traces became http://collector:4318/v1/traces/v1/traces).
  • Telemetry reported malformed endpoints for logs and metrics (http://collector:4318/mycollectorv1/metrics), no endpoint for traces unless set explicitly, and protocols computed in TracerSettings that could differ from the ones the exporters used. The metrics protocol default was reported as grpc instead of http/protobuf.
  • The startup log reported http/protobuf for metrics configured with http/json, although the metrics exporter sends JSON.

Implementation details

  • ExporterSettings gets GetOtlpLogsTransport, a sibling of the traces and metrics ones, and the OtlpLogsEndpoint and OtlpLogsProtocol settings. The logs OtlpExporter now takes ExporterSettings, like the metrics exporter.
  • GetOtlpTransport and GetOtlpUri record the resolved protocol and endpoint, skipping a value set explicitly on the signal key since ConfigurationBuilder already recorded it. RecordOtlpGeneralDefaults records the general protocol and endpoint defaults.
  • The signal protocol keys are read without their OTEL_EXPORTER_OTLP_PROTOCOL alias, through a new ConfigurationBuilder.WithKeys(key, includeAliases: false) overload, because GetOtlpTransport applies that fallback itself. An inherited protocol is then recorded under the signal key as calculated, and a signal protocol set to the same value as the general one keeps its own origin. The aliases stay in supported-configurations.yaml, since the fallback still applies.
  • TracerSettings: the OTLP endpoint and protocol settings are removed, along with the telemetry they recorded.
  • TracerManager: the startup log no longer rewrites http/json to http/protobuf and logs the protocol resolved by ExporterSettings.
  • supported-configurations.yaml: OTEL_EXPORTER_OTLP_METRICS_PROTOCOL now uses registry implementation B (default http/protobuf).
  • Behavior change for logs, to mention in the release notes: an unsupported logs protocol now falls back to the logs default (grpc), like traces and metrics, instead of to OTEL_EXPORTER_OTLP_PROTOCOL. For example, with OTEL_EXPORTER_OTLP_LOGS_PROTOCOL=invalid and OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf, logs are now sent over gRPC (port 4317 by default) instead of HTTP.

Test coverage

ExporterSettingsTests covers:

  • endpoint resolution and its telemetry: for logs, the defaults, gRPC as-is, base path with and without trailing slash, http/json and a signal endpoint; for traces and metrics, the default and a base path; for every signal, a general endpoint that already ends with v1/<signal>
  • logs protocol fallbacks and their warnings, and empty signal protocols inheriting the general protocol for every signal
  • the recorded signal protocol and origin, and the general protocol and endpoint defaults

The TracerSettingsTests for the removed settings are deleted.

DataDog/system-tests#8112 added base-path tests for logs, metrics and traces. The .NET logs test is marked bug (APMAPI-2620) in the system-tests manifest until this change ships.

Other details

  • A unix:// general endpoint is used as-is, without appending v1/logs. The logs exporter does not support Unix sockets, before or after this PR.
  • Since fix(otel): treat empty OTEL_* environment variables as unset #9497, empty OTEL_* values are treated as unset at the configuration source level. GetOtlpTransport still treats empty endpoints and protocols as unset as well, for sources that don't apply that check (e.g. DictionaryObjectConfigurationSource).

@MilanGarnier
MilanGarnier requested review from a team as code owners October 22, 2026 14:06
@MilanGarnier
MilanGarnier requested review from mabdinur and removed request for a team October 22, 2026 14:06
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-22T14:16:35.350498Z e518313 PR opened
🔒 Security Review ✅ Completed 2026-10-22T14:10:34.031080Z e518313 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@MilanGarnier
MilanGarnier requested review from vpellan and removed request for mabdinur October 22, 2026 14:11

@datadog-datadog-prod-us1-2 datadog-datadog-prod-us1-2 Bot 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.

Bits Code Review: FAIL

General OTLP endpoints containing a query string or fragment now send HTTP logs to the wrong path, breaking delivery to collectors requiring /v1/logs. A focused URI reproduction confirmed the regression and the suggested path-based replacement.

Open Bits AI session

🤖 Bits Code Review · Commit e518313

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e518313e2c

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@pr-commenter

pr-commenter Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

Benchmarks

Benchmark execution time: 2026-10-30 10:12:31

Comparing candidate commit 547dade in PR branch milan.garnier/otlp-unify-endpoint-protocol with baseline commit b069a67 in branch master.

📊 Benchmarking dashboard

Found 0 performance improvements and 0 performance regressions! Performance is the same for 72 metrics, 0 unstable metrics, 8 known flaky benchmarks, 117 flaky benchmarks without significant changes.

Explanation

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

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

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

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

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

More details about the CI and significant changes

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

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

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

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

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

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

Known flaky benchmarks

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

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

  • 🟥 allocated_mem [+24.624KB; +24.625KB] or [+1076.228%; +1076.287%]

scenario:Benchmarks.Trace.AspNetCoreBenchmark.SendRequest net472

  • unstable execution_time [-0.001ns; +0.005ns] or [-4.615%; +33.531%]
  • unstable throughput [-253222433436.157op/s; +271921691759.957op/s] or [-141.183%; +151.608%]

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

  • unstable throughput [-13.017op/s; +26.882op/s] or [-4.826%; +9.966%]

scenario:Benchmarks.Trace.ElasticsearchBenchmark.CallElasticsearch net472

  • 🟥 execution_time [+221.282ns; +246.530ns] or [+6.591%; +7.343%]
  • 🟥 throughput [-20474.706op/s; -18347.312op/s] or [-6.874%; -6.159%]

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

  • 🟩 throughput [+95.692op/s; +260.428op/s] or [+5.164%; +14.055%]

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

  • 🟩 execution_time [-6.480µs; -4.534µs] or [-11.787%; -8.248%]
  • 🟩 throughput [+1681.889op/s; +2385.015op/s] or [+9.229%; +13.087%]

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

  • 🟩 execution_time [-6.198µs; -3.011µs] or [-10.911%; -5.301%]
  • 🟩 throughput [+986.981op/s; +1937.430op/s] or [+5.568%; +10.929%]

scenario:Benchmarks.Trace.SingleSpanAspNetCoreBenchmark.SingleSpanAspNetCore net472

  • unstable execution_time [-0.003ns; +0.004ns] or [-19.843%; +25.784%]
  • unstable throughput [-1066554793267.228op/s; +2645540184494.795op/s] or [-440.104%; +1091.657%]

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 net472
  • 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.ActivityBenchmark.StartStopWithChild net472
  • scenario:Benchmarks.Trace.ActivityBenchmark.StartStopWithChild net6.0
  • scenario:Benchmarks.Trace.ActivityBenchmark.StartStopWithChild netcoreapp3.1
  • scenario:Benchmarks.Trace.AgentWriterBenchmark.WriteAndFlushEnrichedTraces net472
  • scenario:Benchmarks.Trace.AgentWriterBenchmark.WriteAndFlushEnrichedTraces net6.0
  • scenario:Benchmarks.Trace.AgentWriterBenchmark.WriteAndFlushEnrichedTraces netcoreapp3.1
  • scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.AllCycleMoreComplexBody net472
  • scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.AllCycleMoreComplexBody net6.0
  • scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.AllCycleMoreComplexBody netcoreapp3.1
  • scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.AllCycleSimpleBody net472
  • scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.AllCycleSimpleBody net6.0
  • scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.AllCycleSimpleBody netcoreapp3.1
  • scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.ObjectExtractorMoreComplexBody net472
  • scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.ObjectExtractorMoreComplexBody net6.0
  • scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.ObjectExtractorMoreComplexBody netcoreapp3.1
  • scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.ObjectExtractorSimpleBody net472
  • scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.ObjectExtractorSimpleBody net6.0
  • scenario:Benchmarks.Trace.Asm.AppSecBodyBenchmark.ObjectExtractorSimpleBody netcoreapp3.1
  • scenario:Benchmarks.Trace.Asm.AppSecEncoderBenchmark.EncodeArgs net472
  • scenario:Benchmarks.Trace.Asm.AppSecEncoderBenchmark.EncodeArgs net6.0
  • scenario:Benchmarks.Trace.Asm.AppSecEncoderBenchmark.EncodeArgs netcoreapp3.1
  • scenario:Benchmarks.Trace.Asm.AppSecEncoderBenchmark.EncodeLegacyArgs net472
  • scenario:Benchmarks.Trace.Asm.AppSecEncoderBenchmark.EncodeLegacyArgs net6.0
  • scenario:Benchmarks.Trace.Asm.AppSecEncoderBenchmark.EncodeLegacyArgs netcoreapp3.1
  • scenario:Benchmarks.Trace.Asm.AppSecWafBenchmark.RunWafRealisticBenchmark net472
  • scenario:Benchmarks.Trace.Asm.AppSecWafBenchmark.RunWafRealisticBenchmark net6.0
  • scenario:Benchmarks.Trace.Asm.AppSecWafBenchmark.RunWafRealisticBenchmark netcoreapp3.1
  • scenario:Benchmarks.Trace.Asm.AppSecWafBenchmark.RunWafRealisticBenchmarkWithAttack net472
  • scenario:Benchmarks.Trace.Asm.AppSecWafBenchmark.RunWafRealisticBenchmarkWithAttack netcoreapp3.1
  • scenario:Benchmarks.Trace.AspNetCoreBenchmark.SendRequest net6.0
  • scenario:Benchmarks.Trace.AspNetCoreBenchmark.SendRequest netcoreapp3.1
  • scenario:Benchmarks.Trace.CIVisibilityProtocolWriterBenchmark.WriteAndFlushEnrichedTraces net472
  • scenario:Benchmarks.Trace.CIVisibilityProtocolWriterBenchmark.WriteAndFlushEnrichedTraces net6.0
  • scenario:Benchmarks.Trace.CIVisibilityProtocolWriterBenchmark.WriteAndFlushEnrichedTraces netcoreapp3.1
  • scenario:Benchmarks.Trace.CharSliceBenchmark.OptimizedCharSlice net472
  • scenario:Benchmarks.Trace.CharSliceBenchmark.OptimizedCharSlice net6.0
  • scenario:Benchmarks.Trace.CharSliceBenchmark.OptimizedCharSlice netcoreapp3.1
  • scenario:Benchmarks.Trace.CharSliceBenchmark.OptimizedCharSliceWithPool net472
  • scenario:Benchmarks.Trace.CharSliceBenchmark.OptimizedCharSliceWithPool net6.0
  • scenario:Benchmarks.Trace.CharSliceBenchmark.OptimizedCharSliceWithPool netcoreapp3.1
  • scenario:Benchmarks.Trace.CharSliceBenchmark.OriginalCharSlice net472
  • scenario:Benchmarks.Trace.CharSliceBenchmark.OriginalCharSlice net6.0
  • scenario:Benchmarks.Trace.ElasticsearchBenchmark.CallElasticsearch net6.0
  • scenario:Benchmarks.Trace.ElasticsearchBenchmark.CallElasticsearch netcoreapp3.1
  • scenario:Benchmarks.Trace.ElasticsearchBenchmark.CallElasticsearchAsync net472
  • scenario:Benchmarks.Trace.ElasticsearchBenchmark.CallElasticsearchAsync net6.0
  • scenario:Benchmarks.Trace.ElasticsearchBenchmark.CallElasticsearchAsync netcoreapp3.1
  • scenario:Benchmarks.Trace.GraphQLBenchmark.ExecuteAsync net472
  • scenario:Benchmarks.Trace.GraphQLBenchmark.ExecuteAsync net6.0
  • scenario:Benchmarks.Trace.GraphQLBenchmark.ExecuteAsync netcoreapp3.1
  • scenario:Benchmarks.Trace.ILoggerBenchmark.EnrichedLog net472
  • scenario:Benchmarks.Trace.ILoggerBenchmark.EnrichedLog net6.0
  • scenario:Benchmarks.Trace.ILoggerBenchmark.EnrichedLog netcoreapp3.1
  • scenario:Benchmarks.Trace.Iast.StringAspectsBenchmark.StringConcatAspectBenchmark net472
  • scenario:Benchmarks.Trace.Iast.StringAspectsBenchmark.StringConcatAspectBenchmark netcoreapp3.1
  • scenario:Benchmarks.Trace.Iast.StringAspectsBenchmark.StringConcatBenchmark net472
  • scenario:Benchmarks.Trace.Log4netBenchmark.EnrichedLog net472
  • scenario:Benchmarks.Trace.Log4netBenchmark.EnrichedLog net6.0
  • scenario:Benchmarks.Trace.Log4netBenchmark.EnrichedLog netcoreapp3.1
  • scenario:Benchmarks.Trace.RedisBenchmark.SendReceive net472
  • scenario:Benchmarks.Trace.RedisBenchmark.SendReceive net6.0
  • scenario:Benchmarks.Trace.RedisBenchmark.SendReceive netcoreapp3.1
  • scenario:Benchmarks.Trace.SerilogBenchmark.EnrichedLog net472
  • scenario:Benchmarks.Trace.SerilogBenchmark.EnrichedLog net6.0
  • scenario:Benchmarks.Trace.SerilogBenchmark.EnrichedLog netcoreapp3.1
  • scenario:Benchmarks.Trace.SingleSpanAspNetCoreBenchmark.SingleSpanAspNetCore net6.0
  • 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 net472
  • 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 net6.0
  • scenario:Benchmarks.Trace.SpanBenchmark.StartFinishTwoScopes netcoreapp3.1
  • scenario:Benchmarks.Trace.TraceAnnotationsBenchmark.RunOnMethodBegin net472
  • scenario:Benchmarks.Trace.TraceAnnotationsBenchmark.RunOnMethodBegin net6.0
  • scenario:Benchmarks.Trace.TraceAnnotationsBenchmark.RunOnMethodBegin netcoreapp3.1

@dd-trace-dotnet-ci-bot

dd-trace-dotnet-ci-bot Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

Execution-Time Benchmarks Report ⏱️

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

✅ No regressions detected

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

@vpellan
vpellan added this pull request to stack #9507 October 22, 2026 15:43
@MilanGarnier
MilanGarnier force-pushed the milan.garnier/otlp-unify-endpoint-protocol branch from 9fc6376 to 33e8851 Compare October 28, 2026 09:18

@anna-git anna-git 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.

Thanks for uniformizing! I left a few comments

vpellan and others added 3 commits October 29, 2026 15:43
…with it

Address review feedback:
- Resolve the general endpoint with a single TryGetOtlpUri call
- Like the OpenTelemetry .NET SDK, skip appending v1/{signal} when the endpoint already ends with it
- Name the signal in the default transport warning
- Add an explicit http/json arm to GetOtlpProtocolName
- Check that an inherited signal protocol is not recorded under the signal key

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Read the signal protocol keys without their OTEL_EXPORTER_OTLP_PROTOCOL alias. GetOtlpTransport already falls back to the general protocol, and now records the inherited value under the signal key as calculated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@anna-git anna-git 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.

Thanks for addressing all comments!

@vpellan
vpellan merged commit 2b8162c into master Oct 30, 2026
149 checks passed
@vpellan
vpellan deleted the milan.garnier/otlp-unify-endpoint-protocol branch October 30, 2026 12:23
@github-actions github-actions Bot added this to the vNext-v3 milestone Oct 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants