zipkin的使用

概述

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、cassandraelasticsearch 三个组件,在这里我们使用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介绍

https://zipkin.io/pages/instrumenting.html

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值