概述
Zipkin is a distributed tracing system. It helps gather timing data needed to troubleshoot latency problems in microservice architectures. It manages both the collection and lookup of this data. Zipkin’s design is based on the Google Dapperpaper.
Zipkin是一款开源的分布式实时数据追踪系统(Distributed Tracking System),基于 Google Dapper的论文设计而来,由 Twitter 公司开发贡献。其主要功能是聚集来自各个异构系统的实时监控数据。
Zipkin主要包括四个模块
- Collector 接收或收集各应用传输的数据
- Storage 存储接受或收集过来的数据,当前支持Memory,MySQL,Cassandra,ElasticSearch等,默认存储在内存中。
- API(Query) 负责查询Storage中存储的数据,提供简单的JSON API获取数据,主要提供给web UI使用
- Web 提供简单的web界面
安装
一、下载ZIPKIN-SERVER
点击下面的链接下载
https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec
或者我上传的这个 https://download.csdn.net/download/waterdemo/10600247
二、启动ZIPKIN-SERVER
1.启动
使用JAVA命令启动该JAR,zipkin-server.jar是一个打包好的springBoot应用,springBoot自带tomcat因此只要启动JAR包就可以访问了。
java -jar zipkin-server-xxx.jar
启动完后访问localhost:9411可以查看统计界面。
2.持久化操作
zipkin默认数据是存在内存中,简单的测试可以放在内存中,这里做一下持久化操作保存在库中。
ZIPKIN支持MYSQL、cassandra、elasticsearch 三个组件,在这里我们使用MYSQL
创建一个库zipkin,运行下面的SQL代码建表,这个语句来自官网:
CREATE TABLE IF NOT EXISTS zipkin_spans (
`trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',
`trace_id` BIGINT NOT NULL,
`id` BIGINT NOT NULL,
`name` VARCHAR(255) NOT NULL,
`parent_id` BIGINT,
`debug` BIT(1),
`start_ts` BIGINT COMMENT 'Span.timestamp(): epoch micros used for endTs query and to implement TTL',
`duration` BIGINT COMMENT 'Span.duration(): micros used for minDuration and maxDuration query'
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
ALTER TABLE zipkin_spans ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `id`) COMMENT 'ignore insert on duplicate';
ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`, `id`) COMMENT 'for joining with zipkin_annotations';
ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTracesByIds';
ALTER TABLE zipkin_spans ADD INDEX(`name`) COMMENT 'for getTraces and getSpanNames';
ALTER TABLE zipkin_spans ADD INDEX(`start_ts`) COMMENT 'for getTraces ordering and range';
CREATE TABLE IF NOT EXISTS zipkin_annotations (
`trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',
`trace_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.trace_id',
`span_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.id',
`a_key` VARCHAR(255) NOT NULL COMMENT 'BinaryAnnotation.key or Annotation.value if type == -1',
`a_value` BLOB COMMENT 'BinaryAnnotation.value(), which must be smaller than 64KB',
`a_type` INT NOT NULL COMMENT 'BinaryAnnotation.type() or -1 if Annotation',
`a_timestamp` BIGINT COMMENT 'Used to implement TTL; Annotation.timestamp or zipkin_spans.timestamp',
`endpoint_ipv4` INT COMMENT 'Null when Binary/Annotation.endpoint is null',
`endpoint_ipv6` BINARY(16) COMMENT 'Null when Binary/Annotation.endpoint is null, or no IPv6 address',
`endpoint_port` SMALLINT COMMENT 'Null when Binary/Annotation.endpoint is null',
`endpoint_service_name` VARCHAR(255) COMMENT 'Null when Binary/Annotation.endpoint is null'
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
ALTER TABLE zipkin_annotations ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `span_id`, `a_key`, `a_timestamp`) COMMENT 'Ignore insert on duplicate';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`, `span_id`) COMMENT 'for joining with zipkin_spans';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTraces/ByIds';
ALTER TABLE zipkin_annotations ADD INDEX(`endpoint_service_name`) COMMENT 'for getTraces and getServiceNames';
ALTER TABLE zipkin_annotations ADD INDEX(`a_type`) COMMENT 'for getTraces';
ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT 'for getTraces';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id`, `span_id`, `a_key`) COMMENT 'for dependencies job';
CREATE TABLE IF NOT EXISTS zipkin_dependencies (
`day` DATE NOT NULL,
`parent` VARCHAR(255) NOT NULL,
`child` VARCHAR(255) NOT NULL,
`call_count` BIGINT
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
ALTER TABLE zipkin_dependencies ADD UNIQUE KEY(`day`, `parent`, `child`);
3.使用附加参数的启动
官方参数说明:
`MYSQL_DB`: The database to use. Defaults to "zipkin".
`MYSQL_USER` and `MYSQL_PASS`: MySQL authentication, which defaults to empty string.
`MYSQL_HOST`: Defaults to localhost
`MYSQL_TCP_PORT`: Defaults to 3306
`MYSQL_MAX_CONNECTIONS`: Maximum concurrent connections, defaults to 10
`MYSQL_USE_SSL`: Requires `javax.net.ssl.trustStore` and `javax.net.ssl.trustStorePassword`, defaults to false.
启动示例:
java -DSTORAGE_TYPE=mysql -DMYSQL_USER=root -DMYSQL_PASS=root -DMYSQL_DB=zipkin -jar zipkin-server-x.x.x-exec.jar
三、配置ZIPKIN
ZIPKIN支持追踪多种RPC框架,不仅仅是DUBBO,我们的项目是dubbo的rpc,这里我们使用dubbo来配置
1、首先添加依赖包:
<dependency>
<groupId>com.github.jessyZu</groupId>
<artifactId>dubbo-zipkin-spring-starter</artifactId>
<version>1.0.2</version>
</dependency>
PS: 1.dubbo-zipkin-start的GITHUB地址:https://github.com/jessyZu/dubbo-zipkin-spring-starter
2.dubbo-zipkin-spring-starter是基于springboot的包,使用其他框架请注意
2、ZIPKIN配置
在我们的配置文件中加入zipkin的配置
spring.sleuth.sampler.percentage=1 //这个是采样率,配置为1表示100% 0.5为50%
spring.zipkin.base-url=http://ip:9411 //这个是你的zipkin-server.jar包所在的服务器地址,表示收集来的追踪数据发送给该程序。
至此结束,访问ui界面可以看到记录的调用请求。
还可以使用docker,具体操作请参考:
https://github.com/openzipkin/docker-zipkin
使用
打开Zipkin Web UI界面,点击 Find Traces,显示如下界面:
可以看到整个请求的调用时间,每个调用链的分段耗时。继续点击可以看到跟踪栈的详细信息 ,点击页面右上角的JSON,可以看到该Trace的所有数据
这样我们就很容易排查出调用链中耗时多的做针对性处理了。
其它
官方GTIHUB
https://github.com/openzipkin/zipkin/tree/master/zipkin-server
zipkin介绍