[Grafana]MySQLにあるデータとCSVデータをJoinしたい
はじめに
データ集計をしてほしいという依頼はシステムを運用しているとお願いされる作業かと思います。
データソースが単一の箇所にあれば良いのですが、あるデータはDBにあってあるデータはCSVファイルにあるというように一筋縄で集計できないこともあります。
上記の場合の解決案としては一番簡単なのは
DBのデータとログのデータをエクセルやスプレッドシートに貼り付けてからvlookupで結合することであるかと思います。
ただこのデータ集計が毎週、毎月などの定期作業になると、貼り付けるだけでもめんどくさいと思う作業になってきます。
エクセル貼り付けの一つの解決案としてGrafanaを使ってMySQLとCSVの異なるデータ元をJoinできることをご紹介します。
Grafanaについて
GeminiによるとGrafanaは下記のような説明となります。
Grafanaは、オープンソースのデータ可視化および監視ツールです。様々なデータソース(Prometheus、InfluxDB、Elasticsearch、MySQLなど)と連携し、それらのデータを美しくインタラクティブなダッシュボードで表示することができます。
本記事で作成したいデータ
MySQL側ではuser_idとuser_agentが存在しており、
CSV側ではuser_idとnameが存在している状態を作ります。
Grafanaでuser_idでjoinしてユーザー名とUAが紐づいたテーブルを作成します。
MySQL側のデータ
id | user_id | user_agent | created_at |
---|---|---|---|
1 | user001 | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 | 2025-08-03 16:53:24.000 |
2 | user002 | Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 | 2025-08-03 16:53:24.000 |
3 | user003 | Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 | 2025-08-03 16:53:24.000 |
4 | user004 | Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0 | 2025-08-03 16:53:24.000 |
CSV側のデータ
user_id | name |
---|---|
user001 | Taro |
user002 | Jiro |
前提
Grafanaにデータソースを設定しておく
MySQLとCSVのためにGrafanaにデータソースを予め設定しておきます。
データソースの登録方法については本筋ではないのでAzure Managed Grafana でデータ ソースを管理する方法
などを参考にしてください。
指定するデータソース
MySQLはMySQL
CSVはinfinity
(infinityはCSVだけでなくJSONやXMLなども解釈できるデータソースとなりますのでこのような名前になっていると思われます。)
手順
Mixedを使ったダッシュボードを作成する。
-
Exploreの画面を開く。
-
[Mixed]を指定して[Add query]をクリックする。
ここでMixedを選ぶことでデータソースを複数選べます。
結果
-
AでMySQLのデータソースを選んで対象の対象のテーブルにSelectできるように設定する。
DatasetとTable、Clolumnを設定して[Run query]をクリックしてデータが取得できることを確認する。
クエリ結果
-
BでCSVのデータソースを選んでInlineでCSVを登録する。
この例ではInlineでCSVデータを指定しましたが、URLを指定して取得することもできます。
-
画面の右上部にある[Add to dashboard]をクリックする。
-
上がってきたパネルで[New dashboard]を選んで[Open dashboard]をクリックする。
-
A,Bのデータが選べるダッシュボードが作成されていることを確認する。
ダッシュボードのパネルを編集してTransformationsでJoinする。
-
パネルの左上の三点リーダを選んで[Edit]をクリックする。
-
編集画面で[Transformations]をクリックする。
-
[Add transformation]をクリックして、transformationの一覧が表示されるので[Join by field]を選ぶ。
-
Modeを[Outer(tabular)]、Fieldを[user_id]を選ぶ。
-
[Save dashboard]をクリックして[name B]が追加されてuser001,user002にnameがついていることを確認する。
おわりに
Grafanaを使ってMySQLとCSVをJOINしてみました。
Grafanaはデータソースとしてログも指定できるためMySQLとログもJOINできるようにするとさらに便利そうです。
Discussion