純規の暇人趣味ブログ

手を突っ込んで足を洗う

Muninプラグインの作り方

      HimaJyun

Raspberry PiにMuninをぶち込んで4鯖を監視させてる@HimaJyunです。

Muninは(比較的簡単に)自分でプラグインを作成して利用する事が可能です、実際、僕の持つサーバ達にもお手製のプラグインをいくつか仕込んであります。

今回はこの「Muninプラグインの作り方」を軽く解説してみようと思います。

Muninプラグインの仕組み

Muninの良い所、それはプラグインが言語を問わずに簡単に作成出来る事です。

簡単がどう簡単って?、所定のフォーマットに沿って標準出力に値を出力してやるだけで後はMuninが上手い具合に加工してくれる事です。

プラグインの引数

Muninは用意したプラグインを実行する際に引数を含む事があります。

  1. autoconf引数を指定して実行
  2. config引数を指定して実行
  3. 引数なしで実行

autoconfはそれ用のコメントを記載した時だけのようですので、最低限必須なのはconfig引数で実行された時と、引数がなかった時です。

実際に作ってみる

僕たちの様なタイプの人間は言葉で説明されるよりコードで説明された方が分かりやすいので、実際にサンプルを作成しながら説明してみようと思います。

今回は例示として「特定のファイルかディレクトリの容量を集計」するプラグインを作成してみようと思います。

使用する言語は各種コマンドとの相性が良いシェルスクリプト(Bash:/bin/bash)を利用するとしましょう。

とりあえず基本形

コードの書き方は人それぞれですが、僕の場合は以下の様にやっています。

#!/bin/bash

# autoconf対応のため
#%# family=auto
#%# capabilities=autoconf

if [ "$1" = "autoconf" ]; then
	# 対応しているか確認する処理
	exit 0
fi

if [ "$1" = "config" ]; then
	# configコマンドの際の処理
	exit 0
fi

# 引数なしの場合の処理

設定値の取得

「/etc/munin/plugin-conf.d/munin-node」に設定した「env.hoge」などは環境変数として渡されるみたいです。

「env.hoge」として設定した場合は、環境変数「hoge」に値が入っています。

今回は対象のファイルを設定するために「env.target」でパスを指定出来る様にしてみようと思います。

と言っても、 Bashは環境変数がそのまま変数に入っていて使えるので今回は(説明の簡略化のために)何も確認しません。

実際は、デフォルト値や設定された値の確認などを行った方が良いです、デフォルト値を設定する場合は以下の様な感じ

: ${target:="/var/www"}

autoconf

autoconfは使わないプラグインも全部設定しやがるありがた迷惑仕様なので個人的には使いませんが、一応対応させておこうと思います。

autoconfに対応させる場合にはスクリプト内に以下のコメントを埋め込みます。(CとかJavaみたいなコンパイル言語だと、このコメントが付けられないので対応不可)

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

そして、第一引数に「autoconf」が指定されている場合に、作成するプラグインが利用出来るかを確認する処理を記載します。

利用できる場合は「yes」を、利用できない場合には「no」を出力します。

if [ "$1" = "autoconf" ]; then
	# 対応しているか確認する処理(今回は面倒なので常にyes)
	echo "yes"
	# exit忘れずに
	exit 0
fi

config

第一引数にconfigが指定されている場合は、そのプラグインがどのように出力するかを指定します。

実際の例は以下の様な感じ

if [ "$1" = "config" ]; then
	# グラフのタイトル
	echo "graph_title File size of ${target}"
	# グラフ縦軸に表示される文字
	echo "graph_vlabel bytes"
	# グラフの設定(--base この値を超えると1kなどの表記になる,-l この値がグラフの下限、今回は0)
	echo "graph_args --base 1024 -l 0"
	# グラフのカテゴリ
	echo "graph_category disk"

	# 「キー.バリュー 設定値」で指定
	# グラフ上での表示
	echo "size.label Size"
	# 値の説明
	echo "size.info File size."
	# グラフの描画方法
	# LINE1 1ピクセルの線
	# LINE2 2ピクセルの線(デフォルト)
	# LINE3 3ピクセルの線
	# AREA 塗りつぶし
	# STACK 積み重ね
	echo "size.draw LINE2"

	# その他にも様々な設定値があります、ググってみてね。(手抜き)

	# exit忘れずに
	exit 0
