[Prometheus] PromQLの基本メモ

2021年8月5日
[Prometheus] PromQLの基本メモ

PromQLとは

PromQL (Prometheus Query Language) とは、Prometheusで利用する、データ取得、集約のためのクエリ言語のことです。

データ型

Prometheusで扱うデータの型は以下の4つがあります。(参考: Expression language data types)

Instant vector時系列データ
Range vector範囲指定された時系列データ
Scalarスカラー値
String文字列

ラベルマッチャ

Prometheusはメトリクスにラベルをつけて時系列を保存します。ラベルを指定することで、特定の時系列データを選択することができます。

例えば、http_requests_total がメトリクス名の場合、ラベルenvironmentstagingのものだけを選択したい場合、 以下のように記載します。

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 vectorrange vectorのどちらかを受け取ります。 どちらを受け取るかは、ドキュメントに型として記載されています。

例えば、要素があるか判定を行うabsent(v instant-vector)は、instant-vectorを受け取り、 ある範囲で要素があるか判定を行うabsent_over_time(v range-vector)は、range-vectorを受け取ります。

例えば、exp(v instant-vector)は指数関数を計算します。

他の関数は以下の公式ドキュメントを参照してください。

参考: Prometheus ~ functions

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)指定した範囲の合計値

参考