diff --git a/CHANGELOG.rst b/CHANGELOG.rst index b1e810f1a09e831d58e6c86d3aceea742bd6975e..1d173115ffb473302fe8dd3f5196ddb373a5d5ab 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -13,6 +13,7 @@ Added ~~~~~ * Add preference for configuring the default phone number country code. +* 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 %}