diff --git a/ddtrace/internal/gitmetadata.py b/ddtrace/internal/gitmetadata.py index 5bdeee75f05..a8a0789fb51 100644 --- a/ddtrace/internal/gitmetadata.py +++ b/ddtrace/internal/gitmetadata.py @@ -1,13 +1,12 @@ import typing # noqa:F401 -from envier import Env - from ddtrace.ext.ci import _filter_sensitive_info from ddtrace.ext.git import COMMIT_SHA from ddtrace.ext.git import MAIN_PACKAGE from ddtrace.ext.git import REPOSITORY_URL from ddtrace.internal.logger import get_logger from ddtrace.internal.utils import formats +from ddtrace.settings._core import DDConfig as Env _GITMETADATA_TAGS = None # type: typing.Optional[typing.Tuple[str, str, str]] diff --git a/ddtrace/internal/remoteconfig/client.py b/ddtrace/internal/remoteconfig/client.py index bf093c40c5f..1ffcf22264c 100644 --- a/ddtrace/internal/remoteconfig/client.py +++ b/ddtrace/internal/remoteconfig/client.py @@ -19,8 +19,6 @@ from typing import Tuple import uuid -from envier import En - import ddtrace from ddtrace.internal import agent from ddtrace.internal import gitmetadata @@ -31,6 +29,7 @@ from ddtrace.internal.remoteconfig.constants import REMOTE_CONFIG_AGENT_ENDPOINT from ddtrace.internal.service import ServiceStatus from ddtrace.internal.utils.time import parse_isoformat +from ddtrace.settings._core import DDConfig as En from ..utils.formats import parse_tags_str from ..utils.version import _pep440_to_semver diff --git a/ddtrace/settings/_core.py b/ddtrace/settings/_core.py index 7b56dc7c258..7ad2cdbbbd4 100644 --- a/ddtrace/settings/_core.py +++ b/ddtrace/settings/_core.py @@ -1,10 +1,14 @@ +from collections import ChainMap import os from typing import Any # noqa:F401 from typing import Callable # noqa:F401 +from typing import Dict # noqa:F401 from typing import List # noqa:F401 from typing import Optional # noqa:F401 from typing import Union # noqa:F401 +from envier import Env + from ddtrace.internal.native import get_configuration_from_disk from ._otel_remapper import parse_otel_env @@ -13,6 +17,22 @@ FLEET_CONFIG, LOCAL_CONFIG = get_configuration_from_disk() +class DDConfig(Env): + """Provides support for loading configurations from multiple sources.""" + + def __init__( + self, + source: Optional[Dict[str, str]] = None, + parent: Optional["Env"] = None, + dynamic: Optional[Dict[str, str]] = None, + ) -> None: + self.fleet_source = FLEET_CONFIG + self.local_source = LOCAL_CONFIG + # Order of precedence: local stable config < environment variables < fleet stable config < provided source + source = ChainMap(source or {}, self.fleet_source, os.environ, self.local_source) # type: ignore + super().__init__(source=source, parent=parent, dynamic=dynamic) + + def get_config( envs: Union[str, List[str]], default: Any = None, @@ -37,7 +57,7 @@ def get_config( if env in FLEET_CONFIG: source = "fleet_stable_config" effective_env = env - val = FLEET_CONFIG[env]["value"] + val = FLEET_CONFIG[env] break # Get configurations from datadog env vars if val is None: @@ -61,7 +81,7 @@ def get_config( if env in LOCAL_CONFIG: source = "local_stable_config" effective_env = env - val = LOCAL_CONFIG[env]["value"] + val = LOCAL_CONFIG[env] break # Convert the raw value to expected format, if a modifier is provided if val is not None and modifier: diff --git a/ddtrace/settings/_database_monitoring.py b/ddtrace/settings/_database_monitoring.py index e37a7c6d50d..7ee3aab61a0 100644 --- a/ddtrace/settings/_database_monitoring.py +++ b/ddtrace/settings/_database_monitoring.py @@ -1,6 +1,7 @@ -from envier import En from envier import validators +from ddtrace.settings._core import DDConfig as En + class DatabaseMonitoringConfig(En): __prefix__ = "dd_dbm" diff --git a/ddtrace/settings/_telemetry.py b/ddtrace/settings/_telemetry.py index 1ca284b911f..a3cfe38cfb4 100644 --- a/ddtrace/settings/_telemetry.py +++ b/ddtrace/settings/_telemetry.py @@ -1,7 +1,7 @@ import os from typing import Any # noqa:F401 -from envier import Env +from ddtrace.settings._core import DDConfig as Env from ..internal.logger import get_logger from ..internal.telemetry import telemetry_writer diff --git a/ddtrace/settings/asm.py b/ddtrace/settings/asm.py index 42e8bfdb61a..a6b2c514019 100644 --- a/ddtrace/settings/asm.py +++ b/ddtrace/settings/asm.py @@ -6,8 +6,6 @@ from typing import List from typing import Optional -from envier import Env - from ddtrace import config as tracer_config from ddtrace.appsec._constants import API_SECURITY from ddtrace.appsec._constants import APPSEC @@ -19,6 +17,7 @@ from ddtrace.constants import APPSEC_ENV from ddtrace.internal import core from ddtrace.internal.serverless import in_aws_lambda +from ddtrace.settings._core import DDConfig as Env from ddtrace.settings._telemetry import report_telemetry as _report_telemetry diff --git a/ddtrace/settings/code_origin.py b/ddtrace/settings/code_origin.py index 919e01bd02b..0d74b87ead9 100644 --- a/ddtrace/settings/code_origin.py +++ b/ddtrace/settings/code_origin.py @@ -1,4 +1,4 @@ -from envier import En +from ddtrace.settings._core import DDConfig as En class CodeOriginConfig(En): diff --git a/ddtrace/settings/crashtracker.py b/ddtrace/settings/crashtracker.py index 51dc02ac6ac..cc433cc5b98 100644 --- a/ddtrace/settings/crashtracker.py +++ b/ddtrace/settings/crashtracker.py @@ -1,8 +1,7 @@ import typing as t -from envier import En - from ddtrace.internal.utils.formats import parse_tags_str +from ddtrace.settings._core import DDConfig as En from ddtrace.settings._telemetry import report_telemetry as _report_telemetry diff --git a/ddtrace/settings/dynamic_instrumentation.py b/ddtrace/settings/dynamic_instrumentation.py index 7e7e5792f94..255fd789bb5 100644 --- a/ddtrace/settings/dynamic_instrumentation.py +++ b/ddtrace/settings/dynamic_instrumentation.py @@ -1,13 +1,12 @@ import re import typing as t -from envier import En - from ddtrace import config as ddconfig from ddtrace.internal import gitmetadata from ddtrace.internal.agent import get_trace_url from ddtrace.internal.constants import DEFAULT_SERVICE_NAME from ddtrace.internal.utils.config import get_application_name +from ddtrace.settings._core import DDConfig as En from ddtrace.settings._telemetry import report_telemetry as _report_telemetry from ddtrace.version import get_version diff --git a/ddtrace/settings/exception_replay.py b/ddtrace/settings/exception_replay.py index 60faf142fce..2f0c9a33517 100644 --- a/ddtrace/settings/exception_replay.py +++ b/ddtrace/settings/exception_replay.py @@ -1,5 +1,4 @@ -from envier import En - +from ddtrace.settings._core import DDConfig as En from ddtrace.settings._telemetry import report_telemetry as _report_telemetry diff --git a/ddtrace/settings/live_debugging.py b/ddtrace/settings/live_debugging.py index b9183ae0a77..0ce78167e16 100644 --- a/ddtrace/settings/live_debugging.py +++ b/ddtrace/settings/live_debugging.py @@ -1,4 +1,4 @@ -from envier import En +from ddtrace.settings._core import DDConfig as En class LiveDebuggerConfig(En): diff --git a/ddtrace/settings/profiling.py b/ddtrace/settings/profiling.py index 423801c452c..898220cbca5 100644 --- a/ddtrace/settings/profiling.py +++ b/ddtrace/settings/profiling.py @@ -3,8 +3,6 @@ import os import typing as t -from envier import En - from ddtrace import config as core_config from ddtrace.ext.git import COMMIT_SHA from ddtrace.ext.git import MAIN_PACKAGE @@ -13,6 +11,7 @@ from ddtrace.internal import gitmetadata from ddtrace.internal.logger import get_logger from ddtrace.internal.utils.formats import parse_tags_str +from ddtrace.settings._core import DDConfig as En from ddtrace.settings._telemetry import report_telemetry as _report_telemetry diff --git a/ddtrace/settings/symbol_db.py b/ddtrace/settings/symbol_db.py index 774db07f5c4..87573067c31 100644 --- a/ddtrace/settings/symbol_db.py +++ b/ddtrace/settings/symbol_db.py @@ -1,7 +1,6 @@ import re -from envier import En - +from ddtrace.settings._core import DDConfig as En from ddtrace.settings._telemetry import report_telemetry as _report_telemetry diff --git a/ddtrace/settings/third_party.py b/ddtrace/settings/third_party.py index 3416be1d524..300bf401a66 100644 --- a/ddtrace/settings/third_party.py +++ b/ddtrace/settings/third_party.py @@ -1,4 +1,4 @@ -from envier import En +from ddtrace.settings._core import DDConfig as En class ThirdPartyDetectionConfig(En):