Prometheus(snmp_exporter)+Grafanaで監視

サーバー

今回は以下のような構成でGrafanaが動作するhost2からRouter1のメトリクス可視化をゴールとする。

HostはCentOS7を使っている。

Prometheus

Prometheusのインストールと設定

まずはPrometheusのインストールから行う。
基本的にPrometheusの公式ドキュメントの通りにインストールすればいい。

Download | Prometheus
An open-source monitoring system with a dimensional data model, flexible query language, efficient time series database ...

上のLinkからPrometheusをダウンロードしインストールを行う。
インストールするVersionに合わせて実行してください。
ここでは2.34をインストールしています。

Linkをコピー
# Download
wget https://github.com/prometheus/prometheus/releases/download/v2.34.0-rc.0/prometheus-2.34.0-rc.0.linux-amd64.tar.gz
# Checksumを計算
sha256sum prometheus-2.34.0-rc.0.linux-amd64.tar.gz
# 展開 展開先のPathは任意
tar xvfz prometheus-2.34.0-rc.0.linux-amd64.tar.gz -C /opt/
# デフォルトを確認
cd /opt/prometheus-2.34.0-rc.0.linux-amd64
cat prometheus.yml
# prometheus.yml
# my global config
global:
  scrape_interval: 15s 
  evaluation_interval: 15s 

alerting:
  alertmanagers:
    - static_configs:
        - targets:

rule_files:

scrape_configs: 
  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]

Prometheusの起動は以下のようなコマンドを実行する。

./prometheus --config.file=prometheus.yml

systemdで起動

起動コマンドをsystemdで実行できるようにserviceファイルを作成する。
※私の環境ではprometheusユーザーを作成して実行しています。

# vim /etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus Server

[Service]
Type=simple
Restart=always
User=prometheus
ExecStart=/opt/prometheus-2.34.0-rc.0.linux-amd64/prometheus --config.file=/opt/prometheus-2.34.0-rc.0.linux-amd64/prometheus.yml --storage.tsdb.path=/opt/prometheus-2.34.0-rc.0.linux-amd64/data
ExecReload=/bin/kill -HUP $MAINPID
TimeoutStopSec=20s
SendSIGKILL=no

[Install]
WantedBy=multi-user.target

systemdで起動

systemctl daemon-reload
systemctl start prometheus
systemctl enable prometheus

snmp_exporterのインストールと設定

SNMP ExporterはPrometheusでSNMPを取得するのに便利なExpoter

snmpwalk

SNMP Expoterはsnmpwalkを利用するため、まずはsnmpwalkをインストールする。

yum install net-snmp net-snmp-utils net-snmp-libs net-snmp-devel

snmpwalkのインストールが完了したら、実際に動作するか試してみる。
SNMPの設定がNW機器にまだの場合は後で動く確認しておくとよい。
※このコマンドは人それぞれなので環境に合わせる

snmpwalk -v 2c -c <community> <target_ip>

SNMPv2-MIB::sysDescr.0 = STRING: Cisco IOS Software, C800 Software (C800-UNIVERSALK9-M), Version 15.8(3)M7, RELEASE SOFTWARE (fc2)
Technical Support: http://www.cisco.com/techsupport
Copyright (c) 1986-2021 by Cisco Systems, Inc.
Compiled Wed 25-Aug-21 13:03 by mcpre
SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::enterprises.9.1.1858
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (68687134) 7 days, 22:47:51.34
SNMPv2-MIB::sysContact.0 = STRING:
SNMPv2-MIB::sysName.0 = STRING: RT1.C891FJ
SNMPv2-MIB::sysLocation.0 = STRING:
SNMPv2-MIB::sysServices.0 = INTEGER: 78

snmpwalkはデフォルトである程度のMIBは用意されている。上の図のSNMPv2-MIBなど
しかし、Ciscoなどのベンダー独自のMIBは含まれていない。
例えばCisco独自のcpmCPUTotal5minRevを取得してみる。

[izumin@test2 ~]$ snmpwalk -v 2c -c <community> <target_ip>  cpmCPUTotal5minRev
cpmCPUTotal5minRev: Unknown Object Identifier (Sub-id not found: (top) -> cpmCPUTotal5minRev)

上のようにOIDが不明となる。拡張MIBを用意する必要がある。

MIBの準備

snmpwalkはデフォルトで/usr/share/snmp/mibsからMIBを取得している。
このディレクトリに新たに追加しても動作するが、渡しの場合は別のディレクトリから読み込むように変更している。

mkdir /etc/snmp/ex-mib
vim /etc/snmp/snmp.conf

MIBDIRS /usr/share/snmp/mibs:/etc/snmp/ex-mib
mibs all

上のように追記することで/etc/snmp/ex-mibからもMIBを読み込んでくれるようになる。

ここからはcpmCPUTotal5minRevを取得できるようにする前提で確認していく。
必要なMIBのDownloadについては以下のサイトが活用できる。

//MIB Locator
https://cfnng.cisco.com/mibs

//Object Navigator
https://snmp.cloudapps.cisco.com/Support/SNMP/do/BrowseOID.do?local=en

Object Navigatorで検索してみるとCISCO-PROCESS-MIBが必要なことがわかる。

