モチベーション
grafanaのtemplatingを使ってでprometheusのラベルをガチャガチャやっていると項目が増えてきてポチポチ選ぶのが面倒な場面が出てくると思います。
これを(ある程度)解消できる groups/tags
という機能があるということで使ってみたのですが思ったより直感的にパパっと使えなかったので理解するためのメモです。
ゴール
prometheusのlabelの値の一部をtagにして使えるようにする
言葉で説明するの難しい…最終的にできたものを見るのが早い
やってみよう
環境
prometheus 2.10.0
grafana 6.2.2
使用するメトリクス
sample_metrics{label="hoge-1"} 1
sample_metrics{label="hoge-2"} 1
sample_metrics{label="hoge-3"} 1
sample_metrics{label="hoge-ex1"} 1
sample_metrics{label="hoge-ex2"} 1
sample_metrics{label="fuga-11"} 1
sample_metrics{label="fuga-12"} 1
sample_metrics{label="fuga-13"} 1
sample_metrics{label="piyo-xxx"} 1
sample_metrics{label="peko-vvv"} 1
今回はこの label
の値の -
の前の文字列をtagとして利用したいと思います
hoge
fuga
piyo
peko
をtagにする想定ですね
grafanaで前もって元になるvariableを設定しておきます
経過
なにはともあれドキュメントを見てみたのですが
https://grafana.com/docs/reference/templating/#value-groups-tags
すごいあっさりしてる…
実験的な機能らしいので仕方ないか
Tags query
でtagになる項目の一覧を出して
Tag values query
で出したtagの項目を使ってどうするか
のような感じみたいです。
Tagを得る
なにはともあれ欲しいtagを得る必要があります。
直書きで列挙したいのですが、そういうのはできずクエリで得る必要があるようです。
prometheusだとこれらを使います
https://grafana.com/docs/features/datasources/prometheus/#templating
これはprometheusのlabel_replaceを使えば多少強引だけどイケる…と思ったらダメみたい。
https://github.com/grafana/grafana/issues/11674
variablesと同じようにregexがあればできるのですがtagはquery一発で出す必要があります。
どうやら前もってtag用のlabelをメトリクスに付与しておく必要があるみたい
のでprometheusのconfigで metric_relabel_config
を使います。
上記のメトリクスに対してこのような感じでrelabelしていきます
- job_name: 'sample'
static_configs:
- targets: ['target-host']
metric_relabel_configs:
- source_labels: ["label"]
target_label: tag
regex: "(.+)-.+"
名前 tag
で対象ラベルの -
の前の文字列を値にしたラベルが作られます
で、改めて Tags query
で
label_values(tag)
として、今回の目的のtagが得られました
Tagを使う
ようやくTagを得ることができましたが、これだけではもちろん動作しません。
動作を Tag values query
で設定する必要があります。
これはドキュメントに書いてあるように、
Tagをポチッとやった時に連動させたい値の一覧を得る
といった感じです。
Tagの値は$tag
で使うことができます。
今回ですと例えば、
tag fuga
から fuga-11
fuga-12
fuga-13
を得たい
というようなことになりますので、
label_values({label=~"$tag.*"},label)
大体こんな感じです。
これで今回の目的を達成することができ、冒頭のgifのような動作をすることができるようになりました。
雑感やら
あくまで実験的な機能なので多くを期待するのはよくないです。
でもこの先機能が充実していくような雰囲気もあまり感じられないような。
とにかくtagを得るのが面倒すぎではと思うんですけど、他のdatasourceだとこれが使いやすかったりするんでしょうか。