В моем приложении я использую компонент Tracer для получения идентификаторов трассировки и диапазона:
@Service
@RequiredArgsConstructor
public class SomeService {
private final Tracer tracer;
private TracingContext getTracingContext() {
var context = Optional.ofNullable(tracer.currentTraceContext().context());
return TracingContext.builder()
.traceId(context.map(TraceContext::traceId).orElse("null"))
.spanId(context.map(TraceContext::spanId).orElse("null"))
.build();
}
public void doSomeJbob() {
...
var context = getTracingContext();
send_request_using<org.springframework.web.reactive.function.client.WebClient>();
...
}
}
Проблема в том, что когда для свойства management.tracing.enabled
установлено значение false, приложение не запускается с исключением Bean not found.
Я создал обходной путь, я создал @Bean в конфигурации:
@Bean
@ConditionalOnClass(Tracer.class)
@ConditionalOnProperty(prefix = "management.tracing", name = "enabled", havingValue = "false")
public Tracer defaultTracer() {
return Tracer.NOOP;
}
Приложение запускается, но затем запрос, вызванный с помощью send_request_using<org.springframework.web.reactive.function.client.WebClient>();
, начинает давать сбой:
Context does not have an entry for key [class io.micrometer.tracing.handler.TracingObservationHandler$TracingContext]
Что я делаю неправильно? Разве трассировка не должна быть отключена иногда?
Ваше приложение требует создания bean-компонента Tracer
, но отключение трассировки приведет к отсутствию этого bean-компонента.
Вместо обязательного использования вы можете использовать ObjectProvider:
private final ObjectProvider<Tracer> tracerProvider;
обновить зависимость микрометра и поставить Hooks.enableAutomaticContextPropagation(); в основной функции