Browse Source

fix(alerts): Use IncidentTrigger time in email notification (#19722)

Evan Purkhiser 4 years ago
parent
commit
185d95597b

+ 4 - 1
src/sentry/incidents/action_handlers.py

@@ -11,6 +11,7 @@ from sentry.incidents.models import (
     AlertRuleTriggerAction,
     TriggerStatus,
     IncidentStatus,
+    IncidentTrigger,
     INCIDENT_STATUS,
 )
 from sentry.utils.email import MessageBuilder
@@ -139,6 +140,8 @@ INCIDENT_STATUS_KEY = {
 
 def generate_incident_trigger_email_context(project, incident, alert_rule_trigger, status):
     trigger = alert_rule_trigger
+    incident_trigger = IncidentTrigger.objects.get(incident=incident, alert_rule_trigger=trigger)
+
     alert_rule = trigger.alert_rule
     snuba_query = alert_rule.snuba_query
     is_active = status == TriggerStatus.ACTIVE
@@ -174,7 +177,7 @@ def generate_incident_trigger_email_context(project, incident, alert_rule_trigge
         "incident_name": incident.title,
         "environment": environment_string,
         "time_window": format_duration(snuba_query.time_window / 60),
-        "triggered_at": trigger.date_added,
+        "triggered_at": incident_trigger.date_added,
         "aggregate": aggregate,
         "query": snuba_query.query,
         "threshold": trigger.alert_threshold if is_active else trigger.resolve_threshold,

+ 11 - 0
src/sentry/testutils/factories.py

@@ -30,10 +30,12 @@ from sentry.incidents.models import (
     AlertRuleThresholdType,
     AlertRuleTriggerAction,
     Incident,
+    IncidentTrigger,
     IncidentActivity,
     IncidentProject,
     IncidentSeen,
     IncidentType,
+    TriggerStatus,
 )
 from sentry.mediators import (
     sentry_apps,
@@ -907,6 +909,15 @@ class Factories(object):
             alert_rule, label, threshold_type, alert_threshold, resolve_threshold
         )
 
+    @staticmethod
+    def create_incident_trigger(incident, alert_rule_trigger, status=None):
+        if status is None:
+            status = TriggerStatus.ACTIVE.value
+
+        return IncidentTrigger.objects.create(
+            alert_rule_trigger=alert_rule_trigger, incident=incident, status=status,
+        )
+
     @staticmethod
     def create_alert_rule_trigger_action(
         trigger,

+ 9 - 1
src/sentry/testutils/fixtures.py

@@ -271,7 +271,12 @@ class Fixtures(object):
         return Factories.create_alert_rule_trigger(alert_rule, *args, **kwargs)
 
     def create_alert_rule_trigger_action(
-        self, alert_rule_trigger=None, target_identifier=None, *args, **kwargs
+        self,
+        alert_rule_trigger=None,
+        target_identifier=None,
+        triggered_for_incident=None,
+        *args,
+        **kwargs
     ):
         if not alert_rule_trigger:
             alert_rule_trigger = self.create_alert_rule_trigger()
@@ -279,6 +284,9 @@ class Fixtures(object):
         if not target_identifier:
             target_identifier = six.text_type(self.user.id)
 
+        if triggered_for_incident is not None:
+            Factories.create_incident_trigger(triggered_for_incident, alert_rule_trigger)
+
         return Factories.create_alert_rule_trigger_action(
             alert_rule_trigger, target_identifier=target_identifier, **kwargs
         )

+ 8 - 6
tests/sentry/incidents/test_action_handlers.py

@@ -88,8 +88,8 @@ class EmailActionHandlerGetTargetsTest(TestCase):
 class EmailActionHandlerGenerateEmailContextTest(TestCase):
     def test(self):
         status = TriggerStatus.ACTIVE
-        action = self.create_alert_rule_trigger_action()
         incident = self.create_incident()
+        action = self.create_alert_rule_trigger_action(triggered_for_incident=incident)
         aggregate = action.alert_rule_trigger.alert_rule.snuba_query.aggregate
         expected = {
             "link": absolute_uri(
@@ -138,8 +138,10 @@ class EmailActionHandlerGenerateEmailContextTest(TestCase):
         ]
         alert_rule = self.create_alert_rule(environment=environments[0])
         alert_rule_trigger = self.create_alert_rule_trigger(alert_rule=alert_rule)
-        action = self.create_alert_rule_trigger_action(alert_rule_trigger=alert_rule_trigger)
         incident = self.create_incident()
+        action = self.create_alert_rule_trigger_action(
+            alert_rule_trigger=alert_rule_trigger, triggered_for_incident=incident
+        )
         assert "prod" == generate_incident_trigger_email_context(
             self.project, incident, action.alert_rule_trigger, status
         ).get("environment")
@@ -148,10 +150,10 @@ class EmailActionHandlerGenerateEmailContextTest(TestCase):
 @freeze_time()
 class EmailActionHandlerFireTest(TestCase):
     def test_user(self):
+        incident = self.create_incident(status=IncidentStatus.CRITICAL.value)
         action = self.create_alert_rule_trigger_action(
-            target_identifier=six.text_type(self.user.id)
+            target_identifier=six.text_type(self.user.id), triggered_for_incident=incident,
         )
-        incident = self.create_incident(status=IncidentStatus.CRITICAL.value)
         handler = EmailActionHandler(action, incident, self.project)
         with self.tasks():
             handler.fire(1000)
@@ -163,10 +165,10 @@ class EmailActionHandlerFireTest(TestCase):
 @freeze_time()
 class EmailActionHandlerResolveTest(TestCase):
     def test_user(self):
+        incident = self.create_incident()
         action = self.create_alert_rule_trigger_action(
-            target_identifier=six.text_type(self.user.id)
+            target_identifier=six.text_type(self.user.id), triggered_for_incident=incident,
         )
-        incident = self.create_incident()
         handler = EmailActionHandler(action, incident, self.project)
         with self.tasks():
             incident.status = IncidentStatus.CLOSED.value