在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
的示例:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiIXZ05WZj91YpB3IwczX0xiRGZkRGZ0Xy9GbvNGL2EzXlpXazxSP9cnW1xWbhFDbzgFNsdkYsplMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZwpmL3gzNzUDM1MjM2EjNwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)