spring-cloud - 从外部服务中提取跟踪 id
问题描述
我最近升级到 Spring Cloud Sleuth 2.0.0,现在面临从外部服务正确提取跟踪 id 的问题。
有ExternalService(不受我控制)正在将消息发布到 ActiveMQ 队列中,其标头值为“X-B3-TraceId”,一个 16 字符长的字符串,如“1234567890abcdef”。
我将使用 JmsListener 注释消息从MyService中的队列中取出此消息:
...
/**
* 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 时,它不会将正确的 id 放入日志输出中。
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();
}
我希望你能帮助我。
解决方案
推荐阅读
- ios - 如何从基本的 UINavigationController 到 UISplitViewController?
- php - 访问父命名空间中的父构造函数
- ssl - F5 平衡器和 rawsockets(横杆)
- android - 通知在前台不起作用
- npm - Azure Pipelines“Cache@2”失败并显示“##[错误]系统找不到指定的文件”
- node.js - Async/Await In NodeJS
- swift - 更新数据源并调用reloadData后,cellForItem中的数据源不变
- scylla - 是否有用于 scylla nodetool 的 API?
- android - Capacitor LocalNotifications - Android 上没有 toast 弹出窗口?
- c - 写入通过结构传递给线程的 mmap 输出 (C)