天天看点

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名不一致的常用解决方案

继续阅读