首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >芹菜为每一项失败的任务发送邮件

芹菜为每一项失败的任务发送邮件
EN

Stack Overflow用户
提问于 2016-04-11 05:34:34
回答 2查看 2.9K关注 0票数 3

我在我的django应用程序中使用芹菜,我已经设置了芹菜花来监测芹菜的任务。我有设置任务,电子邮件是发送给用户时,他们注册/提交/FP等事件。现在,Flower给了我一个很好的细节,任务和它的状态。现在,对于每一个失败的任务,我想要一封电子邮件发送到我的帐户,这样我就没有每天检查花失败的任务。我在settings.py文件中做了以下配置

代码语言:javascript
运行
复制
CELERY_SEND_TASK_ERROR_EMAILS = True 

ADMINS

代码语言:javascript
运行
复制
EMAIL_USE_TLS = True
EMAIL_HOST_USER = 'noreply@xyz.com'
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'

这些是“从”电子邮件地址的设置。几天前,我的一个团队成员不小心更改了上面email_host的密码,忘了更新设置文件。由于SMTP身份验证错误,任务失败的时间不是太晚。

有没有办法避免这种情况,即使发生SMTP身份验证错误,我也会立即收到芹菜的电子邮件吗?我对此不太确定。

有没有其他工具可以监视我的任务,对于每一个失败的任务,它都会给我发邮件。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-11 10:09:52

我发现有一个表用于维护数据库中的任务。因此,我只是简单地创建了一个脚本,它将每小时检查一次失败的任务,记录在表中,如果找到,它会发送一封电子邮件。

script.py

代码语言:javascript
运行
复制
#!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 = ['ops@yopmail.com']
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()

现在,在一封电子邮件中,我也得到了一个完整的堆栈跟踪和任务的id。现在我的要求是每小时检查一次,所以我把脚本放在一个crontab中。现在,您可以根据您的基本需求更改时间阈值,并相应地工作。

票数 2
EN

Stack Overflow用户

发布于 2016-04-11 06:06:50

您可以配置Datadog https://www.datadoghq.com/

它可以监视和跟踪您的动态基础设施。如果在生产服务器上发生错误,您将收到一封电子邮件。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36540515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档