Skip to content

Commit 5a14f89

Browse files
authored
Fix #958: add more logging fields to retry job exceptions (#959)
* Fix #958: add more logging fields to retry job exceptions * Add item identifier to logs * Add logging in runner when event fails * Remove metrics from retry job logs
1 parent 24eea03 commit 5a14f89

File tree

3 files changed

+29
-6
lines changed

3 files changed

+29
-6
lines changed

jbi/queue.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
from urllib.parse import ParseResult, urlparse
3535

3636
import dockerflow.checks
37-
from pydantic import BaseModel, FileUrl, ValidationError
37+
from pydantic import BaseModel, FileUrl, ValidationError, computed_field
3838

3939
from jbi import bugzilla
4040
from jbi.environment import get_settings
@@ -74,8 +74,9 @@ class QueueItem(BaseModel, frozen=True):
7474
def timestamp(self) -> datetime:
7575
return self.payload.event.time
7676

77+
@computed_field # type: ignore
7778
@property
78-
def identifier(self):
79+
def identifier(self) -> str:
7980
return f"{self.payload.event.time}-{self.payload.bug.id}-{self.payload.event.action}-{"error" if self.error else "postponed"}"
8081

8182

@@ -271,7 +272,7 @@ async def postpone(self, payload: bugzilla.WebhookRequest) -> None:
271272

272273
async def track_failed(
273274
self, payload: bugzilla.WebhookRequest, exc: Exception
274-
) -> None:
275+
) -> QueueItem:
275276
"""
276277
Store the specified payload and exception information into the queue.
277278
"""
@@ -280,6 +281,7 @@ async def track_failed(
280281
error=PythonException.from_exc(exc),
281282
)
282283
await self.backend.put(item)
284+
return item
283285

284286
async def is_blocked(self, payload: bugzilla.WebhookRequest) -> bool:
285287
"""

jbi/retry.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,15 @@ async def retry_failed(item_executor=runner.execute_action, queue=get_dl_queue()
5252
await queue.done(item)
5353
metrics["events_processed"] += 1
5454
except Exception:
55-
logger.exception("failed to reprocess event %s.", item.identifier)
5655
metrics["events_failed"] += 1
56+
logger.exception(
57+
"failed to reprocess event %s.",
58+
item.identifier,
59+
extra={
60+
"item": item.model_dump(),
61+
"bug": {"id": bug_id},
62+
},
63+
)
5764

5865
# check for other events that will be skipped
5966
pending_events = await queue.size(bug_id)
@@ -67,8 +74,12 @@ async def retry_failed(item_executor=runner.execute_action, queue=get_dl_queue()
6774
metrics["events_skipped"] += pending_events - 1
6875
break
6976
except Exception:
70-
logger.exception("failed to parse events for bug %d.", bug_id)
7177
metrics["bugs_failed"] += 1
78+
logger.exception(
79+
"failed to parse events for bug %d.",
80+
bug_id,
81+
extra={"bug": {"id": bug_id}},
82+
)
7283

7384
return metrics
7485

jbi/runner.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,17 @@ async def execute_or_queue(
177177
except IgnoreInvalidRequestError as exc:
178178
return {"status": "invalid", "error": str(exc)}
179179
except Exception as exc:
180-
await queue.track_failed(request, exc)
180+
item = await queue.track_failed(request, exc)
181+
logger.exception(
182+
"Failed to process %r event on Bug %s. %s was put in queue.",
183+
request.event.action,
184+
request.bug.id,
185+
item.identifier,
186+
extra={
187+
"payload": request.model_dump(),
188+
"item": item.model_dump(),
189+
},
190+
)
181191
return {"status": "failed", "error": str(exc)}
182192

183193

0 commit comments

Comments
 (0)