SEEDS Creator's Blog

muninプラグインを作成

muninは数値化できるもの規定の形式で標準出力するだけでなんでもグラフ化できます。

ユーザー数を取得してグラフするプラグインを作成する

サーバー側の情報はほとんどデフォルトのプラグインでカバーされているので今まで不便はなかったのですが勉強の為に運営しているサイトのユーザー数などを取得し、グラフ化してくれるようなプラグインを作成してみました。

ユーザー数を取得するスクリプトを作成

ここは各WEBアプリ部分になるのですがシェル上でたとえば以下のように実行すればDB等を参照してユーザー数が標準出力で返ってくるようなプログラムを作成しておきます。

/home/app/usercount.php (例) [code] <?php

$conn = pg_connect("dbname=hoge"); $sql = "SELECT id FROM user"; $result = pg_query($conn, $sql ); echo pg_num_rows($result); pg_close($conn); [/code]

シェル上で実行してみます。210人のユーザーがいるみたいですね。

[code] $ /usr/local/bin/php /home/app/usercount.php 210 [/code]

muninのプラグインを作成

muninのプラグインは与えられた引数ごとにmuninの望む出力をしてあげればOKなので言語は問いませんが、シェルスクリプトでの生成が多いみたいなので今回もシェルスクリプトで作成しました。

とりあえず作成したプラグインの全文を載せます。 作成したプラグインは /usr/share/munin/plugins へ実行権限をつけて保存し、/etc/munin/plugins/ 以下でシンボリックリンクを作成してmunin nodeを再起動します。

vi /usr/share/munin/plugins/usercount [code] !/bin/sh

%# family=auto %# capabilities=autoconf

GETNUM=/usr/local/bin/php /home/app/usercount.php

if [ "$1" = "autoconf" ]; then if [ -n ${GETNUM} ] ; then echo yes exit 0 else echo no exit 0 fi fi

if [ "$1" = "config" ]; then echo 'graph_title user count' echo 'graph_args -r --lower-limit 0' echo 'graph_vlabel users' echo 'graph_category Apps' echo 'total.label Total users' echo 'total.min 0' echo 'total.draw AREA' echo 'total.type GAUGE' exit 0 fi

echo "total.value $GETNUM"; [/code]

実行権限をつける [code] chmod 755 /usr/share/munin/plugins/usercount [/code]

保存が完了したら /etc/munin/plugins/ 以下にシンボリックリンクを作成する [code] cd /etc/munin/plugins/ ln -s /usr/share/munin/plugins/usercount usercount [/code]

最後に再起動 [code] /etc/init.d/munin-node restert [/code]

各項目の意味

プラグイン内の各項目の意味です。

munin-node-configureの環境変数設定項目

[code] %# family=auto %# capabilities=autoconf [/code]

Munin付属のプラグイン追加・削除ツールであるmunin-node-configureに通知を行う項目です。 autoconfに対応しているプラグインはmunin-node-configureにより、自動で利用可能か確認し追加することができます。 いろいろな項目が指定できるようですが配布もしないし自分しか使わないようなプラグインであれば何も考えずコピペでOKだと思います。

こちらの項目については以下の公式ドキュメント(英語)が詳しいです。

Magic markers - http://munin-monitoring.org/wiki/ConcisePlugins#Magicmarkers

データ取得

[code] GETNUM=/usr/local/bin/php /home/app/usercount.php [/code]

先ほど作成したユーザーカウントを取得するプログラムを実行しています。 $GETNUMにはユーザー数が入ってるはずです。

引数autoconfを与えられた時の実行

[code] if [ "$1" = "autoconf" ]; then if [ -n ${GETNUM} ] ; then echo yes exit 0 else echo no exit 0 fi fi [/code]

autoconfに対応したプラグインの場合、こちらでプラグインとして読み込むか否かを設定できます。 今回の場合 変数GETNUMの値が空だった場合は正常にユーザー数を取得できていないのでnoを返す(読み込まれない)よう設定します。 逆に取得ができてるのであればyesを返します。

引数configを与えられた時の実行

[code] if [ "$1" = "config" ]; then echo 'graph_title user count' echo 'graph_args --rigid --lower-limit 0' echo 'graph_scale no' echo 'graph_vlabel users' echo 'graph_category Apps' echo 'total.label Total users' echo 'total.min 0' echo 'total.draw LINE2' echo 'total.type GAUGE' exit 0 fi [/code]

大きくわけてグラフ全体の設定項目と、描写する内容(データソース)の設定にわかれます。 詳しくは以下のリファレンスマニュアルで。(英語) config reference - http://munin-monitoring.org/wiki/protocol-config

graph_title user count グラフのタイトルです。グラフの上部に出力されます。

graph_args --rigid --lower-limit 0 グラフパラメータの設定です。 --lower-limit 0 y軸のスタート地点を設定します。 --upper-limit 100 y軸の上限を設定します。 --rigid y軸の上下値のリミットを強制します。 --base 1024 この数字を超える場合に1kと表示される

graph_scale no 上記のbaseを超えた値の1kなどの表示をやめる

graph_vlabel users y軸の名前。グラフの左に表示されます

graph_category Apps グラフのカテゴリー

{fieldname}.label Total users データソースの名前。カウントされた値の項目名としてグラフの下に出力されます。

{fieldname}.max 1000 この値より高い数字を取得した場合に無視します。

{fieldname}.min 0 この値より低い数字を取得した場合に無視します。

{fieldname}.draw LINE2 グラフ描写のタイプを指定 LINE1 1ピクセルのライン LINE2 2ピクセルのライン (デフォルト) LINE3 3プクセルのライン AREA 塗りつぶします STACK 積み重ねます

{fieldname}.type GAUGE グラフ描写のタイプ指定 GAUGE 計測をそのまま表示 (デフォルト) COUNTER 前回記録時との差分を記録し、毎秒あたりの値に変換。      オーバーフローに対応するが前回の値より下回る事は考慮しない? DERIVE 前回記録時との差分を記録しつつ毎秒あたりの値に変換。      オーバーフローには対応していないが前回の値より下回る事を考慮? ABSOLUTE 基本的にはCOUNTERと同じだけど、増加分の値を表示する? この値はよく意味がわかりませんでした。

引数なしの時の実行

[code] echo "total.value $GETNUM"; [/code]

最後に値を出力。 これは引数をつけづに実行した際の出力になります。 totalというフィールドセットへの値なので total.value * みたいな出力となるよう調整します。

確認

[code]

./usercount autoconf

yes

./usercount config

graph_title user count graph_args --rigid --lower-limit 0 graph_scale no graph_vlabel users graph_category Apps total.label Total users total.min 0 total.type GAUGE total.draw LINE2

./usercount

total.value 538 [/code]

完成

現在のユーザー数がグラフ化できました。

(※)途中、COUNTとかを使用するとavgなどが変な値になってしまった・・・

数値化できるものであればなんでもグラフ化できるので便利ですね。