# Статусы задач в Airflow: как понимать и использовать

## Почему статусы задач так важны?

Когда вы только начинаете работать с Airflow, интерфейс может показаться сложным. Особенно если вы видите задачи разных цветов и не понимаете, что это значит. На самом деле, статусы задач — это ваш главный помощник в отладке и понимании того, что происходит с вашим пайплайном.

## Основные статусы, которые вы увидите каждый день

В интерфейсе Airflow каждая задача подсвечивается цветом — по нему можно быстро понять, что с ней происходит. Для первых шагов достаточно запомнить несколько базовых статусов, которые удобно разделить на три группы.

**1. Всё хорошо**

**🟢 Успешно (success)** — ваша задача выполнилась без ошибок. Это то, к чему мы стремимся!

**🟣 Пропущена (skipped)** — задача была намеренно пропущена (часто в ветвящихся пайплайнах).

**2. Есть проблема**

**🔴 Ошибка (failed)** — что-то пошло не так. Задача упала, и вам нужно разбираться в коде.

**3. Идёт работа или ожидание**

**🔵 Выполняется (running)** — задача сейчас активно работает. Просто подождите немного.

**🟡 В очереди (queued)** — задача ждет своей очереди на выполнение. Это нормально, особенно если у вас много задач или мало ресурсов.

**🟠 Запланирована (scheduled)** — все готово к запуску, Airflow вот-вот начнет выполнение.

**⚪ Нет статуса (none/no status)** — задача еще не готова к запуску, потому что не выполнены её зависимости.

### Специальные статусы (встречаются реже)

- **Ошибка в зависимости (upstream_failed)** — предыдущая задача упала, поэтому текущая даже не запускалась.
- **Готова к повтору (up_for_retry)** — задача упала, но Airflow попробует запустить её снова (если настроены повторные попытки).
- **Завершена (shutdown)** — задачу принудительно остановили во время выполнения.
- **Отложена (deferred)** — задача приостановлена и ждет внешнего события.
- **Наблюдение (sensing)** — специальный статус для сенсоров, которые ждут определенных условий.

## Как задача проходит свой путь: пошагово

Представьте, что у вас есть простая задача. Вот как она проходит свой жизненный цикл:

1. **Создание** → Статус: "Нет статуса"  
   Airflow создает задачу, но еще не может её запустить.

2. **Готовность** → Статус: "Запланирована"  
   Все зависимости выполнены, задача готова к работе.

3. **Ожидание** → Статус: "В очереди"  
   Задача ждет свободного рабочего места.

4. **Работа** → Статус: "Выполняется"  
   Задача активно выполняется.

5. **Завершение** → Статус: "Успешно"  
   Всё прошло отлично!

На диаграмме ниже показаны те же этапы, но уже с привязкой к внутренним компонентам Airflow.

```mermaid
flowchart LR
    %% Стили
    classDef component fill:#8BC34A,stroke:#333,stroke-width:1px,color:#fff;
    classDef state     fill:#ffffff,stroke:#333,stroke-width:1px,color:#000;
    classDef success   fill:#C8E6C9,stroke:#388E3C,stroke-width:1px,color:#000;
    classDef sensor    fill:#ffffff,stroke:#8BC34A,stroke-width:1px,color:#000;

    %% Жизненный цикл задачи

    NONE["No status / None"]:::state --> SCH[Scheduler]:::component

    SCH --> SCHEDULED[Scheduled]:::state
    SCH --> REMOVED[Removed]:::state
    SCH --> UPSTREAM_FAILED[Upstream failed]:::state

    SCHEDULED --> EX[Executor]:::component
    EX --> QUEUED[Queued]:::state
    QUEUED --> WORKER[Worker]:::component
    WORKER --> RUNNING[Running]:::state

    RUNNING --> SUCCESS[Success]:::success
    RUNNING --> FAILED[Failed]:::state
    RUNNING --> SHUTDOWN[Shutdown]:::state

    %% Альтернативные переходы при ретраях
    FAILED -.-> UP_FOR_RETRY["Up for retry"]:::state
    SHUTDOWN -.-> UP_FOR_RETRY
    UP_FOR_RETRY --> SCH

    %% Сенсоры: режим reschedule
    RUNNING --> UP_FOR_RESCHEDULE["Up for reschedule"]:::sensor
    UP_FOR_RESCHEDULE --> SCH

    %% Все стрелки чуть толще
    linkStyle default stroke-width:2px;

    %% Альтернативные переходы (ретраи) — зелёные и ещё чуть толще
    linkStyle 11 stroke:#4CAF50,stroke-width:2.5px;
    linkStyle 12 stroke:#4CAF50,stroke-width:2.5px;
```
### Легенда к диаграмме состояний задачи

**Зелёные блоки (Component)** — внутренние компоненты Airflow, которые двигают задачу по жизненному циклу:

- **Scheduler** — планировщик, проверяет зависимости задач и решает, что ставить в очередь.
- **Executor** — исполнитель, получает от Scheduler список задач и распределяет их по воркерам.
- **Worker** — рабочий процесс (worker), который фактически запускает код оператора.

**Белые блоки (Task stage)** — состояния конкретного запуска задачи (task instance, `TaskInstanceState`). На диаграмме они показывают, через какие шаги проходит задача от появления в DAG до успешного завершения или ошибки. Подробный справочник по всем состояниям есть в документации по ссылке ниже.

**Белые блоки с зелёной рамкой (Task stage only for sensor)** — состояния, характерные только для сенсоров:

- **Up for reschedule (`up_for_reschedule`)** — сенсор в режиме `reschedule`: условие ещё не выполнено, задача «усыплена» и позже будет снова поставлена в расписание без непрерывной работы воркера.

> Официальное описание всех состояний `TaskInstanceState` и их жизненного цикла смотрите в документации Airflow:  
> [Tasks → Task Instances](https://airflow.apache.org/docs/apache-airflow/stable/core-concepts/tasks.html#task-instances).


## Что делать, если задача упала?

Если вы видите красный статус (failed), не паникуйте! Это нормальная часть работы с данными. Вот что делать:

1. **Нажмите на задачу** в интерфейсе Airflow
2. **Посмотрите логи** — там будет точная причина ошибки
3. **Исправьте код** или настройки
4. **Перезапустите задачу** кнопкой "Clear"

## Советы для начинающих

- **Не бойтесь статусов** — они ваш друг, а не враг
- **Самые важные статусы** для начала: success, failed, queued, running
- **Остальные статусы** вы будете изучать по мере необходимости
- **Цвета в интерфейсе** — это быстрый способ понять состояние вашего пайплайна

Помните: понимание статусов задач — это как научиться читать дорожные знаки. Сначала кажется много информации, но со временем это становится второй натурой!

> Полный список возможных состояний задач (TaskInstanceState) и их классификацию на терминальные и промежуточные можно посмотреть в официальной документации Airflow:
> https://airflow.apache.org/docs/apache-airflow/2.9.3/_api/airflow/utils/state/index.html
 
