Prometheus relabel重新打标

对target重新打标是在数据抓取之前动态重写target标签的强大工具,在每个数据抓取配置中,可以定义多个relabel步骤,它们将按照定义的顺序依次执行。
对于发现的每个target,Prometheus默认会执行如下操作:
  1. job的标签设定为其所属job_name的值;
  2. __address__标签的值为该target的套接字地址“:”
  3. instance标签的值为__address__的值
  4. __scheme__标签的值为抓取该target上指标时使用的协议(http或https)
  5. __metrics_path__标签的值为抓取该target指标时使用的URL路径,默认为/metrics
  6. __param_标签的值为传递的URL参数中第一个名称为的参数的值
需要注意:
重新标记期间,还可以使用该target上以"__meta_"开头的元标签,各服务发现机制为其target添加的源标签会有所不同。
重新标记完成后,该target上以"__"开头的所有标签都会被移除,若在relabel的过程中需要临时存储标签值,则要使用__tmp为前缀进行保存,以避免同Prometheus的内建标签冲突。

relabel_config

relabel中几个重要的字段作用:
# source_labels从指定标签中匹配值。并将值串联
# 使用配置的分隔符并与配置的正则表达式匹配
# 用于替换、保留和丢弃操作。
[ source_labels: '[' <labelname> [, ...] ']' ]

# 串联源标签值之间的分隔符,默认;
[ separator: <string> | default = ; ]

# 在替换操作中将结果值写入的标签。
# 对于替换操作,它是强制性的。Regex捕获组可用。
[ target_label: <labelname> ]

# 与提取值匹配的正则表达式。
# 当actions等于replace, keep, drop, labelmap,labeldrop and labelkeep时使用
[ regex: <regex> | default = (.*) ]

# 获取源标签值的哈希值的模数。
[ modulus: <int> ]

# 如果正则表达式匹配,则对其执行正则表达式替换的替换值。
[ replacement: <string> | default = $1 ]

# 基于正则表达式匹配要执行的操作。
[ action: <relabel_action> | default = replace ]

<relabel_action>字段用于定义重新标记的行为,其可用取值有:

1. 替换标签值

  • replace:首先将source_labels中指定的各标签的值进行串联,而后将regex字段中的正则表达式对源标签值进行匹配判定,若匹配,则将target_label字段中指定的标签的值替换为replacement字段中保存的值
    • replacement可按需引用保存regex中的某个“分组模式”匹配到的值;默认保存整个regex匹配到的内容
    • 进行值替换时,replacement字段中指定标签的值也支持以分组格式进行引用
  • hashmod:将target_label的值设置为一个hash值,该hash则由modules字段指定的hash模块对source_labels上各标签的串联值进行hash计算

2. 删除指标:该处的每个指标名称对应一个target

  • keep:regex不能匹配到target上的source_labels上的各标签的串联值时,则删除该target
  • drop:regex能够匹配到target上的source_labels上的各标签的串联值时,则删除该target

3. 创建或删除标签

  • labelmap:将regex对所有的标签名进行匹配判定,而后将匹配到的标签的值赋给replacement字段指定的标签名之上,通常用于取出匹配的标签名的一部分生成新标签
  • labeldrop:将regex对所有的标签名进行匹配判定,能够匹配到的标签将从target的标签集中删除
  • labelkeep:将regex对所有的标签名进行匹配判定,不能够匹配到的标签将从target的标签集中删除
注意:要确保labeldrop或labelkeep操作后,余下的标签集依然能唯一标识该指标

relabel示例之replace

以我们上节基于consul自动发现的target来做示例,下图是服务发现后自动打上的标签:
Prometheus-5:relabel标签重新打标-LMLPHP
我们这里做一个拼接,将__scheme__、__address__和__metrics_path__的值拼接成一个值并重新赋予给endpoint这个标签,如下:
  - job_name: 'nodes'
    consul_sd_configs:
    - server: "monitor.example.com:8500"
      tags:
      - "nodes"
      refresh_interval: 2m
    scrape_interval: 15s
    relabel_configs:
    - source_labels: 
      - __scheme__
      - __address__
      - __metrics_path__
      regex: (http|https)(.*)
      separator: ""
      target_label: endpoint
      replacement: ${1}://${2}
      action: replace
重新加载配置
curl -XPOST monitor.example.com:9090/-/reload
查看:
Prometheus-5:relabel标签重新打标-LMLPHP
如此配置之后,所有job_name=nodes的target都会执行此relabel操作。

