refactor(smoke): цели проверки по назначению — смоук, ClickHouse, службы #58

Merged
ddmitry merged 2 commits from refactor/54-proverki-po-naznacheniyu into main 2026-08-06 16:04:44 +03:00
Owner

Closes #54.

Счёт и время

Замер на поднятом стенде 6 августа 2026 года, рядом с прежними 48 секундами
на 25 проверок
в одном скрипте:

Цель Проверок Время
make smoke 20 8 с
make check-clickhouse (бывшая smoke-cluster) 8 7 с
make check-services (новая) 7 44 с

Проверок было 25, стало 26. Разбор расхождения:

  • 25 прежних разошлись как 19 + 6, содержание ни одной не менялось;
  • check_containers_survived считается дважды — это дублирование разрешено
    тикетом: стенд нагружает check-services, но увидеть отказ по памяти нужно
    и тому, кто гонял один смоук (ADR 0004);
  • +1 новаяcheck_kafka_external_listener, заведена сверх тикета по
    решению владельца по ходу работы (см. «Одна проверка сверх переноса»).

Зависимости машины считает только смоук: «на машине есть Docker, curl и jq» —
вопрос к машине, и на оси он стоит рядом с «стенд собран». Для check-services
это условие запуска, ЗЕЛЁНО за него там не печатается.

Ось деления

Цели различаются не ценой, а тем, кого спрашивают. Быстрота — следствие:
ClickHouse отвечает сам и за миллисекунды, Airflow — через такт планировщика,
Superset — через сессию и обход метаданных.

Совпадение цены и назначения побочное, и это видно по дырам: make smoke не
заметит перепутанных макросов shard — обе ноды здоровы и порты отвечают;
make check-clickhouse не заметит потерянного подключения Superset — он про
ClickHouse и только.

Форма разделения

Два скрипта плюс общий файл, без копипасты:

  • scripts/stand-smoke.sh — 20 проверок;
  • scripts/stand-services.sh — 7;
  • scripts/stand-common.sh — счёт проверок, обращение к Compose,
    published_port, зависимости машины, check_containers_survived, строка
    ИТОГ. Сам не запускается.

Имена файлов не трогал: scripts/clickhouse-smoke.sh занят веткой #43, и
переименование устроило бы конфликт на ровном месте. Расхождение имени цели и
имени файла названо строкой в карте. Единственная правка в том файле — два
сообщения об оборванной уборке, где стояло «повторите make smoke-cluster»:
команды с таким именем больше нет.

Одна проверка сверх переноса

Деление оставило дыру, которой раньше не было. Про Airflow, Superset,
Prometheus и Grafana смоук стучится с машины в отображённый порт, а про Kafka
после переезда check_kafka_from_host знал только «контейнер здоров» — а этот
вердикт приходит из healthcheck в compose.yaml, и тот спрашивает брокер
изнутри по внутреннему слушателю. Объявленный наружу адрес может вести не туда,
и Kafka всё равно останется здоровой.

Поломка популярная и показательная: клиент подключается, получает метаданные и
молча виснет на адресе, которого с его стороны не существует. Менти узнаёт, что
у брокера два слушателя и зачем нужен advertised.listeners. Генератор будет
писать в Kafka именно с машины.

Проверка стоит 2,6 секунды, и почти всё это — старт JVM в разовом контейнере, а
не разговор с брокером. Ожидание ответа ограничено 15 секундами при замеренных
2,6 — впятеро больше зелёного прогона.

Карта проверок

docs/architecture/testing.md — новый файл по конвенции каталога. В нём все
семь целей: что утверждает, нужен ли стенд, сколько стоит. Там же правило про
быстрый смоук словами, наблюдение к нему (дорого обходится не работа, а
ожидание службы), лесенка по частоте и переехавшая из README мысль «проверка,
которая не умеет краснеть, бесполезна». Практическая мерка: по документу
решается, куда класть новую проверку, без чтения скриптов — ответ даёт ось.

Автоматического порога по времени нет и заводить его не следует (ADR 0004,
спека генератора: «наблюдаемость без порогов»). Смоук и check-services
печатают своё время в строке ИТОГ — как замер, а не как порог.

Из AGENTS.md — строка-указатель. Из README карта не дублируется: описания целей
и лесенка переехали, остались быстрый старт, рабочий цикл и ссылка. Быстрый
старт правлен осознанно: первое знакомство запускает все три цели на стенде —
пара make up && make smoke после деления уже не показывает, что Airflow
запускает DAG, а Superset ходит в базу.

