入門

このガイドは「Hello World」スタイルのチュートリアルで、シンプルなPrometheusインスタンスのインストール、設定、使用方法を示します。Prometheusをローカルにダウンロードして実行し、Prometheus自身とサンプルアプリケーションをスクレイプするように設定します。その後、収集された時系列データを使用するためにクエリ、ルール、グラフを操作します。

Prometheusのダウンロードと実行

ご使用のプラットフォーム向けの最新リリースをダウンロードし、展開して実行してください。

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

Prometheusを起動する前に、設定を行いましょう。

Prometheus自身を監視するためのPrometheusの設定

Prometheusは、メトリックHTTPエンドポイントをスクレイプすることで、ターゲットからメトリックを収集します。Prometheusは自身に関するデータも同じ方法で公開するため、自身の健全性をスクレイプして監視することもできます。

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']

設定オプションの完全な仕様については、設定ドキュメントを参照してください。

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で自身のステータスページを参照できるはずです。自身からHTTPメトリックエンドポイントを通じてデータを収集するのに数秒かかります。

Prometheusが自身に関するメトリックを提供しているかどうかも、そのメトリックエンドポイントlocalhost:9090/metricsに移動して確認できます。

式ブラウザの使用

Prometheusが自身について収集したデータを調べてみましょう。Prometheusに組み込まれている式ブラウザを使用するには、https://:9090/graphに移動し、「Graph」タブ内で「Table」ビューを選択します。

localhost:9090/metricsからわかるように、Prometheusが自身についてエクスポートするメトリックの1つはprometheus_target_interval_length_seconds(ターゲットのスクレイプ間の実際の時間量)という名前です。以下の式を式コンソールに入力し、「Execute」をクリックします。

prometheus_target_interval_length_seconds

これにより、多数の異なる時系列が(それぞれの最新の値と共に)返されます。それぞれメトリック名はprometheus_target_interval_length_secondsですが、異なるラベルを持っています。これらのラベルは、異なるレイテンシのパーセンタイルとターゲットグループ間隔を示しています。

99パーセンタイルのレイテンシのみに興味がある場合は、このクエリを使用できます。

prometheus_target_interval_length_seconds{quantile="0.99"}

返される時系列の数を数えるには、次のように記述できます。

count(prometheus_target_interval_length_seconds)

式言語の詳細については、式言語ドキュメントを参照してください。

グラフインターフェースの使用

式をグラフ化するには、https://:9090/graphに移動し、「Graph」タブを使用します。

例えば、自己スクレイプされたPrometheusで作成されるチャンクの秒間レートをグラフ化するには、以下の式を入力します。

rate(prometheus_tsdb_head_chunks_created_total[1m])

グラフの範囲パラメータやその他の設定を試してみてください。

サンプルターゲットの起動

Prometheusがスクレイプする追加のターゲットを追加しましょう。

Node Exporterをサンプルターゲットとして使用します。Node Exporterの使用に関する詳細情報は、これらの手順を参照してください。

tar -xzvf node_exporter-*.*.tar.gz
cd node_exporter-*.*

# Start 3 example targets in separate terminals:
./node_exporter --web.listen-address 127.0.0.1:8080
./node_exporter --web.listen-address 127.0.0.1:8081
./node_exporter --web.listen-address 127.0.0.1:8082

これで、サンプルターゲットがhttps://:8080/metricshttps://:8081/metrics、およびhttps://:8082/metricsでリッスンしているはずです。

Prometheusにサンプルターゲットを監視させるように設定

次に、Prometheusがこれらの新しいターゲットをスクレイプするように設定します。これら3つのエンドポイントすべてをnodeという1つのジョブにグループ化しましょう。最初の2つのエンドポイントは本番ターゲットであり、3つ目はカナリアインスタンスであると想定します。これをPrometheusでモデル化するには、単一のジョブに複数のエンドポイントグループを追加し、各ターゲットグループに追加のラベルを追加します。この例では、最初のターゲットグループにgroup="production"ラベルを追加し、2番目のグループにはgroup="canary"を追加します。

これを実現するには、以下のジョブ定義をprometheus.ymlscrape_configsセクションに追加し、Prometheusインスタンスを再起動します。

scrape_configs:
  - job_name:       'node'

    # 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がnode_cpu_seconds_totalなど、これらのサンプルエンドポイントが公開する時系列に関する情報を持っていることを確認してください。

スクレイプされたデータを新しい時系列に集計するためのルールを設定

この例では問題ありませんが、何千もの時系列を集計するクエリは、アドホックに計算されると遅くなる可能性があります。これを効率化するために、Prometheusは設定されたレコーディングルールによって式を新しい永続的な時系列に事前に記録できます。例えば、CPU時間の秒間レート(node_cpu_seconds_total)を、すべてのCPUについてインスタンスごとに平均化し(ただし、jobinstancemodeのディメンションは保持)、5分間のウィンドウで測定することに興味があるとします。これを次のように記述できます。

avg by (job, instance, mode) (rate(node_cpu_seconds_total[5m]))

この式をグラフ化してみてください。

この式の結果である時系列をjob_instance_mode:node_cpu_seconds:avg_rate5mという新しいメトリックに記録するには、以下のレコーディングルールを含むファイルを作成し、prometheus.rules.ymlとして保存します。

groups:
- name: cpu-node
  rules:
  - record: job_instance_mode:node_cpu_seconds:avg_rate5m
    expr: avg by (job, instance, mode) (rate(node_cpu_seconds_total[5m]))

Prometheusにこの新しいルールを認識させるには、prometheus.ymlrule_filesステートメントを追加します。設定は次のようになります。

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:       'node'

    # 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_instance_mode:node_cpu_seconds:avg_rate5mというメトリック名の新しい時系列が利用可能になっていることを確認してください。

設定の再読み込み

設定ドキュメントに記載されているように、PrometheusインスタンスはSIGHUPシグナルを使用することで、プロセスを再起動せずに設定を再読み込みできます。Linuxで実行している場合、kill -s SIGHUP <PID>を使用することでこれを行うことができ、<PID>をPrometheusのプロセスIDに置き換えます。

インスタンスを正常にシャットダウンする

Prometheusには、プロセスが突然停止した場合の回復メカニズムがありますが、Prometheusインスタンスをクリーンにシャットダウンするには、シグナルまたは割り込みを使用することをお勧めします。Linuxでは、SIGTERMまたはSIGINTシグナルをPrometheusプロセスに送信することでこれを行うことができます。例えば、kill -s <SIGNAL> <PID>を使用できます。ここで、<SIGNAL>はシグナル名、<PID>はPrometheusのプロセスIDです。または、制御端末で割り込み文字を押すこともできます。デフォルトでは^C(Control-C)です。

このドキュメントはオープンソースです。問題報告やプルリクエストを送信して、改善にご協力ください。