refactor(airflow): пробник ClickHouse разбит на четыре задачи #23

Merged
ddmitry merged 2 commits from feat/20-dag-probe-form into main 2026-07-31 19:23:19 +03:00
Owner

Closes #20

Зачем

Пробники — первый и пока единственный пример DAG в стенде: по ним будут учиться
писать остальные. test_clickhouse был одной задачей на всё, с двумя десятками
строк ручной машинерии переноса ошибок, без единого комментария на самом
неочевидном решении репозитория.

Что

  • test_clickhouse разбит на четыре задачи: prepare_tables, write_marker,
    read_from_node_2, cleanup_tables. Маркер едет между ними XCom'ом строками.
  • Машинерия снята целиком: ни except BaseException, ни списков ошибок, ни
    ExceptionGroup, ни add_note. try/finally остался только на закрытии
    клиента. Каждая задача падает своим исключением на своей строке.
  • Ноды описаны одной константой NODES парами «имя для человека — источник для
    запроса»; булев переключатель в _table_engines и параллельный список
    подписей у вызывающего исчезли.
  • Уборка идёт обычным правилом запуска, а не trigger_rule="all_done", как
    просил тикет. Причина — в ADR 0003: Airflow считает состояние запуска по
    концам графа, и уборка с all_done, встав в конец, красила запуск в зелёный
    ровно тогда, когда проверка упала. Проверено на живом стенде тремя прогонами;
    оба отвергнутых варианта (all_done и as_teardown(on_failure_fail_dagrun=True))
    дали success при упавшей проверке.
  • Комментарии — в четырёх местах, оговорённых тикетом.
  • Шапка test_clickhouse развёрнута в список проверяемых утверждений и
    оговорку, что образцом ETL этот тест не является; уходит в doc_md и видна в
    интерфейсе Airflow.
  • tests/dag-probes-unit.py: заглушка task принимает обе формы декоратора,
    проверка слияния ошибок заменена проверками уборки.
  • tests/stand-smoke-guards.sh ищет образец по всем журналам свежего запуска, а
    не в одном последнем файле: упасть теперь может любая из четырёх задач.

Проверка

  • make config-test — зелен, 4/3/6, ошибок 0.
  • make smoke — оба пробника зелены. Проверка памяти стенда краснеет по причине
    из #21: запас между обычным состоянием стенда и порогом 3,4 ГБ — единицы
    мегабайт, и один прогон пробника его съедает. К этому PR отношения не имеет,
    замеры дописаны в #21.
  • make smoke-guards — зелен, 3 и 3 проверки: красный путь по-прежнему
    связывает отказ test_clickhouse с удалённой на ноде 2 таблицей.

Разбитый пробник укладывается в предел ожидания run_airflow_probe (60 опросов
по 2 секунды) с запасом больше двукратного.

Форма пробника Kafka сюда не входит намеренно — границы #20 её замораживают.
Она вынесена в #22.

