【Munin】httping プラグインの仕組みを解説

【Munin】httping プラグインの仕組みを解説 はてなブックマーク - 【Munin】httping プラグインの仕組みを解説


◆φ(..)メモメモ

今日の投稿は、昨日公開した Munin の httping プラグインについて。中身が具体的にこうなってます…というのを、自分の備忘録も兼ねて公開します。

【Munin】ウェブサーバのレスポンスを調べるhttpingプラグイン書きました | Pocketstudio.jp log3
http://pocketstudio.jp/log3/2012/09/25/httping_munin_plugin/

◆プラグインの実体は、シェルスクリプト

httping プラグインの実体は、見ての通り単なるシェルスクリプト。今回はシェルスクリプトでしたが、プラグインは体裁として munin ( munin-node ) が理解できるデータ形式を返すことが出来れば、何でも構いません。 スクリプトであれば、Perlで も PHP でも Ryby でも、もちろん C や Haskel でも OK です!

次のスクリプトが、プラグインの全てです。

#!/bin/sh
#
# Plugin to monitor HTTP response

#%# family=auto
#%# capabilities=autoconf

URL=${URL:-"http://localhost/"}
COUNT=${COUNT:-"5"}
httping_bin=$(which httping)

if [ "$1" = "autoconf" ]; then
 echo yes
 exit 0
fi

if [ "$1" = "config" ] ; then
 echo "graph_args -r --lower-limit 0 ";
 echo "graph_title http response $URL";
 echo "graph_category httping";
 echo "graph_info httping response time: $URL";
 echo 'graph_vlabel msec'

 echo "connect.label connect time"
 echo "connect.draw AREA"
 echo "connect.type GAUGE"
 echo "processing.label processing time"
 echo "processing.draw STACK"
 echo "processing.type GAUGE"
 exit
fi

$httping_bin -c $COUNT -G -S $URL | tr '+|=' ' ' | awk '{connect+=$9; processing+=$10} END{print "connect.value",connect/'$COUNT'"\n""processing.value",processing/'$COUNT'}'

さて、スクリプト全体を見通すと、if で区切られたブロックが2つと、コマンドが記述されている箇所の大きく3つのブロックに別れて見えると思います。

・引数が【 autoconf 】の場合 … 自動的にプラグインを有効にするか否か
・引数が【 config 】の場合 … RRDtool グラフの定義や、閾値指定
・引数が無い場合 … スクリプトの実行(httping コマンド実行)

基本的に、Munin のプラグインは、どれもこのような構造です。

では、上から順を追って見ていきます。

#!/bin/sh

1行目は、いわゆるシバン行(shebang line)の指定。シェルスクリプトなので、【 /bin/sh 】を指定しています。

#
# Plugin to monitor HTTP response

こちらは、単なるコメントアウトです。あまり意味はありません。

#%# family=auto
#%# capabilities=autoconf

ここは Munin 向けの環境変数指定です。

“family” のトコロは、munin-node-configure 実行時やmunin-node インストール時に、どのような動作をするかの指定です。auto であれば、自動的に組み鋳込み対象とします。

“capabilities”は、munin-node-configureを実行したときの挙動を指定します。autoconf であれば、自動的に組み込み対象とします。

ここでの選択肢については、コミュニティ Wiki (英語)の記述が参考になります。実際のところは、自分だけ使う用途(配付用のプラグインを作らない)であれば、そのままコピペでも何ら支障は無いところです。

URL=${URL:-"http://localhost/"}
COUNT=${COUNT:-"5"}
httping_bin=$(which httping)

ここは、シェルスクリプトの中で変数に値を入れています。それぞれ $URL , $COUNT, $httping_bin という変数に値を入れています。

  • $URL … httping で計測する対象 URL です。環境変数$URLに何も指定されていない場合に「http://localhost/」を入れます。
  • $COUNT … 対象 URL に何回計測するかのオプション指定です。httping の引数として使います。
  • $httping_bin … which httping コマンドを実行し、httping のパスを入れます。

ちなみに環境変数は、/etc/munin/plug-conf.d/munin-node ファイル中で定義できます。書き方は「env.<NAME> <VALUE>」の形式です。以下、記述例です。

[httping_localhost]
 env.URL     http://pocketstudio.jp/
 env.COUNT   5

もし、変数が設定ファイルで定義されていなければ、httping はエラーを起こしてしまいます。エラーが出ないよう、先のような記述にしています。

では、引き続きプラグインを見ていきましょう。

if [ "$1" = "autoconf" ]; then
 echo yes
 exit 0
fi

こちらは、先ほどの “#%# family=auto”と関連しています。【 echo yes 】としているのは、必ずプラグインを組み込む指定です。

このプラグインでは複雑な指定を使っていませんが、工夫の余地はあります。たとえば、サーバに httping が存在していなければ、”no” を返すように調整することもできます。そうしておけば、自動でプラグインが組み込まれるのを防ぐことが出来ます。

ちなみに、シェル上で httping_ に「autoconf」という引数を与えると、結果を確認することができます。

$ /usr/share/munin/plugins/httping_ autoconf
yes

あるいは、/etc/munin/plugins/httping_localhost などのように、シンボリックリンクを貼った状態であれば munin-run コマンドでも確認できます。

$ /usr/sbin/munin-run httping_localhost autoconf
yes

