Prometheus-5:relabel標籤重新打標

2023-07-23 12:00:08

Prometheus relabel重新打標

對target重新打標是在資料抓取之前動態重寫target標籤的強大工具,在每個資料抓取設定中,可以定義多個relabel步驟,它們將按照定義的順序依次執行。
對於發現的每個target,Prometheus預設會執行如下操作:
  1. job的標籤設定為其所屬job_name的值;
  2. __address__標籤的值為該target的通訊端地址「:」
  3. instance標籤的值為__address__的值
  4. __scheme__標籤的值為抓取該target上指標時使用的協定(http或https)
  5. __metrics_path__標籤的值為抓取該target指標時使用的URL路徑,預設為/metrics
  6. __param_標籤的值為傳遞的URL引數中第一個名稱為的引數的值
需要注意:
重新標記期間,還可以使用該target上以"__meta_"開頭的元標籤,各服務發現機制為其target新增的源標籤會有所不同。
重新標記完成後,該target上以"__"開頭的所有標籤都會被移除,若在relabel的過程中需要臨時儲存標籤值,則要使用__tmp為字首進行儲存,以避免同Prometheus的內建標籤衝突。

relabel_config

relabel中幾個重要的欄位作用:
# source_labels從指定標籤中匹配值。並將值串聯
# 使用設定的分隔符並與設定的正規表示式匹配
# 用於替換、保留和丟棄操作。
[ source_labels: '[' <labelname> [, ...] ']' ]

# 串聯源標籤值之間的分隔符,預設;
[ separator: <string> | default = ; ]

# 在替換操作中將結果值寫入的標籤。
# 對於替換操作,它是強制性的。Regex捕獲組可用。
[ target_label: <labelname> ]

# 與提取值匹配的正規表示式。
# 當actions等於replace, keep, drop, labelmap,labeldrop and labelkeep時使用
[ regex: <regex> | default = (.*) ]

# 獲取源標籤值的雜湊值的模數。
[ modulus: <int> ]

# 如果正規表示式匹配,則對其執行正規表示式替換的替換值。
[ replacement: <string> | default = $1 ]

# 基於正規表示式匹配要執行的操作。
[ action: <relabel_action> | default = replace ]

<relabel_action>欄位用於定義重新標記的行為,其可用取值有:

1. 替換標籤值

  • replace:首先將source_labels中指定的各標籤的值進行串聯,而後將regex欄位中的正規表示式對源標籤值進行匹配判定,若匹配,則將target_label欄位中指定的標籤的值替換為replacement欄位中儲存的值
    • replacement可按需參照儲存regex中的某個「分組模式」匹配到的值;預設儲存整個regex匹配到的內容
    • 進行值替換時,replacement欄位中指定標籤的值也支援以分組格式進行參照
  • hashmod:將target_label的值設定為一個hash值,該hash則由modules欄位指定的hash模組對source_labels上各標籤的串聯值進行hash計算

2. 刪除指標:該處的每個指標名稱對應一個target

  • keep:regex不能匹配到target上的source_labels上的各標籤的串聯值時,則刪除該target
  • drop:regex能夠匹配到target上的source_labels上的各標籤的串聯值時,則刪除該target

3. 建立或刪除標籤

  • labelmap:將regex對所有的標籤名進行匹配判定,而後將匹配到的標籤的值賦給replacement欄位指定的標籤名之上,通常用於取出匹配的標籤名的一部分生成新標籤
  • labeldrop:將regex對所有的標籤名進行匹配判定,能夠匹配到的標籤將從target的標籤集中刪除
  • labelkeep:將regex對所有的標籤名進行匹配判定,不能夠匹配到的標籤將從target的標籤集中刪除
注意:要確保labeldrop或labelkeep操作後,餘下的標籤集依然能唯一標識該指標

relabel範例之replace

以我們上節基於consul自動發現的target來做範例,下圖是服務發現後自動打上的標籤:
我們這裡做一個拼接,將__scheme__、__address__和__metrics_path__的值拼接成一個值並重新賦予給endpoint這個標籤,如下:
  - job_name: 'nodes'
    consul_sd_configs:
    - server: "monitor.example.com:8500"
      tags:
      - "nodes"
      refresh_interval: 2m
    scrape_interval: 15s
    relabel_configs:
    - source_labels: 
      - __scheme__
      - __address__
      - __metrics_path__
      regex: (http|https)(.*)
      separator: ""
      target_label: endpoint
      replacement: ${1}://${2}
      action: replace
