◆φ(..)メモメモ
今日の投稿は、昨日公開した 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 のプラグイン作成は、意外と敷居は高くありません。是非、みなさんもチャレンジしてみてくださいね( ^ω^)