【问题标题】:Spring Boot API response timeSpring Boot API 响应时间
【发布时间】:2017-05-16 09:34:33
【问题描述】:

我正在开发 Spring Boot API。

现在是监控部分。我想为它添加监控。所以我使用了执行器,从中获取数据(如 gc、内存等)并将其绘制在 Grafana 上。

现在是 API 的响应时间。 Actuator guage 只返回最后一个 API Hit。所以基本上我如何计算每个 API 的响应时间。我的意思是我应该放在哪里

long startTime = System.currentTimeMillis();

long endTime = System.currentTimeMillis();
long diff = endTime - startTime;

我尝试将它放在控制器、控制器的第一行和控制器的最后一行,但是当我将它与 Guage 进行比较时结果不同。

我应该如何正确测量它?

【问题讨论】:

  • 你要找的是直方图,Spring Boot Acuator 不支持直方图,但是 Spring Boot Actuator 可以与 Dropwizard 的指标库(metrics.dropwizard.io/3.2.2)一起工作,它支持直方图,检查出来吧。
  • 我更好奇的是有什么方法可以手动获取这些数据?每次 API 命中的响应时间?

标签: spring-boot spring-boot-actuator


【解决方案1】:

您可以尝试在DispatcherServlet#service 方法周围有一个“围绕”AOP 建议?

未经测试:

@Aspect
@Component
public class AroundExample {

    @Around("org.springframework.web.servlet.DispatcherServlet.service()")
    public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
        // start stopwatch
        Object retVal = pjp.proceed();
        // stop stopwatch
        return retVal;
    }

}

不要忘记在您的 POM 中添加 aop 启动器:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

这将为您提供整个请求调用的非常接近的时间,包括 Spring 拦截器、处理程序、控制器等所有内容。

【讨论】:

  • public class XYZ { @Around("execution(* org.springframework.web.servlet.DispatcherServlet.service(..))") public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable { // 开始秒表 System.out.println("之前");对象 retVal = pjp.proceed(); // 停止秒表 System.out.println("Me here");返回 retVal; } } 此代码正在执行但不打印任何内容?我错过了什么?
  • “执行,但不打印任何东西”是什么意思?你在调试器中设置了断点吗?
  • 我的意思是没有编译错误,但即使在我放置打印件后,也没有打印任何内容。我的意思是代码正在编译但不打印任何东西
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-10
  • 2020-06-21
  • 2020-12-24
  • 2020-02-24
  • 2019-03-09
  • 2021-12-13
  • 2019-01-07
相关资源
最近更新 更多