InfluxDB2.0+Grafana+Telegrafの構築

# サーバの使用状況を確認したい
先日からいろんな方法を調べていて色々わかってきた。色々なリソース監視ツールがある中、先日投稿した原始的モノから最近のやつまで試してみて、最終的に表題の構成に落ち着きました。インストール方法はインターネット上に溢れていますが、InfluxDB2.0/Grafana/Telegrafをdockerコンテナで構築するという情報はなかったと思うのでレポートします。CPU使用率のグラフが見れるところまで書きます。

**確認環境**

* docker 19.03.8
* docker-compose 1.26.0
* os ubuntu20


# サービスの起動
Dockerとdocker-composeコマンドが入っていることを前提に説明をはじめます。以下のファイル２つ(docker-compose.yml, telegraf.conf)を作成し、`docker-compose up -d`で起動してください。この時点でInfluxDBは、初期ユーザとパスワードでセットアップが完了した状態で`http://<サーバのIPアドレス>:8086`に起動しています。InfluxDBとGrafanaは設定やデータが永続化されるようにdataディレクトリをマウントしています。Telegrafはホスト側のデータを収集するために必要なデータを読み込み権限の見つけてマウントしています。

```telegraf.conf
[global_tags]

[agent]
  interval = "60s"
  round_interval = true
  metric_batch_size = 1000
  metric_buffer_limit = 10000
  collection_jitter = "0s"
  flush_interval = "10s"
  flush_jitter = "0s"
  precision = ""
  hostname = ""
  omit_hostname = false

[[outputs.influxdb_v2]]
  urls = ["http://influxdb:8086"]
  token = "my-super-secret-auth-token"
  organization = "my-org"
  bucket = "my-bucket"
  timeout = "5s"

[[inputs.ping]]
interval = "5s"
urls = ["google.com", "amazon.com", "github.com"]
count = 4
ping_interval = 1.0
timeout = 2.0

[[inputs.cpu]]
  percpu = true
  totalcpu = true
  collect_cpu_time = false
  report_active = false

[[inputs.disk]]
  ignore_fs = ["tmpfs", "devtmpfs", "devfs", "iso9660", "overlay", "aufs", "squashfs"]

[[inputs.diskio]]

[[inputs.kernel]]

[[inputs.mem]]

[[inputs.processes]]

[[inputs.swap]]

[[inputs.system]]
```

```docker-compose.yml
version: "3"
services:
  influxdb:
    image: influxdb:2.0
    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
      - DOCKER_INFLUXDB_INIT_RETENTION=1w
      - DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=my-super-secret-auth-token
    volumes:
      - ./data/influxdb2:/var/lib/influxdb2 
      - ./data/influxdb2-config:/etc/influxdb2
    container_name: influxdb
  grafana:
    image: grafana/grafana
    container_name: grafana
    ports:
      - 3000:3000
    volumes:
      - ./data/grafana:/var/lib/grafana
    depends_on:
      - influxdb
  telegraf:
    image: telegraf
    container_name: telegraf
    volumes:
      - ./telegraf.conf:/etc/telegraf/telegraf.conf:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /sys:/rootfs/sys:ro
      - /proc:/rootfs/proc:ro
      - /etc:/rootfs/etc:ro
    environment:
      HOST_PROC: /rootfs/proc
      HOST_SYS: /rootfs/sys
      HOST_ETC: /rootfs/etc
    depends_on:
      - influxdb
```

# 設定の変更
上記のdocker-compose upのままでは動かないので設定を変えていきます。


## Grafanaの永続ボリュームの権限変更
Grafana内の実行権限と合わせた後にコンテナを再起動します。docker-compose.ymlファイルと同じディレクトリ内で以下を実行します。

```bash
docker run -v $(pwd)/data/grafana:/dir alpine chown 472:472 /dir -R #権限変更
docker-compose restart #再起動
```

## InfluxDBバケットにDRBPを設定

:::note info
最新のGrafanaではFluxクエリによる接続に対応しています(Beta)。Fluxを選択する場合はこの章の設定は不要です。
:::

InfluxDB1.xはデータをDRBP(Database + Retention policy)に保持します。InfluxDB2.0ではデータはバケットに保持されます。したがって、1.xデータモデルを使用してクエリするGrafanaのために、バケットをDRBPにマッピングしてあげる必要があります。以下のコマンドを実行するとv1のDRBPマッピングが作成されます。

