Prometheusの始め方 - Prometheusドキュメント

このページはPrometheus公式ドキュメント和訳+αの一部です。

GETTING STARTED

このガイドは、Hello World形式のチュートリアルである。 簡単なサンプルのセットアップを通して、Prometheusをインストールし、設定し、利用する方法を示す。 ローカルで、Prometheusをダウンロードし、実行し、自分自身とサンプルアプリケーションをscrapeするように設定することになる。 そして、収集した時系列を利用するためのクエリ、ルール、グラフに取り組むことになる。

Prometheusのダウンロードと実行

自分のプラットフォームに合ったPrometheusの最新リリースをダウンロードし、展開、実行する

tar xvfz prometheus-*.tar.gz
cd prometheus-*

Prometheusを起動する前に、設定をしよう。

自分自身を監視するPrometheusの設定

Prometheusは、監視対象のHTTPのエンドポイントをscrapeすることで監視対象からメトリクスを収集する。 Prometheusはまた自分自身に関して同じ方法でデータをexposeしているので、自分自身の状態をscrapeし、監視することができる。

自分自身のデータしか収集しないPrometheusサーバーは、実際は特に有益ではないが、最初の例としては良い。 以下のPrometheusの基本的な設定をprometheus.ymlという名前のファイルに保存する。

global:
  scrape_interval:     15s # By default, scrape targets every 15 seconds.

  # Attach these labels to any time series or alerts when communicating with
  # external systems (federation, remote storage, Alertmanager).
  external_labels:
    monitor: 'codelab-monitor'

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # Override the global default and scrape targets from this job every 5 seconds.
    scrape_interval: 5s

    static_configs:
      - targets: ['localhost:9090']

訳注: external_labelsには、ある組織内のPrometheusはそれぞれユニークな値を付けるべきである。

設定項目の全ての仕様については、設定のドキュメントを参照すること。

Prometheusの起動

新しく作成した設定ファイルでPrometheusを起動するには、Prometheusのバイナリがあるディレクトリに移動して、以下のコマンドを実行する

# Start Prometheus. 
# By default, Prometheus stores its database in ./data (flag --storage.tsdb.path).
./prometheus --config.file=prometheus.yml

Prometheusが起動し、localhost:9090でPrometheus自体のステータスページを見ることができるはずである。 Prometheusが自分自身のデータをメトリクスのHTTPエンドポイントから収集するためにしばらく時間を与える。

また、メトリクスのエンドポイントlocalhost:9090/metricsに行くことで、Prometheusが自分自身のメトリクスを提供していることを確認できる。

expressionブラウザの利用

Prometheusが自分自身について収集したデータをいくつか見てみることにしよう。 Prometheusに組み込まれたexpressionブラウザを使うには、http://localhost:9090/graphに行って、Consoleビューを選択する。

Prometheusが自分自身について出力しているメトリクスの一つにprometheus_target_interval_length_seconds(対象のscrape間の実際の時間)がある。 expressionコンソールに下記を入力する。

prometheus_target_interval_length_seconds

これは、全てprometheus_target_interval_length_secondsという名前でラベルの異なるたくさんの時系列を(それぞれに対する最新の記録された値とともに)返すはずである。 これらのラベルは、異なるレイテンシーのパーセンタイルと監視対象グループのintervalを示している。

99パーセンタイルのレイテンシーのみに興味があるとすると、その情報を取得するために以下のクエリを使うこともできる。

prometheus_target_interval_length_seconds{quantile="0.99"}

返された時系列の数をカウントするには、以下のように書くことができる。

count(prometheus_target_interval_length_seconds)

クエリ言語のさらなる情報については、クエリ言語のドキュメントを参照すること。

グラフ化インターフェースの利用

expressionをグラフ化するには、http://localhost:9090/graphに行ってGraphタブを利用する

例えば、自分自身がscrapeされているPrometheusに作成されているチャンクの秒間レートをグラフ化する以下の式を入力する

rate(prometheus_tsdb_head_chunks_created_total[1m])

グラフの幅のパラメーターや他の設定を試してみること。

サンプル監視対象の起動

これをもっと面白くし、Prometheusがscrapeするサンプルの監視対象を起動してみよう。

Goクライアントライブラリには、異なる分布を持つ架空のRPCレイテンシーを出力する例が含まれている。

GoコンパイラがインストールされていることとGoのビルド環境が(正しいGOPATHで)セットアップされていることを確認する。

PrometheusのGoクライアントライブラリをダウンロードし、3つのサンプルプロセスを実行する

