地方在住IT系ニート

bkds

InfluxDBのメモ

#Tech

はじめに

InfluxDBは大量の時系列データを扱うことに長けたデータベースです。
InfluxDBは、CLIで操作する方法とHTTP APIで操作する方法が用意されている。

インストール

今回はUbuntuにインストールするため、こちらを参照します。

# Ubuntu and Debian
# Add the InfluxData key to verify downloads and add the repository
curl --silent --location -O \
https://repos.influxdata.com/influxdata-archive.key
echo "943666881a1b8d9b849b74caebf02d3465d6beb716510d86a39f6c8e8dac7515  influxdata-archive.key" \
| sha256sum --check - && cat influxdata-archive.key \
| gpg --dearmor \
| tee /etc/apt/trusted.gpg.d/influxdata-archive.gpg > /dev/null \
&& echo 'deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive.gpg] https://repos.influxdata.com/debian stable main' \
| tee /etc/apt/sources.list.d/influxdata.list
# Install influxdb
sudo apt-get update && sudo apt-get install influxdb2

インストール後の動作確認

sudo systemctl enable influxdb
sudo systemctl start influxdb
sudo systemctl status influxdb

influxはデフォルトでは8086ポートで動作しています。

初期設定

influx setupコマンドでユーザ、パスワード等の初期設定を実施します。
influx auth createコマンドでAPIトークンの生成を実施します。

influx setup

influx auth create --all-access --host http://{host_ip}:{host_port} --org {org_name}

データ追加

InfluxDBに登録するデータはline protocol形式になっています。
line protocolのフォーマットは下記のようになる。

{measurement},{tag1}={tag_val1},{tag2}={tag_val2} {field1}={field_val1},{field2}={field_val2}

CLI

influx write --bucket {bucket_name} --precision s "
{line protocol data}
"

API

curl --request POST \
--url 'http://{host_ip}:{host_port}/api/v2/write?org={org_name}&bucket={bucket_name}&precision=s' \
--header 'Authorization: Token {TOKEN}' \
--header 'content-type: text/plain' \
--data '
{line protocol data}
'

データ取得

データ取得には、FluxInfluxQLを利用する方法がある。
InfluxQLはInfluxDB 0.xと1.xのためのものですが、互換性があるためInfluxDB 2.xでも利用できます。今回はInfluxDB 2.xを利用しているためFluxのみ利用していこうと思います。

Flux

Fluxには3つの主要な機能がある。

  • from()
    • bucketの指定
  • range()
    • タイムレンジや取得件数の指定
  • filter()
    • フィルタリングルールの指定

過去1時間でmeasurementがhomeにマッチする最後のレコードを取得する方法を下記に示します。

CLI

influx query '
from(bucket: "{bucket_name}")
    |> range(start: -1h)
    |> filter(fn: (r) => r._measurement == "home")
    |> last()
'

API

curl --request POST \
--url 'http://{host_ip}:{host_port}/api/v2/query?org={org_name}' \
--header 'Accept: application/csv' \
--header 'Authorization: Token {TOKEN}' \
--header 'Content-type: application/vnd.flux' \
--header 'content-type: text/plain' \
--data '
from(bucket:"{bucket_name}") 
    |> range(start: -1h) 
    |> filter(fn: (r) => r._measurement == "home") 
    |> last()
'
にほんブログ村 IT技術ブログ IT技術メモへPVアクセスランキング にほんブログ村