読者です 読者をやめる 読者になる 読者になる

Mackerelのカスタムメトリックをechoで取得する

mackerel webサービス

mackerel

どうもmatsです。

みなさんはサーバの監視は何をお使いでしょうか?

IMではリソースの監視にmackerelを、サービス監視にNagiosを採用しております。

100台超のサーバ群を監視するのにmackerekは非常に便利かつ強力なのですが、問題はNagiosです。

 

IMではほとんどのサーバをオートスケールにて起動しており、そことの相性が非常に悪く超重要なサーバ以外はNagiosに設定を入れていない状況です。

Sensu等も検討したのですが、ものによってはプラグインによって値をmackerelに送れば事足りるものも多いので今回はそちらで対応することにしました。

 

カスタムメトリックの投稿

mackerelのヘルプによると、

http://help-ja.mackerel.io/entry/advanced/custom-metrics

これの通りやると、好きなメトリックをmackerelに投げつけることが出来るみたい。しかしですよ、

プラグイン書くのが面倒くさい!(笑)

 

いや、面倒くさいは言いすぎですが、オートスケールの起動時に余計なデプロイ手順を踏むことになるのがイヤだったので考えました。

(端折りますが、cloud-initを使ってデプロイしているので容量制限があるのです)

 

プラグインを書かずにメトリックスを投稿する

 

よくドキュメントを読むと、プラグインと言っても実行結果が次の形式で標準出力されていれば何でもよくて、golangとかで書く必要はない模様。

 

{metric name}t{metric value}t{epoch seconds}

 

監視対象のメトリックス名: {metric name}

値: {metric value}

実行時のunixtime: {epoch seconds}

すごいミスリードを生みそうな書き方なんですが、3つのパラメータをタブ(t)区切りで出せばいいようで、{}とかは要らないみたいです。(むしろ怒られました。。)

実は echo でいけるんじゃないかと思い、nginxのプロセス数を取得するコマンドを書いてみました。

 

echo "proc_sum.nginxt$(ps -f -u nginx | grep worker | grep -v grep | wc -l)t$(date -u +%s)"

 

監視対象のメトリックス名:  proc_sum.nginx

値(プロセス数):  ps -f -u nginx | grep worker | grep -v grep | wc -l

実行時のunixtime:  date -u +%s

これを実行すると

proc_sum.nginx  3  1430552578

みたいな感じで、標準出力がかえってきます。

これをmackerelの設定ファイルに書いてみます。

※ ダブルクオーテーションをエスケープするところに注意

 

[plugin.metrics.proc_sum_nginx]
command = "echo "proc_sum.nginxt$(ps -f -u nginx | grep worker | grep -v grep | wc -l)t$(date -u +%s)""

 

こんな感じで、mackerel.conf に書いて mackerel-agent を再起動すればmackerel上にグラフが描画されるはずです。

あとはプロセス数が規定値を下回っていたらアラートを上げるようにしてあげれば監視の出来上がりです。簡単ですね。

 

プロセス以外の監視

基本的にワンライナーでパラメータを取得できるものであれば、同じ方法で監視を行うことが出来ます。

例えばですが、弊社の他のところではaerospikeのDISK使用量の監視なども同じ方法で行っております。

※ aerospikeはファイルシステムを介さずに直接ブロックデバイスに書き込むので、OSからDISK使用量を取得することが出来ません。

※ DISK使用量などの情報取得には asinfo という独自コマンドが必要です。

 

[plugin.metrics.used_ssd_ns1]
command = "echo "used_ssd.ns1t$(asinfo -v 'namespace/ns1' -l | grep ^used-bytes-disk | sed -e "s/used-bytes-disk=//g")t$(date -u +%s)""