Lwackp opened a new issue, #63374:
URL: https://github.com/apache/airflow/issues/63374

   ### Apache Airflow version
   
   3.1.7
   
   ### If "Other Airflow 3 version" selected, which one?
   
   _No response_
   
   ### What happened?
   
   DAG-level `on_failure_callback` does not fire in Airflow 3.1.7 with 
KubernetesExecutor.
   
   Task-level `on_failure_callback` (via `default_args`) works correctly — it 
fires on the worker pod.
   
   ### Observations
   
   1. **DagRun reaches `failed` state** — confirmed via `SELECT state FROM 
dag_run`. The `last_scheduling_decision` and `end_date` are within milliseconds 
of each other.
   
   2. **`has_on_failure_callback` is present in serialized data** — confirmed 
via `SELECT data::text LIKE '%has_on_failure_callback%' FROM serialized_dag`.
   
   3. **Scheduler DEBUG logs show `"callback is empty"` for every DagRun** — 
this is the log from `_send_dag_callbacks_to_processor` when `callback_to_run` 
is `None`, meaning `update_state()` returned no callback.
   
   4. **DAG processor logs show no callback-related activity** — only routine 
DAG file parsing (`Setting next_dagrun ... to None`).
   
   ### What you think should happen instead?
   
   When `on_failure_callback` is set on a DAG and the DagRun fails, the 
callback should fire. This worked in Airflow 2.x.
   
   
   ### How to reproduce
   
   
   1. Create a DAG with `on_failure_callback` set at the DAG level:
   
   ```python
   from datetime import datetime
   from airflow.sdk import DAG
   from airflow.providers.standard.operators.python import PythonOperator
   
   def my_callback(context):
       print("DAG failure callback fired")
   
   def task_that_fails():
       raise ValueError("Intentional error")
   
   with DAG(
       dag_id="test-dag-level-callback",
       schedule=None,
       start_date=datetime(2025, 1, 1),
       catchup=False,
       on_failure_callback=[my_callback],
   ) as dag:
       PythonOperator(
           task_id="task_that_fails",
           python_callable=task_that_fails,
       )
   ```
   
   2. Trigger the DAG. The task fails, the DagRun is marked as `failed`.
   
   3. The DAG-level `on_failure_callback` never fires. No output in scheduler 
logs, DAG processor logs, or task logs.
   
   4. Enable DEBUG logging on the scheduler 
(`AIRFLOW__LOGGING__LOGGING_LEVEL=DEBUG`) and search for `"callback is empty"` 
— it appears for every DagRun.
   
   5. For comparison, move the callback to `default_args`:
   ```python
   with DAG(
       dag_id="test-task-level-callback",
       schedule=None,
       start_date=datetime(2025, 1, 1),
       catchup=False,
       default_args={"on_failure_callback": [my_callback]},
   ) as dag:
       ...
   ```
   This works — the task-level callback fires on the worker pod.
   
   ### Operating System
   
   Linux
   
   ### Versions of Apache Airflow Providers
   
   apache-airflow                            3.1.7
   apache-airflow-core                       3.1.7
   apache-airflow-providers-amazon           9.21.0
   apache-airflow-providers-celery           3.15.2
   apache-airflow-providers-cncf-kubernetes  10.12.3
   apache-airflow-providers-common-compat    1.13.0
   apache-airflow-providers-common-io        1.7.1
   apache-airflow-providers-common-messaging 2.0.2
   apache-airflow-providers-common-sql       1.30.4
   apache-airflow-providers-docker           4.5.2
   apache-airflow-providers-elasticsearch    6.4.4
   apache-airflow-providers-fab              3.2.0
   apache-airflow-providers-ftp              3.14.1
   apache-airflow-providers-git              0.2.2
   apache-airflow-providers-google           19.5.0
   apache-airflow-providers-grpc             3.9.2
   apache-airflow-providers-hashicorp        4.4.3
   apache-airflow-providers-http             5.6.4
   apache-airflow-providers-microsoft-azure  12.10.3
   apache-airflow-providers-mysql            6.4.2
   apache-airflow-providers-odbc             4.11.1
   apache-airflow-providers-openlineage      2.10.1
   apache-airflow-providers-postgres         6.5.3
   apache-airflow-providers-redis            4.4.2
   apache-airflow-providers-sendgrid         4.2.1
   apache-airflow-providers-sftp             5.7.0
   apache-airflow-providers-slack            9.6.2
   apache-airflow-providers-smtp             2.4.2
   apache-airflow-providers-snowflake        6.9.0
   apache-airflow-providers-ssh              4.3.1
   apache-airflow-providers-standard         1.11.0
   apache-airflow-task-sdk                   1.1.7
   
   
   ### Deployment
   
   Official Apache Airflow Helm Chart
   
   ### Deployment details
   
   _No response_
   
   ### Anything else?
   
   _No response_
   
   ### Are you willing to submit PR?
   
   - [ ] Yes I am willing to submit a PR!
   
   ### Code of Conduct
   
   - [x] I agree to follow this project's [Code of 
Conduct](https://github.com/apache/airflow/blob/main/CODE_OF_CONDUCT.md)
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to