# クライアントライブラリのコードを取得してサンプルをコンパイルする
git clone https://github.com/prometheus/client_golang.git
cd client_golang/examples/random
go get -d
go build

# 3つのサンプルターゲットを別々のターミナルで起動する
./random -listen-address=:8080
./random -listen-address=:8081
./random -listen-address=:8082

これで、http://localhost:8080/metricshttp://localhost:8081/metricshttp://localhost:8082/metricsをリッスンしているサンプルターゲットが出来た。

サンプルターゲットを監視するためのPrometheusの設定

ここで、新しい監視対象をscrapeするようにPrometheusを設定する。 3つのエンドポイントをexample-randomという1つのジョブにまとめよう。 ただし、最初の2つは本番の監視対象、3つ目はカナリヤだと仮定する。 これをPrometheusで表すために。複数のエンドポイントのグループを1つのジョブに追加し、各グループにラベルを追加することができる。 この例では、ラベルgroup="production"を1つ目のグループに追加し、2つ目にはgroup="canary"を追加する。

これを実現するために、以下のジョブの定義をprometheus.ymlscrape_configsに追加し、Prometheusを再起動する。

scrape_configs:
  - job_name:       'example-random'

    # Override the global default and scrape targets from this job every 5 seconds.
    scrape_interval: 5s

    static_configs:
      - targets: ['localhost:8080', 'localhost:8081']
        labels:
          group: 'production'

      - targets: ['localhost:8082']
        labels:
          group: 'canary'

expressionブラウザを開いて、これらのサンプルのエンドポイントが出力している時系列(rpc_durations_secondsなど)の情報をPrometheusが持っていることを確認する。

scrapeしたデータを新しい時系列に集約するルールの設定

この例では問題ないが、数千の時系列を集約するクエリは、アドホックに計算すると遅くなることがある。 これをもっと効率的にするために、Prometheusでは、設定されたレコーディングルールを通して、全く新しい永続的な時系列を事前に記録しておくことができる。 例えば、jobserviceの次元は残しつつ、5分の窓で全てのインスタンスについての平均にされたサンプルRPCの秒間レート(rpc_durations_seconds_count)を記録したいとする。 これは次のように書くことができる。

avg(rate(rpc_durations_seconds_count[5m])) by (job, service)

この式をグラフ化してみること。

この式の結果となる時系列をjob_service:rpc_durations_seconds_count:avg_rate5mというメトリックとして記録するために、以下のレコーディングルールでファイルを作成し、prometheus.rules.ymlとして保存する。

groups:
- name: example
  rules:
  - record: job_service:rpc_durations_seconds_count:avg_rate5m
    expr: avg(rate(rpc_durations_seconds_count[5m])) by (job, service)

このルールをPrometheusが見つけられるように、rule_filesprometheus.ymlに追加する。 これで設定は以下のようになるはずである。

global:
  scrape_interval:     15s # By default, scrape targets every 15 seconds.
  evaluation_interval: 15s # Evaluate rules every 15 seconds.

  # Attach these extra labels to all timeseries collected by this Prometheus instance.
  external_labels:
    monitor: 'codelab-monitor'

rule_files:
  - 'prometheus.rules.yml'

scrape_configs:
  - job_name: 'prometheus'

    # Override the global default and scrape targets from this job every 5 seconds.
    scrape_interval: 5s

    static_configs:
      - targets: ['localhost:9090']

  - job_name:       'example-random'

    # Override the global default and scrape targets from this job every 5 seconds.
    scrape_interval: 5s

    static_configs:
      - targets: ['localhost:8080', 'localhost:8081']
        labels:
          group: 'production'

      - targets: ['localhost:8082']
        labels:
          group: 'canary'

新しい設定でPrometheusを再起動して、job_service:rpc_durations_seconds_count:avg_rate5mという名前の新しいメトリックが利用可能であることをexpressionブラウザやグラフ化することで確認しよう。

参考リンク

和訳活動の支援

Prometheusドキュメント和訳が役に立った方は、以下QRコードからPayPayで活動を支援して頂けるとありがたいです。

PayPayによる支援用QRコード
上のQRコードからPayPayによる支援
入門 Prometheus ―インフラとアプリケーションのパフォーマンスモニタリング

入門 Prometheus ―インフラとアプリケーションのパフォーマンスモニタリング

 
入門 監視 ―モダンなモニタリングのためのデザインパターン

入門 監視 ―モダンなモニタリングのためのデザインパターン

 
SRE サイトリライアビリティエンジニアリング ―Googleの信頼性を支えるエンジニアリングチーム

SRE サイトリライアビリティエンジニアリング ―Googleの信頼性を支えるエンジニアリングチーム