{"record":{"id":"10fba62a9bd0dc2a","repo":"BerriAI/litellm","slug":"dd-site-is-not-set-set-dd-site-example-sit","errorCode":null,"errorMessage":"DD_SITE is not set, set 'DD_SITE=<>', example sit = `us5.datadoghq.com`","messagePattern":"DD_SITE is not set, set 'DD_SITE=<>', example sit = `us5\\.datadoghq\\.com`","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"litellm/integrations/datadog/datadog_llm_obs.py","lineNumber":73,"sourceCode":"                create_mock_datadog_client()\n                verbose_logger.debug(\"[DATADOG MOCK] DataDogLLMObs logger initialized in mock mode\")\n\n            # Configure DataDog endpoint (Agent or Direct API)\n            # Use LITELLM_DD_AGENT_HOST to avoid conflicts with ddtrace's DD_AGENT_HOST\n            # Check for agent mode FIRST - agent mode doesn't require DD_API_KEY or DD_SITE\n            dd_agent_host: Final = os.getenv(\"LITELLM_DD_AGENT_HOST\")\n\n            self.async_client = get_async_httpx_client(llm_provider=httpxSpecialProvider.LoggingCallback)\n            self.DD_API_KEY = os.getenv(\"DD_API_KEY\")\n\n            if dd_agent_host:\n                self._configure_dd_agent(dd_agent_host=dd_agent_host)\n            else:\n                # Only require DD_API_KEY and DD_SITE for direct API mode\n                if os.getenv(\"DD_API_KEY\", None) is None:\n                    raise Exception(\"DD_API_KEY is not set, set 'DD_API_KEY=<>'\")\n                if os.getenv(\"DD_SITE\", None) is None:\n                    raise Exception(\"DD_SITE is not set, set 'DD_SITE=<>', example sit = `us5.datadoghq.com`\")\n                self._configure_dd_direct_api()\n\n            # Optional override for testing\n            dd_base_url: Final = get_datadog_base_url_from_env()\n            if dd_base_url:\n                self.intake_url = f\"{dd_base_url}/api/intake/llm-obs/v1/trace/spans\"\n\n            asyncio.create_task(self.periodic_flush())\n            self.flush_lock = asyncio.Lock()\n            self.log_queue: list[LLMObsPayload] = []\n\n            #########################################################\n            # Handle datadog_llm_observability_params set as litellm.datadog_llm_observability_params\n            #########################################################\n            dict_datadog_llm_obs_params: Final = self._get_datadog_llm_obs_params()\n            kwargs.update(dict_datadog_llm_obs_params)\n            CustomBatchLogger.__init__(self, **kwargs, flush_lock=self.flush_lock)\n        except Exception as e:","sourceCodeStart":55,"sourceCodeEnd":91,"githubUrl":"https://github.com/BerriAI/litellm/blob/77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8/litellm/integrations/datadog/datadog_llm_obs.py#L55-L91","documentation":"Second guard in DataDogLLMObsLogger.__init__ direct-API branch: when LITELLM_DD_AGENT_HOST is unset and DD_API_KEY exists but DD_SITE does not, construction fails with this Exception. DD_SITE selects the Datadog region (e.g. us5.datadoghq.com) used to build the intake URL, so direct mode refuses to guess a default region.","triggerScenarios":"Setting only DD_API_KEY because the account is on a non-default region (us5, eu1) and assuming us1 defaults; env file with DD_SITE misspelled or never exported; agent-mode deployment missing LITELLM_DD_AGENT_HOST so it accidentally enters direct mode with a key but no site.","commonSituations":"Copy-pasting Datadog docs that only mention the key; region-specific accounts (app.us5.datadoghq.com) where developers don't realize DD_SITE is mandatory; docker/k8s env stripped during deployment.","solutions":["Export DD_SITE matching your Datadog region, e.g. DD_SITE=us5.datadoghq.com (find it in your browser URL: app.<DD_SITE>)","Pair it with DD_API_KEY and restart the process, verifying both with printenv","Prefer agent mode (LITELLM_DD_AGENT_HOST) where neither variable is required"],"exampleFix":"# before\nexport DD_API_KEY=<key>  # no DD_SITE -> Exception\n\n# after\nexport DD_API_KEY=<key>\nexport DD_SITE=us5.datadoghq.com","handlingStrategy":"validation","validationCode":"import os\n\nVALID_SITES_PREFIXES = (\"us\", \"eu\", \"ap\", \"datadoghq\")\n\ndef dd_site_ok() -> bool:\n    site = os.getenv(\"DD_SITE\")\n    return bool(site) and any(site == p or site.startswith(p + \".\") for p in VALID_SITES_PREFIXES)","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Copy DD_SITE straight from your Datadog app URL (app.<site>)","Add a startup env linter listing required vars per callback (DD_API_KEY, DD_SITE)","Document the agent-mode alternative so region vars are only needed in direct mode"],"tags":["datadog","llm-obs","env-var","initialization","configuration","region"],"backgroundTag":"missing-env-var","analyzedSha":"77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8","analyzedAt":"2026-08-18T11:44:31.656Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}