プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2021/12/18

Telegraf + InfluxDB + Garafana でサーバーリソースを可視化する

update2021/12/20 event_note2021/12/18 14:50

CPUやメモリなどのリソースを収集して閲覧したいなと思い、ググってみるとこの組み合わせが良さそうでした。
Telegraf でデータを取得して InfluxDB に書き込み、Grafana で InfluxDB のデータを読み込んで可視化します。

個人的に InfluxDB と Grafana は使ったことありますが、Telegraf は今回初めて使いました。

尚、この3つの頭文字を取って TIG Stack と呼んでいるページもいくつか見かけました。

環境

  • Ubuntu 20.04
  • Docker 20.10.7
  • Telegraf 1.20.4
  • InfluxDB 1.8.6
  • Grafana 7.5.7

Telegraf と Grafana は現時点の最新のバージョンですが、InfluxDB は 2.0 系ではなく 1.8.6 を使いました。
InfluxDB 2.0 を使ったことがないのと、参考にした Telegraf の設定ファイルのサンプルが InfluxDB 2.0 ではないものばかりだったからです。

また、Telegraf, InfluxDB, Grafana は全て Docker (docker-compose) を使って動かします。

docker-compose.yaml のサンプル

以下のような docker-compose.yaml を作成しました。

version: '3.1'
services:
  telegraf:
    container_name: telegraf
    image: telegraf
    restart: always
    volumes:
      - ./telegraf.conf:/etc/telegraf/telegraf.conf:ro
    depends_on:
      - influxdb
    links:
      - influxdb
    networks:
      - common
  influxdb:
    container_name: influxdb
    image: influxdb:1.8.6
    restart: always
    ports:
      - 8086:8086
    volumes:
      - influxdb:/var/lib/influxdb
    networks:
      - common
  grafana:
    container_name: grafana
    image: grafana/grafana
    restart: always
    links:
      - influxdb
    ports:
      - 3000:3000
    volumes:
      - grafana:/var/lib/grafana
    networks:
      - common
networks:
  common:
    external: true
volumes:
  influxdb:
  grafana:

common というネットワークを共通で使っているので、あらかじめ docker network create で作成しておく必要があります。

Telegraf の設定

telegraf.conf を作成します。

以下のページにちょうど良いのがあるのでこれをそのまま使いました。

後述しますが、Grafana のダッシュボードのテンプレートもこれを使いました。
上記の設定をコピーしたら最低限以下の設定だけ変更します。

  • [agent] > hostname にマシン名を設定
    • 設定しないと自動で設定されますが、起動の度に変わるので設定しておいたほうがよいと思います。
    • 環境変数が使えるので、hostname = "$HOSTNAME" のようにも書けます。
  • [[outputs.influxdb]] > urls を InfluxDB の URL に変更
    • 上記の docker-compose.yaml の場合、URL は http://influxdb.common:8086 のようにコンテナ名とネットワーク名を使っても指定できます。

他は必要に応じて設定します。

起動

$ docker-compose up

デーモン化したい場合は -d を指定します。
起動すると InfluxDB に Telegraf 用のデータベースを自動で作成してくれます。
(データベース名は telegraf.conf で設定できます。)

Grafana の設定

Grafana にアクセスし、ログインします。

初期 ID とパスワードはどちらも admin です。

DB の登録

Configuration > Data Sources > Add data source > InfluxDB を選択します。

URLDatabase の2つを設定します。
今回の例では以下のように設定します。

  • URLhttp://influxdb.common:8086 を設定
  • Databasetelegraf_metrics を設定

ダッシュボードの作成

Telegraf 用のテンプレートがあるので、それをインポートするのが楽です。
テンプレートは以下のページで探せます。

今回は以下のテンプレートを使いました。

上記から JSON ファイルをダウンロードし、Grafana の左メニューの + ボタンからインポートします。
インポートの際、データベースは telegraf_metrics を選択します。

ダッシュボードにアクセスすると以下のような画面が表示されます。

かっこいい画面が簡単に作成できました。

リテンションポリシーの設定

telegraf.conf の [[outputs.influxdb]] > retention_policy でリテンションポリシーを指定できますが、ここが未指定だとデフォルトの autogen が使用され、データが無期限に保存されることになるので指定します。
例えば、リテンションポリシー名に hoge と指定します。

この状態で動作させると、hoge というリテンションポリシーが存在しないというエラーが出るので、InfluxDB のコンテナに入ってリテンションポリシーを作成します。

$ docker exec -it influxdb bash

コンテナに入ったら以下のコマンドでリテンションポリシーを作成します。

# influx
> CREATE RETENTION POLICY "リテンションポリシー名" ON "データベース名" DURATION "期間" REPLICATION 1 DEFAULT

例えば、今回は以下のように指定します。

CREATE RETENTION POLICY "hoge" ON "telegraf_metrics" DURATION 1h REPLICATION 1 DEFAULT

上記のコマンドではデータの保存期間を1時間に設定しています。