From de2f96beb6f86a097c3b338c215a790d86515f3d Mon Sep 17 00:00:00 2001 From: Dan Fuller Date: Mon, 20 Sep 2021 17:48:56 -0700 Subject: [PATCH 1/2] feat(comparison_alerts): Return comparison delta in the metric alert rule apis. This returns the comparison delta to all metric alert apis. The value is in minutes, to match the input value. --- src/sentry/api/serializers/models/alert_rule.py | 1 + src/sentry/testutils/factories.py | 2 ++ tests/sentry/api/serializers/test_alert_rule.py | 10 ++++++++++ 3 files changed, 13 insertions(+) diff --git a/src/sentry/api/serializers/models/alert_rule.py b/src/sentry/api/serializers/models/alert_rule.py index 565120ed0f8cc6..af4561968e2b9d 100644 --- a/src/sentry/api/serializers/models/alert_rule.py +++ b/src/sentry/api/serializers/models/alert_rule.py @@ -110,6 +110,7 @@ def serialize(self, obj, attrs, user): "includeAllProjects": obj.include_all_projects, "owner": attrs.get("owner", None), "originalAlertRuleId": attrs.get("originalAlertRuleId", None), + "comparisonDelta": obj.comparison_delta / 60 if obj.comparison_delta else None, "dateModified": obj.date_modified, "dateCreated": obj.date_added, "createdBy": attrs.get("created_by", None), diff --git a/src/sentry/testutils/factories.py b/src/sentry/testutils/factories.py index 9228a08a706228..e0d370438695ba 100644 --- a/src/sentry/testutils/factories.py +++ b/src/sentry/testutils/factories.py @@ -942,6 +942,7 @@ def create_alert_rule( resolve_threshold=None, user=None, event_types=None, + comparison_delta=None, ): if not name: name = petname.Generate(2, " ", letters=10).title() @@ -963,6 +964,7 @@ def create_alert_rule( excluded_projects=excluded_projects, user=user, event_types=event_types, + comparison_delta=comparison_delta, ) if date_added is not None: diff --git a/tests/sentry/api/serializers/test_alert_rule.py b/tests/sentry/api/serializers/test_alert_rule.py index cf68e7dfe91aaa..ce0f5f2e289897 100644 --- a/tests/sentry/api/serializers/test_alert_rule.py +++ b/tests/sentry/api/serializers/test_alert_rule.py @@ -51,6 +51,11 @@ def assert_alert_rule_serialized(self, alert_rule, result, skip_dates=False): else: assert result["owner"] is None + if alert_rule.comparison_delta: + assert result["comparisonDelta"] == alert_rule.comparison_delta / 60 + else: + assert result["comparisonDelta"] is None + def create_issue_alert_rule(self, data): """data format { @@ -129,6 +134,11 @@ def test_owner(self): self.assert_alert_rule_serialized(alert_rule, result) assert alert_rule.owner == self.team.actor + def test_comparison_delta(self): + alert_rule = self.create_alert_rule(comparison_delta=60) + result = serialize(alert_rule) + self.assert_alert_rule_serialized(alert_rule, result) + class DetailedAlertRuleSerializerTest(BaseAlertRuleSerializerTest, TestCase): def test_simple(self): From f12ba499443b7f116b0660bdbf8c751511fbf3ff Mon Sep 17 00:00:00 2001 From: Dan Fuller Date: Wed, 22 Sep 2021 15:33:08 -0700 Subject: [PATCH 2/2] fix passing null comparison delta --- src/sentry/incidents/endpoints/serializers.py | 5 ++++- tests/sentry/incidents/endpoints/test_serializers.py | 10 ++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/sentry/incidents/endpoints/serializers.py b/src/sentry/incidents/endpoints/serializers.py index 5d812bf99044a7..b191e80bc7b676 100644 --- a/src/sentry/incidents/endpoints/serializers.py +++ b/src/sentry/incidents/endpoints/serializers.py @@ -311,7 +311,10 @@ class AlertRuleSerializer(CamelSnakeModelSerializer): ) threshold_period = serializers.IntegerField(default=1, min_value=1, max_value=20) comparison_delta = serializers.IntegerField( - required=False, min_value=1, max_value=int(timedelta(days=89).total_seconds() / 60) + required=False, + min_value=1, + max_value=int(timedelta(days=89).total_seconds() / 60), + allow_null=True, ) aggregate = serializers.CharField(required=True, min_length=1) owner = serializers.CharField( diff --git a/tests/sentry/incidents/endpoints/test_serializers.py b/tests/sentry/incidents/endpoints/test_serializers.py index 87b1c17ea51856..c7d6cc99cef6ed 100644 --- a/tests/sentry/incidents/endpoints/test_serializers.py +++ b/tests/sentry/incidents/endpoints/test_serializers.py @@ -12,6 +12,7 @@ string_to_action_type, ) from sentry.incidents.logic import ( + DEFAULT_ALERT_RULE_RESOLUTION, DEFAULT_CMP_ALERT_RULE_RESOLUTION, ChannelLookupTimeoutError, create_alert_rule_trigger, @@ -539,6 +540,15 @@ def test_comparison_delta(self): assert alert_rule.comparison_delta == 60 * 60 assert alert_rule.snuba_query.resolution == DEFAULT_CMP_ALERT_RULE_RESOLUTION * 60 + params["comparison_delta"] = None + serializer = AlertRuleSerializer( + context=self.context, instance=alert_rule, data=params, partial=True + ) + assert serializer.is_valid() + alert_rule = serializer.save() + assert alert_rule.comparison_delta is None + assert alert_rule.snuba_query.resolution == DEFAULT_ALERT_RULE_RESOLUTION * 60 + class TestAlertRuleTriggerSerializer(TestCase): @fixture