では、次の  “config” ブロックを見てみましょう。

if [ "$1" = "config" ] ; then
 echo "graph_args -r --lower-limit 0 ";
 echo "graph_title http response $URL";
 echo "graph_category httping";
 echo "graph_info httping response time: $URL";
 echo 'graph_vlabel msec'

 echo "connect.label connect time"
 echo "connect.draw AREA"
 echo "connect.type GAUGE"
 echo "processing.label processing time"
 echo "processing.draw STACK"
 echo "processing.type GAUGE"
 exit
fi

上の「graph_」で始まる指定箇所は、どのようなグラフを描画するか胆になる部分です。Munin が RRDtool でグラフを生成する際の指定です。正確には、rrdgraph に引き渡す画像生成オプション群の指定になります。

  • 「echo “graph_args -r –lower-limit 0 “;」 … rigid(固定)モードで、最小値を0
  • 「echo “graph_title http response $URL”;」 … グラフのタイトル
  • 「echo “graph_category httping”;」 … グラフが属するカテゴリを “httping” に指定
  • 「echo “graph_info httping response time: $URL”;」 … Munin のグラフ説明に表示
  • 「echo ‘graph_vlabel msec’」 … 縦軸のラベルを “msec”(ミリ秒)に指定

そして、その下にあるのは、グラフに描画する要素の定義です。httping の結果から、接続時間と処理時間をそれぞれグラフ化したいので、「connect」と「processing」という名前を仮に割り当てています。そして、各々のグラフの定義を行います。

  • *.labe … グラフ要素のラベル
  • *.draw … AREAは塗りつぶします。STACK はグラフを積み上げます。他には、LINE(線)やDRAW(塗りつぶし)といったオプションを指定することもできます。
  • *.type … GAUGE は、計測値そのまま描画します。COUNTER等も指定できますが、こちらも基本的にrrdgraphのオプションに準じています。

そして最後のブロックは、計測して結果を返す部分です。

$httping_bin -c $COUNT -G -S $URL | tr '+|=' ' ' | \
 awk '{connect+=$9; processing+=$10} END{print "connect.value",connect/'$COUNT'"\n""processing.value",processing/'$COUNT'}'

中身は複雑そうに見えますが、処理の流れはシンプルです。順を追って見ていきましょう。

まずはじめに、httping コマンドを実行しています。httping のオプションとして、

  • -c … 何回計測するか
  • -G … GET メソッドでデータ取得
  • -S … 接続時間と処理時間を別々に表示

このように指定しています。次が実行結果です。

$ httping -c 5 -G -S http://localhost/
PING localhost:80 (http://localhost/):
connected to localhost:80, seq=0 time=0.29+0.52=0.81 ms
connected to localhost:80, seq=1 time=0.12+0.51=0.63 ms
connected to localhost:80, seq=2 time=0.16+0.57=0.73 ms
connected to localhost:80, seq=3 time=0.14+0.50=0.64 ms
connected to localhost:80, seq=4 time=0.13+0.57=0.70 ms
--- http://localhost/ ping statistics ---
5 connects, 5 ok, 0.00% failed
round-trip min/avg/max = 0.6/0.7/0.8 ms

実行結果のうち、重要なのは赤色(接続時間)と緑色(処理時間)の箇所です。この和を HTTP の応答時間としてグラフを描画させます。

次に、この結果をパイプして、整形します。

| tr '+|=' ' '

httpingの結果にたいし、tr で + か = 記号があれば、空白に置換します。これは、後で整形しやすくするためです。実行した結果がこちら。

$ httping -c 5 -G -S http://localhost/ |  tr '+|=' ' '
PING localhost:80 (http://localhost/):
connected to localhost:80, seq 0 time 0.37 0.65 1.02 ms
connected to localhost:80, seq 1 time 0.12 3.36 3.48 ms
connected to localhost:80, seq 2 time 0.12 1.20 1.33 ms
connected to localhost:80, seq 3 time 0.12 20.23 20.35 ms
connected to localhost:80, seq 4 time 0.13 0.73 0.86 ms
--- http://localhost/ ping statistics ---
5 connects, 5 ok, 0.00% failed
round-trip min/avg/max   0.9/5.4/20.3 ms

です。そして、更にパイプして、awk を使った処理を行います。

awk '{
 connect+=$9; processing+=$10
} END {
 print "connect.value",connect/'$COUNT'"\n""processing.value",processing/'$COUNT'
}'

これは、9番目の要素を変数connectに加算、10番目の要素を変数processingに加算するというものです。変数 $COUNT で指定した行数分だけ、足します。

そして、処理の最後に「connect.value XXX」および「processing.value YYY」として値を画面に表示します。このとき、平均値を出すために「connect/’$COUNT’」および「processing/’$COUNT’」を計算しています。

この結果、最終的には次のような結果を返します。

$ /usr/share/munin/plugins/httping_
connect.value 0.226
processing.value 0.746

Muninは、この値を元にグラフを生成するようになります。

以上がザッとしたプラグインの解説です。要は、グラフの定義と値を返す仕組みさえ出来れば、どんなものであれ、数値化されたものは全てグラフ化、視覚化することが出来るのです。

Munin のプラグイン作成は、意外と敷居は高くありません。是非、みなさんもチャレンジしてみてくださいね( ^ω^)