「@」修飾子の紹介

2021年2月18日筆者: ガネーシュ・ヴェルネカール

何かについて上位10の時系列を選択したのに、10ではなく100を得たことはありませんか?もしそうなら、この記事はあなたのためです。根本的な問題が何であるか、そして私がどのようにそれを解決したかをご案内します。

現在、topk()クエリは、正確にk個の結果が得られるインスタントクエリとしてのみ意味がありますが、これを範囲クエリとして実行すると、各ステップが個別に評価されるため、k個よりはるかに多くの結果が得られる可能性があります。この@修飾子を使用すると、範囲クエリのすべてのステップでランキングを固定できます。

Prometheus v2.25.0で、新しいPromQL修飾子@を導入しました。offset修飾子がベクトルセレクタ、範囲ベクトルセレクタ、およびサブクエリの評価を評価時間に対して固定された期間でオフセットできるのと同様に、@修飾子を使用すると、クエリ評価時間に関係なく、それらのセレクタの評価を固定できます。この構文の功績は、Björn Rabensteinにあります。

<vector-selector> @ <timestamp>
<range-vector-selector> @ <timestamp>
<subquery> @ <timestamp>

<timestamp>はUnixタイムスタンプであり、浮動小数点リテラルで記述されます。

たとえば、クエリhttp_requests_total @ 1609746000は、2021-01-04T07:40:00+00:00におけるhttp_requests_totalの値を返します。クエリrate(http_requests_total[5m] @ 1609746000)は、同じ時刻におけるhttp_requests_totalの5分間のレートを返します。

さらに、start()end()も、特殊な値として@修飾子の値として使用できます。範囲クエリの場合、これらはそれぞれ範囲クエリの開始と終了に解決され、すべてのステップで同じままです。インスタントクエリの場合、start()end()は両方とも評価時間に解決されます。

topk()の修正に戻ると、次のクエリは、最後の1hレートが上位5位に入ったシリーズのhttp_requests_total1mレートをプロットします。これにより、topk()を範囲クエリとして使用した場合でも、正確にk個の結果がプロットされるため、意味のあるものになります。

rate(http_requests_total[1m]) # This acts like the actual selector.
  and
topk(5, rate(http_requests_total[1h] @ end())) # This acts like a ranking function which filters the selector.

同様に、topk()のランキングは、現在インスタントクエリとしてのみ意味のあるhistogram_quantile()のような他の関数に置き換えることができます。rate()<aggregation>_over_time()などに置き換えることができます。この新しい修飾子をどのように使用するかを教えてください!

@修飾子はデフォルトで無効になっており、フラグ--enable-feature=promql-at-modifierを使用して有効にすることができます。機能フラグの詳細については、こちらのブログ記事をご覧ください。@修飾子のドキュメントはこちらで確認できます。