Срезать проверки стенда: под нож всё, что не служит менти #56
Notifications
Due Date
No due date set.
Blocks
#54 Проверки по назначению: честные имена целей, карта и быстрый смоук
ddmitry/clickstream-data-platform
Reference: ddmitry/clickstream-data-platform#56
Reference in New Issue
Block a user
Цель
Проверок в репозитории больше, чем продукта. Замер 6 августа 2026 года:
1583 строки проверок стенда и 447 строк пробников против 2787 строк генератора
и 405 строк SQL с конфигами. Это на первом этапе из девяти.
Выросло не по замыслу. Каждая проверка появлялась как критерий приёмки этапа,
критерии писались из спеки, а спека писалась до того, как стенд впервые
собрали. Тот же механизм разобран в ADR 0004 на примере порога памяти: число
из оценки стало законом, которого никто не выбирал.
Критерий отбора здесь один: проверка остаётся, если она очевидно полезна
менти. Читатель — не побочный потребитель, а тот, ради кого стенд существует
(AGENTS.md, «Кому что поручать»). Код, который менти не прочтёт и из которого
ничему не научится, учебной ценности не несёт, а сопровождать его приходится:
при каждой правке проверок сторожа переписываются заново.
Тесты генератора (
generator/tests, 2113 строк) под нож не идут: длябиблиотеки в 2787 строк это нормальное соотношение, а схема события объявлена
контрактом.
Что войдёт
tests/dag-probes-unit.pyStubMessage,StubTopicPartition,RecordingClientпроверяют вспомогательные функции пробника в отрыве от стенда. Пробник затем и существует, чтобы гоняться на живом стенде; если он сломан, это видно из его прогонаtests/stand-smoke-guards.shsetsid, гонке за окном между фоновым прогоном и пробником, убийству групп процессов и разбору журналов DAG внутри контейнера. Про дата-платформу здесь ничегоtests/stand-smoke-static.shtests/smoke-guards.shцеликом, вместе с цельюmake smoke-guardssetsidи гонкой за окном:check_failure_guardsубиваетclickhouse-02посреди прогона и меряет уборку, вторая его половина шлёт SIGINT по группе процессов,check_preflight_hintтоже убивает ноду и чинит стенд черезmake upcheck_env_consistencyвscripts/stand-smoke.sh${VAR:-default}из compose и сверка с.env.example— парсер на bash, который менти не прочтёт_assert_*на пробник. Они оборонительные, а не учебныеЧто остаётся и почему.
dags/test_clickhouse.pyиdags/test_kafka.py— единственное место, где видно, как Airflow ходит вClickHouse и Kafka; по ним менти напишет свои DAG-и. Утверждения остаются
дословно: запись через ноду 1 и чтение через
Distributedна ноде 2;запись в Kafka и чтение своего маркера. Режется только обвязка: функции
_assert_*сворачиваются в тело задач. Комментарии про разницуDELIVERY / SOCKET / FLUSH и про одноразовую группу консьюмера сохранить
дословно — это готовый учебный текст, а не служебная заметка.
smoke-guards.sh, остаются на месте.Подсказка «выполните make up» на неподнятом стенде и уборка временных таблиц
по Ctrl-C живут в
scripts/clickhouse-smoke.sh, а его мы не трогаем.Удаляется только их сторож. Менти встретит оба естественным путём: поднимет
не весь стенд — увидит подсказку, нажмёт Ctrl-C — увидит, что мусора не
осталось. Отдельный прогон с убийством ноды и двумя
make upради этого ненужен.
check_keeper_runtimeпереезжает вscripts/stand-smoke.sh. Это несторож: keeper работает от пользователя
clickhouse,nofileне меньше262144, каталог данных свой. Это проверка устройства стенда, и грабли тут
настоящие. В
scripts/clickhouse-smoke.shеё не селим — он занят веткой #43.Из-за этого переезда счёт проверок в смоуке не падает: минус
check_env_consistency, плюсcheck_keeper_runtime— снова 25. Падаютстроки, а не счёт; так и назвать в PR.
переписывается.
dags/test_clickhouse.pyобъясняет, почемуimport clickhouse_connectспрятан внутрь задачи, ссылкой на малыепроверки — после их удаления это станет неправдой. Но у отложенного импорта
есть вторая причина, и она лучше первой: обработчик разбирает DAG-файл снова
и снова, и тяжёлый импорт наверху оплачивался бы каждым разбором. Это прямая
рекомендация Airflow (
best-practices.rst, сверено через Context7 на 3.1.6:в примере доки названы
pandas,torch,tensorflow— наши клиенты того жерода). Импорт остаётся на месте, комментарий пишется про настоящую причину.
Для менти это выигрыш: живое правило Airflow вместо детали нашего
config-test. Вdags/test_kafka.pyтакого комментария нет вовсе —поставить один раз для
confluent_kafka.scripts/config-test.shхудеет вместе сdag-probes-unit.py. Он нетолько запускает юнит-тесты пробников, но и грепает их вывод по образцу
^(Ran [0-9]+ tests|OK|FAILED)— проверяет, что unittest действительночто-то прогнал. Это сторож сторожа, и уходит он вместе с тем, что сторожил.
Остальное в
config-test.sh(bash -n,compileallпоdags, разборcompose) остаётся: дёшево и ловит настоящие опечатки.
умеет краснеть, бесполезна — не пропадает, а записывается абзацем в README
(в #54 переедет в
docs/architecture/testing.md). Абзац текста вместо193 строк гонок.
make up --waitони повторяют то, чего compose уже дождался: у всехдолгоживущих служб есть healthcheck. Менти первым делом хочет знать, что всё
живо, и стоят они меньше секунды. В документации это назвать честно.
Критерии приёмки
tests/dag-probes-unit.pyудалён;scripts/config-test.shна негобольше не ссылается, греп по его выводу убран вместе с вызовом.
tests/stand-smoke-guards.shудалён; мысль «проверка, которая не умееткраснеть, бесполезна» записана абзацем в README.
tests/stand-smoke-static.shудалён;make config-testзелёный без него.tests/smoke-guards.shудалён, цельmake smoke-guardsизMakefileубрана, упоминания в README сняты.
check_keeper_runtimeработает в составеmake smoke.check_env_consistencyудалён изscripts/stand-smoke.sh. Роль.env.exampleобъяснена в README словами._assert_*свёрнуты, учебные комментарии сохраненыдословно — кроме комментария про отложенный импорт, он переписан на
причину из документации Airflow. Оба пробника по-прежнему делают ровно
то, что делали:
test_clickhouseпишет через ноду 1 и читает черезDistributedна ноде 2,test_kafkaпишет в Kafka и читает свой маркер.make smokeназван в теле PR вместе с числом строк:счёт остаётся 25, режутся строки.
make config-test,make up,make smoke,make smoke-clusterзелёные.
.env.example, составпроверок, абзац про красноту), при необходимости — спека.
Границы
generator/tests).scripts/clickhouse-smoke.shне трогать: в него встраиваетсяcontract-тест из #43.
дословно; режется обвязка вокруг.
здесь. Этот тикет идёт первым: он убирает код, который #54 иначе стал бы
делить и переименовывать.
Сначала прочитать
tests/dag-probes-unit.py,tests/stand-smoke-guards.sh,tests/stand-smoke-static.sh,tests/smoke-guards.sh— всё, что режется.scripts/stand-smoke.sh—check_env_consistencyв начале файла.dags/test_clickhouse.py,dags/test_kafka.py— что сохранить дословно.scripts/config-test.sh— запуск юнит-тестов пробников и греп по их выводу.Makefile— цельconfig-testменяет состав, цельsmoke-guardsуходит.AGENTS.md— про учебную ценность и про то, кому что поручать.docs/adr/0004-resource-limits.md— как из оценки получается закон.Проверка