使ってみる

このガイドは「ハローワールド」形式のチュートリアルで、簡単なPrometheusインスタンスのインストール、設定、使用方法を示します。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に移動し、「グラフ」タブを使用します。

例えば、自己スクレイプされた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

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

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

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

これを実現するには、`scrape_configs`セクションに以下のジョブ定義を`prometheus.yml`に追加し、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`)の1秒あたりのレートを、インスタンスごとのすべてのCPUで平均化し(ただし`job`、`instance`、`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.yml`に`rule_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で実行している場合は、``をPrometheusのプロセスIDに置き換えて`kill -s SIGHUP `を実行することでこれを行うことができます。

インスタンスの正常なシャットダウン。

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

このページの内容