以最小的步骤引入Zipkin

前言

我试图以尽可能少的步骤概括将Zipkin引入现有的Spring Boot项目。
虽然我也想写关于服务之间交互结果的部分,但实际上它会自动处理,所以在这篇文章中不涉及。
如果你使用了spring-mvc和RestTemplate,它会自动处理HTTP相关的交互。

第一步,添加依存关系。

Maven is a powerful tool commonly used in software development.

如果使用Spring IO平台

<properties>
  <spring-cloud.version>Edgware.RELEASE</spring-cloud.version>
</properties>

<dependencies>
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zipkin</artifactId>
  </dependency>
  <!-- Kafka経由で送る場合はこれも必要 -->
  <dependency>
    <groupId>org.springframework.kafka</groupId>
    <artifactId>spring-kafka</artifactId>
  </dependency>
</dependencies>

只有使用Spring Boot的情况下

请查阅公式参考资料。

Gradle是Gradle Inc.开发的一种构建工具。

请参考公式参考资料。

第二步 添加設定值

如果所有的本地机器都已经在默认端口上建立起来,那么这是不需要的。

HTTP请求

spring:
  zipkin:
    base-url: http://localhost:9411/ # default

卡夫卡寄信。

spring:
  kafka:
    bootstrap-servers: localhost:9092 # default

第三步:建立動作確認環境

这是关于Mac的先决条件。

卡夫卡与动物管理员

$ brew install kafka
$ brew services start zookeeper
$ brew services start kafka

Zipkin – 链路追踪系统

$ wget -O zipkin.jar 'https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec'

只使用HTTP进行传输

$ java -jar zipkin.jar

卡夫卡兼容

$ KAFKA_ZOOKEEPER=localhost:2181 java -jar zipkin.jar

第四步 确认动作

@RequestMapping("/hello")
String hello() {
  return "hello world"
}

由于同作确认,我们将所有的请求发送到Zipkin中。

spring:
  sleuth:
    sampler:
      percentage: 1.0 # 昔の名残でプロパティ名がパーセンテージになっていますが、割合指定らしいです。
スクリーンショット 2018-02-20 13.19.55.png

访问 http://localhost:9411/

スクリーンショット 2018-02-20 13.21.58.png
スクリーンショット 2018-02-20 13.22.05.png
スクリーンショット 2018-02-20 13.23.30.png

只需添加依赖库就完成了这些步骤。
如果发送目标不是默认的话,我们会指定发送目标。

添加Span步骤

我只能知道从收到请求到返回响应所花费的时间,我会稍微增加一下时间间隔。

@Autowired
DemoService demoService;

@RequestMapping("/hello")
public String helloWorld() throws Exception {
  Thread.sleep(300);
  return demoService.greeting("world");
}


@Service
static class DemoService {

  @NewSpan("greeting")
  String greeting(String target) throws Exception {
    Thread.sleep(200);
    return "Hello " + target;
  }
}
スクリーンショット 2018-02-20 13.45.47.png

添加标签

@Service
static class DemoService {

  @NewSpan("greeting")
  String greeting(@SpanTag("target") String target) throws Exception {
    Thread.sleep(200);
    return "Hello " + target;
  }
}

只是向参数中添加了`@SpanTag(“target”)`。

スクリーンショット 2018-02-20 13.50.06.png

各种类型的标签

因为Zipkin只能接收字符串形式的标签值,所以如果能转为JSON格式就应该这样发送。

@NewSpan("greeting-name")
public String greeting(@SpanTag(value = "name", resolver = AsJson.class) Name name) throws Exception {
  Thread.sleep(200);
  return "Hello " + name + ".";
}
@Component
public class AsJson implements TagValueResolver {

  ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json()
      .indentOutput(true)
      .build();

  @Override
  public String resolve(Object parameter) {
    if (parameter == null) {
      return null;
    }
    if (String.class.isAssignableFrom(parameter.getClass())) {
      return (String) parameter;
    }

    try {
      return objectMapper.writeValueAsString(parameter);
    } catch (JsonProcessingException e) {
      return null;
    }
  }
}

因为在我的环境中无法识别@SpanTag(key = “name”),所以我使用value=进行发送。
可能是别名处理出了问题,我会稍后检查代码。

我将检查JSON标签。

スクリーンショット 2018-02-20 14.02.19.png

看起来像个勇敢的人。

故障排除 (gù chú)

Zipkin服务器的V1版本的JSON格式不同。

JSON格式可以指定版本。

spring:
  zipkin:
    encoder: json_v1

在Zipkin服务器上显示的服务名称标签为空字符串。

据说,Zipkin的V1版本只会在标签中查看使用规定标签的服务名来显示标签。似乎它不会查看只有自定义标签的跨度中的服务名。更多信息请查看https://github.com/openzipkin/zipkin/issues/962。

在那里,我们将随意设定一个组件名称。

@Bean
@ConditionalOnProperty(name = "spring.zipkin.encoder", havingValue = "json_v1")
SpanAdjuster spanAdjuster() {
  return span -> {
    span.tag(Span.SPAN_LOCAL_COMPONENT_TAG_NAME, "my-component");
    return span;
  };
}

没问题。

在异步处理中中断

请参考公式参考资料。

我认为@Async默认情况下是连续的设置。

如果正在使用ExecutorService,

ExecutorService traceableExecutorService = new TraceableExecutorService(beanFactory, executorService);

只要使用,就没问题。

我希望在处理过程中添加标签。

有时候我们希望在无法使用标注进行指定的时间点上添加标签。

@Autowired
Tracer tracer

public void something() {
  tracer.addTag("$name", "$value");
}

这个可以。它将被标记为当前的Span。

广告
将在 10 秒后关闭
bannerAds