Мониторинг Mikrotik роутеров с помощью Prometheus

Для начала вообще пара слов о том, зачем мониторить роутеры. Роутер, как и любое другое устройство, имеет аппаратные ресурсы, которые могут закончиться. Например, браузер стал медленнее открывать страницы или видео стало медленнее загружаться. Это может быть как из-за провайдера, так и из-за роутера. Возможно, к роутеру подключено слишком много устройств, и он стал медленнее, или параллельно кто-то качает слишком много - всё это может быть причиной замедления.

Большинство роутеров позволяют посмотреть загруженность ЦПУ или памяти прямо в админке. Но это лишь статичная информация, которая может и не дать полной картины происходящего. Гораздо удобнее смотреть изменение различных показателей во времени. Например, ЦПУ загружен на 80% - это хорошо и плохо? Если на графике видно, что загрузка ЦПУ совпадает с уменьшением скорости скачивания, то да, дело в ЦПУ. А если 80% загрузка держится последние несколько дней или недель, то вряд ли она связана со скоростью скачивания. Возможно, что-то ещё могло повлиять.

Общая схема

В качестве роутера я использовал Mikrotik waP R. Он позволяет использовать SIM карту, чтобы подключиться к сотовой сети, и раздавать Wi-Fi.

mikrotik_wap_r

Общая схема мониторинга выглядит следующим образом:

Mikrotik

Prometheus не может напрямую читать метрики из Mikrotik. Вместо этого он обращается в специальный exporter, который выдаёт метрики в нужном формате. Mikrotik позволяет экспортировать метрики с помощью протокола SNMP. По-умолчанию он не включён. Его можно включить следующей командой:

[admin@MikroTik] /snmp
[admin@MikroTik] /snmp>  set enabled yes

SNMP-exporter

SNMP-exporter нужен для того, чтобы преобразовать метрики из SNMP формата в специальный формат, который понимает Prometheus. Устанавливается он достаточно просто:

wget https://github.com/prometheus/snmp_exporter/releases/download/v0.20.0/snmp_exporter-0.20.0.linux-armv7.tar.gz
tar xzf snmp_exporter-0.20.0.linux-armv7.tar.gz

Следующим шагом будет создание systemd сервиса, который бы автоматически стартовал на старте. Для этого нужно создать следующий файл:

sudo vi /etc/systemd/system/snmp_exporter.service

Файл:

[Unit]
Description=SNMP Exporter
After=network-online.target

[Service]
User=pi
Restart=on-failure
ExecStart=/usr/local/bin/snmp_exporter --config.file='<path to>/snmp_exporter-0.20.0.linux-armv7/snmp.yml'

[Install]
WantedBy=multi-user.target

Нужно только внимательно указать путь к snmp.yml файлу. Этот файл содержит маппинг SNMP объектов на метрики Prometheus для разных типов устройств. Mikrotik уже есть в этом файле, так что можно использовать его как-есть.

Дальше необходимо скопировать snmp_exporter:

sudo cp ./snmp_exporter-0.20.0.linux-armv7/snmp_exporter /usr/local/bin/snmp_exporter

После этого стартовать сервис:

sudo systemctl enable snmp_exporter
sudo systemctl start snmp_exporter

Проверить статус сервиса можно командой:

sudo systemctl status snmp_exporter

Если сервис стартовал успешно, то вывод будет следующий:

Prometheus

Все метрики будут сохраняться в Prometheus. Prometheus - это специальная база данных для хранения метрик. Его можно запустить локально, либо в облаке.

Я не буду подробно описывать как настроить и стартовать Prometheus. Есть достаточно полная инструкция как это сделать.

Сейчас же достаточно настроить подключение к exporter. Это делается через основной конфиг prometheus.yaml:

  - job_name: mikrotik
    static_configs:
      - targets:
        - 192.168.1.1  # SNMP device.
    metrics_path: /snmp
    params:
      module: [mikrotik]
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: raspberrypi.local:9116

Grafana

Можно воспользоваться готовыми дашбордами и сразу импортировать их в Grafana.

Однако, каждое устройство немного отличается друг от друга и большинство дашбордов ничего не покажет. Для Mikrotik waP R я выбрал самые важные параметры:

  • Uptime - sysUpTime{instance='$instance'}/100
  • Load CPU - avg(hrProcessorLoad{instance='$instance'})
  • Load RAM - (hrStorageUsed{hrStorageIndex='65536',instance='$instance'} * 100 )/(hrStorageSize{hrStorageIndex='65536',instance='$instance'})
  • Load system disk - (hrStorageUsed{hrStorageIndex='131072',instance='$instance'} * 100 )/(hrStorageSize{hrStorageIndex='131072',instance='$instance'})
  • In/Out bit/sec - irate(ifHCInOctets{job='mikrotik',ifName=~'$Interface',instance='$instance'}[20s])*8
  • RSRP (Reference Signal Received Power) уровень LTE сигнала - mtxrLTEModemSignalRSRP

После чего добавил панели:

Для того чтобы добавить другие метрики, нужно сначала найти их oid (идентификатор в SNMP):

[admin@MikroTik] /interface lte print oid

После этого необходимо найти oid в snmp.yaml:

pi@rasp-buster:~ $ grep 1.3.6.1.4.1.14988.1.1.16.1.1.4 snmp.yml -B 1
  - name: mtxrLTEModemSignalRSRP
    oid: 1.3.6.1.4.1.14988.1.1.16.1.1.4

Метрика с именем mtxrLTEModemSignalRSRP должна быть доступна в Prometheus.