hkc-8010 opened a new issue, #64890:
URL: https://github.com/apache/airflow/issues/64890

   ### Description
   
   In Airflow 2, a common notifier/callback pattern was:
   
   1. Post an alert to an external system such as Slack.
   2. Persist a backlink or correlation identifier on the `DagRun` note.
   3. Reuse that stored link later to update the original alert if the DagRun 
is cleared and eventually succeeds.
   
   That migration path is not straightforward in Airflow 3.
   
   In Airflow 3 callback/notifier code, `context["dag_run"]` is no longer the 
old SQLAlchemy `DagRun` contract that many Airflow 2 implementations relied on, 
and the Task SDK client does not appear to expose a supported helper for 
updating `DagRun.note` from callback/notifier runtime code.
   
   There is already public API support for DagRun note patching, so this 
request is specifically about having a supported callback-safe/runtime-safe way 
to do that from Airflow 3 notifier code.
   
   ### Use case/motivation
   
   A concrete use case is a DAG-level failure notifier that:
   
   1. Fires once when the DagRun fails.
   2. Collects failed task IDs for that run.
   3. Posts a Slack message.
   4. Stores the Slack thread URL in the DagRun note for traceability.
   5. On a later callback (for example after the DagRun is cleared and 
succeeds), reads that stored link and updates the original Slack message 
instead of sending a brand new one.
   
   The "list failed tasks" part is portable in Airflow 3 via 
`context["task_instance"].get_task_states(...)` in a real callback execution 
path.
   
   The missing piece is the note update. In Airflow 2 this was commonly done 
with ORM/session access such as `DagRunNote`, `dag_run.dag_run_note`, and 
`provide_session`. In Airflow 3 that pattern is not portable, but I could not 
find a supported replacement in notifier/callback context.
   
   ### Related issues
   
   - #51816 is related only in the sense that local `dag.test()` / `airflow 
dags test` debugging can be misleading for callback runtime APIs. It does not 
solve the DagRun note update gap described here.
   
   ### Requested outcome
   
   One of the following would unblock Airflow 2 -> 3 notifier migrations 
cleanly:
   
   1. Add a supported Task SDK / callback-context helper to update 
`DagRun.note` from notifier code.
   2. Expose a documented runtime client operation for patching the current 
DagRun note from callback code.
   3. If this is intentionally unsupported, document the recommended 
replacement pattern for storing callback correlation metadata on a DagRun in 
Airflow 3.
   
   ### Environment where this came up
   
   - Apache Airflow 3.1.8
   - DAG-level `on_failure_callback`
   - Local Astro / Astronomer runtime during migration testing
   
   ### Minimal callback shape
   
   ```python
   from airflow.notifications.basenotifier import BaseNotifier
   
   
   class ExampleNotifier(BaseNotifier):
       def notify(self, context):
           dag_run = context["dag_run"]
           ti = context["task_instance"]
   
           task_states = ti.get_task_states(
               dag_id=dag_run.dag_id,
               run_ids=[dag_run.run_id],
           )
   
           failed_tasks = [
               task_id
               for task_id, state in task_states.get(dag_run.run_id, {}).items()
               if state in {"failed", "upstream_failed"}
           ]
   
           # Supported in Airflow 3: derive failed task list.
           print(failed_tasks)
   
           # Missing piece: supported way to persist a backlink such as a Slack 
URL
           # onto the DagRun note from this notifier/callback context.
   ```
   
   ### Why I think this belongs in OSS Airflow
   
   This appears to be a migration and API-surface gap rather than a 
managed-service issue:
   
   - Airflow 3 callback context behavior changed relative to many Airflow 2 
implementations.
   - Public DagRun note patching exists, so the underlying capability is 
present.
   - The missing piece is a supported, documented path for callback/notifier 
code to update the current DagRun note.
   
   Thanks for taking a look.
   


-- 
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