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)
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")
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)
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)