Prometheus + Grafana + Docker Composeインストール

Prometheus、GrafanaをDockerにインストールして動作させる方法について説明する。

Prometheus、GrafanaをDockerにインストール

概要

Prometheus、GrafanaをDocker Composeでインストールし、動作させてみる。

Docker設定

Prometheus

PrometheusをDockerにインストールするためのファイルとディレクトリを構成する。

  1. まずインストールディレクトリを適当な場所に作成する。
mkdir prometheus-grafana
cd prometheus-grafana
  1. Dockerを実行するためにdocker-compose.ymlファイルを作成する。 prometheus-grafana/docker-compose.yml
version: '3.7'  # ファイル規格バージョン
services:       # この項目の下に実行するコンテナを定義
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    volumes:
      - ./prometheus/config:/etc/prometheus
      - ./prometheus/volume:/prometheus
    ports:
      - 9090:9090 # アクセスポート設定(コンテナ外部:コンテナ内部)
    command: # web.enable-lifecycleはAPI再起動なしで設定ファイルをreloadできるようにする
      - '--web.enable-lifecycle'
      - '--config.file=/etc/prometheus/prometheus.yml'
    restart: always
    networks:
      - promnet

networks:
  promnet:
    driver: bridge
  • Prometheus DockerHub image
  • Prometheusの保存ディレクトリは./prometheus/volumeに指定した。
  • Prometheusの設定ディレクトリは./prometheus/configに指定した。
  1. Prometheus関連設定ファイルを配置するディレクトリを作成する。
mkdir prometheus
mkdir prometheus/config
  1. /prometheus/configディレクトリ内に設定ファイル(prometheus.ymlrule.yml)を作成する。

参照: Prometheus Configuration

prometheus-grafana/prometheus/config/prometheus.yml

global:
  scrape_interval: 15s     # scrape targetの基本intervalを15秒に変更 / default = 1m
  scrape_timeout: 15s      # scrape requestがtimeoutする長さ / default = 10s
  evaluation_interval: 2m  # ruleをどれくらい頻繁に検証するか / default = 1m

  # Attach these labels to any time series or alerts when communicating with
  # external systems (federation, remote storage, Alertmanager).
  external_labels:
    monitor: 'codelab-monitor'       # 基本的に付けるラベル
  query_log_file: query_log_file.log # prometheusのクエリログを記録。なければ記録しない

# ルールをロードし、evaluation_interval設定に従って定期的に評価する。
rule_files:
  - "rule.yml"  # ファイル位置はprometheus.ymlと同じ場所
  - "rule2.yml" # 複数指定可能

# メトリクスを収集するエンドポイント。ここではPrometheusサーバー自身を指す。
scrape_configs:
  # この設定で収集した時系列に`job=<job_name>`としてジョブ名を設定する。
  # metrics_pathの基本パスは'/metrics'で、schemeの基本値は`http`。
  - job_name: 'monitoring-item' # job_nameはすべてのscrape内で一意でなければならない
    scrape_interval: 10s      # globalでdefault値を定義しているため省略可能
    scrape_timeout: 10s       # globalでdefault値を定義しているため省略可能
    metrics_path: '/asdf'     # オプション - prometheusがmetrics取得時に参照するURIを変更できる | default = /metrics
    honor_labels: false       # オプション - ラベル衝突がある場合にラベルを変更するか設定 | default = false
    honor_timestamps: false   # オプション - honor_labelsがtrueの場合、metrics timestampが露出する | default = false
    scheme: 'http'            # オプション - request送信時のscheme設定 | default = http
    params:                   # オプション - request送信時のparam
      user-id: ['myemail@email.com']

    # その他authorization設定
    # service discovery設定(sd)

    # 実際にscrapeするターゲットに関する設定
    static_configs:
      - targets: ['localhost:9090', 'localhost:9100', 'localhost:80'] ## prometheus, node-exporter, cadvisor  
        labels: # オプション - scrapeして取得するmetricsすべてに付けるラベル
          service : 'monitor-1'
    
    # relabel_config - scrape前のlabelを修正
    # metric_relabel_configs - 取得対象のラベルを動的に書き換える設定(drop, replace, labeldrop)

prometheus-grafana/prometheus/config/rule.yml

groups:
- name: example # ファイル内でuniqueでなければならない
  rules:

  # Alert for any instance that is unreachable for >5 minutes.
  - alert: InstanceDown
    expr: up == 0
    for: 5m
    labels:
      severity: page
    annotations:
      summary: "Instance {{ $labels.instance }} down"
      description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes."

  # Alert for any instance that has a median request latency >1s.
  - alert: APIHighRequestLatency
    expr: api_http_request_latencies_second{quantile="0.5"} > 1
    for: 10m
    annotations:
      summary: "High request latency on {{ $labels.instance }}"
      description: "{{ $labels.instance }} has a median request latency above 1s (current value: {{ $value }}s)"
  1. Dockerが修正できるように/prometheusディレクトリの権限を変更する。
sudo chmod -R 777 ./prometheus

最終的なファイルをすべて作成すると、次のような構造になる。

.
├── docker-compose.yml
└── prometheus
    └── config
        ├── prometheus.yml
        └── rule.yml

Grafana

Grafanaはデータ可視化、監視、分析のためのオープンソースプラットフォームである。

  1. docker-compose.ymlservices:の下にGrafana設定を追加する。
  grafana:
    image: grafana/grafana
    container_name: grafana
    # user: "$GRA_UID:$GRA_GID"
    ports:
      - 3000:3000 # アクセスポート設定(コンテナ外部:コンテナ内部)
    volumes:
      - ./grafana/volume:/var/lib/grafana
    restart: always
    networks:
      - promnet

Docker実行

Dockerイメージを作成し、コンテナの起動をまとめて処理するコマンドを実行する。

docker compose up -d

コンテナを停止するには次のコマンドを実行する。

docker compose stop

コンテナを再起動するには次のコマンドを実行する。

docker compose start

実行後には、以下のようなvolumeディレクトリが作成されることを確認できる。

.
├── docker-compose.yml
├── grafana
│   └── volume
│       ├── grafana.db
│       ├── grafana.db-journal
│       └── plugins
└── prometheus
    ├── config
    │   ├── prometheus.yml
    │   ├── query_log_file.log
    │   └── rule.yml
    └── volume
        └── data
            ├── chunks_head
            ├── lock
            ├── queries.active
            └── wal
                └── 00000000

接続確認

  • Prometheus
    • http://localhost:9090
  • Grafana
    • http://localhost:3000
      • 基本アカウントID/PW: admin/admin

参考

設定ファイルはGitHubに置いてある。