Планка приёмки этапа в спеке названа поимённо: make smoke,
make check-clickhouse, make check-services вместо общего «smoke-проверки»,
иначе она тихо опустилась бы при том же названии команды.

Проверка

Все цели на поднятом стенде зелёные:

make config-test                       ЗЕЛЁНО
make smoke              20 проверок, 8 с
make check-clickhouse    8 проверок, 7 с
make check-services      7 проверок, 44 с

Краснеть умеют обе разделённые цели — проверено руками, а не рассуждением:

  • со снятым prometheus смоук дал три ошибки и ненулевой код возврата;
  • с подменённым ожидаемым UUID подключения Superset покраснел check-services;
  • новую проверку Kafka проверили её собственной поломкой: брокеру объявлен
    адрес kafka-nowhere:29092 при целом внутреннем слушателе — проверка
    состояния контейнера осталась зелёной, смоук покраснел именно на этой строке.
    Kafka возвращена в исходное состояние, посторонних контейнеров не осталось.

Обе цели краснеют и когда на машине не хватает команды из списка зависимостей.

Холодное ревью

Линию дефектов вёл Codex свежим тредом, без общего контекста. Две находки:

  • MINOR, исправлено: в карте абзац замеров спорил с таблицей — «5 и 6
    секунд» осталось от версии до добавления проверки Kafka.
  • MAJOR, отклонено с доводом: kafka-topics.sh --list проверяет код
    возврата, поэтому объявленный адрес, ведущий на другой живой кластер Kafka,
    дал бы зелёное. Это не регрессия — переехавшая check_kafka_from_host
    устроена так же и подмену кластера тоже не заметит. Сценарий требует второго
    достижимого брокера на той же машине при портах, привязанных к 127.0.0.1.
    Закрытие стоит второго запуска JVM (сверка CLUSTER_ID) — плюс 30% к смоуку
    ради случая, которого на локальной машине не бывает. Отложенный риск: если
    стенд поедет в общую среду, проверку надо усилить сверкой идентификатора
    кластера.

Что осталось за границами

make config-test проверяет синтаксис Bash не так, как обещает: bash -n со
списком файлов разбирает только первый, остальные уходят в аргументы. Проверено
отдельно — заведомо сломанный второй файл проходит зелёным. Чинится циклом в
одну строку, но это вне границ #54; стоит отдельного тикета.

