Zabbix で様々な情報の監視を、Zabbix エージェントを行わずに監視する連載も、今回で最後です。最後は、文字列やログなど、テキスト形式のデータを zabbix_sender を使って監視する方法と、実践的な方法として nasne の録画情報を記録する方法をご紹介します。
■ zabbix_sender で文字列を送る利点とは?
zabbix_sender はコマンドをつかってデータを送る事が出来ます。1回目の連載では、Load Averageの値を数値データ(numeric)としてZabbixサーバに送っていました。この方法は、たとえば、定時バッチ処理の中で、正常処理・異常処理の数値を送ることができます。
zabbix_sender が扱えるのは、数値データだけではありません。データ型として「テキスト」または「ログ」を選択することによって、エラーコードやメッセージ文字列を送る事ができます。テキストとログの違いは、テキストが純粋に文字列を記録するのに対し、ログは「ローカル時間」(Local date)を扱うことが出来ます。
ローカル時間を使えば、zabbix_sernderがデータの取得した時刻と、ログなどで問題が発生した時刻を分けて記録することができます。例えば、障害発生後のアラートの発生タイミングの調整や、Zabbix上で問題発生時刻の確認を行う事もできます。
実は「テキスト」でも、ログのように、時刻の調整は可能です。zabbix_sender は、コマンドラインのオプションで「-T」のタイムゾーン指定と「-i <ファイル名>」のオプションを指定することで、現時刻ではない時刻を、Zabbix Sender 上にデータとして送る事ができます。たとえば、次のような「data.txt」を作成するとします。
zabbix_sender test 1421242470 value (ホスト名) (キー名) (日時=エポック秒) データ)
このようにファイルを作成しておけば、次のようにファイルを読み込むことで、指定した日時の値が、対象となるキー名のアイテムに格納されます。
$ zabbix_sender -z 127.0.0.1 -T -i ./data.txt
■ nasneの番組情報を zabbix_sender で取得するしくみ
nasneの番組録画の記録をとりたい場合は、ローカル時間を扱えるデータ型「ログ」を選択します。そうすることで、「Zabbix サーバが録画を検出した時刻と」、「録画が始まった時刻」を分けて記録するようにしました。
データ取得の流れは、nasneのHDD容量を取得した時と同様に、自宅ネットワーク内のnasneに対して、Raspberry PiからREST APIでアクセスし、受け取ったJSON形式のデータを加工し、Zabbix サーバに送信します。
データを取得するためには、エージェントで監視するときと同様にアイテムを作成します。
1. 【 設定 】→【 ホスト 】→【 アイテムの作成 】をクリックします。
2. アイテムの設定画面では「Zabbix トラッパー」を選びます。その他の項目は以下の通りです。
・名前:nasune recording log
・タイプ:Zabbix トラッパー
・キー:nasne_rec_log
・データ型:ログ
・ヒストリ:任意日数
・ログの時間の形式:yyyyMMdd.hhmmss
なお、このアイテムは、先日利用した Zabbix テンプレートの中で定義済みですので、テンプレートをインポートしてお使いであれば、定義する必要がありません。
次に、nasne を監視している Raspberry Pi 上の設定をみていきます。サーバーの中には、/usr/local/bin/ などに、GitHub の nasne_monitor レポジトリで公開している nasne_rec.pl をコピーします。ファイル中の nasne サーバの IP アドレスは随時書き換えて下さい。
# chmod 755 /usr/local/bin/nasne_rec.pl
この「nasne_rec.pl」は、nasne が録画状態かどうかをステータス(boxStatusListGet)を返す API に対するリクエスト結果から判別します。「tvTimerInfoStatus」という文字列が存在すると、録画中とみなし、放送局やチャンネル情報を元に、放送中の番組を nasne から channelInfoGet2 というリクエストで再び取得します。詳しくは先日の nasne API に関する投稿をご覧ください。
あとは、結果を整形し、タイトルや説明を整形して Zabbix サーバに送ります。nasne_rec.pl を使う時は、コード中の「<zabbix_host>」と「<server_name>」を自分自身のものに置き換えて利用ください。
この nasne_rec.pl ファイル作成後は、cron に登録します。
# crontab -e * * * * * /usr/local/bin/nasne_rec.pl
あとは、録画状態の番組があれば、自動的に記録されます。
■トリガーとアクションの設定
録画開始時に、メールで通知したい場合は、トリガーを追加することで実現できます。「前回と取得時の値が違う」ことをトリガーにするためには、「diff()」を使って次のように指定します。
{RasPi:nasne_rec_log.diff(0)}=1
「1」は、diff(0)の結果が、最新値と前回の値が異なる場合を条件としています。diffの代わりにabschangeを使う方法もありますが、こちらは戻り値が「0」の場合は「値が等しい」であり、戻り値「1」の場合は「値が異なる」としてイベントが発生します。使い分けとしては、純粋な違いを検出したいなら「diff」がおすすめです。より複雑に、常に正常値を返す条件を設定していて、異常時のみ通知またはイベント発生とみなしたい場合は「abschange」が有効でしょう。
補足情報:ここで注意する違いは、同じデータが継続する場合の挙動の違いです。「abschange」は2回同じ値が継続すると「0」を返すだけでなく、トリガーの結果が「正常」となります。対して、「diff」の場合はステータスが「障害」で継続したままとなります。このあたりは、「障害」とみなす時間を条件式に入れるといった工夫になる場合もあります。
あとは、録画の度にイベントが発生しますので、このトリガーを設定したアイテムのアクションを指定すると、メールを送信することができます。
応用として、メールを送信するだけでなく、Twitterに投稿するスクリプトと連動させて自分で「またテレビ見てる」のように、自動でtweetさせたり、あるいは Slack で通知するといった応用もできると思います。
■ まとめ
これまでみてきたように、zabbix_sender は、Zabbix のエージェントが動作しない環境であっても、簡単に Zabbix サーバに対して監視データを送る事ができます。対象が Linux サーバでない場合でも、nasne のような RESTful なインターフェースがあれば、Raspberry Pi などの小型コンピュータを介して、監視する事も容易です。皆さんの身の回りにあるもので「これ監視できないかな?」と思うときがあれば、zabbix_sender の事を思い出してもらえると、とっても嬉しいなって思っています。
■参考資料
- 6 Sender [Zabbix Documentation 2.2]
https://www.zabbix.com/documentation/2.2/jp/manual/concepts/sender - 13 トラッパーアイテム [Zabbix Documentation 2.2]
https://www.zabbix.com/documentation/2.2/jp/manual/config/items/itemtypes/trapper - LLD(ローレベルディスカバリ)を弄り倒せ、zabbix_senderを併用してらくらく可視化
http://www.slideshare.net/takeshiyamane9/lld-zabbix