Fluentd・Elasticsearch・Kibanaのグラフ化がうまくいかなかったので、今度はFluentd・ InfluxDB・GrafanaでRaspi3 B+を母艦として動くか試してみます。これはうまくいきました。
温度や水温・湿度などの情報はESP8266やESP32からFluentdが取得してRaspi3に集めてグラフ表示までいけたら完成。そこまでの道のりは長そう。
その後は、温度上昇したらホットシートをオフにするなどの処理をリレーで自動的に行っていけるようにします。
まずは人間が見て異常に気づいたら操作できるようにグラフ化したい。(最悪MUNINでグラフ化しますが、リアルタイムじゃないので意味ないかなぁ、)
こちらのページは今回の案件そのまんまずばりの答えがのってた♪ありがとうございますm(_ _)m
Contents
InfluxDB のインストール
InfluxDBのページの「Installation」を見ながらインストールしてみます。
インストール前の確認
1 2 3 4 5 6 7 8 9 10 |
$ cat /etc/os-releases PRETTY_NAME="Raspbian GNU/Linux 9 (stretch)" NAME="Raspbian GNU/Linux" VERSION_ID="9" VERSION="9 (stretch)" ID=raspbian ID_LIKE=debian HOME_URL="http://www.raspbian.org/" SUPPORT_URL="http://www.raspbian.org/RaspbianForums" BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs |
Version 9でないとダメみたい。
1 2 |
$ curl -sL https://repos.influxdata.com/influxdb.key | sudo apt-key add - OK |
リポジトリ追加。
1 2 |
$ echo "deb https://repos.influxdata.com/debian stretch stable" | sudo tee /etc/apt/sources.list.d/influxdb.list deb https://repos.influxdata.com/debian stretch stable |
と出ればいいみたい。出なかった場合はsudo apt-get updateすればOK
インストール
いよいよインストール↓
1 |
$ sudo apt-get install influxdb |
インストールが終わると自動で起動するのでテスト
1 2 3 4 5 6 7 8 9 10 11 |
$ systemctl status influxdb ● influxdb.service - InfluxDB is an open-source, distributed, time series databa Loaded: loaded (/lib/systemd/system/influxdb.service; enabled; vendor preset: Active: active (running) since Sun 2019-01-20 11:17:44 JST; 5min ago Docs: man:influxd(1) Main PID: 1604 (influxd) CGroup: /system.slice/influxdb.service └─1604 /usr/bin/influxd -config /etc/influxdb/influxdb.conf 1月 20 11:17:44 raspberrypi influxd[1604]: [admin] 2019/01/20 11:17:44 Starting 1月 20 11:17:44 raspberrypi influxd[1604]: [admin] 201・・・・省略 |
と表示された。
動作確認
シェルから動作確認
1 2 3 4 5 6 7 8 9 |
$ curl -sl -I http://localhost:8086/ping HTTP/1.1 204 No Content Content-Type: application/json Request-Id: aea43b2a-1c5b-11e9-8003-000000000000 X-Influxdb-Version: 1.0.2 Date: Sun, 20 Jan 2019 02:32:50 GMT $ curl http://localhost:8086/query --data-urlencode "q=SHOW DATABASES" {"results":[{"series":[{"name":"databases","columns":["name"],"values":[["_internal"]]}]}]} |
こうなればちゃんと動いてるっぽい。
シェルは8086・Webからは8083にアクセス。間違えやすい。
1 2 3 4 |
$ ss -lntp | grep 808 LISTEN 0 128 :::8083 :::* LISTEN 0 128 :::8086 :::* LISTEN 0 128 :::8088 :::* |
コマンドとクエリー
Select
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
$influx Connected to http://localhost:8086 version 1.7.3 InfluxDB shell version: 1.7.3 Enter an InfluxQL query > use telegraf #DB選択 Using database telegraf > SHOW MEASUREMENTS ON "telegraf" # Table(MEASUREMENTS)リスト name: measurements name ---- cpu disk diskio kernel mem processes swap system > select * from cpu # MEASUREMENTS一覧出力 ERR: 493000000000,"cpu1","raspberrypi",0,0,99.2950654582104,0,0,0,0,0,0.10070493454176956,0.6042296072507605],[1548389493000000000,"cpu2","raspberrypi",0,0,98.49 多すぎるので途中で止めた・・・省略 > SHOW TAG KEYS ON "telegraf" FROM "cpu" # tag key出力 name: cpu tagKe ------ cpu host > SHOW TAG VALUES ON "telegraf" FROM "cpu" WITH KEY = "cpu" # value出力 name: cpu key value --- ----- cpu cpu-total cpu cpu0 cpu cpu1 cpu cpu2 cpu cpu3 > SHOW FIELD KEY CARDINALITY ON "telegraf" name: cpu key value --- ----- cpu cpu-total cpu cpu0 cpu cpu1 cpu cpu2 cpu cpu3 > SHOW FIELD KEY CARDINALITY ON "telegraf" name: cpu count ----- 10 name: disk count ----- 7 name: diskio count ----- 9 name: kernel count ----- 5 name: mem count ----- 33 name: processes count ----- 11 name: swap count ----- 6 name: system count ----- 7 > SHOW MEASUREMENT CARDINALITY ON "telegraf" # MEASUREMENT数 cardinality estimation ---------------------- 8 > SHOW SERIES CARDINALITY ON "telegraf" cardinality estimation ---------------------- 32 > SHOW TAG KEY CARDINALITY ON "telegraf" name: cpu count ----- 2 name: disk count ----- 5 name: diskio count ----- 2 name: kernel count ----- 1 name: mem count ----- 1 name: processes count ----- 1 name: swap count ----- 1 name: system count ----- 1 |
Insert
最初はMEASUREMENTS(table)とカラム同時に作る感じ。あとからカラムは追加可能。
1 |
> INSERT air,place=room,host=espd32 temp=17.025213452336,humi=56.0211211356 |
- MEASUREMENTS=air
- tags=place,host(2個目のValueとの間はスペース)
- value=temp,humi(カンマ区切り)
かな?Valueの部分がSQLでいうカラムになると思う。tagsで分ける。
この後、カラムは追加可能。
1 2 3 |
> INSERT air,place=room,host=esp321 co2=440.456413 > INSERT air,place=bath,host=esp325 atmo=2155.254694561 > INSERT air,place=living,host=esp322 temp=17.025213452336,humi=56.0211211356,atmo=2155.2546394561,co2=440.456413,o=21.123156131313 |
Delete
1 |
DROP MEASUREMENT test |
テーブル内のデータ削除
1 |
DROP SERIES FROM test |
Export
exportファイルが生成される。すべてのデータは出力されないみたい。新しいTableはでてこなかった。意味ないなぁ。
1 2 |
$ influx_inspect export -datadir "/var/lib/influxdb/data" -waldir "/var/lib/influxdb/wal" -out "export" -database sensor -retention autogen writing out tsm file data for sensor/autogen...complete. |
API
Select
1 2 |
$ curl -G 'http://localhost:8086/query?db=sensor' --data-urlencode 'q=SELECT * FROM "air"' {"results":[{"statement_id":0,"series":[{"name":"air","columns":["time","atmo","co2","host","humi","lux","o","place","temp"],"values":[["2019-02-02T05:37:29.607151394Z",2155.2546394561,440.456413,"test",56.0211211356,null,21.123156131313,"test",17.025213452336],["2019-02-02T05:41:06.530579944Z",2155.2546394561,440.456413,"test",56.0211211356,3.388239834292,21.123156131313,"test",17.025213452336]]}]}]} |
write
1 2 3 4 5 6 7 8 |
$ curl -i -XPOST "http://localhost:8086/write?db=sensor&precision=s" --data-binary 'air,place=test lux=8.338384' HTTP/1.1 204 No Content Content-Type: application/json Request-Id: 3e19f9e6-26af-11e9-aa33-b827eb9dbfd5 X-Influxdb-Build: OSS X-Influxdb-Version: 1.7.3 X-Request-Id: 3e19f9e6-26af-11e9-aa33-b827eb9dbfd5 Date: Sat, 02 Feb 2019 05:56:11 GMT |
これでうまく登録された。
InfluxDBのUI表示
ブラウザからは8083。
Windows10からブラウザで「http://192.168.31.53:8083/」(ラズパイ3B+のIP)と打つと接続された!phpMyAdminのようなものみたい。
DBあるかQueryに「SHOW DATABASES」と打つと「_internal」が出てきた。↑右下の「Query Templates」にちょっとしたクエリーがあるので選択してリターンを押すだけでクエリーが発行される。
接続設定
外部からアクセスしたときに接続できるようにする。右上の歯車アイコンを押して設定。最後に「Save」ボタンを押す。
DB作成テスト
「test」というDBを作成すると以下のようにエラーになった。usernameとパスワードを作った後だったのでアクセスできないよう。
1 2 3 4 5 6 7 8 9 10 |
$ curl -i -XPOST http://localhost:8086/query --data-urlencode "q=CREATE DATABASE test" HTTP/1.1 400 Bad Request Content-Type: application/json Request-Id: 8563a57c-1cea-11e9-8002-000000000000 X-Influxdb-Version: 1.0.2 Date: Sun, 20 Jan 2019 19:35:19 GMT Content-Length: 83 {"error":"error parsing query: found EOF, expected identifier at line 1, char 17"} |
URLの部分、queryのあとに「?u=root&p=パスワード」を入れてダブルクォーテーションで囲んで以下のようにしてみたら「test」DBが作成できた。
1 |
$ curl -i -XPOST "http://localhost:8086/query?u=root&p=パスワード" --data-urlencode "q=CREATE DATABASE test" |
返答のHTTPで4XX系が表示されたらエラーで2XXが表示されたら正常のようです。
- 204 No Content:OK
- 400 Bad Request:エラー
データ投入テスト
DB=test,measurement(table)=testtableでデータを作って投げてみました。
1 2 3 4 5 6 |
$ curl -i -XPOST "http://localhost:8086/write?db=test" --data-binary 'testtable,temp=25.85 hum=98.5245' HTTP/1.1 204 No Content Content-Type: application/json Request-Id: c215fd07-1cf4-11e9-8011-000000000000 X-Influxdb-Version: 1.0.2 Date: Sun, 20 Jan 2019 20:48:36 GMT |
確認
measurementにデータが入っているか確認する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
$ curl -G 'http://localhost:8086/query?db=test&pretty=true' --data-urlencode 'q=SELECT * FROM testtable' { "results": [ { "series": [ { "name": "testtable", "columns": [ "time", "hum", "temp" ], "values": [ [ "2019-01-20T20:48:36.533395326Z", 98.5245, "25.85" ] ] } ] } ] } |
このようになりました。うまくいったようです。
追記:Influxdb WebUI 8083にアクセスできなくなった!
急にhttp://127.0.0.1:8083/にアクセスできなくなったのでChronografを追加します。いままでアクセスできてたのは何だったのだろうか???今後は8083はやめてChronografを使うようです。
1 |
$ sudo apt-get install chronograf |
http://localhost:8888/にアクセスすると・・・
1 2 |
400 Bad Request 'json' or 'msgpack' parameter is required |
とでる・・・今度はfluentとぶつかってる?そんなことはなさそうだけど・・・fluentdをいったん終了すると、このような↓画面になった。
クエリー発行できなくなった?のかな?不便だなぁ、あっ、グラフのアイコン(上から3番目)でクエリー発行できそう。
SystemとかApacheとかもっとグラフ追加できるみたい。
Grafanaインストール
ARMv7のをインストールするようです。
1 2 |
$ wget https://dl.grafana.com/oss/release/grafana_5.4.3_armhf.deb $ sudo dpkg -i grafana_5.4.3_armhf.deb |
デーモンリロードしてGrafana起動
1 2 3 4 5 6 |
$ sudo systemctl daemon-reload $ sudo systemctl enable grafana-server Synchronizing state of grafana-server.service with SysV service script with /lib/systemd/systemd-sysv-install. Executing: /lib/systemd/systemd-sysv-install enable grafana-server Created symlink /etc/systemd/system/multi-user.target.wants/grafana-server.service → /usr/lib/systemd/system/grafana-server.service. $ sudo systemctl start grafana-server |
Grafana起動してるか確認
1 2 3 4 5 6 7 8 9 10 |
$ systemctl status grafana-server ● grafana-server.service - Grafana instance Loaded: loaded (/usr/lib/systemd/system/grafana-server.service; enabled; vend Active: active (running) since Sun 2019-01-20 12:13:37 JST; 1min 10s ago Docs: http://docs.grafana.org Main PID: 1984 (grafana-server) CGroup: /system.slice/grafana-server.service └─1984 /usr/sbin/grafana-server --config=/etc/grafana/grafana.ini --p 1月 20 12:13:49 raspberrypi grafana-server・・・省略 |
Grafana ブラウザからアクセスしてみる
Windows10からアクセスしてみる。
「http://192.168.31.53:3000」→「http://192.168.31.53:3000/login」にリダイレクトした。ID/Passはデフォルトでadmin/adminでした。
Loginするとパスワード変更しろと出るのでパスワードだけ変更する。IDはadminになる。
まだちゃんとしたデータが無いのでデータを生成してくれるツールを探す。
telegrafインストール
とりあえずおもしろそうなデータが欲しいのでInfluxDBにCPUの状態などを送れるtelegrafというのがあるので試してみます。
参考ページ
ダウンロード・インストール
メルアドと名前登録が必要ですが、以下からtarball(しかないので・・・)をダウンロード。
解凍
1 2 |
$ wget https://dl.influxdata.com/telegraf/releases/telegraf-1.9.2_linux_armhf.tar.gz $ tar xzvf telegraf-1.9.2_linux_armhf.tar.gz |
ちょっと面倒だけど必要なものだけ移動する。
1 2 3 |
$ sudo mv telegraf/usr/bin/telegraf /usr/bin/telegraf #バイナリ本体 $ sudo mv telegraf/etc/telegraf /etc/telegraf #telegraf.confなどのファイル $ sudo mv telegraf/etc/logrotate.d /etc/telegraf |
起動
起動すると以下のようになる。
1 2 3 4 5 6 7 8 9 |
$ telegraf 2019-01-20T07:43:24Z I! Starting Telegraf 1.9.2 2019-01-20T07:43:24Z I! Using config file: /etc/telegraf/telegraf.conf 2019-01-20T07:43:24Z I! Loaded inputs: inputs.disk inputs.diskio inputs.kernel inputs.mem inputs.processes inputs.swap inputs.system inputs.cpu 2019-01-20T07:43:24Z I! Loaded aggregators: 2019-01-20T07:43:24Z I! Loaded processors: 2019-01-20T07:43:24Z I! Loaded outputs: influxdb 2019-01-20T07:43:24Z I! Tags enabled: host=raspberrypi 2019-01-20T07:43:24Z I! [agent] Config: Interval:10s, Quiet:false, Hostname:"raspberrypi", Flush Interval:10s |
以下も同様に表示された。ただシェルで動いているので[Ctrl]-[c]すると終了してしまう。
1 |
$ telegraf -config /etc/telegraf/telegraf.conf |
起動確認
1 2 3 |
$ ps aux | grep telegraf pi 2024 1.5 3.8 844412 36372 pts/0 Sl+ 11:58 1:11 telegraf -config /etc/telegraf/telegraf.conf pi 3960 0.0 0.0 3852 532 pts/1 S+ 13:14 0:00 grep --color=auto telegraf |
起動スクリプト
リブートしたときなど自動で起動するようにする。
telegraf.serviceはエラーになる・・・
起動スクリプトは最近はtelegraf.serviceを/etc/systemd/system/に置くことが推奨されてるようなので、置いてみると・・・Failedになる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
$ sudo mv telegraf/usr/lib/telegraf/scripts/telegraf.service /etc/systemd/system/ $ sudo chmod +x /etc/systemd/system/telegraf.service $ sudo systemctl daemon-reload $ sudo systemctl status telegraf ● telegraf.service - The plugin-driven server agent for reporting metrics into InfluxDB Loaded: loaded (/etc/systemd/system/telegraf.service; enabled; vendor preset: enabled) Active: failed (Result: exit-code) since Mon 2019-01-21 11:24:47 JST; 23min ago Docs: https://github.com/influxdata/telegraf Main PID: 1775 (code=exited, status=217/USER) 1月 21 11:24:47 raspberrypi systemd[1]: telegraf.service: Unit entered failed state. 1月 21 11:24:47 raspberrypi systemd[1]: telegraf.service: Failed with result 'exit-code'. 1月 21 11:24:47 raspberrypi systemd[1]: telegraf.service: Service hold-off time over, scheduling r 1月 21 11:24:47 raspberrypi systemd[1]: Stopped The plugin-driven server agent for reporting metri 1月 21 11:24:47 raspberrypi systemd[1]: telegraf.service: Start request repeated too quickly. 1月 21 11:24:47 raspberrypi systemd[1]: Failed to start The plugin-driven server agent for reporti 1月 21 11:24:47 raspberrypi systemd[1]: telegraf.service: Unit entered failed state. 1月 21 11:24:47 raspberrypi systemd[1]: telegraf.service: Failed with result 'exit-code'. #こちら↓はスタートとストップ $ sudo systemctl start telegraf $ sudo systemctl enable telegraf |
デフォルトの状態で設置しただけなのに、なにか足りない?Tarballから入れると面倒だなぁ、ちょっとわからんかったので保留・・・
ちょっと正規のやり方でないかもしれませんが、以下のようにして自動起動させる。
1 2 3 4 |
$ sudo cp telegraf/usr/lib/telegraf/scripts/init.sh /usr/local/bin/telegraf.sh $ sudo chmod +x /usr/local/bin/telegraf.sh $ sudo vim /etc/rc.local /usr/local/bin/telegraf.sh #exit 0 の前に追加 |
これでリブートしてps aux | grep telegrafで確認したら起動してた。
DB追加されてる
そしてInfluxDBを見るとDBが追加されてる。
試しにcurlでtelegrafのcpuの中身を見てみると↓データがたくさん蓄積されていた。
1 |
$ curl -G 'http://localhost:8086/query?db=telegraf&pretty=true' --data-urlencode 'q=SELECT * FROM cpu' |
Grafanaで表示してみる
telegrafが集めてInfluxDBが保存しておいてくれたデータを表示してみます。
下にある「Save & Test」を押してうまくいくと「Data source is working」となる↓
グラフを作る
いよいよtelegrafが保存してくれたデータを表示してみます。まずは左の「+」を押してNew dashoboardを選択。
グラフを押します。
「Panel Title」のEditoを選択。
すると以下のようにFROM部分とSelect部分を選択するとグラフが表示されました。
一つの表に複数のグラフを書きたい場合はAdd Queryを押して同じように追加していくと以下のようになります。
タイトルは左側のGeneralタブを押して変更可能。
最終的にこのようになってとりあえずの目標は達成!
しかし大元のホームに主に見たいグラフを表示させる方法はわからない。やりかたありますよね?探してみます。
続いて部屋の温湿度をFluentdでログを送ったやつを表示させてみたいけど、まだ温湿度をFluentdに投げる部分ができてないのでまずはそこからやります。