使用 Spring AOP 统计接口耗时

Spring AOP 可以方便地对方法进行拦截,适合统计接口耗时。定义一个切面类,在方法执行前后记录时间差。

@Aspect
@Component
public class TimeCostAspect {
    @Around("execution(* com.example.controller.*.*(..))")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();
        Object result = joinPoint.proceed();
        long end = System.currentTimeMillis();
        System.out.println("Method " + joinPoint.getSignature().getName() + " cost: " + (end - start) + "ms");
        return result;
    }
}

使用 Filter 统计接口耗时

Filter 可以拦截所有请求,适合统计整个请求链路的耗时。在 doFilter 方法中记录请求开始和结束时间。

@Component
public class TimeCostFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        long start = System.currentTimeMillis();
        chain.doFilter(request, response);
        long end = System.currentTimeMillis();
        System.out.println("Request cost: " + (end - start) + "ms");
    }
}

使用 Interceptor 统计接口耗时

Interceptor 可以拦截 Controller 层的请求,适合统计接口耗时。在 preHandle 和 afterCompletion 方法中记录时间。

@Component
public class TimeCostInterceptor implements HandlerInterceptor {
    private ThreadLocal<Long> startTime = new ThreadLocal<>();

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        startTime.set(System.currentTimeMillis());
        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        long end = System.currentTimeMillis();
        System.out.println("Request cost: " + (end - startTime.get()) + "ms");
    }
}

使用 Actuator 监控接口耗时

Spring Boot Actuator 提供了丰富的监控端点,可以查看接口的耗时情况。配置 management.endpoints.web.exposure.include=metrics 后,访问 /actuator/metrics/http.server.requests 可以查看接口耗时统计信息。

使用 Micrometer 统计接口耗时

Micrometer 是一个监控指标库,可以与多种监控系统集成。配置 Micrometer 后,可以统计接口耗时并导出到 Prometheus 等监控系统。

@RestController
public class DemoController {
    private final Timer timer;

    public DemoController(MeterRegistry registry) {
        this.timer = registry.timer("demo.controller.timer");
    }

    @GetMapping("/demo")
    public String demo() {
        return timer.record(() -> {
            // 业务逻辑
            return "Hello World";
        });
    }
}

使用日志框架统计接口耗时

在 Controller 方法中手动记录开始和结束时间,并通过日志框架输出耗时信息。

@RestController
public class DemoController {
    private static final Logger logger = LoggerFactory.getLogger(DemoController.class);

    @GetMapping("/demo")
    public String demo() {
        long start = System.currentTimeMillis();
        // 业务逻辑
        long end = System.currentTimeMillis();
        logger.info("Method demo cost: {}ms", end - start);
        return "Hello World";
    }
}

使用 Spring Boot 的 StopWatch 统计接口耗时

Spring 提供了 StopWatch 工具类,可以方便地统计代码块的耗时。

@RestController
public class DemoController {
    @GetMapping("/demo")
    public String demo() {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        // 业务逻辑
        stopWatch.stop();
        System.out.println("Method demo cost: " + stopWatch.getTotalTimeMillis() + "ms");
        return "Hello World";
    }
}

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