Добавить трассировку для всех методов класса в Java 8 - PullRequest
0 голосов
/ 29 мая 2018

У меня есть микросервис 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/finally и span init сотни раз?

1 Ответ

0 голосов
/ 29 мая 2018

Спасибо за комментарии к моему вопросу, как и предполагалось, я реализовал его с помощью АОП.Вот мое решение, оно, возможно, будет кому-нибудь полезно.

Добавить зависимость 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";
}

Чем я добавил аспект, который добавляет 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...