在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
的示例: