三流エンジニアの落書き帳

さあ、今日も未知という扉を開けてみよう

GrafanaでMySQL上のデータをグラフ化してみたい

どうも、今年のGWは10連休の予定です。 GWは特にどこにも出かける予定はありません。 理由は簡単。「なぜ、人混みの中にわざわざ行くのか」理解できないからです。 GWは暴飲暴食をして、惰眠を貪り、隊だの限りを尽くします。

というわけで本題へ・・・

背景

さて、タイトルにもある通り今回はMySQL上のテーブルに対して、Grafanaを使ってデータの可視化をすることを考えます。 今回考えるテーブルは次のようなものです。

[mysql-root@localhost:dba]> show create table monitor_metrics\G
*************************** 1. row ***************************
       Table: monitor_metrics
Create Table: CREATE TABLE `monitor_metrics` (
  `metrics` varchar(400) NOT NULL,
  `day` date NOT NULL,
  `metrics_value` bigint NOT NULL,
  PRIMARY KEY (`metrics`,`day`),
  KEY `idx_metrics_value_day` (`metrics_value`,`day`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

実際の中身はこんな感じ。

[mysql-root@localhost:dba]> SELECT * FROM monitor_metrics ORDER BY metrics, day;
+----------------+------------+---------------+
| metrics        | day        | metrics_value |
+----------------+------------+---------------+
| DB01-Sort_scan | 2022-04-02 |         10000 |
| DB01-Sort_scan | 2022-04-03 |         10000 |
| DB01-Sort_scan | 2022-04-04 |          5000 |
| DB01-Sort_scan | 2022-04-05 |          7000 |
| DB01-Sort_scan | 2022-04-06 |          3000 |
| DB01-Sort_scan | 2022-04-07 |          3000 |
| DB01-Sort_scan | 2022-04-08 |          3000 |
| DB01-Sort_scan | 2022-04-09 |          1000 |
| DB01-Sort_scan | 2022-04-10 |          3000 |
| DB01-Sort_scan | 2022-04-11 |          5000 |
| DB02-Sort_scan | 2022-04-02 |          5000 |
| DB02-Sort_scan | 2022-04-03 |         10000 |
| DB02-Sort_scan | 2022-04-04 |          5000 |
| DB02-Sort_scan | 2022-04-05 |          7000 |
| DB02-Sort_scan | 2022-04-06 |             0 |
| DB02-Sort_scan | 2022-04-07 |          6000 |
| DB02-Sort_scan | 2022-04-08 |          3000 |
| DB02-Sort_scan | 2022-04-09 |          1000 |
| DB02-Sort_scan | 2022-04-10 |         13000 |
| DB02-Sort_scan | 2022-04-11 |         22000 |
+----------------+------------+---------------+
20 rows in set (0.00 sec)

例えば特定のデータベースに対して特定のステータス変数の値を定期的に取得していて、その差分をテーブルに格納しているといった状況をイメージしてください。 実際にこのような運用はかなり泥臭いやり方で、本当であればやりたくないのですが、お客さまの環境のような制限のかかった環境ではこのような方法が必要だと考えています。

取得間隔がデイリーなんだけど、粗すぎない?っていうコメントは無視します。

今回はこのデータをGrafanaでグラフ化することを考えます。

Grafanaの準備(簡略)

まずはGrafanaを準備する必要があります。 今回は簡単に導入方法を簡単に書いておきます。

自分自身の記事で恐縮ですが、過去にGrafanaをインストールした記事があったのでリンクを張っておきます。

koreshiki-nanno.hatenablog.com

Grafanaのインストール

[root@localhost grafana]# wget https://dl.grafana.com/enterprise/release/grafana-enterprise-8.5.0-1.x86_64.rpm
--2022-04-27 20:11:41--  https://dl.grafana.com/enterprise/release/grafana-enterprise-8.5.0-1.x86_64.rpm
dl.grafana.com (dl.grafana.com) をDNSに問いあわせています... 146.75.94.217, 2a04:4e42:87::729
dl.grafana.com (dl.grafana.com)|146.75.94.217|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 86997865 (83M) [application/x-redhat-package-manager]
`grafana-enterprise-8.5.0-1.x86_64.rpm' に保存中

grafana-enterprise-8.5.0-1 100%[=====================================>]  82.97M   414KB/s 時間 3m 23s   

2022-04-27 20:15:04 (419 KB/s) - `grafana-enterprise-8.5.0-1.x86_64.rpm' へ保存完了 [86997865/86997865]

[root@localhost grafana]# rpm -ivh grafana-enterprise-8.5.0-1.x86_64.rpm 
警告: grafana-enterprise-8.5.0-1.x86_64.rpm: ヘッダー V4 RSA/SHA256 Signature、鍵 ID 24098cb6: NOKEY
Verifying...                          ################################# [100%]
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:grafana-enterprise-8.5.0-1       ################################# [100%]
### NOT starting on installation, please execute the following statements to configure grafana to start automatically using systemd
 sudo /bin/systemctl daemon-reload
 sudo /bin/systemctl enable grafana-server.service
### You can start grafana-server by executing
 sudo /bin/systemctl start grafana-server.service
POSTTRANS: Running script

Grafanaの自動起動の有効化および起動

[root@localhost grafana]# systemctl daemon-reload

[root@localhost grafana]# systemctl enable grafana-server.service
Synchronizing state of grafana-server.service with SysV service script with /usr/lib/systemd/systemd-sysv-install.
Executing: /usr/lib/systemd/systemd-sysv-install enable grafana-server
Created symlink /etc/systemd/system/multi-user.target.wants/grafana-server.service → /usr/lib/systemd/system/grafana-server.service.

[root@localhost grafana]# systemctl start grafana-server

[root@localhost grafana]# systemctl status grafana-server
● grafana-server.service - Grafana instance
   Loaded: loaded (/usr/lib/systemd/system/grafana-server.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2022-04-27 21:16:13 JST; 5s ago
     Docs: http://docs.grafana.org
 Main PID: 5988 (grafana-server)
    Tasks: 9 (limit: 11481)
   Memory: 119.8M
   CGroup: /system.slice/grafana-server.service
           └─5988 /usr/sbin/grafana-server --config=/etc/grafana/grafana.ini --pidfile=/var/run/grafana/>

Grafanaの確認

今回はMySQLとGrafanaを同じサーバーに立てています。

Grafanaのインストールが完了したら、<サーバーのIP>:3000にアクセスします。

なお、ユーザー名とパスワードの初期値はdefaults.ini*1内のadmin_userおよびadmin_passwordを確認してください。

Grafanaでデータソースを追加する

さて、Grafanaの準備が整ったのでいよいよグラフ化していきます。

その前にデータソースを追加する必要があります。

設定から[Data Sources]を選択します。

リストの中からMySQLを選択します。

ここではMySQLに接続するための設定をしていきます。

この時、GrafanaからMySQLへ接続するための専用のユーザーを作っておくとよいでしょう。

mysql> create user grafana@localhost identified by random password;
+---------+-----------+----------------------+
| user    | host      | generated password   |
+---------+-----------+----------------------+
| grafana | localhost | XLPqU(@G1eQKzTNu&[*e |
+---------+-----------+----------------------+
1 row in set (0.01 sec)

mysql> grant select on dba.* to grafana@localhost;
Query OK, 0 rows affected (0.01 sec)

Grafanaでグラフを作る

左側のペインから「+」マーク、Create→Dashboard→Add panel→Add new panelでクエリエディタの画面が表示されます。

今回は次のようなクエリを記述します。

SELECT
  UNIX_TIMESTAMP(day) as time_sec,
  metrics_value as value,
  metrics as metric
FROM monitor_metrics
WHERE $__timeFilter(day)
ORDER BY day ASC

ほぼデフォルトと変わりませんねw

日付型はUNIX_TIMESTAMPに変換する点は注意が必要です。

上記のクエリを記述し、適当な日付範囲でグラフを描画すると・・・

これで欲しいデータが取れました!

今後はこれを詰めていき、見やすいグラフを作っていこうと思います。

*1:defaults.iniの場所は環境によって変わる