Skip to content

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,我们可以非常方便地记录接口的调用耗时。这种方法不仅简单,而且不会对现有代码造成侵入。

Released under the MIT License.