[Bug fix] - Error creating standard logging object - can't register atexit after shutdownLitellm fixes standard logging payload (#13436)

* fix: _generate_cold_storage_object_key

* _get_configured_cold_storage_custom_logger

* test_e2e_generate_cold_storage_object_key_runtime_error_handled
This commit is contained in:
Ishaan Jaff 2025-08-08 12:38:26 -07:00 • committed by GitHub
parent 4fdc866fcb
commit 3b65733af8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 64 additions and 7 deletions

View file

@ -4106,7 +4106,16 @@ class StandardLoggingPayloadSetup:
from litellm.proxy.spend_tracking.cold_storage_handler import ColdStorageHandler
# Only generate object key if cold storage is configured
configured_cold_storage_logger = ColdStorageHandler._get_configured_cold_storage_custom_logger()
try:
configured_cold_storage_logger = (
ColdStorageHandler._get_configured_cold_storage_custom_logger()
)
except Exception as e:
verbose_logger.debug(
f"Cold storage custom logger unavailable: {e}"
)
return None
if configured_cold_storage_logger is None:
return None

View file

@ -64,10 +64,31 @@ class ColdStorageHandler:
@staticmethod
def _get_configured_cold_storage_custom_logger() -> Optional[_custom_logger_compatible_callbacks_literal]:
from litellm.proxy.proxy_server import general_settings
cold_storage_custom_logger: Optional[str] = general_settings.get("cold_storage_custom_logger")
if not cold_storage_custom_logger:
verbose_proxy_logger.debug("No cold storage custom logger found in general settings")
"""Return the configured cold storage custom logger.
During interpreter shutdown importing ``proxy_server`` can raise a
``RuntimeError`` (e.g. "can't register atexit after shutdown").
In these scenarios we gracefully return ``None`` instead of bubbling
the exception up the call stack.
"""
try:
from litellm.proxy.proxy_server import general_settings
except Exception as e:
verbose_proxy_logger.debug(
f"Unable to import proxy_server for cold storage logging: {e}"
)
return None
return cast(_custom_logger_compatible_callbacks_literal, cold_storage_custom_logger)
cold_storage_custom_logger: Optional[str] = general_settings.get(
"cold_storage_custom_logger"
)
if not cold_storage_custom_logger:
verbose_proxy_logger.debug(
"No cold storage custom logger found in general settings"
)
return None
return cast(
_custom_logger_compatible_callbacks_literal, cold_storage_custom_logger
)

View file

@ -464,3 +464,30 @@ async def test_e2e_generate_cold_storage_object_key_not_configured():
# Verify the result is None when cold storage is not configured
assert result is None
@pytest.mark.asyncio
async def test_e2e_generate_cold_storage_object_key_runtime_error_handled():
"""Ensure runtime errors while loading cold storage logger are ignored."""
from datetime import datetime, timezone
from unittest.mock import patch
from litellm.litellm_core_utils.litellm_logging import StandardLoggingPayloadSetup
start_time = datetime(2025, 1, 15, 10, 30, 45, 123456, timezone.utc)
response_id = "chatcmpl-test-runtime"
team_alias = "team"
with patch(
"litellm.proxy.spend_tracking.cold_storage_handler.ColdStorageHandler._get_configured_cold_storage_custom_logger",
side_effect=RuntimeError("can't register atexit after shutdown"),
):
result = StandardLoggingPayloadSetup._generate_cold_storage_object_key(
start_time=start_time,
response_id=response_id,
team_alias=team_alias,
)
# When an exception occurs retrieving the cold storage logger, the
# function should return None instead of raising.
assert result is None