About
- Grafana は、様々なデータを可視化してくれるダッシュボードツールです
- 本記事では、ローカル環境上ででサクッと試してみます
- GrafanaとMySQLのコンテナをDocker上で用意する
- MySQLで適当なデータベースを作る
- Grafanaでそのデータを表示する
- (Grafanaへのユーザ登録やログインは不要です)
環境
- Windows 11 Home
- WSL2 (Ubuntu-20.04)
- Docker
MySQLでデータベースを作る
MySQLコンテナを作る
下記コマンドによってMySQLコンテナを作ります。簡易的にデータ永続化をするために、ここではローカルに db
というディレクトリを作ってそれをマウントしています。これによって、コンテナを作り直してもデータベースが保持されます。また、アクセス権限を設定しないとrootで書き込まれてしまうため、userを指定しています。
WSL2上で試す場合、--net host
が必要でした。なお、Windows Firewallは特に無効にしなくても大丈夫でした。
mkdir ./db
docker run --name some-mysql \
--user `id -u` \
-v `pwd`/db:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=pw-for-root \
--net host \
-p 3306:3306 \
-d --rm mysql:8.0.30
MySQLの設定をする
下記コマンドで作成したコンテナに入ります。パスワードは pw-for-root
です。
docker exec -it some-mysql mysql -u root -p
その後、下記SQL文によって後で使うGrafana用のユーザを作っておきます。GrafanaにはSELECTのみ許可します。ワイルドカードを使わないでちゃんとデータベース名とテーブル名を指定した方が安全です。
CREATE USER 'grafanaReader' IDENTIFIED BY 'pw-for-grafana';
GRANT SELECT ON *.* TO 'grafanaReader';
サンプルデータベースを作る
引き続き、下記SQL文によって適当なデータベースを作ります。ここでは通常のtableと、時系列のtableを作ります。
終わったら、Ctrl+dで終了してOKです。
CREATE DATABASE IF NOT EXISTS test_db;
CONNECT test_db;
CREATE TABLE user_table (
id int(10) AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20)
);
INSERT INTO user_table(name) VALUES ('Alice');
INSERT INTO user_table(name) VALUES ('Bob');
INSERT INTO user_table(name) VALUES ('Charlie');
CREATE TABLE time_table (
id int(10) AUTO_INCREMENT PRIMARY KEY,
data_time DATETIME,
value int
);
INSERT INTO time_table(data_time, value) VALUES ('2022-01-02 16:00:00', 10);
INSERT INTO time_table(data_time, value) VALUES ('2022-02-02 16:00:00', 20);
INSERT INTO time_table(data_time, value) VALUES ('2022-03-02 16:00:00', 30);
INSERT INTO time_table(data_time, value) VALUES ('2022-04-02 16:00:00', 40);
INSERT INTO time_table(data_time, value) VALUES ('2022-05-02 16:00:00', 30);
INSERT INTO time_table(data_time, value) VALUES ('2022-06-02 16:00:00', 20);
SELECT * FROM user_table;
SELECT * FROM time_table;
Grafana
Grafanaコンテナを作る
下記コマンドによってGrafanaコンテナを作ります。簡易的にデータ永続化をするために、ここではローカルに grafana
というディレクトリを作ってそれをマウントしています。ここには各種設定が保存されます。
mkdir ./grafana
docker run --name grafana \
--user `id -u` \
-v `pwd`/grafana:/var/lib/grafana \
--net host \
-p 3000:3000 \
-d --rm grafana/grafana
Grafanaへアクセスする
コンテナを起動したのと同じPC上で以下にアクセスします。
- URL: http://localhost:3000/
- Username: admin
- Password: admin
Data sourcesの設定
- Configuration -> Data sources -> Add data sourceをクリック
- MySQLを選択
- 下記設定を行う
- Host: localhost:3306
- Database: test_db
- User: grafanaReader
- Password: pw-for-grafana
- ページ下部の
Save & Test
をクリックして、Database Connection OK
が表示されることを確認する
Dashboardの設定
- Dashboards -> Browse -> New -> New Dashboard をクリック
- Add a new pane をクリック
通常のテーブルを追加する
-
Format Asを
Table
に設定 -
Edit SQLをクリックして、以下を入力
SELECT * FROM user_table;
-
右上からTableを選ぶ。または、他の描画方法を選ぶ
-
設定が完了したら
Apply
をクリック
時系列データを追加する
-
Dashboard上に、先ほどのテーブルが追加されているので、引き続き、Add Panel -> Add a new panelをクリック
-
Format Asを
Time series
に設定 (default) -
Edit SQLをクリックして、以下を入力
SELECT data_time AS "time", value FROM time_table
-
時間レンジを過去1年間にする (これは今回作成したデータがそういうもののため)
-
設定が完了したら
Apply
をクリック
Dashboardを保存する
- Dashboard上でパネルをさらに追加したり、位置を調整する
- 最後にSaveしたら完成
その他
- コンテナを再起動しても設定は保持されている
- MySQL側でデータを追加したら、Dashboardも更新される
- 時系列データを扱う場合にはMySQLよりもInfluxDB の方がいいらしい