munin の独自プラグインを作成して監視対象を追加するお話です。
意外と手こずったのでメモとして残しておきます。
目的
監視対象となるサーバーの上で現在動作している Docker コンテナの数を munin で監視したい。
再起動やアップデートを行った直後、Docker コンテナが起動していない状態のままうっかり放置してしまうことがあるのでプロセス数が 0 の時に警告を出したいというのが目的です。
あまり複雑なプラグインではなく、単に現在のプロセス数を返せば良い簡単なもので良いです。
プラグインのコード
慣れの関係から ruby スクリプトで書きました。
何でも好きなもので書けるのがよいですね。
docker ps を実行してその行数を返すだけのものです。
processnum.value %d にプロセスの数が入って表示されます。
なお autoconf は中途半端な状態で省略しています。
# !/usr/bin/env ruby
# %# family=other
# %# capabilities=autoconf
# ---- command
if ARGV[0] == 'config' then
puts "graph_title docker process num"
puts "processnum.label docker process"
puts "processnum.type GAUGE"
puts "processnum.info docker container process"
end
if ARGV[0] == 'autoconf' then
if File.exists?('/var/run/docker.sock') then
puts 'yes'
exit 0
else
puts 'no'
exit 1
end
end
if ARGV[0] == 'suggest' then
exit 0
end
# ---- value
num = 0
open("| docker ps -q") do |fp|
fp.each do |line|
num += 1
end
end
# ---- output
printf("processnum.value %d\n", num)
exit 0
munin-node のプラグインとして登録
作成したコードを適当なところに置いてプラグインディレクトリにシンボリックリンクを張ります。
Debian なら /etc/munin/plugins/ の下です。
/usr/share/munin/plugins/ の下に置かないと munin-node-configure に表示したり管理したりできませんが、できなくてもあまり困らないのでこだわらない向きには位置を気にせずとも良いかと。
実行ユーザー
該当スクリプトは内部で docker ps コマンドを実行しているので、munin-node は docker を実行する権限を持っている必要があります。
munin-node の実行ユーザーを Docker グループにするよりも、プラグインの実行ユーザーを指定した方が良さそうです。
Debian だと /etc/munin/plugin-conf.d/munin-node にプラグイン毎の実行設定が記述されています。
ここの末尾に
[docker_ps]
user root
を追加してプラグインが root 等の docker 実行可能なユーザーで呼ばれる様に設定します。
munin-node サービス再起動
これで munin-node 側の準備は揃いましたので service munin-node restart 等で munin-node を再起動しておきます。
以上で munin-node 側の作業は終了。
munin サーバー側の設定
ここまでやるとサーバー側に新しいプラグインの情報が表示されるようになっているはずです。
ですがここで一番悩みました。
そのままだと値が 3ミリとかいう単位でしかプロットされなかったのです。
単位を揃える
プラグインは単純にプロセス数を整数値で渡しているのですが、それより小さな値で出る場合のお話。
何か設定が悪いのでは無いかとさんざん悩んだのですが、結局は単位の問題でした。
妙にプロット値が小さいときは、期待値の何分の一か計算してみて下さい。私の場合は約 1/300 でした。この値で気がついたのですが、300という数字は 300sec、munin が node を監視する間隔の時間でした。
このような場合、munin-node から与えられる数値は 1sec 単位での累積、時間積分値を期待しているようです。
~~~~
追記
プラグインの config 設定で type が ABSOLUTE だと積分値で出てくる様です。
type を GAUGE に設定すると、value の値がそのままプロットされました。
~~~~
プラグイン側で 300倍するというのはスマートではありません。
サーバーの巡回時間に影響するものなのでサーバー側で設定します。
munin の設定ファイル(debian では /etc/munin/munin.conf)のサーバー設定の中にノード設定を追加します。
[ノード名]
address ノードアドレス
use_node_name yes
docker_ps.processnum.cdef processnum,300,*
cdef の部分がそれにあたります。
この設定では processnum の値を 300 倍にしています。
アスタリスクは演算子で、割り算等他の四則演算も設定できるようです。
警告を出す
今回の目的は、docker が実行中のプロセスを抱えているかどうかの監視なので、もしプロセス数が 0 のときはおかしいとして警告状態にしたいところです。
警告設定はプラグインの config でも指定できるのですが、監視対象はシンプルにロジックはサーバーにというポリシーからサーバー側設定に記述します。
[ノード名]
address ノードアドレス
use_node_name yes
docker_ps.processnum.cdef processnum,300,*
docker_ps.processnum.critical 1:
この設定では processnum の値が 1 より小さかった場合(すなわち0)の時に障害扱いとします。
critical 時はメールを出す様に他の箇所で設定したありますので、もし docker がなにもコンテナを実行していないときは警告メールが届くようになりました。
みなさんも色んな物を監視してみて下さい。