Spring sleuth 和 spring 集成为所有出站 API 请求生成相同的 traceId

问题描述

我正在构建一个使用 spring 集成和 spring sleuth 的 springboot 应用程序。该应用程序从 csv 文件中读取,对于 csv 文件中的每条记录,都会使用 spring resttemplate 调用 API。每次读取文件时,对 API 的所有相应调用都具有相同的 X-B3-TraceId。它们确实有不同的 spanId。

我希望每次调用 API 时都有不同的 X-B3-TraceId。我相信 spring 集成正在为每个文件读取操作设置一个 traceId,并在每次调用 API 期间使用相同的。

@Bean
public IntegrationFlow bridgeFlow() {
    return IntegrationFlows.from(ABC_SERVICE_QUEUE_CHANNEL)
            .bridge(e -> e.poller(Pollers.fixedDelay(period).maxMessagesPerPoll(MAX_MSG_PER_POLL)))
            .handle(someService,"someMethod")
            .route(router())               
            .get();
}

"someMethod" 使用 resttemplate as 调用 API,

ResponseEntity<String> response = restTemplate.exchange(someUrl,HttpMethod.POST,requestEntity,String.class);

我尝试手动设置 X-B3-TraceId 标头,但这似乎被覆盖了

解决方法

如果您想用自己的值覆盖某些标头,则应在 IntegrationFlow 中使用类似的内容:

.enrichHeaders(s -> s.header("X-B3-TraceId","some_value",true))

最后一个参数在这里很重要,设置为 true。 查看它的 JavaDocs:

@param overwrite true to overwrite an existing header.

另一方面,您的代码片段并不清楚 X-B3-TraceId 标头是如何出现在消息中的。谁给我们定的?您的文件读取器和记录拆分器在哪里?