在consul_sd_configs定义当中通过server定义了Consul服务的访问地址,services则定义了当前需要发现哪些类型服务实例的信息,这里限定了只获取node_exporter和cadvisor的服务实例信息。
4.4服务发现与Relabel如何过滤选择Target实例?relabel
目前为止,只要是注册到Consul上的Node Exporter或者cAdvisor实例是可以自动添加到Prometheus的Target当中。现在请考虑下面的场景:
对于线上环境我们可能会划分为:dev, stage, prod不同的集群。每一个集群运行多个主机节点,每个服务器节点上运行一个Node Exporter实例。Node Exporter实例会自动测试到服务注册中心Consul服务当中,Prometheus会根据Consul返回的Node Exporter实例信息产生Target列表,并且向这些Target轮训数据。
然而,如果我们可能还需要:
1.需要按照不同的环境dev, stage, prod聚合监控数据?
2.对于研发团队而言,我可能只关心dev环境的监控数据?
3.为每一个团队单独搭建一个Prometheus Server? 如何让不同团队的Prometheus Server采集不同的环境监控数据?
Relabel可以在Prometheus采集数据之前,通过Target实例的Metadata信息,动态重新写入Label的值。除此之外,我们还能根据Target实例的Metadata信息选择是否采集或者忽略该Target实例。
在默认情况下,我们从所有环境的Node Exporter中采集到的主机指标如下:
1
node_cpu{cpu="cpu0",instance="172.21.0.3:9100",job="consul_sd",mode="guest"}
基于Consul动态发现的Target实例,具有以下Metadata信息:
__meta_consul_address: consul地址
__meta_consul_dc: consul中服务所在的数据中心
__meta_consul_metadata_: 服务的metadata
__meta_consul_node: 服务所在consul节点的信息
__meta_consul_service_address: 服务访问地址
__meta_consul_service_id: 服务ID
__meta_consul_service_port: 服务端口
__meta_consul_service: 服务名称
__meta_consul_tags: 服务包含的标签信息
在Prometheus UI中,也可以直接查看target的metadata信息。
这里我们使用__meta_consul_dc信息来标记当前target所在的data center。并且通过regex来匹配source_label的值,使用replacement来选择regex表达式匹配到的mach group。通过action来告诉prometheus在采集数据之前,需要将replacement的内容写入到target_label dc当中
1
2
3
4
5
6
7
8
scrape_configs:
- job_name: consul_sd
relabel_configs:
- source_labels: ["__meta_consul_dc"]
regex: "(.*)"
replacement: $1
action: replace
target_label: "dc"
对于直接保留标签的值时,也可以简化为:
1
2
- source_labels: ["__meta_consul_dc"]
target_label: "dc"
查询Prometheus查询监控数据,所有metrics都被写入了所在的数据中心标签dc
1
node_cpu{cpu="cpu0",dc="dc1",instance="172.21.0.6:9100",job="consul_sd",mode="guest"} 0