Mackerel のサービスメトリックで MySQL のステータス情報を可視化する
Mackerel のサービスメトリックを使って MySQL のステータス情報を可視化してみます。
「Mackerel のサービスメトリックを利用すれば、ホストに紐付かないあらゆるメトリックを記録・可視化できます」とあるように、数値データであれば何でもグラフにして可視化できます。
SHOW STATUS の値を可視化する
今回は SHOW STATUS
で取得できるステータス情報のうち SELECT
, INSERT
, UPDATE
, DELETE
の実行回数を可視化してみます。
> SHOW GLOBAL STATUS WHERE Variable_name IN ('Com_select', 'Com_insert', 'Com_update', 'Com_delete');
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_delete | 8 |
| Com_insert | 24 |
| Com_select | 792 |
| Com_update | 9331 |
+---------------+-------+
4 rows in set (0.00 sec)
この値を Mackerel に投げます。 HTTPS のエンドポイントに JSON を POST だけなので bash でも書けます。
#!/bin/bash
timestamp=$(date +%s)
result_file="result.txt"
api_key="<API キー>"
mysql -N mysql < show.sql > ${result_file}
select_num=$(cat ${result_file} | grep -w Com_select | cut -f 2)
insert_num=$(cat ${result_file} | grep -w Com_insert | cut -f 2)
update_num=$(cat ${result_file} | grep -w Com_update | cut -f 2)
delete_num=$(cat ${result_file} | grep -w Com_delete | cut -f 2)
json_data=$(cat <<EOF
[
{"name": "mysql.select", "time": ${timestamp}, "value": ${select_num}},
{"name": "mysql.insert", "time": ${timestamp}, "value": ${insert_num}},
{"name": "mysql.update", "time": ${timestamp}, "value": ${update_num}},
{"name": "mysql.delete", "time": ${timestamp}, "value": ${delete_num}}
]
EOF
)
curl -sS https://mackerel.io/api/v0/services/<サービス名>/tsdb \
-X POST \
-H "X-Api-Key: ${api_key}" \
-H "Content-Type: application/json" \
-d "${json_data}" \
-o /dev/null
あとは Cron で定期的に実行させるだけです。これだけでグラフになって可視化されます。
ただ、これを見てもあまり役に立ちません。急激な変化をチェックしたいので差分で見る必要があります。
こういう場合でも Mackerel だとグラフ設定を変えるだけで OK です。
差分値をオンにすると…
いい感じに差分値グラフにしてくれます。これだと負荷が一定なのがパッと見ただけでわかりますね。
まとめ
はてなのエンジニアがドッグフーディングしているだけあって、エンジニアがワクワクするようなツボをしっかり押さえています。
特にグラフ部分は Nagios や Zabbix と違い動的に生成されているので、これまでの監視ツールとは一線を画しています。
これからもいろいろな活用方法を模索したいと思います。