zipkin是Twitter基于google的分布式监控系统Dapper(论文)的开发源实现,zipkin用于跟踪分布式服务之间的应用数据链路,分析处理延时,帮助咱们改进系统的性能和定位故障。html
Instrumented client和Instrumented server是分布式系统中的服务,经过装备库采集跟踪信息,装备库再调用Transport,把跟踪信息发送给zipkin。git
针对不一样语言,不一样RPC框架,有不一样的装备库实现,目前已有实现列表见此,其中Brave是zipkin官方提供的Java的装备库。
一个装备库的实现须要考虑以下状况:github
Transport是zipkin对外提供的接口,目前有HTTP、Kafka、Scribe三种。json
v2版本:
api
一个Span就是记录[remoteEndpoint.serviceName]服务的[Span.name]方法的执行过程,其中的annotation记录了中间的一些事件发生时间,经过这些时间能够获得[Span.name]方法的网络传输时间,服务端执行时间,客户端响应时间等信息,从而对其进行诊断优化。多个Span经过parentId构成一个树形结构,根Span的parentId为空,描述了一次trace(tranceId标识)中多个服务之间的调用过程。网络
https://github.com/zhongpan/zipkin-ice
数据结构
假设service1.fun1中调用service2.fun2和service3.fun3,service2.fun2中调用service4.fun4。本次跟踪各个服务中会建立如上的span1~span7,span1为根span。span2和span4为一次RPC的客户端和服务端行为,能够共享spanid,span4不用新生成spanid,span2和span4在zipkin中会合并为1个span,span3/span5以及span6/span7相似。最终,在zipkin界面展现的树形结构为:
架构