避免在 Spring Boot 应用程序中向 Sentry 报告“管道断裂”错误
2022-09-04 03:48:51
我有一个Spring Boot应用程序,它使用Sentry进行异常跟踪,我收到一些如下所示的错误:
ClientAbortExceptionorg.apache.catalina.connector.OutputBuffer in realWriteBytes
errorjava.io.IOException: Broken pipe
我的理解是,这只是一个网络错误,因此我通常应该忽略它们。我想做的是向Librato报告所有其他管道并记录损坏的管道,这样我就可以密切关注我得到的数量(峰值可能意味着客户端存在问题,这也是我用Java开发的):IOExceptions
我想出了这个:
@ControllerAdvice
@Priority(1)
@Order(1)
public class RestExceptionHandler {
@ExceptionHandler(ClientAbortException.class)
@ResponseStatus(HttpStatus.SERVICE_UNAVAILABLE)
public ResponseEntity<?> handleClientAbortException(ClientAbortException ex, HttpServletRequest request) {
Throwable rootCause = ex;
while (ex.getCause() != null) {
rootCause = ex.getCause();
}
if (rootCause.getMessage().contains("Broken pipe")) {
logger.info("count#broken_pipe=1");
} else {
Sentry.getStoredClient().sendException(ex);
}
return null;
}
}
这是处理这个问题的可接受的方法吗?
我以这种方式按照文档配置了Sentry:
@Configuration
public class FactoryBeanAppConfig {
@Bean
public HandlerExceptionResolver sentryExceptionResolver() {
return new SentryExceptionResolver();
}
@Bean
public ServletContextInitializer sentryServletContextInitializer() {
return new SentryServletContextInitializer();
}
}