Prometheus+snmp_exporterでIX2105を監視する
前回(IX2105でDS-Liteと接続して爆速インターネットをやる)に引き続き、IX2105の設定を行っていきます。 今回はPrometheusでの監視をやっていきます。
- IX2105でSNMPを有効化する
- snmp_exporterの導入
- カスタムモジュールを定義してsnmp_exporterにPRを投げる
- Prometheusの設定を行う
- Grafanaで可視化する
IX2105でSNMPを有効化する
まずIX2105側のSNMP機能を有効にします。 今回はIP制限を行いません。
snmp-agent ip enable
snmp-agent ip community public
手元のLinuxマシンから接続が行えるかを確かめてみます。
$ snmpwalk -v1 192.168.111.1 -c public 1.3.6.1.2.1.1
iso.3.6.1.2.1.1.1.0 = STRING: "NEC Portable Internetwork Core Operating System Software, IX Series IX2105 (magellan-sec) Software, Version 9.7.15, RELEASE SOFTWARE, Compiled Mar 13-Tue-2018 18:18:58 JST #2, IX2105"
iso.3.6.1.2.1.1.2.0 = OID: iso.3.6.1.4.1.119.1.84.14.1
iso.3.6.1.2.1.1.3.0 = Timeticks: (17331617) 2 days, 0:08:36.17
iso.3.6.1.2.1.1.4.0 = ""
iso.3.6.1.2.1.1.5.0 = STRING: "Router"
iso.3.6.1.2.1.1.6.0 = ""
iso.3.6.1.2.1.1.7.0 = INTEGER: 72
snmp_exporterの導入
次はPrometheusからの監視を行いたいので、snmp_exporterのバイナリを適当にダウンロードして試してみます。
デフォルトではポート 9116
でHTTPサーバが起動します。
DL先: https://github.com/prometheus/snmp_exporter/releases
$ ./snmp_exporter &
$ curl localhost:9116/snmp?target=192.168.111.1
$ curl localhost:9116/snmp?target=192.168.111.1&module=if_mib # 同じ意味(モジュール名を明示的に指定)
すると、こんな調子でつらつらとメトリクスが出てきます。
# TYPE ifHCInOctets counter
ifHCInOctets{ifAlias="",ifDescr="GigaEthernet0",ifIndex="1",ifName="GigaEthernet0"} 1.5119176458e+10
ifHCInOctets{ifAlias="",ifDescr="GigaEthernet0-Multiplexor",ifIndex="3",ifName="GigaEthernet0-Multiplexor"} 1.5119176458e+10
ifHCInOctets{ifAlias="",ifDescr="GigaEthernet0.0",ifIndex="355",ifName="GigaEthernet0.0"} 1.5119176458e+10
ifHCInOctets{ifAlias="",ifDescr="GigaEthernet0.0-LAN",ifIndex="13",ifName="GigaEthernet0.0-LAN"} 1.5119176458e+10
ifHCInOctets{ifAlias="",ifDescr="GigaEthernet1",ifIndex="2",ifName="GigaEthernet1"} 5.20355025575e+11
ifHCInOctets{ifAlias="",ifDescr="GigaEthernet1-Multiplexor",ifIndex="4",ifName="GigaEthernet1-Multiplexor"} 5.20355024179e+11
ifHCInOctets{ifAlias="",ifDescr="GigaEthernet1.0",ifIndex="356",ifName="GigaEthernet1.0"} 5.20355024179e+11
ifHCInOctets{ifAlias="",ifDescr="GigaEthernet1.0-LAN",ifIndex="14",ifName="GigaEthernet1.0-LAN"} 5.20355024179e+11
ifHCInOctets{ifAlias="",ifDescr="Tunnel0",ifIndex="223",ifName="Tunnel0"} 9.327241604e+09
ifHCInOctets{ifAlias="",ifDescr="Tunnel0.0",ifIndex="726",ifName="Tunnel0.0"} 9.327241604e+09
適当にSNMPの代表的なメトリクスをexportしてくれます。 gauge, counterとかの区別も付いていてすごいですね。 ですが、プライベートMIBに含まれる機器特有のファン回転数・筐体温度等のメトリクス情報は取得できません。
IXの場合は、以下のURLに取得できる情報の一覧が有りました。
温度・ファン・CPU使用率・メモリ・IPsec等、面白そうなメトリクスが多数含まれています。
これらを snmp_exporter
で取得するためにはモジュールの定義を行う必要があります。
デフォルトでは標準的なメトリクスを取得する if_mib
モジュールの他、ベンダー依存の cisco_wlc
arista_sw
ddwrt
keepalived
が定義されています。
NEXのIXは定義されていないので、今回は nec_ix
モジュールを作ってみましょう。
IXでのSNMP仕様: https://jpn.nec.com/univerge/ix/faq/snmpv1.html
カスタムモジュールを定義してsnmp_exporterにPRを投げる
自分が投げたPRがマージされたので、次のリリースからIXの監視を行うためにカスタムモジュールを定義する必要はなくなりました。モジュール名は nec_ix
として公開されています。
https://github.com/prometheus/snmp_exporter/pull/427
どのSNMPのメトリクス値を取得して何のラベルを付けるかは、同一ディレクトリに保存されている snmp.yml
ファイルで定義しています。
見てみると、CiscoWLC, Arista, keepalived等のプライベートMIBが含まれることが分かると思います。
https://github.com/prometheus/snmp_exporter/blob/master/snmp.yml
ただ、この1万行を超えるファイルを手で管理しているわけではありません。 MIBの定義ファイルから自動で生成するためのジェネレータが同一リポジトリに有ります。
https://github.com/prometheus/snmp_exporter/tree/master/generator
- makeでMIBの定義ファイルを取得する
generator.yml
に書かれたルールに従ってMIB定義ファイルを参照- 各メトリクスの名前・種類・説明文などを
snmp.yml
に出力 - snmp_exporterが
snmp.yml
の情報を使用して、SNMPエージェントが持つ値を取得・/metrics
へ公開
ですので通常拡張を行うときは、 Makefile
generator.yml
のみ編集すれば良いです。
今回は、 generator.yml
に以下のように追記しました。
今回はメトリクスの定義が素直だったので、walkのみ記述すれば適切にメトリクスの取得が行えました。
この定義を行うことで、 picoSystem
以下の picoCelsius
picoFahrenheit
等の子のメトリクスが再帰的に取得できるようになります。
modules:
nec_ix:
walk:
- picoSystem
- picoIpSecFlowMonitorMIB
- picoExtIfMIB
- picoNetworkMonitorMIB
- picoIsdnMIB
- picoNgnMIB
- picoMobileMIB
- picoIPv4MIB
- picoIPv6MIB
curl localhost:9116/snmp?target=192.168.111.1&module=nec_ix
と叩けば、CPU使用率・ヒープ使用率・IPSecの状態・ファンの状態・電源の状態など、面白そうなメトリクスが取得できるようになりました。
Prometheusの設定を行う
スクレイピングの設定を行います。
ポイントとしては、ネットワーク機器のIPアドレスを指定しますが、その機器にHTTPでメトリクスを取得しに行くことは出来ないので、 __address__
ラベルを置換して全てsnmp_exporterにリクエストを送信する必要があります。
設定例はこのようになります。
snmp-exporter.example.com:9116
は、自分で立てたsnmp_exporterのアドレスを指定してください。
moduleには複数指定が出来ないので、屈辱的ですがこのように2つ書くことになります。
scrape_configs:
- job_name: 'snmp_if_mib'
static_configs:
- targets:
- 192.168.111.1 # ix2105
metrics_path: /snmp
params:
module: [if_mib]
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: snmp-exporter.example.com:9116 # The SNMP exporter's real hostname:port.
- job_name: 'snmp_nec_ix'
static_configs:
- targets:
- 192.168.111.1 # ix2105
metrics_path: /snmp
params:
module: [nec_ix]
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: snmp-exporter.example.com:9116 # The SNMP exporter's real hostname:port.
Grafanaで可視化する
とりあえず {job="snmp_nec_ix"}
などでクエリを叩けばざーっと値が出てくるので、ほしそうなモノをDashboardに突っ込んでいくだけです。
Exploreでの表示例。
ダッシュボードの設定例。
ファンが搭載されているモデルだと回転数などが取れるようになったのですが、IX2105はファンレスなので残念ながら確認できないです。 ホンマか?と思うものの、通信を大量に流してもせいぜいCPUは20%程度しか使っていないようです。 なので、特に温度が上がるわけでもなく暇なグラフになっています… 異常なときに調査できるように貯めておくので良いんですが寂しいです。
おわり
PRも無事マージされたし、IXは安定して動いているし満足です。 VyosをHypter-Vで動かしていたので、WindowsUpdateが発生してネットが定期的に落ちるという心配もなくなりました。