Skip to content

Commit

Permalink
/incident/{incident-id}/alerts now return only alerts with unique fin…
Browse files Browse the repository at this point in the history
…gerprints
  • Loading branch information
VladimirFilonov committed Oct 18, 2024
1 parent 46acbef commit ce997f0
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 9 deletions.
29 changes: 24 additions & 5 deletions keep/api/core/db.py
Original file line number Diff line number Diff line change
Expand Up @@ -2838,21 +2838,38 @@ def get_incident_alerts_and_links_by_incident_id(
tenant_id: str,
incident_id: UUID | str,
limit: Optional[int] = None,
offset: Optional[int] = None,
offset: Optional[int] = 0,
session: Optional[Session] = None,
include_unlinked: bool = False,
) -> tuple[List[tuple[Alert, AlertToIncident]], int]:
with existed_or_new_session(session) as session:

last_fingerprints_subquery = (
session.query(Alert.fingerprint, func.max(Alert.timestamp).label("max_timestamp"))
.join(AlertToIncident, AlertToIncident.alert_id == Alert.id)
.filter(
AlertToIncident.tenant_id == tenant_id,
AlertToIncident.incident_id == incident_id,
)
.group_by(Alert.fingerprint)
.subquery()
)

query = (
session.query(
Alert,
AlertToIncident,
)
.select_from(last_fingerprints_subquery)
.outerjoin(Alert, and_(
last_fingerprints_subquery.c.fingerprint == Alert.fingerprint,
last_fingerprints_subquery.c.max_timestamp == Alert.timestamp,

))
.join(AlertToIncident, AlertToIncident.alert_id == Alert.id)
.join(Incident, AlertToIncident.incident_id == Incident.id)
.filter(
AlertToIncident.tenant_id == tenant_id,
Incident.id == incident_id,
AlertToIncident.incident_id == incident_id,
)
.order_by(col(Alert.timestamp).desc())
)
Expand All @@ -2863,8 +2880,10 @@ def get_incident_alerts_and_links_by_incident_id(

total_count = query.count()

if limit and offset:
query = query.limit(limit).offset(offset)
if limit:
query = query.limit(limit)
if offset:
query = query.offset(offset)

return query.all(), total_count

Expand Down
10 changes: 6 additions & 4 deletions tests/test_rules_engine.py
Original file line number Diff line number Diff line change
Expand Up @@ -385,6 +385,7 @@ def test_incident_resolution_on_all(db_session, create_alert):
)
assert alert_count == 2

# Same fingerprint
create_alert(
f"Something went wrong",
AlertStatus.RESOLVED,
Expand All @@ -409,7 +410,8 @@ def test_incident_resolution_on_all(db_session, create_alert):
limit=10,
offset=0,
)
assert alert_count == 3
# Still 2 alerts, since 2 unique fingerprints
assert alert_count == 2
assert incident.status == IncidentStatus.FIRING.value

create_alert(
Expand All @@ -436,7 +438,7 @@ def test_incident_resolution_on_all(db_session, create_alert):
limit=10,
offset=0,
)
assert alert_count == 4
assert alert_count == 2
assert incident.status == IncidentStatus.RESOLVED.value


Expand Down Expand Up @@ -528,7 +530,7 @@ def test_incident_resolution_on_edge(db_session, create_alert, direction, second
limit=10,
offset=0,
)
assert alert_count == 3
assert alert_count == 2
assert incident.status == IncidentStatus.FIRING.value

create_alert(
Expand All @@ -555,7 +557,7 @@ def test_incident_resolution_on_edge(db_session, create_alert, direction, second
limit=10,
offset=0,
)
assert alert_count == 4
assert alert_count == 2
assert incident.status == IncidentStatus.RESOLVED.value

# Next steps:
Expand Down

0 comments on commit ce997f0

Please sign in to comment.