いらないメトリクスは拾いたくない
Prometheusでスクレイプする対象にいらないメトリクスがあったときに無視したかった.
まとめ
特定のメトリクスだけ除外したいときはmetric_relabel_configs
で除外したいメトリクスのラベルを正規表現で記述してdropするのが良さそう.
# メトリクス名がnode_cpu_seconds_totalでmode="idle"のラベルを持つメトリクスを除外する例
scrape_configs:
- job_name: 'node'
static_configs:
- targets: ['localhost:9100']
metric_relabel_configs:
- source_labels: [__name__, mode]
regex: 'node_cpu_seconds_total;idle'
action: drop
環境
- Raspberry Pi 3 Model B+
- OSはRaspbian(10.0)
- 監視サーバとして使用
- Prometheus version 2.15.2
- Node exporter version 0.18.1
やりかた
例えばNode exporter
で取れるCPU時間のメトリクスnode_cpu_seconds_total
をPrometheus
で見ているとき,
普通はこんな感じでmode
ラベルの値が異なる複数のメトリクスが取れる.
node_cpu_seconds_total{cpu="0"}
メトリクスの用途はさておき, この中でmode="idle"
のラベルがついているメトリクスだけを除外したいとする.
そんなときはPrometheus
のスクレイプ設定でmetric_relabel_configs
の設定を追加する.
この設定により, __name__
ラベル(メトリクス名)がnode_cpu_seconds_total
かつmode
ラベルがidle
であるメトリクスだけが除外(drop)される.
設定変更後, Prometheus
を再起動する.
# prometheusのスクレイプ設定を変更して再起動
$ vim /usr/local/prometheus/prometheus.yml
$ sudo systemctl restart prometheus
再度Prometheus
で先程と同じクエリを投げると, mode="idle"
のラベルがついたメトリクスだけがなくなっていることがわかる.
今度は逆にmode="idle"
のラベルがついているメトリクスだけを残して, 他のメトリクスを拾わないようにしてみる.
この設定により, __name__="node_cpu_seconds_total"
とmode="idle"
の両方のラベルを持つメトリクスのみが保持(keep)され,
それ以外のメトリクスがすべて除外される.
これでも問題なさそうだけど, 実はこの設定を入れるとメトリクス名(__name__
)がnode_cpu_seconds_total
でないメトリクスがすべて捨てられてしまうので,node_filesystem_free_bytes
(ファイルシステムの空き容量)のようなNode exporter
の他のメトリクスが取れなくなってしまう.
うまいこと__name__="node_cpu_seconds_total"
かつmode!="idle"
のような条件を正規表現で書ければいいんだけど,Prometheus
で使うRE2正規表現は(?!idle)
みたいな否定先読みに対応していないらしいのでちょっと難しい.
よくわかんなかったので苦肉の策として除外したい個別のラベルを列挙してみた.
これなら__name__="node_filesystem_free_bytes"
のような他のメトリクスを捨てずに__name__="node_cpu_seconds_total"
のメトリクスの中でmode="idle"
なものだけを残せるけど,
除外するラベルを全部列挙するのはあんまり現実的じゃないような気がする…
おわり
正規表現にマッチするメトリクスだけ除外するdropとその逆のkeepだと本当は除外対象を列挙しないで済むkeepを使いたくなるけど,
現状は正規表現の仕様でdropのほうが使いやすいという感じがする.
そもそもそこまで排除対象のメトリクスが多いようなスクレイプ対象だったらそれ自体を見直したほうがいいのだろうか.
とりあえずはdropで頑張ってみて, keepでいい感じに他のメトリクスを残せるような方法があったら試してみたい.