From 673fd7e25724e637b465577741316350eef038e7 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Tue, 26 Nov 2024 22:01:06 -0800 Subject: [PATCH 1/3] dd logger, inherit from .envs --- litellm/integrations/datadog/datadog.py | 44 ++++++++++++++++++------- litellm/proxy/proxy_config.yaml | 2 +- 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/litellm/integrations/datadog/datadog.py b/litellm/integrations/datadog/datadog.py index 42d9a38d6..763f6bbc1 100644 --- a/litellm/integrations/datadog/datadog.py +++ b/litellm/integrations/datadog/datadog.py @@ -279,11 +279,11 @@ class DataDogLogger(CustomBatchLogger): verbose_logger.debug("Datadog: Logger - Logging payload = %s", json_payload) dd_payload = DatadogPayload( - ddsource=os.getenv("DD_SOURCE", "litellm"), - ddtags="", - hostname="", + ddsource=self._get_datadog_source(), + ddtags=self._get_datadog_tags(), + hostname=self._get_datadog_hostname(), message=json_payload, - service="litellm-server", + service=self._get_datadog_service(), status=status, ) return dd_payload @@ -387,11 +387,11 @@ class DataDogLogger(CustomBatchLogger): json_payload = json.dumps(_exception_payload) verbose_logger.debug("Datadog: Logger - Logging payload = %s", json_payload) dd_payload = DatadogPayload( - ddsource=os.getenv("DD_SOURCE", "litellm"), - ddtags="", - hostname="", + ddsource=self._get_datadog_source(), + ddtags=self._get_datadog_tags(), + hostname=self._get_datadog_hostname(), message=json_payload, - service="litellm-server", + service=self._get_datadog_service(), status=DataDogStatus.ERROR, ) @@ -473,11 +473,31 @@ class DataDogLogger(CustomBatchLogger): verbose_logger.debug("Datadog: Logger - Logging payload = %s", json_payload) dd_payload = DatadogPayload( - ddsource=os.getenv("DD_SOURCE", "litellm"), - ddtags="", - hostname="", + ddsource=self._get_datadog_source(), + ddtags=self._get_datadog_tags(), + hostname=self._get_datadog_hostname(), message=json_payload, - service="litellm-server", + service=self._get_datadog_service(), status=DataDogStatus.INFO, ) return dd_payload + + @staticmethod + def _get_datadog_tags(): + return f"env:{os.getenv('DD_ENV', 'unknown')},service:{os.getenv('DD_SERVICE', 'litellm')},version:{os.getenv('DD_VERSION', 'unknown')}" + + @staticmethod + def _get_datadog_source(): + return os.getenv("DD_SOURCE", "litellm") + + @staticmethod + def _get_datadog_service(): + return os.getenv("DD_SERVICE", "litellm") + + @staticmethod + def _get_datadog_hostname(): + return "" + + @staticmethod + def _get_datadog_env(): + return os.getenv("DD_ENV", "unknown") diff --git a/litellm/proxy/proxy_config.yaml b/litellm/proxy/proxy_config.yaml index aad190fb7..968cb8b39 100644 --- a/litellm/proxy/proxy_config.yaml +++ b/litellm/proxy/proxy_config.yaml @@ -2,4 +2,4 @@ include: - model_config.yaml litellm_settings: - callbacks: ["prometheus"] \ No newline at end of file + callbacks: ["datadog"] From 9ee19cde390352292c33d84b10d524a98bd72467 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Tue, 26 Nov 2024 22:06:11 -0800 Subject: [PATCH 2/3] test_datadog_payload_environment_variables --- tests/logging_callback_tests/test_datadog.py | 44 ++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/tests/logging_callback_tests/test_datadog.py b/tests/logging_callback_tests/test_datadog.py index 43af1b53b..53667460e 100644 --- a/tests/logging_callback_tests/test_datadog.py +++ b/tests/logging_callback_tests/test_datadog.py @@ -422,3 +422,47 @@ async def test_datadog_post_call_failure_hook(): except Exception as e: pytest.fail(f"Test failed with exception: {str(e)}") + + +@pytest.mark.asyncio +async def test_datadog_payload_environment_variables(): + """Test that DataDog payload correctly includes environment variables in the payload structure""" + try: + # Set test environment variables + test_env = { + "DD_ENV": "test-env", + "DD_SERVICE": "test-service", + "DD_VERSION": "1.0.0", + "DD_SOURCE": "test-source", + "DD_API_KEY": "fake-key", + "DD_SITE": "datadoghq.com", + } + + with patch.dict(os.environ, test_env): + dd_logger = DataDogLogger() + standard_payload = create_standard_logging_payload() + + # Create the payload + dd_payload = dd_logger.create_datadog_logging_payload( + kwargs={"standard_logging_object": standard_payload}, + response_obj=None, + start_time=datetime.now(), + end_time=datetime.now(), + ) + + print("dd payload=", json.dumps(dd_payload, indent=2)) + + # Verify payload structure and environment variables + assert ( + dd_payload["ddsource"] == "test-source" + ), "Incorrect source in payload" + assert ( + dd_payload["service"] == "test-service" + ), "Incorrect service in payload" + assert ( + dd_payload["ddtags"] + == "env:test-env,service:test-service,version:1.0.0" + ), "Incorrect tags in payload" + + except Exception as e: + pytest.fail(f"Test failed with exception: {str(e)}") From 8479ab95b3c3f80c14fe289173e0cc1d8071b112 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Tue, 26 Nov 2024 22:07:37 -0800 Subject: [PATCH 3/3] fix _get_datadog_service --- litellm/integrations/datadog/datadog.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litellm/integrations/datadog/datadog.py b/litellm/integrations/datadog/datadog.py index 763f6bbc1..482c2bc10 100644 --- a/litellm/integrations/datadog/datadog.py +++ b/litellm/integrations/datadog/datadog.py @@ -492,7 +492,7 @@ class DataDogLogger(CustomBatchLogger): @staticmethod def _get_datadog_service(): - return os.getenv("DD_SERVICE", "litellm") + return os.getenv("DD_SERVICE", "litellm-server") @staticmethod def _get_datadog_hostname():