一、relabel簡介
為了更好的識別監控指標,便於后期調用數據繪圖、告警等需求,prometheus支持對發現的目標進行label修改,可以在目標被抓取之前動態重寫目標的標簽集。每個抓取配置可以配置多個重新標記步驟。它們按照它們在配置文件中出現的順序應用於每個目標的標簽集。
除了配置的每個目標標簽之外,prometheus還會自動添加幾個標簽:
job標簽:設置為job_name相應的抓取配置的值。
instance標簽:__address__設置為目標的地址<host>:<port>。重新標記后,如果在重新標記期間未設置標簽,則默認將__address__標簽值賦值給instance。
__schema__:協議類型
__metrics_path:抓取指標數的url
__scrape_interval__:scrape抓取數據時間間隔(秒)
__scrape_timeout__:scrape超時時間(秒)
__meta_在重新標記階段可能會提供帶有前綴的附加標簽。它們由提供目標的服務發現機制設置,並且因機制而異。
__目標重新標記完成后,將從標簽集中刪除以開頭的標簽。
如果重新標記步驟只需要臨時存儲標簽值(作為后續重新標記步驟的輸入),可以使用__tmp標簽名稱前綴。這個前綴保證不會被 Prometheus 本身使用。
常用的在以下兩個階段可以重新標記:
relabel_configs:在采集之前(比如在采集數據之前重新定義元標簽),可以使用relabel_configs添加一些標簽、也可以只采集特定目標或過濾目標
metric_relabel_configs:如果是已經抓取到指標數據時,可以使用metric_relabel_configs做最后的重新標記和過濾

二、relabel_configs配置
source_labels:源標簽,沒有經過relabel處理之前的標簽名字
target_labels:通過relabel處理之后的標簽名字
separator:源標簽的值的連接分隔符。默認是";"
module:取源標簽值散列的模數
regex:正則表達式,匹配源標簽的值。默認是(.*)
replacement:通過分組替換后標簽(target_label)對應的值。默認是$1
action:根據正則表達式匹配執行的動作。默認是replace
- replace:替換標簽值,根據regex正則匹配到原標簽值,使用replacement來引用表達式匹配的分組
- keep:滿足regex正則條件的實例進行采集,把source_labels中沒有匹配到regex正則內容的target實例丟掉,即只采集匹配成功的實例
- drop:滿足regex正則條件的實例不采集,把source_labels中沒有匹配到regex正則內容的target實例丟掉,即只采集沒有匹配成功的實例
- hashmod: 使用hashmod計算source_labels的hash值並進行對比,基於自定義的模數取模,以實現對目標進行分類、重新賦值等功能
- labelmap: 匹配regex所有標簽名稱,然后復制匹配標簽的值進行分組,通過replacement分組引用($1,$2,...)替代
- labeldrop: 匹配regex所有標簽名稱,對匹配到的實例標簽進行刪除
- labelkeep: 匹配regex所有標簽名稱,對匹配到的實例標簽進行保留
三、常用的action案例
在開始之前准備prometheus配置文件
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: "prometheus"
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ["localhost:9090"]
- job_name: "nodes"
static_configs:
- targets:
- 192.168.88.201:9100
labels:
__hostname__: node01
__region_id__: "shanghai"
__zone__: a
- targets:
- 192.168.88.202:9100
labels:
__hostname__: node02
__region_id__: "beijing"
__zone__: b
查看target

因為我們的label都是以__開頭的,目標重新標簽之后,以__開頭的標簽將從標簽集中刪除的。
3.1、replace
將labels中的__hostname__替換為node_name
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: "prometheus"
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ["localhost:9090"]
- job_name: "nodes"
static_configs:
- targets:
- 192.168.88.201:9100
labels:
__hostname__: node01
__region_id__: "shanghai"
__zone__: a
- targets:
- 192.168.88.202:9100
labels:
__hostname__: node02
__region_id__: "beijing"
__zone__: b
relabel_configs:
- source_labels:
- "__hostname__"
regex: "(.*)"
target_label: "node_name"
action: replace
replacement: $1
重啟服務查看target信息如下

