Prometheusのクエリを書いていた時、共通するprefix / postfixを持つmetricsやjobを集計したくなり、ワイルドカードを使いたくなった。
Prometheusでワイルドカードを直接使う方法を見つけることができなかったため、正規表現を使うことで対応した。
まずはヒントを求めて公式ドキュメントを見てみる。
It is also possible to negatively match a label value, or to match label values against regular expressions. The following label matching operators exist:
=
: Select labels that are exactly equal to the provided string.!=
: Select labels that are not equal to the provided string.=~
: Select labels that regex-match the provided string.!~
: Select labels that do not regex-match the provided string.Regex matches are fully anchored. A match of
env=~"foo"
is treated asenv=~"^foo$"
.
チルダ記号を使えば正規表現が使えそう。
All regular expressions in Prometheus use RE2 syntax.
準拠する正規表現はRE2。
ワイルドカードを実現するために、任意の文字列を繰り返すような表現を探す。
kinds of single-character expressions | examples |
---|---|
any character, possibly including newline (s=true) | . |
任意の1文字は . で良さそう。
Repetitions | |
---|---|
x* | zero or more x , prefer more |
x+ | one or more x , prefer more |
x? | zero or one x , prefer one |
繰り返し記号はいくつかあり、 * は0個以上、 + は1個以上、 ? は0個または1個を表す。
以上より .* や .+ を使えばワイルドカードとして使えそう。
ただし、* を使う時は空の文字列が帰ってこないよう注意する。
{job=~".*"} # Bad!
{job=~".+"} # Good!
実際に使ってみる。
client01~10のjobの情報を一括で取得したければ
{job=~"client.*"}
複数箇所の温度temp1,2,3,…を得たければ
{__name__=~"temp.*"}
これで、Prometheusでワイルドカードを擬似的に使う準備が出来た。
Grafanaでダッシュボードを作りやすくなった。
コメント