我们的项目中有很多 spring boot webflux 服务,几乎所有服务都存在同样的问题。我们使用 prometheus 来获取指标并跟踪请求的成功率。然而,在这些服务中,1% 到 20% 的 http 服务器请求指标包括结果 = UNKNOWN 和异常 = CancelledServerWebExchangeException,而没有其他迹象表明服务器响应存在任何问题或客户端取消了那么多请求。示例:
http_server_requests_seconds_count{exception="CancelledServerWebExchangeException",method="GET",outcome="UNKNOWN",platform="UNKNOWN",status="401",uri="UNKNOWN",} 87.0
http_server_requests_seconds_count{exception="CancelledServerWebExchangeException",method="GET",outcome="UNKNOWN",platform="UNKNOWN",status="200",uri="UNKNOWN",} 110.0
我使用基本的 webflux 应用程序模板和单个控制器通过https://httpd.apache.org/docs/2.4/programs/ab.html轰炸,成功地在本地复现了这一点:ab -n 15000 -c 50 http://localhost:8080/v1/hello
。
我尝试用 netty 替代 tomcat,但不再有这些指标日志。
虽然它似乎不会对生产中运行的服务造成直接问题,但它仍然会影响指标和警报的正确性。我们可以忽略所有未知的结果,但我们无法知道这些未知的结果是否来自实际的服务器/客户端取消或仅仅是这个网络问题。
过去有人遇到过这个问题,但一直没有解决:https://stackoverflow.com/questions/69913027/webflux-cancelledserverwebexchangeexception-appears-in-metrics-for-seemingly-no
使用的版本:SpringBoot: 2.7.2 and SpringBoot: 2.6.2, Kotlin: 1.7.10, JVM: 17