Skip to content

Commit b18d38c

Browse files
added fixability re-try in run_automation
1 parent af48b41 commit b18d38c

File tree

2 files changed

+57
-17
lines changed

2 files changed

+57
-17
lines changed

src/sentry/seer/autofix/issue_summary.py

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -304,9 +304,18 @@ def _run_automation(
304304
)
305305

306306
fixability_score = group.seer_fixability_score
307+
# Re-try generating fixability score if it failed in _generate_summary or was skiped.
307308
if fixability_score is None:
308-
logger.error("Fixability score is not available for group %s", group.id)
309-
return
309+
with sentry_sdk.start_span(op="ai_summary.generate_fixability_score"):
310+
fixability_response = _generate_fixability_score(group)
311+
312+
if not fixability_response.scores:
313+
raise ValueError("Issue summary scores is None or empty.")
314+
if fixability_response.scores.fixability_score is None:
315+
raise ValueError("Issue summary fixability score is None.")
316+
317+
group.update(seer_fixability_score=fixability_response.scores.fixability_score)
318+
fixability_score = fixability_response.scores.fixability_score
310319

311320
if (
312321
not _is_issue_fixable(group, fixability_score)
@@ -400,18 +409,11 @@ def _generate_summary(
400409
)
401410

402411
if should_run_automation:
403-
if group.seer_fixability_score is not None:
404-
try:
405-
_run_automation(group, user, event, source)
406-
except Exception:
407-
logger.exception(
408-
"Error auto-triggering autofix from issue summary", extra={"group_id": group.id}
409-
)
410-
else:
411-
logger.error(
412-
"Skipping automation: fixability score unavailable for group %s",
413-
group.id,
414-
extra={"group_id": group.id},
412+
try:
413+
_run_automation(group, user, event, source)
414+
except Exception:
415+
logger.exception(
416+
"Error auto-triggering autofix from issue summary", extra={"group_id": group.id}
415417
)
416418

417419
summary_dict = issue_summary.dict()

tests/sentry/seer/autofix/test_issue_summary.py

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -927,12 +927,50 @@ def test_without_feature_flag(self, mock_budget, mock_state, mock_rate, mock_tri
927927
assert mock_trigger.call_args[1]["stopping_point"] is None
928928

929929
@patch("sentry.seer.autofix.issue_summary._trigger_autofix_task.delay")
930-
def test_missing_fixability_score_returns_early(self, mock_trigger):
931-
"""Test that _run_automation returns early when fixability score is None."""
930+
@patch("sentry.seer.autofix.issue_summary._generate_fixability_score")
931+
def test_missing_fixability_score_generates_and_fails(
932+
self, mock_generate_fixability, mock_trigger
933+
):
934+
"""Test that _run_automation tries to generate fixability score when None and fails if generation fails."""
932935
assert self.group.seer_fixability_score is None
933-
_run_automation(self.group, self.user, self.event, SeerAutomationSource.ALERT)
936+
mock_generate_fixability.side_effect = Exception("Fixability generation failed")
937+
938+
with pytest.raises(Exception, match="Fixability generation failed"):
939+
_run_automation(self.group, self.user, self.event, SeerAutomationSource.ALERT)
940+
941+
mock_generate_fixability.assert_called_once_with(self.group)
934942
mock_trigger.assert_not_called()
935943

944+
@patch("sentry.seer.autofix.issue_summary._trigger_autofix_task.delay")
945+
@patch(
946+
"sentry.seer.autofix.issue_summary.is_seer_autotriggered_autofix_rate_limited",
947+
return_value=False,
948+
)
949+
@patch("sentry.seer.autofix.issue_summary._generate_fixability_score")
950+
@patch("sentry.seer.autofix.issue_summary.get_autofix_state", return_value=None)
951+
@patch("sentry.quotas.backend.has_available_reserved_budget", return_value=True)
952+
def test_missing_fixability_score_generates_and_succeeds(
953+
self, mock_budget, mock_state, mock_generate_fixability, mock_rate_limit, mock_trigger
954+
):
955+
"""Test that _run_automation generates fixability score when None and continues if generation succeeds."""
956+
assert self.group.seer_fixability_score is None
957+
self.project.update_option("sentry:autofix_automation_tuning", "always")
958+
mock_generate_fixability.return_value = SummarizeIssueResponse(
959+
group_id=str(self.group.id),
960+
headline="h",
961+
whats_wrong="w",
962+
trace="t",
963+
possible_cause="c",
964+
scores=SummarizeIssueScores(fixability_score=0.80),
965+
)
966+
967+
_run_automation(self.group, self.user, self.event, SeerAutomationSource.ALERT)
968+
969+
mock_generate_fixability.assert_called_once_with(self.group)
970+
mock_trigger.assert_called_once()
971+
self.group.refresh_from_db()
972+
assert self.group.seer_fixability_score == 0.80
973+
936974

937975
class TestFetchUserPreference:
938976
@patch("sentry.seer.autofix.issue_summary.sign_with_seer_secret", return_value={})

0 commit comments

Comments
 (0)