InfluxDB2.0+Grafana+Telegrafの構築


サーバの使用状況を確認したい

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

確認環境

  • docker 19.03.8
  • docker-compose 1.26.0
  • os ubuntu20

サービスの起動

Dockerとdocker-composeコマンドが入っていることを前提に説明をはじめます。以下のファイル2つ(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ファイルと同じディレクトリ内で以下を実行します。

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

InfluxDBバケットにDRBPを設定

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

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

$ 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を押下します。

左のパネルから設定>DataSourcesを押下します。ADD Data Sroucesボタンを押下し、InfluxDBを検索し設定を開始します。

HTTPのURLにhttp://influxdb:8086を入力します。

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です。

左のパネルの+からDashboardを追加します。Queryで、select measurementを押すとプルダウンでCPUなどが出てくるので、それに沿って設定していきます。

画像のように設定すると上にグラフが表示されたら完了です。

(おまけ)保持期間の設定

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

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

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

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

(おまけ)Kapacitorの設定

以下のコマンドを実行し、V1用のクレデンシャルを発行します。

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'

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

参考にしたもの