Example #1
0
    def test(self):
        # Full integration test to ensure that when a subscription receives an update
        # the `QuerySubscriptionConsumer` successfully retries the subscription and
        # calls the correct callback, which should result in an incident being created.

        callback = subscriber_registry[INCIDENTS_SNUBA_SUBSCRIPTION_TYPE]

        def exception_callback(*args, **kwargs):
            # We want to just error after the callback so that we can see the result of
            # processing. This means the offset won't be committed, but that's fine, we
            # can still check the results.
            callback(*args, **kwargs)
            raise KeyboardInterrupt()

        value_name = query_aggregation_to_snuba[QueryAggregations(
            self.subscription.aggregation)][2]

        subscriber_registry[
            INCIDENTS_SNUBA_SUBSCRIPTION_TYPE] = exception_callback
        message = {
            "version": 1,
            "payload": {
                "subscription_id": self.subscription.subscription_id,
                "values": {
                    value_name: self.trigger.alert_threshold + 1
                },
                "timestamp": 1235,
                "interval": 5,
                "partition": 50,
                "offset": 10,
            },
        }
        self.producer.produce(self.topic, json.dumps(message))
        self.producer.flush()

        def active_incident():
            return Incident.objects.filter(
                type=IncidentType.ALERT_TRIGGERED.value,
                status=IncidentStatus.OPEN.value,
                alert_rule=self.rule,
            )

        consumer = QuerySubscriptionConsumer("hi", topic=self.topic)
        with self.assertChanges(lambda: active_incident().exists(),
                                before=False,
                                after=True), self.tasks():
            consumer.run()

        assert len(mail.outbox) == 1
        handler = EmailActionHandler(self.action,
                                     active_incident().get(), self.project)
        message = handler.build_message(
            handler.generate_email_context(TriggerStatus.ACTIVE),
            TriggerStatus.ACTIVE, self.user.id)

        out = mail.outbox[0]
        assert out.to == [self.user.email]
        assert out.subject == message.subject
        built_message = message.build(self.user.email)
        assert out.body == built_message.body
    def get(self, request):
        organization = Organization(slug="myorg")
        project = Project(id=30, slug="myproj")

        incident = Incident(identifier=123,
                            organization=organization,
                            title="Something broke")
        alert_rule = AlertRule(id=1,
                               organization=organization,
                               aggregation=1,
                               query="is:unresolved")
        alert_rule_trigger = AlertRuleTrigger(id=5,
                                              alert_rule=alert_rule,
                                              alert_threshold=100,
                                              resolve_threshold=50)
        action = AlertRuleTriggerAction(id=10,
                                        alert_rule_trigger=alert_rule_trigger)

        handler = EmailActionHandler(action, incident, project)
        email = handler.build_message(
            handler.generate_email_context(TriggerStatus.ACTIVE),
            TriggerStatus.ACTIVE, 1)
        return MailPreview(html_template=email.html_template,
                           text_template=email.template,
                           context=email.context).render(request)
Example #3
0
 def test_environment(self):
     status = TriggerStatus.ACTIVE
     environments = [
         self.create_environment(project=self.project, name="prod"),
         self.create_environment(project=self.project, name="dev"),
     ]
     alert_rule = self.create_alert_rule(environment=environments)
     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()
     handler = EmailActionHandler(action, incident, self.project)
     assert "dev, prod" == handler.generate_email_context(status).get("environment")
Example #4
0
 def test(self):
     status = TriggerStatus.ACTIVE
     action = self.create_alert_rule_trigger_action()
     incident = self.create_incident()
     handler = EmailActionHandler(action, incident, self.project)
     expected = {
         "link":
         absolute_uri(
             reverse(
                 "sentry-metric-alert",
                 kwargs={
                     "organization_slug": incident.organization.slug,
                     "incident_id": incident.identifier,
                 },
             )),
         "rule_link":
         absolute_uri(
             reverse(
                 "sentry-alert-rule",
                 kwargs={
                     "organization_slug": incident.organization.slug,
                     "project_slug": self.project.slug,
                     "alert_rule_id":
                     action.alert_rule_trigger.alert_rule_id,
                 },
             )),
         "incident_name":
         incident.title,
         "aggregate":
         handler.query_aggregations_display[QueryAggregations(
             action.alert_rule_trigger.alert_rule.aggregation)],
         "query":
         action.alert_rule_trigger.alert_rule.query,
         "threshold":
         action.alert_rule_trigger.alert_threshold,
         "status":
         INCIDENT_STATUS[IncidentStatus(incident.status)],
         "environment":
         "All",
         "is_critical":
         False,
         "is_warning":
         False,
         "threshold_direction_string":
         ">",
         "time_window":
         "10 minutes",
         "triggered_at":
         timezone.now(),
         "unsubscribe_link":
         None,
     }
     assert expected == handler.generate_email_context(status)
Example #5
0
 def test(self):
     status = TriggerStatus.ACTIVE
     action = self.create_alert_rule_trigger_action()
     incident = self.create_incident()
     handler = EmailActionHandler(action, incident, self.project)
     expected = {
         "link":
         absolute_uri(
             reverse(
                 "sentry-metric-alert",
                 kwargs={
                     "organization_slug": incident.organization.slug,
                     "incident_id": incident.identifier,
                 },
             )),
         "rule_link":
         absolute_uri(
             reverse(
                 "sentry-alert-rule",
                 kwargs={
                     "organization_slug": incident.organization.slug,
                     "project_slug": self.project.slug,
                     "alert_rule_id":
                     action.alert_rule_trigger.alert_rule_id,
                 },
             )),
         "incident_name":
         incident.title,
         "aggregate":
         handler.query_aggregations_display[QueryAggregations(
             action.alert_rule_trigger.alert_rule.aggregation)],
         "query":
         action.alert_rule_trigger.alert_rule.query,
         "threshold":
         action.alert_rule_trigger.alert_threshold,
         "status":
         handler.status_display[status],
     }
     assert expected == handler.generate_email_context(status)