Обзор стека мониторинга
Для мониторинга MikroTik используется связка из трёх компонентов:
- SNMP Exporter — опрашивает роутер по SNMP и конвертирует метрики в формат Prometheus
- Prometheus — собирает и хранит метрики по расписанию
- Grafana — визуализирует данные в виде графиков и дашбордов
Все три сервиса запускаются в Docker Compose на одном сервере. MikroTik никаких агентов не требует — только включённый SNMP.
Что можно мониторить
- Загрузка CPU и температура процессора
- Использование оперативной памяти
- Трафик по каждому интерфейсу (RX/TX, пакеты, ошибки)
- Uptime роутера
- Состояние интерфейсов (up/down)
- Использование диска (flash)
- Очереди и QoS-статистика
Шаг 1 — Включить SNMP на MikroTik
/snmp/set enabled=yes contact="admin@example.com" location="Home"
/snmp/community/set [find name=public] addresses=192.168.1.100/32
/snmp/community/set [find name=public] read-access=yes write-access=no
Замените 192.168.1.100 на IP сервера с Prometheus. Ограничение по IP обязательно — SNMP v2c не имеет аутентификации.
Проверьте, что SNMP отвечает:
snmpwalk -v2c -c public 192.168.1.1 sysDescr
Шаг 2 — Структура проекта
mkdir -p /opt/monitoring/{prometheus,grafana,snmp-exporter}
cd /opt/monitoring
Шаг 3 — Конфигурация SNMP Exporter
Скачайте готовый конфиг для MikroTik (содержит OID-маппинги для RouterOS):
curl -Lo /opt/monitoring/snmp-exporter/snmp.yml https://raw.githubusercontent.com/prometheus/snmp_exporter/main/generator/mibs/snmp.yml
Или используйте минимальный конфиг для MikroTik:
# /opt/monitoring/snmp-exporter/snmp.yml
mikrotik:
walk:
- sysUpTime
- interfaces
- ifXTable
- hrStorageTable
- hrProcessorLoad
metrics:
- name: sysUpTime
oid: 1.3.6.1.2.1.1.3.0
type: gauge
help: System uptime in hundredths of a second
- name: ifHCInOctets
oid: 1.3.6.1.2.1.31.1.1.1.6
type: counter
help: Incoming bytes per interface
indexes:
- labelname: ifIndex
type: gauge
lookups:
- labels: [ifIndex]
labelname: ifName
oid: 1.3.6.1.2.1.31.1.1.1.1
type: DisplayString
- name: ifHCOutOctets
oid: 1.3.6.1.2.1.31.1.1.1.10
type: counter
help: Outgoing bytes per interface
indexes:
- labelname: ifIndex
type: gauge
lookups:
- labels: [ifIndex]
labelname: ifName
oid: 1.3.6.1.2.1.31.1.1.1.1
type: DisplayString
- name: hrProcessorLoad
oid: 1.3.6.1.2.1.25.3.3.1.2
type: gauge
help: CPU load percentage
indexes:
- labelname: hrDeviceIndex
type: gauge
Шаг 4 — Конфигурация Prometheus
# /opt/monitoring/prometheus/prometheus.yml
global:
scrape_interval: 60s
evaluation_interval: 60s
scrape_configs:
- job_name: 'mikrotik'
static_configs:
- targets:
- 192.168.1.1 # IP роутера
metrics_path: /snmp
params:
module: [mikrotik]
community: [public]
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: snmp-exporter:9116
Шаг 5 — Docker Compose
# /opt/monitoring/docker-compose.yml
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
restart: unless-stopped
ports:
- "9090:9090"
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.retention.time=30d'
snmp-exporter:
image: prom/snmp-exporter:latest
container_name: snmp-exporter
restart: unless-stopped
ports:
- "9116:9116"
volumes:
- ./snmp-exporter/snmp.yml:/etc/snmp_exporter/snmp.yml
grafana:
image: grafana/grafana:latest
container_name: grafana
restart: unless-stopped
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=StrongGrafanaPass
- GF_USERS_ALLOW_SIGN_UP=false
- TZ=Europe/Moscow
volumes:
prometheus_data:
grafana_data:
Шаг 6 — Запуск
cd /opt/monitoring
docker compose up -d
docker compose ps
Проверьте, что SNMP Exporter отвечает на запросы:
curl "http://localhost:9116/snmp?target=192.168.1.1&module=mikrotik&community=public" | head -30
Проверьте Prometheus — откройте в браузере:
http://<SERVER-IP>:9090/targets
Статус mikrotik должен быть UP.
Шаг 7 — Настройка Grafana
7.1 Добавить Prometheus как источник данных
- Откройте
http://<SERVER-IP>:3000, войдите (admin / StrongGrafanaPass) - Connections → Data Sources → Add data source
- Выберите Prometheus
- URL:
http://prometheus:9090 - Нажмите Save & Test
7.2 Импортировать готовый дашборд
Перейдите в Dashboards → Import и вставьте ID дашборда с Grafana.com:
- 14420 — MikroTik SNMP (трафик по интерфейсам, CPU, память)
- 11304 — SNMP Stats (универсальный)
В поле Prometheus выберите созданный источник данных и нажмите Import.
Шаг 8 — Ключевые метрики и запросы PromQL
Трафик на WAN-интерфейсе (байт/с)
rate(ifHCInOctets{instance="192.168.1.1", ifName="ether1"}[5m]) * 8
Загрузка CPU (%)
avg(hrProcessorLoad{instance="192.168.1.1"})
Uptime в часах
sysUpTime{instance="192.168.1.1"} / 100 / 3600
Состояние интерфейсов
ifOperStatus{instance="192.168.1.1"}
Шаг 9 — Алерты в Grafana
Настройте уведомление в Telegram при падении интерфейса:
- Alerting → Contact Points → Add
- Тип: Telegram
- Укажите Bot Token и Chat ID
- Перейдите на нужный график → Edit → Alert → Create alert rule
- Условие:
ifOperStatus == 2(2 = down)
Мониторинг нескольких роутеров
Добавьте дополнительные роутеры в prometheus.yml:
scrape_configs:
- job_name: 'mikrotik'
static_configs:
- targets:
- 192.168.1.1 # Main router
- 192.168.10.1 # Office
- 192.168.20.1 # Remote site
metrics_path: /snmp
params:
module: [mikrotik]
community: [public]
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: snmp-exporter:9116
docker compose restart prometheus
Обновление компонентов
cd /opt/monitoring
docker compose pull
docker compose up -d
Устранение неполадок
Target DOWN в Prometheus
- Проверьте доступность SNMP:
snmpwalk -v2c -c public 192.168.1.1 sysDescr - Убедитесь, что IP сервера разрешён в SNMP community:
/snmp/community/print - Проверьте firewall MikroTik:
/ip/firewall/filter/print— порт UDP 161
Метрики есть, но данные не обновляются
docker logs prometheus --tail 50
# Проверьте scrape interval — MikroTik может не успевать при интервале < 30s
Grafana не видит данные
- Убедитесь, что URL источника данных:
http://prometheus:9090(имя сервиса в compose), а не localhost - Проверьте Explore — введите простой запрос
upи убедитесь, что данные приходят