そーだいなるらくがき帳

そーだいが自由気侭に更新します。

エンドポイントの監視 ~ mackerel-plugin-jsonを読み解く

この記事は Mackerel プラグインアドベントカレンダー(全部CRE) の24日目です。

qiita.com

soudai.hatenablog.com

それでは24日目は mackerel-plugin-json です。

mackerel-plugin-jsonはその名のとおり、JSONを可視化するプラグインです。

github.com

2020/12/02 追記

 めちゃめちゃ便利なmackerel-plugin-jsonも進化していて、下記に出てくる多くの問題点が解決しています。

  • インストール
  • カウンター値の計算
  • header付与によるセキュリティ

 これらを解決した機能の説明についてはこちらをご参照ください。

cohalz.co

インストールと設定手順

mackerel-plugin-jsonのインストールですがmackerel-plugin-jsonは公式パッケージに同梱されていません。 そのため自分でbuildする必要があります。 Goの開発環境の作り方がわかんないし、そもそもGoわからん!!って人には みんなのGo がオススメです。 あとは僕は A Tour of Go をやりました。 これであなたもGoを完全にマスター勢です。

A Tour of Go

次にMackerelのプラグインはコマンドですので実行する事ができます。 そしてJSONはWebAPIから取得します。 まずテスト用のJSONを用意します。

# cat test.json
{"hoge":19,"fuga":4,"foo":2}

そしてこのようなJSONに対し、実行すると…

※自分でbuildして/usr/binに配置しましょう。

-- /usr/bin はPATHが通っているので省略出来ます
# mackerel-plugin-json -url=http://localhost/test.json
custom.hoge     19.000000       1514036190
custom.fuga     4.000000        1514036190
custom.foo      2.000000        1514036190

Excellent!! 無事取得しています。 またオプション一覧は次のとおりです。

# mackerel-plugin-json -h
Usage of mackerel-plugin-json:
  -exclude string
        Exclude metrics that matches the expression (default "^$")
  -include string
        Output metrics that matches the expression
  -insecure
        Skip certificate verifications
  -prefix string
        Prefix for metric names (default "custom")
  -url string
        URL to get a JSON

オプション一覧にもあるとおり -exclude-include があるので任意の値に絞り込むこともできます。

# mackerel-plugin-json -url=http://localhost/test.json -include=hoge
custom.hoge     19.000000       1514036432

この機能はmackerel-agent側にもありますので状況に合わせて組み合わせて使ってみてください。

見れるメトリック

このようにJSONを返すWebAPIであればどのようなデータでもグラフにしてくれます。 フォーマットの例を出します。

{
    "bar": "hoge", 
    "foo": 2, 
    "fuga": 4, 
    "hoge": 19, 
    "hoge1": {
        "foo1": 2, 
        "fuga1": 1
    }
}
# mackerel-plugin-json -url=http://localhost/test.json
custom.fuga     4.000000        1514036673
custom.foo      2.000000        1514036673
custom.hoge1.fuga1      1.000000        1514036673
custom.hoge1.foo1       2.000000        1514036673
custom.hoge     19.000000       1514036673

このように入れ子のデータ構造でも対応することができます。 また数値では無く、文字列の場合は無視されます。 ちなみに hoge: [1,2,3] のような配列の時はエラーになります。 このへんの不安定さなどがまだ公式のパッケージに含まれていない要因の一つですね。

実はこれめちゃめちゃ便利なんじゃないの?

そうめちゃめちゃ便利です。 例えば先日のH2Oはモニタリング情報をJSONで返すエンドポイントを持っていますし、mackerel-plugin-h2oでもそれを利用しています。 項目を自分でフィルタリングしたり全て使うのであればmackerel-plugin-jsonでもいいのです! ただし注意点としてmackerel-plugin-jsonはそのままの値をグラフしますのでカウンタ-値に自分で変換したい場合はやはりpluginにする必要があります。 この点は前述のmackerel-plugin-h2oの場合は大きな差ですし、既に公式のプラグインがある場合はそちらが便利です。

自分でエンドポイントを作った時

そうです、mackerel-plugin-jsonで可視化してやることができます。 勿論、自分でエンドポイントを作れる=MackerelのAPIプラグインを直接叩くことが出来るので基本的には不要なケースの方が多いでしょう。

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

有効活用の可能性は無限大

エンドポイントはルータかもしれませんし、Lambdaかもしれません。 しかしJSONさえ返す事ができれば何を使ってもいいのでシンプルで便利に使うことができます。 また前回ご紹介したとおりmkrコマンドでホストを作れば監視のルールやロールも別にすることができます。 この他にも例えば顧客のシステムのエンドポイントに課金集計やユーザ数を返すエンドポイントを仕掛けておき、それを可視化するのも良いでしょう。 例えばWordPressプラグインなんかはかなり相性が良いと考えています(まだ作ってないので誰か!!)

エンドポイントで監視する場合は前回紹介したホストを追加する方法も併せてお試しください。

soudai.hatenablog.com

id:Songmu さんも 監視のための内部的なJSON APIを作るのが良い とこないだのセミナーで言ってましたね。

開発者と監視

このようにmackerel-plugin-jsonは夢が広がるプラグインです。 色んな環境で是非楽しんでみてください。

24日目はモニタリングの切り札としてエンドポイントの監視についてでした。 明日はいよいよ最終日、PostgreSQLの監視です。 引き続き、Mackerel プラグインアドベントカレンダーをお楽しみに!

25日目 mackerel-plugin-postgresql