Closes #54. ## Счёт и время Замер на поднятом стенде 6 августа 2026 года, рядом с прежними **48 секундами на 25 проверок** в одном скрипте: | Цель | Проверок | Время | |---|---|---| | `make smoke` | 20 | 8 с | | `make check-clickhouse` (бывшая `smoke-cluster`) | 8 | 7 с | | `make check-services` (новая) | 7 | 44 с | Проверок было 25, стало 26. Разбор расхождения: - 25 прежних разошлись как **19 + 6**, содержание ни одной не менялось; - `check_containers_survived` считается дважды — это дублирование разрешено тикетом: стенд нагружает `check-services`, но увидеть отказ по памяти нужно и тому, кто гонял один смоук (ADR 0004); - **+1 новая** — `check_kafka_external_listener`, заведена сверх тикета по решению владельца по ходу работы (см. «Одна проверка сверх переноса»). Зависимости машины считает только смоук: «на машине есть Docker, curl и jq» — вопрос к машине, и на оси он стоит рядом с «стенд собран». Для `check-services` это условие запуска, ЗЕЛЁНО за него там не печатается. ## Ось деления Цели различаются не ценой, а тем, **кого спрашивают**. Быстрота — следствие: ClickHouse отвечает сам и за миллисекунды, Airflow — через такт планировщика, Superset — через сессию и обход метаданных. Совпадение цены и назначения побочное, и это видно по дырам: `make smoke` не заметит перепутанных макросов `shard` — обе ноды здоровы и порты отвечают; `make check-clickhouse` не заметит потерянного подключения Superset — он про ClickHouse и только. ## Форма разделения Два скрипта плюс общий файл, без копипасты: - `scripts/stand-smoke.sh` — 20 проверок; - `scripts/stand-services.sh` — 7; - `scripts/stand-common.sh` — счёт проверок, обращение к Compose, `published_port`, зависимости машины, `check_containers_survived`, строка ИТОГ. Сам не запускается. Имена файлов не трогал: `scripts/clickhouse-smoke.sh` занят веткой #43, и переименование устроило бы конфликт на ровном месте. Расхождение имени цели и имени файла названо строкой в карте. Единственная правка в том файле — два сообщения об оборванной уборке, где стояло «повторите `make smoke-cluster`»: команды с таким именем больше нет. ## Одна проверка сверх переноса Деление оставило дыру, которой раньше не было. Про Airflow, Superset, Prometheus и Grafana смоук стучится с машины в отображённый порт, а про Kafka после переезда `check_kafka_from_host` знал только «контейнер здоров» — а этот вердикт приходит из `healthcheck` в `compose.yaml`, и тот спрашивает брокер изнутри по внутреннему слушателю. Объявленный наружу адрес может вести не туда, и Kafka всё равно останется здоровой. Поломка популярная и показательная: клиент подключается, получает метаданные и молча виснет на адресе, которого с его стороны не существует. Менти узнаёт, что у брокера два слушателя и зачем нужен `advertised.listeners`. Генератор будет писать в Kafka именно с машины. Проверка стоит 2,6 секунды, и почти всё это — старт JVM в разовом контейнере, а не разговор с брокером. Ожидание ответа ограничено 15 секундами при замеренных 2,6 — впятеро больше зелёного прогона. ## Карта проверок `docs/architecture/testing.md` — новый файл по конвенции каталога. В нём все семь целей: что утверждает, нужен ли стенд, сколько стоит. Там же правило про быстрый смоук словами, наблюдение к нему (дорого обходится не работа, а ожидание службы), лесенка по частоте и переехавшая из README мысль «проверка, которая не умеет краснеть, бесполезна». Практическая мерка: по документу решается, куда класть новую проверку, без чтения скриптов — ответ даёт ось. Автоматического порога по времени нет и заводить его не следует (ADR 0004, спека генератора: «наблюдаемость без порогов»). Смоук и `check-services` печатают своё время в строке ИТОГ — как замер, а не как порог. Из AGENTS.md — строка-указатель. Из README карта не дублируется: описания целей и лесенка переехали, остались быстрый старт, рабочий цикл и ссылка. Быстрый старт правлен осознанно: первое знакомство запускает все три цели на стенде — пара `make up && make smoke` после деления уже не показывает, что Airflow запускает DAG, а Superset ходит в базу. Планка приёмки этапа в спеке названа поимённо: `make smoke`, `make check-clickhouse`, `make check-services` вместо общего «smoke-проверки», иначе она тихо опустилась бы при том же названии команды. ## Проверка Все цели на поднятом стенде зелёные: ``` make config-test ЗЕЛЁНО make smoke 20 проверок, 8 с make check-clickhouse 8 проверок, 7 с make check-services 7 проверок, 44 с ``` Краснеть умеют обе разделённые цели — проверено руками, а не рассуждением: - со снятым `prometheus` смоук дал три ошибки и ненулевой код возврата; - с подменённым ожидаемым UUID подключения Superset покраснел `check-services`; - новую проверку Kafka проверили её собственной поломкой: брокеру объявлен адрес `kafka-nowhere:29092` при целом внутреннем слушателе — проверка состояния контейнера осталась зелёной, смоук покраснел именно на этой строке. Kafka возвращена в исходное состояние, посторонних контейнеров не осталось. Обе цели краснеют и когда на машине не хватает команды из списка зависимостей. ## Холодное ревью Линию дефектов вёл Codex свежим тредом, без общего контекста. Две находки: - **MINOR, исправлено:** в карте абзац замеров спорил с таблицей — «5 и 6 секунд» осталось от версии до добавления проверки Kafka. - **MAJOR, отклонено с доводом:** `kafka-topics.sh --list` проверяет код возврата, поэтому объявленный адрес, ведущий на *другой* живой кластер Kafka, дал бы зелёное. Это не регрессия — переехавшая `check_kafka_from_host` устроена так же и подмену кластера тоже не заметит. Сценарий требует второго достижимого брокера на той же машине при портах, привязанных к `127.0.0.1`. Закрытие стоит второго запуска JVM (сверка `CLUSTER_ID`) — плюс 30% к смоуку ради случая, которого на локальной машине не бывает. Отложенный риск: если стенд поедет в общую среду, проверку надо усилить сверкой идентификатора кластера. ## Что осталось за границами `make config-test` проверяет синтаксис Bash не так, как обещает: `bash -n` со списком файлов разбирает только первый, остальные уходят в аргументы. Проверено отдельно — заведомо сломанный второй файл проходит зелёным. Чинится циклом в одну строку, но это вне границ #54; стоит отдельного тикета.
ddmitry added 2 commits 2026-08-06 15:31:48 +03:00
- Зачем:
  - смоук перестал быть быстрым: 42 секунды из 48 съедали шесть проверок,
    которые ждут службу — запуск DAG, вход в Superset, Kafka с машины.
  - имена целей врали: смоуком звались и глубокая проверка кластера, и
    интеграционные проверки; префикс достался им от общего происхождения.
  - нигде не было записано, зачем в репозитории каждая цель и куда класть
    новую проверку, — без записи скрипт дорастёт снова.
