Prometheusのクエリに正規表現を使ってワイルドカードを実現する

Prometheusのクエリを書いていた時、共通するprefix / postfixを持つmetricsやjobを集計したくなり、ワイルドカードを使いたくなった。

Prometheusでワイルドカードを直接使う方法を見つけることができなかったため、正規表現を使うことで対応した。

まずはヒントを求めて公式ドキュメントを見てみる。

Querying basics | Prometheus
An open-source monitoring system with a dimensional data model, flexible query language, efficient time series database ...

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 as env=~"^foo$".

チルダ記号を使えば正規表現が使えそう。

All regular expressions in Prometheus use RE2 syntax.

準拠する正規表現はRE2。

Syntax
RE2 is a fast, safe, thread-friendly alternative to backtracking regular expression engines like those used in PCRE, Per...

ワイルドカードを実現するために、任意の文字列を繰り返すような表現を探す。

kinds of single-character expressionsexamples
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でダッシュボードを作りやすくなった。

コメント

タイトルとURLをコピーしました