docs(adr): решён состав мониторинга стенда

Зачем: строчка спеки описывала только цели Prometheus, и этап 9 по ней
честно сделал бы девопсовый минимум. Разбор мониторинга предшественника
показал, что там из 28 панелей на вопросы дата-инженера отвечают шесть, а
свежесть, доля брака и сходимость Kafka с ClickHouse не измеряются вовсе.
Состав панелей решается до этапа 9: урок можно рассказать только про то,
что дашборд показывает.

Что: добавлен ADR 0002 — дашборды «данные», «кластер» и «запросы»;
ClickHouse подключается в Grafana источником данных, панели пишутся на SQL;
Prometheus сжимается до тонкого пола, сборщик метрик Airflow через StatsD
не берётся. Инфраструктурные панели сохранены отдельным дашбордом:
«слишком много частей» — ошибка дата-инженера, а видна она именно там.
Плагин источника данных ставится сборкой своего образа Grafana, а не при
старте контейнера: иначе стенд начинает зависеть от сети. Строка объёма в
спеке и пункт этапа 9 указывают на ADR.

Проверка: make config-test — зелено. Отсутствие источника данных ClickHouse
в образе Grafana подтверждено запросом к живому стенду.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-31 16:39:18 +03:00
co-authored by Claude Opus 5
parent 316c3ed68d
commit 86d2214d7c
2 changed files with 119 additions and 2 deletions
+116
View File
@@ -0,0 +1,116 @@
# ADR 0002. Что показывает мониторинг стенда
Дата: 31 июля 2026 года. Статус: принято.
## Решение
Мониторинг стенда — несколько дашбордов Grafana, по одному на вопрос. Дашборд,
отвечающий на три вопроса сразу, не отвечает ни на один; отдельных файлов
не жалко.
**«Данные»** — главный дашборд, вопросы дата-инженера:
- свежесть: сколько прошло с момента, когда доехало последнее событие;
- поток: строк в час по источникам и как это выглядит против вчерашнего;
- брак: сколько записей ушло в таблицы `*_errors` и какая это доля;
- сходимость: сколько произвели в Kafka против того, сколько приземлилось
в ClickHouse;
- отставание чтения из Kafka;
- дневной слепок заказов: доехал ли и вовремя ли.
Источник большинства этих панелей — не Prometheus, а сам ClickHouse: он
подключается в Grafana источником данных, панели пишутся на SQL. Метрики
дата-инженера живут в его собственных таблицах, а не в счётчиках сервисов.
**«Кластер»** — состояние машины: процессор и память обеих нод, обращения к
дискам, части MergeTree и слияния, keeper, очередь распределённых DDL. Дашборд
кажется чужим для дата-инженера, но чужой он только на вид: «слишком много
частей» — это ошибка того, кто вставляет мелкими пачками слишком часто, а
видна она именно здесь. То же с памятью: тяжёлый `GROUP BY` без ограничения —
запрос человека, симптом — на графике памяти.
Смотреть этот дашборд осмысленно под нагрузкой: видно, как процессор и
обращения к дискам лезут вверх на вставке и медленно оседают, когда
домержились части. Одно число «жив или нет» этому не учит, форма кривой —
учит.
**«Запросы»** — `system.query_log` таблицей: что выполнялось, сколько заняло,
сколько памяти и строк прочитало. Здесь человек сам отвечает себе на вопрос
«почему мой дашборд в Superset тормозит».
Системные таблицы у каждой ноды свои, поэтому панели по ним пишутся через
`clusterAllReplicas` — иначе видно половину правды. Это отдельный маленький
урок, и он нужен.
Серверный журнал (`system.text_log`) подключается на этапе 9 вместе с runbook
«keeper упал / DDL повис в очереди»: там он и окупается. Довод за него один —
общая ось времени: в одной панели оба узла, над ней всплеск процессора, под
ней очередь DDL. `docker logs` даёт две отдельные ленты и сопоставление
руками. Издержки: журнал выключен по умолчанию, включается настройкой, таблице
нужен TTL. Если окажется дороже, чем даёт, — уходит первым.
Prometheus остаётся, но сжимается до тонкого пола: живы ли контейнеры, не
упёрлись ли ноды в память. Он нужен, чтобы при плохой метрике данных одним
взглядом отделить «сломался конвейер» от «сломалась машина». Отдельный
сборщик метрик Kafka нужен ради отставания чтения. Сборщик метрик Airflow
через StatsD не берём.
## Почему
Образцом служил мониторинг предшественника: четыре дашборда, десять правил
оповещения, два внешних сборщика и урок курса. Форма там хорошая и берётся
целиком — сначала смотрим, потом ломаем одну вещь управляемым образом, видим,
как мониторинг это показал, и возвращаем назад. Содержание берётся не целиком.
Панелей с запросами в трёх «настоящих» дашбордах предшественника — 28.
На вопрос «с данными всё в порядке?» отвечают шесть. Остальное — процессор,
память, части и слияния, размер набора DAG-файлов, время их разбора, пульс
планировщика, свободные слоты исполнителя. И при этом ни одной панели про
свежесть, ни одной про долю брака, ни одной про сходимость Kafka с ClickHouse.
То есть три главных вопроса дата-инженера там просто не заданы.
Отсюда решение: инфраструктурные панели не убираются, а переносятся на свой
дашборд, и рядом появляется тот, которого не было.
Три вещи предшественника не повторяем.
Правило оповещения `Kafka No Messages Produced` краснеет на здоровом стенде,
когда живой поток просто не запущен, и уроку приходится за это извиняться
отдельным абзацем. Правило, красное в нормальном состоянии, учит не тому, что
задумано: оно учит не смотреть на оповещения.
Самый проработанный дашборд предшественника — про генератор, которого в бою
не существует: 17 панелей с гистограммами задержек и пульсом против 12
у ClickHouse. Силы ушли туда, где инструментировать было легко, а не туда, где
стоит вопрос.
Три текстовые панели там хранят команды и пометку «настроено под тик
5 секунд» прямо в JSON дашборда. Поменяется тик — панель молча соврёт.
Документация живёт в документации.
Сборщик метрик Airflow через StatsD — это отдельный контейнер плюс файл
перевода имён, и весь его выход — внутренности планировщика: пульс, слоты,
время разбора файлов. Дежурному по платформе это нужно, дата-инженеру — нет.
Вопрос «доехал ли вчерашний слепок заказов» дешевле и честнее задать самим
данным.
## Что проверено
31 июля 2026 года. Мониторинг предшественника разобран по файлам в
`configs/grafana/provisioning/` и `configs/prometheus.yml` репозитория
`clickstream-ch-kafka-superset-demo`: 28 панелей с запросами в дашбордах
ClickHouse, Kafka и Airflow, 17 — в дашборде генератора, 10 правил
оповещения.
Источник данных ClickHouse — плагин, в образе Grafana его нет. Проверено
запросом к живому стенду (`/api/plugins?type=datasource`): 19 встроенных
источников, ClickHouse среди них отсутствует. Плагин ставится сборкой своего
образа Grafana, как уже собираются свои образы Airflow и Superset. Установка
при старте контейнера отвергнута: она делает `make up` зависимым от сети и от
доступности каталога плагинов, то есть стенд перестаёт подниматься по причинам,
к нему не относящимся. Версия плагина закрепляется, как закреплены остальные.
Состав панелей выбран до этапа 9 намеренно: уроки пишутся отдельной работой
(спека, раздел 10), но рассказать урок можно только про то, что дашборд
показывает. Скопируй мы состав предшественника — урок неизбежно получился бы
про пульс планировщика.
+3 -2
View File
@@ -443,7 +443,7 @@ v2 стартует пустым, поэтому объём ниже — это
| Airflow | DAG'и по образцу v1: etl_pipeline (партиционная переобработка, ожидание дневного батча заказов — сенсор/Datasets), world_init/next_day, helpers | M — ~56 файлов |
| Superset | датасеты + дашборд с тремя новыми сюжетами | M — 2 файла |
| Эталонный мир | сборка артефакта v2, манифест-счётчики, чек-скрипты | M–L |
| Мониторинг | Prometheus/Grafana: цели двух нод и keeper | S 24 конфига |
| Мониторинг | дашборды Grafana «данные», «кластер», «запросы»; ClickHouse источником данных, панели на SQL; Prometheus тонким полом (ADR 0002) | M — конфиги и дашборды |
| Документация | доки v2 пишутся заново (см. раздел 12) | M, в тех же PR |
Итого ~80–110 файлов нового репозитория (посчитаны конфиги по нодам,
@@ -489,7 +489,8 @@ v2 стартует пустым, поэтому объём ниже — это
6. Расхождения B+D и опоздания; счётчики манифеста.
7. Эталонный мир: пересборка артефакта, чек-скрипты.
8. Superset-дашборд v2.
9. Мониторинг и runbook «keeper упал / DDL повис в очереди».
9. Мониторинг и runbook «keeper упал / DDL повис в очереди». Состав дашбордов
и границы — ADR 0002.
Критерий приёмки этапа — честный: `make up` работает и проходят
smoke-проверки, а не «дашборд зелёный». Это минимальная планка; свои