Prometheus は、2.16.0 以降、エンジンによって実行されたすべてのクエリをログファイルに記録する機能を備えています。このガイドでは、そのログファイルの使用方法、含まれているフィールド、およびログファイルの操作に関する高度なヒントについて説明します。
クエリログは実行時に切り替えることができます。したがって、Prometheus インスタンスの遅延や高負荷を調査したい場合にアクティブ化できます。
クエリログを有効または無効にするには、2つの手順が必要です。
この例では、/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 行に追加のフィールドが含まれます。
HTTP リクエストには、クライアント IP、メソッド、およびパスが含まれます
{
"httpRequest": {
"clientIP": "127.0.0.1",
"method": "GET",
"path": "/api/v1/query_range"
}
}
パスには、設定されている場合は Web プレフィックスが含まれ、コンソールを指すこともできます。
クライアント 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週間の履歴が保持されます。
このドキュメントはオープンソースです。問題を提出したり、プルリクエストを送信したりして、改善にご協力ください。