前言
在Spring框架中,监控接口请求的性能可以通过ServletRequestHandledEvent事件实现。这种方法简单有效,能够帮助开发者实时跟踪和分析请求的性能。
它在请求处理完成后发布,包含了请求的详细信息,如客户端地址、请求URL、请求方法和处理时间。使用这个事件可以轻松地监控和记录每个请求的性能数据。
实现步骤
创建监听器类
@Component
public class TimeCountListener implements ApplicationListener<ServletRequestHandledEvent> {
@Override
public void onApplicationEvent(ServletRequestHandledEvent event) {
Throwable failureCause = event.getFailureCause();
if (failureCause != null) {
System.err.printf("错误原因: %s%n", failureCause.getMessage());
}
System.err.println("========================================");
System.err.printf("请求客户端地址:%s\n请求URL: %s\n请求Method: %s\n请求耗时: %d毫秒%n",
event.getClientAddress(),
event.getRequestUrl(),
event.getMethod(),
event.getProcessingTimeMillis());
System.err.println("========================================");
}
}
优点:
- 简单易用:无需对业务代码进行侵入式修改,只需创建监听器类。
- 准确性高:Spring会在请求处理完成后发布事件,记录的时间较为准确。
- 低侵入性:与业务逻辑代码解耦,易于维护和扩展。
缺点:
- 性能开销:尽管开销较小,但记录和处理事件仍然会增加系统的负担。
- 事件丢失:在高并发或系统异常情况下,事件可能会丢失或记录不全。
其他方案
自定义拦截器可以用来在请求处理的不同阶段(如请求前、请求后、请求完成后)添加额外的逻辑。
public class PerformanceInterceptor implements HandlerInterceptor {
private static final Logger logger = LoggerFactory.getLogger(PerformanceInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
request.setAttribute("startTime", System.currentTimeMillis());
returntrue;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
long startTime = (Long) request.getAttribute("startTime");
long endTime = System.currentTimeMillis();
long executeTime = endTime - startTime;
logger.info("请求URL: {},耗时: {} ms", request.getRequestURI(), executeTime);
}
}