nasneの空き容量をzabbixで監視する!

ある日、撮り溜めていたアニメを見ようと徐ろにPS3を起動した。
Torneを起動させたら…




容量不足で録画できてない!

雪菜はどこにいってしまったの!?

f:id:tyoshihisa:20131223142436j:plain

というわけでgitと開発用DBぐらいにしか使ってない自宅サーバにzabbix入れて監視することにした。

環境

zabbix 2.2.1

CentOS 6.5
Apache 2.2
PHP 5.5
MySQL 5.5
Ruby 2.0.0

PHPはzabbixが要求するので必須たぶん5.3.17以上、Rubyはnasneの空き容量監視スクリプトを書くために入れた。

Zabbixのインストール

公式パッケージがあるのでそれ入れたらおわり。
長くなるのでここには書かない。ググったら出てくる。

インストール後はpingを使った死活監視やアラートの設定ぐらいはテストのためにしておくことを勧める。

容量監視の方法

nasneはSNMPを喋ってくれないし、zabbix-agentのインストールもできない。なのでzabbixが動いてるサーバからnasneのHDD容量を取得しzabbixにデータを送る方法でやる。

  1. nasneの死活監視をやってるならそれとは別にホストを定義する

監視するのはnasneではなくzabbixを動かしているサーバなのでnasneの死活監視をするために設定しているならそのホストとは別にlocalhostを監視するホストを設定する。
テンプレートの関連付けは必要ないしデフォルトでOK。
ホスト名はわかりやすく「nasne_storage」と言う名前にしたが自由にしてください。
(以下、容量監視用ホストを「nasne_storage」という)

f:id:tyoshihisa:20131223151806j:plain

↑自分の監視設定。「nasne」が死活監視用,「nasne_storage」が容量監視用。いろいろ設定したあとなのでitemとかtriggerがあるけど気にしない。

zabbix_senderから送られたデータを受け取るための設定をする

nasne_storageにitemを追加する。
使用しているパーセンテージを監視したいので以下の様な設定にしておく。

f:id:tyoshihisa:20131223152453j:plain

ここでポイントになるのは以下の3つ

  • type: 「Zabbix trapper」にする
  • key: データを送るときに使うのでタイプミスに注意
  • Type of information: 小数点を含んだ数(float)を扱いたいので「Numeric(Float)」にする

間違えるとzabbix_senderでデータを送った時に失敗するので注意。

zabbix_senderでデータを送ってみる

itemが用意できたらzabbix_senderでデータを送ってみる。


zabbix_sender -z localhost.localdomain -p 10051 -s nasne_storage -k storage.usage -o 10.2

  • z zabbix-serverが動いてるホスト
  • p zabbix-serverの待ち受けポート(デフォルトで10051)
  • s 監視対象のホスト名(WebUIで設定したもの)
  • k itemのkey
  • o 送る値

成功したら「Latest data」のホスト名のところに出てくるはず。

f:id:tyoshihisa:20131223153516j:plain
↑自分の場合は使用率だけではなく、使用容量、空き容量も受け取るようにしてある。

Graphをクリックしたらグラフも出てくる。

データを送りつけるスクリプトを書く

自分はRubyで書いた。


#!/usr/local/bin/ruby
require 'json'
require 'open-uri'

NASNE_URL = 'http://<nasneのIPアドレス>/status/HDDInfoGet?id=0'
json = open(NASNE_URL).read
result = JSON.parse(json)
hdd_info = result["HDD"]
used = hdd_info['usedVolumeSize']
free = hdd_info['freeVolumeSize']
total = hdd_info['totalVolumeSize']
hdd_usage = ((used.to_f / total) *100).round(1)
system(" zabbix_sender -z localhost.localdomain -p 10051 -s nasne_storage -k storage.usage -o #{hdd_usage}")
system(" zabbix_sender -z localhost.localdomain -p 10051 -s nasne_storage -k storage.used -o #{used}")
system(" zabbix_sender -z localhost.localdomain -p 10051 -s nasne_storage -k storage.free -o #{free}")


http://<nasneのIPアドレス>/status/HDDInfoGet?id=0
を叩くと内臓HDDの情報がJSONで出てくるのでそれをパース、zabbix_senderを叩くだけのスクリプト。
送る値の種類だけitemが必要になるので作っておけばいいと思う。
これをcronで1時間に1回とか定期的に実行するようにしておくとzabbixにデータが溜まる。
送られてきたデータに対してtriggerを設定、例えば90%以上使ってるなら致命的な障害としてアラートを出すとかしておくとOKなはず。

世界に平和が訪れた!
少なくなってきてアラートが飛んできたら何かを犠牲にするかストレージ買ってくればいい。

おしまい