#meminfoファイルの中身をzabbix_senderでまとめて送信してみた
##はじめに
zabbixのメモリ関係のアイテムは、取得できるのがtotal、shared、free、buffers、cachedだけでちょっと大雑把(?)
そこでmeminfoに記載の情報をzabbixで取得してみようかな、と思った。
で、ユーザパラメータ辺りを使って項目別のアイテムを設定すると、アイテムの取得タイミングが個々で微妙にズレるのが気になるのでzabbix_senderでやってみました。
というお話。
##スクリプト
#!/bin/sh
if [ $# -ne 2 ] ; then
echo "This script needs two argments." 1>&2
exit 1
fi
zbxHOSTNAME="$1"
zbxSERVER="$2"
TIMESTAMP=`date +%s`
TEMPFILE="/tmp/zbxTMP$$"
ITEMPREFIX="system.meminfo."
cat /proc/meminfo |while read LINE
do ARTICLE=`echo $LINE |cut -d":" -f1 | tr "()" "_"`
ITEMNUM=`echo $LINE|cut -d":" -f2|sed -e "s/ kB/ * 1024/" |bc`
echo "$zbxHOSTNAME $ITEMPREFIX$ARTICLE $TIMESTAMP $ITEMNUM"
done >$TEMPFILE
zabbix_sender -z $zbxSERVER -p 10051 -T -i $TEMPFILE >&2
echo $?
rm -f $TEMPFILE
###スクリプトの解説
/proc/meminfoの情報を、引数で受け取ったzabbixサーバのIPアドレス、アイテムを取得するマシンのホスト名(とスクリプト実行時の時刻)と併せてzabbix_sender機能でサーバに登録する。
ポイントは下記の2点ぐらい
- アイテムのキーに”()”`が含まれるとアイテムが上手く登録できなかったので"_"に置換している。
- キロバイト単位をバイト単位に変換している。単位の換算はzabbix側で宜しくやってくれる。
ファイルに記録した複数の値を一括してzabbix_senderで送信する方法については
Zabbix Senderで複数の値を一括登録 - ike-daiの日記
こちらを参考にさせて頂いた。
##アイテムの登録
アイテムのキーはsystem.meminfo.”meminfoファイル内の項目名”
で整数型なトラッパーアイテムを登録しておく
こんな設定をmeminfoファイルに含まれる項目の分だけ手動でやるとちょっとした苦行なのでうまい感じで省力化したいところ。
##スクリプトの起動
こんなアイテムを登録して設置したスクリプトを起動。
このアイテムの実行間隔で、上で設定したトラッパーなアイテムにスクリプトから値が登録されていく。
見切れているキーの欄はこんな感じ
system.run[/etc/zabbix/externalscripts/zbxmeminfo.sh "{HOSTNAME}" "192.168.xxx.xxx"]
”192.168.xxx.xxx”はzabbixサーバのIPアドレス。
上述の各項目のアイテムと合わせてテンプレートにして{HOSTNAME}
マクロを使っているので、スクリプト設置だけしてやれば複数サーバでの値の収集も比較的楽だと思う。
エージェントでEnableRemoteCommands=1
を設定しないと動かない、はず。
ユーザパラメータに登録、crontabに登録でもいいかも。