Mackerelのエージェントにユーザ定義のメトリックを定義（我流）

　はてなのサーバ監視サービス「[Mackerel](http://mackerel.io/)」(鯖)のベータ版サービスが開始されました。
　大量のサーバでも状態をグラフとかに可視化してわかりやすく監視できるよ！ってサービスで、競合も多いのですがMackerelは設定が簡単なのとグラフがカッチョイイのがいいですね。

　とりあえずプライベートのサーバ(CentOS 5.10)にエージェントをインストールしてみましたが、すぐ監視が開始されました。
![スクリーンショット 2014-05-09 11.53.30trim.png](https://qiita-image-store.s3.amazonaws.com/0/42140/32240f52-9f70-f3ea-ab23-43414591fbc7.png)
　簡単すぎる！
　そしてかっちょいい！

## 参考記事
セットアップまでは以下のサイトで大変わかりやすく解説されています。
[Mackerelを始めてみた](http://dev.classmethod.jp/cloud/mackerel-firsttime/)

## 現状ハマり
　「Services」でグラフを選択しようとすると、Chrome(Windows)の場合メニュー表示が白地いに白文字になってしまいます。
　最初選択できないのかとおもって焦りました。すぐ修正されると思いますが…。
![スクリーンショット 2014-05-09 10.27.39trim.png](https://qiita-image-store.s3.amazonaws.com/0/42140/1d12ed2d-0b0e-bff2-d1c1-ceaae631fdec.png)

# ユーザ定義のメトリックを定義

## 原理
　サーバ監視のために、監視対象のサーバにエージェントと呼ばれるプログラムをインストールします。
　デフォルトでも様々な情報を送信してくれますが、独自の項目（メトリクス）を追加できます。

　設定方法はヘルプに解説が載っています。
 [ユーザ定義のメトリックを投稿する](http://help-ja.mackerel.io/entry/advanced/custom-metrics)

　要するに以下の形式で標準出力するスクリプトを作って、エージェントの設定あファイルに登録すればOKですね。
`メトリック名``TAB``値``TAB``Unixエポックタイム`

※ sensu互換なので、sensu用のスクリプトも使えるようです。

## ここで作るメトリック
　ディスクの特定のボーリュームの空き容量をメトリックとして投稿するようにしてみます。
　メトリック名は「custom.disk.free」とします。

※ エージェントの既存の機能でもボリュームごとに最新の値を表示することができるので若干被りますが…

　作成方針としては、`df` コマンドの出力から監視対象のボリュームの空き容量の値を抜き出すことにします。

```
# df
Filesystem           1K-ブロック    使用   使用可 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
                     259329068 127884584 128770128  50% /
/dev/sda1               101086     38123     57744  40% /boot
tmpfs                   257428         0    257428   0% /dev/shm
```

　以上のようなdf実行結果から、「VolGroup00-LogVol00」ボリュームの空き容量（使用可）の値を取得したいので、awkで３行目の３カラム目を抜き出します。

```
#  df | awk '{ if (NR==3) {print $3} }'
128770128
```

空き容量の`128770128`を抜き出せました。
※ 他の行から取得する場合は、`NR==3`の`3`を変更してください。
これに、メトリクス名とUNIXエポックタイムを追加すればいいですね。
以下のようにします。

```
#  echo -e "disk.free\t`df | awk '{ if (NR==3) {print $3} }'`\t`date '+%s'`"
disk.free       128770128       1399605653
```

これを元にスクリプトを作ってみましょう。

## スクリプト

こんな感じで作ります。
置き場所は、エージェントの設定ファイルと同じく/etc/mackerel-agent/ にしてみましたが、どこに置くのがいいのかな…

```bash:/etc/mackerel-agent/check_disk_free.sh
#!/bin/sh
echo -e "custom.disk.free\t`df | awk '{ if (NR==3) {print $3} }'`\t`date '+%s'`"
```

`chmod 755 /etc/mackerel-agent/check_disk_free.sh` で実行権限つけてください。

## スクリプトを登録

エージェントの設定ファイル(`/etc/mackerel-agent/mackerel-agent.conf`)に以下の行を追加してください。

```text:/etc/mackerel-agent/mackerel-agent.conf
[sensu.checks.diskfree]
command = "/etc/mackerel-agent/check_disk_free.sh"
type = "metric"
```

`[sensu.checks.diskfree]`の部分は`sensu.checks.`は固定で、ピリオドの後の`diskfree`だけが自由に決められるようです。
ただ、この部分はローカルでの識別用でサーバへの投稿時には使用されません。


## エージェントに適用

エージェントを再起動して設定の変更を反映させます。
`#/etc/init.d/mackerel-agent restart`

## 実行結果

　ここで作ったメトリクスは１分に１回程度の頻度で投稿されているようです。
　しばらくしたらMackerelのサイトで確認してみましょう。

　`Hosts`の項目から対象サーバの状態を開いてください。
以下のようにログが記録されていれば成功です。
![スクリーンショット 2014-05-09 11.47.10trim.png](https://qiita-image-store.s3.amazonaws.com/0/42140/4ddcb8ea-0e12-32f8-9883-adceb7279bbd.png)

### 表示内容
　メトリクス名の「custom.disk」までで１つのグラフにまとまられ、最後のピリオドの後の「free」の部分はグラフ内の項目になります。
　ボリュームごとに空き容量を記録したい場合は、「custom.disk.hda_free」「custom.disk.hdb_free」のようなメトリクスにるすると、いいんじゃないでしょうか。


### ハマり点・その他

* 反映されるグラフ

　最初`Services`のほうのグラフを見ていて、項目が増えない！っとハマってました。
　`Hosts`側の個別のグラフにしか表示されないのですね…

* メトリック名

　既存の `disk` メトリックスに追加したかったので「disk.free」にしてみましたが別途、diskというグラフがもう１つ出来てしまいました。
　紛らわしいので「custom.disk」に変更しました。

* アラート機能は今後の実装とのこと

　ディスクの残容量が設定値以下になったらメースなどで通知ほしいところですが現状は未実装。
　アラート機能は今後の実装とのことです。
　正式版を楽しみに待ちましょう。

* 監視頻度

　１分に１回のようです。設定で変更できるかはわかりません。

* メトリック名をtypoしたとき

　一旦投稿されたメトリックのグラフはずっと残ってしまうようです。正式版では削除出来るようになるかもしれません。