どうも、今年の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の場所は環境によって変わる