Просмотр исходного кода

feat(alerts): Skip snuba on frequency filters for new issues (#61003)

Scott Cooper 1 год назад
Родитель
Сommit
0c866b85e3

+ 4 - 0
src/sentry/rules/conditions/event_frequency.py

@@ -124,6 +124,10 @@ class BaseEventFrequencyCondition(EventCondition, abc.ABC):
         if not (interval and value is not None):
         if not (interval and value is not None):
             return False
             return False
 
 
+        # Assumes that the first event in a group will always be below the threshold.
+        if state.is_new and value > 1:
+            return False
+
         # TODO(mgaeta): Bug: Rule is optional.
         # TODO(mgaeta): Bug: Rule is optional.
         current_value = self.get_rate(event, interval, self.rule.environment_id)  # type: ignore
         current_value = self.get_rate(event, interval, self.rule.environment_id)  # type: ignore
         logging.info(f"event_frequency_rule current: {current_value}, threshold: {value}")
         logging.info(f"event_frequency_rule current: {current_value}, threshold: {value}")

+ 33 - 12
tests/snuba/rules/conditions/test_event_frequency.py

@@ -106,11 +106,11 @@ class StandardIntervalTestBase(SnubaTestCase, RuleTestCase):
             )
             )
 
 
         if passes:
         if passes:
-            self.assertPasses(rule, event)
-            self.assertPasses(environment_rule, event)
+            self.assertPasses(rule, event, is_new=False)
+            self.assertPasses(environment_rule, event, is_new=False)
         else:
         else:
-            self.assertDoesNotPass(rule, event)
-            self.assertDoesNotPass(environment_rule, event)
+            self.assertDoesNotPass(rule, event, is_new=False)
+            self.assertDoesNotPass(environment_rule, event, is_new=False)
 
 
     def test_one_minute_with_events(self):
     def test_one_minute_with_events(self):
         data = {"interval": "1m", "value": 6}
         data = {"interval": "1m", "value": 6}
@@ -180,7 +180,7 @@ class StandardIntervalTestBase(SnubaTestCase, RuleTestCase):
             "comparisonInterval": "1d",
             "comparisonInterval": "1d",
         }
         }
         rule = self.get_rule(data=data, rule=Rule(environment_id=None))
         rule = self.get_rule(data=data, rule=Rule(environment_id=None))
-        self.assertPasses(rule, event)
+        self.assertPasses(rule, event, is_new=False)
 
 
         data = {
         data = {
             "interval": "1h",
             "interval": "1h",
@@ -189,7 +189,7 @@ class StandardIntervalTestBase(SnubaTestCase, RuleTestCase):
             "comparisonInterval": "1d",
             "comparisonInterval": "1d",
         }
         }
         rule = self.get_rule(data=data, rule=Rule(environment_id=None))
         rule = self.get_rule(data=data, rule=Rule(environment_id=None))
-        self.assertDoesNotPass(rule, event)
+        self.assertDoesNotPass(rule, event, is_new=False)
 
 
     def test_comparison_empty_comparison_period(self):
     def test_comparison_empty_comparison_period(self):
         # Test data is 1 event in the current period and 0 events in the comparison period. This
         # Test data is 1 event in the current period and 0 events in the comparison period. This
@@ -209,7 +209,7 @@ class StandardIntervalTestBase(SnubaTestCase, RuleTestCase):
             "comparisonInterval": "1d",
             "comparisonInterval": "1d",
         }
         }
         rule = self.get_rule(data=data, rule=Rule(environment_id=None))
         rule = self.get_rule(data=data, rule=Rule(environment_id=None))
-        self.assertDoesNotPass(rule, event)
+        self.assertDoesNotPass(rule, event, is_new=False)
 
 
         data = {
         data = {
             "interval": "1h",
             "interval": "1h",
@@ -218,7 +218,28 @@ class StandardIntervalTestBase(SnubaTestCase, RuleTestCase):
             "comparisonInterval": "1d",
             "comparisonInterval": "1d",
         }
         }
         rule = self.get_rule(data=data, rule=Rule(environment_id=None))
         rule = self.get_rule(data=data, rule=Rule(environment_id=None))
-        self.assertDoesNotPass(rule, event)
+        self.assertDoesNotPass(rule, event, is_new=False)
+
+    @patch("sentry.rules.conditions.event_frequency.BaseEventFrequencyCondition.get_rate")
+    def test_is_new_issue_skips_snuba(self, mock_get_rate):
+        # Looking for more than 1 event
+        data = {"interval": "1m", "value": 6}
+        minutes = 1
+        rule = self.get_rule(data=data, rule=Rule(environment_id=None))
+        environment_rule = self.get_rule(data=data, rule=Rule(environment_id=self.environment.id))
+
+        event = self.add_event(
+            data={
+                "fingerprint": ["something_random"],
+                "user": {"id": uuid4().hex},
+            },
+            project_id=self.project.id,
+            timestamp=before_now(minutes=minutes),
+        )
+        # Issue is new and is the first event
+        self.assertDoesNotPass(rule, event, is_new=True)
+        self.assertDoesNotPass(environment_rule, event, is_new=True)
+        assert mock_get_rate.call_count == 0
 
 
 
 
 class EventFrequencyConditionTestCase(StandardIntervalTestBase):
 class EventFrequencyConditionTestCase(StandardIntervalTestBase):
@@ -315,8 +336,8 @@ class EventFrequencyPercentConditionTestCase(SnubaTestCase, RuleTestCase):
         rule = self.get_rule(data=data, rule=Rule(environment_id=None))
         rule = self.get_rule(data=data, rule=Rule(environment_id=None))
         environment_rule = self.get_rule(data=data, rule=Rule(environment_id=self.environment.id))
         environment_rule = self.get_rule(data=data, rule=Rule(environment_id=self.environment.id))
         if passes:
         if passes:
-            self.assertPasses(rule, self.test_event)
-            self.assertPasses(environment_rule, self.test_event)
+            self.assertPasses(rule, self.test_event, is_new=False)
+            self.assertPasses(environment_rule, self.test_event, is_new=False)
         else:
         else:
             self.assertDoesNotPass(rule, self.test_event)
             self.assertDoesNotPass(rule, self.test_event)
             self.assertDoesNotPass(environment_rule, self.test_event)
             self.assertDoesNotPass(environment_rule, self.test_event)
@@ -425,7 +446,7 @@ class EventFrequencyPercentConditionTestCase(SnubaTestCase, RuleTestCase):
             "comparisonInterval": "1d",
             "comparisonInterval": "1d",
         }
         }
         rule = self.get_rule(data=data, rule=Rule(environment_id=None))
         rule = self.get_rule(data=data, rule=Rule(environment_id=None))
-        self.assertPasses(rule, event)
+        self.assertPasses(rule, event, is_new=False)
 
 
         data = {
         data = {
             "interval": "1h",
             "interval": "1h",
@@ -434,7 +455,7 @@ class EventFrequencyPercentConditionTestCase(SnubaTestCase, RuleTestCase):
             "comparisonInterval": "1d",
             "comparisonInterval": "1d",
         }
         }
         rule = self.get_rule(data=data, rule=Rule(environment_id=None))
         rule = self.get_rule(data=data, rule=Rule(environment_id=None))
-        self.assertDoesNotPass(rule, event)
+        self.assertDoesNotPass(rule, event, is_new=False)
 
 
 
 
 @freeze_time((now() - timedelta(days=2)).replace(hour=12, minute=40, second=0, microsecond=0))
 @freeze_time((now() - timedelta(days=2)).replace(hour=12, minute=40, second=0, microsecond=0))