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; ...(略)...
テストデータを用いてダッシュボードを作成する. 以下は気温と湿度をグラフ化した例である.
モードを切り替えるために「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" よりユーザを作成することができる. パスワードの変更なども可能である.
参考
- grafana の公式ページの Debian パッケージを用いたインストール方法 : <URL:http://docs.grafana.org/installation/debian/>