GrafanaとInfluxDBで作るProxmoxダッシュボード【Docker】

こんにちは。

先日Dockerを使って、ProxmoxのメトリクスをGrafanとInfluxDBで可視化しました。

かなり苦労したので、そのログとして記事に残しておきます。

(当時のぼく)

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">俺だって、GrafanaとInfluxDBでカッコいいダッシュボード作りたーーーい！！！</p>&mdash; ﾛｸｵ / rokuo (@rokuosan_dev) <a href="https://twitter.com/rokuosan_dev/status/1579819306833285124?ref_src=twsrc%5Etfw">October 11, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">やっと出来た！！<br>Proxmox + Grafana + InfluxDB2 でめっちゃカッコいいダッシュボードの完成🎉 <a href="https://t.co/Wx0WpinLuJ">pic.twitter.com/Wx0WpinLuJ</a></p>&mdash; ﾛｸｵ / rokuo (@rokuosan_dev) <a href="https://twitter.com/rokuosan_dev/status/1579883265355558912?ref_src=twsrc%5Etfw">October 11, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## GrafanaとInfluxDBについて

この記事では深く取り上げませんが、簡単に説明だけしておきます。

Grafana はデータの可視化などを行うためのツールです。

InfluxDB は時系列データベースです。

時系列データベースですので、テーブルにはタイムスタンプが必ず存在します。

そのため、InfluxDBでは時系列データを効率よく扱うことができます。

詳しくはそれぞれのドキュメントを参照してください。

<iframe class="hatenablogcard" style="width:100%;height:155px;margin:15px 0;max-width:680px;" title="Grafana のドキュメント | グラファナのドキュメント" src="https://hatenablog-parts.com/embed?url=https://grafana.com/docs/grafana/latest/" frameborder="0" scrolling="no"></iframe>

<iframe class="hatenablogcard" style="width:100%;height:155px;margin:15px 0;max-width:680px;" title="InfluxDB OSS 2.4 Documentation" src="https://hatenablog-parts.com/embed?url=https://docs.influxdata.com/influxdb/v2.4/" frameborder="0" scrolling="no"></iframe>


## 前提

実際に使用した環境は以下の通りです。

| Name | Version |
|:- | :- |
|Proxmox VE | 7.2-7 |
|Ubuntu | 22.04.1 LTS |
|Docker | 20.10.17 |
|Docker Compose | v2.6.0 |
|Grafana | 9.1.8 |
|InfluxDB | v2.4.0 |


ディレクトリ構成は以下の通りです。

```
metrics/
|--grafana/
|--influxdb/
|--docker-compose.yml
```

## docker-compose.yml の作成

早速ですが、以下のようなdocker-compose.ymlを準備してください。

```YAML
version: "3"

services:
  influxdb:
    image: influxdb
    container_name: influxdb
    restart: always
    volumes:
      - ./influxdb:/var/lib/influxdb2
    ports:
      - 8086:8086
      - 8083:8083

  grafana:
    image: grafana/grafana
    container_name: grafana
    user: "root"
    restart: always
    volumes:
      - ./grafana:/var/lib/grafana    
    depends_on:
      - influxdb
    ports:
      - 3000:3000
```

ここでのポイントはgrafanaのユーザーを明示的に指定することです。

Grafanaではv5.1とv7.3でグループを変更したため、権限の問題が発生する場合があります。

正しい対処としては以下のドキュメントを参考にして正しいユーザー名を指定する必要がありますが、今回は試験的にとりあえずrootにしています。

<iframe class="hatenablogcard" style="width:100%;height:155px;margin:15px 0;max-width:680px;" title="Grafana Docker イメージを実行 | グラファナのドキュメント" src="https://hatenablog-parts.com/embed?url=https://grafana.com/docs/grafana/latest/setup-grafana/installation/docker/" frameborder="0" scrolling="no"></iframe>

ProxmoxのホストとDockerのホストが別の場合は、使用するポートをファイアウォールなどで遮断しないように設定しておいてください。

## Influx の設定を行う

コンテナを起動したら、``localhost:8086``にアクセスします。
アクセスして中央にある``GET STARTED``と書かれた青いボタンを押すと画像のようなフォームが表示されます。

それぞれ適切な値を入力して、次に進めてください。

OrganizationとBucketについては、今回は``sample-org``と``proxmox``にしました。

![222848.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1447932/5670a2c3-25f4-274a-88de-33583f6bc7f1.png)

ダッシュボードに接続するとこのようになります。

![223503.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1447932/0424b5a0-8297-431a-5b59-4423dcc12f39.png)

Grafana, Proxmoxでは以下の情報が必要になります。

- Organizationの名前
- APIトークン
- バケットの名前

Organizationの名前とバケットの名前についてはついさっき設定したものですが、トークンは自動生成されるため取得する必要があります。

InfluxDBのダッシュボード左にある``Load Data``から``API Tokens``タブを開きます。

![224228.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1447932/fe6960ce-d08e-a3e2-fce4-261f4a2d1785.png)

