Экспортер метрик дешевых управляемых китайских свитчей

Экспортер метрик для дешёвых управляемых свитчей (веб-интерфейс → Prometheus/Grafana)

Как и многие в теме про управляемые свитчи для лаб, я постепенно обрастаю дешёвыми управляемыми свитчами для домашней лабы. У топовых моделей есть SNMP, и с мониторингом всё просто. А вот у большинства бюджетных моделей, которые часто называют “simple switch” или “web managed switch”, из инструментов мониторинга — только веб-морда. SNMP там либо нет вообще, либо он настолько урезан, что толку от него мало.

Мне хотелось видеть метрики по трафику и статусам портов в Grafana вместе с остальной инфраструктурой. Нашёл проект cheap-switch-exporter — идея простая и рабочая: логинимся в веб-интерфейс свитча, парсим HTML-страницу со статистикой портов, отдаём метрики в формате Prometheus. Никакого SNMP не надо.

Но у оригинального проекта было два ограничения, которые в лабе с несколькими свитчами быстро упираются в потолок:

  • работа только с одним устройством за раз;
  • парсер заточен под конкретный набор моделей и не понимает более новые.

Так как у меня этих свитчей несколько разных моделей, я форкнул проект и доработал под себя.

Ну и основной минус, с которым столкнулся я как и автор оригинального проекта (после чего забросил его, кмк) это то, что некоторые свитчи отдают счетчики портов в байтах, а некоторые в пакетах

Что изменилось в моей версии

  1. Поддержка нескольких устройств одновременно — можно опросить сразу весь парк свитчей одним экспортером, а не поднимать инстанс на каждый.
  2. Поддержка новых моделей, в частности SKS3200-8E2X.
  3. Комментирование портов — можно подписать порты (что к чему подключено), и это будет видно в метриках/дашборде.
  4. Исправлено распознавание столбцов таблицы — разные модели отдают разный набор и порядок колонок на странице статистики, парсер теперь это учитывает, а не был завязан на один конкретный layout.
  5. Исправлено вычисление больших чисел — на некоторых моделях счётчики трафика с длительным аптаймом переполняли парсинг/арифметику, теперь считается корректно.
  6. Добавлена сборка Docker-образа через GitHub Actions — не нужно собирать руками, образ публикуется автоматически.

Как это работает

Всё максимально просто, без магии:

  1. Экспортер логинится в веб-интерфейс свитча под обычной учёткой администратора.
  2. Парсит HTML-страницу со статистикой портов (трафик, статус линка и т.д.).
  3. Отдаёт полученные метрики в формате 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.
Да, вайбкодинга в лабе у меня стало больше.

3 лайка