- Что:
  - ось деления — кого спрашивают, а не сколько стоит: make smoke (стенд
    собран), make check-clickhouse (спрашивают у ClickHouse), новая
    make check-services (службы работают).
  - шесть тяжёлых проверок переехали в scripts/stand-services.sh; общее —
    счёт, обращение к Compose, зависимости машины и check_containers_survived
    — вынесено в scripts/stand-common.sh, копипасты нет.
  - smoke-cluster переименована в check-clickhouse; имя файла скрипта не
    тронуто (в него встраивается проверка договора со схемой), расхождение
    названо в карте.
  - смоук и check-services печатают своё время в строке ИТОГ; порога по
    времени нет — по доводу ADR 0004.
  - docs/architecture/testing.md: карта всех семи целей, правило быстрого
    смоука словами, лесенка по частоте и правило про краснеющую проверку,
    переехавшее из README; указатель из AGENTS.md.
  - README: описания целей сокращены, карта не дублируется; быстрый старт
    показывает работающий стенд, а не только собранный.
  - планка приёмки этапа в спеке названа поимённо: три цели вместо
    «smoke-проверки».
- Проверка:
  - make config-test, make smoke (19 проверок, 6 с), make check-clickhouse
    (8 проверок, 7 с), make check-services (7 проверок, 44 с) — зелёные.
  - 19 + 7 = 25 разных проверок, как и до деления: check_containers_survived
    считается дважды намеренно.
  - краснеют обе разделённые цели: со снятым prometheus смоук дал три ошибки,
    с подменённым UUID подключения Superset покраснел check-services.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- Зачем:
  - деление целей оставило дыру: про Airflow, Superset, Prometheus и Grafana
    смоук стучится с машины в отображённый порт, а про Kafka после переезда
    check_kafka_from_host знал только «контейнер здоров».
  - вердикт этот приходит из healthcheck в compose.yaml, а тот спрашивает
    брокер изнутри и по внутреннему слушателю: объявленный наружу адрес может
    вести не туда, и Kafka всё равно останется здоровой.
  - поломка популярная и показательная: клиент подключается, получает
    метаданные и молча виснет на адресе, которого с его стороны нет. Менти
    узнаёт, что у брокера два слушателя и зачем нужен advertised.listeners.
    Генератор будет писать в Kafka именно с машины.
- Что:
  - check_kafka_external_listener в make smoke: запрос списка топиков с машины
    через отображённый порт, ответ приходит только если объявленный адрес ведёт
    туда же. Комментарий у проверки объясняет, от чего она заведена.
  - ожидание ответа ограничено 15 секундами при замеренных 2,6 — впятеро
    больше, чем стоит зелёный прогон.
  - README и карта проверок: новая проверка названа, доводы записаны, цена
    смоука обновлена с 6 до 8 секунд.
- Проверка:
  - make config-test, make smoke (20 проверок, 8 с), make check-clickhouse,
    make check-services — зелёные.
  - краснеет на своей поломке: брокеру объявлен адрес kafka-nowhere:29092 при
    целом внутреннем слушателе — проверка состояния контейнера осталась
    зелёной, смоук покраснел именно на этой строке. После проверки Kafka
    возвращена в исходное состояние, посторонних контейнеров не осталось.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
ddmitry merged commit 4245daf3f1 into main 2026-08-06 16:04:44 +03:00
ddmitry deleted branch refactor/54-proverki-po-naznacheniyu 2026-08-06 16:04:53 +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#58