Весенний сыщик Багажный ключ не распространяется - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть фильтр (OncePerRequestFilter), который в основном перехватывает входящий запрос и регистрирует traceId, spanId et c. который работает хорошо, этот фильтр находится в общем модуле, который включен в другие проекты, чтобы избежать включения зависимости пружинного сути во все мои микро-сервисы, поэтому я создал его как библиотеку, потому что любые изменения в библиотеке будут общими ко всем модулям. Теперь я должен добавить новый ключ распространения, который необходимо распространить на все службы через заголовки 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);

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

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

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

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

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

@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();      
    }
0 голосов
/ 19 февраля 2020

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

Да, вам нужно сделать это

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

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

...