2020 年度 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 を使うようにする.

# mysql -u root 

  ...(略)...

  MariaDB [(none)]> create user 'grafana'@'localhost' identified by 'XXXXXX';   (パスワードは適宜)

     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

テストデータを入力するには以下のようなコマンドを打てば良い (ユーザ名は適宜変更すること). 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;

     ...(略)...

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

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

なお,気温データを書くための 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)
+---------------+-------------+------+-----+---------+-------+

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

課題

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

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

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

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

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

参考