diff --git a/src/sentry/event_manager.py b/src/sentry/event_manager.py index 128d2aebdf0c0b..bf439f829a3fe6 100644 --- a/src/sentry/event_manager.py +++ b/src/sentry/event_manager.py @@ -114,6 +114,7 @@ from sentry.models.releaseprojectenvironment import ReleaseProjectEnvironment from sentry.models.releases.release_project import ReleaseProject from sentry.net.http import connection_from_url +from sentry.options.rollout import in_random_rollout from sentry.plugins.base import plugins from sentry.quotas.base import index_data_category from sentry.receivers.features import record_event_processed @@ -1961,6 +1962,12 @@ def _process_existing_aggregate( timeout=settings.SEER_SEVERITY_TIMEOUT, # Defaults to 300 milliseconds ) +severity_connection_pool_group_seer = connection_from_url( + settings.SEER_SCORING_URL, + retries=settings.SEER_SEVERITY_RETRIES, + timeout=settings.SEER_SEVERITY_TIMEOUT, # Defaults to 300 milliseconds +) + class SeverityScoreRequest(TypedDict): message: str @@ -1983,8 +1990,11 @@ def make_severity_score_request( payload["trigger_timeout"] = True if options.get("processing.severity-backlog-test.error"): payload["trigger_error"] = True + default_connection_pool = severity_connection_pool + if in_random_rollout("issues.severity.group-seer-rollout-rate"): + default_connection_pool = severity_connection_pool_group_seer return make_signed_seer_api_request( - connection_pool or severity_connection_pool, + connection_pool or default_connection_pool, "/v0/issues/severity-score", body=orjson.dumps(payload), timeout=timeout, diff --git a/src/sentry/options/defaults.py b/src/sentry/options/defaults.py index 8ce8595c1e23f5..5c29b676cb32f1 100644 --- a/src/sentry/options/defaults.py +++ b/src/sentry/options/defaults.py @@ -1132,6 +1132,12 @@ flags=FLAG_ALLOW_EMPTY | FLAG_AUTOMATOR_MODIFIABLE, ) +register( + "issues.severity.group-seer-rollout-rate", + type=Float, + default=0.0, + flags=FLAG_AUTOMATOR_MODIFIABLE, +) # Killswitch for issue priority register( diff --git a/tests/sentry/event_manager/test_severity.py b/tests/sentry/event_manager/test_severity.py index cb3043301192aa..c7977a1d7e3640 100644 --- a/tests/sentry/event_manager/test_severity.py +++ b/tests/sentry/event_manager/test_severity.py @@ -17,8 +17,11 @@ from sentry.event_manager import ( SEER_ERROR_COUNT_KEY, EventManager, + SeverityScoreRequest, _get_severity_score, + make_severity_score_request, severity_connection_pool, + severity_connection_pool_group_seer, ) from sentry.models.group import Group from sentry.testutils.cases import TestCase @@ -329,6 +332,24 @@ def test_other_exception( assert reason == "microservice_error" assert cache.get(SEER_ERROR_COUNT_KEY) == 1 + @patch("sentry.event_manager.make_signed_seer_api_request") + def test_group_seer_rollout_selects_pool(self, mock_request: MagicMock) -> None: + body: SeverityScoreRequest = { + "message": "boom", + "has_stacktrace": 0, + "handled": True, + "org_id": 1, + "project_id": 1, + } + + with override_options({"issues.severity.group-seer-rollout-rate": 0.0}): + make_severity_score_request(body) + assert mock_request.call_args[0][0] is severity_connection_pool + + with override_options({"issues.severity.group-seer-rollout-rate": 1.0}): + make_severity_score_request(body) + assert mock_request.call_args[0][0] is severity_connection_pool_group_seer + @with_feature("projects:first-event-severity-calculation") @with_feature("organizations:seer-based-priority")