diff --git a/src/robusta/core/discovery/top_service_resolver.py b/src/robusta/core/discovery/top_service_resolver.py index f073958f4..a58fb0c11 100644 --- a/src/robusta/core/discovery/top_service_resolver.py +++ b/src/robusta/core/discovery/top_service_resolver.py @@ -1,7 +1,7 @@ import threading import time from collections import defaultdict -from typing import Dict, List, Optional +from typing import Any, Dict, List, Optional from pydantic.main import BaseModel @@ -67,6 +67,19 @@ def guess_cached_resource(cls, name: str, namespace: str) -> Optional[TopLevelRe return cached_resource return None + @classmethod + def guess_workload_from_labels(cls, labels: Dict[Any, Any] = None) -> Optional[TopLevelResource]: + if not labels or "namespace" not in labels: + return None + namespace = labels["namespace"] + relevant_label_keys = ["job_name", "deployment", "statefulset", "daemonset", "pod"] + for label in relevant_label_keys: + if not label in labels: + continue + resource_type = label.capitalize() if label != "job_name" else "Job" + return TopLevelResource(name=labels[label], namespace=namespace, resource_type=resource_type) + return None + @classmethod def add_cached_resource(cls, resource: TopLevelResource): cls.__namespace_to_resource[resource.namespace].append(resource) diff --git a/src/robusta/core/reporting/base.py b/src/robusta/core/reporting/base.py index bfb6d9517..daade7c9c 100644 --- a/src/robusta/core/reporting/base.py +++ b/src/robusta/core/reporting/base.py @@ -282,6 +282,9 @@ def __init__( self.enrichments: List[Enrichment] = [] self.links: List[Link] = [] self.service = TopServiceResolver.guess_cached_resource(name=subject.name, namespace=subject.namespace) + # An alert can be fired on a deleted resource that we cant resolve + if self.service is None and silence_labels: + self.service = TopServiceResolver.guess_workload_from_labels(labels=silence_labels) self.service_key = self.service.get_resource_key() if self.service else "" uri_path = f"services/{self.service_key}?tab=grouped" if self.service_key else "graphs" self.investigate_uri = f"{ROBUSTA_UI_DOMAIN}/{uri_path}" diff --git a/src/robusta/core/sinks/slack/slack_sink.py b/src/robusta/core/sinks/slack/slack_sink.py index 1f7aa7989..e98522cec 100644 --- a/src/robusta/core/sinks/slack/slack_sink.py +++ b/src/robusta/core/sinks/slack/slack_sink.py @@ -112,19 +112,13 @@ def __replace_callback_with_string(self, slack_message, block_id, message_string blocks[i] = { "type": "section", "block_id": block_id, - "text": { - "type": "mrkdwn", - "text": message_string - } + "text": {"type": "mrkdwn", "text": message_string}, } break # Call the shorter update function return self.slack_sender.update_slack_message( - channel=channel_id, - ts=message_ts, - blocks=blocks, - text=message_string + channel=channel_id, ts=message_ts, blocks=blocks, text=message_string ) except Exception as e: