升级Spring Boot2.5后指标频繁出现CancelledServerWebExchangeException问题咨询
CancelledServerWebExchangeException 异常问题说明
异常定义
CancelledServerWebExchangeException 是Spring Framework 5.3版本(Spring Boot 2.5默认依赖的Spring核心版本)新增的WebFlux专属异常,用于标记当前请求对应的ServerWebExchange实例已被取消,无法继续完成后续的请求处理/响应写入逻辑。
频繁触发的原因
- Spring Boot 2.5之前的版本对应Spring核心版本低于5.3,没有该异常的抛出逻辑,因此升级后才会在Prometheus指标中观测到该异常的统计数据
- 该异常的触发场景均为服务端处理请求过程中客户端主动断开连接:包括用户主动关闭页面、压测工具提前终止请求、网关/负载均衡层配置的超时时间短于服务端处理时间主动断连、TCP连接被网络设备重置等
- 你观测到的
status="200"与outcome="UNKNOWN"共存的现象符合异常触发逻辑:当异常抛出时,响应头已经成功写入客户端,所以实际返回状态码为200,响应内容也完整送达;但Micrometer的指标采集逻辑捕获到请求处理链中抛出了未处理的异常,无法匹配正常的请求结果分类,因此标记为UNKNOWN
你提到的示例指标属于典型的触发场景:
http_server_requests_seconds_count{exception="CancelledServerWebExchangeException",method="GET",outcome="UNKNOWN",status="200",uri="/actuator/health"} 137.0
本地复现逻辑说明
使用JMeter多线程压测时,压测线程的TCP连接复用、超时回收逻辑会产生大量提前断开的请求,直接触发该异常的抛出逻辑,和线上高并发场景的触发逻辑完全一致。
优化建议
- 该异常属于正常的网络波动类异常,不会影响正常返回的请求业务逻辑,如果指标占比在可接受范围内无需额外修复
- 如果需要消除指标统计噪音,可以自定义WebFlux全局异常处理器捕获
CancelledServerWebExchangeException不向上抛出,或自定义Micometer的HTTP请求指标标签生成逻辑,过滤该异常的统计
内容的提问来源于stack exchange,提问作者Sergey Volkov
相关产品推荐
相关产品推荐

