|
@@ -181,7 +181,8 @@ class TaskWrapper(object):
|
|
|
self.retries = retries
|
|
|
self.args = args
|
|
|
self.kwargs = kwargs
|
|
|
- self.logger = kwargs.get("logger")
|
|
|
+ self.logger = opts.get("logger")
|
|
|
+ self.eventer = opts.get("eventer")
|
|
|
self.on_ack = on_ack
|
|
|
self.executed = False
|
|
|
for opt in ("success_msg", "fail_msg", "fail_email_subject",
|
|
@@ -200,7 +201,7 @@ class TaskWrapper(object):
|
|
|
self.args, self.kwargs)
|
|
|
|
|
|
@classmethod
|
|
|
- def from_message(cls, message, message_data, logger=None):
|
|
|
+ def from_message(cls, message, message_data, logger=None, eventer=None):
|
|
|
"""Create a :class:`TaskWrapper` from a task message sent by
|
|
|
:class:`celery.messaging.TaskPublisher`.
|
|
|
|
|
@@ -221,7 +222,8 @@ class TaskWrapper(object):
|
|
|
for key, value in kwargs.items())
|
|
|
|
|
|
return cls(task_name, task_id, args, kwargs,
|
|
|
- retries=retries, on_ack=message.ack, logger=logger)
|
|
|
+ retries=retries, on_ack=message.ack,
|
|
|
+ logger=logger, eventer=eventer)
|
|
|
|
|
|
def extend_with_default_kwargs(self, loglevel, logfile):
|
|
|
"""Extend the tasks keyword arguments with standard task arguments.
|
|
@@ -275,6 +277,10 @@ class TaskWrapper(object):
|
|
|
tracer = WorkerTaskTrace(*self._get_tracer_args(loglevel, logfile))
|
|
|
return tracer.execute()
|
|
|
|
|
|
+ def send_event(self, type, **fields):
|
|
|
+ if self.eventer:
|
|
|
+ self.eventer.send(type, **fields)
|
|
|
+
|
|
|
def execute_using_pool(self, pool, loglevel=None, logfile=None):
|
|
|
"""Like :meth:`execute`, but using the :mod:`multiprocessing` pool.
|
|
|
|
|
@@ -290,6 +296,8 @@ class TaskWrapper(object):
|
|
|
# Make sure task has not already been executed.
|
|
|
self._set_executed_bit()
|
|
|
|
|
|
+ self.send_event("task-accepted", uuid=self.task_id)
|
|
|
+
|
|
|
args = self._get_tracer_args(loglevel, logfile)
|
|
|
return pool.apply_async(execute_and_trace, args=args,
|
|
|
callbacks=[self.on_success], errbacks=[self.on_failure],
|
|
@@ -298,6 +306,9 @@ class TaskWrapper(object):
|
|
|
def on_success(self, ret_value):
|
|
|
"""The handler used if the task was successfully processed (
|
|
|
without raising an exception)."""
|
|
|
+
|
|
|
+ self.send_event("task-succeeded", uuid=self.task_id, result=ret_value)
|
|
|
+
|
|
|
msg = self.success_msg.strip() % {
|
|
|
"id": self.task_id,
|
|
|
"name": self.task_name,
|
|
@@ -308,6 +319,10 @@ class TaskWrapper(object):
|
|
|
"""The handler used if the task raised an exception."""
|
|
|
from celery.conf import SEND_CELERY_TASK_ERROR_EMAILS
|
|
|
|
|
|
+ self.send_event("task-failed", uuid=self.task_id,
|
|
|
+ exception=exc_info.exception,
|
|
|
+ traceback=exc_info.traceback)
|
|
|
+
|
|
|
context = {
|
|
|
"hostname": socket.gethostname(),
|
|
|
"id": self.task_id,
|
|
@@ -321,7 +336,7 @@ class TaskWrapper(object):
|
|
|
|
|
|
task_obj = tasks.get(self.task_name, object)
|
|
|
send_error_email = SEND_CELERY_TASK_ERROR_EMAILS and not \
|
|
|
- getattr(task_obj, "disable_error_emails", False)
|
|
|
+ task_obj.disable_error_emails
|
|
|
if send_error_email:
|
|
|
subject = self.fail_email_subject.strip() % context
|
|
|
body = self.fail_email_body.strip() % context
|