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
就会动态发现consul
的Service
这里使用了relabel_configs
,用法可以参考:https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_configs
意思是过滤,只有service
的tag
为prometheus-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
启动后查看Prometheus
和consul
界面,可以看到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
还可以使用各语言版本的sdk
:https://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);
}
}
版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/03/25/prometheus-dynamically-modifies-targets-access-through-consul/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论