From baf3dceff4c3d73e5d630d227c6d591482759404 Mon Sep 17 00:00:00 2001 From: Kyle Consalus Date: Tue, 11 Nov 2025 12:11:18 -0800 Subject: [PATCH] fix(aci): Fix Stateful Detector counter reset --- .../handlers/detector/stateful.py | 2 +- .../handlers/detector/test_stateful.py | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/sentry/workflow_engine/handlers/detector/stateful.py b/src/sentry/workflow_engine/handlers/detector/stateful.py index a438dfaf80610a..478167911098c0 100644 --- a/src/sentry/workflow_engine/handlers/detector/stateful.py +++ b/src/sentry/workflow_engine/handlers/detector/stateful.py @@ -403,7 +403,7 @@ def evaluate( # Reset counters if any were incremented while evaluating a # different priority (but not reaching thresholds) if any(state_data.counter_updates.values()): - self.state_manager.enqueue_counter_reset() + self.state_manager.enqueue_counter_reset(group_key) continue diff --git a/tests/sentry/workflow_engine/handlers/detector/test_stateful.py b/tests/sentry/workflow_engine/handlers/detector/test_stateful.py index 19bdade92c4178..907a6e358cebb5 100644 --- a/tests/sentry/workflow_engine/handlers/detector/test_stateful.py +++ b/tests/sentry/workflow_engine/handlers/detector/test_stateful.py @@ -403,6 +403,26 @@ def test_evaluate__low_threshold_larger_than_high(self) -> None: assert state_data.is_triggered is True assert state_data.status == Level.LOW + def test_evaluate__counter_reset_for_non_none_group_key(self) -> None: + self.group_key = "group1" + + # Trigger HIGH priority + result = self.handler.evaluate(self.packet(1, Level.HIGH)) + assert result == {} + result = self.handler.evaluate(self.packet(2, Level.HIGH)) + assert result[self.group_key].priority == Level.HIGH + + # Evaluate again at HIGH priority (same as current state) + result = self.handler.evaluate(self.packet(3, Level.HIGH)) + assert result == {} + + # Evaluate at MEDIUM priority - should require 2 evaluations to trigger + result = self.handler.evaluate(self.packet(4, Level.MEDIUM)) + assert result == {} + + result = self.handler.evaluate(self.packet(5, Level.MEDIUM)) + assert result[self.group_key].priority == Level.MEDIUM + def test_evaluate__condition_hole(self): detector = self.create_detector( name="Stateful Detector",