Skip to content

Commit 6d1065b

Browse files
bm1549claude
andcommitted
Base OTLP export flags on effective writer and span metrics
Report otlp_traces_export_enabled from the resolved writer type (OtlpWriter) rather than the OTLP exporter selection, since an explicit dd.writer.type override wins over dd.trace.otel.exporter=otlp in WriterFactory. Also report otlp_metrics_export_enabled when client-side span metrics are enabled, since those are exported over OTLP via OtlpStatsMetricWriter independently of the OTel metrics signal. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent a4287c5 commit 6d1065b

2 files changed

Lines changed: 34 additions & 2 deletions

File tree

dd-trace-core/src/main/java/datadog/trace/core/StatusLogger.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static datadog.trace.api.Config.isDatadogProfilerEnablementOverridden;
44
import static datadog.trace.api.Config.isDatadogProfilerSafeInCurrentEnvironment;
5+
import static datadog.trace.bootstrap.instrumentation.api.WriterConstants.OTLP_WRITER_TYPE;
56
import static java.util.concurrent.TimeUnit.MILLISECONDS;
67

78
import com.squareup.moshi.JsonAdapter;
@@ -159,9 +160,17 @@ public void toJson(JsonWriter writer, Config config) throws IOException {
159160
writer.name("data_streams_transaction_extractors");
160161
writer.value(config.getDataStreamsTransactionExtractors());
161162
writer.name("otlp_traces_export_enabled");
162-
writer.value(config.isTraceOtlpExporterEnabled());
163+
// Report the effective trace writer, not just the exporter selection: an explicit
164+
// dd.writer.type override wins over dd.trace.otel.exporter=otlp in WriterFactory, so traces are
165+
// only exported over OTLP when the resolved writer is actually the OtlpWriter.
166+
writer.value(OTLP_WRITER_TYPE.equals(config.getWriterType()));
163167
writer.name("otlp_metrics_export_enabled");
164-
writer.value(config.isMetricsOtelEnabled() && config.isMetricsOtlpExporterEnabled());
168+
// Client-side trace span-metrics are exported over OTLP whenever span metrics are enabled
169+
// (MetricsAggregatorFactory routes them through OtlpStatsMetricWriter), independently of the
170+
// OTel metrics signal, so OR that path in alongside OTel-API metrics export.
171+
writer.value(
172+
(config.isMetricsOtelEnabled() && config.isMetricsOtlpExporterEnabled())
173+
|| config.isOtelTracesSpanMetricsEnabled());
165174
writer.name("otlp_logs_export_enabled");
166175
writer.value(config.isLogsOtelEnabled() && config.isLogsOtlpExporterEnabled());
167176

dd-trace-core/src/test/java/datadog/trace/core/StatusLoggerTest.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.squareup.moshi.Moshi;
66
import datadog.trace.api.Config;
77
import datadog.trace.api.config.OtlpConfig;
8+
import datadog.trace.api.config.TracerConfig;
89
import datadog.trace.test.junit.utils.config.WithConfig;
910
import java.io.IOException;
1011
import java.util.Map;
@@ -52,6 +53,28 @@ void metricsAndLogsRequireOtelSignalEnabled() throws IOException {
5253
assertEquals(false, startupLog.get("otlp_logs_export_enabled"));
5354
}
5455

56+
@Test
57+
@WithConfig(key = OtlpConfig.TRACE_OTEL_EXPORTER, value = "otlp")
58+
@WithConfig(key = TracerConfig.WRITER_TYPE, value = "DDAgentWriter")
59+
void tracesNotExportedWhenWriterTypeOverridesOtlpExporter() throws IOException {
60+
// The OTLP trace exporter is selected, but an explicit dd.writer.type override wins in
61+
// WriterFactory, so the effective writer is the DDAgentWriter and traces are not exported over
62+
// OTLP.
63+
Map<String, Object> startupLog = startupLog(Config.get());
64+
65+
assertEquals(false, startupLog.get("otlp_traces_export_enabled"));
66+
}
67+
68+
@Test
69+
@WithConfig(key = OtlpConfig.OTEL_TRACES_SPAN_METRICS_ENABLED, value = "true")
70+
void metricsExportedWhenSpanMetricsEnabled() throws IOException {
71+
// Span metrics are exported over OTLP via OtlpStatsMetricWriter whenever span metrics are
72+
// enabled, independently of the OTel metrics signal, so metrics export should be reported.
73+
Map<String, Object> startupLog = startupLog(Config.get());
74+
75+
assertEquals(true, startupLog.get("otlp_metrics_export_enabled"));
76+
}
77+
5578
@SuppressWarnings("unchecked")
5679
private static Map<String, Object> startupLog(Config config) throws IOException {
5780
String json =

0 commit comments

Comments
 (0)