From cde95c5b4285db11ecbf71ec893d32c2f8ed0be7 Mon Sep 17 00:00:00 2001 From: Kim Gustyr Date: Mon, 27 Jan 2025 17:46:32 +0000 Subject: [PATCH] get latest events per provider per feature per environment --- api/features/feature_health/models.py | 8 ++--- .../features/feature_health/test_models.py | 35 ++++++++++++++++++- 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/api/features/feature_health/models.py b/api/features/feature_health/models.py index aceee5fb55ac..5f975b05af8b 100644 --- a/api/features/feature_health/models.py +++ b/api/features/feature_health/models.py @@ -79,8 +79,8 @@ def get_latest_by_feature( ) -> "models.QuerySet[FeatureHealthEvent]": return ( self.filter(feature=feature) - .order_by("provider_name", "-created_at") - .distinct("provider_name") + .order_by("provider_name", "environment_id", "-created_at") + .distinct("provider_name", "environment_id") ) def get_latest_by_project( @@ -89,8 +89,8 @@ def get_latest_by_project( ) -> "models.QuerySet[FeatureHealthEvent]": return ( self.filter(feature__project=project) - .order_by("provider_name", "feature_id", "-created_at") - .distinct("provider_name", "feature_id") + .order_by("provider_name", "environment_id", "feature_id", "-created_at") + .distinct("provider_name", "environment_id", "feature_id") ) diff --git a/api/tests/unit/features/feature_health/test_models.py b/api/tests/unit/features/feature_health/test_models.py index 60f61b562af9..baa1269fe277 100644 --- a/api/tests/unit/features/feature_health/test_models.py +++ b/api/tests/unit/features/feature_health/test_models.py @@ -53,29 +53,55 @@ def test_feature_health_provider__get_audit_log_author__return_expected( def test_feature_health_event__get_latest_by_feature__return_expected( project: Project, feature: Feature, + environment: Environment, ) -> None: # Given unrelated_feature = Feature.objects.create( project=project, name="unrelated_feature" ) + environment_2 = Environment.objects.create(project=project, name="Environment 2") latest_provider1_event = FeatureHealthEvent.objects.create( feature=feature, type="UNHEALTHY", provider_name="provider1", ) + latest_provider1_environment_event = FeatureHealthEvent.objects.create( + feature=feature, + type="UNHEALTHY", + provider_name="provider1", + environment=environment, + ) with freeze_time(now - datetime.timedelta(hours=1)): older_provider1_event = FeatureHealthEvent.objects.create( feature=feature, type="HEALTHY", provider_name="provider1", ) + older_provider1_environment_event = FeatureHealthEvent.objects.create( + feature=feature, + type="HEALTHY", + provider_name="provider1", + environment=environment, + ) + latest_provider_1_environment_2_event = FeatureHealthEvent.objects.create( + feature=feature, + type="UNHEALTHY", + provider_name="provider1", + environment=environment_2, + ) with freeze_time(now - datetime.timedelta(hours=2)): latest_provider2_event = FeatureHealthEvent.objects.create( feature=feature, type="UNHEALTHY", provider_name="provider2", ) + older_provider_1_environment_2_event = FeatureHealthEvent.objects.create( + feature=feature, + type="HEALTHY", + provider_name="provider1", + environment=environment_2, + ) unrelated_feature_event = FeatureHealthEvent.objects.create( feature=unrelated_feature, type="UNHEALTHY", @@ -86,8 +112,15 @@ def test_feature_health_event__get_latest_by_feature__return_expected( feature_health_events = [*FeatureHealthEvent.objects.get_latest_by_feature(feature)] # Then - assert feature_health_events == [latest_provider1_event, latest_provider2_event] + assert feature_health_events == [ + latest_provider1_environment_event, + latest_provider_1_environment_2_event, + latest_provider1_event, + latest_provider2_event, + ] assert older_provider1_event not in feature_health_events + assert older_provider1_environment_event not in feature_health_events + assert older_provider_1_environment_2_event not in feature_health_events assert unrelated_feature_event not in feature_health_events