2

我正在使用带有依赖管理和 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 问题:为什么这些跟踪没有发送到跟踪后端?

先感谢您!

4

0 回答 0