zipkin入门
- 2019-03-31 11:05:00
- CJL 原创
- 6161
Zipkin分布式跟踪系统;它可以帮助收集时间数据,解决在microservice架构下的延迟问题;它管理这些数据的收集和查找;Zipkin的设计是基于谷歌的Google Dapper论文。
每个应用程序向Zipkin报告定时数据,Zipkin UI呈现了一个依赖图表来展示多少跟踪请求经过了每个应用程序;如果想解决延迟问题,可以过滤或者排序所有的跟踪请求,并且可以查看每个跟踪请求占总跟踪时间的百分比。
一、参考文档
https://segmentfault.com/a/1190000012342007
https://zipkin.io/pages/quickstart.html
二、安装
参考官方文档进行安装,docker安装和jar包启动都很简单。默认使用内存做存储,开发和测试环境下基本够用了。官方安装文档:https://zipkin.io/pages/quickstart.html
生产环境使用建议配合Elasticsearch做存储。参考:https://www.cnblogs.com/cowboys/p/7602755.html
三、基本概念
Trace:Zipkin使用Trace结构表示对一次请求的跟踪,一次请求可能由后台的若干服务负责处理,每个服务的处理是一个Span,Span之间有依赖关系,Trace就是树结构的Span集合;
Span:每个服务的处理跟踪是一个Span,可以理解为一个基本的工作单元,包含了一些描述信息:id,parentId,name,timestamp,duration,annotations等;
Traceid:标记一次请求的跟踪,相关的Spans都有相同的traceId;
Spanid:标记一次服务处理;
Name:span的名称,一般是接口方法的名称;
parentId:可选的id,当前Span的父Span id,通过parentId来保证Span之间的依赖关系,如果没有parentId,表示当前Span为根Span;可以间接计算调用服务层级;
kind:span类型,分为CLIENT和SERVER,用于在v2中替代cs\sr等;
Timestamp:Span创建时的时间戳,使用的单位是微秒(而不是毫秒),所有时间戳都有错误,包括主机之间的时钟偏差以及时间服务重新设置时钟的可能性;出于这个原因,Span应尽可能记录其duration;
Duration:持续时间使用的单位是微秒(而不是毫秒);
shared:是否与其他span共享信息,请求信息由服务器端和客户端双方组成的需为true;
localEndpoint:进入点信息,包含serviceName、ipv4、ipv6、port等,记录当前服务器信息。
Annotations:注释用于及时记录事件;有一组核心注释用于定义RPC请求的开始和结束;支持cs、sr、ss、cr等标记。v2中可通过kind与Duration替代。
tags:标签,可以用作附加信息的记录,可搜索。
一个v2样例:
[ { "traceId": "000585259d086c43", "id": "000585259d086c4f", "kind": "SERVER", "name": "app_xzfk_my_integralandgoods", "timestamp": 1553771478412400, "duration": 147863, "localEndpoint": { "serviceName": "test-wi***.xiaozhu.com", "ipv4": "10.0.0.172", "port": 443 }, "annotations": [ { "timestamp": 1553771478412405, "value": "sr" }, { "timestamp": 1553771478560252, "value": "ss" } ], "tags": { "SERVER_queryParams": "/app/xzfk/***/500/my/in***ndgoods?jsonp=api_my_integralandgoods&userId=70000**3545101&sessId=11b6e2583**92076690eea8c4565983a&jsonp=api_my_integralandgoods×tamp=1553771478796&_=1553771478632", "server_send": "api_my_integralandgoods({\"status\":200,\"content\":{\"integralInfo\":{\"totalIntegral\":1375,\"willExpireIntegral\":0,\"lastExpireDay\":\"2019-12-31\"},\"goodsInfo\":[{\"goodsId\":\"9883561758\",\"name\":\"30元住宿券\",\"imageUrl\":\"https:\\/\\/image.xiaozhustatic2.com\\/12\\/11,0,10,13095,1200,800,03aa87d8.jpg\",\"goodsStock\":[{\"price\":3000,\"discountPrice\":null,\"dealtype\":\"exchange\"}]},{\"goodsId\":\"36067541100\",\"name\":\"60元住宿券\",\"imageUrl\":\"https:\\/\\/image.xiaozhustatic2.com\\/12\\/15,0,66,31556,1200,800,3360a592.jpg\",\"goodsStock\":[{\"price\":6000,\"discountPrice\":5000,\"dealtype\":\"exchange\"},{\"price\":10,\"discountPrice\":5000,\"dealtype\":\"lottery\"}]},{\"goodsId\":\"36067643600\",\"name\":\"100元住宿券\",\"imageUrl\":\"https:\\/\\/image.xiaozhustatic3.com\\/12\\/15,0,34,31588,1200,800,c2762078.jpg\",\"goodsStock\":[{\"price\":10000,\"discountPrice\":1000,\"dealtype\":\"exchange\"}]},{\"goodsId\":\"36067708100\",\"name\":\"150元住宿券\",\"imageUrl\":\"https:\\/\\/image.xiaozhustatic3.com\\/12\\/15,0,8,31508,1200,800,f015ae96.jpg\",\"goodsStock\":[{\"price\":15000,\"discountPrice\":1500,\"dealtype\":\"exchange\"}]},{\"goodsId\":\"36067836500\",\"name\":\"200元住宿券\",\"imageUrl\":\"https:\\/\\/image.xiaozhustatic2.com\\/12\\/15,0,27,31843,1200,800,40891224.jpg\",\"goodsStock\":[{\"price\":20000,\"discountPrice\":2000,\"dealtype\":\"exchange\"}]},{\"goodsId\":\"36067926600\",\"name\":\"240元住宿券\",\"imageUrl\":\"https:\\/\\/image.xiaozhustatic2.com\\/12\\/15,0,23,31862,1200,800,4de24717.jpg\",\"goodsStock\":[{\"price\":24000,\"discountPrice\":2400,\"dealtype\":\"exchange\"}]},{\"goodsId\":\"14311327800\",\"name\":\"小猪发票包邮券\",\"imageUrl\":\"https:\\/\\/image.xiaozhustatic2.com\\/12\\/11,0,58,13415,1200,800,ffd838a2.jpg\",\"goodsStock\":[{\"price\":700,\"discountPrice\":null,\"dealtype\":\"exchange\"}]},{\"goodsId\":\"21275712800\",\"name\":\"5元小猪保洁券\",\"imageUrl\":\"https:\\/\\/image.xiaozhustatic3.com\\/12\\/11,0,39,13159,1200,800,b0708429.jpg\",\"goodsStock\":[{\"price\":500,\"discountPrice\":5,\"dealtype\":\"exchange\"}]}]}})" }, "debug": true, "shared": true } ]
四、Zipkin v1与v2
zipkinV1与V2的数据格式有一定差异,现在网上的资料大部分都是v1的可能会对我们学习的过程中造成一些困扰。尽量参考官网和代码实现,需要注意的是官网的Data Model样例是错误的。
binaryAnnotations V2中好像已经没了,可以使用tags进行替代。
annotations中的cs、sr、ss、cr概念在V2中也可以通过kind去替代。
cs:Client Send,客户端发起请求; sr:Server Receive,服务器接受请求,开始处理; ss:Server Send,服务器完成处理,给客户端应答; cr:Client Receive,客户端接受应答从服务器;
五、Api
参考官方文档:https://zipkin.io/zipkin-api/#/default/post_spans
在生成API文档等整理性工作时,我们可以通过zipkin的接口查询一些我们的日志信息进行分析工作,此处我们以traces接口为例。
样例PHP代码
function getResponseFromZipkin($action, $limit = 10) { $zipkinServer = 'http://10.0.2.1:9411'; $queryUrl = '/api/v2/traces'; $queryParams = [ 'spanName' => strtolower($action), //'annotationQuery' => '', 'limit' => $limit, 'sortOrder' => 'timestamp-desc', //'startTs' => (time()-(60*60*24*10))*1000, //'endTs' => time()*1000, 'lookback' => 6048000000, //70天 ]; $url = $zipkinServer . $queryUrl . '?' . http_build_query($queryParams); $contents = file_get_contents($url); $traceData = json_decode($contents, true); return $traceData; }
在调用过程中需要注意的是startTs、endTs可以不填,通过lookback以当前时间为准往前查找一定的时候。