Mackerel のサービスメトリックで MySQL のステータス情報を可視化する

Posted on

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 と違い動的に生成されているので、これまでの監視ツールとは一線を画しています。

これからもいろいろな活用方法を模索したいと思います。

Popular Entries

Recent Entries