ogochan
システムの監視にZabbixを使っているところは多いと思います。
他方、Zabbixは機能が豊富過ぎていたり、サーバがPHPなので「hackするにはちょっと」とかで躊躇する人は少なくないと思います。だいたい同じようなことはSNMPでも出来たりするので、その辺も「いじりたい欲」のある人には厳しいかも知れません。
そこで、Zabbix agentを直接Rubyから叩いて、いろいろいじれると楽しいかなと思っていじってみました。
プロトコル
Zabbix agentのプロトコルは独自のTCPプロトコルなのですが、内容はごく単純で、
- ヘッダー + key文字列
を送信して、key文字列が示すオブジェクトの値を
- ヘッダー + 内容
という形式で返して来るだけです。送信のヘッダーの中身は、
"ZBXD0x1" + key文字列の長さ
です。受信ヘッダーの内容も同じです。
TCPのポートは10050です。
Rubyコード
これをコードにすると、
def query(key) ret = nil begin TCPSocket.open(AGENT_HOST, AGENT_PORT) do | agent | send = ['ZBXD', 1, key.length].pack('a4CQ') + key agent.write(send) got = agent.read if ( got ) a = got[0..13].unpack('a4CQ') ret = got[13..-1].unpack("a#{a[2]}")[0] end end rescue ; end ret end
という感じになります。このkeyの値は、
のあたりを見ると、なんとなくわかります。
弊社での応用
弊社では、必要なアイテムの値を取得して、Follogerにデータを送ってグラフ化しています。
こんな感じです。
なお、Zabbix agentからデータを取得してFollogerに投げるためのコードの全体は、
にありますので、参考にしてみて下さい。
応用
今はグラフを描くだけでしかありませんが、いずれIFTTTと連携してあれこれやりたいなと思っています(今作業中です)。つまり、Zabbixで出来ていることを、Zabbixサーバを使わずに実現しようと思っています。なんでわざわざこういったことをするかと言えば、それはまぁFollogerの可能性を見せるという意味もありますが、ZabbixをZabbixに閉じた世界にするのではなくて、
インターネット的
に使うことで、可能性が拡がるのではないかなぁと思ってのことです。たとえば、
- どこかとコンサル契約してリソースの情報を提供する
- 他のサーバの負荷の推移と比較してみる
- 「アラート」の方法を多様化させる
というようなことを、Zabbixに直接手を入れることなく行えるようになりますね。こういった可能性を探ってみるのも面白いんじゃないかと思ってます。