如何正确计时用 Java Spring MVC 编写的 API?

Posted

技术标签:

【中文标题】如何正确计时用 Java Spring MVC 编写的 API?【英文标题】:How to properly time profile API written in Java Spring MVC? 【发布时间】:2018-11-08 14:08:36 【问题描述】:

输入:我的 API 会随着时间的推移而变慢我想找到一种方法来分析每个端点的时间和内存。

输出:每个端点在阶段/生产环境中经过一定时间后的统计数据,以制作数据集以进一步调试慢速案例并可能在发生时触发消息/警报。

问题:有没有什么好的监视器、负载测试框架,可以很容易地插入 Spring MVC 应用程序,我可以从它开始?

因为,到目前为止,我还没有找到任何好的解决方案。我尝试使用hibernate.statistics 跟踪数据库时间以及使用 Apache StopWatch 类进行手动时间跟踪。它可以工作,但这种解决方案的可维护性不是很好,并且有其局限性。

【问题讨论】:

【参考方案1】:

您可以使用 Spring AOP 做到这一点。使用方面来存储一些数据@Before@After@Around 你的方法。

您可以添加自定义注释:

@Retention(RetentionPolicy.RUNTIME)
public @interface Profiling 
   String value();

创建一个方面:

@Aspect
public class ProfilingAspect
    //for any method with @Profiling, no matter what the return type, name, or arguments are, call this method 
    @Around("execution(@foo.bar.packagename.Profiling * *(..)) && @annotation(profilingAnnotation)")
    public Object logDuration(ProceedingJoinPoint joinPoint, Profiling profilingAnnotation) throws Throwable 

        //capture the start time 
        long startTime = System.currentTimeMillis();

        //execute the method and get the result
        Object result = joinPoint.proceed();

        //capture the end time
        long endTime = System.currentTimeMillis();

        //calculate the duration and save it somewhere
        long duration = endTime - startTime;
        logger.info(profilingAnnotation.value()+": "+duration+"ms"); 

        //return the result to the caller
        return result; 
    


@Profiling注释你的方法:

@Controller
public class HelloController
     @RequestMapping("/api/example/hello")
     @Profiling("Hello World") 
     public @ResponseBody String getHelloWorld()
          try 
              Thread.sleep(1000);
           catch (InterruptedException e) 
              throw new RuntimeException("Sleep Interrupted", e);
           
          return "Hello World";
      


当被调用的方法将记录类似:Hello World: 1007ms

【讨论】:

在您的示例中LogDuration 是什么? @DmytroChasovskyi 好吧,这只是一个错字。其实应该是Profiling 我无法将它注入到我当前的代码库中。因此,我会尽快对其进行评论并提供更多详细信息。

以上是关于如何正确计时用 Java Spring MVC 编写的 API?的主要内容,如果未能解决你的问题,请参考以下文章

如何正确编写“重定向”(Spring MVC + Security)

Spring和MVC正确的项目结构

Spring MVC方法参数注入

JAVA spring MVC 前台如何取得后台返回的map类型的数据?

如何正确实现使用 Spring MVC\Boot 返回图像列表的 REST 服务?

用Java+xml配置方式实现Spring数据事务(编程式事务)