Декоратору BraveService не удается передать контекст службы gRPC в Армерии.
Я обслуживаю службу gRPC с помощью Armeria, Spring Boot 3 и WebFlux. Я хочу использовать Brave для печати идентификаторов трассировки и спана в журнале. Я использовал следующее руководство (https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#actuator.micrometer-tracing) для настройки Brave. Я также адаптировал конфигурацию из руководства Micrometer для распространения контекста в WebFlux. Однако эти конфигурации хорошо работают только с Spring Controller.
Они не применяются к услуге gRPC, обслуживаемой Армерией.
Поэтому я добавил в Armeria декоратор, используя BraveService, следующим образом. Трассировка настроена на использование MDC.
@Bean
public ArmeriaServerConfigurator armeriaServerConfigurator() {
Tracing tracing = Tracing.newBuilder()
.currentTraceContext(
RequestContextCurrentTraceContext.builder()
.addScopeDecorator(MDCScopeDecorator.get())
.build())
...
.build();
return builder -> builder
.service(grpcService()) // any implementations of grpc services
.decorator(BraveService.newDecorator(tracing));
}
При такой реализации только служба gRPC, получившая запрос gRPC, правильно запишет в журнал TraceId и SpaId. Однако TraceId и SpaId не передаются в другие потоки, которые вызывает служба gRPC в проекте.
Ниже приведен пример журнала.
2023-08-28T22:23:38.263+09:00 INFO [Armeria WebFlux,d3d5b84a174e6bbb,d3d5b84a174e6bbb] 39599 --- [rker-kqueue-3-2] c.m.a.grpc.TestGrpcService : traceId: d3d5b84a174e6bbb
2023-08-28T22:23:38.266+09:00 INFO [Armeria WebFlux,,] 39599 --- [oundedElastic-1] c.m.a.service.JustService : traceId: null
2023-08-28T22:23:38.266+09:00 INFO [Armeria WebFlux,,] 39599 --- [ parallel-1] c.m.a.repository.JustRepository : traceId: null
Я искал что-то связанное, но не нашел ничего, что могло бы дать мне подсказку, пожалуйста, помогите. Заранее спасибо.
1 ответ
Я нашел ответ.
Armeria поддерживает Spring WebFlux, но это не Spring WebFlux. У Armeria есть собственный метод распространения контекста, поэтому следующая конфигурация не будет работать.
Hooks.enableAutomaticContextPropagation();
Вместо этого вы можете использовать следующие контекстные инструменты для Armeria
import com.linecorp.armeria.common.reactor3.RequestContextHooks;
...
RequestContextHooks.enable();
Для этого требуется зависимость Armeria-Reactor3 , что позволит вам распространять контекст. Конфигурация Brave работает нормально.