Celery отправляет почту для каждой неудачной задачи

Я использую сельдерей в своем приложении django, и у меня есть цветок сельдерея, чтобы отслеживать задачи сельдерея. У меня есть задачи настройки, когда электронные письма отправляются пользователю, когда он регистрирует/отправляет/события FP и т.д. Теперь Цветок дает мне подробные сведения о задаче и ее статусе. Теперь для каждой неудачной задачи я хотел отправить электронное письмо на свою учетную запись, чтобы мне не приходилось каждый день проверять цветок на предмет неудачной задачи. Я выполнил следующую настройку в файле settings.py

CELERY_SEND_TASK_ERROR_EMAILS = True 

и ADMINS.

EMAIL_USE_TLS = True
EMAIL_HOST_USER = '[email protected]'
EMAIL_HOST_PASSWORD = 'xyz123@'
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
SERVER_EMAIL = EMAIL_HOST_USER
EMAIL_HOST = 'xyz.abc.com'
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'

Это настройки адреса электронной почты "От". Несколько дней назад один из членов моей команды случайно изменил пароль вышеуказанного адреса электронной почты и забыл обновить файл настроек. Не было слишком поздно, чтобы задачи не выполнялись из-за ошибки аутентификации SMTP.

Есть ли способ обойти это, даже если произойдет ошибка аутентификации SMTP, я сразу же получу электронное письмо от сельдерея? Я не уверен в этом.

Существуют ли какие-либо другие инструменты, которые будут отслеживать мои задачи и при каждой невыполненной задаче присылать мне письмо.


person Akshay Shah    schedule 11.04.2016    source источник


Ответы (2)


Я узнал, что для ведения задач в базе данных создана таблица. Поэтому я просто создал сценарий, который будет проверять наличие невыполненных задач каждый час для записей за последний час в таблице, и если они будут найдены, он отправит электронное письмо.

script.py

#!venv/bin/python2

import os
from django.conf import settings

if __name__ == '__main__' and __package__ is None:
    os.sys.path.append(
        os.path.dirname(
            os.path.dirname(
                os.path.abspath(__file__))))

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "rest_apis.settings")

import django

django.setup()
from django.core.mail import EmailMessage
from djcelery.models import TaskMeta
from datetime import datetime, timedelta, time


USERS_TO_NOTIFY = ['[email protected]']
TIME_THRESHOLD_INTERVAL = 60

def send_email(email_subject_line, email_body):
    email = EmailMessage(email_subject_line,
                         email_body,
                         settings.EMAIL_HOST_USER,
                         USERS_TO_NOTIFY
                         )
    email.send()


def main():
    current_time = datetime.now()   # Get Current TimeStamp
    time_threshold = current_time - timedelta(minutes=TIME_THRESHOLD_INTERVAL) # Get 60 minutes past current time stamp
    celery_taskmeta_objects = TaskMeta.objects.filter(status="FAILURE", date_done__gte=time_threshold)

    email_body = "Below are the tasks which failed : "
    if celery_taskmeta_objects.exists():
        for celery_taskmeta in celery_taskmeta_objects:
            print celery_taskmeta.task_id
            email_body += "\n\ntask_id : %s" % celery_taskmeta.task_id
            email_body += "\nstatus : %s" % celery_taskmeta.status
            email_body += "\ndate : %s" % celery_taskmeta.date_done
            email_body += "\ntraceback :"
            email_body += "\n%s\n\n" % celery_taskmeta.traceback
        email_subject_line = '[URGENT] Celery task failure in last %s minutes' % (TIME_THRESHOLD_INTERVAL)
        send_email(email_subject_line, email_body)


main()

Теперь в электронном письме я также получаю полную трассировку стека и идентификатор задачи. Теперь моим требованием было проверять каждый час, поэтому я просто поместил скрипт в crontab. Теперь вы можете изменить временной порог в соответствии с вашими основными потребностями и работать соответственно.

person Akshay Shah    schedule 11.05.2016

Вы можете настроить Datadog https://www.datadoghq.com/

Он может контролировать и отслеживать вашу динамическую инфраструктуру. Вы будете получать электронное письмо о каждой ошибке, возникшей на вашем рабочем сервере.

person Mani    schedule 11.04.2016