在 REST API 中跟踪方法执行时间的最有效方法? Java Spring Boot 应用,Swagger

问题描述

我有一个 Java Spring Boot API (Swagger),我每天都会对其进行数千次调用。我想记录这些方法的执行时间以进行分析。我使用 Spring AOP(面向方面​​的编程)制作了一个简单的接口和具体的类,允许我使用 @TrackExecutionTime 注释我的方法以查看运行时。我已经在下面列出了代码。我的问题是,在日志中,我正在跟踪方法调用次数,但是我有数千个请求,所以我需要一种“标记”每个 api 调用并记录它的方法,这样我就可以跟踪每个 api 调用的流程.我正在考虑生成一个随机 # 或者这里有人有更好的建议。所以日志目前看起来像这样: "com.mypackage.myclassname.mymethodname. Time taken for Execution is : 100ms"

另外,我的第一个 RestController 使用 Swagger,所以我尝试用我的 @TrackTimeExecution 注释该方法,但我们使用的是 swagger-codegen-maven 插件,所以它读取 swagger 定义的 yaml 文件并在编译时生成“CustomerApi”和其他类/接口。当我尝试在下面的类级别进行注释时,Spring Boot 应用程序会编译,但是当我在端口 8080 上本地运行该应用程序并尝试访问我用 Postman 注释的端点时,什么也没有发生。这就像注释破坏了 swagger codegen 或其他东西,所以我不得不将注释粘贴到 customeRSService.getCustomers() 方法上。这是可以接受的吗?我想我需要从控制器第一次被击中开始计时,但正如我所说,除非我犯了一些愚蠢的错误,否则我不能这样做,所以我不得不把它放在 上控制器调用的 next 方法。这是否会使我的 api 调用时间不准确,因为我需要在应用程序首次收到控制器请求时计时?喜欢这里的任何输入...

我的一个端点的愚蠢实现,基本相同:

@RestController
@TrackExecutionTime // this fails to compile
public class CustomerApiController implements CustomerApi {
    @Autowired
    public CustomerApiController(ObjectMapper objectMapper,HttpServletRequest request) {
        this.objectMapper = objectMapper;
        this.request = request;
}

public ResponseEntity<List<Customer>> searchCustomer() {
    return new ResponseEntity<List<Customer>>(this.customerService.getCustomers(),HttpStatus.OK);

记录任何用“@TrackExecutionTime”注释的方法的执行时间的

@Aspect
@Component
@Slf4j
@ConditionalOnExpression("${aspect.enabled:true}")
public class ExecutionTimeAdvice {

    @Around("@annotation(com.mailshine.springboot.aop.aspectj.advise.TrackExecutionTime)")
    public Object executionTime(ProceedingJoinPoint point) throws Throwable {
        long startTime = System.currentTimeMillis();
        Object object = point.proceed();
        long endtime = System.currentTimeMillis();
        log.info("Class Name: "+ point.getSignature().getDeclaringTypeName() +". Method Name: "+ point.getSignature().getName() + ". Time taken for Execution is : " + (endtime-startTime) +"ms");
        return object;
    }
}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TrackExecutionTime {
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)