kakakakakku blog

Weekly Tech Blog: Keep on Learning!

コマンド失敗時に Mackerel にアラートを通知できる mkr wrap を試した

今年2月頃にリリースされた mkr コマンドの新機能 mkr wrap を試した.mkr wrap を使うと,指定したコマンドの失敗時に Mackerel にアラートを通知できるようになり,Worker プロセスなどのモニタリングに役立つ.詳細は以下の公式ドキュメントに載っている.

mackerel.io

今回は Amazon Linux 2 を検証環境として,最新バージョンの mkr を使う.事前設定が必要な mackerel-agent.conf などは割愛する.

$ mkr --version
mkr version 0.37.0 (rev:5789f43)

サンプルコード

今回はサンプルコードとして,正常時に終了コード 0 を返す,以下の check.sh を使う.

#!/bin/sh

echo 'Success!'

エラー時は終了コード 1 を返す.ブログ記事用にシンプルな実装にした.

#!/bin/sh

echo 'Error!' && exit 1

--name オプション

--name オプションを使うと,任意の監視名を設定できる.デフォルトだと mkrwrap-xxx-yyy というフォーマットの監視名になり,エラー発生時に判別しにくくなる可能性もあるので,--name オプションは基本的に使うと良さそう.今回はサンプルとして shell-checker とした.

$ mkr wrap --name shell-checker -- ~/check.sh
Error!
command exited with code: 1

実際にエラーを発生させると,Mackerel 側にアラートが通知された.監視名も正しく shell-checker になっている.

f:id:kakku22:20190527110044p:plain

--auto-close オプション

実装によっては,次回実行時に正常終了になれば自動復旧と判断できる場合もあると思う.Mackerel の仕様として,通知されたアラートを意図的に終了する必要があるけど,--auto-close オプションを使うと,自動的にアラートを終了できるようになる.必要に応じて,使うと良さそう.実際に試したところ,自動的に終了されていた.

$ mkr wrap --name shell-checker --auto-close -- ~/check.sh
Success!

f:id:kakku22:20190527110157p:plain

なお,公式ドキュメントに記載がある通り,--auto-close オプションを使うと一時領域に実行結果ファイルを保存し,次回実行時に参照する仕組みになっている.今回の検証環境だと /tmp/mkrwrap-shell-checker.json に実行結果ファイルがあった.なお,mkr コマンドの実装を確認したところ,一時領域の取得は os.TempDir() になっていた.

github.com

--notification-interval オプション

通知されたアラートを定期的に再送する場合は --notification-interval オプションを使う.オプション引数としては 10m1h など,再送間隔を指定する.個人的にはアラートが通知された後に指定した間隔で自動的に再送されるのかなと予想したけど,実際に動作確認をしてみると,2回目以降のエラーが発生したときに指定した間隔を超えている場合に再送されるようだった.

$ mkr wrap --name shell-checker --auto-close --notification-interval 10m -- ~/check.sh
Error!
command exited with code: 1

なお,試していたら公式ドキュメントに誤記を発見したため,プルリクエストを送っておいた.既に merge してもらっている.

github.com

Mackerel 関連のドキュメントは今年3月頃に OSS 化されている.気になる誤記などがあれば,積極的にプルリクエストを送ると良さそう!

mackerel.io

まとめ

  • mkr wrap を試した
  • 指定したコマンドの失敗時に Mackerel 側にアラートを通知できるようになる
  • 多くのオプションがあり,他にも今回紹介しなかった --detail オプションや --note オプションもある

「Mackerel アンバサダー」として,積極的にアウトプットをしていくぞ!