This is an automated email from the ASF dual-hosted git repository.
ferruzzi pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new dd3cfdb0373 Update templating support in Deadline Alert docs (#55429)
dd3cfdb0373 is described below
commit dd3cfdb0373b324a544c5371d0a6014d95e13412
Author: Ramit Kataria <[email protected]>
AuthorDate: Wed Sep 10 09:11:34 2025 -0700
Update templating support in Deadline Alert docs (#55429)
There were some recent changes in templating/context for Deadline Alert
callbacks. This updates the docs to reflect those changes.
---
airflow-core/docs/core-concepts/dags.rst | 4 +--
airflow-core/docs/howto/deadline-alerts.rst | 39 +++++++++++++++++++++--------
2 files changed, 31 insertions(+), 12 deletions(-)
diff --git a/airflow-core/docs/core-concepts/dags.rst
b/airflow-core/docs/core-concepts/dags.rst
index 04551838bed..101977b3aa2 100644
--- a/airflow-core/docs/core-concepts/dags.rst
+++ b/airflow-core/docs/core-concepts/dags.rst
@@ -857,8 +857,8 @@ Here's a simple example using the existing email Notifier:
interval=timedelta(minutes=30),
callback=SmtpNotifier(
to="[email protected]",
- subject="[Alert] Dag {{ dag.dag_id }} exceeded time threshold",
- html_content="The Dag has been running for more than 30
minutes since being queued.",
+ subject="🚨 Dag {{ dag_run.dag_id }} missed deadline at {{
deadline.deadline_time }}",
+ html_content="The Dag Run {{ dag_run.dag_run_id }} has been
running for more than 30 minutes since being queued.",
),
),
):
diff --git a/airflow-core/docs/howto/deadline-alerts.rst
b/airflow-core/docs/howto/deadline-alerts.rst
index 19b4ea58e78..edfcc3b2e77 100644
--- a/airflow-core/docs/howto/deadline-alerts.rst
+++ b/airflow-core/docs/howto/deadline-alerts.rst
@@ -64,7 +64,9 @@ Below is an example Dag implementation. If the Dag has not
finished 15 minutes a
interval=timedelta(minutes=15),
callback=AsyncCallback(
SlackWebhookNotifier,
- kwargs={"text": "Dag 'slack_deadline_alert' still running
after 30 minutes."},
+ kwargs={
+ "text": "🚨 Dag {{ dag_run.dag_id }} missed deadline at {{
deadline.deadline_time }}. DagRun: {{ dag_run }}"
+ },
),
),
):
@@ -108,7 +110,9 @@ Here's an example using a fixed datetime:
interval=timedelta(minutes=-30), # Alert 30 minutes before the
reference.
callback=AsyncCallback(
SlackWebhookNotifier,
- kwargs={"text": "Dag 'slack_deadline_alert' still running
after 30 minutes."},
+ kwargs={
+ "text": "🚨 Dag {{ dag_run.dag_id }} missed deadline at {{
deadline.deadline_time }}. DagRun: {{ dag_run }}"
+ },
),
),
):
@@ -128,9 +132,10 @@ The timeline for this example would look like this:
Using Callbacks
---------------
-When a deadline is exceeded, the callback is executed. You can use an existing
:doc:`Notifier </howto/notifications>`
-or create a custom callback function. A callback must be an
:class:`~airflow.sdk.definitions.deadline.AsyncCallback`,
-with support coming soon for
:class:`~airflow.sdk.definitions.deadline.SyncCallback`.
+When a deadline is exceeded, the callback's callable is executed with the
specified kwargs. You can use an
+existing :doc:`Notifier </howto/notifications>` or create a custom callable.
A callback must be an
+:class:`~airflow.sdk.definitions.deadline.AsyncCallback`, with support coming
soon for
+:class:`~airflow.sdk.definitions.deadline.SyncCallback`.
Using Built-in Notifiers
^^^^^^^^^^^^^^^^^^^^^^^^
@@ -146,7 +151,9 @@ Here's an example using the Slack Notifier if the Dag run
has not finished withi
interval=timedelta(minutes=30),
callback=AsyncCallback(
SlackWebhookNotifier,
- kwargs={"text": "Dag 'slack_deadline_alert' still running
after 30 minutes."},
+ kwargs={
+ "text": "🚨 Dag {{ dag_run.dag_id }} missed deadline at {{
deadline.deadline_time }}. DagRun: {{ dag_run }}"
+ },
),
),
):
@@ -155,7 +162,7 @@ Here's an example using the Slack Notifier if the Dag run
has not finished withi
Creating Custom Callbacks
^^^^^^^^^^^^^^^^^^^^^^^^^
-You can create custom callbacks for more complex handling. If ``kwargs`` are
specified in the ``Callback``,
+You can create custom callables for more complex handling. If ``kwargs`` are
specified in the ``Callback``,
they are passed to the callback function. **Asynchronous callbacks** must be
defined somewhere in the
Triggerer's system path.
@@ -163,7 +170,8 @@ Triggerer's system path.
Regarding Async Custom Deadline callbacks:
* Async callbacks are executed by the Triggerer, so users must ensure they
are importable by the Triggerer.
- * One easy way to do this is to place the callback as a top-level method
in a new file in the plugins folder.
+ * One easy way to do this is to place the callable as a top-level method
in a new file in the plugins folder.
+ Nested callables are not currently supported.
* The Triggerer will need to be restarted when a callback is added or
changed in order to reload the file.
@@ -175,7 +183,9 @@ A **custom asynchronous callback** might look like this:
async def custom_async_callback(**kwargs):
"""Handle deadline violation with custom logic."""
- print(f"Deadline exceeded for Dag {kwargs.get("dag_id")}!")
+ context = kwargs.get("context", {})
+ print(f"Deadline exceeded for Dag {context.get("dag_run",
{}).get("dag_id")}!")
+ print(f"Context: {context}")
print(f"Alert type: {kwargs.get("alert_type")}")
# Additional custom handling here
@@ -199,12 +209,21 @@ A **custom asynchronous callback** might look like this:
interval=timedelta(minutes=15),
callback=AsyncCallback(
custom_async_callback,
- kwargs={"alert_type": "time_exceeded", "dag_id":
"custom_deadline_alert"},
+ kwargs={"alert_type": "time_exceeded"},
),
),
):
EmptyOperator(task_id="example_task")
+Templating and Context
+^^^^^^^^^^^^^^^^^^^^^^
+
+Currently, a relatively simple version of the Airflow context is passed to
callables and Airflow does not run
+:ref:`concepts:jinja-templating` on the kwargs. However, ``Notifier``s already
run templating with the
+provided context as part of their execution. This means that templating can be
used when using a ``Notifier``
+as long as the variables being templated are included in the simplified
context. This currently includes the
+ID and the calculated deadline time of the Deadline Alert as well as the data
included in the ``GET`` REST API
+response for Dag Run. Support for more comprehensive context and templating
will be added in future versions.
Deadline Calculation
^^^^^^^^^^^^^^^^^^^^