Diary of a Perpetual Student

Perpetual Student: A person who remains at university far beyond the normal period

Mackerelのメトリックプラグインをチェックプラグイン化するプラグイン

Mackerelのメトリックプラグインやチェックプラグインは、特定のフォーマットで標準出力に書き出すという要件さえ満たしていればどのように作ってもOKです。Go言語以外でも作れるし、なんならmackerel-agent.confにシェルスクリプトを書いても動きます。標準出力を介してやりとりするのがUNIX哲学っぽくて良いですね。

今回はこの性質を活かして、メトリックプラグインをチェックプラグイン化するチェックプラグインを作ってみたのでご紹介します。

github.com

使い方

インストールはコマンド一発です。

sudo mkr plugin install Arthur1/check-value-from-metrics-plugin

次に、mackerel-agent.confに以下のように追記していきます。

+[plugin.checks.check-value-from-mackerel-plugin-anyone]
+command = "mackerel-plugin-uptime | /opt/mackerel-agent/plugins/bin/check-value-from-metrics-plugin -target uptime.seconds -gt 559000"

チェックプラグイン化したいメトリックプラグインを実行し、パイプでcheck-value-from-metrics-pluginに渡します。前回の実行結果をファイルに保持して差分値を計算しているような、副作用があるプラグインを指定する際には、-tempfileオプションを別に設定するなどの注意が必要です。また、シェルのパイプを利用したいので、敢えて配列を使わない記法にしていることに注意してください。(参考: mackerel-agentのコマンド実行と配列指定のススメ

-target オプションには監視したいメトリックのキーを書きます。例えば、mackerel-plugin-uptime(uptimeをメトリック化するプラグイン)は

uptime.seconds   558926  1705885503

のような出力をするので、uptime.secondsをtargetに指定しているというわけです。そして、メトリックの比較条件を -gt 559000 のように指定します。この例であれば、uptime.secondsの値が559000よりも大きければチェック監視のアラートを発報します。

ここまで設定してmackerel-agentを再起動して待っていると、以下のようにチェック監視のアラートが発報されました。

使い道

さて、これだけであれば、Mackerel上のホストメトリック監視でもできることをなぜかチェック監視で再現しただけとなります。なぜ敢えてチェック監視で行おうとしているのでしょうか。

チェック監視が他の監視と違うポイントの1つとして、actionが設定できることが挙げられます。チェック監視スクリプトの実行後、その結果を元に任意のコマンドを実行できます。

mackerel.io

例えばuptimeが一定以上の値になっていたら1分後にサーバを再起動したい際には以下のようにactionを指定します。

 [plugin.checks.check-value-from-mackerel-plugin-anyone]
 command = "mackerel-plugin-uptime | /opt/mackerel-agent/plugins/bin/check-value-from-metrics-plugin -target uptime.seconds -gt 559000"
+action = { command = "bash -c '[ \"$MACKEREL_STATUS\" = \"CRITICAL\" ]' && shutdown -r +1" }

メトリックプラグインであるmackerel-plugin-uptimeには、兄弟としてチェックプラグインのcheck-uptimeもあります。ただ一般にメトリックプラグインとチェックプラグインの対が世の中にあるとは限りませんし、自作する時も両方するのは大変ですから、メトリックプラグインをチェックプラグインに変換するプラグインは一定の需要があると思っています。