Airflow triggerer
The built-in Airflow triggerer system type — why a dead triggerer looks exactly like waiting correctly, the blocked-main-thread check, and capacity.
Airflow’s triggerer runs deferrable operators. If you use sensors in deferred mode - and in a modern deployment you almost certainly do - this process is what resumes them.
Key: airflow-triggerer · applied automatically to services emitting airflow.triggers. or airflow.triggerer metrics.
A dead triggerer is invisible everywhere else
Section titled “A dead triggerer is invisible everywhere else”A deferred task is not running and not failing. It is waiting - which looks identical to waiting correctly. So when the triggerer stops, nothing on the scheduler reports anything: no task failures, no failed runs, no alert. A fleet of tasks simply never resumes and never complains.
That is the whole case for this type. See Apache Airflow for the scheduler, the DAG processor for parsing, and the Airflow page for setup, which is the same for all three.
Starter checks
Section titled “Starter checks”| Check | Condition | Severity | Why it matters |
|---|---|---|---|
| Triggerer not running | airflow.triggerer_heartbeat stops arriving | Critical | Every deferred task stays deferred, silently. |
| Trigger blocking the main thread | airflow.triggers.blocked_main_thread rising | Warning | One trigger doing synchronous work starves every other deferred task on the process. |
| Triggerer at capacity | airflow.triggerer.capacity_left < 1 | Warning | New deferred tasks queue behind the ones running. |
The heartbeat fires on the absence of its metric, since a dead process emits nothing left to threshold, and is guarded to only fire for a metric that has reported before.
Tuning notes
Section titled “Tuning notes”- Blocked main thread is a code smell with a metric. It means a custom trigger is doing blocking I/O in an async context. The firing tells you it happened; finding which trigger means reading the triggerer’s logs.
- Capacity at
< 1fires at saturation, not before. Raise it to a fraction ofdefault_capacityto hear about it while there is still room. - Run more than one triggerer if capacity is a recurring firing rather than an incident: they partition work between them.