サブクエリのサポート
2019年1月28日筆者: ガネーシュ・ヴァーネカー
はじめに
タイトルが示すように、サブクエリはクエリの一部であり、これまで不可能だったクエリ内でレンジクエリを実行できます。これは長年にわたる機能リクエストでした: prometheus/prometheus/1227。
サブクエリサポートのためのプルリクエストは最近Prometheusにマージされ、Prometheus 2.7で利用可能になります。以下で詳しく見ていきましょう。
動機
場合によっては、より低い解像度/範囲(例: 5m
)でrate
を使用して問題を発見し、そのデータをより高い範囲(例: 1h
のmax_over_time
)で集計したいことがあります。
以前は、上記のことは単一のPromQLクエリでは不可能でした。アラートルールやグラフ化のためにクエリに範囲選択をしたい場合は、そのクエリに基づいた記録ルールを設定し、記録ルールによって作成されたメトリックに対して範囲選択を実行する必要がありました。例: max_over_time(rate(my_counter_total[5m])[1h])
。
数日または数週間にわたるデータについて迅速な結果が欲しい場合、記録ルールが使用可能になるまでに十分なデータが蓄積されるまでかなり待つことになります。記録ルールを追加するのを忘れると、イライラするでしょう。また、クエリの各ステップに対して記録ルールを作成するのは退屈な作業でした。
サブクエリのサポートにより、すべての待ち時間とフラストレーションが解消されます。
サブクエリ
サブクエリは/api/v1/query_range APIコールに似ていますが、インスタントクエリ内に埋め込まれています。サブクエリの結果はレンジベクトルです。
Prometheusチームは、ミュンヘンで開催されたPrometheus開発者サミット2018でサブクエリの構文について合意に達しました。これらはサブクエリサポートに関するサミットのメモと、サブクエリサポートを実装するために使用された構文の簡潔な設計文書です。
<instant_query> '[' <range> ':' [ <resolution> ] ']' [ offset <duration> ]
<instant_query>
は/query_range
APIのquery
フィールドに相当します。<range>
とoffset <duration>
はレンジセレクタに似ています。<resolution>
はオプションで、/query_range
APIのstep
に相当します。
解像度が指定されていない場合、グローバル評価間隔がサブクエリのデフォルト解像度として使用されます。また、サブクエリのステップは独立して調整され、親クエリの評価時間には依存しません。
例
min_over_time
関数内のサブクエリは、過去30分間のhttp_requests_total
メトリックの5分レートを1分間隔で返します。これは、query=rate(http_requests_total[5m]), end=<now>, start=<now>-30m, step=1m
という/query_range
APIコールに相当し、受信したすべての値の最小値を取ります。
min_over_time( rate(http_requests_total[5m])[30m:1m] )
内訳
rate(http_requests_total[5m])[30m:1m]
はサブクエリで、rate(http_requests_total[5m])
が実行されるクエリです。rate(http_requests_total[5m])
はstart=<now>-30m
からend=<now>
まで、1m
の解像度で実行されます。start
時間は1m
のステップで独立して調整されることに注意してください(調整されたステップは0m 1m 2m 3m ...
)。- 最後に、上記すべての評価結果が
min_over_time()
に渡されます。
以下はネストされたサブクエリと、デフォルト解像度の使用例です。最も内側のサブクエリは、一定の時間範囲におけるdistance_covered_meters_total
のレートを取得します。それを使用して、再び一定の時間範囲におけるレートのderiv()
を取得します。そして最後に、すべての導関数の最大値を取ります。最も内側のサブクエリの<now>
時間は、deriv()
の外部サブクエリの評価時間に対して相対的であることに注意してください。
max_over_time( deriv( rate(distance_covered_meters_total[1m])[5m:1m] )[10m:] )
ほとんどの場合、デフォルトの評価間隔(ルールがデフォルトで評価される間隔)が必要になります。カスタム解像度は、より少なく/より頻繁に計算したい場合に役立ちます。例えば、頻繁に計算したくない高負荷なクエリなどです。
エピローグ
サブクエリは記録ルールの代わりに非常に便利ですが、不必要に使用するとパフォーマンスに影響があります。負荷の高いサブクエリは、効率化のために最終的に記録ルールに変換すべきです。
また、記録ルール内にサブクエリを配置することは推奨されません。記録ルールでサブクエリを使用する必要がある場合は、より多くの記録ルールを作成してください。