root: log failed celery tasks to event log
Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
This commit is contained in:
parent
06af306e8a
commit
3d8d93ece5
|
@ -93,6 +93,7 @@ def before_send(event: dict, hint: dict) -> Optional[dict]:
|
||||||
if "exc_info" in hint:
|
if "exc_info" in hint:
|
||||||
_, exc_value, _ = hint["exc_info"]
|
_, exc_value, _ = hint["exc_info"]
|
||||||
if isinstance(exc_value, ignored_classes):
|
if isinstance(exc_value, ignored_classes):
|
||||||
|
LOGGER.debug("dropping exception", exception=exc_value)
|
||||||
return None
|
return None
|
||||||
if "logger" in event:
|
if "logger" in event:
|
||||||
if event["logger"] in [
|
if event["logger"] in [
|
||||||
|
|
|
@ -3,10 +3,20 @@ import os
|
||||||
from logging.config import dictConfig
|
from logging.config import dictConfig
|
||||||
|
|
||||||
from celery import Celery
|
from celery import Celery
|
||||||
from celery.signals import after_task_publish, setup_logging, task_postrun, task_prerun
|
from celery.signals import (
|
||||||
|
after_task_publish,
|
||||||
|
setup_logging,
|
||||||
|
task_failure,
|
||||||
|
task_internal_error,
|
||||||
|
task_postrun,
|
||||||
|
task_prerun,
|
||||||
|
)
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from structlog.stdlib import get_logger
|
from structlog.stdlib import get_logger
|
||||||
|
|
||||||
|
from authentik.lib.sentry import before_send
|
||||||
|
from authentik.lib.utils.errors import exception_to_string
|
||||||
|
|
||||||
# set the default Django settings module for the 'celery' program.
|
# set the default Django settings module for the 'celery' program.
|
||||||
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "authentik.root.settings")
|
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "authentik.root.settings")
|
||||||
|
|
||||||
|
@ -43,6 +53,18 @@ def task_postrun_hook(task_id, task, *args, retval=None, state=None, **kwargs):
|
||||||
LOGGER.debug("Task finished", task_id=task_id, task_name=task.__name__, state=state)
|
LOGGER.debug("Task finished", task_id=task_id, task_name=task.__name__, state=state)
|
||||||
|
|
||||||
|
|
||||||
|
# pylint: disable=unused-argument
|
||||||
|
@task_failure.connect
|
||||||
|
@task_internal_error.connect
|
||||||
|
def task_error_hook(task_id, exception: Exception, traceback, *args, **kwargs):
|
||||||
|
"""Create system event for failed task"""
|
||||||
|
from authentik.events.models import Event, EventAction
|
||||||
|
|
||||||
|
LOGGER.warning("Task failure", exception=exception)
|
||||||
|
if before_send({}, {"exc_info": (None, exception, None)}) is not None:
|
||||||
|
Event.new(EventAction.SYSTEM_EXCEPTION, message=exception_to_string(exception)).save()
|
||||||
|
|
||||||
|
|
||||||
# Using a string here means the worker doesn't have to serialize
|
# Using a string here means the worker doesn't have to serialize
|
||||||
# the configuration object to child processes.
|
# the configuration object to child processes.
|
||||||
# - namespace='CELERY' means all celery-related configuration keys
|
# - namespace='CELERY' means all celery-related configuration keys
|
||||||
|
|
Reference in New Issue