relabel示例之labelmap

以我们上节基于consul自动发现的target来做示例,下图是服务发现后自动打上的标签,都以__meta__consul开头:
Prometheus-5:relabel标签重新打标-LMLPHP
我们这里做一个类似重命名的操作,将__meta_consul_service开头的标签再次利用起来,将__meta_consul_service_这么一堆去掉,改为node_xxx这种类型:
    - regex: (__meta_consul_service_)(.*)
      replacement: node_${2}
      action: labelmap
重新加载配置
curl -XPOST monitor.example.com:9090/-/reload
查看:
Prometheus-5:relabel标签重新打标-LMLPHP
已经达到预期,这个时候可以通过node_address等这些标签进行筛选target了。

relabel示例之labeldrop

以上两种方式实现了标签的拼接及重命名操作,但是还有很多标签是我们不想要的,我们也可以通过labeldrop来将它们删除,例如上边所有job开头的指标名称全部删除:
    - regex: ^job.*
      action: labeldrop
需要注意,relabel是按照配置顺序从上往下执行的,所以在删除操作之前如果有用到此类标签,一定要把drop的配置放在其后边
./promtool check config prometheus.yml
curl -XPOST monitor.example.com:9090/-/reload
此时包含所有以job开头的标签均已被删除:
Prometheus-5:relabel标签重新打标-LMLPHP

relabel示例之keep

以上都是对target的标签进行了一系列操作,keep和drop是针对target本身的操作,例如,我想仅仅保持node_port标签值为9.+1的target,其他全部删除:
    - source_labels: 
      - node_port
      regex: 9.+1
      action: keep
最终结果,node_port=9100的target被筛选走了:
Prometheus-5:relabel标签重新打标-LMLPHP

以上实现最终prometheus.yml配置文件

scrape_configs:
  - job_name: 'nodes'
    consul_sd_configs:
    - server: "monitor.example.com:8500"
      tags:
      - "nodes"
      refresh_interval: 2m
    scrape_interval: 15s
    relabel_configs:
    - source_labels: 
      - __scheme__
      - __address__
      - __metrics_path__
      regex: (http|https)(.*)
      separator: ""
      target_label: endpoint
      replacement: ${1}://${2}
      action: replace
    - regex: (__meta_consul_service_)(.*)
      replacement: node_${2}
      action: labelmap
    - regex: job
      action: labeldrop
    - source_labels: 
      - node_port
      regex: 9.+1
      action: keep

metric_relabel_config

上边对target的标签进行relabel后,在获取指标的最后一步,还可以对metric进行重新打标,其作用在于:
  1. 删除不必要的指标
  2. 从指标中删除敏感或不需要的标签
  3. 添加、编辑或者修改指标的标签值或者标签格式
对metric重新打标的配置格式与target重新打标的格式相同,但要定义到 metric_relabel_configs 字段中。
需要注意的是:
  • 更改或添加标签会创建新的时间序列,所以要明确使用各标签,尽可能保持不变,避免创建出一个动态的数据环境
  • 标签是时间序列的唯一性约束,删除标签并导致时间序列重复时,可能会导致系统出现问题

metric relabel删除指标

例如删除go_info指标,通过__name__元标签引用指标名称,然后由regex进行匹配判定,可使用drop action删除匹配的指标。
注:__name__ 是一个特殊的标签名称,用于存储指标名称(也称为“指标类型”),例如go_info它就是一个指标名称。
下边示例,用于在响应的job_name之上,删除go_info指标:
  - job_name: 'nodes'
    consul_sd_configs:
    - server: "monitor.example.com:8500"
      tags:
      - "nodes"
      refresh_interval: 2m
    scrape_interval: 15s
    metric_relabel_configs:
    - source_labels: [__name__]
      regex: go_info
      action: drop
重新加载:
curl -XPOST monitor.example.com:9090/-/reload
删除前:
Prometheus-5:relabel标签重新打标-LMLPHP
删除后:
Prometheus-5:relabel标签重新打标-LMLPHP
至此,Prometheus relabel相关功能演示完毕。

写到最后

到此博客,Prometheus本身相关的话题、知识点及应用方式基本上都汇总完毕,后续会更着重于与Prometheus息息相关的组件介绍,包括查询结果的持久化、grafana、pushgateway以及告警组件altermanager等服务,感兴趣的朋友可以欢迎关注。
07-23 18:04