Plugins и Listeners — обзор модуля
Plugins позволяют расширять Airflow без форкания: добавлять hooks, operators, sensors, macros, custom UI views. В Airflow 2.8+ появился отдельный Listener API — новый «правильный» способ слушать события lifecycle (task started, dataset emitted).
Уроки модуля
| # | Урок | Что внутри |
|---|---|---|
| 01 | Обзор модуля | Текущий урок |
| 02 | Plugin manager | AirflowPlugin class, entry_points регистрация |
| 03 | Custom hooks | BaseHook subclass, connection lookup, full hook example |
| 04 | Listener API (2.8+) | pluggy-based hooks, task/dagrun/dataset events, OpenLineage use case |
| 05 | Macros и Jinja | Built-in macros, user_defined_macros, template_searchpath |
| 06 | UI plugins (Flask blueprints) | AppBuilder views, Flask templates (в 3.x — React plugins) |
Plugin registration
Два способа:
- Через
airflow/plugins/— file-based, legacy - Через entry_points (рекомендуется) — provider package в
setup.py:
entry_points={
'apache_airflow_provider': ['provider_info=my_provider:get_provider_info']
}
Listener API — новый «правильный» способ
from airflow.listeners import hookimpl
class MyListener:
@hookimpl
def on_task_instance_running(self, previous_state, task_instance, session):
# Real-time hook
send_to_slack(f"Task {task_instance.task_id} started")
Доступные hooks:
on_dag_run_running/_success/_failedon_task_instance_running/_success/_failedon_starting/before_stopping— scheduler lifecycleon_dataset_created/on_dataset_changed— datasets/assets events
Killer takeaway
В 2.x для custom logic на task events использовали on_failure_callback per task, что не масштабировалось. С Listener API один listener видит все events системы — это идеальное место для:
- Generic alerting (Slack, PagerDuty)
- Audit logging
- Custom metrics
- Lineage emission (OpenLineage provider использует именно Listener API)