運用中に止めたり上げたりするプロセスをMackerelで監視する
はじめに
運用中に止めたり上げたりするプロセス
システムによってはこういうプロセスが存在するかと思います。
弊社の事例だとバッチサーバーがそれです。
常時動いているプロセスで、Webサーバー側で非同期に処理を実行させるためにキューを登録、バッチプロセスでキューを取り出して実行するプロセスです。
これがデプロイのタイミングの問題でまれにWebサーバー側が新しくなってそこでキュー登録。でもバッチプロセスはまだ古いままで、そのキューを実行しようとして非互換でエラーなどが起きたりしてしまいます。
何も工夫せずにデプロイするとこういう事になってしまうので、弊社のデプロイプロセスでは一旦バッチプロセスを止めておいて全てのデプロイが完了したら、バッチプロセスを再度起動させるようにしています。
監視
運用中に止めたり上げたりすると困るのが監視です。単純にプロセスが落ちたら通知するようにしておくとデプロイの度に通知が来ます。弊社だと多い時は1日に3〜4回デプロイするので何回も通知がきます。
こんなに通知が来てたら、本当にプロセスが落ちた時に「またデプロイかな?」となってしまいます。
監視によるアラートでは、本当にアクションが必要なもの以外は出さないのが基本です。アラートがオオカミ少年化すると本当のトラブルに気づけなくなります。
Mackerelでの監視とアラートの設定
長々と前提の環境の例を書きましたが、うちでは実際にどうやって設定しているかを書きます。
監視対象サーバーにプロセス監視の設定追加
Mackerel Agentを入れている対象のサーバーにプロセス監視のためにcheck-procsプラグインを使います。公式チェックプラグイン集をインストールすると使えるようになります。既にMackerel Agentをインストール済みのAmazon Linuxの場合 $ yum install mackerel-check-plugins
でインストール可能です。
以下のように監視したいプロセスを設定します。
code:/etc/mackerel-agent/mackerel-agent.conf
command = "check-procs -p hoge -x script/hoge -C 1 -c 1 --user ec2-user"
max_check_attempts = 10
設定を追加したら、mackere-agentを再起動します。
$ sudo /etc/init.d/mackerel-agent restart
上記で、hogeというプロセスを監視します。監視の条件は結構細かく設定可能です。
この設定だと、hogeというプロセスは監視対象(-pオプション) だがscript/hogeは監視対象外(-xオプション)。
最大1、最小1プロセス(つまりプロセスが0個だったり2個以上はアラート対象)。プロセスの実行ユーザーはec2-userという条件になります(-C -c --user オプション)。
max_check_attemptsは、監視の条件からずれる事象が10回起きたらアラート対象になるという設定です。Mackerelでは1分に一回チェックが走るのでこうすることでプロセスが落ちてから10分立つとアラートが出ます。
こうすることでデプロイが10分以内に終われば特にアラートは出ません。そして本当に対処が必要な時、例えばデプロイの処理が途中で失敗してバッチ停止されて再起動がされなかった場合や、まったく別の原因でプロセスが落ちた場合はきちんとアラートがされます。
上記ドキュメントに載っていないオプションは、check-procs -hコマンドでわかります。
code:check-procsオプション
$ check-procs -h
Usage:
Application Options:
-w, --warning-over=N Trigger a warning if over a number
--warn-over=N (DEPRECATED) Trigger a warning if over a number
-c, --critical-over=N Trigger a critical if over a number
-W, --warning-under=N Trigger a warning if under a number (default: 1)
--warn-under=N (DEPRECATED) Trigger a warning if under a number (default: 1)
-C, --critical-under=N Trigger a critial if under a number (default: 1)
-m, --match-self Match itself
-M, --match-parent Match parent
-p, --pattern=PATTERN Match a command against this pattern
-x, --exclude-pattern=PATTERN Don't match against a pattern to prevent false positives
--ppid=PPID Check against a specific PPID
-f, --file-pid=PID Check against a specific PID
-z, --virtual-memory-size=VSZ Trigger on a Virtual Memory size is bigger than this
-r, --resident-set-size=RSS Trigger on a Resident Set size is bigger than this
-P, --proportional-set-size=PCPU Trigger on a Proportional Set Size is bigger than this
-T, --thread-count=THCOUNT Trigger on a Thread Count is bigger than this
-s, --state=STATE Trigger on a specific state, example: Z for zombie
-u, --user=USER Trigger on a specific user
-U, --user-not=USER Trigger if not owned a specific user
-e, --esec-over=SECONDS Match processes that older that this, in SECONDS
-E, --esec-under=SECONDS Match process that are younger than this, in SECONDS
-i, --cpu-over=SECONDS Match processes cpu time that is older than this, in SECONDS
-I, --cpu-under=SECONDS Match processes cpu time that is younger than this, in SECONDS
Help Options:
-h, --help Show this help message
岡山でMackerelハンズオンセミナーが開かれます