Amazon RDS の拡張モニタリング情報を Munin で可視化する

# はじめに
先日 Amazon RDS で OS の詳細情報を取得できるようになったので、Munin に表示してみました。

# 概要
Amazon RDS に追加された拡張モニタリング機能により、RDS インスタンスの OS リソース情報が CloudWatch Logs に出力されるようになりました。
今回は CloudWatch Logs のメトリックフィルタを使用して、ロードアベレージを CloudWatch メトリックに変換、Munin でグラフ化してみます。

# やってみた
## Amazon RDS インスタンスの拡張モニタリングを有効化
拡張モニタリングの有効化は、クラスメソッドさんのブログ記事 [[新機能]Amazon RDSでOSの詳細情報を取得できるようになりました！](http://dev.classmethod.jp/cloud/aws/rds-enhanced-monitoring/) に手順と設定例があります。

## CloudWatch Logs の画面でメトリックフィルタを作成
![1-1.png](https://qiita-image-store.s3.amazonaws.com/0/23579/81782224-6093-f213-0d59-4a427dcc9e95.png)

Create Metric Filter ボタンをクリック。

## Define Logs Metric Filter 画面で Filter Pattern を指定
![1-2.png](https://qiita-image-store.s3.amazonaws.com/0/23579/a36d04eb-e840-784d-1e0e-bd634a0ff4bf.png)

今回は Filter Pattern にインスタンス ID と LoadAverage 5分間の平均値をチェックするように設定します。

Filter Pattern
`{ $.instanceID = "インスタンスID" && $.loadAverageMinute.five >= 0.00 }`

Test Pattern ボタンで Filter をテストしたら、Assign Metric ボタンをクリック。

## Create Metric Filter and Assign a Metric 画面で Filter Name と Metric の詳細を設定
![1-3.png](https://qiita-image-store.s3.amazonaws.com/0/23579/bc2ae308-20f3-3084-b30d-53b1853e5b04.png)

Metric の詳細を次のように設定、Create Filter ボタンをクリック。

- Metric Namespace: RDSOSMetrics
- Metric Name: インスタンスID_LoadAverage
- Metric Value: $.loadAverageMinute.five


Metric Filter が作成されました。
![1-4.png](https://qiita-image-store.s3.amazonaws.com/0/23579/65052f52-5db8-3480-f2cb-36348dbb0512.png)

Metrics の Custom Metrics から「RDSOSMetrics」を選択すると、作成した Metric が表示されます。
![1-5.png](https://qiita-image-store.s3.amazonaws.com/0/23579/828e7553-1014-f639-d721-61f290415225.png)


## Munin のプラグインを作成
CloudWatch Metrics から情報を取得するプラグインを作成します。

CloudWatch Metrics からの Munin プラグイン作成は、[AWSCLI を使って ELB のトラフィックを munin でグラフ化](http://rriifftt.hatenablog.com/entry/2015/04/09/100645) を参考にさせていただきました。

Metric Filter を RDS インスタンス数分作成して、RDS_NAMES に記述すると1つのグラフにまとめることができます。

```bash:/usr/share/munin/plugins/rds_load
#!/bin/bash

AWS="/usr/bin/aws --region ap-northeast-1"
NAMESPACE="RDSOSMetrics"
METRIC="LoadAverage"
RDS_NAMES=("test-db1" "test-db2")

if [ "$1" = "autoconf" ]; then
    echo yes
    exit 0
fi

if [ "$1" = "config" ]; then
    echo "graph_title Amazon RDS ${METRIC} "
    echo "graph_args --base 1000 -l 0"
    echo "graph_vlabel amazon rds ${METRIC}"
    echo "graph_scale no"
    echo "graph_category aws-rds"
    echo "graph_info amazon rds ${METRIC}"

    for RDS_NAME in "${RDS_NAMES[@]}"
    do
        echo "${RDS_NAME}_${METRIC}.label ${RDS_NAME}_${METRIC}"
        echo "${RDS_NAME}_${METRIC}.info ${RDS_NAME}_${METRIC}"
        echo "${RDS_NAME}_${METRIC}.type GAUGE"
        echo "${RDS_NAME}_${METRIC}.draw LINE"
    done
    exit 0
fi

for RDS_NAME in "${RDS_NAMES[@]}"
do
    retval=`${AWS} cloudwatch get-metric-statistics \
        --namespace ${NAMESPACE} \
        --metric-name "${RDS_NAME}_${METRIC}" \
        --period 60 \
        --start-time $(date --iso-8601=seconds --date '24 hour ago') \
        --end-time   $(date --iso-8601=seconds) \
        --statistics "Average" | /usr/local/bin/jq -r '.Datapoints | sort_by(.Timestamp) | reverse | .[0]'`

    count=`echo "${retval}" | /usr/local/bin/jq -r '.Average'`
    echo "${RDS_NAME}_${METRIC}.value ${count}"
done

exit 0
```

プラグインを作成したら plugins ディレクトリにシンボリックリンクを作成、munin-node を再起動します。

```
# cd /etc/munin/plugins
# ln -s /usr/share/munin/plugins/rds_load rds_load
# /etc/init.d/munin-node restart
```

## Munin で表示確認
![1-6.png](https://qiita-image-store.s3.amazonaws.com/0/23579/db0998a6-d699-b10a-1795-808774c8cb67.png)

無事 Munin でグラフ化できました！

# まとめ
RDS インスタンスのロードアベレージを Munin で監視できるようになりました。
他のメトリクスも Munin でどんどんグラフ化しましょう！

# 参考資料
[[新機能] Amazon RDS で OS の詳細情報を取得できるようになりました！](http://dev.classmethod.jp/cloud/aws/rds-enhanced-monitoring/)
[ログファイルのモニタリング](http://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/DeveloperGuide/WhatIsCloudWatchLogs.html)
[AWS-CLI を使って ELB のトラフィックを munin でグラフ化](http://rriifftt.hatenablog.com/entry/2015/04/09/100645)