2

Spring Boot 2 Microservices を Spring Cloud Sleuth と依存関係管理および Spring Cloud バージョン Greenwich.SR2 で使用しています。私のサービスは Istio サービス メッシュで実行されています。istio のサンプル ポリシーは 100 に設定されています (pilot.traceSampling: 100.0)。

メッシュで分散トレースを使用するには、アプリケーションは X-B3-TraceId や X-B3-SpanID などの HTTP ヘッダーを転送する必要があります。これは、Sleuth を追加するだけで実現できます。すべての HTTP リクエストが正しくトレースされています。Istio (Envoy) のサイドカー プロキシは、トレースを Jaeger バックエンドに送信します。

Sleuth は Spring WebSocket でも動作するはずです。しかし、受信した websocket リクエストはトレースまたはスパン ID を取得しません。ログは [-,,,] のようになります。1. 質問: Sleuth が websocket で機能しないのはなぜですか? 私のWS-Config:

@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 経由でサービスに接続できます。WS メッセージを処理するために WebSocketHandler インターフェイスを実装しています。

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 に送信されません。x-B3-Sampled ヘッダーは、sidcar によって常に 0 に設定されます。2 質問: これらのトレースがトレース バックエンドに送信されないのはなぜですか?

前もって感謝します!

4

0 に答える 0