如何正确计时用 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)
JAVA spring MVC 前台如何取得后台返回的map类型的数据?