feat(monitoring): подготовлена основа мониторинга Kafka и ClickHouse

- Зачем:
  - подготовлен пол мониторинга для SQL-панелей и метрик отставания Kafka.
- Что:
  - добавлены отдельная роль ClickHouse, источник Grafana и Kafka exporter.
  - образ Grafana собирается с закреплённым плагином вне тома данных.
  - Prometheus, смоук и документация обновлены под четыре цели.
- Проверка:
  - make config-test; make lint.
  - make smoke; make check-clickhouse; make check-services.
  - make -C generator lint typecheck test.
This commit is contained in:
ddadmin committed 2026-08-21 09:56:56 -04:00
1 parent 0bb07fd91d
commit c5dd9c2d34
14 files changed
+326 -47

No files matched your search

+38 -2
View File
@@ -1,10 +1,11 @@
# ADR 0007. Доступ к ClickHouse: пользователи файлом, доверие нод секретом
Дата: 9 августа 2026 года. Статус: принято.
Дата: 9 августа 2026 года. Статус: принято; роль `monitoring_reader`
и пользователь `grafana` добавлены 21 августа 2026 года (#114).
## Решение
У кластера пять пользователей и четыре роли.
У кластера шесть пользователей и пять ролей.
- `default` — с паролем, только служебный: проверки здоровья нод и работа
изнутри контейнеров. Приложения им не ходят.
@@ -14,6 +15,8 @@
Им ходит Superset.
- `analyst` с ролью `analyst_reader` — чтение всех слоёв и справочников. Им
человек подключается снаружи, из своего клиента.
- `grafana` с ролью `monitoring_reader` — чтение слоёв, таблиц базы `dic` и
системных таблиц, `CLUSTER` и `REMOTE`. Им ходит Grafana, и больше никто.
- `dict` с ролью `dict_reader` — чтение одной базы `dic`, пароля нет. Им
словарь читает свою подложку, и больше он никем не используется
([ADR 0012](0012-dictionary-home.md)).
@@ -58,6 +61,20 @@ DDS под ними, потому что так чаще всего и быва
есть положить секрет в git. Ходить этой учёткой некуда: право у неё одно —
`SELECT` на `dic`, и хост источника локальный.
**Своя роль дашбордам.** Панели мониторинга живут не на витринах, а на
`system.query_log`, частях MergeTree и очереди распределённых DDL — и читают
их через `clusterAllReplicas`, потому что системные таблицы у каждой ноды свои
([ADR 0002](0002-monitoring-scope.md)). Для этого нужны `SELECT` на `system.*`
и `REMOTE`; контракт роли также включает `CLUSTER` для запросов `ON CLUSTER`.
Такого набора не было ни у одного читателя: у обеих читающих ролей из
системных таблиц только `system.settings`. Догрузить
недостающее в `analyst_reader` отвергнуто: аналитик получил бы системные
таблицы и `REMOTE` заодно, а в `system.query_log` запросы Grafana стали бы
неотличимы от человеческих — ровно там, где дашборд «Запросы» и должен их
различать. Пускать Grafana под `etl` отвергнуто сразу: читатель не получает
права писать. Осталась своя роль по здешней общей схеме — у каждого
потребителя она своя.
**Секрет, а не учётные данные по репликам.** У каждой реплики в описании
кластера своя учётка — вписанная явно или подразумеваемая, и тогда это
беспарольный `default`. Подключение к соседней ноде идёт от неё, а не от
@@ -141,6 +158,25 @@ DDS под ними, потому что так чаще всего и быва
настройки ClickHouse.
- Весь DDL репозитория идёт через `IF NOT EXISTS` (файлы `sql/ddl/`).
Права роли `monitoring_reader` сверены 21 августа 2026 года по документации
ClickHouse через MCP Context7 (#114).
- Системные таблицы выдаются обычным `SELECT`: в документации это
`GRANT SELECT ON system.query_log`, значит `SELECT ON system.*` и есть «все
системные таблицы». Отдельного права на них нет.
- `GRANT CLUSTER ON *.*` — документированная форма права на запросы
`ON CLUSTER`; текущий запрос `clusterAllReplicas` его не использует.
- `clusterAllReplicas` документация держит в одном ряду с `remote`,
`remoteSecure` и `cluster`: это табличная функция, которая берёт имя
кластера из `remote_servers` и идёт на каждую его реплику. Отсюда `REMOTE` —
без права на удалённое обращение запрос дальше своей ноды не пойдёт, а
панели ADR 0002 читают `system.*` именно так.
Набор проверен на живом стенде 21 августа 2026 года (#114): пользователь
`grafana` из Grafana выполнил
`SELECT count() AS replicas FROM clusterAllReplicas('clickstream_cluster', system.one)`
и получил 2 — прав хватает, чтобы прочесть системную таблицу с обеих нод.
Проверено на живом стенде 13 августа 2026 года, ClickHouse 26.3.17.56.
- Секрет кластера принимается внутри `remote_servers` в виде