```bash
$ docker exec -it influxdb /bin/bash -c \
  'influx v1 dbrp create \
  --db my-bucket \
  --rp example-rp \
  --default \
  --bucket-id  `influx bucket list -n my-bucket --hide-headers|cut -f 1`'

# 以下のような表示がでればOKです
ID                      Database        Bucket ID               Retention Policy        Default Organization ID
07746af5969b7000        my-bucket       579252e1e6cf0908        example-rp              true    1afbfa127ca1e6a7

```
もし表示されなければ、`docker exec -it influxdb influx bucket list -n my-bucket --hide-headers`コマンドで一列目のIDを控えておき、--bucket-id の引数に指定してください。

# Grafanaの設定



`http://<サーバのIPアドレス>:8086`にアクセスし、usernameとpasswordにadminとadminを入力してください。ログイン後にパスワードの変更を求められますが、適当に変更するかSkipを押下します。

![Screen Shot 2021-04-30 at 16.38.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96637/247558f1-37aa-740a-9255-267286d4c95e.png)

左のパネルから設定>DataSourcesを押下します。ADD Data Sroucesボタンを押下し、InfluxDBを検索し設定を開始します。
![Screen Shot 2021-04-30 at 16.41.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96637/eab33f26-38cc-5493-3e0f-13d9bddcafde.png)


HTTPのURLに`http://influxdb:8086`を入力します。![Screen Shot 2021-04-30 at 16.45.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96637/5008e451-9d52-9a90-a535-e937290ad17a.png)

:::note info
Fluxクエリを利用する場合、QueryLanguageでFluxを選択し、Databaseに`my-bucket`、Userに`my-user`、Passwordに`my-pawssword`を設定すればOKのはずです。
:::

Custom HTTP HeadersのHeaderに`Authorization`、Valueに`Token my-super-secret-auth-token`を設定し、Databaseに`my-bucket`を設定、Userに`my-user`を設定、Passwordに`my-pawssword`、HTTPMethodに`GET`を設定し、「Save & Test」を押下します。「Data source is working」が表示されればOKです。
![Screen Shot 2021-04-30 at 16.47.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96637/90d82acd-cc18-07a9-c4d1-f1b7a4670a42.png)


左のパネルの＋からDashboardを追加します。Queryで、select measurementを押すとプルダウンでCPUなどが出てくるので、それに沿って設定していきます。
![Screen Shot 2021-04-30 at 16.53.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96637/74c55c3f-3bb0-992b-d0f1-5ba4891d57cf.png)


画像のように設定すると上にグラフが表示されたら完了です。
![Screen Shot 2021-04-30 at 16.56.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96637/0c6ab24b-ac1b-0fe4-37ad-a22602a7768f.png)

# (おまけ)保持期間の設定
influxDB 1.xではretention policyというデータ保持ルールを定義しデータモデルに適用することでストレージ容量増加やクエリ検索速度低下に対処することができます。具体的には以下のような柔軟なルールを作成することができます。

* 10秒単位のデータを30分単位のデータに自動集計する
* 2時間以上前の生の10秒単位のデータを自動削除する
* 52週間以上前の30分単位のデータを自動削除する

InfluxDB 2.0でもバケットをDRBPにマッピングすることで同様のデータ保持ポリシーを適用することができますが、バケットに対しては**削除タイミングの設定**と**Tasks**を組み合わせて対処することを推奨しているようです。削除タイミングの設定は、バケットに対しての設定で、InfluxDB2.0のWEBアプリのバケット設定から削除期間を変更することができます。デフォルトは7日です。

![Screen Shot 2021-12-18 at 13.39.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96637/524e374c-516c-a396-c945-7ab6ada4186a.png)

Tasksは定期的にFluxクエリを実行するための機能で、ダウンサンプリングのクエリを登録できます。気が向いたら追記しますが気になる方は以下のリンクを参考に設定に挑戦してみてください。


https://www.influxdata.com/blog/downsampling-influxdb-v2-0/


# (おまけ)Kapacitorの設定
以下のコマンドを実行し、V1用のクレデンシャルを発行します。

```bash
docker exec -it influxdb /bin/bash -c \
  'influx v1 auth create \
  --org my-org \
  --username my-user \
  --read-bucket `influx bucket list -n my-bucket --hide-headers|cut -f 1` \
  --write-bucket `influx bucket list -n my-bucket --hide-headers|cut -f 1` \
  --password my-password'
```

気が向いたら追記します。


# 参考にしたもの
https://docs.influxdata.com/influxdb/v2.0/query-data/influxql/

https://tech.quickguard.jp/posts/telegraf-aggregation/

https://docs.influxdata.com/influxdb/v1.8/guides/downsample_and_retain/