重新載入設定
curl -XPOST monitor.example.com:9090/-/reload
檢視:
如此設定之後,所有job_name=nodes的target都會執行此relabel操作。

relabel範例之labelmap

以我們上節基於consul自動發現的target來做範例,下圖是服務發現後自動打上的標籤,都以__meta__consul開頭:
我們這裡做一個類似重新命名的操作,將__meta_consul_service開頭的標籤再次利用起來,將__meta_consul_service_這麼一堆去掉,改為node_xxx這種型別:
    - regex: (__meta_consul_service_)(.*)
      replacement: node_${2}
      action: labelmap
重新載入設定
curl -XPOST monitor.example.com:9090/-/reload
檢視:
已經達到預期,這個時候可以通過node_address等這些標籤進行篩選target了。

relabel範例之labeldrop

以上兩種方式實現了標籤的拼接及重新命名操作,但是還有很多標籤是我們不想要的,我們也可以通過labeldrop來將它們刪除,例如上邊所有job開頭的指標名稱全部刪除:
    - regex: ^job.*
      action: labeldrop
需要注意,relabel是按照設定順序從上往下執行的,所以在刪除操作之前如果有用到此類標籤,一定要把drop的設定放在其後邊
./promtool check config prometheus.yml
curl -XPOST monitor.example.com:9090/-/reload
此時包含所有以job開頭的標籤均已被刪除:

relabel範例之keep

以上都是對target的標籤進行了一系列操作,keep和drop是針對target本身的操作,例如,我想僅僅保持node_port標籤值為9.+1的target,其他全部刪除:
    - source_labels: 
      - node_port
      regex: 9.+1
      action: keep
最終結果,node_port=9100的target被篩選走了:

以上實現最終prometheus.yml組態檔

scrape_configs:
  - job_name: 'nodes'
    consul_sd_configs:
    - server: "monitor.example.com:8500"
      tags:
      - "nodes"
      refresh_interval: 2m
    scrape_interval: 15s
    relabel_configs:
    - source_labels: 
      - __scheme__
      - __address__
      - __metrics_path__
      regex: (http|https)(.*)
      separator: ""
      target_label: endpoint
      replacement: ${1}://${2}
      action: replace
    - regex: (__meta_consul_service_)(.*)
      replacement: node_${2}
      action: labelmap
    - regex: job
      action: labeldrop
    - source_labels: 
      - node_port
      regex: 9.+1
      action: keep

metric_relabel_config

上邊對target的標籤進行relabel後,在獲取指標的最後一步,還可以對metric進行重新打標,其作用在於:
  1. 刪除不必要的指標
  2. 從指標中刪除敏感或不需要的標籤
  3. 新增、編輯或者修改指標的標籤值或者標籤格式
對metric重新打標的設定格式與target重新打標的格式相同,但要定義到 metric_relabel_configs 欄位中。
需要注意的是:
  • 更改或新增標籤會建立新的時間序列,所以要明確使用各標籤,儘可能保持不變,避免建立出一個動態的資料環境
  • 標籤是時間序列的唯一性約束,刪除標籤並導致時間序列重複時,可能會導致系統出現問題

metric relabel刪除指標

例如刪除go_info指標,通過__name__元標籤參照指標名稱,然後由regex進行匹配判定,可使用drop action刪除匹配的指標。
注:__name__ 是一個特殊的標籤名稱,用於儲存指標名稱(也稱為「指標型別」),例如go_info它就是一個指標名稱。
下邊範例,用於在響應的job_name之上,刪除go_info指標:
  - job_name: 'nodes'
    consul_sd_configs:
    - server: "monitor.example.com:8500"
      tags:
      - "nodes"
      refresh_interval: 2m
    scrape_interval: 15s
    metric_relabel_configs:
    - source_labels: [__name__]
      regex: go_info
      action: drop
重新載入:
curl -XPOST monitor.example.com:9090/-/reload
刪除前:
刪除後:
至此,Prometheus relabel相關功能演示完畢。

寫到最後

到此部落格,Prometheus本身相關的話題、知識點及應用方式基本上都彙總完畢,後續會更著重於與Prometheus息息相關的元件介紹,包括查詢結果的持久化、grafana、pushgateway以及告警元件altermanager等服務,感興趣的朋友可以歡迎關注。