{"record":{"id":"00318ef914e79018","repo":"BerriAI/litellm","slug":"dd-site-is-not-set-set-dd-site-example-site","errorCode":null,"errorMessage":"DD_SITE is not set, set 'DD_SITE=<>', example site = `us5.datadoghq.com`","messagePattern":"DD_SITE is not set, set 'DD_SITE=<>', example site = `us5\\.datadoghq\\.com`","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"litellm/integrations/datadog/datadog_llm_obs.py","lineNumber":117,"sourceCode":"        # When using the Agent, LLM Observability Intake does NOT require the API Key\n        # Reference: https://docs.datadoghq.com/llm_observability/setup/sdk/#agent-setup\n\n        # Use specific port for LLM Obs (Trace Agent) to avoid conflict with Logs Agent (10518)\n        agent_port: Final = os.getenv(\"LITELLM_DD_LLM_OBS_PORT\", \"8126\")\n        self.DD_SITE = \"localhost\"  # Not used for URL construction in agent mode\n        self.intake_url = f\"http://{dd_agent_host}:{agent_port}/api/intake/llm-obs/v1/trace/spans\"\n        verbose_logger.debug(\"DataDogLLMObs: Using DD Agent at %s\", self.intake_url)\n\n    def _configure_dd_direct_api(self):\n        \"\"\"\n        Configure the Datadog logger to send traces directly to the Datadog API.\n        \"\"\"\n        if not self.DD_API_KEY:\n            raise Exception(\"DD_API_KEY is not set, set 'DD_API_KEY=<>'\")\n\n        self.DD_SITE = os.getenv(\"DD_SITE\")\n        if not self.DD_SITE:\n            raise Exception(\"DD_SITE is not set, set 'DD_SITE=<>', example site = `us5.datadoghq.com`\")\n\n        self.intake_url = f\"https://api.{self.DD_SITE}/api/intake/llm-obs/v1/trace/spans\"\n\n    def _get_datadog_llm_obs_params(self) -> dict:\n        \"\"\"\n        Get the datadog_llm_observability_params from litellm.datadog_llm_observability_params\n\n        These are params specific to initializing the DataDogLLMObsLogger e.g. turn_off_message_logging\n        \"\"\"\n        dict_datadog_llm_obs_params: dict = {}\n        if litellm.datadog_llm_observability_params is not None:\n            if isinstance(litellm.datadog_llm_observability_params, DatadogLLMObsInitParams):\n                dict_datadog_llm_obs_params = litellm.datadog_llm_observability_params.model_dump()\n            elif isinstance(litellm.datadog_llm_observability_params, dict):\n                # only allow params that are of DatadogLLMObsInitParams\n                dict_datadog_llm_obs_params = DatadogLLMObsInitParams(\n                    **litellm.datadog_llm_observability_params\n                ).model_dump()","sourceCodeStart":99,"sourceCodeEnd":135,"githubUrl":"https://github.com/BerriAI/litellm/blob/6c2dcb801bf2b75c18f1bb24140e7cf57465cc4d/litellm/integrations/datadog/datadog_llm_obs.py#L99-L135","documentation":"Same truthiness re-validation as 373 but for the site: __init__ only rejects a None DD_SITE (line 72), so an empty-string DD_SITE passes and later fails in _configure_dd_direct_api() with 'not self.DD_SITE'. The message here includes a correct example ('example site = us5.datadoghq.com'). Surfaced at construction time in direct-API mode.","triggerScenarios":"DD_SITE exported as an empty string (or stripped to empty) while running DataDogLLMObsLogger in direct API mode without LITELLM_DD_AGENT_HOST.","commonSituations":"Env templating that renders empty values for unset vars; yaml/docker-compose interpolating a missing variable as ''; copy-paste .env files with the value deleted but the key left in.","solutions":["Set DD_SITE to your actual Datadog site (non-empty)","Audit .env / compose files for keys with empty values and remove or fill them","Prefer agent mode (LITELLM_DD_AGENT_HOST) when direct-API env management is error-prone"],"exampleFix":"# before\n# docker-compose.yml\nenvironment:\n  - DD_SITE=${DD_SITE}   # DD_SITE undefined -> empty string\n\n# after\nenvironment:\n  - DD_SITE=${DD_SITE:-us5.datadoghq.com}","handlingStrategy":"validation","validationCode":"import os\n\nsite = os.getenv(\"DD_SITE\")\nassert site and site.strip(), \"DD_SITE is empty — fix compose interpolation or .env\"\n","typeGuard":null,"tryCatchPattern":"try:\n    DataDogLLMObsLogger()\nexcept Exception as e:\n    if \"DD_SITE\" in str(e):\n        set_default_site(\"us5.datadoghq.com\")\n    raise","preventionTips":["Use ${VAR:-default} in compose files instead of raw ${VAR} for required vars","Run config validation (empty-value check) in CI for all deployment manifests"],"tags":["datadog","llm-observability","env-vars","empty-value"],"backgroundTag":null,"analyzedSha":"6c2dcb801bf2b75c18f1bb24140e7cf57465cc4d","analyzedAt":"2026-08-15T07:12:03.035Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}