はじめに
Prometheusでのリラベルについて、どんな風に設定するのか、何ができるのかをざっくり紹介していきます。
リラベル
リラベルとは、モニタリングのターゲットのラベルを書き換えることができる設定です。
ターゲットをスクレイピングする前に、そのラベルを書き換えます。
Configuration | Prometheus
Prometheus project documentation for Configuration
設定
設定内容は下記の通りです。
1...
2 relabel_configs:
3 - source_labels: [labelname1;labelname2] # 元になるラベル
4 separator: ';' # ラベルを分割している文字
5 target_label: labelname # 書き換えられたラベル
6 regex: (.*) # source_labelsにマッチさせる正規表現
7 modulus: 10 # source_labelsのハッシュを計算するための値
8 replacement: $1 # 置換される値(正規表現でマッチしたグループも使える)
9 action: replace # リラベルアクション
10...デフォルトで設定されるラベル
デフォルトでターゲットに設定されているラベルには下記のようなものがあります。
| ターゲットラベル | 値 |
|---|---|
job | 設定のjob_name |
__adress__ | <host>:<port> |
instance | __adress__ |
__scheme__ | スキーマ |
__metrics_path__ | メトリクスのパス |
__param_<name> | <name>というURLパラメータ |
__scrape_interval__ | スクレイプするインターバル 実験的に追加されているため、削除される可能性もある |
__scrape_timeout__ | スクレイプ時のタイムアウト 実験的に追加されているため、削除される可能性もある |
先頭が__のラベルはリラベル後に削除されます。
Relabel Action
replace: 値を書き換えるlowercase: 小文字に変換uppercase: 大文字に変換keep: マッチしたターゲットを残すdrop: マッチしたターゲットを削除keepequal: source_labelsとtarget_labelが同じなら残すdropequal: source_labelsとtarget_labelが同じなら削除hashmod: ハッシュをmodした値を計算labelmap: ラベル名の変換labeldrop: マッチしたラベルを削除labelkeep: マッチしたラベルを残す
試してみる
それでは、実際にリラベルをいくつか試してみます。
今回はDocker Composeを使ってPrometheusとnode exporterを用意します。
docker-compose.ymlは下記の通りです。
1version: '3'
2services:
3 prometheus:
4 image: prom/prometheus
5 volumes:
6 - ./prometheus.yml:/etc/prometheus/prometheus.yml
7 ports:
8 - '9090:9090'
9 node-exporter:
10 image: quay.io/prometheus/node-exporter
11 ports:
12 - 9100:9100
13 volumes:
14 - ./proc:/host/proc
15 - ./sys:/host/sys
16 - ./rootfs:/rootfsベースとなる設定ファイルのprometheus.ymlは下記の通りです。
1global:
2 scrape_interval: 15s
3scrape_configs:
4 - job_name: 'node'
5 static_configs:
6 - targets: ['<PCのIPアドレス>:9100']
7 labels:
8 app: prometheus
9 env: devDocker Composeでコンテナを起動します。
1docker compose up -d初期の状態のラベルは下記のようになっています。Discovered Labels側がリラベルされる前のラベルとTarget Labelsにあるのがリラベル後のラベルになります。

replace
まずはreplaceを試してみます。
prometheus.ymlを下記のように変更します。
1global:
2 scrape_interval: 15s
3scrape_configs:
4 - job_name: 'node'
5 static_configs:
6 - targets: ['<PCのIPアドレス>:9100']
7 labels:
8 app: prometheus
9 env: dev
10 relabel_configs:
11 - source_labels: [job]
12 regex: '(.*)'
13 replacement: '${1}-job'
14 target_label: new_job_name
15 action: replace
16 - source_labels: [__address__]
17 regex: '(.*)'
18 target_label: target_ip_address
19 action: replace
20 - source_labels: [app, env]
21 regex: '((.*);(.*))'
22 replacement: '${2}_${3}'
23 target_label: app
24 action: replaceコンテナを再起動して、設定を読み込みます。
1docker compose restartTarget Labelsは下記のようになります。source_labelsをもとに新しいラベルが作成されたり、元のラベルを書き換えたりできています。

drop
次は、dropを試します。
prometheus.ymlを下記のように変更します。
1global:
2 scrape_interval: 15s
3scrape_configs:
4 - job_name: 'node'
5 static_configs:
6 - targets: ['<PCのIPアドレス>:9100']
7 labels:
8 app: prometheus
9 env: dev
10 relabel_configs:
11 - source_labels: [env]
12 regex: dev
13 action: dropコンテナを再起動して、設定を読み込みます。
1docker compose restartenv=devのラベルがついているターゲットが削除(Drop)されています。

labelmap
次は、labelmapを試します。
prometheus.ymlを下記のように変更します。
1global:
2 scrape_interval: 15s
3scrape_configs:
4 - job_name: 'node'
5 static_configs:
6 - targets: ['<PCのIPアドレス>:9100']
7 labels:
8 app: prometheus
9 env: dev
10 relabel_configs:
11 - regex: '(app|env)'
12 replacement: 'prom_${1}'
13 action: labelmapコンテナを再起動して、設定を読み込みます。
1docker compose restartregexでマッチしたラベル名から新しいラベルが作られているのがわかります。

labeldrop
最後は、labeldropを試します。
prometheus.ymlを下記のように変更します。
1global:
2 scrape_interval: 15s
3scrape_configs:
4 - job_name: 'node'
5 static_configs:
6 - targets: ['<PCのIPアドレス>:9100']
7 labels:
8 app: prometheus
9 env: dev
10 relabel_configs:
11 - regex: env
12 action: labeldropコンテナを再起動して、設定を読み込みます。
1docker compose restartregexでマッチしたラベルのみが削除されているのが確認できます。





