Sping Cloud Sleuth: распространить трассировку на другие весенние приложения - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть весенний сервис, который может отправить несколько пакетных заданий AWS.Это простое весеннее пакетное задание, которое вызывает запрос на внешнее обслуживание.И я хочу распространить трассировку, сгенерированную в моем сервисе, включив библиотеку «org.springframework.cloud:spring-cloud-starter-sleuth» в classpath, к этой работе и добавить перехватчик «TraceRestTemplateInterceptor» во внешний запрос, инициированный этим traceId.

Как я могу это сделать?Как я могу инициализировать перехватчик, который поместит существующий traceId из параметра приложения, среды, свойств?Или может потребоваться создать некоторые компоненты конфигурации?

ОБНОВЛЕНИЕ:

Упрощенный пример:

@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!

Прежде всего, я хочу увидеть здесь traceId, который инициализируется в application.properties.Во-вторых, когда раскомментируйте условие resttemplate, этот traceId распространяется в запрос.

Возможно ли это?

Ответы [ 3 ]

0 голосов
/ 14 января 2019

Устранена эта проблема только путем ручного ввода в запрос ключа HEADER «X-B3-TRACEID» с соответствующим значением, которое вставляется внешним приложением в качестве системного свойства при отправке целевого приложения весенней загрузки.И вручную вставив этот ключ в MDC.Пример, этот фрагмент из приложения весенней загрузки, который должен получить 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);
    };
}
0 голосов
/ 24 января 2019

Вы можете получить bean:

@Autowired private Tracer tracer;

И получить traceId с помощью

tracer.getCurrentSpan().traceIdString();

0 голосов
/ 06 января 2019

Просто добавьте зависимость в classpath и установите шаблон rest как bean-компонент.Этого достаточно.

...