Ключ от багажа весеннего сыщика не распространяется

У меня есть фильтр (OncePerRequestFilter), который в основном перехватывает входящий запрос и регистрирует traceId, spanId и т. Д., Который хорошо работает, этот фильтр находится в общем модуле, который включен в другие проекты, чтобы избежать включения зависимости от Spring Sleuth во всех моих микросервисах. , причина, по которой я создал ее как библиотеку, потому что любые изменения в библиотеке будут общими для всех модулей. Теперь я должен добавить новый ключ распространения, который необходимо распространить на все службы через заголовки http, такие как trace и spanId, для этого я извлек текущий диапазон из HttpTracing и добавил к нему ключ багажа (как показано ниже)

 Span span = httpTracing.tracing().tracer().currentSpan();
    String corelationId =
        StringUtils.isEmpty(request.getHeader(CORELATION_ID))
            ? "n/a"
            : request.getHeader(CORELATION_ID);
    ExtraFieldPropagation.set(CUSTOM_TRACE_ID_MDC_KEY_NAME, corelationId);
    span.annotate("baggage_set");
    span.tag(CUSTOM_TRACE_ID_MDC_KEY_NAME, corelationId);

Я добавил ключи распространения и ключи из белого списка в свой файл application.yml (с моей библиотекой), как показано ниже

spring:
  sleuth:
    propagation-keys:
      - x-corelationId
    log:
      slf4j:
        whitelisted-mdc-keys:
          - x-corelationId

После внесения этого изменения в фильтр corelationId недоступен, когда я делаю http-вызов другой службы с тем же приложением, в основном ключи не распространяются.


person Apollo    schedule 19.02.2020    source источник


Ответы (3)


В своей библиотеке вы можете реализовать прослушиватель ApplicationEnvironmentPreparedEvent и добавить туда нужную конфигурацию Ex:

@Component
public class CustomApplicationListener implements ApplicationListener<ApplicationEvent> {

    private static final Logger log = LoggerFactory.getLogger(LagortaApplicationListener.class);

    public void onApplicationEvent(ApplicationEvent event) {

        if (event instanceof ApplicationEnvironmentPreparedEvent) {
            log.debug("Custom ApplicationEnvironmentPreparedEvent Listener");
            ApplicationEnvironmentPreparedEvent envEvent = (ApplicationEnvironmentPreparedEvent) event;
            ConfigurableEnvironment env = envEvent.getEnvironment();
            Properties props = new Properties();
            props.put("spring.sleuth.propagation-keys", "x-corelationId");
            props.put("log.slf4j.whitelisted-mdc-keys:", "x-corelationId");

            env.getPropertySources().addFirst(new PropertiesPropertySource("custom", props));
        }
    }

}

Затем в своем микросервисе вы зарегистрируете этот пользовательский слушатель.

public static void main(String[] args) {
        ConfigurableApplicationContext context = new SpringApplicationBuilder(MyApplication.class)
                .listeners(new CustomApplicationListener()).run();      
    }
person Mahmoud Eltayeb    schedule 05.05.2020

Я просмотрел документацию и, похоже, мне нужно добавить ключи spring.sleuth.propagation и внести их в белый список с помощью spring.sleuth.log.slf4j.whitelisted-mdc-keys

Да тебе нужно это сделать

есть ли другой способ добавить эти свойства в общий модуль, чтобы мне не нужно было включать их во все без исключения микросервисы.

Да, вы можете использовать сервер Spring Cloud Config и файл свойств с именем application.yml / application.properties, который будет устанавливать эти свойства для всех микросервисов.

person Marcin Grzejszczak    schedule 19.02.2020
comment
Я добавил ключи распространения и ключи из белого списка в application.yml, но он все еще не распространяется, и я не уверен, зачем мне добавлять зависимость сервера Sping Cloud Config. - person Apollo; 19.02.2020
comment
Ознакомьтесь с этой фиксацией github.com-spring-spring- / sleuth-documentation-apps / и это приложение для рабочего примера github.com/spring-cloud-samples/sleuth-documentation-apps/tree/. Что касается сервера конфигурации, вы спросили, каким образом все приложения имеют набор настроек без необходимости делать это отдельно для каждого приложения. - person Marcin Grzejszczak; 19.02.2020
comment
спасибо @Marcin, но добавление зависимости spring-cloud-config-server и application.yml не помогло - person Apollo; 19.02.2020
comment
Вы не должны просто добавлять зависимость или делать это на стороне вашего приложения. Вы знакомы с идеей Spring Cloud Config? Я рассказал вам, как использовать конфигурацию облака Spring, чтобы не настраивать эти свойства для каждого приложения. Пожалуйста, проверьте предоставленную фиксацию и код для получения дополнительной информации. У вас есть все необходимые детали с рабочим примером. - person Marcin Grzejszczak; 19.02.2020
comment
спасибо, он заработал после добавления конфигурации весеннего облака и указания моих служб для получения свойств. - person Apollo; 19.02.2020

Ответ Махмуда отлично работает, когда вы хотите зарегистрировать whitelisted-mdc-keys программно.

Дополнительный совет, когда вам нужны эти свойства также в тесте, вы можете найти ответ в этом сообщении: Как зарегистрировать ApplicationEnvironmentPreparedEvent весной Тест

person Theo van Essen    schedule 10.06.2020