Skip to content

Commit 4c6f526

Browse files
authored
Merge pull request #5890 from opsmill/pog-event-retry-IFC-1280
Retry event query to prefects events API on failures
2 parents b9d7df7 + 7c4b6f6 commit 4c6f526

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

@@ -216,8 +218,17 @@ async def query_events(
216218
) -> PrefectEventResponse:
217219
body = {"limit": limit, "filter": filters.model_dump(mode="json", exclude_none=True), "offset": offset}
218220

219-
response = await client._client.post("/infrahub/events/filter", json=body)
220-
response.raise_for_status()
221+
# Retry due to https://github.com/PrefectHQ/prefect/issues/16299
222+
for _ in range(1, 5):
223+
response = await client._client.post("/infrahub/events/filter", json=body)
224+
if response.status_code == 200:
225+
break
226+
await asyncio.sleep(0.1)
227+
228+
if response.status_code != 200:
229+
raise ServiceUnavailableError(
230+
message=f"Unable to query prefect due to invalid response from the server (status_code={response.status_code})"
231+
)
221232
data: dict[str, Any] = response.json()
222233

223234
return PrefectEventResponse(

0 commit comments

Comments
 (0)