Skip to content

Commit 9b865e3

Browse files
authored
fix(severity): Prevent skipping severity score when equal to zero (#56225)
This fixes a potential bug in assigning severity scores to new groups wherein the score wouldn't be assigned if it was equal to `0`. (Falsiness strikes again!) Since scores are currently handled as strings, this is only a hypothetical for now, but worth fixing in case we do ever treat score as a float instead. It also adds tests for this case and applies a fix I noticed while writing said tests to an existing test. (It now checks for the `severity` key actually being _missing_ from group metadata rather than `severity` being set to `None`.)
1 parent 841f4b7 commit 9b865e3

File tree

2 files changed

+87
-9
lines changed

2 files changed

+87
-9
lines changed

src/sentry/event_manager.py

+9-7
Original file line numberDiff line numberDiff line change
@@ -1624,9 +1624,10 @@ def _save_aggregate(
16241624

16251625
group = _create_group(project, event, **kwargs)
16261626

1627-
if features.has(
1628-
"projects:first-event-severity-calculation", event.project
1629-
) and not group.data.get("metadata", {}).get("severity"):
1627+
if (
1628+
features.has("projects:first-event-severity-calculation", event.project)
1629+
and group.data.get("metadata", {}).get("severity") is None
1630+
):
16301631
logger.error(
16311632
"Group created without severity score",
16321633
extra={
@@ -1843,7 +1844,7 @@ def _create_group(project: Project, event: Event, **kwargs: Any) -> Group:
18431844
group_data = kwargs.pop("data", {})
18441845
if features.has("projects:first-event-severity-calculation", event.project):
18451846
severity = _get_severity_score(event)
1846-
if severity:
1847+
if severity is not None: # Severity can be 0
18471848
group_data.setdefault("metadata", {})
18481849
group_data["metadata"]["severity"] = severity
18491850

@@ -2506,9 +2507,10 @@ def _save_grouphash_and_group(
25062507
group = _create_group(project, event, **group_kwargs)
25072508
group_hash.update(group=group)
25082509

2509-
if features.has(
2510-
"projects:first-event-severity-calculation", event.project
2511-
) and not group.data.get("metadata", {}).get("severity"):
2510+
if (
2511+
features.has("projects:first-event-severity-calculation", event.project)
2512+
and group.data.get("metadata", {}).get("severity") is None
2513+
):
25122514
logger.error(
25132515
"Group created without severity score",
25142516
extra={

tests/sentry/event_manager/test_event_manager.py

+78-2
Original file line numberDiff line numberDiff line change
@@ -2639,7 +2639,37 @@ def test_severity_score_flag_off(self, mock_get_severity_score: MagicMock):
26392639
event = manager.save(self.project.id)
26402640

26412641
mock_get_severity_score.assert_not_called()
2642-
assert event.group and event.group.get_event_metadata().get("severity") is None
2642+
assert event.group and "severity" not in event.group.get_event_metadata()
2643+
2644+
@patch("sentry.event_manager._get_severity_score", return_value=None)
2645+
def test_no_severity_score_assigned_when_value_is_None(
2646+
self, mock_get_severity_score: MagicMock
2647+
):
2648+
with self.feature({"projects:first-event-severity-calculation": True}):
2649+
manager = EventManager(
2650+
make_event(
2651+
exception={"values": [{"type": "NopeError", "value": "Nopey McNopeface"}]}
2652+
)
2653+
)
2654+
event = manager.save(self.project.id)
2655+
2656+
mock_get_severity_score.assert_called()
2657+
assert event.group and "severity" not in event.group.get_event_metadata()
2658+
2659+
@patch("sentry.event_manager._get_severity_score", return_value=0)
2660+
def test_severity_score_still_assigned_when_value_is_zero(
2661+
self, mock_get_severity_score: MagicMock
2662+
):
2663+
with self.feature({"projects:first-event-severity-calculation": True}):
2664+
manager = EventManager(
2665+
make_event(
2666+
exception={"values": [{"type": "NopeError", "value": "Nopey McNopeface"}]}
2667+
)
2668+
)
2669+
event = manager.save(self.project.id)
2670+
2671+
mock_get_severity_score.assert_called()
2672+
assert event.group and event.group.get_event_metadata().get("severity") == 0
26432673

26442674

26452675
class AutoAssociateCommitTest(TestCase, EventManagerTestMixin):
@@ -3717,6 +3747,29 @@ def test_logs_error_on_no_severity_score_when_enabled(
37173747
},
37183748
)
37193749

3750+
@patch("sentry.event_manager.logger.error")
3751+
@patch("sentry.event_manager._get_severity_score", return_value=0)
3752+
def test_no_error_logged_on_zero_severity_score_when_enabled(
3753+
self,
3754+
mock_get_severity_score: MagicMock,
3755+
mock_logger_error: MagicMock,
3756+
):
3757+
with self.feature({"projects:first-event-severity-calculation": True}):
3758+
event = _get_event_instance(
3759+
make_event(
3760+
exception={"values": [{"type": "NopeError", "value": "Nopey McNopeface"}]}
3761+
),
3762+
self.project.id,
3763+
)
3764+
3765+
group, _ = _save_grouphash_and_group(self.project, event, "dogs are great")
3766+
3767+
logger_messages = [call.args[0] for call in mock_logger_error.mock_calls]
3768+
3769+
mock_get_severity_score.assert_called()
3770+
assert group.data["metadata"]["severity"] == 0
3771+
assert "Group created without severity score" not in logger_messages
3772+
37203773
@patch("sentry.event_manager.logger.error")
37213774
@patch("sentry.event_manager._get_severity_score", return_value=None)
37223775
def test_no_error_logged_on_no_severity_score_when_disabled(
@@ -3768,6 +3821,30 @@ def test_logs_error_on_no_severity_score_when_enabled(
37683821
},
37693822
)
37703823

3824+
@patch("sentry.event_manager._save_aggregate", wraps=_save_aggregate)
3825+
@patch("sentry.event_manager.logger.error")
3826+
@patch("sentry.event_manager._get_severity_score", return_value=0)
3827+
def test_no_error_logged_on_zero_severity_score_when_enabled(
3828+
self,
3829+
mock_get_severity_score: MagicMock,
3830+
mock_logger_error: MagicMock,
3831+
mock_save_aggregate: MagicMock,
3832+
):
3833+
with self.feature({"projects:first-event-severity-calculation": True}):
3834+
manager = EventManager(
3835+
make_event(
3836+
exception={"values": [{"type": "NopeError", "value": "Nopey McNopeface"}]}
3837+
)
3838+
)
3839+
event = manager.save(self.project.id)
3840+
3841+
logger_messages = [call.args[0] for call in mock_logger_error.mock_calls]
3842+
3843+
mock_save_aggregate.assert_called()
3844+
mock_get_severity_score.assert_called()
3845+
assert event.group and event.group.data["metadata"]["severity"] == 0
3846+
assert "Group created without severity score" not in logger_messages
3847+
37713848
@patch("sentry.event_manager._save_aggregate", wraps=_save_aggregate)
37723849
@patch("sentry.event_manager.logger.error")
37733850
@patch("sentry.event_manager._get_severity_score", return_value=None)
@@ -3789,5 +3866,4 @@ def test_no_error_logged_on_no_severity_score_when_disabled(
37893866

37903867
mock_save_aggregate.assert_called()
37913868
mock_get_severity_score.assert_not_called()
3792-
37933869
assert "Group created without severity score" not in logger_messages

0 commit comments

Comments
 (0)