LabHub

ブログ

Prometheus PromQL マスターガイド

한국어English日本語

PromQL Mastery Guide

1. PromQL の基本概念

PromQL(Prometheus Query Language)は、Prometheusの時系列データを照会・分析するためのクエリ言語です。Grafanaダッシュボードもアラートルールも、すべてPromQLで記述します。

4つのデータ型

説明
Instant Vector同一タイムスタンプの時系列の集合http_requests_total
Range Vector時間範囲にわたる時系列http_requests_total[5m]
Scalar単一の数値3.14
String文字列(ほとんど使用しない)"hello"

メトリクスの種類

Counter  — 単調増加する値(リセット時に0に戻る) : http_requests_total
Gauge    — 上下する値 : temperature, memory_usage
Histogram — 分布の測定(bucket) : http_request_duration_seconds
Summary  — 分位数を直接計算 : go_gc_duration_seconds

2. セレクタとマッチング

# 基本セレクタ
http_requests_total

# ラベルマッチング
http_requests_total{method="GET", status="200"}

# 正規表現マッチング
http_requests_total{method=~"GET|POST"}
http_requests_total{status!~"2.."}

# 否定マッチング
http_requests_total{method!="DELETE"}

# __name__ マッチング(メトリクス名もラベル)
{__name__=~"http_requests.*"}

3. コア関数

rate() — Counterの1秒あたりの変化率

# 過去5分間の1秒あたりのリクエスト数
rate(http_requests_total[5m])

# job別の1秒あたりのリクエスト数
sum(rate(http_requests_total[5m])) by (job)

# method別の1秒あたりのリクエスト数 Top 5
topk(5, sum(rate(http_requests_total[5m])) by (method))

注意: rate()は必ずCounter型にのみ使用してください。Gaugeにはderiv()を使用します。

increase() — 一定期間の増加量

# 過去1時間の総リクエスト数
increase(http_requests_total[1h])

# 1日のエラー数
sum(increase(http_requests_total{status=~"5.."}[24h]))

histogram_quantile() — パーセンタイルの計算

# 95パーセンタイルの応答時間
histogram_quantile(0.95,
  sum(rate(http_request_duration_seconds_bucket[5m])) by (le)
)

# サービス別99パーセンタイル
histogram_quantile(0.99,
  sum(rate(http_request_duration_seconds_bucket[5m])) by (le, service)
)

# 50パーセンタイル(中央値)の応答時間
histogram_quantile(0.5,
  rate(http_request_duration_seconds_bucket[5m])
)

irate() — 瞬間変化率

# 最新の2つのデータポイントに基づく瞬間変化率
irate(http_requests_total[5m])

rate()は範囲全体の平均を計算し、irate()は最新の2つのポイント間の変化率を計算します。ダッシュボードではirate()がより即応的で、アラートにはrate()がより安定的です。

4. 集約演算子

# sum — 合計
sum(rate(http_requests_total[5m])) by (instance)

# avg — 平均
avg(node_cpu_seconds_total{mode="idle"}) by (instance)

# max, min
max(container_memory_usage_bytes) by (pod)

# count — 時系列の数
count(up == 1) by (job)

# quantile — 分位数
quantile(0.95, rate(http_requests_total[5m]))

# stddev — 標準偏差
stddev(rate(http_requests_total[5m])) by (job)

# without — 特定ラベルを除外して集約
sum without (instance)(rate(http_requests_total[5m]))

5. 実践クエリパターン

エラー率の計算

# HTTP 5xx エラー率 (%)
sum(rate(http_requests_total{status=~"5.."}[5m]))
/
sum(rate(http_requests_total[5m]))
* 100

# サービス別可用率
1 - (
  sum(rate(http_requests_total{status=~"5.."}[5m])) by (service)
  /
  sum(rate(http_requests_total[5m])) by (service)
)

リソース使用率

# CPU使用率 (%)
100 - (avg by (instance)(
  irate(node_cpu_seconds_total{mode="idle"}[5m])
) * 100)

