和前面的一些 action 不同,labelmap 是对标签名而不是标签值进行重新匹配和操作。 labelmap 是对标签名而不是标签值进行重新匹配和操作

有时我们可能想把源标签的值映射到一组新的标签中去,这个时候就可以使用 labelmap 这个动作了。labelmap 最常用的使用场景就是从服务发现中获取一组隐藏的或临时的元数据标签,并将它们映射到新的目标标签中。

labelmap 动作的配置规则如下所示:

action: labelmap
regex: <regular expression> # 默认为 '(.*)'
replacement: <replacement string> # 默认为 '$1'

和前面的一些 action 不同,labelmap 是对标签名而不是标签值进行重新匹配和操作labelmap 按顺序执行以下步骤:

  • 将 regex 中的正则表达式与所有标签名进行匹配
  • 将匹配的标签名的任何匹配值复制到由 replacement 字符串决定的新的标签名中

下面我们看一个使用 labelmap 映射 Kubernetes Service 标签的示例。当使用基于 Kubernetes 的服务发现来发现 pod 端点时,我们可能希望每个端点的最终目标标签也包含 Kubernetes Service 标签,这样可以更好的区分端点数据。

Kubernetes 服务发现机制会将这些标签添加到 Prometheus 中去,标签名称格式为 __meta_kubernetes_service_label_<labelname>,我们可以提取这些元数据标签中的 <labelname> 部分,并将相应的标签值映射到一组以 k8s_ 为前缀的新标签名称上,如下所示:

action: labelmap
regex: __meta_kubernetes_service_label_(.+)
replacement: "k8s_$1"
- job_name: 'kubernetes-node-exporter'
      kubernetes_sd_configs:
      - role: node
      relabel_configs:
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)

通过上面的 labelmap 操作,regex 正则表达式中匹配标签名,然后将标签名对应的值复制到 k8s_$1 的新标签中,$1 就是匹配的标签名这个捕获组。

labelmap 补充

做上面这些事情是有两个阶段的,一个是采集之前,一个是采集之后,如果在采集之前重新定义标签没生效,那么可以使用采集之后的标签(因为使用的是k8s的服务发现,不管用的是哪个服务发现,默认带的都是源标签__meta_kubernetes_node_label  比如consul那么就是以consul开头的,这些不同服务发现的标签就是为了新标签的生成,就是为了更加好的标识监控指标,源标签是不会入库的)

relabel_configs:
# 将标签(.*)作为新标签名,原有值不变(新的标签名字会被入库查询)
- action: labelmap
  regex: __meta_kubernetes_node_label_(.*)


(.*)  ,以其开头所有值匹配到,用这个匹配的值作为新的标签名字,新的标签名字就可以入库,就会被查询,因为元标签以下划线开头的是不会入库的,后面是用不了的/这样做的目的就是将后面(.*)匹配的值作为一个新标签,并且将原有值赋予新标签,后面可以基于这个新标签查询数据了。