Grafana の設定と可視化

約6分で読めます

Grafana による docker クラスタの監視

概要

コンテナのメモリ使用状況と死活監視に関する可視化・改善作業の記録

本作業では、Prometheus および Grafana を用いて、Docker コンテナのリソース使用状況と死活判定を可視化するための環境構築と改善を行った。以下にその過程と得られた知見を記す。

1. Prometheus/Grafana 監視スタックの構築とネットワーク調整

初期構築において、以下の構成で Docker Compose を用いた監視基盤を構築した:

  • Prometheus:メトリクス収集
  • Grafana:可視化
  • cAdvisor:コンテナリソース監視
  • node-exporter:ホスト OS メトリクス収集
  • Alertmanager(いつか使う):アラート通知

(ところで)この過程で以下のような問題と解決があった:

  • cadvisor の静的 IP(192.168.xxx.12)を prometheus.yml に直接記述したが、Prometheus からのアクセスに失敗した。
  • 対策として、prometheus.yml のスクレイプターゲットをコンテナ名(cadvisor:8080)指定に変更することで到達可能となり、メトリクス収集に成功した。(IP 入力ミス?ではないと思いますが…)
  • prometheus.yml をコンテナに反映するには、Docker ボリュームではなくホストの設定ファイルを明示的にマウントする必要がある.すっかり忘れていた.
volumes:
  - ./config/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml

node-exporter の導入

node-exporter を監視対象に追加するため、Docker Compose に以下のようなサービス定義を追加した:

node-exporter:
  image: prom/node-exporter:latest
  container_name: node-exporter
  restart: unless-stopped
  ports:
    - "9100:9100"
  networks:
    my_network:
      ipv4_address: xxx.xxx.xxx.10
  pid: "host"
  volumes:
    - /proc:/host/proc:ro
    - /sys:/host/sys:ro
    - /:/rootfs:ro
  command:
    - "--path.procfs=/host/proc"
    - "--path.sysfs=/host/sys"
    - "--path.rootfs=/rootfs"

Prometheus 側には以下の設定を prometheus.yml に追加し、docker compose restart prometheus により適用した:

- job_name: "node-exporter"
  static_configs:
    - targets: ["node-exporter:9100"]

最初 localhost:9100 と書いたために /targets 上で UP 状態にならなかったが、Prometheus は別コンテナで動作しているため、localhost は node-exporter を指さず自分自身を指す.node-exporter:9100(サービス名)で指定する必要があることを確認した.

可視化詳細

1. コンテナのメモリ使用量に関する可視化

Prometheus メトリクス container_memory_usage_bytes{image!=""} をもとに、クラスタ全体のメモリ使用量を可視化するクエリを検討した。この際、「100%」の基準値として 16GiB を設定する要望があり、以下のクエリを用いることとした:

sum(container_memory_usage_bytes{image!=""}) / 17179869184 * 100

この式により、全体のメモリ使用量を 16GiB を基準とした割合(%)で表示でき、Grafana の Gauge パネル等で活用可能となった。

2. container_last_seen に基づくコンテナ稼働状況の可視化

各コンテナの「生死」を判定するために、container_last_seen メトリクスを使用した。このメトリクスは各コンテナが最後に観測された Unix 時刻(秒)を示す gauge であり、以下のクエリを用いた:

(time() - container_last_seen{image!=""}) < 30

当初、Grafana にて value=14 等の数値が表示されてしまい、死活判定がうまくできていなかったが、これは Prometheus クエリにおいて instant モードが無効であり、range query として扱われていたことが原因であった。instant = true を明示的に設定することで、意図通り 0 または 1 の出力となるよう改善した。

ただ,この可視化は廃止した.代替案として,以下のクエリによるパネルをコンテナ名だけ作成した.

time() - max(container_last_seen{name="gitlab"})

このクエリにより、gitlab コンテナが最後に観測された時刻から現在までの経過時間を表示できる.これが Threshold 以上以下で UP,Down を表示する設計とした. Value Mapping は Table の Option から設定可能.

Grafana の Dashboard Json ソース

今後の展望

もっと美しいダッシュボードを作る.