From 179af2e7d1e6886c8542f5be151d5d8670c63abe Mon Sep 17 00:00:00 2001 From: rzeta-10 Date: Mon, 23 Mar 2026 22:29:07 +0530 Subject: [PATCH] Refactor AktoLogger payload handling and improve health check error messaging --- litellm/integrations/akto/akto_logger.py | 4 ++-- .../proxy/health_endpoints/_health_endpoints.py | 2 +- .../logging_callback_tests/test_akto_logger.py | 17 +++++++++-------- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/litellm/integrations/akto/akto_logger.py b/litellm/integrations/akto/akto_logger.py index 2aa441c44c5..577ba81e1d2 100644 --- a/litellm/integrations/akto/akto_logger.py +++ b/litellm/integrations/akto/akto_logger.py @@ -150,7 +150,7 @@ class AktoLogger(CustomLogger): "requestPayload": json.dumps(request_body), "responsePayload": response_payload, "ip": self.extract_client_ip(data), - "destIp": "127.0.0.1", + "destIp": "127.0.0.1", # standard MIRRORING format for proxy-captured traffic "time": str(int(datetime.now().timestamp() * 1000)), "statusCode": str(status_code), "type": "HTTP/1.1", @@ -175,7 +175,7 @@ class AktoLogger(CustomLogger): """Build common HTTP request kwargs for Akto API.""" return { "url": f"{self.akto_base_url}{HTTP_PROXY_PATH}", - "data": json.dumps(payload), + "json": payload, "params": {"akto_connector": AKTO_CONNECTOR_NAME, "ingest_data": "true"}, "headers": { "content-type": "application/json", diff --git a/litellm/proxy/health_endpoints/_health_endpoints.py b/litellm/proxy/health_endpoints/_health_endpoints.py index fa1ba640da4..3e05b77a4a5 100644 --- a/litellm/proxy/health_endpoints/_health_endpoints.py +++ b/litellm/proxy/health_endpoints/_health_endpoints.py @@ -355,7 +355,7 @@ async def health_services_endpoint( # noqa: PLR0915 verbose_proxy_logger.warning("Akto health check error: %s", e) return { "status": "unhealthy", - "error_message": "Akto health check failed", + "message": "Akto health check failed", } return { "status": response["status"], diff --git a/tests/logging_callback_tests/test_akto_logger.py b/tests/logging_callback_tests/test_akto_logger.py index 32824d8be5b..67a3aed5613 100644 --- a/tests/logging_callback_tests/test_akto_logger.py +++ b/tests/logging_callback_tests/test_akto_logger.py @@ -54,17 +54,18 @@ def sample_kwargs(): def test_init_requires_env_vars(): - with patch.dict(os.environ, {}, clear=True): + with patch.dict(os.environ, {}, clear=False): + os.environ.pop("AKTO_DATA_INGESTION_API_BASE", None) + os.environ.pop("AKTO_API_KEY", None) with pytest.raises(Exception, match="AKTO_DATA_INGESTION_API_BASE"): AktoLogger() def test_init_requires_api_key(): with patch.dict( - os.environ, - {"AKTO_DATA_INGESTION_API_BASE": "http://x"}, - clear=True, + os.environ, {"AKTO_DATA_INGESTION_API_BASE": "http://x"}, clear=False ): + os.environ.pop("AKTO_API_KEY", None) with pytest.raises(Exception, match="AKTO_API_KEY"): AktoLogger() @@ -194,7 +195,7 @@ async def test_async_log_success_event(logger, sample_kwargs): logger.async_http_handler.post.assert_called_once() call = logger.async_http_handler.post.call_args.kwargs assert call["params"]["ingest_data"] == "true" - payload = json.loads(call["data"]) + payload = call["json"] assert payload["statusCode"] == "200" assert ( json.loads(payload["responsePayload"])["choices"][0]["message"]["content"] @@ -214,7 +215,7 @@ async def test_async_log_failure_event(logger, sample_kwargs): ) logger.async_http_handler.post.assert_called_once() - payload = json.loads(logger.async_http_handler.post.call_args.kwargs["data"]) + payload = logger.async_http_handler.post.call_args.kwargs["json"] assert payload["statusCode"] == "500" @@ -231,7 +232,7 @@ async def test_async_log_failure_with_response_obj(logger, sample_kwargs): kwargs=sample_kwargs, response_obj=mock_resp, start_time=None, end_time=None ) - payload = json.loads(logger.async_http_handler.post.call_args.kwargs["data"]) + payload = logger.async_http_handler.post.call_args.kwargs["json"] assert payload["statusCode"] == "500" assert json.loads(payload["responsePayload"])["partial"] == "data" @@ -247,7 +248,7 @@ async def test_async_log_failure_with_status_code(logger, sample_kwargs): kwargs=sample_kwargs, response_obj=None, start_time=None, end_time=None ) - payload = json.loads(logger.async_http_handler.post.call_args.kwargs["data"]) + payload = logger.async_http_handler.post.call_args.kwargs["json"] assert payload["statusCode"] == "403"