Use Mackerel instead of Monit

今日の Mackerel のアップデートでチェック監視の結果に応じてコマンドを実行できるようになった!! 🎉🎉

プロセスの監視をして、もしプロセスが死んだ場合ザオリクをかける方法としてMonitを今まで使っていましたが、 Mackerel に置き換えられるかも…?

試してみます。今回は h2o プロセスを監視してみます。 h2o プロセスが1未満になった場合は systemctl start h2o するようにしてみます。

まずは普通に監視する

以下の内容のファイルを /etc/mackerel-agent/conf.d/check_h2o.conf として作成し、 mackerel-agent をリスタートします。

  • --userオプションを付けているのは h2o を含む余計なプロセスがヒットしないように絞るためです(例えば vim で h2o を含むファイルを開いていたりとか…)
[plugin.checks.h2o]
command = "/usr/local/bin/check-procs --user h2o --pattern h2o --critical-under 1"

監視が始まりました。

h2o を止めるとアラートが出る。

ストップしたらザオリクする

次に、 h2o がストップしていたら復活させるようにしてみます。

先ほど作成した設定ファイルを以下のように書き換えて適用します。

  • アクションオプションを追加している
[plugin.checks.h2o]
command = "/usr/local/bin/check-procs --user h2o --pattern h2o --critical-under 1"

action = { command = "/usr/bin/bash -c '[ \"$MACKEREL_STATUS\" != \"OK\" ]' && /usr/bin/systemctl start h2o" }

アクションでは MACKEREL_STATUSMACKEREL_PREVIOUS_STATUS 環境変数を使うことができます。 MACKEREL_STATUS には直前のコマンドの実行結果が保存されており、 MACKEREL_PREVIOUS_STATUS には直前のコマンドの一つ前のコマンドの実行結果が保存されています。

これを使って h2o プロセスの監視コマンドの結果を見て OK でない場合は復活させるようにしています。

では早速 h2o を止めてみます。

$ pgrep -fl h2o
26697 perl
26705 h2o
26709 h2o
26722 perl

$ sudo systemctl stop h2o

$ pgrep -fl h2o
27340 perl
27358 h2o
27359 h2o
27370 perl

おお、復活!していますね(pid が変わっている)!

感想

単純にプロセスが落ちてたら再起動する、ということしかやらないなら Monit と置き換え可能ですね!便利!! ✨

気をつける点というか、これから確認したいこととしては、 Monit は確か秒単位で監視間隔を設定できたのでプロセスが落ちたら即座に再起動できますが、 Mackerel の場合はどうなんだろう。1分間隔のインターバルだとしたらプロセスが落ちてから復帰するまでに最大1分かかってしまうのでそこだけ確認しておきたい。

あと、注意事項としては公式ブログの例に載っているコマンドが間違っていたのでコピペだと動かないので注意( ' が閉じられていない。サポートに連絡済み)。 対応されていました!