はじめに
このガイドは、簡単なPrometheusインスタンスをインストール、設定、使用する方法を示す「Hello World」スタイルのチュートリアルです。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で自身に関するステータスページを閲覧できるはずです。Prometheusが自身のHTTPメトリックエンドポイントからデータを収集するのに数秒かかるのを待ちます。
Prometheusが自身についてメトリックを提供していることを、そのメトリックエンドポイントにアクセスして確認することもできます: localhost:9090/metrics
式ブラウザの使用
Prometheusが自身について収集したデータを探索しましょう。Prometheusの組み込み式ブラウザを使用するには、https://:9090/queryに移動し、「Graph」タブを選択します。
prometheus_target_interval_length_seconds (ターゲットスクレイピング間の実際の時間)という名前のPrometheus自身に関するメトリックが、localhost:9090/metricsからわかるように、Prometheusが公開するメトリックの1つです。以下の式を式コンソールに入力してから、「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/queryに移動し、「Graph」タブを使用します。
たとえば、自己スクレイピングされたPrometheusで作成されているチャンクの毎秒レートをグラフ化するには、次の式を入力します。
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/metrics、https://:8081/metrics、およびhttps://:8082/metricsでリスニングしているサンプルターゲットがあるはずです。
Prometheusをサンプルターゲットを監視するように設定する
これらの新しいターゲットをスクレイピングするようにPrometheusを設定します。3つのエンドポイントすべてをnodeという1つのジョブにグループ化しましょう。最初の2つのエンドポイントは本番環境のターゲットであり、3番目のエンドポイントはカナリアインスタンスを表すものとします。これをPrometheusでモデル化するために、1つのジョブに複数のエンドポイントグループを追加し、各ターゲットグループに追加のラベルを追加できます。この例では、最初のターゲットグループにgroup="production"ラベルを追加し、2番目のグループにgroup="canary"を追加します。
これを実現するために、prometheus.ymlのscrape_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で平均(ただし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で実行している場合、これはkill -s SIGHUP <PID>を使用して実行できます。<PID>はPrometheusプロセスのIDに置き換えてください。
インスタンスの正常なシャットダウン
Prometheusには、予期せぬプロセス障害の場合の回復メカニズムがありますが、Prometheusインスタンスのクリーンシャットダウンには、シグナルまたは割り込みを使用することをお勧めします。Linuxでは、PrometheusプロセスにSIGTERMまたはSIGINTシグナルを送信することで実行できます。たとえば、kill -s <SIGNAL> <PID>を使用できます。ここで、<SIGNAL>はシグナル名に、<PID>はPrometheusプロセスのIDに置き換えます。または、制御端末で割り込み文字(デフォルトでは^C(Control-C))を押すこともできます。