Экспортер метрик для дешёвых управляемых свитчей (веб-интерфейс → Prometheus/Grafana)
Как и многие в теме про управляемые свитчи для лаб, я постепенно обрастаю дешёвыми управляемыми свитчами для домашней лабы. У топовых моделей есть SNMP, и с мониторингом всё просто. А вот у большинства бюджетных моделей, которые часто называют “simple switch” или “web managed switch”, из инструментов мониторинга — только веб-морда. SNMP там либо нет вообще, либо он настолько урезан, что толку от него мало.
Мне хотелось видеть метрики по трафику и статусам портов в Grafana вместе с остальной инфраструктурой. Нашёл проект cheap-switch-exporter — идея простая и рабочая: логинимся в веб-интерфейс свитча, парсим HTML-страницу со статистикой портов, отдаём метрики в формате Prometheus. Никакого SNMP не надо.
Но у оригинального проекта было два ограничения, которые в лабе с несколькими свитчами быстро упираются в потолок:
- работа только с одним устройством за раз;
- парсер заточен под конкретный набор моделей и не понимает более новые.
Так как у меня этих свитчей несколько разных моделей, я форкнул проект и доработал под себя.
Ну и основной минус, с которым столкнулся я как и автор оригинального проекта (после чего забросил его, кмк) это то, что некоторые свитчи отдают счетчики портов в байтах, а некоторые в пакетах
Что изменилось в моей версии
- Поддержка нескольких устройств одновременно — можно опросить сразу весь парк свитчей одним экспортером, а не поднимать инстанс на каждый.
- Поддержка новых моделей, в частности SKS3200-8E2X.
- Комментирование портов — можно подписать порты (что к чему подключено), и это будет видно в метриках/дашборде.
- Исправлено распознавание столбцов таблицы — разные модели отдают разный набор и порядок колонок на странице статистики, парсер теперь это учитывает, а не был завязан на один конкретный layout.
- Исправлено вычисление больших чисел — на некоторых моделях счётчики трафика с длительным аптаймом переполняли парсинг/арифметику, теперь считается корректно.
- Добавлена сборка Docker-образа через GitHub Actions — не нужно собирать руками, образ публикуется автоматически.
Как это работает
Всё максимально просто, без магии:
- Экспортер логинится в веб-интерфейс свитча под обычной учёткой администратора.
- Парсит HTML-страницу со статистикой портов (трафик, статус линка и т.д.).
- Отдаёт полученные метрики в формате Prometheus, дальше — Grafana как обычно.
Так это можно делать с любым количеством свитчей, у которых есть только веб-интерфейс, лишь бы формат страницы был распознан парсером.
Если у кого-то есть похожие “простые” свитчи с другим форматом веб-интерфейса — welcome с issue/PR в репозиторий, буду рад добавить поддержку.
Пример конфига
---
profiles:
- profile_1:
address: "192.168.1.1"
username: "admin"
password: "admin"
timeout_seconds: 5
poe: 0
comments:
Port 1: Port 1
Port 2: Port 2
Port 3: Port 3
Port 4: Port 4
Port 5: Port 5
Port 6: Core Switch
- profile_2:
address: "192.168.1.2"
username: "admin"
password: "admin"
timeout_seconds: 5
poll_rate_seconds: 30 # overrides settings.poll_rate_seconds for this profile only
poe: 1
comments:
Port 1: Port 1
Port 2: Port 2
Port 3: Port 3
Port 4: Port 4
- profile_3:
profile: v2 # selects the JSON-based dialect (e.g. SKS3200-8E2X); poe: 1 is not
address: "192.168.1.3" # supported and rejected at startup for profile: v2
username: "admin"
password: "admin"
comments:
Port 1: Uplink
settings:
poll_rate_seconds: 10 # default for profiles without their own poll_rate_seconds
timeout_seconds: 5 # default for profiles without their own timeout_seconds
и docker-compose
services:
exporter:
image: ghcr.io/krom/cheap-switch-exporter:1
ports:
- 8085:8080
environment:
- TZ:Europe/Moscow
restart: unless-stopped
volumes:
- ./config.yaml:/config.yaml
Пока в графане так накидал
Думаю, что с этим делать
P.S.
Да, вайбкодинга в лабе у меня стало больше.
