概述
指标抓取的生命周期
官网地址: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config
下图展示了Prometheus上进行指标抓取的简单生命周期- 在每个scrape_interval期间,Prometheus都会检查执行的作业(Job);
- 这些作业首先会根据Job上指定的发现配置生成target列表,此即服务发现过程;
- 服务发现会返回一个Target列表,其中包含一组称为元数据的标签,这些标签都以“__meta_”为前缀;
- 服务发现还会根据目标配置来设置其它标签,这些标签带有“__”前缀和后缀,包括“__scheme__”、“__address__”和“__metrics_path__”,分别保存有target支持使用协议(http或https,默认为http)、target的地址及指标的URI路径(默认为/metrics);
- 若URI路径中存在任何参数,则它们的前缀会设置为“__param_”
- 这些目标列表和标签会返回给Prometheus,其中的一些标签也可以配置中被覆盖;
- 将来自服务发现的元数据标签中的信息附加到指标的标签上;
- 过滤目标;
- 它定义在job配置段的metric_relabel_configs配置中,常用于实现如下功能
- 删除不必要的指标;
- 从指标中删除敏感或不需要的标签;
- 添加、编辑或修改指标的标签值或标签格式;
对target重新打标
对target重新打标是在数据抓取之前动态重写target标签的强大工具,在每个数据抓取配置中,可以定义多个relabel步骤,它们将按照定义的顺序依次执行; 对于发现的每个target,Prometheus默认会执行如下操作- job的标签设定为其所属的job_name的值;
- __address__标签的值为该target的套接字地址“<host>:<port>”
- instance标签的值为__address__的值;
- __scheme__标签的值为抓取该target上指标时使用的协议(http或https);
- __metrics_path__标签的值为抓取该target上的指标时使用URI路径,默认为/metrics;
- __param_<name>标签的值为传递的URL参数中第一个名称为<name>的参数的值;
- 各服务发现机制为其target添加的元标签会有所不同;
- 若在relabel的过程中需要临时存储标签值,则要使用__tmp标签名称为前缀进行保存,以避免同Prometheus的内建标签冲突;
relabel_configs
<relabel_action>字段用于定义重新标记的行为,其可用取值如下- 替换标签值
- replace:首先将source_labels中指定的各标签的值进行串连,而后将regex字段中的正则表达式对源标签值进行匹配判定,若匹配,则将target_label字段中指定的标签的值替换为replacement字段中保存的值;
- replacement可按需引用保存regex中的某个“分组模式”匹配到的值;默认保存整个regex匹配到的内容;
- 进行值替换时 ,replacememnt字段中指定标签的值也支持以分组格式进行引用;
- hashmod:将target_label的值设置为一个hash值,该hash则由modules字段指定的hash模对块对source_labels上各标签的串连值进行hash计算生成;
- replace:首先将source_labels中指定的各标签的值进行串连,而后将regex字段中的正则表达式对源标签值进行匹配判定,若匹配,则将target_label字段中指定的标签的值替换为replacement字段中保存的值;
- 删除指标:该处的每个指标名称对应一个target
- keep:regex不能匹配到target上的source_labels上的各标签的串连值时,则删除该target;
- drop:regex能够匹配到target上的source_labels上的各标签的串连值时,则删除该target;
- 创建或删除标签
- labelmap:将regex对所有的标签名进行匹配判定,而后将匹配到的标签的值赋给replacement字段指定的标签名之上;通常用于取出匹配的标签名的一部分生成新标签;
- labeldrop:将regex对所有的标签名进行匹配判定,能够匹配到的标签将从该target的标签集中删除;
- labelkeep:将regex对所有的标签名进行匹配判定,不能匹配到的标签将从该target的标签集中删除;
示例
标签replace替换
将三个原标签的值按格式进行串联, 有正则表达式进行模式匹配, 而后由 replacement 引用模式匹配结果, 赋值给endpoint标签.
- job_name: 'nodes' static_configs: - targets: - 192.168.168.105:9100 - 192.168.168.107:9100 - 192.168.168.108:9100 relabel_configs: - source_labels: - __scheme__ - __address__ - __metrics_path__ regex: "(http|https)(.*)" separator: "" target_label: "endpoint" replacement: "${1}://${2}" action: replace
标签计算哈希值hashmod
意义: Prometheus server 数据(比如一个机房的所有机器信息)特别大,超过了单机承载能力。
此时我们可以采用 hashmod 配置,使用同样的配置列表,将抓取目标散列到不同的 Prometheus server 中去, 从而很好实现 Prometheus 数据收集的横向扩展。
- job_name: 'nodes' static_configs: - targets: - 192.168.168.105:9100 - 192.168.168.107:9100 - 192.168.168.108:9100 relabel_configs: - source_labels: - __scheme__ - __address__ - __metrics_path__ target_label: "hash" modulus: 2 action: hashmod
标签映射 labelmap
将regex指定的模式对target上的所有标签进行匹配判定,对于匹配到的标签名,它将以该标签名中匹配的部分为前缀,指定的“_name”为后缀生成新的标签名,而新标签的值则与其原标签的值相同;- job_name: 'nodes' static_configs: - targets: - 192.168.168.105:9100 - 192.168.168.107:9100 - 192.168.168.108:9100 relabel_configs: - regex: "(job|app)" replacement: ${1}_name action: labelmap
标签删除 labeldrop
将regex指定的模式对target上的所有标签进行匹配判定,对于匹配到的标签名,将删除此标签.
# all node - job_name: 'nodes' static_configs: - targets: - 192.168.168.105:9100 - 192.168.168.107:9100 - 192.168.168.108:9100 relabel_configs: - regex: "(job|app)" action: labeldrop
标签保留 labelkeep
将regex指定的模式对target上的所有指标(__name__)进行匹配判定,对于匹配到的指标名,将删除.
也可删除 target.
目前测试此选项会删除 instance.
# all node - job_name: 'nodes' static_configs: - targets: - 192.168.168.105:9100 - 192.168.168.107:9100 - 192.168.168.108:9100 relabel_configs: - regex: "(instance|job|app)" action: labelkeep
删除指标 drop
将regex指定的模式对target上的所有标签进行匹配判定,对于匹配到的标签名,将删除此标签.
# all node - job_name: 'nodes' static_configs: - targets: - 192.168.168.105:9100 - 192.168.168.107:9100 - 192.168.168.108:9100 relabel_configs: - source_labels: - __name__ regex: "go_info" action: drop
配置前查看指标
配置后查看指标
target保留 keep
将regex指定的模式对target上的指定的标签进行匹配判定,对于匹配到的标签名,则保留此target, 反之则删除.
# all node - job_name: 'nodes' static_configs: - targets: - 192.168.168.105:9100 - 192.168.168.107:9100 - 192.168.168.108:9100 relabel_configs: - source_labels: - __address__ regex: "192.168.168.105.*" action: keep