首页 > 解决方案 > 从 Kafka 消息中在 spring sleuth 中注入 TraceId

问题描述

我正在研究多个微服务架构,其中入口点来自 Kafka。例如,假设我们在 micro1 中有三个微服务 micro1、micro2 和 micro3 请求来自 kafka 消息队列,并通过 Rest 客户端进一步与 micro2 和 micro3 通信。

micro1 收到的消息包含 requestId ,我需要在 Spring sleuth 中将其替换为 TraceId ,并且应该在所有微服务中传播。

我已经通过 MDC 尝试过,但在这种情况下,traceId 不会传播到其他微服务。

有没有其他方法可以在侦探中实现自定义 TraceId 而不是自动生成?

谢谢!!

标签: javaspringspring-boottracespring-cloud-sleuth

解决方案


我不认为这是一个好主意。留下生成的跟踪 id 并创建另一个生成的字段,该字段将作为包袱传播。

如果您确实需要更改生成 ID 的方式,那么您必须更改此 bean

https://github.com/spring-cloud/spring-cloud-sleuth/blob/v2.0.2.RELEASE/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/ TraceAutoConfiguration.java#L113-L133

@Bean
    @ConditionalOnMissingBean
    Propagation.Factory sleuthPropagation(SleuthProperties sleuthProperties) {
        if (sleuthProperties.getBaggageKeys().isEmpty() && sleuthProperties.getPropagationKeys().isEmpty()) {
            return B3Propagation.FACTORY;
        }
        ExtraFieldPropagation.FactoryBuilder factoryBuilder = ExtraFieldPropagation
                .newFactoryBuilder(B3Propagation.FACTORY);
        if (!sleuthProperties.getBaggageKeys().isEmpty()) {
            factoryBuilder = factoryBuilder
                    // for HTTP
                    .addPrefixedFields("baggage-", sleuthProperties.getBaggageKeys())
                    // for messaging
                    .addPrefixedFields("baggage_", sleuthProperties.getBaggageKeys());
        }
        if (!sleuthProperties.getPropagationKeys().isEmpty()) {
            for (String key : sleuthProperties.getPropagationKeys()) {
                factoryBuilder = factoryBuilder.addField(key);
            }
        }
        return factoryBuilder.build();
    }

推荐阅读