Недавно я обновлялся до 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();
}
Надеюсь, вы мне поможете.