2021 年度 OSS リテラシ 3: 環境データの可視化のためのサーバ設定 (grafana)

はじめに

データベースに入力されたデータをグラフ化するために grafana を用いることにする.

grafana のインストールと設定

インストール

MySQL のデータを可視化するために, grafana を利用する. まずは apt に grafana のリポジトリを追加し, 必要となるパッケージをインストールする.

$ sudo -s

# apt-get update

# apt-get install curl apt-transport-https gnupg

grafana のリポジトリを追加する. gpg 鍵を追加する必要がある.

# vi /etc/apt/sources.list.d/grafana.list 

   deb https://packages.grafana.com/oss/deb stable main      (1 行だけ書く)

# curl https://packages.grafana.com/gpg.key | apt-key add -

   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                  Dload  Upload   Total   Spent    Left  Speed
 100  1694  100  1694    0     0   3208      0 --:--:-- --:--:-- --:--:--  3208
 OK

grafana のインストール. メッセージから上記で設定したリポジトリからパッケージを取得していることがわかる. また, 以降で実行すべきコマンドも表示される.

# apt-get update

# apt-get install grafana

  ...(略)... 
  以下のパッケージが新たにインストールされます:
    grafana
  アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 0 個。
  ...(略)... 
  取得:1 https://packages.grafana.com/oss/deb stable/main amd64 grafana amd64 7.2.1 [52.4 MB]
  ...(略)... 
  grafana (7.2.1) を設定しています ...
  システムユーザ `grafana' (UID 107) を追加しています...
  新しいユーザ `grafana' (UID 107) をグループ `grafana' に追加しています...
  ホームディレクトリ `/usr/share/grafana' は作成しません。
  ### 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
  ### You can start grafana-server by executing
   sudo /bin/systemctl start grafana-server
  systemd (241-7~deb10u4) のトリガを処理しています ...

grafana の起動.

# systemctl daemon-reload

# systemctl enable grafana-server.service

# systemctl start grafana-server

起動状態の確認.

# systemctl status grafana-server

  ● grafana-server.service - Grafana instance
     Loaded: loaded (/usr/lib/systemd/system/grafana-server.service; disabled; vendor preset: enabled)
     Active: active (running) since Mon 2018-12-10 18:29:14 JST; 18s ago
       Docs: http://docs.grafana.org
   Main PID: 24594 (grafana-server)
      Tasks: 7 (limit: 4915)
     CGroup: /system.slice/grafana-server.service
             └─24594 /usr/sbin/grafana-server --config=/etc/grafana/grafana.ini --pidfile=/var/run/grafana/grafana-serv

  12月 10 18:29:15 iotex grafana-server[24594]: t=2018-12-10T18:29:15+0900 lvl=info msg="Initializing InternalMetricsSer
  12月 10 18:29:15 iotex grafana-server[24594]: t=2018-12-10T18:29:15+0900 lvl=info msg="Initializing CleanUpService" lo
  12月 10 18:29:15 iotex grafana-server[24594]: t=2018-12-10T18:29:15+0900 lvl=info msg="Initializing NotificationServic
  12月 10 18:29:15 iotex grafana-server[24594]: t=2018-12-10T18:29:15+0900 lvl=info msg="Initializing ProvisioningServic
  12月 10 18:29:15 iotex grafana-server[24594]: t=2018-12-10T18:29:15+0900 lvl=info msg="Initializing PluginManager" log
  12月 10 18:29:15 iotex grafana-server[24594]: t=2018-12-10T18:29:15+0900 lvl=info msg="Starting plugin search" logger=
  12月 10 18:29:15 iotex grafana-server[24594]: t=2018-12-10T18:29:15+0900 lvl=info msg="Plugin dir created" logger=plug
  12月 10 18:29:15 iotex grafana-server[24594]: t=2018-12-10T18:29:15+0900 lvl=info msg="Initializing TracingService" lo
  12月 10 18:29:15 iotex grafana-server[24594]: t=2018-12-10T18:29:15+0900 lvl=info msg="Initializing Stream Manager"
  12月 10 18:29:15 iotex grafana-server[24594]: t=2018-12-10T18:29:15+0900 lvl=info msg="HTTP Server Listen" logger=http

grafana 用のユーザの作成 (MySQL)

MySQL に select 権限しか持たないユーザを作り, そのユーザ権限で grafana を使うようにする. grafana ユーザがテーブル中のデータを検索できるようにするために "grant select" を行う.

# mysql -u root 

  ...(略)...

  MariaDB [(none)]> create user 'grafana'@'localhost' identified by 'XXXXXX';   (パスワードは適宜設定すること.XXXXX のままにしない)

     Query OK, 0 rows affected (0.00 sec)

  MariaDB [(none)]> grant select on iotex.* to 'grafana'@'localhost';

      Query OK, 0 rows affected (0.01 sec)

初期設定

ブラウザで http://10.176.0.XXX:3000 (vm の 3000 番ポートを指定する. IP は vm のものに変更すること)にアクセスする. 初期状態では, admin/admin でログインできるので, すぐさまパスワードを変更する.

"Add Data Source" を選択.

"MySQL" を選択

データベースへのアクセス情報を入力する. 入力後に "Save & Test" をクリックし, データベースへの接続が成功することを確認すること.

  • データベース名: iotex
  • ユーザ名: grafana
  • パスワード: MySQL コンソールで grafana 用に設定したパスワード



ログインしなくてもダッシュボードを閲覧可能とする.

ログインしなくても作成されたダッシュボードを見えるようにするために設定ファイルを修正する. 以下のように "Anonymous Auth" セクションを修正し, grafana を再起動する.

# cd /etc/grafana/

# cp grafana.ini grafana.ini.bk

# vi grafana.ini

  #################################### Anonymous Auth ##########################
  [auth.anonymous]
  # enable anonymous access
  enabled = true

  # specify organization name that should be used for unauthenticated users
  org_name = Main Org.

  # specify role for unauthenticated users
  org_role = Viewer

# /etc/init.d/grafana-server restart

  [ ok ] Restarting grafana-server (via systemctl): grafana-server.service.

テストデータの入力とダッシュボードの作成

GitHub から clone したテストデータを用いる. テストデータは松江高専のとある教室での観測データである (2019年8月頃).

# exit

$ cd ~/

$ cd iotex-server/sample

$ less data.sql

  DROP TABLE IF EXISTS `monitoring`;
  /*!40101 SET @saved_cs_client     = @@character_set_client */;
  /*!40101 SET character_set_client = utf8 */;
  CREATE TABLE `monitoring` (
    `hostname` varchar(20) CHARACTER SET utf8 NOT NULL,
    `time` datetime NOT NULL,
    `temp` double DEFAULT NULL,
    `temp2` double DEFAULT NULL,
    `temp3` double DEFAULT NULL,
    `humi` double DEFAULT NULL,
    `humi2` double DEFAULT NULL,
    `humi3` double DEFAULT NULL,
    `dp` double DEFAULT NULL,
    `dp2` double DEFAULT NULL,
    `dp3` double DEFAULT NULL,
    `bmptemp` double DEFAULT NULL,
    `dietemp` double DEFAULT NULL,
    `lux` double DEFAULT NULL,
    `objtemp` double DEFAULT NULL,
    `pres` double DEFAULT NULL,
    `sitemp` double DEFAULT NULL,
    `sihumi` double DEFAULT NULL,
    `eco2` double DEFAULT NULL,
    `tvoc` double DEFAULT NULL,
    `winddir` double DEFAULT NULL,
    `windvel` double DEFAULT NULL
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  /*!40101 SET character_set_client = @saved_cs_client */;

   --
   -- Dumping data for table `monitoring`
   --

  LOCK TABLES `monitoring` WRITE;
  /*!40000 ALTER TABLE `monitoring` DISABLE KEYS */;
  INSERT INTO `monitoring` VALUES ('00cd3759','2021-10-01 00:10:00',25.7,NULL,NULL,72.55,NULL,NULL,20.4,NULL,NULL,28.3,26.31,0,27.53,100546.67,NULL,NULL,NULL,NULL,NULL,NULL),('122ebae8','2021-10-01 00:10:00',24.74,NULL,NULL,73.01,NULL,NULL,19.57,NULL,NULL,26.5,25.27,0,26.42,100534.83,NULL,NULL,NULL,NULL,NULL,NULL),.....

  ....(以下略)....

テストデータを入力するには以下のようなコマンドを打てば良い (ユーザ名は適宜変更すること). data.sql には MySQL のダンプデータが格納されている.

$ mysql -u hogehoge -p -h localhost iotex < data.sql 

データの入力を確認する.

$ mysql -u hogehoge -p

  Enter password: 
  ...(略)...

  MariaDB [(none)]> use iotex;

     Database changed

  MariaDB [iotex]> select * from monitoring;

     ...(略)...

テストデータを用いてダッシュボードを作成する. 以下は気温と湿度をグラフ化した例である.

注意) テストデータは 2021 年 10 月上旬のものなので, その時期が横軸に含まれるようにしないとグラフが表示されない.

モードを切り替えるために「Edit SQL」を押す.

気温データのグラフを作るために SQL を書く.さらに,データの表示範囲を 6 hour から 30 days に広げておくこと. 全部終えたら Apply を押す.

なお,気温データを書くための SQL 文は以下のようになっている.

SELECT
  UNIX_TIMESTAMP(time) as time_sec,
  temp as value,
  hostname as metric
FROM monitoring
WHERE $__timeFilter(time)
ORDER BY time ASC

マウスでグラフの幅や描画範囲を変更することができる.

また, データの入っているテーブルは以下のように定義されている.

テーブル monitoring
+---------------+-------------+------+-----+---------+-------+
| Field         | Type        | Null | Key | Default | Extra |
+---------------+-------------+------+-----+---------+-------+
| hostname      | varchar(20) | YES  |     | NULL    |       |ホスト名
| time          | datetime    | YES  |     | NULL    |       |時刻
| temp          | double      | YES  |     | NULL    |       |温度 (SHT75, 1)
| temp2         | double      | YES  |     | NULL    |       |温度 (SHT75, 2)
| temp3         | double      | YES  |     | NULL    |       |温度 (SHT75, 3)
| humi          | double      | YES  |     | NULL    |       |湿度 (SHT75, 1)
| humi2         | double      | YES  |     | NULL    |       |湿度 (SHT75, 2)
| humi3         | double      | YES  |     | NULL    |       |湿度 (SHT75, 3)
| dp            | double      | YES  |     | NULL    |       |露点温度 (SHT75, 1)
| dp2           | double      | YES  |     | NULL    |       |露点温度 (SHT75, 2)
| dp3           | double      | YES  |     | NULL    |       |露点温度 (SHT75, 3)
| bmptemp       | double      | YES  |     | NULL    |       |温度 (BMP180)
| dietemp       | double      | YES  |     | NULL    |       |基板温度 (TMP007)
| lux           | double      | YES  |     | NULL    |       |照度 (TSL2561)
| objtemp       | double      | YES  |     | NULL    |       |放射温度 (TM007)
| pres          | double      | YES  |     | NULL    |       |圧力 (BMP180)
| sitemp        | double      | YES  |     | NULL    |       |温度 (Si7021)
| sihumi        | double      | YES  |     | NULL    |       |湿度 (Si7021)
| eco2          | double      | YES  |     | NULL    |       |CO2 濃度 (SGP30)
| tvoc          | double      | YES  |     | NULL    |       |総揮発性有機化合物量 (SGP30)
| winddir       | double      | YES  |     | NULL    |       |風向
| windvel       | double      | YES  |     | NULL    |       |風速
+---------------+-------------+------+-----+---------+-------+

テーブル monitoring_hosts
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| hostname | varchar(20) | NO   | PRI | NULL    |       | ホスト名
| ip       | varchar(15) | YES  |     | NULL    |       | IP アドレス
| time     | datetime    | YES  |     | NULL    |       | 時刻
+----------+-------------+------+-----+---------+-------+

課題 (1)

上記にならい,以下から成る grafana のダッシュボードを作成せよ. なお, 作成したダッシュボードのスナップショットを wbt に登録せよ (スナップショットには ブラウザ上部に表示される URL を必ず含めること (自分のホストで行なった証拠として)).

  • 全ホストのリスト (表形式)
  • 全ホストの温度
  • 全ホストの湿度

課題 (2)

自分で選んだ 1 つのホストについて、テーブル monitoring から以下の図にあるように, 物理量の時間変化を表示するダッシュボードを作成せよ. なお, 作成したダッシュボードのスナップショットを wbt に登録せよ (スナップショットには ブラウザ上部に表示される URL を必ず含めること (自分のホストで行なった証拠として)).

なお, 物理量として以下を表示すること. ホストによってはすべての情報が揃っていないことがある.データの揃っているホストを使うこと.

  • 各種センサーで取得された温度 : temp, bmptemp (2 つを 1 つのグラフに)
  • 温度と壁の温度 (放射温度) : temp, objtemp (2 つを 1 つのグラフに)
  • 湿度 : humi
  • 教室の照度 : lux

課題 (3)

テーブル monitoring の列 hostname は,教室に置かれたラズパイの MAC アドレスを示すので, そのままではどの部屋かよく分からない.そこで,grafana のグラフにおいて教室名を表示させるようにしたい.

以下の手順で作業を行い,選択された教室名に対して課題 (2) と同等なグラフが表示されるようにせよ. なお, 作成したダッシュボードのスナップショットを wbt に登録せよ (スナップショットには ブラウザ上部に表示される URL を必ず含めること (自分のホストで行なった証拠として)).

なお, 物理量として以下を表示すること.

  • 各種センサーで取得された温度 : temp, bmptemp (2 つを 1 つのグラフに)
  • 温度と壁の温度 (放射温度) : temp, objtemp (2 つを 1 つのグラフに)
  • 湿度 : humi
  • 教室の照度 : lux

また,教室に対応する ID とホスト名を示す表もダッシュボード内に含めること.

準備:テーブル monitoring_rooms_id, monitoring_rooms_names の追加

MAC アドレスと教室名の情報はファイル data2.sql に含まれるテーブル monitoring_rooms_id, monitoring_rooms_names に含まれている.data2.sql を MySQL のデータベース iotex に追加するためには, 以下のようなコマンドを実行する. 但し, hogehoge は自分のユーザ名に置き換えること.

$ mysql -u hogehoge -p -h localhost iotex < ~/iotex-server/sample/data2.sql

MySQL のコンソールを立ち上げ,monitoring_rooms_id, monitoring_rooms_names の中身を除いてみる. 2 つのテーブルに分けているのは一見冗長に見えるが, 機材交換を行うと MAC アドレスが変わってしまうことを考慮している.

$ mysql -u hogehoge -p

  Welcome to the MariaDB monitor.  Commands end with ; or \g.
  Your MariaDB connection id is 61
  Server version: 10.3.29-MariaDB-0+deb10u1 Debian 10

  Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

  Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

  MariaDB [(none)]> use iotex

     Reading table information for completion of table and column names
     You can turn off this feature to get a quicker startup with -A

     Database changed

  MariaDB [iotex]> desc monitoring_rooms_id;

      +----------+-------------+------+-----+---------+-------+
      | Field    | Type        | Null | Key | Default | Extra |
      +----------+-------------+------+-----+---------+-------+
      | id       | varchar(40) | YES  |     | NULL    |       |
      | hostname | varchar(20) | YES  |     | NULL    |       |
      +----------+-------------+------+-----+---------+-------+
      2 rows in set (0.001 sec)

  MariaDB [iotex]> select * from monitoring_rooms_id limit 3;

      +--------+----------+
      | id     | hostname |
      +--------+----------+
      | iot-01 | 27893d12 |  <-- ID と MACアドレスの組み 
      | iot-02 | abe56d67 |
      | iot-03 | 6c7e9aee |
      +--------+----------+
      3 rows in set (0.001 sec)

  MariaDB [iotex]> desc monitoring_rooms_names;       

      +---------+-------------+------+-----+---------+-------+
      | Field   | Type        | Null | Key | Default | Extra |
      +---------+-------------+------+-----+---------+-------+
      | id      | varchar(40) | YES  |     | NULL    |       |
      | name_ja | varchar(20) | YES  |     | NULL    |       |
      | name_en | varchar(20) | YES  |     | NULL    |       |
      +---------+-------------+------+-----+---------+-------+
      3 rows in set (0.001 sec)

  MariaDB [iotex]> select * from monitoring_rooms_names limit 3;

      +--------+--------------+---------+
      | id     | name_ja      | name_en |
      +--------+--------------+---------+
      | iot-01 | 211講義室    | 211     |  <-- ID と部屋の組み
      | iot-02 | 212講義室    | 212     |
      | iot-03 | 213講義室    | 213     |
      +--------+--------------+---------+
      3 rows in set (0.000 sec)

準備:ダッシュボードの作成と変数

テーブルが追加できたら,新たなダッシュボードの作成を行い,設定から「変数 (Variables)」を作成する.

変数が作成できたら,試しにテーブル monitoring_rooms_names から教室名に対応する ID を取り出してみる. 変数名は $query0 で参照することができる.

ダッシュボードの作成

SQL のクエリを考え,以下のようなダッシュボードを作成してみよ.

課題 (4) [Extra]

  • とある教室について,課題 (3) で作成したグラフから読み取れること (= グラフの特徴) をまとめ,そのような特徴が得られる理由について考えてみよ.
  • 課題 (3) で作成したグラフに新たな物理量を追加してみよ

課題 (5) [Extra]

  • 適当な基準 (例えば,同じ階の部屋,上下に並んだ教室,教室とその前の廊下,など) で複数教室のデータを 1 枚のグラフに表示し,グラフから読み取れること (= グラフの特徴) をまとめ,そのような特徴が得られる理由について考えてみよ.

[参考] 新規ユーザの作成

今回はやらなくて良いが, 設定の "Server Admin" よりユーザを作成することができる. パスワードの変更なども可能である.

参考