Grafana и ClickHouse для мониторинга PLC: настройка
Связка ClickHouse и Grafana закрывает две разные задачи: база хранит выборки с контроллера и быстро отдаёт срезы, дашборд превращает их в картину, читаемую за секунды. ClickHouse здесь склад, Grafana — витрина. Собирать витрину имеет смысл только после проверки склада.
Ниже — порядок настройки на нашем проекте промышленного сбора данных: что проверить в базе до первого графика, как развернуть Grafana в Docker, как подключить ClickHouse безопасно и какие панели действительно нужны инженеру у линии.
Зачем производству дашборд, а не SQL
Поток сигналов с контроллера в виде таблицы не читается. Недельный сбор — это сотни миллионов значений; глазами в них не найти ни провал опроса, ни рост задержки. График показывает то же самое мгновенно: сбор идёт ровно или рвётся, время цикла держится или растёт, сигналы меняются или замерли.
Второй эффект — управленческий. Один экран, на который можно посмотреть вместе с руководителем смены, заменяет пересказ. Обсуждение переходит с догадок на то, что видно обоим.
Шаг 1. Проверить базу до первого графика
Красивые панели поверх грязных данных рисуют убедительную неправду. Поэтому первым делом — ревизия того, что уже лежит в ClickHouse. В нашей схеме две ключевые сущности: таблица полных выборок с контроллера и каталог сигналов. Одна выборка — один цикл чтения: время сбора, служебные поля о качестве и длительности опроса, массив значений по всем сигналам.
| Что проверяем | Почему это ломает дашборд |
|---|---|
| Число загруженных строк | Панель «данные идут» врёт при пустых окнах |
| Дубликаты выборок | Завышают частоту опроса и счётчики событий |
| Длина массива против числа сигналов | Значения уезжают на соседние позиции |
| Неполные выборки | Разрывы читаются как остановка линии |
| Значения NULL | Агрегаты молча считаются не по всем точкам |
| Совпадение каталога с позициями в массиве | Подпись на графике перестаёт соответствовать сигналу |
Последний пункт самый коварный: массив значений связан с каталогом позицией, а не именем. Сместился каталог — график остался красивым, но показывает другой сигнал.
Шаг 2. Grafana в Docker с постоянным томом
Grafana разворачивается отдельным контейнером, а её настройки и дашборды выносятся в постоянный Docker volume. Правило простое: контейнер должен пересоздаваться свободно, рабочие настройки при этом обязаны пережить пересоздание.
Grafana и ClickHouse объединяются общей Docker-сетью, и тогда дашборд ходит в базу по внутреннему адресу контейнера, а не через внешний интернет. Наружу выставляется только Grafana — через reverse proxy с HTTPS на своём домене. Внутренний порт в интернет не публикуется.
Для производственного контура это минимальная гигиена: одна аккуратная точка входа вместо набора открытых портов.
Шаг 3. Подключение ClickHouse отдельным пользователем
Подключение делается официальным плагином Grafana для ClickHouse — после установки в списке источников появляется новый datasource.
Ключевая деталь, которую часто пропускают: учётка, под которой Grafana читает базу, — не учётка входа в саму Grafana. Это разные вещи. Для чтения заводим отдельного пользователя ClickHouse с минимально необходимыми правами и не используем администратора.
Причина не в паранойе. Дашборд рано или поздно получат смежные службы, а вместе с ним — права того пользователя, под которым он ходит в базу. Права на запись в этом сценарии не нужны никому.
Какие панели нужны на самом деле
Полезный дашборд отвечает не на вопрос «как выглядят наши данные», а на вопрос «всё ли в порядке прямо сейчас». Минимальный набор:
- Живость сбора — выборки в единицу времени. Провал виден раньше, чем о нём сообщит оператор.
- Длительность опроса — рост задержки говорит о проблеме связи или перегрузке контроллера до того, как что-то отвалится.
- Качество выборки — доля неполных и битых массивов.
- Динамика ключевых сигналов — те, что связаны с продуктом, а не все подряд.
- События и аварии — лентой, с началом и концом, а не точками.
Разворачивать сюда всё содержимое каталога не нужно: панель, на которую никто не смотрит, стоит запросов к базе и внимания.
Как устроен сам каталог и почему без него подписи на графиках бессмысленны — в материале о карте сигналов PLC. Требования к данным для аналитики — в разборе, какие данные нужны для цифрового двойника.
Чеклист настройки
- Проверить базу до первого графика: дубликаты, длины массивов, NULL, соответствие каталога позициям.
- Развернуть Grafana в контейнере, настройки вынести в постоянный том.
- Соединить Grafana и ClickHouse общей внутренней сетью.
- Наружу отдавать только reverse proxy с HTTPS, внутренний порт не публиковать.
- Завести отдельного пользователя ClickHouse для чтения, администратора не использовать.
- Начать с пяти панелей о живости сбора, а не с визуализации всего каталога.
- Проверить, что подпись каждой панели соответствует сигналу, а не позиции в массиве.
- Зафиксировать, что дашборд читает данные, но ничего не пишет в контроллер.
Частые ошибки
Начать с графиков. Самая дорогая ошибка: неверные данные, показанные убедительно, живут в отчётах месяцами.
Пустить Grafana в базу под администратором. Учётка визуализации требует только чтения, и права на запись здесь — чистый риск без выгоды.
Хранить настройки внутри контейнера. Одно пересоздание контейнеров — и дашборды приходится собирать заново.
Публиковать порт Grafana напрямую. Реверс-прокси с сертификатом ставится один раз и снимает целый класс проблем.
Строить панель на каждый сигнал каталога. Дашборд, который нельзя охватить взглядом, перестают открывать.
Что делать дальше
Прежде чем рисовать первую панель, выполните один запрос: сравните число позиций в каталоге сигналов с длиной массива значений в случайной выборке за последние сутки. Если числа расходятся хотя бы на единицу, настройка мониторинга откладывается — сначала чинится соответствие каталога и данных, иначе каждый график будет подписан чужим именем.