Миграция 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);
}