Prometheus通过Consul动态修改Targets接入

静态配置

通常Prometheus要增加一个target,需要在配置文件中已添加一个job,例如下:

- job_name: 'prometheus'
  static_configs:
    - targets: ['localhost:9090']

每次修改需要直接修改服务器上的配置文件,非常麻烦。Prometheus提供了多种动态服务发现的功能,这里使用Consul来做一个例子。

在Prometheus配置文件中配置consul

- job_name: 'consul-prometheus'
  consul_sd_configs:
  #consul 地址
    - server: 'xx.xx.xx.xx:8500'
      services: []
  relabel_configs:
    - source_labels: [__meta_consul_tags]
      regex: .*prometheus-target.*
      action: keep

配置这个之后,Prometheus就会动态发现consulService
这里使用了relabel_configs,用法可以参考:https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_configs
意思是过滤,只有servicetagprometheus-target的动态发现
随后我们只要在consul修改Service即可

consul中注册服务

consul注册注册service的方式有多种,如果静态注册,创建文件夹consul.d,添加如下test.json

{
  "service":{
    "id": "node",
    "name": "prometheus-node",
    "address": "127.0.0.1",
    "port": 9100,
    "tags": ["prometheus-target"],
    "checks": [
        {
            "http": "http://127.0.0.1:9100/metrics",
            "interval": "15s"
        }
    ]
  }
}

consul启动命令中,指定配置路径

-config-dir=consul.d

启动后查看Prometheusconsul界面,可以看到target是否引入。

也可以使用Http Api的方式

curl -X PUT -d '{"service":{"id":"node","name":"prometheus-node","address":"127.0.0.1","port":9100,"tags":["prometheus-target"],"checks":[{"http":"http://127.0.0.1:9100/metrics","interval":"15s"}]}}' http://127.0.0.1:8500/v1/agent/service/register

还可以使用各语言版本的sdkhttps://www.consul.io/api/libraries-and-sdks.html

这里使用Java版本的

<!-- https://mvnrepository.com/artifact/com.orbitz.consul/consul-client -->
<dependency>
    <groupId>com.orbitz.consul</groupId>
    <artifactId>consul-client</artifactId>
    <version>1.4.2</version>
</dependency>

使用如下:

public class ConsulTest {
    Consul client;

    /**
     * 初始化.
     */
    @Before
    public void init() {
        client = Consul.builder().withHostAndPort(HostAndPort.fromParts("xx.xx.xx.xx", 8500)).build();
        //catalogClient = client.catalogClient();
    }

    @Test
    public void queryAll() {
        Map<String, Service> services = client.agentClient().getServices();
        for (Map.Entry<String, Service> entry : services.entrySet()) {
            System.out.println("key:" + entry.getKey());
            System.out.println("value:" + entry.getValue().toString());
        }
    }

    @Test
    public void testDelete() {
        client.agentClient().deregister("etcd");
    }

    @Test
    public void testAdd() {
        String serviceName = "prometheus-etcd";
        String serviceId = "etcd";
        Registration.RegCheck single = Registration.RegCheck.http("http://127.0.0.1:2379/metrics", 20);
        Registration reg = ImmutableRegistration.builder()
                .check(single)
                .addTags("prometheus-target")
                .address("127.0.0.1")
                .port(2379)
                .name(serviceName)
                .id(serviceId)
                .build();
        client.agentClient().register(reg);
    }
}
上一篇 Prometheus使用Consul实现自动服务发现
下一篇 Prometheus动态发现监控targets —— 基于文件的服务发现
目录
文章列表
1 Android自定义广播设置只能由指定的APP接收
Android自定义广播设置只能由指定的APP接收
2
银行卡CardBin查询相关网站
银行卡CardBin查询相关网站
3
Android接入Firebase推送不执行onMessageReceived方法
Android接入Firebase推送不执行onMessageReceived方法
4
微信小程序通过WXS实现共享filter过滤器
微信小程序通过WXS实现共享filter过滤器
5
Java认证与Shiro安全框架
Java认证与Shiro安全框架
最新评论
一位WordPress评论者
一位WordPress评论者
2月12日
您好,这是一条评论。若需要审核、编辑或删除评论,请访问仪表盘的评论界面。评论者头像来自 Gravatar。