Ошибка обработки очереди задач Huey только при последней повторной попытке и получении трассировки исключения - PullRequest
0 голосов
/ 21 февраля 2020

В настоящее время этот фрагмент настроен в моем tasks.py, так что электронное письмо отправляется Django администраторам huey при сбое задачи:

from django.core.mail import mail_admins

from huey import signals
from huey.contrib import djhuey as huey


@huey.signal(signals.SIGNAL_ERROR)
def task_error(signal, task, exc):
    subject = f'Task [{task.name}] failed
    message = f"""Task ID: {task.id}'
Args: {task.args}
Kwargs: {task.kwargs}
Exception: {exc}"""
    mail_admins(subject, message)

Это приводит к следующему (пример) тема письма

[Django] Task [test_task] failed

и тело:

Task ID: 89e4bfb3-3cd3-4d6f-8693-68874caf21ec
Args: (123,)
Kwargs: {}
Exception: division by zero

, что довольно гладко, но ... вопросы:

  1. Сейчас это срабатывает при сбое задачи, включая повторные попытки. Я хотел бы, чтобы он был отправлен только в случае, если все попытки не пройдены. Так что, если задача имеет retries=2, сейчас я получаю 3 электронных письма (исходная ошибка + 2 попытки). Как сделать так, чтобы сообщение отправлялось только при последней попытке?
  2. Есть ли способ напечатать exc traceback исключения?

PS Я попытался настроить его с помощью Django ведение журнала проекта, но этот подход предлагает более детальное управление, поэтому я доволен им.

Обновление

Модуль с обновлениями, основанный на ответах @Adam Chainz & @ coleifer (оба правильные ), теперь выглядит так:

import traceback

from django.core.mail import mail_admins

from huey import signals
from huey.contrib import djhuey as huey


@huey.signal(signals.SIGNAL_ERROR)
def task_error(signal, task, exc):
    if task.retries > 0:
        return
    subject = f'Task [{task.name}] failed'
    message = f"""Task ID: {task.id}
Args: {task.args}
Kwargs: {task.kwargs}
Exception: {exc}
{traceback.format_exc()}"""
    mail_admins(subject, message)

Ответы [ 2 ]

1 голос
/ 21 февраля 2020

Вкл 1. Я думаю, что вы можете проверить task.retries?

Вкл. 2. Использовать traceback.format_exception ?

1 голос
/ 21 февраля 2020

См .: https://docs.python.org/3.6/library/traceback.html

Поскольку у вас есть экземпляр задачи, вы сможете проверить, если retries==0.

Более стандартный способ сделать это это прикрепить обработчик электронной почты на уровне лога ОШИБКА к регистратору потребителя huey. Вот так я бы с этим справился.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...