CISCO-PROCESS-MIBを確認すると必要なMIBの一覧が表示される。
必要なMIBをDownloadして/etc/snmp/ex-mibに格納する

必要なMIBを読み込むことができるようになるとsnmpwalkも成功する。

[izumin@test2 ex-mib]$ snmpwalk -v 2c -c <community> <target_ip> cpmCPUTotal5minRev
CISCO-PROCESS-MIB::cpmCPUTotal5minRev.1 = Gauge32: 3 percent

SNMP Exporter Config Generator

SNMP Exporterを利用するのに便利なConfig Generatorがある。
これを利用することで簡単に設定ファイルが生成できる。
SNMP ExporterはMIBファイルを活用してOIDに変換するが、その時$HOME/.snmp/mibsからMIBを読み込む。したがって、シンボリックリンクを生成しておく。

mkdir ~/.snmp
ln -s /etc/snmp/ex-mib /home/izumin/.snmp/mibs

次にGeneratorはgoを利用するためgoをインストールする。

wget https://go.dev/dl/go1.18.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.18.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin

# go version
go version go1.18 linux/amd64

Goのインストールが完了した。
Generatorをインストールする。generatorという実行ファイルがあればOK

go install github.com/prometheus/snmp_exporter/generator@latest
cd ${GOPATH-$HOME/go}/bin/

Generatorの準備ができたら、実行ファイルと同じ場所でgenerator.ymlを作成する。
この設定で収集したいObjectを指定する。
※これは一例なので必要なObject名を書く。

# generator.yml
modules:
  cisco:
    walk:
     - sysName
     - sysUpTime
     - cpmCPUTotal1minRev
     - cpmCPUTotal5minRev
     - ifIndex
     - ifDescr
     - ifName
     - ifAlias
     - ifAdminStatus
     - ifOperStatus
     - ifSpeed
     - ifHCOutOctets
     - ifHCInOctets
     - ifInDiscards
     - ifOutDiscards
     - ifInErrors
     - ifOutErrors
    version: 2
    retries: 3
    timeout: 3s
    lookups:
      - source_indexes: [ifIndex]
        lookup: ifDescr
    auth:
      community: hogehoge
// ファイル生成
./generator generate
// ディレクトリの中身確認
ls 
generator  generator.yml  snmp.yml

snmp.ymlが生成されている。
このsnmp.ymlはSNMP Exporterで利用する。

SNMP Exporterのインストールと設定

以下のリポジトリのマニュアル通りに進めれば良い。

GitHub - prometheus/snmp_exporter: SNMP Exporter for Prometheus
SNMP Exporter for Prometheus. Contribute to prometheus/snmp_exporter development by creating an account on GitHub.
wget https://github.com/prometheus/snmp_exporter/releases/download/v0.20.0/snmp_exporter-0.20.0.linux-amd64.tar.gz
tar xvzf snmp_exporter-0.20.0.linux-amd64.tar.gz -C /opt/
cd /opt/snmp_exporter-0.20.0.linux-amd64

SNMP Exporterはsnmp.ymlから設定を読み込むのでsnmp.ymlを持ってくる。

mv snmp.yml snmp.yml.bak
mv ~/go/bin/snmp.yml ./

SNMP Exporterを実行する。

./snmp_exporter

systemdで実行する場合はPrometheus同様に作成する。

# vim /etc/systemd/system/snmp-exporter.service
[Unit]
Description=SNMP Exporter for Prometheus

[Service]
Type=simple
Restart=always
User=prometheus
ExecStart=/opt/snmp_exporter-0.20.0.linux-amd64/snmp_exporter --config.file=/opt/snmp_exporter-0.20.0.linux-amd64/snmp.yml
ExecReload=/bin/kill -HUP $MAINPID
TimeoutStopSec=20s
SendSIGKILL=no

[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable snmp-exporter
systemctl start snmp-exporter

ここまででインストールが完了。
動作を確認する。SNMP ExporterはPort 9116で動作する。
ブラウザからアクセスしてみると、以下のようなページが現れる。
TargetはSNMP先、Moduleはgenerator.ymlで設定した値。上の例ではcisco

Prometheusの設定編集

Prometheus.ymlを修正する。
targetsの中に取得したいRouterのIPを記述。
moduleはgenerator.ymlの設定値。その他は下記のとおりに入れる。

scrape_configs:
  - job_name: 'snmp'
    static_configs:
      - targets:
        - 192.168.0.1
        - 192.168.0.2
    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: localhost:9116
systemctl restart prometheus

Grafana

Grafanaの設定

Grafanaのインストールは割愛。
Data sourceとしてPrometheusを設定し、PromQLで値を抽出する。

問題なければ正常に値が取得できる。

Cisco

CiscoのSNMP設定

CiscoにはSNMPの設定を入れておく。
各自の環境に合わせて作成します。

snmp-server community hogehoge RO MY_NETWORK
ip access-list standard MY_NETWORK
 permit 192.168.0.0 0.0.0.255
 permit 192.168.1.0 0.0.0.255

動作確認

とりあえず問題なくSNMPの情報が取得できている。
あとはGrafanaで適当に表示できるようにすれば良い。
下のようにダッシュボードを作ってみた。ダサすぎたので整理しなきゃ。。

タイトルとURLをコピーしました