diff --git a/engine/apps/api/tests/test_alert_group.py b/engine/apps/api/tests/test_alert_group.py index d053e5fdf8..9ef2b76dcd 100644 --- a/engine/apps/api/tests/test_alert_group.py +++ b/engine/apps/api/tests/test_alert_group.py @@ -2421,7 +2421,9 @@ def test_alert_group_affected_services( make_user_for_organization, make_user_auth_headers, make_alert_group_label_association, + settings, ): + settings.FEATURE_SERVICE_DEPENDENCIES_ENABLED = True _, token, alert_groups = alert_group_internal_api_setup resolved_ag, ack_ag, new_ag, silenced_ag = alert_groups organization = new_ag.channel.organization @@ -2454,3 +2456,29 @@ def test_alert_group_affected_services( }, ] assert response.json() == expected + + +@pytest.mark.django_db +def test_alert_group_service_dependencies_feature_not_enabled( + alert_group_internal_api_setup, + make_user_for_organization, + make_user_auth_headers, + make_alert_group_label_association, + settings, +): + settings.FEATURE_SERVICE_DEPENDENCIES_ENABLED = False + _, token, alert_groups = alert_group_internal_api_setup + _, _, new_ag, _ = alert_groups + organization = new_ag.channel.organization + user = make_user_for_organization(organization) + + # set firing alert group service label + make_alert_group_label_association(organization, new_ag, key_name="service_name", value_name="service-a") + + client = APIClient() + url = reverse("api-internal:alertgroup-filter-affected-services") + + url = f"{url}?service=service-1" + response = client.get(url, format="json", **make_user_auth_headers(user, token)) + + assert response.status_code == status.HTTP_404_NOT_FOUND diff --git a/engine/apps/api/views/alert_group.py b/engine/apps/api/views/alert_group.py index eaa32dbfc6..2cf4f9502a 100644 --- a/engine/apps/api/views/alert_group.py +++ b/engine/apps/api/views/alert_group.py @@ -916,6 +916,8 @@ def escalation_snapshot(self, request, pk=None): @action(methods=["get"], detail=False) def filter_affected_services(self, request): """Given a list of service names, return the ones that have active alerts.""" + if not settings.FEATURE_SERVICE_DEPENDENCIES_ENABLED: + raise NotFound organization = self.request.auth.organization services = self.request.query_params.getlist("service", []) url_builder = UIURLBuilder(organization) diff --git a/engine/apps/api/views/features.py b/engine/apps/api/views/features.py index 7e35597aaf..597fd92cb3 100644 --- a/engine/apps/api/views/features.py +++ b/engine/apps/api/views/features.py @@ -26,6 +26,7 @@ class Feature(enum.StrEnum): GRAFANA_ALERTING_V2 = "grafana_alerting_v2" LABELS = "labels" GOOGLE_OAUTH2 = "google_oauth2" + SERVICE_DEPENDENCIES = "service_dependencies" class FeaturesAPIView(APIView): @@ -72,4 +73,7 @@ def _get_enabled_features(self, request): if settings.GOOGLE_OAUTH2_ENABLED: enabled_features.append(Feature.GOOGLE_OAUTH2) + if settings.FEATURE_SERVICE_DEPENDENCIES_ENABLED: + enabled_features.append(Feature.SERVICE_DEPENDENCIES) + return enabled_features diff --git a/engine/settings/base.py b/engine/settings/base.py index 007779f195..d5be922b09 100644 --- a/engine/settings/base.py +++ b/engine/settings/base.py @@ -76,6 +76,7 @@ FEATURE_ALERT_GROUP_SEARCH_CUTOFF_DAYS = getenv_integer("FEATURE_ALERT_GROUP_SEARCH_CUTOFF_DAYS", default=None) FEATURE_NOTIFICATION_BUNDLE_ENABLED = getenv_boolean("FEATURE_NOTIFICATION_BUNDLE_ENABLED", default=True) FEATURE_DECLARE_INCIDENT_STEP_ENABLED = getenv_boolean("FEATURE_DECLARE_INCIDENT_STEP_ENABLED", default=False) +FEATURE_SERVICE_DEPENDENCIES_ENABLED = getenv_boolean("FEATURE_SERVICE_DEPENDENCIES_ENABLED", default=False) TWILIO_API_KEY_SID = os.environ.get("TWILIO_API_KEY_SID") TWILIO_API_KEY_SECRET = os.environ.get("TWILIO_API_KEY_SECRET")