fi

引数なし(実際の処理)

最後に引数がない場合(すなわち、値を取得する際)の処理を記載します。

今回はduコマンドで測定した値をtailとawkで余計な出力を除去して、表示してやろうと思います。

# 引数なしの場合の処理
# 先ほどのconfig引数の際に設定した「キー(今回の場合size)」を使用して「キー.value 値」で結果を出力する
echo "size.value -b $(du ${target} | tail -1 | awk '{print $1}')"

完成!!

例外処理とか省きまくった酷い作りですが、まぁ、例示なのでそこはご愛敬

以下の様なプラグインが出来上がりました

#!/bin/bash

# autoconf対応のため
#%# family=auto
#%# capabilities=autoconf

if [ "$1" = "autoconf" ]; then
	# 対応しているか確認する処理(今回は面倒なので常にyes)
	echo "yes"
	# exit忘れずに
	exit 0
fi

if [ "$1" = "config" ]; then
	# グラフのタイトル
	echo "graph_title File size of ${target}"
	# グラフ縦軸に表示される文字
	echo "graph_vlabel bytes"
	# グラフの設定(--base この値を超えると1kなどの表記になる,-l この値がグラフの下限、今回は0)
	echo "graph_args --base 1024 -l 0"
	# グラフのカテゴリ
	echo "graph_category disk"

	# 「キー.バリュー 設定値」で指定
	# グラフ上での表示
	echo "size.label Size"
	# 値の説明
	echo "size.info File size."
	# グラフの描画方法
	# LINE1 1ピクセルの線
	# LINE2 2ピクセルの線(デフォルト)
	# LINE3 3ピクセルの線
	# AREA 塗りつぶし
	# STACK 積み重ね
	echo "size.draw LINE2"

	# その他にも様々な設定値があります、ググってみてね。(手抜き)

	# exit忘れずに
	exit 0
fi

# 引数なしの場合の処理
# 先ほどのconfigで出てきた「キー.value 値」で結果を出力する
echo "size.value -b $(du ${target} | tail -1 | awk '{print $1}')"

実際に使ってみる

他のプラグイン同様に「/usr/share/munin/plugins/」に移動させてシンボリックリンクを貼るとしましょう。

今回作成したプラグインのファイル名は「filesize」だと仮定した場合、以下の様な手順になります。

sudo mv filesize /usr/share/munin/plugins/
sudo chown root:root /usr/share/munin/plugins/filesize
sudo chmod 755 /usr/share/munin/plugins/filesize
sudo ln -s /usr/share/munin/plugins/filesize /etc/munin/plugins/
sudo service munin-node restart

テスト

プラグインの動作テストには「munin-run」コマンドが役立つでしょう。

#sudo munin-run (プラグイン名) (引数)
# autoconfの結果確認
sudo munin-run filesize autoconf
# configの結果確認
sudo munin-run filesize config
# 値確認
sudo munin-run filesize

グラフ生産をコマンドで行う場合は以下の様にすればOK

sudo su - munin --shell=/usr/bin/munin-cron

簡単!!

これが今回作成したプラグインで出力されるグラフです、ちょっとサンプル取得の時間が短すぎてカクカクグラフですが、容量が出力されています。
munin-plugin-create-001

この様な感じで、Muninのグラフはとても簡単に作成でき、極論、数値で表せるものであれば何でもグラフ化出来てしまうのです。(なんでもグラフ化ツールとかって表現されてたり?)

気に入らなければ作るスタイルで行きましょう!!

 - サーバ運営