服务链路追踪sleuth 集成zipkin

前面介绍了sleuth链路追踪。

本文使用zipkin来分析调用链,以及各阶段的耗时等问题。

简介

Zipkin是一个分布式追踪系统。 它有助于收集解决微服务架构中延迟问题所需的时序数据。
它负责数据收集、存储(第三方存储mysql、cassandra、elasticsearch)、分析。Zipkin的设计基于Google Dapper论文

应用程序通过http、消息中间件等向zipkin server上报数据。
可通过Zipkin UI 查看依赖关系图,调用链,耗时等信息。

zipkin主要有四大组件构成

  • collector: 收集器。对数据进行验证、存储、索引,方便后续使用。
  • storage: 存储。保存收集器收集的追踪数据,默认保存到内存中,可选择使用Cassandra、ElasticSearch、MySQL。
  • search: 从存储中查询和检索追踪信息的API。主要被web UI使用。
  • web UI: 基于service, time, and annotations来查询追踪信息。不过该UI没有自带权限验证。

下面是用户通过http调用资源/foo的追踪示例。(摘自官网
当用户收到资源/foo的返回后,会异步将生成的span发送的zipkin server。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
┌─────────────┐ ┌───────────────────────┐  ┌─────────────┐  ┌──────────────────┐
User Code Trace Instrumentation Http Client Zipkin Collector
└─────────────┘ └───────────────────────┘ └─────────────┘ └──────────────────┘

┌─────────┐
──┤GET /foo ├─▶ ────┐
└─────────┘ record tags
◀───┘
────┐
add trace headers
◀───┘
────┐
record timestamp
◀───┘
┌─────────────────┐
──┤GET /foo ├─▶
│X-B3-TraceId: aa ────┐
│X-B3-SpanId: 6b
└─────────────────┘ invoke
request


┌────────┐ ◀───┘
◀─────┤200 OK ├───────
────┐ └────────┘
record duration
┌────────┐ ◀───┘
◀──┤200 OK ├──
└────────┘ ┌────────────────────────────────┐
──┤ asynchronously report span ├────▶

│{
"traceId": "aa",
"id": "6b",
"name": "get",
"timestamp": 1483945573944000,│
"duration": 386000,
"annotations": [
│--snip--
└────────────────────────────────┘

创建zipkin server

1
2
curl -sSL https://zipkin.io/quickstart.sh | bash -s
java -jar zipkin.jar
  • docker
1
docker run -d -p 9411:9411 openzipkin/zipkin
  • 自己构建项目
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-server</artifactId>
<version>2.9.0</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</exclusion>
<exclusion>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-metrics-prometheus</artifactId>
</exclusion>
</exclusions>
</dependency>

<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
<version>2.9.0</version>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.wekri.cloud.zipkinserver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import zipkin.server.internal.EnableZipkinServer;

@EnableZipkinServer
@SpringBootApplication
public class ZipkinServerApplication {

public static void main(String[] args) {
SpringApplication.run(ZipkinServerApplication.class, args);
}
}

启动后可查看ui http://host:ip/zipkin

数据上报

添加依赖

1
2
3
4
5
6
7
8
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>

配置zipkin server地址:

1
2
3
4
5
spring:
application:
name: serviceA
zipkin:
base-url: http://192.168.3.37:9411

查看

打开zipki UI

示例:http://docssleuth-zipkin-server.cfapps.io/zipkin/

zipkin API

https://zipkin.io/zipkin-api/

本文源码

资料:
https://github.com/spring-cloud/spring-cloud-sleuth#sleuth-adding-project
https://github.com/openzipkin/zipkin
https://github.com/openzipkin/zipkin/blob/master/zipkin-storage/mysql-v1/src/main/resources/mysql.sql
https://zipkin.io/


服务链路追踪sleuth 集成zipkin
https://www.wekri.com/springcloud/springCloudSleuth-zipkin/
Author
Echo
Posted on
June 11, 2018
Licensed under