見出し画像

[Prometheus] PromQLの基本メモ

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

参考


最後まで読んでいただきありがとうございます。 他の記事はこちらからどうぞ → https://note.com/sat0b3ee/