Skip to content

Commit 7c4b6f6

Browse files
committed
Retry event query to prefects events API on failures
1 parent 76d0edb commit 7c4b6f6

File tree

2 files changed

+22
-2
lines changed

2 files changed

+22
-2
lines changed

backend/infrahub/exceptions.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,15 @@ def __init__(self, message: str) -> None:
4949
super().__init__(self.message)
5050

5151

52+
class ServiceUnavailableError(Error):
53+
HTTP_CODE: int = 503
54+
DESCRIPTION = "Service unavailable"
55+
56+
def __init__(self, message: str) -> None:
57+
self.message = message
58+
super().__init__(self.message)
59+
60+
5261
class LockError(Error):
5362
pass
5463

backend/infrahub/task_manager/event.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
from __future__ import annotations
22

3+
import asyncio
34
from typing import TYPE_CHECKING, Any
45

56
from prefect.client.orchestration import PrefectClient, get_client
67
from prefect.events.schemas.events import Event as PrefectEventModel
78
from pydantic import BaseModel, Field, TypeAdapter
89

910
from infrahub.core.constants import GLOBAL_BRANCH_NAME
11+
from infrahub.exceptions import ServiceUnavailableError
1012
from infrahub.log import get_logger
1113
from infrahub.utils import get_nested_dict
1214

@@ -192,8 +194,17 @@ async def query_events(
192194
) -> PrefectEventResponse:
193195
body = {"limit": limit, "filter": filters.model_dump(mode="json", exclude_none=True), "offset": offset}
194196

195-
response = await client._client.post("/infrahub/events/filter", json=body)
196-
response.raise_for_status()
197+
# Retry due to https://github.com/PrefectHQ/prefect/issues/16299
198+
for _ in range(1, 5):
199+
response = await client._client.post("/infrahub/events/filter", json=body)
200+
if response.status_code == 200:
201+
break
202+
await asyncio.sleep(0.1)
203+
204+
if response.status_code != 200:
205+
raise ServiceUnavailableError(
206+
message=f"Unable to query prefect due to invalid response from the server (status_code={response.status_code})"
207+
)
197208
data: dict[str, Any] = response.json()
198209

199210
return PrefectEventResponse(

0 commit comments

Comments
 (0)