Sping Cloud Sleuth:将traceId传播到其他spring应用程序

时间:2018-12-20 04:59:35

标签: java spring spring-cloud-sleuth

我有一些spring服务,可以提交一些AWS批处理作业。这是一个简单的spring批处理作业,它调用对外部服务的请求。而且我想通过将“ org.springframework.cloud:spring-cloud-starter-sleuth” lib包含到类路径中来传播在我的服务中生成的traceId,并将“ TraceRestTemplateInterceptor”拦截器添加到由此traceId初始化的外部请求中。 / p>

我该怎么做?我如何初始化拦截器,该拦截器将从应用程序参数,环境,属性中放入现有的traceId? 还是可能需要创建一些配置bean?

更新:

简化示例:

@SpringBootApplication
public class DemoApplication implements CommandLineRunner {
   Logger logger = LoggerFactory.getLogger(DemoApplication.class);

   public static void main(String[] args) {
       SpringApplication.run(DemoApplication.class, args);
   }

   @Bean
   public RestTemplate restTemplate() {
     return new RestTemplate();
   }

   //@Autowired
   //RestTemplate restTemplate;

   @Override
   public void run(String... args) {
       logger.info("Hello, world!");
       //restTemplate.getForObject("some_url", String.class);
   }
}

文件application.properties:

 x-b3-traceId=98519d97ce87553d

文件build.gradle:

 dependencies {
    implementation('org.springframework.cloud:spring-cloud-starter-sleuth')
 }

输出:

INFO [-,,,] 15048 --- [           main] com.example.demo.DemoApplication         : Hello, world!

首先,我想在这里看到在application.properties中初始化的traceId。其次,当取消注释resttemplate子句时,此traceId传播到请求中。

有可能吗?

3 个答案:

答案 0 :(得分:1)

仅通过手动将带有对应值的HEADER键“ X-B3-TRACEID”放入请求中,即可解决此问题,该值由外部应用程序作为提交目标Spring Boot应用程序时的系统属性插入。并手动将此密钥插入MDC。例如,来自Spring Boot应用程序的此代码段必须获取traceId并传播:

@Bean
public void setTraceIdToMDC(@Value("${x.b3.traceid}") String traceId) {
  MDC.put("x-b3-traceId", traceId);
}

@Bean
public RestTemplate restTemplate() {
    return new RestTemplate();
}

@Bean
public CommandLineRunner commandLineRunnerer(RestTemplate restTemplate, @Value("${x.b3.traceid}") String traceId) {
    return args -> {
        MultiValueMap<String, String> header = new LinkedMultiValueMap<>();
        header.add("X-B3-TRACEID", traceId);

        HttpEntity httpEntity = new HttpEntity(header);

        logger.info("Execute some request"); //<-- prints expected traceId
        restTemplate.exchange("some_url", HttpMethod.GET, httpEntity, String.class);
    };
}

答案 1 :(得分:0)

只需将依赖项添加到类路径并将rest模板设置为bean。够了。

答案 2 :(得分:0)

您可以得到bean:

@Autowired private Tracer tracer;

并使用

获取traceId

tracer.getCurrentSpan().traceIdString();