イスタンブール行きたい

たまに書きたくなります

InfluxDBを触ってみるメモ

IoTにちょっと興味あって(全く未経験)、Rasberry Piを買ってみようかと思ったけど昨今の情勢もあってか値段が高騰している。 そのうち買ってみるつもりだが、安くなるのを待ちつつIoT関連の技術にちょっと触れてみたい。

IoTのプロダクトだと時系列データベースを使っているものが多いらしい。 センサーデータみたいなものをどんどん格納していくのだと思うが、時系列データベースというものが全く想像つかないので、代表格と思われるInfluxDBをちょっと触ってみる。

https://hub.docker.com/_/influxdb のAutomated Setupの部分を参考に、とりあえずDockerでInfluxDBのセットアップ込みですぐに使える状態のものを使う。

docker run -d -p 8086:8086 --name influxdb \
      -v $PWD/data:/var/lib/influxdb2 \
      -v $PWD/config:/etc/influxdb2 \
      -e DOCKER_INFLUXDB_INIT_MODE=setup \
      -e DOCKER_INFLUXDB_INIT_USERNAME=my-user \
      -e DOCKER_INFLUXDB_INIT_PASSWORD=my-password \
      -e DOCKER_INFLUXDB_INIT_ORG=my-org \
      -e DOCKER_INFLUXDB_INIT_BUCKET=my-bucket \
      -e DOCKER_INFLUXDB_INIT_RETENTION=1w \
      -e DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=my-super-secret-auth-token \
      influxdb:latest

BUCKETというものがRDBでいうところのdatabaseっぽい。

コンテナの中に入ってみる。

docker container exec -it influxdb sh

BUCKETのリスト出力。 Docker起動時にDOCKER_INFLUXDB_INIT_BUCKETで指定したmy-bucketが確認できる。

# influx bucket list
ID          Name        Retention   Shard group duration    Organization ID     Schema Type
07c17e53661ef6bf    _monitoring 168h0m0s    24h0m0s         b1326f6776364a21    implicit
bad1a9eb45b1fcb0    _tasks      72h0m0s     24h0m0s         b1326f6776364a21    implicit
213640f9d9ad6b19    my-bucket   168h0m0s    24h0m0s         b1326f6776364a21    implicit

InfluxDBが起動していると、ブラウザで http://localhost:8086/signin にアクセスできるようになっている。 以下のようなログイン画面になっている。

Docker起動時に指定したUSERNAMEとPASSWORDを入力してログインすると、以下のような画面に

とりあえずデータを入れてみる。 CLIからも入れられるみたいだが、せっかくGUIの画面を見ているので、Exampleでも紹介されているCSVをちょっといじった以下のようなCSVをアップロードする。 (後にデータ参照のためダッシュボードを作るときにデータが少なくて面白くなかったので、同じようなデータを適当に追加した)

#datatype,string,long,dateTime:RFC3339,dateTime:RFC3339,dateTime:RFC3339,string,string,double,string,string
#group,false,false,true,true,false,true,false,false,true,true
#default,,,,,,,,,,
,result,table,_start,_stop,_time,region,host,_value,_measurement,_field
,,0,2023-02-22T20:50:00Z,2023-02-22T20:51:00Z,2023-02-22T20:50:00Z,east,A,15.43,cpu,usage_system
,,0,2023-02-23T20:50:00Z,2023-02-23T20:51:00Z,2023-02-23T20:50:20Z,east,B,42.25,cpu,usage_system
,,0,2023-02-24T20:50:00Z,2023-02-24T20:51:00Z,2023-02-24T20:50:40Z,east,C,39.62,cpu,usage_system
,,1,2023-02-25T20:50:00Z,2023-02-25T20:51:00Z,2023-02-25T20:50:00Z,west,A,62.73,cpu,usage_system
,,1,2023-02-26T20:50:00Z,2023-02-26T20:51:00Z,2023-02-26T20:50:20Z,west,B,3.83,cpu,usage_system
,,1,2023-02-27T20:50:00Z,2023-02-27T20:51:00Z,2023-02-27T20:50:40Z,west,C,83.62,cpu,usage_system

#datetypeは文字通りデータ型を指す。 #groupIndicates the column is part of the group key.とのこと。グループキーのメンバーかどうかということだが、どういうことかよくわからない。 RDSでいうところのGROUP BYでキーになるような項目的な感じ? #defaultはデフォルト値

トップ画面から「LOAD YOUR DATA」を選ぶと、データロード方法を選ぶ画面に。 「Flux Annotated CSV」をクリックすると、ファイルアップロード画面に遷移するので上記のCSVをアップロードする。

アップロードできた

データを入れられたので、入れたデータを参照してみる。

トップページに戻り、「BUILD A DASHBOARD」からダッシュボード作成画面を開く。

「ADD CELL」より要素を追加。 GraphやGaugeなど図のタイプを選べるが、デフォルトではGraphになっている。

画面左下でBucketを選択し、GUIでmeasurement(測定データ)、その他項目を絞り込めるようになっている。 右側のSUBMITを押すと、グラフが表示される。

ちなみに、「SCRIPT EDITOR」を押すと、GUIで選んだ条件をクエリとして表すとどうなるのか確認できた。

from(bucket: "my-bucket")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "cpu")
  |> filter(fn: (r) => r["_field"] == "usage_system")
  |> filter(fn: (r) => r["host"] == "A" or r["host"] == "B" or r["host"] == "C")
  |> filter(fn: (r) => r["region"] == "east" or r["region"] == "west")
  |> aggregateWindow(every: 1h, fn: mean, createEmpty: false)
  |> yield(name: "mean")

ごくシンプルだがInfluxDBがどのようなものか何となくのイメージはできた。 センサーデータなどを取得して異常検知などをするIoTとの相性が良いことはわかった。