diff --git a/swh/scheduler/celery_backend/config.py b/swh/scheduler/celery_backend/config.py --- a/swh/scheduler/celery_backend/config.py +++ b/swh/scheduler/celery_backend/config.py @@ -3,9 +3,12 @@ # License: GNU General Public License version 3, or any later version # See top-level LICENSE file for more information +import functools import logging import os import pkg_resources +import traceback +from typing import Any, Dict import urllib.parse from celery import Celery @@ -18,8 +21,6 @@ import requests -from typing import Any, Dict - from swh.scheduler import CONFIG as SWH_CONFIG from swh.core.config import load_named_config, merge_configs @@ -44,7 +45,27 @@ logger = logging.getLogger(__name__) +# Celery eats tracebacks in signal callbacks, this decorator catches +# and prints them. +# Also tries to notify Sentry if possible. +def _print_errors(f): + @functools.wraps(f) + def newf(*args, **kwargs): + try: + return f(*args, **kwargs) + except Exception as exc: + traceback.print_exc() + try: + import sentry_sdk + sentry_sdk.capture_exception(exc) + except Exception: + traceback.print_exc() + + return newf + + @setup_logging.connect +@_print_errors def setup_log_handler(loglevel=None, logfile=None, format=None, colorize=None, log_console=None, log_journal=None, **kwargs): """Setup logging according to Software Heritage preferences. @@ -105,6 +126,7 @@ @celeryd_after_setup.connect +@_print_errors def setup_queues_and_tasks(sender, instance, **kwargs): """Signal called on worker start.