Swarmの運用用にdocker statsコマンドを監視するMuninのplugin作った

最近、Docker Swarmの運用を始めて一台のマシンに存在するコンテナが増えてきたので、監視用のmuninのプラグイン作りました。

取得できる項目

docker statsと同等の情報が取得できます。NET I/OとBLOCK I/Oは積算値ではなく、前回との差分値を出力します。

CONTAINER           CPU %               MEM USAGE / LIMIT       MEM %               NET I/O             BLOCK I/O           PIDS
13f260e1b3d0        0.12%               6.656 MiB / 31.42 GiB   0.02%               6.51 MB / 9.65 MB   0 B / 0 B           0
6cf6538e3e49        0.14%               6.574 MiB / 31.42 GiB   0.02%               6.66 MB / 9.78 MB   0 B / 0 B           0
281b654e09b0        0.00%               86.28 MiB / 31.42 GiB   0.27%               31.4 MB / 13.3 MB   0 B / 250 MB        0
e22e2c422c87        0.11%               100.7 MiB / 31.42 GiB   0.31%               176 MB / 115 MB     0 B / 1.61 GB       0
24b3ddd12df9        0.01%               15.14 MiB / 31.42 GiB   0.05%               3.51 GB / 3.31 GB   0 B / 0 B           0
802c79ba9e22        0.29%               174.6 MiB / 31.42 GiB   0.54%               176 MB / 98.4 MB    0 B / 45.1 kB       0
e3e675c2f0be        0.04%               150.3 MiB / 31.42 GiB   0.47%               891 kB / 1.52 MB    0 B / 56.7 MB       0

インストール方法

ここからリリースファイルをダウンロードします。

github.com

配置は通常のMuninプラグインと同じです。

chmod +x ./docker_stats
sudo mv ./docker_stats /usr/share/munin/plugins/
sudo ln -s /usr/share/munin/plugins/docker_stats /etc/munin/plugins/docker_stats
sudo /etc/init.d/munin-node restart

設定

プラグインの設定ファイルに、dockerコマンドを叩けるユーザを設定してください。

cat <<EOF > /etc/munin/plugin-conf.d/docker_stats
[docker_stats]
user docker
EOF

動作確認

ncコマンド等でmunin-nodeに接続して動作確認してみます。

$ nc localhost 4949
# munin node at yourhostname
config docker_stats
...
...
fetch docker_stats
...
...

その他

DockerのSwarmモードで運用している都合上、仕様もそれに合わせたものになっています。

グラフのキー

同一イメージから複数のコンテナを立ち上げた場合などはイメージ名と番号とハッシュが振られますが、イメージ名と番号で識別するようにしています。

nginx.1.r50244fy04sj80wj8sqik952w
nginx.2.z163fmegq9efrvb7y6fw4hgam
nginx.3.yhq1mcmevwm5eybhjphofsfti

この辺り調整すれば他のルールに変更することもできます。

https://github.com/yomon8/docker_stats/blob/v0.1.0/graph/graph.go#L24-L36

不要なグラフのキーを削除

クラスタ運用を前提に作っている関係で、コンテナが他のマシンに移動してしまった時にも、古いグラフを削除しないようにコンテナの情報を containerlist というファイルにjson形式で保持しています。不要なグラフ消したい場合はこちらの中身(json形式)を調整してください。

MUNIN_PLUGSTATE の変数は通常 /var/lib/munin/plugin-state/<username>ディレクトリを指します。

rm ${MUNIN_PLUGSTATE}/containerlist

所感

Golangだとdockerコマンドの内部処理そのまま使えるので、こういった開発はかなり楽にできました。