Cài đặt SNMP Exporter (Prometheus) để giám sát các thiết bị mạng

Cần có kiến thức cơ bản về docker như image, container docker-compose, volumes, port, service,... và nắm được file mib, snmp, lệnh linux căn bản

OS: Centos 8

1. Tổng quan 

Các thiết bị mạng sẽ bắn ra các gói tin snmp.

Prometheus Server sử dụng Snmp Exporter để thu thập metrics qua các gói tin snmp nhận được, sau đó đẩy qua Grafana để hiển thị.

Network Device => SNMP Exporter => Prometheus Server => Grafana

Snmp Exporter là mã nguồn mở, dùng để cung cấp các gói SNMP theo định dạng Prometheus Server có thể hiểu được. SNMP Exporter sử dụng file snmp.yml để làm việc. Theo như SNMP Exporter thì không nên tạo hay chỉnh sửa file này bằng tay, mà phải dùng SNMP Exporter Generator để xuất ra. Để sử dụng SNMP Exporter Generator thì cần phải định nghĩa file generator.yml.

2. SNMP Generator

Pull image

docker pull snmp-generator 

Tạo một thư mục nào đó (trong ví dụ này là /etc/snmp_exporter), rồi tạo file generator.yml và 1 thư mục mibs. Thư mục mibs này sẽ chứa các file mib để SNMP Generator sử dụng.

Điền nội dung vào file generator.yml. Ví dụ dưới đây sử dụng snmp version 2, cho thiết bị Cisco. Phần Community phải để ý chỉnh sửa.

modules:
########### Cisco. Module name là cisco
  cisco: 
#   walk: [sysUpTime, interfaces, ifXTable]
   walk:
   - 1.3.6.1.2.1.2.2.1.1
   - 1.3.6.1.2.1.2.2.1.2
   - 1.3.6.1.2.1.2.2.1.10
   - 1.3.6.1.2.1.2.2.1.13
   - 1.3.6.1.2.1.2.2.1.14
   - 1.3.6.1.2.1.2.2.1.16
   - 1.3.6.1.2.1.2.2.1.19
   - 1.3.6.1.2.1.2.2.1.2
   - 1.3.6.1.2.1.2.2.1.20
   - 1.3.6.1.2.1.2.2.1.5
   - 1.3.6.1.2.1.2.2.1.7
   - 1.3.6.1.2.1.2.2.1.8
   - 1.3.6.1.2.1.31.1.1.1.1
   - 1.3.6.1.2.1.31.1.1.1.18
   - 1.3.6.1.4.1.9.9.48.1.1.1.5
   - 1.3.6.1.4.1.9.9.48.1.1.1.6
   - 1.3.6.1.2.1.1.5
   lookups:
     - source_indexes: [ifIndex]
       lookup: ifAlias
     - source_indexes: [ifIndex]
       lookup: ifDescr
     - source_indexes: [ifIndex]
       # Use OID to avoid conflict with Netscaler NS-ROOT-MIB.
       lookup: 1.3.6.1.2.1.31.1.1.1.1 # ifName
   version: 2
   max_repetitions: 25
   retries: 3
   timeout: 10s
   auth:
    community: dhxd

3. File mibs

Có thể download như trong hướng dẫn trên github của SNMP Exporter, sau đó đưa vào thư mục mibs.

Nếu trong quá trình sinh file snmp.yml bị lỗi, thì có thể làm theo hướng dẫn Building và Running trên github của SNMP Exporter để lấy file mibs khác. (Người viết đã dính lỗi này, cụ thể là snmp generator cannot find oid to walk)

Building

Due to the dynamic dependency on NetSNMP, you must build the generator yourself.

# Debian-based distributions.
sudo apt-get install unzip build-essential libsnmp-dev p7zip-full # Debian-based distros
# Redhat-based distributions.
sudo yum install gcc gcc-g++ make net-snmp net-snmp-utils net-snmp-libs net-snmp-devel # RHEL-based distros

go get github.com/prometheus/snmp_exporter/generator
cd ${GOPATH-$HOME/go}/src/github.com/prometheus/snmp_exporter/generator
go build
make mibs

Running

export MIBDIRS=mibs
./generator generate

4, Sinh snmp.yml

docker run -ti -v "${PWD}:/opt/" snmp-generator generate

Nếu chạy thành công sẽ sinh ra file snmp.yml nằm ngang cấp với generator.yml và mibs.

5. prometheus.yml

Cập nhật file với nội dung bên dưới, để scrape được thông tin được SNMP Exporter xuất ra. Cần để ý điền các Target là IP của thiết bị mạng, và Replacement là IP của máy host SNMP Exporter

  - job_name: snmp
    scrape_interval: 5s
    static_configs:
      - targets:
          - "10.0.0.17"
    metrics_path: /snmp
    params:
      module: [cisco]
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 192.168.100.27:9116 # địa chỉ IP của máy host

6. docker-compse.yml

Copy file snmp.yml vừa sinh vào thư mục /etc/prometheus-docker/snmp_exporter. SNMP Exporter sẽ sử dụng file này. Sau đó cập nhật file docker-compse để start SNMP Exporter

  snmp-exporter:
    image: prom/snmp-exporter
    user: "0"
    volumes:
      - /etc/prometheus-docker/snmp_exporter:/etc/snmp_exporter
    ports:
      - 9116:9116

Sau đó chạy cả stack

docker-compose up -d

Chạy xong thì kiểm tra [IP]:9116, hoặc vào Prometheus Server > Target để kiểm tra. Nếu thành công thì sẽ hiển thị như bên dưới:

7. Grafana

Truy cập https://grafana.com/grafana/dashboards/ và tìm mã dashboard thích hợp.

Nếu không có dashboard nào ưng ý thì có thể tự tùy biến thêm. Trong ví dụ đã tìm được 2 mã 12492, 3159.

Các hình dưới đây minh họa cho việc import dashboard

8. Kết quả

Vào grafana xem dashboard vừa tạo