Skip to content

Commit 35b501b

Browse files
Merge pull request #14176 from mjmendo/feat/alert_type_in_slack_message
feat: added alert type to alert messate to slack for easier handling
2 parents dc0d2a4 + db1b418 commit 35b501b

File tree

2 files changed

+35
-10
lines changed

2 files changed

+35
-10
lines changed

litellm/integrations/SlackAlerting/slack_alerting.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -805,9 +805,9 @@ async def region_outage_alerts(
805805
### UNIQUE CACHE KEY ###
806806
cache_key = provider + region_name
807807

808-
outage_value: Optional[ProviderRegionOutageModel] = (
809-
await self.internal_usage_cache.async_get_cache(key=cache_key)
810-
)
808+
outage_value: Optional[
809+
ProviderRegionOutageModel
810+
] = await self.internal_usage_cache.async_get_cache(key=cache_key)
811811

812812
if (
813813
getattr(exception, "status_code", None) is None
@@ -1367,12 +1367,13 @@ async def send_alert(
13671367
# Get the current timestamp
13681368
current_time = datetime.now().strftime("%H:%M:%S")
13691369
_proxy_base_url = os.getenv("PROXY_BASE_URL", None)
1370+
# Use .name if it's an enum, otherwise use as is
1371+
alert_type_name = getattr(alert_type, 'name', alert_type)
1372+
alert_type_formatted = f"Alert type: `{alert_type_name}`"
13701373
if alert_type == "daily_reports" or alert_type == "new_model_added":
1371-
formatted_message = message
1374+
formatted_message = alert_type_formatted + message
13721375
else:
1373-
formatted_message = (
1374-
f"Level: `{level}`\nTimestamp: `{current_time}`\n\nMessage: {message}"
1375-
)
1376+
formatted_message = f"{alert_type_formatted}\nLevel: `{level}`\nTimestamp: `{current_time}`\n\nMessage: {message}"
13761377

13771378
if kwargs:
13781379
for key, value in kwargs.items():
@@ -1388,9 +1389,9 @@ async def send_alert(
13881389
self.alert_to_webhook_url is not None
13891390
and alert_type in self.alert_to_webhook_url
13901391
):
1391-
slack_webhook_url: Optional[Union[str, List[str]]] = (
1392-
self.alert_to_webhook_url[alert_type]
1393-
)
1392+
slack_webhook_url: Optional[
1393+
Union[str, List[str]]
1394+
] = self.alert_to_webhook_url[alert_type]
13941395
elif self.default_webhook_url is not None:
13951396
slack_webhook_url = self.default_webhook_url
13961397
else:

tests/test_litellm/integrations/SlackAlerting/test_slack_alerting.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,3 +172,27 @@ def test_update_values_starts_periodic_task(self, mock_create_task):
172172

173173
self.slack_alerting.update_values(alerting_args={"slack_alerting": "True"})
174174
assert self.slack_alerting.periodic_started == True
175+
176+
@patch("litellm.integrations.SlackAlerting.slack_alerting.datetime")
177+
def test_alert_type_in_formatted_message(self, mock_datetime):
178+
# Setup mocks
179+
mock_datetime.now.return_value.strftime.return_value = "12:34:56"
180+
181+
# Import required types
182+
from litellm.types.integrations.slack_alerting import AlertType
183+
184+
# Create a simple test message to check formatting
185+
alert_type = AlertType.llm_exceptions
186+
level = "Medium"
187+
message = "Test alert message"
188+
current_time = "12:34:56"
189+
190+
# Test the specific formatting logic we're interested in
191+
alert_type_formatted = f"Alert type: `{alert_type.name}`\n"
192+
formatted_message = f"{alert_type_formatted}\n Level: `{level}`\nTimestamp: `{current_time}`\n\nMessage: {message}"
193+
194+
# Verify alert_type is in the formatted message as expected
195+
self.assertIn("Alert type: `llm_exceptions`", formatted_message)
196+
self.assertIn("Level: `Medium`", formatted_message)
197+
self.assertIn("Timestamp: `12:34:56`", formatted_message)
198+
self.assertIn("Message: Test alert message", formatted_message)

0 commit comments

Comments
 (0)