У меня есть приложение Spring Boot, которое использует Sentry для отслеживания исключений, и я получаю некоторые ошибки, которые выглядят так:
ClientAbortExceptionorg.apache.catalina.connector.OutputBuffer in realWriteBytes
errorjava.io.IOException: Broken pipe
Я понимаю, что это просто сетевая ошибка, и поэтому я должен вообще игнорировать их. То, что я хочу сделать, это сообщить обо всех других IOExceptions
и ломать ломаные каналы в Librato, чтобы я мог следить за тем, сколько я получаю (шип может означать, что проблема с клиентом, которая также разработана мной на Java):
Я придумал это:
@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();
}
}