PromQLとは
PromQL (Prometheus Query Language) とは、Prometheusで利用する、データ取得、集約のためのクエリ言語のことです。
データ型
Prometheusで扱うデータの型は以下の4つがあります。(参考: Expression language data types)
Instant vector | 時系列データ |
Range vector | 範囲指定された時系列データ |
Scalar | スカラー値 |
String | 文字列 |
ラベルマッチャ
Prometheusはメトリクスにラベルをつけて時系列を保存します。ラベルを指定することで、特定の時系列データを選択することができます。
例えば、http_requests_total
がメトリクス名の場合、ラベルenvironment
がstaging
のものだけを選択したい場合、
以下のように記載します。
http_requests_total{job="prometheus"}
選択する際には、以下のオペレータを利用できます。
= | 一致する |
!= | 一致しない |
=~ | 正規表現で一致 |
!~ | 正規表現に一致しない |
メトリクスの種類
Prometheusで扱うメトリクスは以下の4つがあります。
Guage | 一致する |
Counter | 一致しない |
Histgram | 正規表現で一致 |
Summary | 正規表現に一致しない |
HistogramとSummaryの違いは、 公式ドキュメントのHISTOGRAMS AND SUMMARIES を参照してください。
実際の場面ではレイテンシの計算でHistgramやSummaryが利用されますが、次のリンクの説明が詳しいです。 レイテンシーを計算する技術の話
集約
ベクトルを集計する場合は、集計の演算子を利用できます。
例えば、Instant vectorを集約するのに、以下のような集計演算子を利用できます。
- sum
- min
- max
- avg
例えば、httpリクエストの合計を求める場合は以下のように記載します。
sum(http_requests_total)
参考: Prometheus ~ Aggregation operator
関数
時系列に対して様々な処理を行う関数が存在します。
関数はinstant vector
かrange vector
のどちらかを受け取ります。
どちらを受け取るかは、ドキュメントに型として記載されています。
例えば、要素があるか判定を行うabsent(v instant-vector)
は、instant-vector
を受け取り、
ある範囲で要素があるか判定を行うabsent_over_time(v range-vector)
は、range-vector
を受け取ります。
例えば、exp(v instant-vector)
は指数関数を計算します。
他の関数は以下の公式ドキュメントを参照してください。
rate / irate関数
rate関数やirate関数を利用すると、1秒間の間にカウンターのメトリクスがどれだけ増加したかを計算することができます。
rate(v range-vector)
動きが遅いカウンターの平均増加率を計算します。
irate(v range-vector)
動きが早いカウンターの瞬間増加率を平均します。極端に値が上下する場合は、rateでは観測できなくなることがあるため、こちらを利用します。
カウンターのリセット対策
カウンターは再起動でリセットしてしまうことがありますが、rateやirateを使う場合は自動的に調整されます。集計演算子を利用する場合は、rateかirateを利用して、カウンターリセットの影響を受けないようにします。
例: sum
sum(rate(http_request_total[5m]))
時系列の集約関数
集約名_over_timeの形式の関数が定義されており、
<aggregation>_over_time
の形式で時間軸で集約処理を行ってinstant vector
を返却することができます。
avg_over_time(range_vector) | 指定した範囲の平均値 |
min_over_time(range-vector) | 指定した範囲の最小値 |
max_over_time(range-vector) | 指定した範囲の最大値 |
sum_over_time(range-vector) | 指定した範囲の合計値 |