PromQLでメトリクスを取得・集計する

prometheus

PromQL は Prometheus で実行できるクエリ言語で、次のようにしてメトリクスの単一時間のサンプルを Instant vector として取得したり、大括弧で期間を指定することでその期間の全てのサンプルを Range vector として取得できる。

prometheus_http_requests_total{code="200",handler=~"/api/.*"}
prometheus_http_requests_total{code="200",handler=~"/api/.*"}[5m]

関数には Instant vector を受け取るものと Range vector を受け取るものがある。

sum(prometheus_http_requests_total)
sum_over_time(prometheus_http_requests_total[5m])

rate(v range-vector) は単調増加するカウンターの、値のリセットを考慮した平均秒間増加量を返す。現在のリクエストレートやCPU使用量などを出すのに使われる。

rate(prometheus_http_requests_total[5m])

by で SQL の group by 相当の処理を行える。

sum by (handler) (rate(prometheus_http_requests_total[5m]))

(operator) on (label1) group_left/right (label2) で label1 で N:1/1:N JOIN して演算し、label2 を追加することができる。SQL と異なり N:N の JOIN はできない。

sum by (handler) (rate(prometheus_http_requests_total[5m])) / on (code) group_left () sum(rate(prometheus_http_requests_total[5m]))

A or B で A に含まれないラベルの値を B から取ることができるので、値がない場合 1 を返す absent(v instant-vector) と組み合わせると値がない時間のメトリクスを 0 として扱ったりできる。

non_exist_metrics{aaa="bbb"} or (absent(non_exist_metrics{aaa="bbb"}) * 0)