2016-04-11 42 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