2016-04-11 44 views
3

我在我的django应用程序中使用芹菜,并且我设置了芹菜花来监控芹菜的任务。我已经设置了在注册/提交/ FP等事件时将电子邮件发送给用户的任务。现在Flower给了我一个很好的任务细节和状态。现在,对于每一次失败的任务,我都想要一封电子邮件发送到我的帐户,以便我没有每天检查花朵是否有失败的任务。 我确实在我的settings.py文件芹菜为每个失败的任务发送邮件

CELERY_SEND_TASK_ERROR_EMAILS = True 

ADMINS以下配置。

EMAIL_USE_TLS = True 
EMAIL_HOST_USER = '[email protected]' 
EMAIL_HOST_PASSWORD = '[email protected]' 
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认证错误,我立即从芹菜中得到电子邮件?我对此不太确定。

是否有任何其他工具可以监控我的任务,以及每次失败的任务都会向我发送邮件。

回答

3

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

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() 

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

1

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

它可以监视和跟踪您的动态基础架构。您将收到生产服务器上发生的每个错误的电子邮件。

-1

更新芹菜4 Tasks no longer sends error emails. 如芹菜类似问题Handling error emails going forward?建议:

你可以实现你自己的基本任务是这样来处理错误 但是你想:

class MyTask(celery.Task): 
    def on_failure(self, exc, task_id, args, kwargs, einfo): 
     # here you can place mail_admins(...) call 
     print('{0!r} failed: {1!r}'.format(task_id, exc)) 
+0

尽管此链接可能会回答问题,但最好在此处包含答案的重要部分,并提供供参考的链接。如果链接页面更改,则仅链接答案可能会失效。 - [来自评论](/ review/low-quality-posts/16827617) – McGrady