Grafana и ClickHouse для мониторинга PLC: настройка

Настройка мониторинга сбора данных с PLC: ревизия ClickHouse до первого графика, Grafana в Docker, отдельный пользователь на чтение и пять нужных панелей.

Илья Бечейкиг — Технический директор; Сергей Плотников — ML tech lead · 9 сентября 2026 г.

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 с минимально необходимыми правами и не используем администратора.

Причина не в паранойе. Дашборд рано или поздно получат смежные службы, а вместе с ним — права того пользователя, под которым он ходит в базу. Права на запись в этом сценарии не нужны никому.

Какие панели нужны на самом деле

Полезный дашборд отвечает не на вопрос «как выглядят наши данные», а на вопрос «всё ли в порядке прямо сейчас». Минимальный набор:

  1. Живость сбора — выборки в единицу времени. Провал виден раньше, чем о нём сообщит оператор.
  2. Длительность опроса — рост задержки говорит о проблеме связи или перегрузке контроллера до того, как что-то отвалится.
  3. Качество выборки — доля неполных и битых массивов.
  4. Динамика ключевых сигналов — те, что связаны с продуктом, а не все подряд.
  5. События и аварии — лентой, с началом и концом, а не точками.

Разворачивать сюда всё содержимое каталога не нужно: панель, на которую никто не смотрит, стоит запросов к базе и внимания.

Как устроен сам каталог и почему без него подписи на графиках бессмысленны — в материале о карте сигналов PLC. Требования к данным для аналитики — в разборе, какие данные нужны для цифрового двойника.

Чеклист настройки

  1. Проверить базу до первого графика: дубликаты, длины массивов, NULL, соответствие каталога позициям.
  2. Развернуть Grafana в контейнере, настройки вынести в постоянный том.
  3. Соединить Grafana и ClickHouse общей внутренней сетью.
  4. Наружу отдавать только reverse proxy с HTTPS, внутренний порт не публиковать.
  5. Завести отдельного пользователя ClickHouse для чтения, администратора не использовать.
  6. Начать с пяти панелей о живости сбора, а не с визуализации всего каталога.
  7. Проверить, что подпись каждой панели соответствует сигналу, а не позиции в массиве.
  8. Зафиксировать, что дашборд читает данные, но ничего не пишет в контроллер.

Частые ошибки

Начать с графиков. Самая дорогая ошибка: неверные данные, показанные убедительно, живут в отчётах месяцами.

Пустить Grafana в базу под администратором. Учётка визуализации требует только чтения, и права на запись здесь — чистый риск без выгоды.

Хранить настройки внутри контейнера. Одно пересоздание контейнеров — и дашборды приходится собирать заново.

Публиковать порт Grafana напрямую. Реверс-прокси с сертификатом ставится один раз и снимает целый класс проблем.

Строить панель на каждый сигнал каталога. Дашборд, который нельзя охватить взглядом, перестают открывать.

Что делать дальше

Прежде чем рисовать первую панель, выполните один запрос: сравните число позиций в каталоге сигналов с длиной массива значений в случайной выборке за последние сутки. Если числа расходятся хотя бы на единицу, настройка мониторинга откладывается — сначала чинится соответствие каталога и данных, иначе каждый график будет подписан чужим именем.

Частые вопросы

Зачем связка ClickHouse и Grafana для мониторинга PLC?
ClickHouse хранит выборки с контроллера и быстро отдаёт срезы, Grafana превращает их в картину, читаемую за секунды. База здесь склад, дашборд — витрина. Поток сигналов в виде таблицы человек не читает: недельный сбор — это сотни миллионов значений, в которых глазами не найти ни провал опроса, ни рост задержки.
Что проверить в ClickHouse до первого графика?
Шесть вещей: число загруженных строк, дубликаты выборок, соответствие длины массива значений числу сигналов, неполные выборки, значения NULL и совпадение каталога сигналов с позициями в массиве. Последний пункт самый коварный: массив связан с каталогом позицией, а не именем, поэтому сместившийся каталог оставляет график красивым, но подписанным чужим именем.
Как правильно развернуть Grafana в Docker?
Grafana поднимается отдельным контейнером, а настройки и дашборды выносятся в постоянный Docker volume, чтобы контейнер можно было пересоздавать свободно. Grafana и ClickHouse объединяются общей внутренней сетью, наружу выставляется только Grafana через reverse proxy с HTTPS, внутренний порт в интернет не публикуется.
Под каким пользователем Grafana должна читать ClickHouse?
Под отдельным пользователем ClickHouse с минимально необходимыми правами на чтение, а не под администратором. Учётка входа в саму Grafana и учётка доступа к базе — разные вещи. Дашборд рано или поздно получат смежные службы, а вместе с ним и права того пользователя, под которым он ходит в базу; права на запись здесь не нужны никому.
Какие панели действительно нужны инженеру у линии?
Пять: живость сбора (выборки в единицу времени), длительность опроса, качество выборки (доля неполных и битых массивов), динамика ключевых сигналов, связанных с продуктом, и лента событий и аварий с началом и концом. Панель на каждый сигнал каталога строить не нужно: дашборд, который нельзя охватить взглядом, перестают открывать.