我正在使用带有依赖管理和 Spring Cloud 版本 Greenwich.SR2 的 Spring Cloud Sleuth 的 Spring Boot 2 微服务。我的服务在 Istio 服务网格中运行。istio 的采样策略设置为 100(pilot.traceSampling: 100.0)。
要在网格中使用分布式跟踪,应用程序需要转发 HTTP 标头,例如 X-B3-TraceId 和 X-B3-SpanID。这可以通过简单地添加 Sleuth 来实现。我的所有 HTTP 请求都被正确跟踪。Istio (Envoy) 的 sidecar 代理将跟踪发送到 Jaeger 后端。
Sleuth 也应该与 Spring WebSocket 一起使用。但是我传入的 websocket 请求没有通过侦探获得任何跟踪或跨度 ID;日志看起来像 [-,,,]。1. 问:为什么 Sleuth 不能用于 websocket?我的 WS 配置:
@Configuration
@EnableWebSocket
public class WsConfig implements WebSocketConfigurer {
@Autowired
WebSocketHandler webSocketHandler;
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
DefaultHandshakeHandler handshakeHandler = new DefaultHandshakeHandler();
handshakeHandler.setSupportedProtocols(HANDSHAKE_PROTOCOL);
registry.addHandler(webSocketHandler, WS_HANDLER_PATH + WILDCARD)
.setAllowedOrigins("*")
.setHandshakeHandler(handshakeHandler);
}
}
我的客户能够通过 Websocket 连接到我的服务。我正在实现 WebSocketHandler 接口来处理 WS 消息。
为了实现我的 WS 连接由 Sleuth 记录,我用 @NewSpan 注释了处理我的连接的方法:
@Override
@NewSpan
public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) {
//doWork and call other services via HTTP
}
有了这个,Sleuth 创建 trace 和 spanId 并将它们传播到其他服务,这些服务通过此方法中的 restTemplate 调用。但是 HTTP 调用不会发送到 Jaeger。sidcar 始终将 x-B3-Sampled Header 设置为 0。2 问题:为什么这些跟踪没有发送到跟踪后端?
先感谢您!