java - Spring Cloud Sleuth:将 traceId 传播到其他 Spring 应用程序
问题描述
我有一些可以提交一些 AWS 批处理作业的春季服务。这是一个简单的 spring 批处理作业,它调用外部服务的请求。我想通过将“org.springframework.cloud:spring-cloud-starter-sleuth”lib 包含到 classpath 中来传播在我的服务中生成的 traceId,并将“TraceRestTemplateInterceptor”拦截器添加到使用此 traceId 初始化的外部请求中。
我怎样才能做到这一点?我如何初始化拦截器,它将从应用程序参数、环境、属性中放置现有的 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 传播到请求中。
可能吗?
解决方案
仅通过手动将具有相应值的请求 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);
};
}
推荐阅读
- excel - 如何将 Excel 与 IBM Watson 连接起来
- java - 无需手动编辑构建路径的 JavaFX 11 设置
- symfony - 如何在 FOR 循环中更改元素的值
- javascript - 过滤器值的增加和减少在 Camanjs 中无法正常工作
- php - 如何检查在 php 中完成的 bash shell
- dart - 如何根据第一个流中的事件启动第二个流?
- symfony4 - Symfony4 内核找不到自动加载的类
- python-3.x - 如何避免在activex autocad api上的SendCommand期间保存提示
- c - Cppcheck 在每次扫描时返回不同的结果
- json - 使用 PowerShell 嵌套 JSON