首页 > 解决方案 > 如何在 Spring Cloud Sleuth 中为命令行运行程序设置行李字段?

问题描述

我在 Spring Boot 微服务中成功使用了 Spring Cloud Sleuth,并且正在适当地记录字段并通过 http 标头发送。

我现在需要在 Spring Boot 命令行运行程序应用程序中集成相同的日志记录和标头传播过程,但看起来没有自动设置跟踪和跨度,因为它不在 Http 请求的中间(因为它是一个命令线应用程序)。我在日志中看不到这些字段(在日志配置中使用相同的 %X 格式)。

我查看了文档,找不到此特定用例的任何示例。这在命令行运行器应用程序中是否可行?

标签: springspring-bootcommand-linespring-cloud-sleuth

解决方案


为了添加行李,您需要有一个跨度。当调用控制器时,Spring Cloud Sleuth 和 Spring Boot 会为您创建一个跨度。如果你想使用 CLI 应用程序做同样的事情,你需要自己创建 span。

你有两个选择。

使用 API 调用

Span span = this.tracer.nextSpan().name("mySpan");
// do some work
span.end(); // best to put it in finally to make sure span is always ended

或者您可以使用注释

@NewSpan
public void doWork() {
}

如果您使用注解,请记住AOP 代理限制。特别是自我调用(使用 调用this)将不起作用。

@SpringBootApplication
public class ConsoleApplication 
  implements CommandLineRunner {

    @Override
    public void run(String... args) {
        doWork(); //this is the same as this.doWork();
    }

    @NewSpan
    public void doWork() {
    }
}

这是行不通的,因为doWork不是通过 AOP 代理调用的。确保注释 Spring 管理的组件,然后使用注入的实例。

@SpringBootApplication
public class ConsoleApplication 
  implements CommandLineRunner {

    @Autowired
    private MyService myService;

    @Override
    public void run(String... args) {
        myService.doWork();
    }

}

@Component
class MyService {

    @NewSpan
    public void doWork() {
    }

}

在这种情况下myService,不是 的实例MyService,而是检测代理。


推荐阅读