Mackerel の mkr wrap コマンドを使って cron バッチジョブを監視する

こんにちわ ttaka です。

これから Mackerel を使ったプロジェクトに関わっていくことになりそうなので
積極的に Mackerel を触って行こうと思います。

まず今回は mkr コマンドを使用しての cron バッチジョブ監視設定をやってみました。

想定する読者

  • Mackerel のアカウントを取得している人
  • Mackerel で cron などのバッチジョブを監視したい人

記事を書こうと思ったきっかけ

mkr コマンドを使用することで、バッチジョブなどをMackerel 経由で簡単に監視できるのが最高!!

バッチジョブなどスクリプトの実行結果を監視したいという要望は多いと思います。

一番簡単な方法としては、スクリプト内で異常時にメールを送信して検知するという方法です。
ただ、実際にやってみると

  • メールを見逃してしまい検知が遅れてしまった
  • ダッシュボードなどがないため障害状況の管理が煩雑

などが発生しやすく、監視システムを導入して障害状況を管理するのが良いと思います。

監視対象のスクリプトが、使用している監視システムの仕様に沿っていれば
すぐに監視システムを経由して監視することも可能です。

ただ、そうではない場合はスクリプトを修正する
あるいは出力するログを監視することになるかと思います。

だいたいの監視システムでログを監視するプラグインが提供されてはいますが
ログの監視は検知条件となる監視文字列を正規表現でマッチさせて……など
設定が煩雑になりがちなので、スクリプト内の終了ステータスから監視するのが良いと思います。

mkr コマンドであれば、スクリプトが終了ステータスを適切に返すようになっていれば
監視スクリプト自体を修正することなく簡単に監視が開始ができます。

実際の設定

動作環境

  • OS: Amazon Linux release 2 (Karoo)
  • mkr: version 0.39.1 (rev:f67d9a3)

やること

  1. 新規ホストの登録(mackerel-agentのインストール)
  2. CLIツール mkr のインストール
  3. 動作確認
  4. cron バッチジョブを監視追加

1. 新規ホストの登録(mackerel-agentのインストール)

まずは新規ホストを登録する作業ですが
こちらについては Mackerel のスタートガイド を参考に進めれば簡単にできるかと思います。

2. CLIツール mkr のインストール

こちらも yum コマンド一発でインストールができます。
インストール後は念のためバージョンも確認しておきましょう。

# yum install mkr
・・・
Installed:
  mkr.x86_64 0:0.39.1-1.amzn2

Complete!

# mkr --version
mkr version 0.39.1 (rev:f67d9a3)

3. 動作確認

いきなり cron テーブルを修正する前に可能であればアラート発生時の通知先などを
動作確認をしておくのが良いかと思います。

今回使用する監視対象スクリプトは "Hello World!" と出力したあとに exit 1
終了する単純なスクリプトになっています。

mkr コマンドを経由するとメッセージ command exited with code: 1
出力されていますが、これは mkr 側で出力する処理になっています。

これで無事に設定された通知チャンネルに通知が送信され
ダッシュボードにもアラートが追加されたことを確認できました。

使用したスクリプト
/usr/local/src/test-cron-bash.sh

#!/bin/bash

echo "Hello World!"
exit 1

コマンド実行結果

# /usr/local/src/test-cron-bash.sh
Hello World!

# mkr wrap --name "test-cron-bash Exec cron" --detail -- /usr/local/src/test-cron-bash.sh
Hello World!
command exited with code: 1

ダッシュボードからアラートを確認

4. cron バッチジョブを監視追加

あとは cron テーブルを書き換えれば設定完了です。

cron テーブルの書き換え

# crontab -e
・・・
* * * * * /usr/local/src/test-cron-bash.sh
↓
* * * * * mkr wrap --name "test-cron-bash Exec cron" --detail -- /usr/local/src/test-cron-bash.sh

ユースケース

ヘルプ: mkr wrapでcronなどのバッチジョブを監視する

上記ヘルプを見ていただくとわかる通り
mkr wrap コマンドで使用できるオプションは上で紹介した以外にもあります。
その中からいくつか抜粋して、こんな使い方ができるのではないかというのを紹介したいと思います。

通知レベルを WARNING としてアラートをあげる

デフォルトでは通知レベルが CRITICAL となっていますが
-w, --warning オプションを設定することで通知レベルが WARNING としてアラートすることができます。

cron から実行するスクリプトには夜間帯に実行されるスクリプトも多いかと思います。
例えば、そのようなスクリプトで異常を検知した場合、日中営業時間帯に対応すれば問題ないアラートであれば
WARNING にすることで不要なエスカレーションを防ぐことができます。

コマンド成功時にアラートを自動閉塞する

デフォルトでは自動閉塞しないため、アラートは手動で明示的に閉じる必要があります。
ただ、スクリプトによっては再実行して正常終了するのであれば、復旧作業が不要なものもあるかと思います。

-a, --auto-close オプションを設定することで、既報のアラートがある時
後続の同じ設定のバッチジョブが成功した場合にそれを自動閉塞します。

例えば、毎時実行されるスクリプトが異常終了した場合に
このオプションを設定することで次回の cron 実行を待つなどの運用も可能かと思います。

また、その場合は異常が継続した場合はデフォルトでは通知がおこなわれないため
-I, --notification-interval オプションを設定追加することで
異常が継続した場合も検知できるような設定しておくのが良いかと思います。

最後に

cron 登録されたバッチジョブの監視は意外と手間がかかることが多かったので
mkr wrap コマンドを使って簡単に監視登録出来るのは個人的に感動しました。

この記事がだれかのお役に立てば幸いです。

参考