Prometheus基于consul服务发现
安装consul
wget https://releases.hashicorp.com/consul/1.6.1/consul_1.6.1_linux_amd64.zip unzip consul_1.5.3_linux_amd64.zip ./consul agent -dev
或者
docker run --name consul -d -p 8500:8500 consul
访问地址为: http://172.30.12.167:8500
添加测试注册服务,添加本机的node-exporter和另一台主机的cadvisor-exporter。
curl -X PUT -d '{"id": "node-exporter1","name": "node-exporter1-192.168.31.131","address": "192.168.31.131","port": 9100,"tags": ["test"],"checks": [{"http": "http://192.168.31.131:9100/metrics", "interval": "5s"}]}' http://192.168.31.131:8500/v1/agent/service/register curl -X PUT -d '{"id": "cadvisor-exporter1","name": "cadvisor-exporter1-192.168.31.158","address": "192.168.31.158","port": 9200,"tags": ["test1"],"checks": [{"http": "http://192.168.31.158:9200/metrics", "interval": "5s"}]}' http://192.168.31.131:8500/v1/agent/service/register
注销服务,如果不需要继续监控注册到consul的某个服务,如node-exporter,通过如下命令删除
#curl -X PUT http://192.168.31.131:8500/v1/agent/service/deregister/node-exporter
更新Prometheus配置
[root@localhost prometheus]# vim /home/prometheus/prometheus.yml global: # 全局设置,可以被覆盖 scrape_interval: 15s # 抓取采样数据的时间间隔,每15秒去被监控机上采样,即数据采集频率 evaluation_interval: 15s # 监控数据规则的评估频率,比如设置文件系统使用率>75%发出告警则每15秒执行一次该规则,进行文件系统检查 scrape_configs: # 抓取配置 #服务发现 - job_name: 'consul-prometheus' consul_sd_configs: #基于服务发现类型 - server: '192.168.31.131:8500' #服务地址 relabel_configs: - source_labels: [__meta_consul_tags] #注意两个下划线"__" regex: .*,test,.* #匹配__meta_consul_tags值包含test的数据(即tags=test) action: keep #丢弃__meta_consul_tags值中不包含test的数据
热加载prometheus
#curl -X POST http://localhost:9090/-/reload #热加载prometheus命令
自定义标签信息
Prometheus 允许用户在采集任务设置中,通过 relabel_configs
来添加自定义的 Relabeling 的额过程,来对标签进行指定规则的重写。Target 以 __
作为前置的标签是在系统内部使用的。Prometheus 内部做了一次标签重写处理,所以 instance 标签的内容刚好对应 Target 实例的 __address__
值。
详细 relabel_configs 配置及说明可以参考 relabel_config 官网说明。
- replace: 根据 regex 的配置匹配 source_labels 标签的值(注意:多个 source_label 的值会按照 separator 进行拼接),并且将匹配到的值写入到 target_label 当中,如果有多个匹配组,则可以使用 ${1}, ${2} 确定写入的内容。如果没匹配到任何内容则不对 target_label 进行重新, 默认为 replace。
- keep: 丢弃 source_labels 的值中没有匹配到 regex 正则表达式内容的 Target 实例
- drop: 丢弃 source_labels 的值中匹配到 regex 正则表达式内容的 Target 实例
- hashmod: 将 target_label 设置为关联的 source_label 的哈希模块
- labelmap: 根据 regex 去匹配 Target 实例所有标签的名称(注意是名称),并且将捕获到的内容作为为新的标签名称,regex 匹配到标签的的值作为新标签的值
- labeldrop: 对 Target 标签进行过滤,会移除匹配过滤条件的所有标签
- labelkeep: 对 Target 标签进行过滤,会移除不匹配过滤条件的所有标签
上面的 relabel_configs 配置作用为丢弃源标签中 __meta_consul_tags 不包含 test 标签的服务,__meta_consul_tags 对应到 Consul 服务中的值为 "tags": ["test"],默认 consul 服务是不带该标签的,从而实现过滤。
下面进行标签自定义,并分组。
向 Meta Data 数据添加自定义标签信息
#vim /home/prometheus/config/consul-0.json { "ID": "node-exporter", "Name": "node-exporter-192.168.31.131", "Tags": [ "test" ], "Address": "192.168.31.131", "Port": 9100, "Meta": { "app": "spring-boot", "team": "appgroup", "project": "bigdata" }, "EnableTagOverride": false, "Check": { "HTTP": "http://192.168.31.131:9100/metrics", "Interval": "10s" }, "Weights": { "Passing": 10, "Warning": 1 } }
注:该 Json 文件为要注册的服务信息,同时往 Meta 信息中添加了 app=spring-boot
,team=appgroup
,project=bigdata
三组标签,目的就是为了方便告警分组使用。
注册服务
curl --request PUT --data @/home/prometheus/config/consul-0.json http://192.168.31.131:8500/v1/agent/service/register?replace-existing-checks=1
更新Prometheus.yml
- job_name: 'consul-prometheus' consul_sd_configs: #基于服务发现类型 - server: '192.168.31.131:8500' #服务地址 relabel_configs: - source_labels: [__meta_consul_tags] regex: .*,test,.* action: keep - regex: __meta_consul_service_metadata_(.+) action: labelmap
将自动发现的服务进行分类
可以通过服务 Tag 来进行匹配来创建不同的类型 exporter 分组,通过给每个服务标记不同的 Tag,然后通过 relabel_configs
来进行匹配区分。
注册服务
$ vim /home/prometheus/config/consul-1.json { "ID": "node-exporter", "Name": "node-exporter-192.168.31.131", "Tags": [ "node-exporter" ], "Address": "192.168.31.131", "Port": 9100, "Meta": { "app": "spring-boot", "team": "appgroup", "project": "bigdata" }, "EnableTagOverride": false, "Check": { "HTTP": "http://192.168.31.131:9100/metrics", "Interval": "10s" }, "Weights": { "Passing": 10, "Warning": 1 } } # 更新注册服务 $ curl --request PUT --data @/home/prometheus/config/consul-1.json http://192.168.31.131:8500/v1/agent/service/register?replace-existing-checks=1 $ vim /home/prometheus/config/consul-2.json { "ID": "cadvisor-exporter", "Name": "cadvisor-exporter-192.168.31.131", "Tags": [ "cadvisor-exporter" ], "Address": "192.168.31.131", "Port": 9080, "Meta": { "app": "docker", "team": "cloudgroup", "project": "docker-service" }, "EnableTagOverride": false, "Check": { "HTTP": "http://192.168.31.131:9080/metrics", "Interval": "10s" }, "Weights": { "Passing": 10, "Warning": 1 } } # 注册服务 $ curl --request PUT --data @/home/prometheus/config/consul-2.json http://192.168.31.131:8500/v1/agent/service/register?replace-existing-checks=1
更新Prometheus.yml
[root@localhost prometheus]# vim /home/prometheus/prometheus.yml #文件发现 - job_name: 'file_ds' #任务名 全局唯一 file_sd_configs: #基于文件发现配置 - files: ['/etc/prometheus/config/*.yml'] #配置文件路径 refresh_interval: 5s #每五秒扫描刷新配置文件 #服务发现 - job_name: 'consul-node-exporter' consul_sd_configs: #基于服务发现类型 - server: '192.168.31.131:8500' #服务地址 services: [] relabel_configs: - source_labels: [__meta_consul_tags] #注意两个横杠"__" regex: .*node-exporter.* #匹配__meta_consul_tags中值包含node-exporter的 action: keep #keep丢弃未匹配到regex中内容的数据 - regex: __meta_consul_service_metadata_(.+) #获取__meta_consul_service_metadata_的值(标签) action: labelmap #将获取的值作为新的标签 - job_name: 'consul-cadvisor-exproter' consul_sd_configs: - server: '192.168.31.131:8500' services: [] relabel_configs: - source_labels: [__meta_consul_tags] regex: .*cadvisor-exporter.* action: keep - regex: __meta_consul_service_metadata_(.+) action: labelmap