画像のように``{ユーザー名}'s Token``という項目があるので、名前をクリックするとトークンが表示されます。

``COPY TO CLIPBOARD``を押すとコピーできるのでメモしておいてください。

ただし、今コピーしたトークンは**全権限を持ったトークンなので厳重に管理してください**。

## Proxmox の設定を行う

ProxmoxからはメトリクスのデータをInfluxDBに流し込む設定をする必要があります。

自分のProxmoxのダッシュボードを開き、データセンターからメトリクスサーバの項目に移動してください。

追加からInfluxDBを選び、画像のように指定します。

サーバやトークンなどについては各自変更してください。

![232143.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1447932/0bd00e0b-adf5-0f1b-3175-01a1ca9e8b13.png)


ここでのポイントは**プロトコルをHTTPにすること**です。

これでProxmox側の設定は終わりです。

## Grafana の設定を行う

``localhost:3000``にアクセスすると、このような画面が表示されます。

初期ユーザーとパスワードはどちらも``admin``となっています。

ログインするとパスワードの変更を求められるので必ず変更しておいてください。

![224923.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1447932/304ac3e6-04f6-b21c-80b8-c491b9d7418a.png)

ログインするとこのようなダッシュボードが表示されます。

![225121.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1447932/5ce31552-2353-8d5c-d110-5e02d605477f.png)

左下の歯車から``Data sources``を選択して、``Add data source``ボタンを押します。

リストからInfluxDBを選ぶとこのようなフォームになります。

![225417.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1447932/a296a3f8-2be8-e4e5-8a1e-52b9fa5b79a4.png)

ここで重要なのは**Query Language をInfluxQL からFlux に変更すること**です。

![225756.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1447932/d834ab3a-fe74-48db-bbdc-1269e4079a7a.png)

Fluxに変更した状態で画像のように残りのフォームを埋めます。

![225723.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1447932/5f761e20-3f14-ba26-e951-6a68f8a17ed5.png)

URLについては**composeで定義したサービス名を使用**してください。

今回の例では、同一のcomposeファイルから起動しているため同じDockerのネットワークに接続されます。
そのため、influxDBのコンテナに接続するためにはinfluxDBのcomposeファイル内で定義したサービス名をURLとして使用します。

InfluxDB Detailsについては、先ほど取得したトークンをTokenに入力してください。

※configuredになっているのは、一番下にあるSave & test というボタンを押したためです。

入力がすべて終わったら、一番下のSave & test をクリックします。

正しく設定できていれば、問題なく接続できるはずです。

## ダッシュボードを作成する

ダッシュボードを1から作るのは少し面倒です。

Grafanaでは作成したダッシュボードを共有することができるため、先人が公開しているテンプレートを使用します。

### ダッシュボードを選ぶ

今回は以下のダッシュボードを選択しました。

``Copy ID to clipboard``からIDをコピーします。

<iframe class="hatenablogcard" style="width:100%;height:155px;margin:15px 0;max-width:680px;" title="Proxmox [Flux] | Grafana Labs" src="https://hatenablog-parts.com/embed?url=https://grafana.com/grafana/dashboards/15356-proxmox-flux/" frameborder="0" scrolling="no"></iframe>

もし、別のものを使用したい場合はこちらから検索してみてください。

<iframe class="hatenablogcard" style="width:100%;height:155px;margin:15px 0;max-width:680px;" title="Dashboards | Grafana Labs" src="https://hatenablog-parts.com/embed?url=https://grafana.com/grafana/dashboards/" frameborder="0" scrolling="no"></iframe>

### ダッシュボードをインポートする

grafanaのダッシュボードにアクセスして、``Dashboards``から``Import``を選ぶとこのようになります。

![231305.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1447932/745f5a20-f5b0-f0b1-8298-0043ac86ac25.png)

``Import via grafana.com``の入力欄に先ほどコピーしたIDを入力してLoadしてください。

OptionsのデータソースからInfluxDBを選択してImportを押します。

![231704.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1447932/3b3ef3e4-dcb8-fc93-dcc3-9b6cc4c353bc.png)

すると...

完成しました🎉

(これは数日後のスクリーンショットなので、InfluxDBにデータを流してすぐはグラフなどはきれいに表示されません)

![233221.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1447932/69b22cd9-f97a-4ecd-145c-a9fcd59f0d76.png)

## おわりに

冒頭にも言いましたが、これを作るのにかなり苦労しました。

同じような環境で同じことをやっているなら参考までにどうぞ。

カッコいいダッシュボード最高！！

## 参考文献

https://ray-channel.hateblo.jp/entry/2022/01/23/231950

https://saelzler.com/tech/use-influxdb-2-as-a-metric-server-for-proxmox/

https://www.youtube.com/watch?v=f2eyVfCTLi0

https://grafana.com/docs/grafana/latest/setup-grafana/installation/docker/

https://grafana.com/docs/grafana/latest/

https://docs.influxdata.com/influxdb/v2.4/