Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 18 additions & 19 deletions ddtrace/internal/telemetry/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -161,32 +161,31 @@ def validate_otel_envs():
and otel_env not in SUPPORTED_OTEL_ENV_VARS
):
_unsupported_otel_config(otel_env)
elif otel_env == "OTEL_LOGS_EXPORTER":
# check for invalid values
otel_value = os.environ.get(otel_env, "none").lower()
if otel_value != "none":
_invalid_otel_config(otel_env)
# TODO: Separate from validation
telemetry_writer.add_configuration(otel_env, otel_value, "env_var")
elif otel_env == "OTEL_METRICS_EXPORTER":
# defer validation to validate_and_report_otel_metrics_exporter_enabled
elif otel_env in ["OTEL_LOGS_EXPORTER", "OTEL_METRICS_EXPORTER"]:
# defer validation to validate_and_report_otel_exporter_enabled
pass


def validate_and_report_otel_metrics_exporter_enabled():
metrics_exporter_enabled = True
def validate_and_report_otel_exporter_enabled(exporter_type: str):
exporter_type = exporter_type.upper()
exporter_env = f"OTEL_{exporter_type}_EXPORTER"
if exporter_type not in ["LOGS", "METRICS"]:
log.error(
"Validating invalid exporter type: %s. Exporter type must be either 'LOGS' or 'METRICS'.",
exporter_type,
)
return False
exporter_enabled = True
user_envs = {key.upper(): value for key, value in os.environ.items()}
if "OTEL_METRICS_EXPORTER" in user_envs:
otel_value = os.environ.get("OTEL_METRICS_EXPORTER", "otlp").lower()
if exporter_env in user_envs:
otel_value = os.environ.get(exporter_env, "otlp").lower()
if otel_value == "none":
metrics_exporter_enabled = False
exporter_enabled = False
elif otel_value != "otlp":
_invalid_otel_config("OTEL_METRICS_EXPORTER")

_invalid_otel_config(exporter_env)
# Report to configuration telemetry
telemetry_writer.add_configuration("OTEL_METRICS_EXPORTER", otel_value, "env_var")

return metrics_exporter_enabled
telemetry_writer.add_configuration(exporter_env, otel_value, "env_var")
return exporter_enabled


def _hiding_otel_config(otel_env, dd_env):
Expand Down
18 changes: 9 additions & 9 deletions ddtrace/settings/_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
from ddtrace.internal.serverless import in_azure_function
from ddtrace.internal.serverless import in_gcp_function
from ddtrace.internal.telemetry import telemetry_writer
from ddtrace.internal.telemetry import validate_and_report_otel_metrics_exporter_enabled
from ddtrace.internal.telemetry import validate_and_report_otel_exporter_enabled
from ddtrace.internal.telemetry import validate_otel_envs
from ddtrace.internal.utils.cache import cachedmethod

Expand Down Expand Up @@ -534,10 +534,9 @@ def __init__(self):
self._telemetry_heartbeat_interval = _get_config("DD_TELEMETRY_HEARTBEAT_INTERVAL", 60, float)
self._telemetry_dependency_collection = _get_config("DD_TELEMETRY_DEPENDENCY_COLLECTION_ENABLED", True, asbool)

self._runtime_metrics_enabled = (
_get_config("DD_RUNTIME_METRICS_ENABLED", False, asbool)
and validate_and_report_otel_metrics_exporter_enabled()
)
self._runtime_metrics_enabled = _get_config(
"DD_RUNTIME_METRICS_ENABLED", False, asbool
) and validate_and_report_otel_exporter_enabled("metrics")
self._runtime_metrics_runtime_id_enabled = _get_config(
["DD_TRACE_EXPERIMENTAL_RUNTIME_ID_ENABLED", "DD_RUNTIME_METRICS_RUNTIME_ID_ENABLED"], False, asbool
)
Expand Down Expand Up @@ -630,11 +629,12 @@ def __init__(self):
"DD_CIVISIBILITY_EARLY_FLAKE_DETECTION_ENABLED", True, asbool
)
self._otel_trace_enabled = _get_config("DD_TRACE_OTEL_ENABLED", False, asbool, "OTEL_SDK_DISABLED")
self._otel_metrics_enabled = (
_get_config("DD_METRICS_OTEL_ENABLED", False, asbool, "OTEL_SDK_DISABLED")
and validate_and_report_otel_metrics_exporter_enabled()
self._otel_metrics_enabled = _get_config(
"DD_METRICS_OTEL_ENABLED", validate_and_report_otel_exporter_enabled("metrics"), asbool, "OTEL_SDK_DISABLED"
)
self._otel_logs_enabled = _get_config(
"DD_LOGS_OTEL_ENABLED", validate_and_report_otel_exporter_enabled("logs"), asbool, "OTEL_SDK_DISABLED"
)
self._otel_logs_enabled = _get_config("DD_LOGS_OTEL_ENABLED", False, asbool, "OTEL_SDK_DISABLED")
if self._otel_trace_enabled or self._otel_logs_enabled or self._otel_metrics_enabled:
# Replaces the default otel api runtime context with DDRuntimeContext
# https://github.com/open-telemetry/opentelemetry-python/blob/v1.16.0/opentelemetry-api/src/opentelemetry/context/__init__.py#L53
Expand Down
9 changes: 8 additions & 1 deletion tests/opentelemetry/test_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,7 @@ def test_otel_metrics_exporter_configuration_none():
assert config._runtime_metrics_enabled is False, config._runtime_metrics_enabled


@pytest.mark.subprocess(env={"DD_METRICS_OTEL_ENABLED": "True", "OTEL_METRICS_EXPORTER": "otlp"})
@pytest.mark.subprocess(parametrize={"DD_METRICS_OTEL_ENABLED": ["True", None]}, env={"OTEL_METRICS_EXPORTER": "otlp"})
def test_otel_metrics_exporter_configuration_otlp():
from ddtrace import config

Expand All @@ -234,6 +234,13 @@ def test_otel_metrics_exporter_configuration_unsupported_exporter():
assert config._runtime_metrics_enabled is False, config._runtime_metrics_enabled


@pytest.mark.subprocess(parametrize={"DD_LOGS_OTEL_ENABLED": ["True", None]}, env={"OTEL_LOGS_EXPORTER": "otlp"})
def test_otel_logs_exporter_configuration_otlp():
from ddtrace import config

assert config._otel_logs_enabled is True, config._otel_logs_enabled


@pytest.mark.subprocess(
env={"OTEL_LOGS_EXPORTER": "console"},
err=b"Setting OTEL_LOGS_EXPORTER to console is not supported by ddtrace, this configuration will be ignored.\n",
Expand Down
Loading