以最小的步骤引入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 # 昔の名残でプロパティ名がパーセンテージになっていますが、割合指定らしいです。

访问 http://localhost:9411/



只需添加依赖库就完成了这些步骤。
如果发送目标不是默认的话,我们会指定发送目标。
添加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;
}
}

添加标签
@Service
static class DemoService {
@NewSpan("greeting")
String greeting(@SpanTag("target") String target) throws Exception {
Thread.sleep(200);
return "Hello " + target;
}
}
只是向参数中添加了`@SpanTag(“target”)`。

各种类型的标签
因为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标签。

看起来像个勇敢的人。
故障排除 (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。