Springboot中除了AOP之外还有什么有效的方式来记录执行时间?

问题描述 投票:0回答:1

我计划记录 REST API 的所有方法的执行时间。为此,我使用了 AOP,如下所示:

    @Aspect
    @Component
    @Slf4j
    @ConditionalOnExpression("${aspect.enabled:true}")
    public class ExecutionTimeAdvice {
    
        @Around("@annotation(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;
        }
    }

@Service
public class MessageService {

    @TrackExecutionTime
    @Override
    public List<AlbumEntity> getMessage() {
      return "Hello message";
    }
    
}

TrackExecutionTime.java
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TrackExecutionTime {
}

pom.xml:
=======

    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    

但是使用 AOP 会带来性能开销。服务响应时间存在200ms以上的滞后。因此会产生性能开销。

任何人都可以建议我实现执行时间日志记录的最有效方法吗? 我可以使用 AspectJ 来提高效率吗?或者有什么AOP的替代方案吗? 或者我们可以高效地使用 AOP 吗?

spring-boot logging aspectj spring-aop execution-time
1个回答
0
投票

如果您包含 Micrometer、Prometheus 和 Spring Boot Actuator,您可能会减少 200+ms 的开销。我的猜测是 200+ms 的开销是由于日志记录造成的。 这篇文章很好地描述了如何使用

@Timed
注释来测量公共方法的执行时间。当您点击执行器/promethius 端点时,会显示计时器信息,例如最大和总执行时间以及事件数量。您可以根据事件总数和数量得出平均值。

© www.soinside.com 2019 - 2024. All rights reserved.