Intern

MySQL × Node-RED × Grafanaでデータ可視化を試してみた

センサーの代わりにテストデータを自動生成して、MySQLに保存し、Grafanaで可視化する流れを作ってみました。

MySQLの準備

まずはMySQL側で、ランダムデータを入れるテーブルを作成しました。

<code>CREATE DATABASE sensor_data;
USE sensor_data;

CREATE TABLE random_numbers (
    id INT AUTO_INCREMENT PRIMARY KEY,
    timestamp DATETIME NOT NULL,
    value FLOAT NOT NULL
);</code>Code language: PHP (php)

Node-REDでランダムデータを自動生成

今回はセンサーを使わずに、Node-REDでランダムな数値を作る簡単なフローを作成しました。

  • Injectノード → 一定間隔でデータ生成トリガー
  • Functionノード → ランダム値を作成
  • MySQLノード → データベースに書き込み ※ユーザー名とパスワードはSQLで設定したものを入れる

Functionノードのコードはこんな感じです。

let randomValue = (Math.random() * 50).toFixed(2);
msg.topic = <code>INSERT INTO sensor_data(sensor_name, value) VALUES ('RandomSensor', ${randomValue})<span style="background-color: initial;font-family: inherit;font-size: inherit;text-align: initial;color: initial">;</span></code>return msg;Code language: JavaScript (javascript)
  • Math.random() * 50 → 0~50までのランダム値を作成
  • SQL文をmsg.topicに入れてMySQLノードに渡す
  • injectノードで数秒おきに実行するよう設定

Grafanaのインストール

Grafanaは公式サイトからダウンロードしました。
(https://grafana.com/grafana/download)

自分の環境はWindowsなので、インストーラーを選択。
インストール後、自動でサービスが起動し、ブラウザからアクセスできるようになりました。

  • URL: http://localhost:3000
  • 初期ユーザー: admin
  • 初期パスワード: admin (初回ログイン後にパスワード変更要求あり)

Grafanaの起動と初期設定

ログインした後、最初にデータソースを追加するadd new connectionに進み、
ここで「MySQL」を選択し、自分のmysqlの情報を入力しました。

ダッシュボード作成

次に「New Dashboard」から「Add Visualization」を選択。


データソースにMySQLを指定します。

その後、Nodataのqueryが表示されるため右下のcodeを選び以下のコマンドを作成しRUNを押すことでグラフが表示されると思います。

SELECT

  UNIX_TIMESTAMP(created_at) as time_sec,

 value

FROM sensor_data

WHERE $__timeFilter(created_at)

ORDER BY created_at


「Run Query」を押すとちゃんとデータが表示されました。最初グラフが見ずらいと思うのでrangeを変えてみてください。

感想

  • MySQLからGrafanaまでは思ったよりスムーズ
  • テーブル構造をきちんと作れば、グラフ化が一瞬でできる
  • データの動きをリアルタイムで追えるのがかなり便利