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