Главная Проекты Статьи 🔑 Генератор паролей ⚡ VLESS Конвертер Контакты
← Все статьи
Мониторинг

Мониторинг MikroTik в Grafana через SNMP

Обзор стека мониторинга

Для мониторинга 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 как источник данных

  1. Откройте http://<SERVER-IP>:3000, войдите (admin / StrongGrafanaPass)
  2. Connections → Data Sources → Add data source
  3. Выберите Prometheus
  4. URL: http://prometheus:9090
  5. Нажмите 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 при падении интерфейса:

  1. Alerting → Contact Points → Add
  2. Тип: Telegram
  3. Укажите Bot Token и Chat ID
  4. Перейдите на нужный график → Edit → Alert → Create alert rule
  5. Условие: 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 и убедитесь, что данные приходят

Ссылки