目 录CONTENT

文章目录

Spring Boot 实战:通过 Agent 统计接口调用耗时

在等晚風吹
2024-11-11 / 0 评论 / 0 点赞 / 40 阅读 / 0 字 / 正在检测是否收录...

性能统计--借助 Agent 统计接口调用时间

引言

随着微服务架构的广泛应用,对 API 性能进行监控变得越来越关键。对于 Spring Boot 应用而言,记录接口的调用耗时不仅能优化系统性能,还可帮助迅速定位问题。接口响应时间直接关系到用户体验和系统的整体性能。通过分析和记录接口耗时数据,我们可以识别出性能瓶颈点,采取针对性的优化措施,并生成统计报表来实时监控接口的健康状况。

Agent 概述

在 Spring Boot 中,有多种方式可以实现接口调用耗时的统计。一个方法是使用 Agent。Agent 是一种可以插入到 JVM 中的工具,用于监控和采集应用在运行时的各种信息,比如接口调用时间。尽管在 Spring Boot 中,使用 Actuator、AOP 和过滤器的方式更为普遍和简单,但本文将重点介绍如何借助 Agent 进行接口耗时统计,同时简要介绍 Actuator 和其他方法,以便进行对比和参考。

Spring Boot Actuator

Spring Boot 提供的 Actuator 模块可以进行自我检查和监控,功能涵盖健康检查、指标采集、HTTP 跟踪等。借助 Actuator,能够快速采集应用内部数据,并支持将这些数据通过 HTTP 或 JMX 暴露出去,且能与第三方监控系统(例如 Prometheus)集成。尽管 Actuator 严格意义上不是 Agent,但它提供了轻量级的监控功能,并且与 Spring Boot 生态系统紧密相连。

实现思路

1. 使用 AOP 实现接口调用时间统计

AOP(面向切面编程)是一种编程方式,可以将日志记录、事务管理等横切关注点从业务逻辑代码中分离出来。在 Spring Boot 中,可以借助 AOP 拦截接口调用,统计和记录其执行时间。

实现步骤:

  • 添加依赖:在 pom.xml 中添加 AOP 的相关依赖项。

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    
  • 定义切面类:创建一个切面类,并通过 @Around 注解拦截接口请求方法。

    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.springframework.stereotype.Component;
    
    @Component
    @Aspect
    public class PerformanceAspect {
    
        @Around("execution(* com.example.demo.controller.*.*(..))")
        public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
            long start = System.currentTimeMillis();
            Object result = joinPoint.proceed();
            long executionTime = System.currentTimeMillis() - start;
            System.out.println("方法: " + joinPoint.getSignature() + " 耗时: " + executionTime + " 毫秒");
            return result;
        }
    }
    
  • 创建测试接口:定义一个简单的 REST 控制器,以测试耗时统计效果。

    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class TestController {
    
        @GetMapping("/test")
        public String test() throws InterruptedException {
            // 模拟耗时操作
            Thread.sleep(200);
            return "测试成功";
        }
    }
    

访问 /test 接口时,控制台会输出该接口的执行时间。

2. 使用 Spring Boot Actuator

虽然 Actuator 不是 Agent,但它具有丰富的监控功能,并支持与其他监控系统集成,是监控 Spring Boot 应用的理想选择。

实现步骤:

  • 引入依赖:在 pom.xml 中添加 Actuator 依赖。

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    
  • 访问端点:添加依赖后启动服务,通过请求访问 http://localhost:9099/actuator 端点查看暴露的接口。

  • 配置端点:在 application.yml 中配置需要暴露的端点。

    management:
      endpoints:
        web:
          exposure:
            include: '*'
      endpoint:
        health:
          show-details: always
    

3. 使用过滤器实现接口调用时间统计

另一种实现方式是创建自定义过滤器来记录接口请求的耗时信息。

实现步骤:

  • 定义过滤器类:实现 javax.servlet.Filter 接口。

    import javax.servlet.*;
    import javax.servlet.http.HttpServletRequest;
    import java.io.IOException;
    
    @Slf4j
    @WebFilter(filterName = "ApiAccessFilter", urlPatterns = "/*")
    public class ApiAccessFilter implements Filter {
    
        @Override
        public void init(FilterConfig filterConfig) {
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            HttpServletRequest request = (HttpServletRequest) servletRequest;
            long start = System.currentTimeMillis();
            log.info("[Api Access] start. uri: {}, method: {}, client: {}", request.getRequestURI(), request.getMethod(), getClientIp(request));
            filterChain.doFilter(servletRequest, servletResponse);
            log.info("[Api Access] end. duration: {}ms", System.currentTimeMillis() - start);
        }
    
        @Override
        public void destroy() {
        }
    
        private String getClientIp(HttpServletRequest request) {
            // 获取客户端IP地址的逻辑
        }
    }
    
  • 启用过滤器:在启动类中通过 @ServletComponentScan 注解指明要启用的过滤器。

    @SpringBootApplication
    @ServletComponentScan("com.example.demo")
    public class DemoApplication {
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    }
    

总结

在 Spring Boot 中,可以通过 AOP、Actuator 或自定义过滤器等多种方式实现接口调用耗时的统计和性能监控。AOP 提供了灵活、非侵入式的拦截方式来记录接口耗时,Actuator 则具备全面的监控功能并可集成第三方监控系统。自定义过滤器能够提供更细粒度的监控,适用于特定需求的场景。开发者可根据具体需求和项目特性选择适合的实现方法。

0

评论区