2018/02/11

簡単! Mackerel Pluginの作り方

Mackerel、それは鯖管のためのサービス

Mackerel(日本語では鯖)はいわゆる監視サービス。監視データを送るagentを動かせば、データを受け取ってグラフにし、指定した条件になった場合にはアラートをメールやチャットで送ることができる。

監視対象項目はプラグインで拡張することができる。公式のPluginも用意されており、有名どころのミドルウェアやWebのアクセス監視はカバーされている。

プラグインの作り方

「アプリケーションのログを監視したい」「公式プラグインでは用意されていないxxxというソフトのログを監視したい」という場合、プラグインを作る必要がある。ただ、プラグインはSensuと互換性があり、また、MuninのPluginを動かすためのプラグインもあるので、それらをプラグインを探すのはアリだと思う。

とはいえ、なければ作る必要がある。

名前 値 時刻
を標準出力に出せばよいので、作ると言っても、基本的にはそれほど大げさなものにはならない。
名前
Mackerelのグラフでは、「custom.名前」で表示される。
  • ピリオドを2つ以上含むこと
  • 一番右のピリオドより右側にあるものが、グラフになる
値。測定値とか、グラフにする値。
時刻
値はいつの時点だったかを示す時刻。過去の時刻でもよい。
Bash scriptだと
#!/bin/bash
NAME='sample.script.test1'
D=$(date +%s)
V=1
echo $NAME $V $D
でOK。適当に名前をつけて(ただしtestという名前はやめておくこと)実行できるようにchmodしておく。
agentの設定ファイルであるmackerel-agent.confの最後の方に
[plugin.metrics.sample]
command = "上記scriptのフルパス"
と書き足してagentをreloadすれば、準備完了。2,3分でグラフが描かれる。

プラグイン自体、標準出力に値を出力するだけなので、debugもしやすい。ただ、実行時間が1分に制限されているので、ネットワーク越しに値を持ってくるときなどは注意しておいた方がよい。

ここまで抑えると、他人の書いたプラグインも読みやすくなる。例えば、mackerelでWeb Siteのステータスをチェックするも、このルールの中で行っているし、さらに、「名前」「値」「時刻」を複数行出すのもOKだということが読み取れる。

アプリのログを監視する

「〜という文字列が現れたら警告してほしい」というのであれば、check-log プラグインで十分対応できる。出現回数に対してアラートを出すまでの閾値も設定でき、柔軟性も高い。
しかし、「出現の傾向をグラフ化したい」となると、プラグインを作る必要がある。

単純にログファイルをgrep -cしてしまうと、累積値になってしまう。そこで、監視対象の期間に絞り込んだログファイルを一時的に生成する。

#!/bin/bash
ORG_LOG="/var/log/sample.log"
LOG="/tmp/$(basename $0).tmp.$$"

TARGET="$(date +%Y%m%d%H%M -d '1 minute ago')"
grep $TARGET $ORG_LOG > $LOG

NAME='sample.script.test2'
D=$(date +%s)
V=$(grep -c '対象文字列' $LOG)
echo $NAME $V $D

rm -f $LOG
ポイントは、TARGET=の行とその次のgrep。
ログファイルと同じ日付フォーマットを、dateコマンドで出力させる。ただし、「秒」は出力させない。そうすることで、1分の間に出力されたログに絞り込むことができる。
もう1つ、'1 minute ago'オプション。単純に時分までで絞り込むと、プラグインが10秒くらいで起動された時、対象のログは10秒分しか存在していないことになってしまう。1分程度のズレを許容すればこの2行で1分分のログを抽出できるので、妥協するかどうか、判断が必要になるところではある。そもそも、そこまで正確な値が必要であれば、アプリケーション側でそういったメトリクス収集の口を用意すべきだとは思うが。

細かい設定も可能だが

単純に「名前」「値」「時刻」を出力するだけだと、グラフのタイトルに「custom」というprefixがついてしまう。もちろん、これを回避する方法はあるのだが、プラグインが少し複雑になってしまう。ホストのカスタムメトリックを投稿する - Mackerel ヘルプにちゃんと記載されているので、頑張りたい人はそちらを見てほしい。あ、「名前」「値」「時刻」はタブで区切るべきなのか。ヘルプはちゃんと読まないと。

お決まりの一文。本サイトに掲載する情報に関しては、正しいものを提供することを務めていますが、掲載内容から、いかなる損失や損害などの被害が発生しても、責任は負いません。自己責任でご活用ください。



0 件のコメント :

コメントを投稿

Comments on Google+: