天天看點

Prometheus中label名不一緻的常用解決方案

在Prometheus的時候,有時候出于某種目的,經常會有要重命名label的需要。比如,老K8S叢集上辨別pod名的label叫

pod_name

,新K8S叢集上的pod名label叫

pod

, 這種不一緻會造成一些不必要的麻煩。為了保障label取值的統一,這裡介紹兩種常用的方法。

采集時處理

使用metric_relabel_configs來實作。下面這段配置會添加一個名為

pod_name

的label,其值為

pod

的值:

metric_relabel_configs:
- source_labels: [pod]
  regex: (.+)
  target_label: pod_name
  replacement: $1
  action: replace
           

這樣,采集後的名額同時有

pod

pod_name

的label,這樣在pod相關監控的查詢和Grafana作圖時,能同時相容新老K8S叢集了。

查詢時處理

使用label_replace函數,可以在查詢時,将結果添加一個想要的label。其具體文法格式如下:

label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)
           

函數的括号裡面有4個逗号分割的5個參數:

  • v是瞬時矢量名額
  • dst_label将要添加的label名
  • replacement為dst_label的值,通常是第5個參數正則比對取出的值
  • src_label是第5個參數正則取值的源label名
  • regex是正規表達式

看下面這個官網上提供的例子:

label_replace(up{job="api-server",service="a:c"}, "foo", "$1", "service", "(.*):.*")
           

其作用是,添加一個名為foo的标簽,其值是通過正則取的$1,是名為service的label的冒号前面部分的字元,即a

需要注意的是,如果正規表達式沒有比對到,則不會添加label。

如下是一個通過label_replace函數添加

pod_name

的示例:

Prometheus中label名不一緻的常用解決方案

繼續閱讀