三、prometheus之relabel詳解


一、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標簽還在

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM