云原生监控系统Prometheus——Relabelling(重新标记)
Relabelling(重新标记)
Prometheus 通过重新标记机制进行控制管理采集来的复杂的数据集,尽可能的实现标准化环境中的指标。我们通常用于修改导出指标信息中的标签 label 字段,对指标进行过滤,删除不必要的指标,从而可以在指标中删除敏感或不需要的标签,并且支持添加、编辑或修改指标的标签值或标签格式。
Target 以双下划线 "__" 作为内置标签的开头。在默认情况下,被加载的 Target 包含以下标签:
- __address__,当前目标实例的访问地址: <host>:<port>。
- __metrics_path__,采集目标服务访问地址的访问路径。
- __scheme__,采集目标服务访问地址的 http 或 https 协议。
- __param_<name>,是采集任务目标服务中包含的请求参数。
其中,instance 标签内容与 __adress__ 相对应,这里其实发生了一次标签重写处理。针对这种发生在采集样本数据之前、对 Target 实例的标签进行重写的机制,在 Prometheus 中称为 Relabeling 行为机制,可以通过配置文件中 relabel_configs 字段自定义重写标签。
relabel_config 是一个很强大的功能,除了修改标签,还可以为采集的指标添加新标签。下面是完整的 relabel_config 配置内容:
# 源标签从现有标签中选择值。 它们的内容使用已配置的分隔符进行连接,并与已配置的正则表达式进行匹配,以进行替换,保留和删除操作。
[ source_labels: '[' <labelname> [, ...] ']' ]
# 分隔符放置在连接的源标签值之间。
[ separator: <string> | default = ; ]
# 在替换操作中将结果值写入的标签。
# 替换操作是强制性的。 正则表达式捕获组可用。
[ target_label: <labelname> ]
# 与提取的值匹配的正则表达式。
[ regex: <regex> | default = (.*) ]
# 采用源标签值的散列的模数。
[ modulus: <uint64> ]
# 如果正则表达式匹配,则执行正则表达式替换的替换值。 正则表达式捕获组可用。
[ replacement: <string> | default = $1 ]
# 基于正则表达式匹配执行的操作。
[ action: <relabel_action> | default = replace ]
可以看到,action 定义了对源数据标签的操作处理方式,默认为 replace 操作。该行会根据 regex 的配置匹配 source_labels 标签的值,并且将匹配到的值写入 target_label,如果有多个匹配组,则可以使用 ${1},${2} 确定写入的内容。如果没有匹配到任何内容,则不对 target_label 进行重新。出去 replace 操作行为之外,action 具有其他操作行为。
scrape_configs:
- job_name: file
file_sd_configs:
- files:
- '*.json'
#例如:team="monitoring"-->team_new="monitor"
relabel_configs:
-source_labels: [team]
regex: monitoring
replacement: monitor
target_label: team_new
action: replace
#action的默认值是replace
- source_labels: [__meta_consul_address]
regex: '(.*)'
replacement: '${1}:9100'
target_label: __address__
#参看上面看看这个什么意思
- source_labels: [__meta_consul_tag]
regex: '.*,(prod|staging|dev),.*'
target_label: env
- keep: 丢弃 source_labels 指定的值中没有匹配到 regex 正则表达式内容的 target。
scrape_configs: - job_name: node consul_sd_configs: - server: 'localhost:8500' relabel_configs: - source_labels: [__meta_consul_tag] regex: '.*,prod,.*' action: keep
- drop: 丢失 source_labels 指定的值中匹配到 regex 正则表达式内容的 target。
scrape_configs: - job_name: node consul_sd_configs: - server: 'localhost:8500' relabel_configs: - source_labels: [__meta_consul_tag] regex: '.*,prod,.*' action: drop
- labelmap: 针对所有标签名来匹配 regex,然后将匹配的标签的值复制到 replacement 所指定的新标签中。
scrape_configs: - job_name: ec2 ec2_sd_configs: - region: <region> access_key: <access key> secret_key: <secret key> #将所有以monitor_开头的标签名替换为去掉monitor_前缀的新标签名字(例如:monitor_foo="bar"-->foo="bar") relabel_configs: - regex: monitor_(.*) replacement: '${1}' action: labelmap
- labelkeep: 针对所有标签名来匹配 regex,任何不匹配的标签将从标签集中删除。
- labeldrop: 针对所有标签来匹配 regex,任何匹配的标签将从标签集中删除。
我们通过一个简单的示例,对默认 prometheus.yml 配置文件进行修订,来展示在多应用场景环境下,使用 replace 操作 Target 的元数据(Metadata)标签重写入新的标签键值对,添加与环境相关的特征纬度,以便更好地对数据进行聚合。默认配置文件情况下的节点标签信息在 Prometheus Web UI 中显示如下:
现在对 prometheus.yml 进行修改,添加 Prometheus 的 Relabeling机制,可以使用 "target_label: MobileGames" 来标记场景为手游业务,即 MobileGames。具体配置内容如下:
scrape_configs:
- job_name: 'node'
static_configs:
- targets: {'192.168.2.121:9100','192.168.2.122:9100'}
relabel_configs:
- action: replace
source_labels: ['__address__']
regex: (.*)
replacement: $1
target_label: MobileGame
重启 Prometheus 或热加载配置后,通过浏览器查看 Prometheus Web UI 中的信息,可以看到新标签 MobileGames 已经被添加。
Prometheus 中可以在两个阶段进行重新标记工作:
第一阶段,重新标记来自服务发现的目标,将来自服务发现的元数据标签的信息应用到对应指标的标签上,这是在作业内的 relabel_configs 模块中完成的;
第二阶段,Prometheus 在 scape 之后,且在监控指标保存到存储系统之前。
我们能确定保存或删除了哪些指标,以及这些指标的表现形式,这是在配置文件 metric_relabel_configs 模块内完成的。关于更详尽的配置说明,可以访问官方地址:https://prometheus.io/docs/prometheus/latest/configuration/configuration/ 进行查询。