PromQLでメトリクスを取得・集計する
prometheusPromQL は 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)