diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 250b862673c192d6be0a789180f505420595d6ea..c3789db0f853ef295bd225a0e8c56a4ba32d713b 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -14,6 +14,7 @@ Added * Add preference for configuring the default phone number country code. * Persons and groups now have two image fields: official photo and public avatar +* Admins recieve an mail for celery tasks with status "FAILURE" Added ~~~~~ diff --git a/aleksis/core/celery.py b/aleksis/core/celery.py index 27a67c539babfc61701cc9521b42187ebebc5787..10457ea9b84871da3038cf4712babb601456bfcd 100644 --- a/aleksis/core/celery.py +++ b/aleksis/core/celery.py @@ -1,9 +1,36 @@ import os +from django.conf import settings + from celery import Celery +from celery.signals import task_failure +from templated_email import send_templated_mail + +from .util.core_helpers import get_site_preferences os.environ.setdefault("DJANGO_SETTINGS_MODULE", "aleksis.core.settings") app = Celery("aleksis") # noqa app.config_from_object("django.conf:settings", namespace="CELERY") app.autodiscover_tasks() + + +@task_failure.connect +def task_failure_notifier( + sender=None, task_id=None, exception=None, args=None, traceback=None, **kwargs +): + recipient_list = [e[1] for e in settings.ADMINS] + send_templated_mail( + template_name="celery_failure", + from_email=get_site_preferences()["mail__address"], + recipient_list=recipient_list, + context={ + "task_name": sender.name, + "task": str(sender), + "task_id": str(task_id), + "exception": str(exception), + "args": str(args), + "kwargs": str(kwargs), + "traceback": str(traceback), + }, + ) diff --git a/aleksis/core/templates/templated_email/celery_failure.email b/aleksis/core/templates/templated_email/celery_failure.email new file mode 100644 index 0000000000000000000000000000000000000000..d355823eb70e58f393c6a9006ed2045ac1882171 --- /dev/null +++ b/aleksis/core/templates/templated_email/celery_failure.email @@ -0,0 +1,44 @@ +{% load i18n %} + +{% block subject %} + {% blocktrans with task_name=task_name%} Celery task {{ task_name }} failed!{% endblocktrans %} +{% endblock %} + +{% block plain %} + {% trans "Hello," %} + {% blocktrans with task_name=task_name %} + the celery task {{ task_name }} failed with following information: + {% endblocktrans %} + + +{% blocktrans with task_name=task_name task=task task_id=task_id exception=exception args=args kwargs=kwargs traceback=traceback %} + * Task name: {{task_name}} + * Task: {{task}} + * Id of the task: {{task_id}} + * Exception instance raised: {{ exception }} + * Positional arguments the task was called with: {{ args }} + * Keyword arguments the task was called with: {{ kwargs }} + * Stack trace object: {{ traceback }} +{% endblocktrans %} +{% endblock %} + +{% block html %} + <p>{% trans "Hello," %}</p> + <p> + {% blocktrans with task_name=task_name %} + the celery task {{ task_name }} failed with following information: + {% endblocktrans %} + </p> + + <ul> + {% blocktrans with task_name=task_name task=task task_id=task_id exception=exception args=args kwargs=kwargs traceback=traceback %} + <li>Task name: {{task_name}}</li> + <li>Task: {{task}}</li> + <li>Id of the task: {{task_id}}</li> + <li>Exception instance raised: {{ exception }}</li> + <li>Positional arguments the task was called with: {{ args }}</li> + <li>Keyword arguments the task was called with: {{ kwargs }}</li> + <li>Stack trace object: {{ traceback }}</li> + </ul> + {% endblocktrans %} +{% endblock %}