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 ./mibsCầ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
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: EnumAsInfowalk: tên object trong MIB hoặc OID dạng số.interfaces+ifXTablelấy cả counter 32-bit (ifInOctets) và 64-bit (ifHCInOctets).lookups: thay index sốifIndexbằng label dễ đọc (ifName,ifAlias).- Counter 64-bit (
ifHC*) chỉ có qua SNMPv2c/v3. Interface ≥ 1 Gbps thì luôn dùngifHC*, 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' | headTrang 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
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-lifecycleLỗ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 |