{"record":{"id":"a0764a1292cce153","repo":"BerriAI/litellm","slug":"dd-api-key-is-not-set-set-dd-api-key-a0764a","errorCode":null,"errorMessage":"DD_API_KEY is not set, set 'DD_API_KEY=<>'","messagePattern":"DD_API_KEY is not set, set 'DD_API_KEY=<>'","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"litellm/integrations/datadog/datadog_llm_obs.py","lineNumber":71,"sourceCode":"\n            if self.is_mock_mode:\n                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)","sourceCodeStart":53,"sourceCodeEnd":89,"githubUrl":"https://github.com/BerriAI/litellm/blob/6c2dcb801bf2b75c18f1bb24140e7cf57465cc4d/litellm/integrations/datadog/datadog_llm_obs.py#L53-L89","documentation":"DataDogLLMObsLogger supports two transports: an agent mode enabled by LITELLM_DD_AGENT_HOST (no credentials needed) and direct-API mode. When no agent host is configured, __init__ requires DD_API_KEY from the environment and raises this Exception if it is unset. This guards the LLM Observability trace intake, separate from the plain Datadog logs integration.","triggerScenarios":"Constructing DataDogLLMObsLogger with LITELLM_DD_AGENT_HOST unset and DD_API_KEY missing from the environment (os.getenv('DD_API_KEY', None) is None). Set LITELLM_DD_AGENT_HOST and the check is skipped entirely.","commonSituations":"Enabling datadog_llm_observability in proxy config without provisioning env vars; intending to use a local Datadog agent but setting DD_AGENT_HOST (the ddtrace variable) instead of LITELLM_DD_AGENT_HOST, so agent mode is not detected.","solutions":["Set DD_API_KEY (and DD_SITE) for direct API mode","Or set LITELLM_DD_AGENT_HOST to point at your Datadog agent, which bypasses the API-key requirement","Double-check you used LITELLM_DD_AGENT_HOST, not DD_AGENT_HOST — litellm intentionally uses a different name to avoid ddtrace conflicts"],"exampleFix":"# before\n# only DD_AGENT_HOST=localhost set -> direct mode -> raises\n\n# after (agent mode)\nexport LITELLM_DD_AGENT_HOST=localhost\n# or (direct mode)\nexport DD_API_KEY=xxx\nexport DD_SITE=us5.datadoghq.com","handlingStrategy":"validation","validationCode":"import os\n\ndef llm_obs_ready() -> bool:\n    return bool(os.getenv(\"LITELLM_DD_AGENT_HOST\")) or bool(os.getenv(\"DD_API_KEY\"))\n\nassert llm_obs_ready(), \"set LITELLM_DD_AGENT_HOST (agent) or DD_API_KEY (direct)\"","typeGuard":null,"tryCatchPattern":"try:\n    DataDogLLMObsLogger()\nexcept Exception as e:\n    if \"DD_API_KEY\" in str(e):\n        configure_agent_mode()  # or set the env var and restart\n    raise","preventionTips":["Remember the agent-host variable is LITELLM_DD_AGENT_HOST, not DD_AGENT_HOST","Choose one transport (agent vs direct) and document its env vars in the deployment manifest"],"tags":["datadog","llm-observability","env-vars","config"],"backgroundTag":null,"analyzedSha":"6c2dcb801bf2b75c18f1bb24140e7cf57465cc4d","analyzedAt":"2026-08-15T07:12:03.035Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}