Closes #20 ## Зачем Пробники — первый и пока единственный пример DAG в стенде: по ним будут учиться писать остальные. `test_clickhouse` был одной задачей на всё, с двумя десятками строк ручной машинерии переноса ошибок, без единого комментария на самом неочевидном решении репозитория. ## Что - `test_clickhouse` разбит на четыре задачи: `prepare_tables`, `write_marker`, `read_from_node_2`, `cleanup_tables`. Маркер едет между ними XCom'ом строками. - Машинерия снята целиком: ни `except BaseException`, ни списков ошибок, ни `ExceptionGroup`, ни `add_note`. `try/finally` остался только на закрытии клиента. Каждая задача падает своим исключением на своей строке. - Ноды описаны одной константой `NODES` парами «имя для человека — источник для запроса»; булев переключатель в `_table_engines` и параллельный список подписей у вызывающего исчезли. - Уборка идёт обычным правилом запуска, а не `trigger_rule="all_done"`, как просил тикет. Причина — в ADR 0003: Airflow считает состояние запуска по концам графа, и уборка с `all_done`, встав в конец, красила запуск в зелёный ровно тогда, когда проверка упала. Проверено на живом стенде тремя прогонами; оба отвергнутых варианта (`all_done` и `as_teardown(on_failure_fail_dagrun=True)`) дали `success` при упавшей проверке. - Комментарии — в четырёх местах, оговорённых тикетом. - Шапка `test_clickhouse` развёрнута в список проверяемых утверждений и оговорку, что образцом ETL этот тест не является; уходит в `doc_md` и видна в интерфейсе Airflow. - `tests/dag-probes-unit.py`: заглушка `task` принимает обе формы декоратора, проверка слияния ошибок заменена проверками уборки. - `tests/stand-smoke-guards.sh` ищет образец по всем журналам свежего запуска, а не в одном последнем файле: упасть теперь может любая из четырёх задач. ## Проверка - `make config-test` — зелен, 4/3/6, ошибок 0. - `make smoke` — оба пробника зелены. Проверка памяти стенда краснеет по причине из #21: запас между обычным состоянием стенда и порогом 3,4 ГБ — единицы мегабайт, и один прогон пробника его съедает. К этому PR отношения не имеет, замеры дописаны в #21. - `make smoke-guards` — зелен, 3 и 3 проверки: красный путь по-прежнему связывает отказ `test_clickhouse` с удалённой на ноде 2 таблицей. Разбитый пробник укладывается в предел ожидания `run_airflow_probe` (60 опросов по 2 секунды) с запасом больше двукратного. Форма пробника Kafka сюда не входит намеренно — границы #20 её замораживают. Она вынесена в #22.
ddmitry added 2 commits 2026-07-31 19:22:24 +03:00
Зачем: пробник был одной задачей — в интерфейсе Airflow один красный
квадрат, а место отказа приходилось искать по журналу. Ручная машинерия
проброса и сведения ошибок занимала больше места, чем сама проверка, и
читатель продирался через неё раньше, чем понимал, что пробник проверяет.
Пробники — единственный образец DAG в стенде, по ним будут писать
остальные.

Что: test_clickhouse разбит на prepare_tables, write_marker,
read_from_node_2 и cleanup_tables; маркер и имя принявшей запись ноды едут
между задачами через XCom строками. Снято сведение ошибок: except
BaseException, ExceptionGroup, add_note и накопление ошибок в список;
клиент каждая задача заводит общим помощником и закрывает в finally.
Ноды описаны константой NODES парами «имя для человека — источник для
запроса», булев переключатель и параллельные списки подписей ушли.
Уборка идёт обычным правилом запуска, а не all_done: состояние запуска
Airflow считает по концам графа, и уборка, отработавшая после отказа,
покрасила бы в зелёный запуск с упавшей проверкой — решение записано
в ADR 0003. Комментарии остались в четырёх местах: чтение ноды 2 через
remote(), импорт клиента внутри функции, правило запуска уборки и
автосоздание топика в test_kafka. Малые проверки: заглушка task принимает
обе формы декоратора, проверка сведения ошибок заменена проверками
уборки. Красный путь ищет образец по журналам всех задач последнего
запуска, а не в одном самом свежем.

Проверка: make config-test, make smoke (25 проверок) и make smoke-guards
зелены. Разбитый пробник укладывается в 5 секунд из 120, отведённых
run_airflow_probe, — предел не трогаем.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Зачем: пробники — единственный пример DAG в стенде, по ним будут учиться.
Читатель начинал с кода, не зная, что тест утверждает и чем он отличается
от боевого кода, — и рисковал скопировать приёмы проверки связности в ETL.

Что: строка описания test_clickhouse развёрнута в список проверяемых
утверждений и оговорку, что образцом ETL этот тест не является. Описание
уходит в doc_md и видно в интерфейсе Airflow. Правило комментариев из #20
строк описания DAG не касается, границы тикета не задеты.

Проверка: make config-test — 4/3/6, ошибок 0. make smoke — 24 проверки
зелены, включая оба пробника; красной осталась только память стенда
(3250 MiB против порога 3242,5), причина известна и разбирается в #21.
ddmitry merged commit c265ca0cd5 into main 2026-07-31 19:23:19 +03:00
ddmitry deleted branch feat/20-dag-probe-form 2026-07-31 19:23:20 +03:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: ddmitry/clickstream-data-platform#23