はじめに

このガイドは、「Hello World」スタイルのチュートリアルで、単純なPrometheusインスタンスのインストール、設定、および使用方法を示します。Prometheusをローカルにダウンロードして実行し、それ自体とサンプルアプリケーションをスクレイプするように設定してから、クエリ、ルール、およびグラフを使用して収集されたタイムシリーズデータを使用します。

Prometheusのダウンロードと実行

プラットフォーム用の最新リリースのPrometheusをダウンロードし、展開して実行します。

tar xvfz prometheus-*.tar.gz
cd 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の組み込み式ブラウザを使用するには、http://localhost:9090/graphに移動し、「グラフ」タブ内の「テーブル」ビューを選択します。

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

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)

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

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

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

たとえば、次の式を入力して、自身をスクレイプしたPrometheusで作成されているチャンクの1秒あたりのレートをグラフ化します。

rate(prometheus_tsdb_head_chunks_created_total[1m])

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

いくつかのサンプルターゲットの起動

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

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

http://localhost:8080/metricshttp://localhost:8081/metrics、およびhttp://localhost:8082/metricsでリッスンしているサンプルターゲットが表示されるはずです。

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

次に、Prometheusがこれらの新しいターゲットをスクレイプするように設定します。3つのエンドポイントすべてをnodeという1つのジョブにグループ化しましょう。最初の2つのエンドポイントは本番ターゲットであり、3番目のエンドポイントはカナリアインスタンスを表すと想定します。これをPrometheusでモデル化するには、1つのジョブに複数のエンドポイントグループを追加し、ターゲットの各グループに追加のラベルを追加できます。この例では、最初のターゲットグループに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時間の1秒あたりのレート(node_cpu_seconds_total)を、インスタンスごとのすべてのcpuで平均化して(ただし、jobinstance、およびmodeディメンションを保持して)、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には、突然のプロセス障害が発生した場合の回復メカニズムがありますが、SIGTERM信号を使用してPrometheusインスタンスをクリーンにシャットダウンすることをお勧めします。Linuxで実行している場合は、kill -s SIGTERM <PID>を使用して実行できます。<PID>はPrometheusプロセスIDに置き換えます。

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