2020年におけるmackerel-plugin-jsonの使い方

この記事は Mackerel Advent Calendar 2020 2日目の記事です。

はじめに

皆さんはmackerel-plugin-jsonを使っていますか?

個人的にはかなり好きなプラグインなのですが、2017年に書かれたMackerel プラグインアドベントカレンダー以外ではあまり解説されていませんでした。

soudai.hatenablog.com

この記事よりも後に追加された機能を紹介している記事も見当たらなかったので、今回はそれらに絞って紹介していきます。

前回実行したときの結果との差分を投稿する-diffオプション

-diff オプションの後に正規表現を書くと、その正規表現にマッチしたメトリックに対して前回の実行時からの差分をMackerelに投稿することができます。

アプリケーション内に単調増加するカウンターとその値をJSONで返すエンドポイントを実装しておくことでプラグイン側が差分を計算し、例えば1分間でのリクエスト数などそれだけで簡単に取得できるようになります。

GoのアプリケーションであればカウンターとJSONで返すエンドポイントの実装を公式のexpvarパッケージを使うことで簡単に実現することができます。

このように書くことでアプリケーション側(今回はapp)で記録していたカウンターをJSONで返すことができます。

func Handler(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    fmt.Fprintln(w, expvar.Get("app"))
}

今まではこういった差分を送信したい場合はアプリケーション側で差分管理をきちんと実装してあげる必要がありましたが、プラグイン側で差分を計算するようになったためにそういった必要はなくなりました。

特にステータスコードでは表現しにくいアプリケーション固有のメトリックはログに書いてそれを集計するという方法が一般的だと思いますが、ログはディスクの容量や配送経路などいくつか考える必要が出てくるため準備も少し大変でした。

そういった場合でログから集計する方法を取りづらい場合にも役に立つと思います。

上のブログでもこうしたカウンター値にする機能がないことが欠点として書かれていましたが、その欠点をほぼ解決する機能になっていると思います。

ただし注意点としてmackerel-plugin-jsonはそのままの値をグラフしますのでカウンタ-値に自分で変換したい場合はやはりpluginにする必要があります。

エンドポイントの監視 ~ mackerel-plugin-jsonを読み解く - そーだいなるらくがき帳

このオプションは2018/12/13にリリースされた v1.1.0 以降で使えます。

HTTP リクエストヘッダを指定できる-headerオプション

外形監視や check-http のプラグインと同様に-header オプションを指定することでHTTP リクエストヘッダを設定できるようになりました。

-header オプションは -header=User-Agent:mackerel-http-checker/0.0.1 -header=Cache-Control:no-cache のように複数指定することもできます。

このオプションの使い道の一つに、インターネット上から監視用のエンドポイントにmackerel-plugin-jsonでリクエストしたい場合があります。

今までは一般にアクセスをさせないようにするにはIPアドレスで制限するといったことが多かったと思います。

それがこのオプションによって、リクエストヘッダベースの制限も掛けやすくなると思います。

ではどんな時に良いでしょうか? 1つ目は直接自分の管理下に置いていないServer、つまりはレンタルサーバーなどです。 この場合はmackerel-agentのインストールが難しく、監視対象側から定期的にMackerelのAPIを叩くことが難しいでしょう。 そんな場合はモニタリング用のエンドポイントを作成してそこをmackerel-plugin-json経由で監視すればいいのです。

エンドポイントの監視 ~ mackerel-plugin-jsonを読み解く - そーだいなるらくがき帳

このオプションは2020/11/26にリリースされた v1.2.0 以降で使えます。

インストールの手間が改善されている

2017年の記事の当時では自分でビルドしてホストに配布する必要がありました。

mackerel-plugin-jsonのインストールですがmackerel-plugin-jsonは公式パッケージに同梱されていません。 そのため自分でbuildする必要があります。

エンドポイントの監視 ~ mackerel-plugin-jsonを読み解く - そーだいなるらくがき帳

しかし、現在はmkr plugin install mackerel-plugin-json というコマンドを実行するだけでインストールができるようになっているため、簡単に使い始めることができます。

また、2019/7以降にはmackerel-container-agentのプラグイン同梱版のイメージ(mackerel/mackerel-container-agent:plugins)にはデフォルトで同梱されるようになっています。

mackerel-plugin-json は公式プラグインとしては同梱されてはいないのですが、今回 mackerel-container-agent の同梱プラグインとして追加いたしました。

mackerel-container-agent のアップデートを行いました - Mackerel ブログ #mackerelio

おわりに

アプリケーション側で監視用のエンドポイントを持つというのはここ最近かなり一般的になってきたように感じます。

その際に今のmackerel-plugin-jsonでできることを知ることで、そういったエンドポイントをより良く活用できるようになるのではと思っています。