diff --git a/src/sentry/event_manager.py b/src/sentry/event_manager.py index f0027b89b53f..8e30cc9daa20 100644 --- a/src/sentry/event_manager.py +++ b/src/sentry/event_manager.py @@ -2226,6 +2226,8 @@ def _get_severity_score(event: Event) -> tuple[float, str]: timeout=timeout, viewer_context=viewer_context, ) + if response.status >= 400: + raise Exception(f"Seer severity endpoint returned HTTP {response.status}") severity = orjson.loads(response.data).get("severity") reason = "ml" except MaxRetryError: diff --git a/tests/sentry/event_manager/test_severity.py b/tests/sentry/event_manager/test_severity.py index cb3043301192..62d295d2b7d0 100644 --- a/tests/sentry/event_manager/test_severity.py +++ b/tests/sentry/event_manager/test_severity.py @@ -293,6 +293,43 @@ def test_timeout_error( assert reason == "microservice_timeout" assert cache.get(SEER_ERROR_COUNT_KEY) == 1 + @patch( + "sentry.event_manager.severity_connection_pool.urlopen", + return_value=HTTPResponse(body=b"Service Unavailable", status=503), + ) + @patch("sentry.event_manager.sentry_sdk.capture_exception") + @patch("sentry.event_manager.metrics.incr") + def test_http_error_response( + self, + mock_metrics_incr: MagicMock, + mock_capture_exception: MagicMock, + _mock_urlopen: MagicMock, + ) -> None: + """A non-2xx HTTP response (e.g. 503) should be handled gracefully without raising JSONDecodeError.""" + manager = EventManager( + make_event( + exception={ + "values": [ + { + "type": "NopeError", + "value": "Nopey McNopeface", + "mechanism": {"type": "generic", "handled": True}, + } + ] + }, + platform="python", + ) + ) + event = manager.save(self.project.id) + + severity, reason = _get_severity_score(event) + + mock_capture_exception.assert_called_once_with() + mock_metrics_incr.assert_any_call("issues.severity.error", tags={"reason": "unknown"}) + assert severity == 1.0 + assert reason == "microservice_error" + assert cache.get(SEER_ERROR_COUNT_KEY) == 1 + @patch( "sentry.event_manager.severity_connection_pool.urlopen", side_effect=Exception("It broke"),