consul 日志配置_使用consul做prometheus服务发现的问题修复

本文介绍了在Prometheus使用Consul进行服务发现时遇到的超时问题,通过日志分析发现是由于Consul API的watchTimeout和Haproxy超时设置不匹配导致的。解决方案是调整Haproxy的超时时间,从而确保长轮训机制能正常工作,减少不必要的资源消耗并保持服务发现的实时性。
摘要由CSDN通过智能技术生成

测试环境上是一个三节点consul集群,使用haproxy代理,prometheus配置该集群用来服务发现

今天查看prometheus系统日志发现如下报错

Nov 24 15:59:56 localhost prometheus[71048]: level=error ts=2020-11-24T07:59:56.891Z caller=consul.go:484 component="discovery manager scrape" discovery=consul msg="Error refreshing service" service=service-name tags="unsupported value type" err="Get http://xxxx:xx/v1/catalog/service/service-name?index=20653&stale=&wait=30000ms: EOF"

首先调用这个consul的api,确实是EOF,然后记录下报错的频率,严格的30s一次。

之后查看日志中提示的consul.go:484,如下代码:

36c1bfe7424a2b53b6316bd36b09ee7d.png

怀疑是index版本的问题,降低index调用api,正常调用,同时看到watchTimeout为30s。

排除prometheus问题,之后绕过haproxy,调用consul的api,显示正常

58ebe9d711cea10d05cf20e1b6117e5c.png

同时注意到,lastindex的返回要比历史版本的慢很多,怀疑是haproxy的超时问题,发现haproxy超时时间只有10s。

修改haproxy的超时时间为60s后,一切正常。

为什么最新版本的数据要等到watchTimeout后返回呢?

consul会尝试等待被请求资源发生变化,如果在wait指定的时间内1) 对于历史版本数据,被请求资源发生变化, 请求直接返回新的X-Consul-Index和新的body体2) 最新版本的数据,被请求资源未发生变化,则请求会一直阻塞,直到wait指定的时间耗尽,请求最终会返回。只是此时X-Consul-Index不发生变化,body体不变。长轮训减少了频繁轮训的所造成的不必要的带宽和服务器资源开销,用在服务发现上,即时性也能有所保证,还是很合适的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值