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

這樣,採集後的指標同時有podpod_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的示例:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章