Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Backend support for feature health #5023

Merged
merged 29 commits into from
Jan 29, 2025
Merged
Changes from 1 commit
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
get latest events per provider per feature per environment
  • Loading branch information
khvn26 committed Jan 28, 2025
commit cde95c5b4285db11ecbf71ec893d32c2f8ed0be7
8 changes: 4 additions & 4 deletions api/features/feature_health/models.py
Original file line number Diff line number Diff line change
@@ -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")
)


35 changes: 34 additions & 1 deletion api/tests/unit/features/feature_health/test_models.py
Original file line number Diff line number Diff line change
@@ -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


Loading