mirror of
https://github.com/BerriAI/litellm.git
synced 2026-10-10 03:28:53 +00:00
Reformating for the linter.
This commit is contained in:
parent
e9651e2180
commit
9ff663e8bb
1 changed files with 32 additions and 25 deletions
|
|
@ -102,6 +102,7 @@ class NewRelicLogger(CustomLogger):
|
||||||
# Validate that newrelic package is available
|
# Validate that newrelic package is available
|
||||||
try:
|
try:
|
||||||
import newrelic.agent
|
import newrelic.agent
|
||||||
|
|
||||||
newrelic.agent.register_application()
|
newrelic.agent.register_application()
|
||||||
|
|
||||||
self.enabled = True
|
self.enabled = True
|
||||||
|
|
@ -151,7 +152,8 @@ class NewRelicLogger(CustomLogger):
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
from importlib.metadata import version
|
from importlib.metadata import version
|
||||||
return version('litellm')
|
|
||||||
|
return version("litellm")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
verbose_logger.warning(f"Unable to determine litellm version: {e}")
|
verbose_logger.warning(f"Unable to determine litellm version: {e}")
|
||||||
return "unknown"
|
return "unknown"
|
||||||
|
|
@ -171,6 +173,7 @@ class NewRelicLogger(CustomLogger):
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import newrelic.agent
|
import newrelic.agent
|
||||||
|
|
||||||
litellm_version = self._get_litellm_version()
|
litellm_version = self._get_litellm_version()
|
||||||
metric_name = f"Supportability/Python/ML/LiteLLM/{litellm_version}"
|
metric_name = f"Supportability/Python/ML/LiteLLM/{litellm_version}"
|
||||||
|
|
||||||
|
|
@ -187,8 +190,9 @@ class NewRelicLogger(CustomLogger):
|
||||||
f"Emitted New Relic supportability metric: {metric_name}"
|
f"Emitted New Relic supportability metric: {metric_name}"
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
verbose_logger.info("New Relic application is not enabled; skipping metric recording.")
|
verbose_logger.info(
|
||||||
|
"New Relic application is not enabled; skipping metric recording."
|
||||||
|
)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
verbose_logger.warning(f"Failed to emit supportability metric: {e}")
|
verbose_logger.warning(f"Failed to emit supportability metric: {e}")
|
||||||
|
|
@ -292,7 +296,9 @@ class NewRelicLogger(CustomLogger):
|
||||||
litellm_params = kwargs.get("litellm_params", {}) or {}
|
litellm_params = kwargs.get("litellm_params", {}) or {}
|
||||||
return litellm_params.get("custom_llm_provider", "litellm")
|
return litellm_params.get("custom_llm_provider", "litellm")
|
||||||
|
|
||||||
def _get_model_names(self, kwargs: Dict, response_obj: ModelResponse) -> Tuple[str, str]:
|
def _get_model_names(
|
||||||
|
self, kwargs: Dict, response_obj: ModelResponse
|
||||||
|
) -> Tuple[str, str]:
|
||||||
"""
|
"""
|
||||||
Extract request and response model names.
|
Extract request and response model names.
|
||||||
|
|
||||||
|
|
@ -307,16 +313,12 @@ class NewRelicLogger(CustomLogger):
|
||||||
"""Extract usage statistics from response."""
|
"""Extract usage statistics from response."""
|
||||||
usage = response_obj.get("usage", None)
|
usage = response_obj.get("usage", None)
|
||||||
if not usage:
|
if not usage:
|
||||||
return {
|
return {"prompt_tokens": 0, "completion_tokens": 0, "total_tokens": 0}
|
||||||
"prompt_tokens": 0,
|
|
||||||
"completion_tokens": 0,
|
|
||||||
"total_tokens": 0
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
"prompt_tokens": usage.get("prompt_tokens", 0),
|
"prompt_tokens": usage.get("prompt_tokens", 0),
|
||||||
"completion_tokens": usage.get("completion_tokens", 0),
|
"completion_tokens": usage.get("completion_tokens", 0),
|
||||||
"total_tokens": usage.get("total_tokens", 0)
|
"total_tokens": usage.get("total_tokens", 0),
|
||||||
}
|
}
|
||||||
|
|
||||||
def _get_finish_reason(self, response_obj: ModelResponse) -> str:
|
def _get_finish_reason(self, response_obj: ModelResponse) -> str:
|
||||||
|
|
@ -330,7 +332,9 @@ class NewRelicLogger(CustomLogger):
|
||||||
return choices[0].get("finish_reason", "unknown")
|
return choices[0].get("finish_reason", "unknown")
|
||||||
return "unknown"
|
return "unknown"
|
||||||
|
|
||||||
def _get_duration(self, kwargs: Dict, start_time: Optional[float], end_time: Optional[float]) -> Optional[float]:
|
def _get_duration(
|
||||||
|
self, kwargs: Dict, start_time: Optional[float], end_time: Optional[float]
|
||||||
|
) -> Optional[float]:
|
||||||
"""
|
"""
|
||||||
Extract duration in milliseconds.
|
Extract duration in milliseconds.
|
||||||
|
|
||||||
|
|
@ -405,7 +409,7 @@ class NewRelicLogger(CustomLogger):
|
||||||
kwargs: Dict,
|
kwargs: Dict,
|
||||||
response_obj: ModelResponse,
|
response_obj: ModelResponse,
|
||||||
response_model: str,
|
response_model: str,
|
||||||
vendor: str
|
vendor: str,
|
||||||
) -> List[Dict[str, Any]]:
|
) -> List[Dict[str, Any]]:
|
||||||
"""
|
"""
|
||||||
Extract all messages (request + response) with sequence numbers and timestamps.
|
Extract all messages (request + response) with sequence numbers and timestamps.
|
||||||
|
|
@ -428,13 +432,13 @@ class NewRelicLogger(CustomLogger):
|
||||||
"role": msg.get("role", "user"),
|
"role": msg.get("role", "user"),
|
||||||
"sequence": sequence,
|
"sequence": sequence,
|
||||||
"response.model": response_model,
|
"response.model": response_model,
|
||||||
"vendor": vendor
|
"vendor": vendor,
|
||||||
}
|
}
|
||||||
|
|
||||||
# Add timestamp for request message if available (convert to milliseconds)
|
# Add timestamp for request message if available (convert to milliseconds)
|
||||||
if start_time is not None:
|
if start_time is not None:
|
||||||
# Handle both datetime objects and float timestamps
|
# Handle both datetime objects and float timestamps
|
||||||
if hasattr(start_time, 'timestamp'):
|
if hasattr(start_time, "timestamp"):
|
||||||
message_data["timestamp"] = int(start_time.timestamp() * 1000.0)
|
message_data["timestamp"] = int(start_time.timestamp() * 1000.0)
|
||||||
else:
|
else:
|
||||||
message_data["timestamp"] = int(start_time * 1000.0)
|
message_data["timestamp"] = int(start_time * 1000.0)
|
||||||
|
|
@ -457,14 +461,16 @@ class NewRelicLogger(CustomLogger):
|
||||||
"sequence": sequence,
|
"sequence": sequence,
|
||||||
"response.model": response_model,
|
"response.model": response_model,
|
||||||
"vendor": vendor,
|
"vendor": vendor,
|
||||||
"is_response": True
|
"is_response": True,
|
||||||
}
|
}
|
||||||
|
|
||||||
# Add timestamp for response message if available (convert to milliseconds)
|
# Add timestamp for response message if available (convert to milliseconds)
|
||||||
if end_time is not None:
|
if end_time is not None:
|
||||||
# Handle both datetime objects and float timestamps
|
# Handle both datetime objects and float timestamps
|
||||||
if hasattr(end_time, 'timestamp'):
|
if hasattr(end_time, "timestamp"):
|
||||||
message_data["timestamp"] = int(end_time.timestamp() * 1000.0)
|
message_data["timestamp"] = int(
|
||||||
|
end_time.timestamp() * 1000.0
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
message_data["timestamp"] = int(end_time * 1000.0)
|
message_data["timestamp"] = int(end_time * 1000.0)
|
||||||
|
|
||||||
|
|
@ -489,7 +495,7 @@ class NewRelicLogger(CustomLogger):
|
||||||
num_messages: int,
|
num_messages: int,
|
||||||
usage: Dict[str, int],
|
usage: Dict[str, int],
|
||||||
duration: Optional[float] = None,
|
duration: Optional[float] = None,
|
||||||
request_params: Optional[Dict[str, Any]] = None
|
request_params: Optional[Dict[str, Any]] = None,
|
||||||
):
|
):
|
||||||
"""Record LlmChatCompletionSummary event to New Relic."""
|
"""Record LlmChatCompletionSummary event to New Relic."""
|
||||||
try:
|
try:
|
||||||
|
|
@ -506,7 +512,7 @@ class NewRelicLogger(CustomLogger):
|
||||||
"ingest_source": "litellm",
|
"ingest_source": "litellm",
|
||||||
"response.usage.prompt_tokens": usage["prompt_tokens"],
|
"response.usage.prompt_tokens": usage["prompt_tokens"],
|
||||||
"response.usage.completion_tokens": usage["completion_tokens"],
|
"response.usage.completion_tokens": usage["completion_tokens"],
|
||||||
"response.usage.total_tokens": usage["total_tokens"]
|
"response.usage.total_tokens": usage["total_tokens"],
|
||||||
}
|
}
|
||||||
|
|
||||||
# Add optional attributes if present
|
# Add optional attributes if present
|
||||||
|
|
@ -540,7 +546,7 @@ class NewRelicLogger(CustomLogger):
|
||||||
llm_response_id: str,
|
llm_response_id: str,
|
||||||
trace_id: Optional[str],
|
trace_id: Optional[str],
|
||||||
span_id: Optional[str],
|
span_id: Optional[str],
|
||||||
messages: List[Dict[str, Any]]
|
messages: List[Dict[str, Any]],
|
||||||
):
|
):
|
||||||
"""Record LlmChatCompletionMessage events to New Relic.
|
"""Record LlmChatCompletionMessage events to New Relic.
|
||||||
|
|
||||||
|
|
@ -553,6 +559,7 @@ class NewRelicLogger(CustomLogger):
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
import newrelic.agent
|
import newrelic.agent
|
||||||
|
|
||||||
app = newrelic.agent.application()
|
app = newrelic.agent.application()
|
||||||
|
|
||||||
for message in messages:
|
for message in messages:
|
||||||
|
|
@ -566,7 +573,7 @@ class NewRelicLogger(CustomLogger):
|
||||||
"response.model": message["response.model"],
|
"response.model": message["response.model"],
|
||||||
"vendor": message["vendor"],
|
"vendor": message["vendor"],
|
||||||
"ingest_source": "litellm",
|
"ingest_source": "litellm",
|
||||||
"token_count": 0
|
"token_count": 0,
|
||||||
}
|
}
|
||||||
|
|
||||||
# Add trace context if available
|
# Add trace context if available
|
||||||
|
|
@ -583,7 +590,6 @@ class NewRelicLogger(CustomLogger):
|
||||||
if message.get("is_response"):
|
if message.get("is_response"):
|
||||||
event_data["is_response"] = True
|
event_data["is_response"] = True
|
||||||
|
|
||||||
|
|
||||||
if app and app.enabled:
|
if app and app.enabled:
|
||||||
app.record_custom_event("LlmChatCompletionMessage", event_data)
|
app.record_custom_event("LlmChatCompletionMessage", event_data)
|
||||||
|
|
||||||
|
|
@ -595,6 +601,7 @@ class NewRelicLogger(CustomLogger):
|
||||||
"""Record error metric to New Relic."""
|
"""Record error metric to New Relic."""
|
||||||
try:
|
try:
|
||||||
import newrelic.agent
|
import newrelic.agent
|
||||||
|
|
||||||
app = newrelic.agent.application()
|
app = newrelic.agent.application()
|
||||||
if app:
|
if app:
|
||||||
app.record_custom_metric("LLM/LiteLLM/Error", 1)
|
app.record_custom_metric("LLM/LiteLLM/Error", 1)
|
||||||
|
|
@ -607,7 +614,7 @@ class NewRelicLogger(CustomLogger):
|
||||||
kwargs: Dict,
|
kwargs: Dict,
|
||||||
response_obj: ModelResponse,
|
response_obj: ModelResponse,
|
||||||
start_time: Optional[float] = None,
|
start_time: Optional[float] = None,
|
||||||
end_time: Optional[float] = None
|
end_time: Optional[float] = None,
|
||||||
):
|
):
|
||||||
"""
|
"""
|
||||||
Core logic for processing successful LLM calls.
|
Core logic for processing successful LLM calls.
|
||||||
|
|
@ -656,7 +663,7 @@ class NewRelicLogger(CustomLogger):
|
||||||
num_messages=len(messages),
|
num_messages=len(messages),
|
||||||
usage=usage,
|
usage=usage,
|
||||||
duration=duration,
|
duration=duration,
|
||||||
request_params=request_params
|
request_params=request_params,
|
||||||
)
|
)
|
||||||
|
|
||||||
# Record message events
|
# Record message events
|
||||||
|
|
@ -665,7 +672,7 @@ class NewRelicLogger(CustomLogger):
|
||||||
llm_response_id=llm_response_id,
|
llm_response_id=llm_response_id,
|
||||||
trace_id=trace_id,
|
trace_id=trace_id,
|
||||||
span_id=span_id,
|
span_id=span_id,
|
||||||
messages=messages
|
messages=messages,
|
||||||
)
|
)
|
||||||
|
|
||||||
# CustomLogger interface implementation
|
# CustomLogger interface implementation
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue