У свитча или ИБП обычно нет /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
