У свитча или ИБП обычно нет /metrics, зато почти всегда есть SNMP-агент. snmp_exporter превращает SNMP-опрос в тот же текстовый формат, что отдают остальные Prometheus-экспортеры, и дальше устройство встраивается в общий мониторинг как любой другой таргет.

Список OID для опроса экспортер сам не хранит — их генерируют из MIB-файлов утилитой generator, и результат (snmp.yml) потом кладут рядом с бинарником экспортера:

./generator generate -m /opt/mibs -g generator.yml -o snmp.yml

В generator.yml описывается, что именно обходить (walk) — можно указать как числовой OID, так и имя объекта через MIB:

modules:
  switch_if:
    walk:
      - 1.3.6.1.2.1.2          # IF-MIB::interfaces целиком
      - "SNMPv2-MIB::sysUpTime"
    max_repetitions: 25        # для старых/глючных агентов иногда приходится снижать

Отдельная особенность — сам экспортер не ходит за метриками сам по себе по расписанию, а ждёт HTTP-запрос с параметрами target и module, поэтому Prometheus опрашивает его через relabel_configs, подставляя реальный IP устройства как параметр, а не как адрес скрейпа:

scrape_configs:
  - job_name: 'snmp'
    static_configs:
      - targets: ["192.168.1.2", "ups1.local"]
    metrics_path: /snmp
    params:
      module: [switch_if]
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 127.0.0.1:9116   # адрес самого snmp_exporter

Без этого трюка в Prometheus все метрики со всех свитчей улетят под адресом самого экспортера, а не устройства, которое реально опрашивалось.

#prometheus #monitoring