summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlex Grönholm <alex.gronholm@nextday.fi>2022-08-14 01:15:40 +0300
committerAlex Grönholm <alex.gronholm@nextday.fi>2022-08-14 01:15:40 +0300
commit0d91a6bf32c7bb9f349f5af130300130da6caa52 (patch)
tree3309d1df8441f0f36cd84229f7ab24b1fae82e7f /src
parent03a429a7e52cdcb71922aa27b89ec08337f3f4cf (diff)
downloadapscheduler-0d91a6bf32c7bb9f349f5af130300130da6caa52.tar.gz
Added exception information to the JobReleased class
Diffstat (limited to 'src')
-rw-r--r--src/apscheduler/_events.py32
-rw-r--r--src/apscheduler/_utils.py8
-rw-r--r--src/apscheduler/workers/async_.py18
-rw-r--r--src/apscheduler/workers/sync.py12
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)