SpringBoot 基于 ServletRequestHandledEvent 完成接口耗时调用
在开发 Web 应用时,监控接口的性能是非常重要的。通过记录接口的调用耗时,我们可以及时发现性能瓶颈,优化系统性能。本文将介绍如何在 Spring Boot 应用中使用 ServletRequestHandledEvent 来记录接口的调用耗时。
什么是 ServletRequestHandledEvent?
ServletRequestHandledEvent 是 Spring 框架提供的一个事件,它在每次 HTTP 请求处理完成后被发布。这个事件包含了请求的详细信息,如请求 URL、处理时间等。通过监听这个事件,我们可以获取到请求的处理时间,从而记录接口的调用耗时。
创建事件监听器
java
@Component
@Slf4j
public class RequestTimeEventListener implements ApplicationListener<ServletRequestHandledEvent> {
@Override
public void onApplicationEvent(ServletRequestHandledEvent event) {
Throwable failureCause = event.getFailureCause();
String failureMessage = failureCause == null ? "" : failureCause.getMessage();
if (failureCause != null) {
failureMessage = failureCause.getMessage();
}
String clientAddress = event.getClientAddress();
String requestUrl = event.getRequestUrl();
String method = event.getMethod();
long processingTimeMillis = event.getProcessingTimeMillis();
if (StrUtil.isEmpty(failureMessage)) {
log.info("clientAddress = {} requestUrl = {} method = {} costTime = {}",clientAddress,requestUrl,method,processingTimeMillis);
} else {
log.error("clientAddress = {} requestUrl = {} method = {} costTime = {} error = {}",clientAddress,requestUrl,method,processingTimeMillis,failureMessage);
}
}
}
总结
通过使用 ServletRequestHandledEvent,我们可以非常方便地记录接口的调用耗时。这种方法不仅简单,而且不会对现有代码造成侵入。