2016-04-11 21 views
3

Ich verwende Sellerie in meiner Django-Anwendung und ich habe Sellerie Blume eingerichtet, um die Aufgaben von Sellerie zu überwachen. Ich habe Aufgaben eingerichtet, bei denen E-Mails an den Benutzer gesendet werden, wenn sie sich registrieren/absenden/FP usw. Ereignisse. Jetzt gibt mir Flower einen schönen Einblick in die Aufgabe und ihren Status. Jetzt wollte ich für jede gescheiterte Aufgabe eine E-Mail an mein Konto senden, damit ich die Blume nicht jeden Tag nach der fehlgeschlagenen Aufgabe überprüfe. Ich habe die folgende Konfiguration in meiner Datei settings.pySellerie senden Mail für jede gescheiterte Aufgabe

CELERY_SEND_TASK_ERROR_EMAILS = True 

und 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' 

Dies sind Einstellungen von "Von" E-Mail-Adresse. Vor ein paar Tagen hat einer meiner Teammitglieder versehentlich das Passwort des obigen email_host geändert und vergessen, die Einstellungsdatei zu aktualisieren. Es war nicht, nachdem es zu spät war, dass die Aufgaben aufgrund eines SMTP-Authentifizierungsfehlers fehlschlagen.

Gibt es eine Möglichkeit, dass, selbst wenn SMTP-Authentifizierung Fehler auftritt, ich sofort die E-Mail von Sellerie? Ich bin mir da nicht so sicher.

Gibt es noch andere Tools, die meine Aufgaben überwachen und für jede fehlgeschlagene Aufgabe wird mir die Mail gesendet.

Antwort

3

Ich fand heraus, dass es eine Tabelle für die Wartung der Aufgaben in der Datenbank erstellt wurde. Also habe ich einfach ein Skript erstellt, das stündlich nach fehlgeschlagenen Aufgaben sucht, nach den letzten Stunden in der Tabelle und wenn es gefunden wird, wird es eine E-Mail senden.

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

Jetzt in einer E-Mail erhalte ich einen vollen Stack-Trace zu und die ID der Aufgabe. Jetzt musste ich jede Stunde überprüfen, also habe ich das Skript einfach in eine Crontab geschrieben. Jetzt können Sie die Zeitschwelle entsprechend Ihrem Grundbedürfnis ändern und entsprechend arbeiten.

1

können Sie Datadog konfigurieren https://www.datadoghq.com/

Es kann Ihre dynamische Infrastruktur überwachen und verfolgen. Sie erhalten eine E-Mail für jeden Fehler auf Ihrem Produktionsserver.

-1

Update für Sellerie 4. Tasks no longer sends error emails. Wie in der ähnlichen Sellerie Ausgabe geraten Handling error emails going forward?:

Sie können Ihre eigene Basis Aufgabe implementieren, wie diese Fehler zu behandeln jedoch würden Sie gerne:

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

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - [Aus Bewertung] (/ review/low-quality-posts/16827617) – McGrady