gpt4 book ai didi

java - 在 Java 8 中添加对类的所有方法的跟踪

转载 作者:行者123 更新时间:2023-12-02 02:07:19 26 4
gpt4 key购买 nike

我有一个 Spring Boot 微服务。为了找到延迟问题的根源,我需要添加对某些对象的跟踪。 zipking 已配置,因此我想添加自定义范围。

想象一下,我有一个包含 20 个进行数据库调用的方法的类。为了添加我的跨度,我做了这样的事情

@Repository
public class myClass {

@Autowired
private Tracer tracer;

public int myMethod1(){
Span span = tracer.createSpan("dbcall");
try{
// initial method content here
} finally {
tracer.close(span);
}
}

public int myMethod2(){
// the same as above
}

// .......

public int myMethod20(){
// the same as above
}
}

有什么关于一种更智能的方法来实现这一点,而无需复制粘贴 try/finallyspan init 数百次?

最佳答案

感谢您对我的问题的评论,按照建议我使用 AOP 实现了它。这是我的解决方案,它可能对某人有用。

将AOP依赖添加到pom.xml

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

我创建了自定义属性TrackLatency.java

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TrackLatency {
String value() default "Track Latency Span";
}

然后我添加了向每个具有属性调用的方法添加跨度的方面

@Aspect
@Configuration
@RequiredArgsConstructor
public class CreateNewSpanMethodAspect {
private final Tracer tracer;

@Around("@annotation(classpath.TrackLatency)")
public Object around(ProceedingJoinPoint call) throws Throwable {
Span span = tracer.createSpan(getTrackLatencyAnnotationValue(call));
try{
return call.proceed();
} finally {
tracer.close(span);
}
}

private static String getTrackLatencyAnnotationValue(ProceedingJoinPoint call){
MethodSignature signature = (MethodSignature) call.getSignature();
Method method = signature.getMethod();
TrackLatency trackLatencyAnnotation = method.getAnnotation(TrackLatency.class);
return trackLatencyAnnotation.value();
}
}

用法:

@TrackLatency("dbCall: myDbCall")
public List<QuestionAnswerRow> myDbCall(....) {
// no changes in my repository
}

关于java - 在 Java 8 中添加对类的所有方法的跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50583975/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com