Skip to content

Commit 0025fca

Browse files
bm1549claude
andcommitted
feat(tracing): report OTLP export status in startup diagnostic log
Add three boolean fields to the tracer's startup diagnostic log ("DATADOG TRACER CONFIGURATION") indicating whether each telemetry signal is exported over OTLP: - otlp_traces_export_enabled: reflects agent_config.trace_otlp_export_enabled (opt-in via OTEL_TRACES_EXPORTER=otlp; export is routed through libdatadog's native OTLP trace exporter) - otlp_metrics_export_enabled: reflects config._otel_metrics_enabled - otlp_logs_export_enabled: reflects config._otel_logs_enabled Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent e083509 commit 0025fca

2 files changed

Lines changed: 55 additions & 0 deletions

File tree

ddtrace/internal/debug.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,9 @@ def collect() -> dict[str, Any]:
130130
log_injection_enabled=ddtrace.config._logs_injection,
131131
health_metrics_enabled=ddtrace.config._health_metrics_enabled,
132132
runtime_metrics_enabled=RuntimeWorker.enabled,
133+
otlp_traces_export_enabled=agent_config.trace_otlp_export_enabled,
134+
otlp_metrics_export_enabled=ddtrace.config._otel_metrics_enabled,
135+
otlp_logs_export_enabled=ddtrace.config._otel_logs_enabled,
133136
dd_version=ddtrace.config.version or "",
134137
global_tags=tags_to_str(ddtrace.config.tags),
135138
tracer_tags=tags_to_str(tracer._tags),

tests/integration/test_debug.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,12 @@ def test_standard_tags():
8383
assert f.get("log_injection_enabled") is True
8484
assert f.get("health_metrics_enabled") is False
8585
assert f.get("runtime_metrics_enabled") is False
86+
assert "otlp_traces_export_enabled" in f
87+
assert "otlp_metrics_export_enabled" in f
88+
assert "otlp_logs_export_enabled" in f
89+
assert isinstance(f.get("otlp_traces_export_enabled"), bool)
90+
assert isinstance(f.get("otlp_metrics_export_enabled"), bool)
91+
assert isinstance(f.get("otlp_logs_export_enabled"), bool)
8692
assert f.get("sampling_rules") == []
8793
assert f.get("global_tags") == ""
8894
assert f.get("tracer_tags") == ""
@@ -239,6 +245,52 @@ def test_runtime_metrics_enabled_via_env_var_start():
239245
)
240246

241247

248+
@pytest.mark.subprocess(
249+
env=dict(
250+
# Clear any inherited OTLP-related env so the defaults are deterministic.
251+
OTEL_SDK_DISABLED=None,
252+
OTEL_TRACES_EXPORTER=None,
253+
OTEL_METRICS_EXPORTER=None,
254+
OTEL_LOGS_EXPORTER=None,
255+
DD_TRACE_OTEL_ENABLED=None,
256+
DD_METRICS_OTEL_ENABLED=None,
257+
DD_LOGS_OTEL_ENABLED=None,
258+
)
259+
)
260+
def test_otlp_export_enabled_fields_default():
261+
from ddtrace.internal import debug
262+
263+
f = debug.collect()
264+
265+
assert f.get("otlp_traces_export_enabled") is False
266+
assert f.get("otlp_metrics_export_enabled") is False
267+
assert f.get("otlp_logs_export_enabled") is False
268+
269+
270+
@pytest.mark.subprocess(
271+
env=dict(
272+
# trace_otlp_export_enabled is derived at config init, so it must come from the
273+
# environment; DD_TRACE_AGENT_PROTOCOL_VERSION is cleared because it disables OTLP.
274+
OTEL_TRACES_EXPORTER="otlp",
275+
DD_TRACE_AGENT_PROTOCOL_VERSION=None,
276+
),
277+
err=None,
278+
)
279+
def test_otlp_export_enabled_fields_set():
280+
import ddtrace
281+
from ddtrace.internal import debug
282+
283+
# Metrics/logs are read live from the global config, so they can be toggled here.
284+
ddtrace.config._otel_metrics_enabled = True
285+
ddtrace.config._otel_logs_enabled = True
286+
287+
f = debug.collect()
288+
289+
assert f.get("otlp_traces_export_enabled") is True
290+
assert f.get("otlp_metrics_export_enabled") is True
291+
assert f.get("otlp_logs_export_enabled") is True
292+
293+
242294
def test_to_json():
243295
info = debug.collect()
244296
json.dumps(info)

0 commit comments

Comments
 (0)