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&timestamp=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以当前时间为准往前查找一定的时候。



发表评论
评论通过审核后显示。
流量统计