【问题标题】:Sleuth not working for websocket client侦探不适用于 websocket 客户端
【发布时间】:2018-08-08 14:54:58
【问题描述】:

我有一个微服务连接到 WebSocket 服务器,并从服务器接收消息。我想在这个应用程序中集成 Sleuth,因为这是我的一组微服务的网关。但是当我连接到WebSocket服务器并开始接收消息时,我无法在日志中traceId,spanid。我期待的是这样的:

2018-08-09 11:26:20.222  INFO [kumarman-betsync-adapter-service-v2,0a011711c2470359,0a011711c2470359,true] 7230 --- [ient-SecureIO-2] c.b.b.a.service.BetSyncEventIdExtractor  : SubscribeResponse feed received for eventId=7519016
2018-08-09 11:26:20.224  INFO [kumarman-betsync-adapter-service-v2,0a011711c2470359,2b028dadad5c440d,true] 7230 --- [ient-SecureIO-2] c.b.b.a.k.message.KafkaMessageSender     : sent payload to topic='betsyncEventTopic'

但我得到了:

2018-08-09 11:26:20.222  INFO [kumarman-betsync-adapter-service-v2,,,] 7230 --- [ient-SecureIO-2] c.b.b.a.service.BetSyncEventIdExtractor  : SubscribeResponse feed received for eventId=7519016
2018-08-09 11:26:20.224  INFO [kumarman-betsync-adapter-service-v2,,,] 7230 --- [ient-SecureIO-2] c.b.b.a.k.message.KafkaMessageSender     : sent payload to topic='betsyncEventTopic'

我的代码如下:

  @Service
    @Slf4j
    @AllArgsConstructor
    public class BetsyncWebsocketAdapter {

        private final BetsyncWebSocketHandler betsyncWebSocketHandler;

        public void startNewConnection() {
                try {
                    webSocketSession = new StandardWebSocketClient().doHandshake(
                            betsyncWebSocketHandler,
                            new WebSocketHttpHeaders(),
                            new URI(getBetsyncConnectionUrl()))
                            .get(KafkaAdminClient.MAX_TIME_LIMIT_TO_CONNECT, TimeUnit.SECONDS);
                } catch (Exception e) {
                    log.error("exception occurred", e);
                }
        }

        /**
         * This will start the new connection after server start
         */
        @EventListener(ApplicationReadyEvent.class)
        public void onServerStart() {
            startNewConnection();
        }
    }

@Slf4j
@Service
@AllArgsConstructor
public class BetsyncWebSocketHandler extends TextWebSocketHandler {

    private static StringBuilder betSyncMessage = new StringBuilder();

    private final LoginRequestBuilder loginRequestBuilder;
    private final BetsyncMessageProcessing betsyncMessageProcessing;

    @Override
    public void afterConnectionEstablished(final WebSocketSession session) throws IOException {
        session.sendMessage(new TextMessage(loginRequestBuilder.getLoginRequestDto()));
    }

    @Override
    protected void handleTextMessage(final WebSocketSession session, final TextMessage message) {
        betSyncMessage.append(message.getPayload());
        if (message.isLast()) {
            betsyncMessageProcessing.process(betSyncMessage.toString());
            betSyncMessage = new StringBuilder();
        } else {
            log.debug("we have received a partial message starting with {}", getFirstXCharacter(message.getPayload(), 50));
        }
    }

    @Override
    protected void handlePongMessage(final WebSocketSession session, final PongMessage message) {
        log.info("Response for Ping message received from the server");
    }

    @Override
    public boolean supportsPartialMessages() {
        return true;
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        log.error("server connection closed");
    }
}

我们的 pom 条目是:

<dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-sleuth</artifactId>
        </dependency>

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring.boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
        <spring.boot.version>2.0.3.RELEASE</spring.boot.version>
        <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>

【问题讨论】:

  • 您能否阅读此stackoverflow.com/help/how-to-ask 并提供有关您的问题的任何有用信息?
  • @MarcinGrzejszczak 我已经更新了票。
  • 我仍然不知道你使用的是哪个版本的侦探,你是如何将它添加到项目中的。我们还通过 spring 集成支持 websockets。我这里没看到
  • @MarcinGrzejszczak 我已经添加了 pom.xml。没有其他与 WebSocket 相关的代码,我可以在我的应用程序中看到。

标签: spring-cloud-sleuth


【解决方案1】:

您正在自己创建套接字处理

 webSocketSession = new StandardWebSocketClient().doHandshake(
                            betsyncWebSocketHandler,
                            new WebSocketHttpHeaders(),
                            new URI(getBetsyncConnectionUrl()))
                            .get(KafkaAdminClient.MAX_TIME_LIMIT_TO_CONNECT, TimeUnit.SECONDS);

当您直接使用 Spring Integration 组件时,Spring Cloud Sleuth 支持 WebSockets。由于您是手动执行操作,因此您必须确保跟踪上下文得到传播并且您可以自己阅读。

【讨论】:

  • 嗨 Marcin,当我使用 @NewSpan 时,我可以开始按预期查看日志,我在我的问题中添加了该日志,并且每个收到的消息都有不同的 traceId,但运行几个小时后,我可以看到所有使用相同 traceId 开始的消息。我不确定如何?你有什么想法,否则我将不得不了解更多细节?
  • 当然,需要更多细节。我不知道你把@NewSpan 放在哪里。你能创建一个可重复的小样本并将其上传到 Github 吗?
  • 嗨,Marcin,我在github.com/krmanish007/SleuthtestApplication创建了一个示例项目
  • 你真的可以在 Sleuth 项目中提出问题吗?我不想忘记这件事。
  • 当然,Marcin,我在github.com/spring-cloud/spring-cloud-sleuth/issues/1058这里创建了它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-07
  • 2020-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-27
  • 2012-04-30
相关资源
最近更新 更多