Sổ tay kỹ thuật

Prometheus snmp_exporter – generator, if_mib và SNMPv3

how-to#prometheus#snmp#telemetry· cập nhật 2026-11-06

Dùng khi cần poll counter interface qua SNMP bằng snmp_exporter, tự build snmp.yml bằng generator và scrape bằng Prometheus.

Sửa trang này
Mục lục

Tóm tắt: snmp_exporter là một proxy: Prometheus gọi /snmp?target=<ip>&module=if_mib&auth=<tên>, exporter đi walk SNMP thiết bị rồi trả metric. File snmp.yml (danh sách OID + cách đặt label) không viết tay mà sinh từ generator.yml bằng generator. Từ v0.24 file tách thành hai khối auths (community/SNMPv3) và modules (OID cần walk). Với SNMPv2c public thì dùng luôn snmp.yml có sẵn trong release, không cần generator.

Luồng hoạt động

flowchart LR G["generator.yml + MIB"] -->|"generator generate"| Y[snmp.yml] Y --> E["snmp_exporter :9116"] P[Prometheus] -->|"GET /snmp?target=...&module=if_mib&auth=..."| E E -->|"SNMP GETBULK UDP 161"| R1["Router 198.51.100.11"] E -->|"SNMP GETBULK UDP 161"| R2["Router 198.51.100.12"] P --> GF[Grafana]

Cấu hình

Build generator và tải MIB

git clone https://github.com/prometheus/snmp_exporter.git
cd snmp_exporter/generator
make generator mibs          # build binary ./generator và tải bộ MIB chuẩn vào ./mibs

Cần gcc, make, unzip và thư viện libsnmp-dev (Debian/Ubuntu) vì generator dùng net-snmp để parse MIB. MIB riêng của hãng (Cisco, Juniper) thì chép thêm vào ./mibs.

generator.yml

generator/generator.yml
auths:
  public_v2:
    version: 2
    community: public
  netops_v3:
    version: 3
    username: prom-ro
    security_level: authPriv        # noAuthNoPriv | authNoPriv | authPriv
    auth_protocol: SHA256           # MD5 | SHA | SHA224 | SHA256 | SHA384 | SHA512
    password: "***"                 # điền khi build, không commit
    priv_protocol: AES              # DES | AES | AES192 | AES256 ...
    priv_password: "***"
 
modules:
  if_mib:
    walk: [sysUpTime, interfaces, ifXTable]
    max_repetitions: 25
    retries: 3
    timeout: 5s
    lookups:
      - source_indexes: [ifIndex]
        lookup: ifAlias
      - source_indexes: [ifIndex]
        lookup: ifName
    overrides:
      ifAlias:
        ignore: true                # đã thành label, bỏ metric riêng
      ifName:
        ignore: true
      ifType:
        type: EnumAsInfo
  • walk: tên object trong MIB hoặc OID dạng số. interfaces + ifXTable lấy cả counter 32-bit (ifInOctets) và 64-bit (ifHCInOctets).
  • lookups: thay index số ifIndex bằng label dễ đọc (ifName, ifAlias).
  • Counter 64-bit (ifHC*) chỉ có qua SNMPv2c/v3. Interface ≥ 1 Gbps thì luôn dùng ifHC*, counter 32-bit quay vòng chỉ sau khoảng 34 giây ở 1 Gbps.

Sinh snmp.yml và chạy exporter

./generator generate -m ./mibs -g generator.yml -o snmp.yml
./generator parse_errors -m ./mibs        # xem MIB nào parse lỗi
 
snmp_exporter --config.file=snmp.yml       # mặc định listen :9116
curl -s 'http://localhost:9116/snmp?target=198.51.100.11&module=if_mib&auth=netops_v3' | grep '^ifHCInOctets' | head

Trang http://localhost:9116/ có form để thử target/module/auth bằng trình duyệt. Cấu hình SNMPv3 phía router xem SNMPv3 an toàn.

scrape_config trong Prometheus

/etc/prometheus/prometheus.yml
scrape_configs:
  - job_name: snmp-if
    scrape_interval: 60s
    scrape_timeout: 50s             # phải lớn hơn timeout x retries của module
    metrics_path: /snmp
    params:
      module: [if_mib]
      auth: [netops_v3]
    static_configs:
      - targets: [198.51.100.11, 198.51.100.12]
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target          # ?target=<ip thiết bị>
      - source_labels: [__param_target]
        target_label: source                  # label thiết bị, khớp schema chung
      - target_label: __address__
        replacement: snmp-exporter.example.net:9116   # địa chỉ thật được scrape
    metric_relabel_configs:
      - source_labels: [ifName]
        target_label: name                    # label interface, khớp schema chung
      - source_labels: [__name__]
        regex: ifHCInOctets
        target_label: __name__
        replacement: interfaces_in_octets     # tuỳ chọn: dùng chung query với Telegraf
      - source_labels: [__name__]
        regex: ifHCOutOctets
        target_label: __name__
        replacement: interfaces_out_octets
 
  - job_name: snmp-exporter                   # metric của chính exporter
    static_configs:
      - targets: [snmp-exporter.example.net:9116]

Sau relabel, rate(interfaces_in_octets{source="198.51.100.11"}[5m]) * 8 dùng được như trong PromQL cheatsheet. Chi tiết relabel_configs xem Prometheus config cheatsheet.

promtool check config /etc/prometheus/prometheus.yml
curl -X POST localhost:9090/-/reload        # cần --web.enable-lifecycle

Lỗi thường gặp

Triệu chứng Nguyên nhân Cách xử lý
Unknown module 'if_mib' / Unknown auth Tên trong params không có trong snmp.yml đang load Kiểm tra lại tên, reload exporter (kill -HUP hoặc POST /-/reload)
Scrape context deadline exceeded scrape_timeout nhỏ hơn thời gian walk, thiết bị nhiều interface Tăng scrape_timeout, giảm walk, tăng max_repetitions
Request timeout (after N retries) Sai community/user, ACL SNMP trên router, firewall UDP 161 snmpwalk thử từ máy exporter với cùng credential
Có ifInOctets nhưng không có ifHCInOctets Đang dùng SNMPv1 version: 2 hoặc 3 trong auths
Không có label ifName Thiếu lookups, hoặc sửa generator.yml nhưng chưa generate lại Chạy lại generator generate, restart exporter
Generator báo Can't find ... in MIB MIB thiếu trong ./mibs hoặc thiếu MIB phụ thuộc Chép MIB vào thư mục, chạy parse_errors
Đồ thị rate có gai lớn Counter 32-bit quay vòng Dùng ifHCInOctets / ifHCOutOctets
Mọi target có cùng instance Thiếu relabel __param_target → label Thêm rule như mẫu trên

Tham khảo