概念阐述

分布式调用链追踪提供了服务间调用的时序信息,但服务内部的链路调用信息对开发者同样重要,如果能将两者合二为一,就能提供更完整的调用链,更容易定位错误和潜在性能问题。

前提条件

  • 使用自定义打点功能需要首先配置并启用Java Chassis微服务调用链。

注意事项

  • 使用@Span注释的自定义打点功能只支持和Java Chassis调用请求同一线程的方法调用。
  • 添加@Span注释的方法必须是Spring管理的Bean,否则需要按这里提到的方法配置。

自定义调用链打点

该功能集成了Zipkin,提供@Span注释为需要追踪的方法自定义打点。Java Chassis将自动追踪所有添加@Span注释的方法,把每个方法的本地调用信息与服务间调用信息连接起来。

使用步骤:

添加依赖

基于 ServiceComb Java Chassis 的微服务只需要添加如下依赖到 pom.xml:

  1. <dependency>
  2. <groupId>org.apache.servicecomb</groupId>
  3. <artifactId>tracing-zipkin</artifactId>
  4. </dependency>

启用自定义打点功能

在应用入口或Spring配置类上添加@EnableZipkinTracing注释:

  1. @SpringBootApplication
  2. @EnableZipkinTracing
  3. public class ZipkinSpanTestApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(ZipkinSpanTestApplication.class);
  6. }
  7. }

定制打点

在需要定制打点的方法上添加@Span注释:

  1. @Component
  2. public class SlowRepoImpl implements SlowRepo {
  3. private static final Logger logger = LoggerFactory.getLogger(SlowRepoImpl.class);
  4. private final Random random = new Random();
  5. @Span
  6. @Override
  7. public String crawl() throws InterruptedException {
  8. logger.info("in /crawl");
  9. Thread.sleep(random.nextInt(200));
  10. return "crawled";
  11. }
  12. }

就这样,通过使用@Span注释,我们启动了基于 Zipkin 的自定义打点功能。

定制上报的数据

通过自定义打点上报的调用链包含两条数据:

  • span name 默认为当前注释的方法全名。
  • call.path 默认为当前注释的方法签名。

例如,上述例子SlowRepoImp里上报的数据如下:

keyvalue
span namecrawl
call.pathpublic abstract java.lang.String org.apache.servicecomb.tests.tracing.SlowRepo.crawl() throws java.lang.InterruptedException

如果需要定制上报的数据内容,可以传入自定义的参数:

  1. public static class CustomSpanTask {
  2. @Span(spanName = "transaction1", callPath = "startA")
  3. public String invoke() {
  4. return "invoke the method";
  5. }
  6. }