Hateburo: kazeburo hatenablog

SRE / 運用系小姑 / Goを書くPerl Monger

コマンドを実行しその終了ステータスコードメトリクス化するMackerelカスタムプラグイン

Mackerel Advent Calendar 2020 15日目の参加記事です。

キャッシュの更新やなんらかの同期を行うコマンドなどをcronにて実行している場合、メンテナンスや一時的なネットワークの不調によりコマンドがエラーになっても問題ないが、一定時間以上エラーが続くと困る、みたいなことはあると思われます。

mackerelでは、cronのコマンドがエラーになった際に、通知する方法としては mkr wrap が利用できます。

mackerel.io

crontabに

* * * * * mkr wrap -- /path/to/your-batch ...

とすることで、コマンドが失敗した際に、アラートをあげることができます。ただmkr wrapでは1度でもエラーとなるとアラートとなってしまうため、前述したような一定時間エラーになっても問題ないものでもアラートが上がってしまいます。

そこで、mackerel-agentをcrondのように利用し、コマンドが終了ステータスコードをメトリクス化するカスタムプラグインを作成し、ホストのメトリック監視にてエラーが続いている状況がないかを確認する方法を考えました。

mackerel-plugin-command-status

できたのが、こちらのmackerelカスタムプラグインです

github.com

元々Perlでさっと作ったものでしたが、この記事を書くためにGoで書き直しました。mkr plugin install で導入が可能です。

使い方

メトリクスの名前を指定し、ハイフン2つのあとに実行するコマンドを書きます。

mackerel-agent.conf で実行する場合はこんな形になります。

[plugin.metrics.update-cache]
command = "/path/to/mackerel-plugin-command-status --name update-cache --timeout 10s -- /path/to/cmd-fetch-cache"

そして、5回以上(5分以上失敗し続けている場合)アラートをあげたいという場合は

f:id:kazeburo:20201214102920p:plain

こんな形で閾値を設けることで、監視ができるのではないかと思います。

あとがき

Mackerelで監視されていないとあるサーバがサービスに投入されてしまっていたことで障害に気づくのが遅れた問題に対して、1分毎にcronでホストのステータスをmackerelのapiから取得しておいて、consulサービスのチェックスクリプトからそれを確認し、workingでなかったらサービスから自動で外れるという対策を行っておりました。

ところが、mackerelの障害・メンテナンス時にcronのエラー通知が大量にきてあたふた対応が必要になってしまっていたので、なんとかそれを避けるために考えた仕組みです。ただし、これでもmackerelがメンテナンス終了するタイミングでアラートが来てしまうのが悩ましいところ。

作ってみたもののこれ以外の用途には使ってない感じですが、いい使い道があればどうぞー。