11from __future__ import annotations
22
3+ from dataclasses import dataclass
34from logging import Logger , getLogger
45
6+ from sentry .integrations .repository .base import BaseNotificationMessage
57from sentry .models .notificationmessage import NotificationMessage
8+ from sentry .models .rulefirehistory import RuleFireHistory
69
710_default_logger : Logger = getLogger (__name__ )
811
912
13+ @dataclass (frozen = True )
14+ class IssueAlertNotificationMessage (BaseNotificationMessage ):
15+ # TODO: https://github.com/getsentry/sentry/issues/66751
16+ rule_fire_history : RuleFireHistory | None = None
17+ rule_action_uuid : str | None = None
18+
19+ @classmethod
20+ def from_model (cls , instance : NotificationMessage ) -> IssueAlertNotificationMessage :
21+ return IssueAlertNotificationMessage (
22+ id = instance .id ,
23+ error_code = instance .error_code ,
24+ error_details = instance .error_details ,
25+ message_identifier = instance .message_identifier ,
26+ parent_notification_message_id = (
27+ instance .parent_notification_message .id
28+ if instance .parent_notification_message
29+ else None
30+ ),
31+ rule_fire_history = instance .rule_fire_history ,
32+ rule_action_uuid = instance .rule_action_uuid ,
33+ date_added = instance .date_added ,
34+ )
35+
36+
1037class IssueAlertNotificationMessageRepository :
1138 """
1239 Repository class that is responsible for querying the data store for notification messages in relation to issue
@@ -21,3 +48,33 @@ def __init__(self, logger: Logger) -> None:
2148 @classmethod
2249 def default (cls ) -> IssueAlertNotificationMessageRepository :
2350 return cls (logger = _default_logger )
51+
52+ def get_parent_notification_message (
53+ self , rule_id : int , group_id : int , rule_action_uuid : str
54+ ) -> IssueAlertNotificationMessage | None :
55+ """
56+ Returns the parent notification message for a metric rule if it exists, otherwise returns None.
57+ Will raise an exception if the query fails and logs the error with associated data.
58+ """
59+ try :
60+ instance : NotificationMessage = self ._model .objects .get (
61+ rule_fire_history__rule__id = rule_id ,
62+ rule_fire_history__group__id = group_id ,
63+ rule_action_uuid = rule_action_uuid ,
64+ parent_notification_message__isnull = True ,
65+ error_code__isnull = True ,
66+ )
67+ return IssueAlertNotificationMessage .from_model (instance = instance )
68+ except NotificationMessage .DoesNotExist :
69+ return None
70+ except Exception as e :
71+ self ._logger .exception (
72+ "Failed to get parent notification for issue rule" ,
73+ exc_info = e ,
74+ extra = {
75+ "rule_id" : rule_id ,
76+ "group_id" : group_id ,
77+ "rule_action_uuid" : rule_action_uuid ,
78+ },
79+ )
80+ raise
0 commit comments