diff options
author | Alex Grönholm <alex.gronholm@nextday.fi> | 2022-08-14 01:15:40 +0300 |
---|---|---|
committer | Alex Grönholm <alex.gronholm@nextday.fi> | 2022-08-14 01:15:40 +0300 |
commit | 0d91a6bf32c7bb9f349f5af130300130da6caa52 (patch) | |
tree | 3309d1df8441f0f36cd84229f7ab24b1fae82e7f /src | |
parent | 03a429a7e52cdcb71922aa27b89ec08337f3f4cf (diff) | |
download | apscheduler-0d91a6bf32c7bb9f349f5af130300130da6caa52.tar.gz |
Added exception information to the JobReleased class
Diffstat (limited to 'src')
-rw-r--r-- | src/apscheduler/_events.py | 32 | ||||
-rw-r--r-- | src/apscheduler/_utils.py | 8 | ||||
-rw-r--r-- | src/apscheduler/workers/async_.py | 18 | ||||
-rw-r--r-- | src/apscheduler/workers/sync.py | 12 |
4 files changed, 47 insertions, 23 deletions
diff --git a/src/apscheduler/_events.py b/src/apscheduler/_events.py index 19be9ee..23735c7 100644 --- a/src/apscheduler/_events.py +++ b/src/apscheduler/_events.py @@ -2,6 +2,7 @@ from __future__ import annotations from datetime import datetime, timezone from functools import partial +from traceback import format_tb from typing import Any from uuid import UUID @@ -11,6 +12,8 @@ from attrs.converters import optional from . import abc from ._converters import as_aware_datetime, as_uuid from ._enums import JobOutcome +from ._structures import JobResult +from ._utils import qualified_name def serialize(inst, field, value): @@ -248,8 +251,37 @@ class JobReleased(WorkerEvent): :param job_id: the ID of the job that was released :param worker_id: the ID of the worker that released the job :param outcome: the outcome of the job + :param exception_type: the fully qualified name of the exception if ``outcome`` is + :data:`JobOutcome.error` + :param exception_message: the result of ``str(exception)`` if ``outcome`` is + :data:`JobOutcome.error` + :param exception_traceback: the traceback lines from the exception if ``outcome`` is + :data:`JobOutcome.error` """ job_id: UUID = attrs.field(converter=as_uuid) worker_id: str outcome: JobOutcome + exception_type: str | None = None + exception_message: str | None = None + exception_traceback: list[str] | None = None + + @classmethod + def from_result(cls, result: JobResult, worker_id: str) -> JobReleased: + if result.exception is not None: + exception_type: str | None = qualified_name(result.exception.__class__) + exception_message: str | None = str(result.exception) + exception_traceback: list[str] | None = format_tb( + result.exception.__traceback__ + ) + else: + exception_type = exception_message = exception_traceback = None + + return cls( + job_id=result.job_id, + worker_id=worker_id, + outcome=result.outcome, + exception_type=exception_type, + exception_message=exception_message, + exception_traceback=exception_traceback, + ) diff --git a/src/apscheduler/_utils.py b/src/apscheduler/_utils.py index 1611ec7..70bdbc9 100644 --- a/src/apscheduler/_utils.py +++ b/src/apscheduler/_utils.py @@ -22,3 +22,11 @@ def timezone_repr(timezone: tzinfo) -> str: def absolute_datetime_diff(dateval1: datetime, dateval2: datetime) -> float: return dateval1.timestamp() - dateval2.timestamp() + + +def qualified_name(cls: type) -> str: + module = getattr(cls, "__module__", None) + if module is None or module == "builtins": + return cls.__qualname__ + else: + return f"{module}.{cls.__qualname__}" diff --git a/src/apscheduler/workers/async_.py b/src/apscheduler/workers/async_.py index b04eea1..ec374cb 100644 --- a/src/apscheduler/workers/async_.py +++ b/src/apscheduler/workers/async_.py @@ -179,9 +179,7 @@ class AsyncWorker: ) await self.data_store.release_job(self.identity, job.task_id, result) await self.event_broker.publish( - JobReleased( - job_id=job.id, worker_id=self.identity, outcome=result.outcome - ) + JobReleased.from_result(result, self.identity) ) return @@ -201,11 +199,7 @@ class AsyncWorker: self.identity, job.task_id, result ) await self.event_broker.publish( - JobReleased( - job_id=job.id, - worker_id=self.identity, - outcome=result.outcome, - ) + JobReleased.from_result(result, self.identity) ) except BaseException as exc: if isinstance(exc, Exception): @@ -226,9 +220,7 @@ class AsyncWorker: result, ) await self.event_broker.publish( - JobReleased( - job_id=job.id, worker_id=self.identity, outcome=result.outcome - ) + JobReleased.from_result(result, self.identity) ) if not isinstance(exc, Exception): raise @@ -241,9 +233,7 @@ class AsyncWorker: ) await self.data_store.release_job(self.identity, job.task_id, result) await self.event_broker.publish( - JobReleased( - job_id=job.id, worker_id=self.identity, outcome=result.outcome - ) + JobReleased.from_result(result, self.identity) ) finally: current_job.reset(token) diff --git a/src/apscheduler/workers/sync.py b/src/apscheduler/workers/sync.py index 8c627c6..26e4df6 100644 --- a/src/apscheduler/workers/sync.py +++ b/src/apscheduler/workers/sync.py @@ -205,9 +205,7 @@ class Worker: job, JobOutcome.missed_start_deadline, finished_at=start_time ) self.event_broker.publish( - JobReleased( - job_id=job.id, worker_id=self.identity, outcome=result.outcome - ) + JobReleased.from_result(result, self.identity) ) self.data_store.release_job(self.identity, job.task_id, result) return @@ -234,9 +232,7 @@ class Worker: result, ) self.event_broker.publish( - JobReleased( - job_id=job.id, worker_id=self.identity, outcome=result.outcome - ) + JobReleased.from_result(result, self.identity) ) if not isinstance(exc, Exception): raise @@ -249,9 +245,7 @@ class Worker: ) self.data_store.release_job(self.identity, job.task_id, result) self.event_broker.publish( - JobReleased( - job_id=job.id, worker_id=self.identity, outcome=result.outcome - ) + JobReleased.from_result(result, self.identity) ) finally: current_job.reset(token) |