阿汤博客-承接中小企业服务器维护和网站维护,有意者可以联系博主!

prometheus报错Error refreshing service Unexpected response code: 503解决办法

运维问题 99℃ 0评论

今天终于把这个搁置了几个月没有解决的问题解决了,真的是找遍了Google、百度文档,没有找到一个解决方案,这里分享一下解决办法。

公司项目使用的是spring cloud,注册中心使用的Eureka,监控方面经过一番的调研,最终选择了对微服务监控比较方便的prometheus,由于服务较多,就考虑了服务自发现,经过一番的摸索,发现eureka-consul-adapter依赖可以适配prometheus的consul_sd_config配置。

prometheus整个部署过程虽然遇到的问题不少,但是网上文档也比较多,都一一解决了。监控起初,并没有什么异常,grafana各类监控显示也正常,突然有一天发现服务器根目录快满了,于是去排查了下,发现是docker的问题(prometheus用的docker部署的),再进一步排查,发现是prometheus这个容器日志占用了大量的磁盘容量,docker tail -f 看了下,发现全是类似下面的报错:

prometheus      | level=error ts=2019-11-20T09:54:18.313Z caller=consul.go:477 component="discovery manager scrape" discovery=consul msg="Error refreshing service" service=serviceA tags="unsupported value type" err="Unexpected response code: 503 ({\"timestamp\":1574243658309,\"status\":503,\"error\":\"Service Unavailable\",\"exception\":\"org.springframework.web.context.request.async.AsyncRequestTimeoutException\",\"message\":\"No message available\",\"path\":\"/v1/catalog/service/serviceA \"})"

prometheus      | level=error ts=2019-11-20T09:54:25.314Z caller=consul.go:477 component="discovery manager scrape" discovery=consul msg="Error refreshing service" service=serviceB tags="unsupported value type" err="Unexpected response code: 503 ({\"timestamp\":1574243665310,\"status\":503,\"error\":\"Service Unavailable\",\"exception\":\"org.springframework.web.context.request.async.AsyncRequestTimeoutException\",\"message\":\"No message available\",\"path\":\"/v1/catalog/service/serviceB\"})"

prometheus      | level=error ts=2019-11-20T09:54:25.314Z caller=consul.go:477 component="discovery manager scrape" discovery=consul msg="Error refreshing service" service=serviceC tags="unsupported value type" err="Unexpected response code: 503 ({\"timestamp\":1574243665310,\"status\":503,\"error\":\"Service Unavailable\",\"exception\":\"org.springframework.web.context.request.async.AsyncRequestTimeoutException\",\"message\":\"No message available\",\"path\":\"/v1/catalog/service/serviceC\"})"

然后马上根据报错信息访问了下/v1/catalog/service/serviceC地址,可以正常访问。

prometheus报错Error refreshing service Unexpected response code: 503解决办法

然后又去Google了下相关报错,尽然只有几篇相关的文章,还有是重复了,一下就不知所措了,然后去prometheus 技术群请教了一些大神,不过很遗憾,都没有人遇到过类似的问题,然后去github看了下prometheus consul.go的源代码,也就是正常访问consul接口返回的报错,虽然使用的是eureka-consul-adapter依赖去适配的,但是consul接口访问都是正常的,前前后后研究了一周,实在没有找到解决方案。

于是只能从其他方面去解决,首先把docker目录迁移到了数据盘,然后给docker日志做了大小限制,虽然一直报错,但是现在不会对磁盘空间造成影响,然后就把这个问题方下了。

过了两个月左右,也就是最近在部署elasticsearch的时候,无意间又发现了prometheus容器一直报错,以为出什么问题了(把之前没处理的事情搞忘记了),然后又去排查原因,找了半天还是和之前一样没有结果,这时突然想起之前prometheus技术群里,有人说这个报错,应该是java端抛出来的,于是仔细一看日志内容果然有个java的报错:

org.springframework.web.context.request.async.AsyncRequestTimeoutException

大概意思就是,异步请求超时,然后马上去项目里面找了下看有没有async的相关设置,很遗憾项目并没有使用async。

又分析了下,由于prometheus是去请求的consul接口,应该是eureka server 的问题,此时慢慢思路才清醒起来,再一分析,eureka主要就引用了eureka-consul-adapter依赖,只有看一下eureka-consul-adapter.jar的代码内容就知道的,马上通过反编译工具把下载到本地eureka-consul-adapter.jar包打开一看,果然有相关的引用。

prometheus报错Error refreshing service Unexpected response code: 503解决办法

于是马上搜索了下springboot 关于async的超时时间的设置,根据建议在eureka server的配置文件添加了spring.mvc.async.request-timeout=-1,马上发布测试,果然就没有了报错。

现在再回头去看,其实一开始问题方向就错了,一直在prometheus方面找问题,其实问题根本就在eureka server,现在再去看grafana eureka的监控视图,http请求,一直持续的有http-5xx错误,而url正是prometheus错误日志的path,而这些异常一开始并没有引起我的注意。

prometheus报错Error refreshing service Unexpected response code: 503解决办法

prometheus报错Error refreshing service Unexpected response code: 503解决办法

虽然已经没有超时报错,但还是需要观察几天,这个设置是否对性能和服务是否有影响。

转载请注明:阿汤博客 » prometheus报错Error refreshing service Unexpected response code: 503解决办法

喜欢 (0)or分享 (0)