Chef で mackerel-check-plugins をプロビジョニングする

「Mackerel Advent Calendar 2016」3日目の記事を書くぞー!昨日も僕が担当していて,拡張グラフパーマリンクを試した話を書いた.

kakakakakku.hatenablog.com

もっと枠が埋まってくれると良いのになぁ!

qiita.com

今日は一般的なユースケースとして,Mackerel でプロセス監視を行う方法と,その設定を Chef でプロビジョニングする話を書こうと思う.初歩的な話だけど参考になればと思って.

check-procs

Mackerel でプロセス監視を行う場合,公式に提供されている Check Plugins に入ってる check-procs を使うことになる.シンタックスはシンプルで,--pattern でプロセス名(部分一致)を指定する.実際にはオプションも多く用意されていて,--user でプロセスの実行ユーザーを指定したり,-w-c でプロセス数ごとに監視閾値を変えて設定することもできる.詳しくは README 参照で!

github.com

mackerel-agent-plugins と一緒で,check-procs もバイナリで配布されたコマンドなので,コマンドを叩いて動作確認をすることができる.以下は Fluentd のプロセス監視をする例で,プロセス起動中と停止中でチェック結果が異なっている.

ちなみに --patterntd-agent など曖昧に書いてしまうと誤検知に繋がることにもなるため,絶対パスなど特定して書くのと,--user で実行ユーザーを指定するのは Tips として覚えておくと良いと思う.

$ /usr/bin/check-procs --pattern /usr/sbin/td-agent --user td-agent
Procs OK: Found 2 matching processes; cmd //usr/sbin/td-agent/; user /td-agent/

$ /usr/bin/check-procs --pattern /usr/sbin/td-agent --user td-agent
Procs CRITICAL: Found 0 matching processes; cmd //usr/sbin/td-agent/; user /td-agent/

Chef で mackerel-check-plugins をインストールする

Chef で mackerel-agent と mackerel-agent-plugins をインストールする場合はコミュニティクックブック (cookbook-mackerel-agent) を Berkshelf 経由でインストールする.さらに拡張用のクックブックを cookbooks/my-mackerel に用意して,metadata.rbdepends 'mackerel-agent' と書く.今回紹介するクックブックは全て cookbooks/my-mackerel を前提とする.

github.com

残念ながら mackerel-check-plugins はコミュニティクックブックに含まれていないため,以下のように独自に package でインストールする必要がある.コミュニティクックブックに含めても良いような気がするんだけどなぁー.どうなんだろ?

include_recipe 'mackerel-agent'
include_recipe 'mackerel-agent::plugins'

package 'mackerel-check-plugins' do
  action :install
end

Chef で check-procs を設定する

言ってしまうと簡単で mackerel-agent-plugins と同じように attributes に書くことができる.以下に nginx と php-fpm と td-agent を監視する mackerel-agent-plugins と check-procs の設定を定義した.

node.default['mackerel-agent']['conf']['plugin.metrics.nginx'] = {
  command: '/usr/bin/mackerel-plugin-nginx -port 80'
}

node.default['mackerel-agent']['conf']['plugin.metrics.php-fpm'] = {
  command: '/usr/bin/mackerel-plugin-php-fpm -url=http://localhost/php_fpm_status?json'
}

node.default['mackerel-agent']['conf']['plugin.metrics.fluentd'] = {
  command: '/usr/bin/mackerel-plugin-fluentd'
}

node.default['mackerel-agent']['conf']['plugin.checks.check_nginx'] = {
  command: '/usr/bin/check-procs --pattern /usr/local/nginx/sbin/nginx --user nginx'
}

node.default['mackerel-agent']['conf']['plugin.checks.check_php-fpm'] = {
  command: '/usr/bin/check-procs --pattern "php-fpm: master process"'
}

node.default['mackerel-agent']['conf']['plugin.checks.check_td-agent'] = {
  command: '/usr/bin/check-procs --pattern /usr/sbin/td-agent --user td-agent'
}

このまま Chef でプロビジョニングをすると /etc/mackerel/mackerel.conf に反映される.

$ cat /etc/mackerel-agent/mackerel-agent.conf
apikey = "xxx"
roles = ["xxx"]

[plugin.checks.check_nginx]
command = "/usr/bin/check-procs --pattern /usr/local/nginx/sbin/nginx --user nginx"

[plugin.checks.check_php-fpm]
command = "/usr/bin/check-procs --pattern \"php-fpm: master process\" --user root"

[plugin.checks.check_td-agent]
command = "/usr/bin/check-procs --pattern /usr/sbin/td-agent --user td-agent"

[plugin.metrics.fluentd]
command = "/usr/bin/mackerel-plugin-fluentd"

[plugin.metrics.nginx]
command = "/usr/bin/mackerel-plugin-nginx -port 80"

[plugin.metrics.php-fpm]
command = "/usr/bin/mackerel-plugin-php-fpm -url=http://localhost/php_fpm_status?json"

アラート通知

実際にプロセスが止まると以下のようにアラートが通知される.

f:id:kakku22:20161202230900p:plain

まとめると

Chef で Mackerel の設定を全て管理してプロビジョニングできるようにしておくと運用が楽になるのでオススメ!