# メモリ使用率 (%)
(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100

# ディスク使用率
(1 - node_filesystem_avail_bytes{mountpoint="/"}
  / node_filesystem_size_bytes{mountpoint="/"}) * 100

サチュレーション(飽和度)

# Pod CPUスロットリング
sum(rate(container_cpu_cfs_throttled_seconds_total[5m])) by (pod)
/
sum(rate(container_cpu_cfs_periods_total[5m])) by (pod)

# キュー長
avg_over_time(queue_length[5m])

6. アラートルールの作成

# prometheus-rules.yaml
groups:
  - name: application
    rules:
      # 高エラー率
      - alert: HighErrorRate
        expr: |
          sum(rate(http_requests_total{status=~"5.."}[5m])) by (service)
          /
          sum(rate(http_requests_total[5m])) by (service)
          > 0.05
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: 'High error rate on {{ $labels.service }}'
          description: 'Error rate is {{ $value | humanizePercentage }}'

      # 遅い応答時間
      - alert: SlowResponseTime
        expr: |
          histogram_quantile(0.95,
            sum(rate(http_request_duration_seconds_bucket[5m])) by (le, service)
          ) > 1.0
        for: 10m
        labels:
          severity: warning
        annotations:
          summary: 'P95 latency > 1s on {{ $labels.service }}'

  - name: infrastructure
    rules:
      # 高メモリ使用率
      - alert: HighMemoryUsage
        expr: |
          (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) > 0.9
        for: 15m
        labels:
          severity: warning

      # ディスク不足予測
      - alert: DiskWillFillIn24h
        expr: |
          predict_linear(node_filesystem_avail_bytes{mountpoint="/"}[6h], 24*3600) < 0
        for: 30m
        labels:
          severity: warning
        annotations:
          summary: 'Disk will fill in 24h on {{ $labels.instance }}'

      # Pod CrashLooping
      - alert: PodCrashLooping
        expr: |
          increase(kube_pod_container_status_restarts_total[1h]) > 5
        for: 10m
        labels:
          severity: critical

7. Grafana ダッシュボードクエリ

# RED Method ダッシュボード

# Rate(リクエスト数/秒)
sum(rate(http_requests_total[5m])) by (service)

# Errors(エラー数/秒)
sum(rate(http_requests_total{status=~"5.."}[5m])) by (service)

# Duration(レイテンシ分布)
histogram_quantile(0.5, sum(rate(http_request_duration_seconds_bucket[$__rate_interval])) by (le))
histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[$__rate_interval])) by (le))
histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket[$__rate_interval])) by (le))

8. クイズ

Q1: rate()とirate()の違いと、それぞれの適切な使用場面は?

rate(): 範囲全体の1秒あたりの平均変化率を計算します。より滑らかで安定しているため、アラートルールに適しています。 irate(): 範囲内の最新2つのデータポイント間の瞬間変化率を計算します。スパイクを素早く検知できるため、ダッシュボードグラフに適しています。

注意: どちらもRange Vectorを引数に取りますが、[5m]の意味が異なります。rate()は5分間の平均を計算し、irate()は5分以内の最新2ポイントのみを使用します。

Q2: predict_linear()関数の用途と動作原理は?

predict_linear(v range-vector, t scalar)は、時系列データに線形回帰を適用してt秒後の値を予測します。

例: predict_linear(node_filesystem_avail_bytes[6h], 24*3600) < 0 過去6時間のディスク空き容量のトレンドを分析し、24時間後に0以下になるかを予測します。

ディスク不足やメモリ増加などのリソース枯渇を事前に検知するキャパシティプランニングアラートに不可欠な関数です。

Q3: histogram_quantileにおけるleラベルの役割と注意点は?

leは「less than or equal(以下)」の略で、ヒストグラムバケットの上限値を表します。http_request_duration_seconds_bucket{le="0.5"}は0.5秒以下のリクエスト数を意味します。

注意点:

by (le)を必ず含める必要があります。省略するとle別の集約が壊れ、不正確な値が返されます バケット境界が少ない場合、補間(interpolation)が不正確になります 結果は近似値です。正確なパーセンタイルが必要な場合はSummary型を使用してください

クイズ

Q1: 「Prometheus PromQL マスターガイド」の主なトピックは何ですか? PromQLのデータ型、セレクタ、主要関数(rate/increase/histogram_quantile)、アラートルール、ダッシュボードクエリを実践的な例で習得します。

Q2: PromQL の基本概念とは何ですか? PromQL(Prometheus Query Language)は、Prometheusの時系列データを照会・分析するためのクエリ言語です。Grafanaダッシュボードもアラートルールも、すべてPromQLで記述します。 4つのデータ型 メトリクスの種類

Q3: コア関数の核心的な概念を説明してください。 rate() — Counterの1秒あたりの変化率 注意: rate()は必ずCounter型にのみ使用してください。Gaugeにはderiv()を使用します。 increase() — 一定期間の増加量 histogram_quantile() — パーセンタイルの計算 irate() — 瞬間変化率 rate()は範囲全体の平均を計算し、irate()は最新の2つのポイント間の変化率を計算します。ダッシュボードではirate()がより即応的で、アラートにはrate()がより安定的です。

Q4: 実践クエリパターンの主な特徴は何ですか? エラー率の計算 リソース使用率 サチュレーション(飽和度)

コメント

まだコメントはありません。

ログインするとコメントできます