Prometheus クエリログの使用

Prometheus は、2.16.0 以降、エンジンによって実行されたすべてのクエリをログファイルに記録する機能を備えています。このガイドでは、そのログファイルの使用方法、含まれているフィールド、およびログファイルの操作に関する高度なヒントについて説明します。

クエリログを有効にする

クエリログは実行時に切り替えることができます。したがって、Prometheus インスタンスの遅延や高負荷を調査したい場合にアクティブ化できます。

クエリログを有効または無効にするには、2つの手順が必要です。

  1. クエリログ構成を追加または削除するように構成を調整します。
  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週間の履歴が保持されます。

このドキュメントはオープンソースです。問題を提出したり、プルリクエストを送信したりして、改善にご協力ください。