Извлечь идентификатор трассировки из внешнего сервиса - PullRequest
0 голосов
/ 01 июля 2018

Недавно я обновлялся до Spring Cloud Sleuth 2.0.0 и теперь сталкиваюсь с проблемой правильного извлечения идентификатора трассировки из внешней службы.

Существует ExternalService (не под моим контролем), который публикует сообщения в очередь ActiveMQ со значением заголовка "X-B3-TraceId", строкой длиной 16 символов, такой как "1234567890abcdef".

Я удалю это сообщение из очереди в MyService с аннотированным сообщением JmsListener:

...
/**
 * Pulls the messages from the ActiveMQ server which are located in the destination queue.
 */
@JmsListener(destination = "${destination}")
void pullMessage(Message<String> msg) throws IOException {
    String payload = msg.getPayload();

    Span span = interceptor.nextSpan(message);

...

Когда я использую TracingChannelInterceptor для получения traceId из заголовков, он не поместит правильный идентификатор в вывод журнала.

2018-07-01 21:59:10.529  INFO [MyService,fae6f4dac5903bb0,fae6f4dac5903bb0,false] 19276 --- [           main] ...

Я действительно ожидал эту строку.

 2018-07-01 21:59:10.529  INFO [MyService,1234567890abcdef,fae6f4dac5903bb0,false] 19276 --- [           main] ...

Почему Sleuth изменяет значение и как я могу правильно распространять свой контекст трассировки, чтобы иметь возможность отслеживать сообщения в обеих системах?

В предыдущих версиях Sleuth я извлекал traceId из заголовка с помощью этого метода.

private static Optional<Span> extractFromHeaders(Message<String> msg) {
    Optional<Map.Entry<String, Object>> traceIdValue = msg.getHeaders().entrySet().stream()
            .filter(header -> header.getKey().equals(TraceMessageHeaders.TRACE_ID_NAME) ||
                    header.getKey().equals("X-B3-TraceId") || header.getKey().equals("jms_correlationId"))
            .findFirst();

    String traceId = traceIdValue.map(headerEntry -> headerEntry.getValue().toString());
    long id = new BigInteger(traceId, 16).longValue();

    return Span.builder().traceId(id).build();
}

Надеюсь, вы мне поможете.

...