Prometheus で SNMP 監視

Prometheus を使って Cisco ルータを SNMP 監視するための手順の備忘録です。

Prometheus / snmp-exporter / snmp-generator それぞれ Docker コンテナを使用します。

ディレクトリ構成

.
├── docker-compose.yml
├── prometheus
│   └── prometheus.yml
└── snmp-exporter
    ├── generator.yml
    ├── mibs
    │   ├── ACCOUNTING-CONTROL-MIB.my
    │   (省略)
    │   └── XGCP-MIB.my
    └── snmp.yml

prometheus..yml

scrape_configs:
    - job_name: 'snmp'
      static_configs:
        - targets:
            - 【Router IP Address】
      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: 【snmp-exporter IP Address】:9116

Prometheus と snmp-exporter を同じサーバで動かしているのに、 【snmp-exporter IP Address】 を localhost にすると動かなかった。

snmp-generator

prom/snmp-generator コンテナを使って snmp.yml を作成する。用意するものは generator.ymlmibs ディレクトリ。

https://github.com/prometheus/snmp_exporter/tree/master/generator

generator.yml

上記リンクを参考に generator.yml を作成する。

modules:
  cisco:                    # モジュール名(任意)
    walk:                    # 取得する OID リスト
      - sysName
      - sysUpTime
      - interfaces
    version: 2
    max_repetitions: 25
    retries: 3
    timeout: 5s
    auth:
      community: public

mibs

ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz から Cisco 用の MIBs を取得して、中身の my ファイルを mibs ディレクトリ配下に格納する。

generate

コンテナの generate コマンドを実行すると、snmp.yml が出力される。

$ cd snmp-exporter
$ docker run -it -v "${PWD}:/opt/" prom/snmp-generator generate
level=info ts=2020-08-18T20:59:39.702Z caller=net_snmp.go:142 msg="Loading MIBs" from=mibs
level=warn ts=2020-08-18T20:59:40.642Z caller=main.go:120 msg="NetSNMP reported parse error(s)" errors=510
level=warn ts=2020-08-18T20:59:41.025Z caller=tree.go:83 msg="Can't find augmenting node" augments=tokenRingMLStatsEntry node=tokenRingMLStats2Entry
level=warn ts=2020-08-18T20:59:41.025Z caller=tree.go:83 msg="Can't find augmenting node" augments=tokenRingPStatsEntry node=tokenRingPStats2Entry
level=warn ts=2020-08-18T20:59:41.028Z caller=tree.go:83 msg="Can't find augmenting node" augments=rptrPortEntry node=ciscoRptrPortEntry
level=info ts=2020-08-18T20:59:41.040Z caller=main.go:52 msg="Generating config for module" module=cisco
level=info ts=2020-08-18T20:59:41.116Z caller=main.go:67 msg="Generated metrics" module=cisco metrics=25
level=info ts=2020-08-18T20:59:41.118Z caller=main.go:92 msg="Config written" file=/opt/snmp.yml

TODO: parse error の確認

snmp-exporter

https://github.com/prometheus/snmp_exporter

$ docker run -d --name snmp-exporter \
             -p 9116:9116 \
             -v "/home/nnstt1/snmp-exporter/snmp.yml:/etc/snmp_exporter/snmp.yml" \
             prom/snmp-exporter