今年2月頃にリリースされた mkr
コマンドの新機能 mkr wrap
を試した.mkr wrap
を使うと,指定したコマンドの失敗時に Mackerel にアラートを通知できるようになり,Worker プロセスなどのモニタリングに役立つ.詳細は以下の公式ドキュメントに載っている.
今回は 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
になっている.
--auto-close
オプション
実装によっては,次回実行時に正常終了になれば自動復旧と判断できる場合もあると思う.Mackerel の仕様として,通知されたアラートを意図的に終了する必要があるけど,--auto-close
オプションを使うと,自動的にアラートを終了できるようになる.必要に応じて,使うと良さそう.実際に試したところ,自動的に終了されていた.
$ mkr wrap --name shell-checker --auto-close -- ~/check.sh Success!
なお,公式ドキュメントに記載がある通り,--auto-close
オプションを使うと一時領域に実行結果ファイルを保存し,次回実行時に参照する仕組みになっている.今回の検証環境だと /tmp/mkrwrap-shell-checker.json
に実行結果ファイルがあった.なお,mkr
コマンドの実装を確認したところ,一時領域の取得は os.TempDir()
になっていた.
--notification-interval
オプション
通知されたアラートを定期的に再送する場合は --notification-interval
オプションを使う.オプション引数としては 10m
や 1h
など,再送間隔を指定する.個人的にはアラートが通知された後に指定した間隔で自動的に再送されるのかなと予想したけど,実際に動作確認をしてみると,2回目以降のエラーが発生したときに指定した間隔を超えている場合に再送されるようだった.
$ mkr wrap --name shell-checker --auto-close --notification-interval 10m -- ~/check.sh Error! command exited with code: 1
なお,試していたら公式ドキュメントに誤記を発見したため,プルリクエストを送っておいた.既に merge してもらっている.
Mackerel 関連のドキュメントは今年3月頃に OSS 化されている.気になる誤記などがあれば,積極的にプルリクエストを送ると良さそう!
まとめ
mkr wrap
を試した- 指定したコマンドの失敗時に Mackerel 側にアラートを通知できるようになる
- 多くのオプションがあり,他にも今回紹介しなかった
--detail
オプションや--note
オプションもある
「Mackerel アンバサダー」として,積極的にアウトプットをしていくぞ!