从Kafka消息在春季侦探中注入TraceId

时间:2018-10-26 10:52:46

标签: java spring spring-boot tracing spring-cloud-sleuth

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

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

我已经通过MDC进行了尝试,但在这种情况下traceId并未传播到其他微服务。

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

谢谢!

1 个答案:

答案 0 :(得分:0)

我认为这不是一个好主意。保留生成的跟踪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();
    }