QNAP NAS storage のディスク残量をZabbixから監視するとか
何か間違ってたら教えて。今回は QNAP TS-219P を使った。
Zabbix はサーバについては 1.8。変化がある分野だとはあまり思わないけど 2.0, 2.2系の人は注意。
○ SNMPとは
ホスト監視において監視対象と監視する側の間でのやりとりを規定する定番プロトコル。ネットワーク機器などが対応してることが多い。QNAPも対応しているが、Webコンソールで有効にしとく必要はある
Wikipediaの説明
○ ディスク容量について、QNAPは何故かカスタムフィールドを用いて報告してくる
QNAPはSNMPに対応している。やったねたえちゃん
しかし、標準的なMIBファイルのみ使って snmpwalk コマンドを叩いてQNAPの情報を取得してみても、ストレージの残量を見るフィールドは見当たらない。
http://www.itmedia.co.jp/help/howto/linux/0007master/06/22.html にあるような、SNMP標準のディスク関連のOIDではQNAPのディスク容量 (欲しいのは総容量と空き容量)は取れないようだ。
実はQNAPのSNMP管理画面には専用のMIBファイルが置いてあり、それには private領域にいくつか新しい要素が定義されている。そのファイルをsnmpwalkに認識させた上で以下のように打つと、QNAP独自に定義された情報が出てくる。
○ "1.79 TB" って……文字列かよ!
で、まぁprivateでも別に良いんですよ。それがZabbixの標準的なインターフェースで読み取れれば。
言い換えれば、private領域の値でも、その型がINTEGERなら、Zabbixで上記のOIDを観測させれば良い。1.3.6.1.4.1.24681.1.2.17.1.4.1がtotal (総容量) で1.3.6.1.4.1.24681.1.2.17.1.5.1がfree (空き容量)だから、基本的にはfreeが減ってきたら警告を出す、というのは簡単なはずだ。
しかし、あいにくここでは文字列である。1.79 TBとか書いてあると、人は読めるけどZabbixは読めない。(多分)"TB"を変換するロジックをZabbixは持ってない。なんでSTRINGなのばかー!
# あと、情報の粒度も相当アレ
○ ExternalScriptsを書こう!
こういう場合にはZabbix上からスクリプトを実行することで文字列を値にするロジックを埋め込む必要があるんだろう。そうなんだろう。
/etc/zabbix/zabbix_server.conf 等に書かれているExternalScripts のディレクトリ下にちょっとしたコードを書く。今回使ってみたコードは以下のとおりだ。
https://github.com/dmiyakawa/qnap_disk_usage/blob/master/qnap_disk_usage.py
これを監視対象のHostのItemでExternal checkとして登録する。引数は不要 (Zabbixが勝手に第一引数をホスト名にしてくれる)。
蛇足だがスクリプトのデバッグとしては zabbix_server のログが便利。エラー出力はログに吐かれる。あと、このエントリでは全く省いているがMIBを適度に認識させるのは適度に面倒だという点について注意。上記のPythonスクリプト、OIDを"iso.org.dod.internet.private.enterprises.storage"とは書いてない (storage 下が QNAP 独自定義) が 1.3.6.1.4.1.24681.1.2.17.1.4.1 という素のフォーマットでも書いてない。どっちもエラー出る。libsnmp-python 、どういうことなの。。。
# 今回Python 2.7 なのはnetsnmpが現状3系に対応してないっぽいからです。このレベルのコードで致命的に書き味が変わることはないのでどうでも良いのだけど、そろそろ3だけにしようとおもってたのにうざい。GAEもろとも猛省せよ
○ TriggerとGraphに
正直Graphに面白みはないような。少しずつ減っていく様が分かるのかしら。
Triggerで20%未満になったら警告、とかやっておけば、唐突に枯渇してあぎゃー、ということはない。監視さまさま。
○ あんまりExternalScriptsに頼るなよ、だって
https://www.zabbix.com/documentation/2.0/manual/config/items/itemtypes/external
このスクリプトは(設定できるが)それなりの頻度で実行される。たくさんのホストにつかったら数秒ごとに1回走ったりする。pythonランタイムをそれだけ別プロセスで起動するとどうなるかはちょっとわからん (Zabbixは結構プロセス切る)。監視業務を本気でやるのなら、この程度のゆるい内容はshスクリプトにするのが良いかもしれない
追記 (2013-05-28): アクセス数が安定してあるようなので一部読みやすくしました。
Zabbix はサーバについては 1.8。変化がある分野だとはあまり思わないけど 2.0, 2.2系の人は注意。
○ SNMPとは
ホスト監視において監視対象と監視する側の間でのやりとりを規定する定番プロトコル。ネットワーク機器などが対応してることが多い。QNAPも対応しているが、Webコンソールで有効にしとく必要はある
Wikipediaの説明
○ ディスク容量について、QNAPは何故かカスタムフィールドを用いて報告してくる
QNAPはSNMPに対応している。やったねたえちゃん
しかし、標準的なMIBファイルのみ使って snmpwalk コマンドを叩いてQNAPの情報を取得してみても、ストレージの残量を見るフィールドは見当たらない。
http://www.itmedia.co.jp/help/howto/linux/0007master/06/22.html にあるような、SNMP標準のディスク関連のOIDではQNAPのディスク容量 (欲しいのは総容量と空き容量)は取れないようだ。
実はQNAPのSNMP管理画面には専用のMIBファイルが置いてあり、それには private領域にいくつか新しい要素が定義されている。そのファイルをsnmpwalkに認識させた上で以下のように打つと、QNAP独自に定義された情報が出てくる。
> MIBFILES=./NAS-MIB snmpwalk -v 2c -c public (ホスト名) iso.org.dod.internet.private.enterprises.storage NAS-MIB::SystemCPU-Usage.0 = STRING: "100.00 %" NAS-MIB::IfIndex.1 = INTEGER: 1 NAS-MIB::IfDescr.1 = STRING: "eth0" NAS-MIB::IfPacketsReceived.1 = Counter32: (にょろーん) NAS-MIB::IfPacketsSent.1 = Counter32: (にょろーん) NAS-MIB::IfErrorPackets.1 = Counter32: 0 NAS-MIB::HdIndex.1 = INTEGER: 1 NAS-MIB::HdIndex.2 = INTEGER: 2 NAS-MIB::HdDescr.1 = STRING: "HDD1" NAS-MIB::HdDescr.2 = STRING: "HDD2" NAS-MIB::HdTemperature.1 = STRING: "35 C/95 F" NAS-MIB::HdTemperature.2 = STRING: "34 C/93 F" NAS-MIB::HdStatus.1 = INTEGER: ready(0) NAS-MIB::HdStatus.2 = INTEGER: ready(0) NAS-MIB::HdModel.1 = STRING: "(にょろーん) " NAS-MIB::HdModel.2 = STRING: "(にょろーん) " NAS-MIB::HdCapacity.1 = STRING: "1.82 TB" NAS-MIB::HdCapacity.2 = STRING: "1.82 TB" NAS-MIB::HdSmartInfo.1 = STRING: "GOOD" NAS-MIB::HdSmartInfo.2 = STRING: "GOOD" NAS-MIB::SysVolumeIndex.1 = INTEGER: 1 NAS-MIB::SysVolumeDescr.1 = STRING: "[Mirror Disk Volume: Drive 1 2]" NAS-MIB::SysVolumeFS.1 = STRING: "EXT4" NAS-MIB::SysVolumeTotalSize.1 = STRING: "1.79 TB" NAS-MIB::SysVolumeFreeSize.1 = STRING: "X.XX TB" NAS-MIB::SysVolumeStatus.1 = STRING: "Ready"
○ "1.79 TB" って……文字列かよ!
で、まぁprivateでも別に良いんですよ。それがZabbixの標準的なインターフェースで読み取れれば。
言い換えれば、private領域の値でも、その型がINTEGERなら、Zabbixで上記のOIDを観測させれば良い。1.3.6.1.4.1.24681.1.2.17.1.4.1がtotal (総容量) で1.3.6.1.4.1.24681.1.2.17.1.5.1がfree (空き容量)だから、基本的にはfreeが減ってきたら警告を出す、というのは簡単なはずだ。
しかし、あいにくここでは文字列である。1.79 TBとか書いてあると、人は読めるけどZabbixは読めない。(多分)"TB"を変換するロジックをZabbixは持ってない。なんでSTRINGなのばかー!
# あと、情報の粒度も相当アレ
○ ExternalScriptsを書こう!
こういう場合にはZabbix上からスクリプトを実行することで文字列を値にするロジックを埋め込む必要があるんだろう。そうなんだろう。
/etc/zabbix/zabbix_server.conf 等に書かれているExternalScripts のディレクトリ下にちょっとしたコードを書く。今回使ってみたコードは以下のとおりだ。
https://github.com/dmiyakawa/qnap_disk_usage/blob/master/qnap_disk_usage.py
これを監視対象のHostのItemでExternal checkとして登録する。引数は不要 (Zabbixが勝手に第一引数をホスト名にしてくれる)。
蛇足だがスクリプトのデバッグとしては zabbix_server のログが便利。エラー出力はログに吐かれる。あと、このエントリでは全く省いているがMIBを適度に認識させるのは適度に面倒だという点について注意。上記のPythonスクリプト、OIDを"iso.org.dod.internet.private.enterprises.storage"とは書いてない (storage 下が QNAP 独自定義) が 1.3.6.1.4.1.24681.1.2.17.1.4.1 という素のフォーマットでも書いてない。どっちもエラー出る。libsnmp-python 、どういうことなの。。。
# 今回Python 2.7 なのはnetsnmpが現状3系に対応してないっぽいからです。このレベルのコードで致命的に書き味が変わることはないのでどうでも良いのだけど、そろそろ3だけにしようとおもってたのにうざい。GAEもろとも猛省せよ
○ TriggerとGraphに
正直Graphに面白みはないような。少しずつ減っていく様が分かるのかしら。
Triggerで20%未満になったら警告、とかやっておけば、唐突に枯渇してあぎゃー、ということはない。監視さまさま。
○ あんまりExternalScriptsに頼るなよ、だって
https://www.zabbix.com/documentation/2.0/manual/config/items/itemtypes/external
このスクリプトは(設定できるが)それなりの頻度で実行される。たくさんのホストにつかったら数秒ごとに1回走ったりする。pythonランタイムをそれだけ別プロセスで起動するとどうなるかはちょっとわからん (Zabbixは結構プロセス切る)。監視業務を本気でやるのなら、この程度のゆるい内容はshスクリプトにするのが良いかもしれない
追記 (2013-05-28): アクセス数が安定してあるようなので一部読みやすくしました。