You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by el...@apache.org on 2025/10/10 05:07:56 UTC

(superset) branch elizabeth/task-retry updated: Log Celery task failures with a signal handler

This is an automated email from the ASF dual-hosted git repository.

elizabeth pushed a commit to branch elizabeth/task-retry
in repository https://gitbox.apache.org/repos/asf/superset.git


The following commit(s) were added to refs/heads/elizabeth/task-retry by this push:
     new 5a26910ee3 Log Celery task failures with a signal handler
5a26910ee3 is described below

commit 5a26910ee3fc28d00dd537bb84fb7a622ea3dd79
Author: Elizabeth Thompson <es...@gmail.com>
AuthorDate: Thu Oct 9 22:07:52 2025 -0700

    Log Celery task failures with a signal handler
    
    Added a signal handler to log task failures for Celery tasks.
---
 superset/tasks/scheduler.py | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/superset/tasks/scheduler.py b/superset/tasks/scheduler.py
index c59b4f4dd8..5c1d1ce2b2 100644
--- a/superset/tasks/scheduler.py
+++ b/superset/tasks/scheduler.py
@@ -22,6 +22,7 @@ from typing import Any
 
 from celery import Task
 from celery.exceptions import SoftTimeLimitExceeded
+from celery.signals import task_failure
 from flask import current_app
 
 from superset import is_feature_enabled
@@ -40,8 +41,18 @@ from superset.utils.log import get_logger_from_status
 
 logger = logging.getLogger(__name__)
 
+@task_failure.connect
+def log_task_failure(sender=None, task_id=None, exception=None, args=None, kwargs=None, traceback=None, einfo=None, **kw):
+    logger.exception(f"Celery task {sender.name} failed: {exception}", exc_info=einfo)
 
-@celery_app.task(name="reports.scheduler")
+
+@celery_app.task(
+    name="reports.scheduler",
+    bind=True,
+    autoretry_for=(Exception,),
+    retry_kwargs={"max_retries": 3, "countdown": 60},  # Retry up to 3 times, wait 60s between
+    retry_backoff=True,  # exponential backoff
+)
 def scheduler() -> None:
     """
     Celery beat main scheduler for reports