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 質問: これらのトレースがトレース バックエンドに送信されないのはなぜですか?
前もって感謝します!