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"
    }
}

パスには、ウェブプレフィックスが設定されている場合はそれが含まれ、コンソールを指すこともできます。

クライアント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週間分の履歴が保持されます。

このページの内容