From be953d8abcfe3ba1498f2e8f73cd266c25131d3b Mon Sep 17 00:00:00 2001 From: moe-berri Date: Sat, 7 Nov 2026 11:55:04 +0800 Subject: [PATCH] fix(alerts): preserve incidents with simultaneous observations --- litellm/repositories/issues.py | 2 +- tests/integration/database/test_issues.py | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/litellm/repositories/issues.py b/litellm/repositories/issues.py index aead2ad0223..7e4f2b436ec 100644 --- a/litellm/repositories/issues.py +++ b/litellm/repositories/issues.py @@ -487,7 +487,7 @@ class IssuesRepository: """WITH changed AS ( UPDATE "LiteLLM_Issue" SET active=false, status=CASE WHEN status='open' THEN 'resolved' ELSE status END,updated_at=CURRENT_TIMESTAMP - WHERE id=ANY($1::text[]) AND kind='performance' AND active AND last_seen<=$2::timestamp(3) + WHERE id=ANY($1::text[]) AND kind='performance' AND active AND last_seen<$2::timestamp(3) RETURNING id ) SELECT count(*)::int AS count FROM changed""", list(ids), diff --git a/tests/integration/database/test_issues.py b/tests/integration/database/test_issues.py index cde6cf84880..e5457867b07 100644 --- a/tests/integration/database/test_issues.py +++ b/tests/integration/database/test_issues.py @@ -1067,7 +1067,15 @@ async def test_provider_recovery_pages_saved_cohorts_and_rejects_stale_observati assert first[0].id == inputs[0].id and second[0].id == inputs[1].id assert await store.set_status(inputs[0].id, "dismissed", "open") is not None assert await store.recover_issue_ids((inputs[0].id,), template.observed_at - timedelta(seconds=1)) == 0 - assert await store.recover_issue_ids((inputs[0].id, inputs[1].id), template.observed_at) == 2 + assert await store.recover_issue_ids((inputs[0].id, inputs[1].id), template.observed_at) == 0, ( + "A recovery at the last observed timestamp must not close the alert" + ) + assert ( + await store.recover_issue_ids( + (inputs[0].id, inputs[1].id), template.observed_at + timedelta(milliseconds=1) + ) + == 2 + ) dismissed: Final = await store.get_issue(inputs[0].id) resolved: Final = await store.get_issue(inputs[1].id) assert dismissed is not None and not dismissed.active and dismissed.status == "dismissed"