我有一个javaspringbootapi(swagger),每天都有成千上万的调用。我想记录这些方法的执行时间以进行分析。我使用springaop(aspect-oriented programming)创建了一个简单的接口和具体的类,它允许我用@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注解的端点时,什么也没有发生。这就像注解打破了招摇过市的codegen之类的东西,所以我不得不在customersservice.getcustomers()方法上粘贴注解。可以接受吗?我想我需要从控制器第一次被击中的时候开始计时执行,但是正如我所说的,我不能这样做,除非我犯了一些愚蠢的错误,所以我不得不把它放在控制器调用的下一个方法上。这是否使我的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 {
}
暂无答案!
目前还没有任何答案,快来回答吧!