From fa9f3ae4e7c562afadd77c43b73f915aded6e1f0 Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Fri, 28 Feb 2025 10:54:16 -0800 Subject: [PATCH] track error info in metadata --- litellm/litellm_core_utils/litellm_logging.py | 17 +++++++++++++++++ litellm/proxy/_types.py | 2 ++ .../proxy/hooks/proxy_track_cost_callback.py | 8 ++++++++ .../spend_tracking/spend_tracking_utils.py | 1 + litellm/types/utils.py | 3 +++ 5 files changed, 31 insertions(+) diff --git a/litellm/litellm_core_utils/litellm_logging.py b/litellm/litellm_core_utils/litellm_logging.py index 4d082e29ad1..a1a78f16502 100644 --- a/litellm/litellm_core_utils/litellm_logging.py +++ b/litellm/litellm_core_utils/litellm_logging.py @@ -3114,10 +3114,27 @@ class StandardLoggingPayloadSetup: str(original_exception.__class__.__name__) if original_exception else "" ) _llm_provider_in_exception = getattr(original_exception, "llm_provider", "") + + # Get traceback information (first 100 lines) + traceback_info = "" + if original_exception: + tb = getattr(original_exception, "__traceback__", None) + if tb: + import traceback + + tb_lines = traceback.format_tb(tb) + traceback_info = "".join(tb_lines[:100]) # Limit to first 100 lines + + # Get additional error details + error_message = str(original_exception) + return StandardLoggingPayloadErrorInformation( error_code=error_status, error_class=error_class, llm_provider=_llm_provider_in_exception, + traceback=traceback_info, + status_code=getattr(original_exception, "status_code", None), + error_message=error_message if original_exception else "", ) @staticmethod diff --git a/litellm/proxy/_types.py b/litellm/proxy/_types.py index b66019ace10..1b5faf3f9c4 100644 --- a/litellm/proxy/_types.py +++ b/litellm/proxy/_types.py @@ -26,6 +26,7 @@ from litellm.types.utils import ( ModelResponse, ProviderField, StandardCallbackDynamicParams, + StandardLoggingPayloadErrorInformation, StandardLoggingPayloadStatus, StandardPassThroughResponseObject, TextCompletionResponse, @@ -1856,6 +1857,7 @@ class SpendLogsMetadata(TypedDict): requester_ip_address: Optional[str] applied_guardrails: Optional[List[str]] status: StandardLoggingPayloadStatus + error_information: Optional[StandardLoggingPayloadErrorInformation] class SpendLogsPayload(TypedDict): diff --git a/litellm/proxy/hooks/proxy_track_cost_callback.py b/litellm/proxy/hooks/proxy_track_cost_callback.py index eadd94586ea..60bf3864731 100644 --- a/litellm/proxy/hooks/proxy_track_cost_callback.py +++ b/litellm/proxy/hooks/proxy_track_cost_callback.py @@ -11,10 +11,12 @@ from litellm.litellm_core_utils.core_helpers import ( _get_parent_otel_span_from_kwargs, get_litellm_metadata_from_kwargs, ) +from litellm.litellm_core_utils.litellm_logging import StandardLoggingPayloadSetup from litellm.proxy._types import UserAPIKeyAuth from litellm.proxy.auth.auth_checks import log_db_metrics from litellm.types.utils import ( StandardLoggingPayload, + StandardLoggingPayloadErrorInformation, StandardLoggingUserAPIKeyMetadata, ) from litellm.utils import get_end_user_id_for_cost_tracking @@ -48,6 +50,12 @@ class _ProxyDBLogger(CustomLogger): ) _metadata["user_api_key"] = user_api_key_dict.api_key _metadata["status"] = "failure" + _metadata["error_information"] = ( + StandardLoggingPayloadSetup.get_error_information( + original_exception=original_exception, + ) + ) + existing_metadata: dict = request_data.get("metadata", None) or {} existing_metadata.update(_metadata) existing_metadata["proxy_server_request"] = ( diff --git a/litellm/proxy/spend_tracking/spend_tracking_utils.py b/litellm/proxy/spend_tracking/spend_tracking_utils.py index 54b419afba4..7c15a5e1773 100644 --- a/litellm/proxy/spend_tracking/spend_tracking_utils.py +++ b/litellm/proxy/spend_tracking/spend_tracking_utils.py @@ -48,6 +48,7 @@ def _get_spend_logs_metadata( additional_usage_values=None, applied_guardrails=None, status=None or "success", + error_information=None, ) verbose_proxy_logger.debug( "getting payload for SpendLogs, available keys in metadata: " diff --git a/litellm/types/utils.py b/litellm/types/utils.py index 8fadb93ee08..c8b8d2b5a10 100644 --- a/litellm/types/utils.py +++ b/litellm/types/utils.py @@ -1606,6 +1606,9 @@ class StandardLoggingPayloadErrorInformation(TypedDict, total=False): error_code: Optional[str] error_class: Optional[str] llm_provider: Optional[str] + traceback: Optional[str] + status_code: Optional[int] + error_message: Optional[str] class StandardLoggingGuardrailInformation(TypedDict, total=False):