Пробники — первый и пока единственный пример 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.
Зачем: пробник был одной задачей — в интерфейсе 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 main2026-07-31 19:23:19 +03:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
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.