Настраиваем дашборд Grafana для точек доступа Keenetic
Мы уже рассматривали процесс настройки мониторинга Zabbix для Keenetic, и я говорил, что это обязательно надо делать даже на небольших объектах для того, чтобы заранее предотвращать какие-то инциденты или просто видеть, какие события происходят в вашей сети на единой карте с единым потоком событий для всех устройств, включая NAS-ы, серверы, коммутаторы и рабочие компьютеры. Но помимо мониторинга статуса и событий, имеет смысл интегрировать Keenetic в систему дашбордов с эффектными графиками, интерактивными диаграммами и графическим представлением событий.
Зачем нужны дашборды, когда есть Keenetic RNN и Zabbix?
Да, у Keenetic есть собственный сервис отражения статуса устройств, и его тоже не надо сбрасывать со счетов, но во-первых, он достаточно ограничен по функционалу, а во-вторых он показывает только сами кинетики, и не даёт информации по другим узлам сети, таким как компьютеры, принтеры и т.д. В свою очередь, Zabbix сформирует вам ленту событий и выведет её на интерактивную карту, чтобы вы могли ориентироваться, в каком сегменте сети у вас узел требует внимания. Ни тот, ни другой сервис не позволят вам представить информацию в том виде, в котором вы бы хотели, использовать необычные диаграммы и графики, встраивать их в презентации и на сайты, сводить разнородную информацию (статус, числа, фото, строки) на одной странице, чтобы было как-то так:
Дашборд – это современный подход к мониторингу для людей, имеющих визуальное/клиповое мышление (и не только), дающий следующие преимущества:
- Вы можете на одни и те же графики выводить информацию с разных источников и даже разного класса.
- Все эти графики – интерактивные, по которым можно водить и кликать мышкой.
- Графики дашбордов можно просто экспортировать в HTML виде и встроить на сайт или в приложение, чтобы видеть снапшот данных на определённое время или автоматически обновляемые в реальном времени. Удобство, гибкость настройки и врождённая красота – вот что такое современные дашборды.
Решений для построения дашбордов много, но широко используются всего два: это Kibana для Elastic и Grafana, которую мы и будем настраивать. Сама по себе «графана» – это просто платформа для построения графиков и диаграмм, которой для работы нужны программы, собирающие данные и базы, в которых эти данные хранятся. Вот как происходит обмен данными между Keenetic и Grafana:
- Где-то в сети или даже на самих кинетиках запускаются агенты сбора метрик, так называемые экспортёры.
- Эти агенты передают данные в специализированные базы данных типа Prometheus, InfluxDB, Graylog или другие.
- Где-то в сети запущен сервис Grafana, который использует эти базы данных для визуализации и построения дашбордов.
У Keenetic есть поддержка сторонних пакетов OPKG, что позволяет устанавливать даже базы данных непосредственно на роутер, но это не самый лучший вариант, потому что и InfluxDB, и Prometheus достаточно прожорливы в том, что касается памяти и ресурсов CPU, поэтому лучше всего выделить под мониторинг отдельную виртуалку на корпоративном сервере или VPS. Благодаря Docker, весь стэк мониторинга можно запустить за 15 минут, и мы будем считать, что у вас уже всё настроено и работает, осталось только добавить Keenetic.
Какие есть способы брать данные из Keenetic?
Получать данные из Keenetic можно тремя способами:
- Брать метрики через SNMP – этот метод подробно рассмотрен в примере настройки Zabbix для Keenetic в нашей статье. Это наиболее универсальный способ, но связанный с лишней морокой – вам придётся вручную вводить OID-ы для метрик, и имейте ввиду, что через SNMP кинетики выводят не всю системную информацию.
- Установить на Keenetic экспортер данных через OPKG (подробно рассматривается на форуме). И хотя этот метод даст наиболее полный набор данных, он больше подходит когда у вас одно устройство – роутер, потому что для установки пакетов через OPKG придётся подключать к кинетику флешку, устанавливать и настраивать экспортер через командную строку, что в общем-то, неудобно.
- Брать данные через API по web-подключению. Это самый простой способ: агент для сбора данных через API может быть запущен как где-то в облаке, так и на сервере в сети или даже на самом кинетике (через OPKG). Мы будем использовать именно этот метод, запуская стек мониторинга в виртуалке.
Готовый экспортер данных для Keenetic через HTTP есть на Github, нам нужно лишь клонировать репозиторий и скомпилировать Docker контейнер (в моём примере с тегами keenetic-monitoring:1). После того, как контейнер будет готов, можно использовать Docker Compose для запуска приложений, и мой экспортер метрик из Keenetic выглядит так:
version: '3.7'
services:
keenetic-grafana-monitoring:
image: keenetic-monitoring:1
container_name: keenetic-grafana-monitoring
environment:
- TZ=Europe/Moscow
volumes:
- /monitoring/keenetic/config.ini:/home/config/config.ini:ro
- /monitoring/keenetic/metrics.json:/home/config/metrics.json:ro
restart: always
Из хоста, на котором будет запущен экспортер, я пробрасываю в новый контейнер два файла, взятые из того же репозитория – metrics.json с описанием метрик, собираемых с кинетиков и config.ini, содержащий IP-адрес, логин/пароль кинетика и название базы данных в InfluxDB.
Вот содержимое config.ini:
[influx2]
# URL базы данных
url=http://192.168.1.149:8086
# Идентификатор в базе данных
org=keenetic
# Токен для подключения к базе данных
token=MaSRn5c2TJWgxdpx
timeout=6000
# Название корзины в базе данных
bucket=keenetic
[keenetic]
# Адрес Keenetic, с которого собираем метрики
admin_endpoint=http://192.168.1.11:80
skip_auth=false
# Логин/пароль созданного в Keenetic пользователя для сбора данных
login=monitor
password=12345
[collector]
interval_sec=30
И вот здесь есть особенность: скрипт скрапера написан для одного устройства семейства Keenetic. Хотите мониторить 10 устройств – запускайте 10 сборщиков данных в контейнерах, и пусть экспортируют в одну общую базу данных. Но с Docker это не проблема: один контейнер скрапера потребляет всего 27 Мб памяти, и я могу их запустить хоть сотню, используя всё тот же скомпилированный ранее образ контейнера, но как обычно, начну с одного устройства.
Для того, чтобы экспортёр мог подключиться к Keenetic, нам надо в web-интерфейсе точки доступа создать отдельного пользователя с правом доступа к WebUI, но без права изменения конфигурации. В моём варианте этот пользователь имеет логин monitoring и пароль 12345, и ещё я хотел бы обратить внимание, что имеет смысл менять "hostname" или "имя системы" в настройках кинетиков на какое-то осмысленное или хотя бы убедиться, что устанавливаемые по умолчанию номера вида "Keenetic-XXXX" не повторяются.
Экспортёр отправляет данные в базу InfluxDB версии 2.1, которая сама по себе имеет приятный Web-интерфейс с поиском данных и выводом графиков.
Кому-то его может быть и достаточно, чтобы не заморачиваться с "графаной", но как по мне, так он годится только для построения запросов на языке, которые мы можем использовать в информационных панелях Grafana. Давайте посмотрим, какие полезные данные он вытаскивает из Keenetic Voyager Pro.
- CPULoad – загрузка процессора в %
- Processes (пригодится для роутеров, на которых запущены разные сервисы, такие как NAS, Proxy и прочие программы через OPKG).
- Memfree – свободная память в килобайтах
- Swaptotal – объём файла подкачки, который в идеале должен всегда равняться нулю
- Uptime – время работы в секундах после последней перезагрузки устройства.
- Internet Status: данные доступности вышестоящих шлюзов и DNS серверов
- Interface stat: суммарный трафик и текущая скорость по выбранным интерфейсам. Очень удобно то, что данные можно снимать с разных интерфейсов – отдельно для радиоточек 2.5 ГГц и 5 ГГц и отдельно для проводных подключений.
- Interface (состояние сетевого интерфейса). Здесь есть очень полезная метрика температуры радиомодуля.
Для работы с Grafana, нам нужно подключить InfluxDB в качестве источника (в веб-интерфейсе графаны проходим по ссылкам home - connections - add new connection - InfluxDB), после чего вводим IP адрес с номером порта и обязательно добавляем дополнительный HTTP заголовок с полем Authorization и значением Token MaSRn5c2TJWgxdpx (этот токен указан в config.ini). В полях Organization и Data Bucket прописываем keenetic.
Выбрав нужные метрики, мы можем создать первый дашборд в Grafana, и здесь ваши возможности ограничиваются лишь вашей фантазией. В том репозитории на Github, ссылку на который я давал выше, есть шаблон для Grafana, который использует язык InfluxQL для запросов к базе InfluxDB, и он у меня не заработал – база отвечала только на запросы на языке Flux.
Пришлось самостоятельно перерисовывать дашборд, используя простую тактику: открываем Web-интерфейс InfluxDB, кликаем мышкой на нужные данные, строим там график, и копируем скрипт на InfluxDB в графану.
Я предпочитаю воспринимать информацию о трафике и загрузке ресурсов в виде графиков на временной шкале, а такие показатели как температура – надписью поверх фотографии кинетика (для этой цели используем панель типа Canvas). В итоге получается такой милый дашборд:
Обратите внимание, что для кинетиков, работающих в режиме маршрутизатора, информации может быть больше.
Подключаем логи
Съём логов с кинетиков будет производиться по следующей схеме:
- 1. Keenetic отправляет журналы на rsyslog сервер в сети с адресом 192.168.1.17
- 2. Сервер rsyslog транслирует все поступившие к нему журналы на программу-экспортер данных Promtail, запущенную на сервере с адресом 192.168.1.25. Для этого в конфиг.файле rsyslog добавляем следующее:
# Forward everything
*.* action(type="omfwd"
protocol="tcp" target="192.168.1.25" port="1514"
Template="RSYSLOG_SyslogProtocol23Format"
TCP_Framing="octet-counted" KeepAlive="on"
action.resumeRetryCount="-1"
queue.type="linkedlist" queue.size="50000")
- 3. Promtail отправляет журналы на сервер Loki, запущенный на том же IP адресе 192.168.1.25, для чего в его конфигурационном файле прописываем адрес Loki следуя данной инструкции.
# Адрес Loki сервера
clients:
- url: http://loki:3100/loki/api/v1/push
scrape configs:
- job_name: syslog
syslog:
listen_address: 0.0.0.0:1514
idle_timeout: 60s
label_structured_data: yes
labels:
job: "syslog"
relabel_configs:
- source_labels: ['__syslog_message_hostname']
target_label: 'host'
- 4. В Grafana добавляем сервер Loki как источник для построения дашбордов для вывода на экран по этой инструкции.
Есть разные способы очистки логов от ненужной информации: это можно делать и на сервере rsyslog, и на promtail и в самом веб-интерфейсе Grafana выбирать только те записи, что нас интересуют с использованием регулярных выражений. Сервер Loki имеет достаточно хороший компактор данных, а кинетики в свою очередь – не имеют разделения логов по серьёзности сообщений, поэтому проще журналы с Keenetic вообще не чистить, а хранить в полном виде. Обработку и вычленение событий мы всегда сможем возложить на сам дашборд средствами Grafana.
Для добавления общего лога я использую две информационных панели: содержимое журнала и частота внесения записей в журнал в виде ломаной прямой. Как только происходит какое-то необычное событие в сети, журнал начинает интенсивно заполняться новыми записями, на втором графике я вижу всплеск активности и в общем потоке логов могу выставить нужный временной диапазон, чтобы просмотреть все события.
Используя конструктор «содержит/не содержит» можно достаточно легко выйти на нужные вам записи для одного или нескольких хостов, например если нам нужно выводить на экран логи только по беспроводным клиентам, указываем фильтр "Line Contains" и значение STA. Для небольшого объёма логов такой подход оправдан, потому что неочищенные журналы будут у вас всё так же под рукой, и по ним можно будет пробежаться в интерфейсе Grafana - Explore - Loki, а вот перед глазами будут только записи по нужной тематике, хотя конечно "лучшие практики" рекомендуют очищать журналы на входе.
В итоге, для одного Keenetic Voyager Pro у меня получился вот такой дашборд:
Я загрузил его в репозиторий дашбордов Grafana, чтобы вы могли просто импортировать его в свою систему и использовать по своему желанию. Если по каким-то причинам ссылка не работает, вот готовый json файл.
Интегрируем показания Keenetic в существующие дашборды
Один из плюсов Grafana в том, что мы можем интегрировать в дашборд информацию с разных источников, например поместить метрики кинетиков рядом с показателями сервера, или виртуальных машин или с погодой или хоть с курсом доллара. Последнее может быть полезным, если вы хотите, например, нарисовать общую диаграмму состояния объекта, которая будет висеть на отдельном 60-дюймовом экране на стене, под потолком и автоматически обновляться.
Есть и другая ситуация, когда например, доступ к мониторингу закрыт из интернета, а нужно срочно передать сетевому инженеру график, например, о загрузке процессора точки доступа. Здесь нам на помощь приходит встроенная в графану связь с облаком raintank.io. Просто выбираем нужную панель, жмём кнопку "share" и выбираем режим "snapshot" с установкой автоматического времени удаления.
Получив ссылку и вставив в браузер, инженер, да и любой другой пользователь получает у себя вашу информационную панель даже если у вас мониторинг запущен локально и закрыт из Интернета. Увидел что нужно, сказал вам "ОК", и вы можете удалить этот снапшот из свободного доступа.
Разумеется, по этому графику тоже можно водить мышкой, чтобы видеть мгновенные значения. Если нужно встроить график в web-приложение, или просто на сайт, вы можете экспортировать его в виде iframe и подключить через вашу CMS в нужном месте, естественно он будет обновляться при каждой загрузке странице. Так что если хотите поделиться с миром, какая у вас сейчас скорость Wi-Fi на объекте - нет лучше способа это сделать.
Настраиваем алерты
Grafana позволяет настраивать алерты как по показаниям метрик, например «загрузка CPU выше 90%», так и по числу записей в логах за определённый промежуток времени, например если слово «error» встречается чаще 10 раз за 10 минут. Каждое событие нужно настраивать вручную, что с одной стороны – очень трудоёмко, но с другой стороны позволяет строить сложные конструкции, например «сумма трафика по радио 2.4 ГГц и 5 ГГц превышает 900 Мбит/с на протяжении 15 минут».
В качестве средства уведомления поддерживаются E-Mail, Telegram, Discord, Google Chat и другие платформы, в том числе REST Proxy от Kafka.
Напоследок
Настройка дашбордов в Grafana – это куда более трудоёмкий процесс, чем интеграция Keenetic в Zabbix, но как говорится, красота требует жертв. В современных кинетиках установлены очень мощные процессоры и избыточный объём ОЗУ, так что разработчику никто не мешает прикрутить в KeenOS родной Prometheus Exporter или Telegraf для упрощения снятия метрик в базы данных класса time-series без использования opkg, флешек и сторонних кодов с GitHub. Я очень надеюсь, что когда-нибудь это будет сделано, и появятся хорошие шаблоны для Grafana, так чтобы даже начинающий сисадмин мог легко развернуть средство мониторинга в современном HTML5-стиле.
Михаил Дегтярёв (aka LIKE OFF)
28/11.2023