Prometheusクエリログの使用
Prometheusは2.16.0以降、エンジンによって実行されたすべてのクエリをログファイルに記録する機能を備えています。このガイドでは、そのログファイルの使用方法、含まれるフィールド、およびログファイルの操作に関する高度なヒントについて説明します。
クエリログを有効にする
クエリログは実行時に切り替えることができます。そのため、Prometheusインスタンスの遅延や高負荷を調査したい場合に有効にすることができます。
クエリログを有効または無効にするには、2つのステップが必要です。
- クエリログの設定を追加または削除するために設定を調整します。
- Prometheusサーバーの設定を再読み込みします。
すべてのクエリをファイルにログする
この例では、すべてのクエリをファイル /prometheus/query.log
にログする方法を示します。/prometheus
がデータディレクトリであり、Prometheusが書き込みアクセス権を持っていると仮定します。
まず、prometheus.yml
設定ファイルを変更します。
global:
scrape_interval: 15s
evaluation_interval: 15s
query_log_file: /prometheus/query.log
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
次に、Prometheus の設定を再読み込みします。
$ curl -X POST http://127.0.0.1:9090/-/reload
または、Prometheusが --web.enable-lifecycle
オプションなしで起動されており、Windows以外で実行している場合は、PrometheusプロセスにSIGHUPを送信することで再読み込みをトリガーできます。
ファイル /prometheus/query.log
が存在し、すべてのクエリがそのファイルにログされるはずです。
クエリログを無効にするには、同じ操作を繰り返し、設定から query_log_file
を削除します。
クエリログが有効になっているかを確認する
Prometheusは、クエリログが有効で機能しているかどうかを示すメトリックを便利に公開しています。
# HELP prometheus_engine_query_log_enabled State of the query log.
# TYPE prometheus_engine_query_log_enabled gauge
prometheus_engine_query_log_enabled 0
# HELP prometheus_engine_query_log_failures_total The number of query log failures.
# TYPE prometheus_engine_query_log_failures_total counter
prometheus_engine_query_log_failures_total 0
最初のメトリック prometheus_engine_query_log_enabled
は、クエリログが有効な場合は1、それ以外の場合は0に設定されます。2番目のメトリック prometheus_engine_query_log_failures_total
は、ログに記録できなかったクエリの数を示します。
クエリログの形式
クエリログはJSON形式のログです。以下は、クエリに存在するフィールドの概要です。
{
"params": {
"end": "2020-02-08T14:59:50.368Z",
"query": "up == 0",
"start": "2020-02-08T13:59:50.368Z",
"step": 5
},
"stats": {
"timings": {
"evalTotalTime": 0.000447452,
"execQueueTime": 7.599e-06,
"execTotalTime": 0.000461232,
"innerEvalTime": 0.000427033,
"queryPreparationTime": 1.4177e-05,
"resultSortTime": 6.48e-07
}
},
"ts": "2020-02-08T14:59:50.387Z"
}
params
: クエリ。開始および終了タイムスタンプ、ステップ、および実際のクエリステートメント。stats
: 統計。現在、内部エンジンタイマーが含まれています。ts
: クエリが終了したときのタイムスタンプ。
さらに、リクエストをトリガーしたものに応じて、JSON行に追加のフィールドが含まれます。
APIクエリとコンソール
HTTPリクエストには、クライアントIP、メソッド、パスが含まれます。
{
"httpRequest": {
"clientIP": "127.0.0.1",
"method": "GET",
"path": "/api/v1/query_range"
}
}
パスには、ウェブプレフィックスが設定されている場合はそれが含まれ、コンソールを指すこともできます。
クライアントIPはネットワークIPアドレスであり、X-Forwarded-For
のようなヘッダーは考慮されません。プロキシの背後にある元の呼び出し元をログに記録したい場合は、プロキシ自体でそれを行う必要があります。
記録ルールとアラート
記録ルールとアラートには、ファイルパスとグループ名を含む ruleGroup 要素が含まれます。
{
"ruleGroup": {
"file": "rules.yml",
"name": "partners"
}
}
クエリログのローテーション
Prometheusはクエリログ自体をローテーションしません。代わりに、外部ツールを使用できます。
それらのツールの1つがlogrotateです。ほとんどのLinuxディストリビューションではデフォルトで有効になっています。
以下は、/etc/logrotate.d/prometheus
として追加できるファイルの例です。
/prometheus/query.log {
daily
rotate 7
compress
delaycompress
postrotate
killall -HUP prometheus
endscript
}
これにより、ファイルは毎日ローテーションされ、1週間分の履歴が保持されます。