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"
}
}
パスには、設定されている場合は 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 週間分の履歴が保持されます。