Декоратору 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 работает нормально.

Другие вопросы по тегам