InfluxDB 2.1 ことはじめ

# はじめに

InfluxDB とは、時系列データに特化した OSS のデータベースです。大量データを高速に処理できるのが特徴のようです。初心者なので記事の正確性は保証できませんが、日本語情報が少ないので少しでも足しになればと思い書きました。

# 参考

- [Docker Hub/influxdb (公式)](https://hub.docker.com/_/influxdb)
- [InfluxDB OSS 2.1 Docs (公式)](https://docs.influxdata.com/influxdb/v2.1/)
- [InfluxDBの2.0を試してみる](https://zenn.dev/nobu/scraps/87437274f111e9)
- [RDBエンジニアから見たInfluxDB -時系列DBってRDBとはどう違うの？](https://www.sraoss.co.jp/wp-content/uploads/files/event_seminar/material/2020/dbts068_session_RDB.pdf)
- [InfluxDB入門](https://www.magata.net/memo/index.php?InfluxDB%C6%FE%CC%E7)
- [InfluxDB 2.0 を使う(1)　値の登録・取得を試す](https://qiita.com/riverplus/items/5de5e830ddb622856209)
- [InfluxDB 2.0 を使う(2)　色々な値の取得を行う](https://qiita.com/riverplus/items/20456e4188a4c0f5f62d)

# 前提

docker や docker-compose が使えるようになっているという前提。動作確認済は下記のバージョン

- Docker version 20.10.12, build e91ed57
- Docker Compose version v2.2.3

# InfluxDB 起動

docker-compo.yml を配置して下記のコマンドを実行する。

```bash
mkdir conf
mkdir data
# デフォルトの config.yml を作成
docker run --rm influxdb:2.1 influxd print-config > ./conf/config.yml
docker-compose up -d
```

```yaml:docker-compose.yml
version: '3'

services:
  db:
    image: influxdb:2.1
    ports:
      - '8086:8086'
    environment:
      - DOCKER_INFLUXDB_INIT_MODE=setup
      - DOCKER_INFLUXDB_INIT_USERNAME=my-user
      - DOCKER_INFLUXDB_INIT_PASSWORD=my-password
      - DOCKER_INFLUXDB_INIT_ORG=my-org
      - DOCKER_INFLUXDB_INIT_BUCKET=my-bucket
    volumes:
      - ./data:/var/lib/influxdb2
      - ./conf/config.yml:/etc/influxdb2/config.yml
```

[公式の用語集](https://docs.influxdata.com/influxdb/v2.1/reference/glossary/) によると、下記のように説明がある。

<dl>
  <dt><a href="https://docs.influxdata.com/influxdb/v2.1/reference/glossary/#organization">organization</a></dt>
  <dd>A workspace for a group of users. All dashboards, tasks, buckets, members, and so on, belong to an organization.</dd>
  <dd>(deepLによる機械翻訳) ユーザーグループのためのワークスペース。ダッシュボード、タスク、バケット、メンバーなど、すべて組織に属します。</dd>
  <dd>(私の理解) RDB のスキーマのようなもの。</dd
  <dt><a href="https://docs.influxdata.com/influxdb/v2.1/reference/glossary/#bucket">bucket</a></dt>
  <dd>A bucket is a named location where time series data is stored. All buckets have a retention period. A bucket belongs to an organization.</dd>
  <dd>(deepLによる機械翻訳) バケットとは、時系列データを保存するための名前付きの場所である。すべてのバケットには保存期間があります。バケットは組織に所属する。</dd>
  <dd>(私の理解) RDB のテーブルスペースのようなもの。</dd>
</dl>

# Web UI へアクセス

InfluxDB 1.0 の途中から Web UI が無くなって Chronograf に分離されたと書いてあったのだが、1.x 系列の話のようだ。2.x からはまた Web UI が組み込まれたらしい。Chronograf で何とかしようと思って無駄な時間を費やしてしまったので、後から追ってくる人は気を付けて欲しい。

Web ブラウザで 8086 ポートへアクセスすると、ログイン画面が表示されるので、docker-compose.yml で指定したユーザ名とパスワードでログインする。

**ログイン画面**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168765/0048bfbf-fbdb-9214-859c-f3d02c253dcf.png)

**ログイン後のトップページ**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168765/408c3eef-f8b6-43a7-aaba-a76b9423e736.png)

後から API 経由でデータ登録する際に Token が必要になるようなのでメモしておく。
Token は 「Data」-「API Tokens」から取得できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168765/017317fe-8e73-dbe2-5589-4c6f11046dfe.png)

# データを書き込む

[公式の v2 API Docs](https://docs.influxdata.com/influxdb/v2.1/api/#tag/Write) によると、InfluxDB にデータを書き込む為には下記の5つの情報が必要だと書いてある。

>* organization name or ID – See View organizations for instructions on viewing your organization ID.
>* bucket – See View buckets for instructions on viewing your bucket ID.
>* API token – See View tokens for instructions on viewing your API token.
>* InfluxDB URL – See InfluxDB URLs.
>* data in line protocol format.

## データを書き込む (PowerShell)

PowerShell でデータを登録してみる。
ここで使う PowerShell は Core のほうではなく、 Windows PowerShell v5.1 のほう。
[PowerShell-Influx](https://github.com/markwragg/PowerShell-Influx) というモジュールが公開されていたのでこれを使うことにする。

**インストール**
```powershell
Install-Module Influx -Scope CurrentUser
```

[README.md](https://github.com/markwragg/PowerShell-Influx/blob/master/README.md) に使い方が載っていたが、これは v1.x 用のもののようで、このまま実行しても上手く登録できなかった。

[Write-Influx.md](https://github.com/markwragg/PowerShell-Influx/blob/master/Documentation/Write-Influx.md) により詳細なドキュメントがあり、 v2.x の構文が載っていたため、これを参考にして、1秒ごとにCPU使用率を書き込んでみる。
先ほど docker-compose.yml で設定した organization, bucket と、Web UI から取得した API Token を使う。

```powershell
while ($true) {
    $metrics=@{
        CPU=Get-WmiObject Win32_PerfFormattedData_PerfOS_Processor | where { $_.Name -eq '_Total' } | Select -ExpandProperty PercentProcessorTime
    }
    Write-Influx -Measure Server -Tags @{Hostname=$env:COMPUTERNAME} -Metrics $metrics -Server http://your-hostname:8086 -Organisation "my-org" -Bucket "my-bucket" -Token "your-api-token"
    echo $metrics
    Start-Sleep 1
}
```

Measurement は、[公式の用語集](https://docs.influxdata.com/influxdb/v2.1/reference/glossary/) を読んでもよくわからなかった。参考サイトを読んで下記のように理解した。

<dl>
  <dt><a href="https://docs.influxdata.com/influxdb/v2.1/reference/glossary/#measurement">measurement</a></dt>
  <dd>The part of InfluxDB’s structure that describes the data stored in the associated fields. Measurements are strings.</dd>
  <dd>(DeepL) InfluxDBの構造体のうち、関連するフィールドに格納されているデータを記述する部分。計測値は文字列。</dd>
  <dd>(私の理解) フィールドをいくつかまとめたグループ名</dd>
</dl>

## データを書き込む (Python)

次に、Python でデータ登録してみる。
Python では、公式から [influxdb-client-python](https://github.com/influxdata/influxdb-client-python) というモジュールが出ているのでこれを使うことにする。余談だが、v1.x 系列のモジュールは [InfluxDB-Python](https://github.com/influxdata/influxdb-python) というモジュールで、 v2.x 系列とは別になっているようなので注意したい。

**Python実行環境の起動**

```bash
docker run -it --rm python:3 bash
```

**インストール**

```bash
pip install 'influxdb-client[ciso]' psutil
```

**CPU使用率を書き込む**

```python
import influxdb_client
import os
import psutil
import time
from influxdb_client.client.write_api import SYNCHRONOUS

client = influxdb_client.InfluxDBClient(url="http://your-hostname:8086", token="your-api-token", org="my-org")
write_api = client.write_api(write_options=SYNCHRONOUS)

while True:
    cpu = psutil.cpu_percent()
    p = influxdb_client.Point("my_measurement") \
        .tag("Hostname", os.uname()[1]) \
        .field("CPU", cpu)
    write_api.write(bucket="my-bucket", record=p)
    time.sleep(1)
```

## データを書き込む (Telegraf)

未確認。そのうち追記したい。

# データの参照 (Web UI)

Web UI から「Explorer」を選択し、bucket や measurement、field、期間 を UI からぽちぽち選択し「Submit」ボタンを押下するとグラフが見えた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168765/ddec0915-108b-e0c0-dd89-acde5a2c161f.png)