說下上面的配置: source_labels指定我們需要處理的源標簽, target_labels指定了我們要replace后的標簽名字, action指定relabel動作,這里使用replace替換動作。 regex去匹配源標簽(__hostname__)的值,"(.*)"代表__hostname__這個標簽是什么值都匹配的,然后replacement指定的替換后的標簽(target_label)對應的數值。采用正則引用方式獲取的。
3.2、keep
只要source_labels的值匹配node01的實例才會被采集數據,其他實例不會采集
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: "prometheus"
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ["localhost:9090"]
- job_name: "nodes"
static_configs:
- targets:
- 192.168.88.201:9100
labels:
__hostname__: node01
__region_id__: "shanghai"
__zone__: a
- targets:
- 192.168.88.202:9100
labels:
__hostname__: node02
__region_id__: "beijing"
__zone__: b
relabel_configs:
- source_labels:
- "__hostname__"
regex: "node01"
action: keep
target如下圖

3.3、drop
在keep的基礎上把action修改為drop
target如下圖

action為drop,其實和keep是相似的, 不過是相反的, 只要source_labels的值匹配regex(node01)的實例不會被采集。 其他的實例會被采集。
3.4、labelmap
所有被regex __(.*)__匹配到的標簽名,復制匹配到的標簽的值,通過replacement分組引用$1,然后創建匹配到的標簽集
修改配置如下:
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: "prometheus"
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ["localhost:9090"]
- job_name: "nodes"
static_configs:
- targets:
- 192.168.88.201:9100
labels:
__hostname__: node01
__region_id__: "shanghai"
__zone__: a
- targets:
- 192.168.88.202:9100
labels:
__hostname__: node02
__region_id__: "beijing"
__zone__: b
relabel_configs:
- regex: "__(.*)__"
action: labelmap
查看target

3.5、labelkeep
先給每個實例打上幾個label,配置文件如下:
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: "prometheus"
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ["localhost:9090"]
- job_name: "nodes"
static_configs:
- targets:
- 192.168.88.201:9100
labels:
__hostname__: node01
__region_id__: "shanghai"
__zone__: a
- targets:
- 192.168.88.202:9100
labels:
__hostname__: node02
__region_id__: "beijing"
__zone__: b
relabel_configs:
- source_labels:
- "__hostname__"
regex: (.*)
target_label: hostname
action: replace
replacement: $1
- source_labels:
- "__region_id__"
regex: (.*)
target_label: region_id
action: replace
replacement: $1
- source_labels:
- "__zone__"
regex: (.*)
target_label: zone
action: replace
replacement: $1
查看target如下

添加labelkeep配置,保留正則__.*__|job匹配到的標簽,沒有匹配到的則刪除
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: "prometheus"
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ["localhost:9090"]
- job_name: "nodes"
static_configs:
- targets:
- 192.168.88.201:9100
labels:
__hostname__: node01
__region_id__: "shanghai"
__zone__: a
- targets:
- 192.168.88.202:9100
labels:
__hostname__: node02
__region_id__: "beijing"
__zone__: b
relabel_configs:
- source_labels:
- "__hostname__"
regex: (.*)
target_label: hostname
action: replace
replacement: $1
- source_labels:
- "__region_id__"
regex: (.*)
target_label: region_id
action: replace
replacement: $1
- source_labels:
- "__zone__"
regex: (.*)
target_label: zone
action: replace
replacement: $1
- action: labelkeep
regex: "__.*__|job"
查看target,只有instance和job標簽,instance標簽是prometheus自動生成的

3.6、labeldrop
修改labeldrop配置,刪除正則region|zone 匹配到的標簽,不匹配的保留
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: "prometheus"
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ["localhost:9090"]
- job_name: "nodes"
static_configs:
- targets:
- 192.168.88.201:9100
labels:
__hostname__: node01
__region_id__: "shanghai"
__zone__: a
- targets:
- 192.168.88.202:9100
labels:
__hostname__: node02
__region_id__: "beijing"
__zone__: b
relabel_configs:
- source_labels:
- "__hostname__"
regex: (.*)
target_label: hostname
action: replace
replacement: $1
- source_labels:
- "__region_id__"
regex: (.*)
target_label: region_id
action: replace
replacement: $1
- source_labels:
- "__zone__"
regex: (.*)
target_label: zone
action: replace
replacement: $1
- action: labeldrop
regex: "region_id|zone"
查看target,region和zone標簽已被刪除,但hostname標簽還在

