简介

prometheus支持从consul发现监控目标。

安装consul

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
sudo yum -y install consul

配置consul

vim /etc/consul.d/consul.hcl

可以根据自己的需要进行配置,如果只是本地访问的话,只需要监听127.0.0.1就可以了。然后就可以启动服务了

systemctl enable consul
systemctl start consul

consul测试导入数据

package main

import (
	"log"
	"strconv"

	"github.com/hashicorp/consul/api"
)

type Server struct {
	ID       int
	IP       string
	MetaTags map[string]string
}

func main() {
	config := api.DefaultConfig()
	config.Address = "127.0.0.1:8500"
	config.Token = ""
	client, err := api.NewClient(config)
	if err != nil {
		return
	}
	servers := []Server{
		{ID: 1, IP: "192.168.122.100", MetaTags: map[string]string{"idc": "idc1", "use_for": "testing1"}},
		{ID: 2, IP: "192.168.122.101", MetaTags: map[string]string{"idc": "idc1", "use_for": "testing2"}},
		{ID: 3, IP: "192.168.122.102", MetaTags: map[string]string{"idc": "idc1", "use_for": "testing3"}},
	}
	for i := range servers {
		err = client.Agent().ServiceRegister(&api.AgentServiceRegistration{
			ID:      strconv.Itoa(servers[i].ID),
			Name:    servers[i].IP,
			Port:    9100,
			Address: servers[i].IP,
			Meta:    servers[i].MetaTags,
			Check:   nil,
			Checks:  nil,
		})
		if err != nil {
			log.Println(err)
		}
	}
	log.Println("End...")
}

prometheus配置添加配置

在重新标记标签的时候,提供以下数据元标签:

  • __meta_consul_address:目标地址
  • __meta_consul_dc:目标的数据中心名称
  • __meta_consul_health:服务的健康状况
  • __meta_consul_metadata_<key>:目标的每个节点数据元的key
  • __meta_consul_node:为consul的节点名称
  • __meta_consul_service_address:目标的服务地址
  • __meta_consul_service_id:目标的服务ID
  • __meta_consul_service_metadata_<key>:目标的每个服务数据元的key
  • __meta_consul_service_port:目标的服务端口
  • __meta_consul_service:目标所属的服务名称
  • __meta_consul_tagged_address_<key>:每个节点标记目标的关键值
  • __meta_consul_tags:标签根据分隔符拼接的结果,默认分隔符是,
...
- job_name: 'node_exporter'
    consul_sd_configs:
    # consule 地址
    - server: '127.0.0.1:8500'
      services: []
    relabel_configs:
      # 通过元数据标签过滤需要的数据
      - source_labels: [__meta_consul_service_metadata_IDC]
        # 如果匹配
        regex: idc1
        # 执行动作,keep表示如果不匹配就丢弃数据
        action: keep
      # 通过元数据贴标签
      - regex: __meta_consul_service_metadata_(.+)
        action: labelmap
...

添加配置之后,就可以reload一下prometheus服务,就可以在target页面获取到我们需要的监控目标了。

总结

prometheus使用consul作为服务配置发现比较灵活,可以跨机器进行部署,也发便cmdb下发配置。