クエリ例

単純な時系列の選択

メトリックhttp_requests_totalを持つすべて時系列を返す

http_requests_total

メトリックhttp_requests_totalと指定されたjobおよびhandlerラベルを持つすべて時系列を返す

http_requests_total{job="apiserver", handler="/api/comments"}

同じベクトルについて、時間範囲全体(この場合はクエリ時間まで5分間)を返し、範囲ベクトルにする

http_requests_total{job="apiserver", handler="/api/comments"}[5m]

範囲ベクトルになる式は、直接グラフ化できませんが、式ブラウザの表形式(「コンソール」)ビューで表示できます。

正規表現を使用すると、名前が特定のパターンに一致するジョブの時系列のみを選択できます。この場合、serverで終わるすべてのジョブです。

http_requests_total{job=~".*server"}

Prometheusのすべての正規表現は、RE2構文を使用します。

4xx以外のすべてのHTTPステータスコードを選択するには、次を実行します。

http_requests_total{status!~"4.."}

サブクエリ

過去30分間のhttp_requests_totalメトリックの5分間のレートを、1分間の解像度で返す。

rate(http_requests_total[5m])[30m:1m]

これはネストされたサブクエリの例です。deriv関数のサブクエリはデフォルトの解像度を使用します。不必要にサブクエリを使用するのは賢明ではありません。

max_over_time(deriv(rate(distance_covered_total[5s])[30s:5s])[10m:])

関数、演算子などの使用

http_requests_totalメトリック名を持つすべて時系列の毎秒レートを、過去5分間にわたって測定したものを返す

rate(http_requests_total[5m])

http_requests_total時系列にすべてjob(ジョブ名によるファンアウト)とinstance(ジョブのインスタンスによるファンアウト)ラベルがあると仮定すると、すべてのインスタンスのレートを合計して、出力時系列の数を減らしながら、jobディメンションを維持したい場合があります。

sum by (job) (
  rate(http_requests_total[5m])
)

同じディメンションラベルを持つ2つの異なるメトリックがある場合、それらに二項演算子を適用できます。同じラベルセットを持つ両側の要素は一致し、出力に伝播されます。たとえば、この式は、(これらのメトリックを公開する架空のクラスタスケジューラ上の)各インスタンスの未使用メモリをMiB単位で返します。

(instance_memory_limit_bytes - instance_memory_usage_bytes) / 1024 / 1024

同じ式ですが、アプリケーション別に合計すると、次のように記述できます。

sum by (app, proc) (
  instance_memory_limit_bytes - instance_memory_usage_bytes
) / 1024 / 1024

同じ架空のクラスタスケジューラが、各インスタンスについて次のようなCPU使用率メトリックを公開していた場合

instance_cpu_time_ns{app="lion", proc="web", rev="34d0f99", env="prod", job="cluster-manager"}
instance_cpu_time_ns{app="elephant", proc="worker", rev="34d0f99", env="prod", job="cluster-manager"}
instance_cpu_time_ns{app="turtle", proc="api", rev="4d3a513", env="prod", job="cluster-manager"}
instance_cpu_time_ns{app="fox", proc="widget", rev="4d3a513", env="prod", job="cluster-manager"}
...

…アプリケーション(app)とプロセス種別(proc)別に上位3つのCPUユーザーを取得できます。

topk(3, sum by (app, proc) (rate(instance_cpu_time_ns[5m])))

このメトリックに実行中のインスタンスごとに1つの時系列が含まれていると仮定すると、アプリケーションごとの実行中のインスタンス数を次のようにカウントできます。

count by (app) (instance_cpu_time_ns)

メトリックのラベルを調査して、たとえばいくつかのラベルを合計する場合、次を使用できます。

limitk(10, app_foo_metric_bar)

あるいは、返される時系列をより均等にサンプリングしたい場合は、約10%を取得するために次を使用できます。

limit_ratio(0.1, app_foo_metric_bar)

このドキュメントはオープンソースです。問題点やプルリクエストを提出して、改善にご協力ください。