Миграция Sleuth на Observation API с помощью Micrometar Spring Boot 3.0.0

У нас включен Sleuth на всех конечных точках Spring 2.7.x (из коробки). Простое и простое отслеживание traceId/spanId. Теперь, как и в Spring Sleuth, он больше не доступен в Spring Boot 3.0.0. Есть ли способ включить этот новый API наблюдения на всех конечных точках.

Раньше было так:

      /*
 List all beers in database
 */
public Mono<ServerResponse> listBeer() {
    return beerService.listBeers(null,  null, PageRequest.ofSize(50), true)
            .flatMap(beerDto -> ServerResponse.ok().bodyValue(beerDto))
            .switchIfEmpty(ServerResponse.notFound().build());


}

Теперь с новым API в каждой конечной точке нужно сделать следующее:

      /*
 List all beers in database
 */
public Mono<ServerResponse> listBeer() {
    Observation observation = Observation.start("listBeer-sample", observationRegistry);
    return Mono.just(observation).flatMap(span -> {

                observation.scoped(() -> log.info("I can fetch trace id <TRACE:{}> ",
                        this.tracer.currentSpan().context().traceId())
                );
                return beerService.listBeers(null, null, PageRequest.ofSize(50), true)
                        .flatMap(beerDto -> ServerResponse.ok().bodyValue(beerDto))
                        .switchIfEmpty(ServerResponse.notFound().build());
            }).doFinally(signalType -> observation.stop())
            .contextWrite(context -> context.put(ObservationThreadLocalAccessor.KEY, observation));

}

}

Есть ли способ включить traceId/spanId из коробки на всех конечных точках без всего этого беспорядка?

1 ответ

Основываясь на вашем описании, я думаю, вы хотите интегрировать микрометар без изменения исходного кода.

К счастью, это можно реализовать через@Observed+ аоп

Вы можете обратиться к официальной документации. См. раздел 4.6, замечание.

добавить код конфигурации

        @Bean
  public ObservedAspect observedAspect(ObservationRegistry observationRegistry) {
      return new ObservedAspect(observationRegistry, this::skipControllers);
  }
 
  private boolean skipControllers(ProceedingJoinPoint pjp) {
      Class<?> targetClass = pjp.getTarget().getClass();
      return targetClass.isAnnotationPresent(RestController.class) || targetClass.isAnnotationPresent(Controller.class);
  }
Другие вопросы по тегам