2013年12月5日木曜日

Zabbixでmongoの監視やってみた

■環境
CentOS 6.2
Zabbix 2.0.3
mongoDB 2.4.5
php 5.3.3
※事前作業としてZabbixサーバのインストールとmongoDBのインストールは完了しているものとします
※今回の対応自体ではzabbix_agentd自体は使用しません、また作業はほぼ全てZabbixサーバ上で実施します、zabbix_agentdはインストールしてあっても問題はないです

■モジュール追加(Zabbixサーバ上で実施上で実施)
yum -y install php-devel php-pear gcc make
pecl install mongo
vim /etc/php.ini
以下を追記
extension=mongo.so

vim test.php
以下を追記
<?php
new MongoClient("mongodb://dbserver:27017");
?>

php test.php
でエラーとならなければOK
エラーとなる場合はmongoのプロセスが上がっているかやACLの設定(FWやiptables)を見なおして下さい

■スクリプト追加(Zabbixサーバ上で実施)
mkdir -p /opt/zabbix/share/zabbix/externalscripts/
cd /opt/zabbix/share/zabbix/externalscripts/
wget http://mikoomi.googlecode.com/svn/plugins/MongoDB%20Plugin/mikoomi-mongodb-plugin.php
wget http://mikoomi.googlecode.com/svn/plugins/MongoDB%20Plugin/mikoomi-mongodb-plugin.sh
chmod 755 mikoomi-mongodb-plugin.*
chown zabbix:zabbix mikoomi-mongodb-plugin.*
※どうやらchefインストールした環境だと上記のパスに置く必要があるようです(すいません、先に書いておくべきでしたが今回Zabbiサーバのインストールはchefで実施しています

■スクリプト修正(Zabbixサーバ上で実施)
以下は実施しないでもいいかもしれません、自分の環境では実施しないと動作しなかったので備忘録がてら記載しておきます
  1. mikoomi-mongodb-plugin.sh内で「shift」コマンドを実行している行を削除(shiftすることで引数がうまくphpに渡せませんでした)
  2. mikoomi-mongodb-plugin.php内541行目あたりでzabbix_senderを呼んでいるパスをフルパスに変更(フルパスで呼んでいないのでPATHを通していない場合はzabbix_senderをフルパスで呼ぶように変更してください)

■Zabbixサーバへのテンプレート登録(Zabbixサーバ上で実施)
http://mikoomi.googlecode.com/svn/plugins/MongoDB%20Plugin/MongoDB_Plugin_template_export.xml
をダウンロードしてZabbixのWebUIからテンプレートを登録します
インポートできたテンプレートに対して監視対象のホストを追加します
テンプレートの設定からマクロタブを選択して
{$HOSTNAME}、{$PORT}、{$SERVER}
を追加します
{$HOSTNAME}と{$SERVER}に監視するmongoDB側のIP(またはホスト名)を入力し
{$PORT}にLISTENしているmongoのポートを入力します(test.phpでテストしたときのポート番号を入力します)

■ACL設定(ZabbixサーバとDBサーバ)
Zabbixサーバ -> tcp/27071 -> mongoDB
上記を満たすFWやiptablesの設定をしてください
replicaSet構成の場合は各ポートも通信できるようにしたほうがいいかもしれません
※公式だとmongosのプロセスを監視すれば良いと書いてあるようでしたが私はreplicaSetのPRIMARYポートを監視するようにしました(なのでfail overした場合は監視するポート変更する必要があります。。。)

■参考

以上で設定自体は完了です
あとは自分が設定した際のトラブルシューティングを記載しているので参考にしてみてください

●全体的な動きの流れ
全体的な動きとしては
シェル実行 -> php実行 -> mongoからデータ取得 -> zabbix_sender で 127.0.0.1にデータ登録
という流れとなっています
なのでzabbix_agentを使えないで監視ができるわけです
zabbix_senderは /tmp/mikoomi-mongodb-plugin.php_dbserver.data のデータを送っています
ちなみにphp内で送信しているzabbix_senderのコマンドは以下でした
/opt/zabbix/bin/zabbix_sender -vv -z 127.0.0.1 -i /tmp/mikoomi-mongodb-plugin.php_dbserver.data
上記を実行してエラーとならないことを確認する必要もあります
zabbix_sender自体のログも/tmp配下にあります

●トラブルシューティング
うまく取得できない場合はホストのアイテムの設定からMiscellaneous: Data Collectorのステータスを有効にしてください
その後zabbix_server.logを見るとシェルを実行した結果のログがでるのでそれを元に修正します

配置したシェルを直接叩いて動作を確認することもできます、以下は実行サンプルです
sh /opt/zabbix/share/zabbix/externalscripts/mikoomi-mongodb-plugin.sh -h dbserver -p 27071 -z dbserver
phpは以下のように実行します
php /opt/zabbix/share/zabbix/externalscripts/mikoomi-mongodb-plugin.php -h dbserver -p 27071 -z dbserver
シェルやphpをrootで実行した場合は/tmp配下のログの権限に気をつけてください
ログの所有者がrootになってしまいzabbixから実行した場合はzabbixユーザで実行することになりログへの権限がなくなりスクリプトがうまく動かなくなりますのでrootで直接スクリプトを実行した場合は権限の書き換えかファイルの削除をしてください

「timeout while executing a shell script」が出力される場合はzabbix_server.confのTimeoutの値を30に変更しzabbix_serverを再起動してください

「No Data Received in 5 minutes」でアラートが常にあがってしまう場合はトリガーの設定でnodateの引数を800くらいあげてください
どうやらZabbixトラッパーでのデータの取得が10分おきになっているのでデフォルトの300秒(5分)だと常にアラートがあがってしまうようです

最終的にzabbix_server.logに
8967:20131204:171621.274 item [db_server:mikoomi-mongodb-plugin.sh[-h {$SERVER} -p {$PORT} -z {$HOSTNAME}]] became supported
的なログが出力されれば完了です

0 件のコメント:

コメントを投稿