【问题标题】:Tracking response times of API calls in springboot在 Spring Boot 中跟踪 API 调用的响应时间
【发布时间】:2018-04-10 06:42:19
【问题描述】:

我希望跟踪 API 调用的响应时间。 然后,我想在图表上绘制调用(GET、PUT、POST DELETE)的响应时间,以比较时间差异。

这是我目前正在做的查找 GET 调用的响应时间,但我不太确定它是否正确。

@RequestMapping(value="/Students", method = RequestMethod.GET)
    public ResponseEntity<List<Students>> getStudents()
    {
        long beginTime = System.currentTimeMillis();
        List<Students> students =  (List<Students>) repository.findAll();
        if(students.isEmpty())
        {
            return new ResponseEntity(HttpStatus.NO_CONTENT);
        }
        long responseTime = System.currentTimeMillis() - beginTime;
        logger.info("Response time for the call was "+responseTime);
        return new ResponseEntity(students, HttpStatus.OK);
    }

我相信我在实际将数据返回给客户端之前返回响应时间,这是重点,但我无法将它放在 return 语句之后,因为它是无法访问的代码。

有没有更好的方法来尝试跟踪通话时间?

【问题讨论】:

  • 使用 Spring Boot Actuator,它将为此记录指标。您可以将其流式传输到 Grafana 之类的内容(当然还有其他选项)。
  • 嗨@M.Deinum,感谢您的回复。从春天导出指标的最佳方法是什么,以便我可以在 grafana 上对其进行可视化?我无法将其导出到 influxdb 中,我不确定这是否是最好的方法
  • 看看 Spring Boot 提供的一个导出器(也可以查看reference guide。)

标签: spring api


【解决方案1】:

您可以使用springboot的Around Advice,并在advice中记录时间。它的工作方式是一旦对控制器进行调用,Around Advice 就会拦截它并启动一个计时器(记录所用时间)。根据建议,我们使用jointPoint.proceed() 方法进入主控制器。一旦控制器返回值,您就可以记录计时器值。返回对象。

这里是示例代码:

在 build.grale 中包含

 compile("org.aspectj:aspectjweaver:1.8.8")

创建一个组件类并放置@Aspect

@Component
@Aspect
public class advice{

@Around(("@annotation(logger)")
   public Object loggerAspect(ProceedingJoinPoint joinPoint){
    // start the Timer
    Object object = jointPoint.proceed();
    // log the timer value
    return object;
  }
}

在控制器方法中添加注解@logger。你已准备好出发。

希望这会有所帮助。

你可以参考link以获得完整的解释。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    相关资源
    最近更新 更多