全链路监控工具pinpoint与zipkin

zipkin:由Twitter公司开源,开放源代码分布式的跟踪系统,用于收集服务的定时数据,以解决微服务架构中的延迟问题,包括:数据的收集、存储、查找和展现。

Pinpoint:一款对Java编写的大规模分布式系统的APM工具,由韩国人开源的分布式跟踪组件。

全面的调用链路数据分析

全面的调用链路数据分析,提供代码级别的可见性以便轻松定位失败点和瓶颈。

zipkin

zipkin的链路监控粒度相对没有那么细,调用链中具体到接口级别,再进一步的调用信息并未涉及。

pinpoint

pinpoint应该是这三种APM组件中,数据分析最为完备的组件。提供代码级别的可见性以便轻松定位失败点和瓶颈,上图可以看到对于执行的sql语句,都进行了记录。还可以配置报警规则等,设置每个应用对应的负责人,根据配置的规则报警,支持的中间件和框架也比较完备。

pinpoint与zipkin差异性

1. Pinpoint 是一个完整的性能监控解决方案有从探针、收集器、存储到 Web 界面等全套体系,而Zipkin只侧重收集器和存储服务,虽然也有用户界面,但其功能与Pinpoint不可同日而语。反而Zipkin提供有Query接口,更强大的用户界面和系统集成能力,可以基于该接口二次开发实现。

2. Zipkin 官方提供有基于 Finagle 框架(Scala 语言)的接口而其他框架的接口由社区贡献,目前可以支持 Java、Scala、Node、Go、Python、Ruby 和 C# 等主流开发语言和框架;但是 Pinpoint 目前只有官方提供的 Java Agent 探针,其他的都在请求社区支援中。

3. Pinpoint 提供有 Java Agent 探针通过字节码注入的方式实现调用拦截和数据收集,可以做到真正的代码无侵入,只需要在启动服务器的时候添加一些参数,就可以完成探针的部署,而 Zipkin的Java接口实现 Brave,只提供了基本的操作 API,如果需要与框架或者项目集成的话,就需要手动添加配置文件或增加代码。

4. Pinpoint 的后端存储基于 Hbase而 Zipkin 基于 Cassandra

 pinpoint与zipkin相似性

pinpoint与zipkin都是基于Google Dapper的那篇论文,因此理论基础大致相同。两者都是将服务调用拆分成若干有级联关系的Span,通过SpanId和ParentSpanId来进行调用关系的级联,最后再将整个调用链流经的所有的Span汇聚成一个 Trace,报告给服务端的collector进行收集和存储。

即便在这一点上,Pinpoint 所采用的概念也不完全与那篇论文一致。比如他采用 TransactionId 来取代 TraceId,而真正的 TraceId 是一个结构,里面包含了 TransactionId, SpanId 和 ParentSpanId。而且 Pinpoint 在 Span 下面又增加了一个 SpanEvent 结构,用来记录一个 Span 内部的调用细节(比如具体的方法调用等等),因此 Pinpoint 默认会比 Zipkin 记录更多的跟踪数据。但是理论上并没有限定 Span 的粒度大小,所以一个服务调用可以是一个 Span,那么每个服务中的方法调用也可以是个 Span,这样的话,其实 Brave 也可以跟踪到方法调用级别,只是具体实现并没有这样做而已。

span是什么?

基本工作单元,一次链路调用(可以是RPC,DB等没有特定的限制)创建一个span,通过一个64位ID标识它,uuid较为方便,span中还有其他的数据,例如描述信息,时间戳,key-value对的(Annotation)tag信息,parent_id等,其中parent-id可以表示span调用链路来源。

全链路监控工具pinpoint与zipkin

上图说明了span在一次大的跟踪过程中是什么样的。Dapper记录了span名称,以及每个span的ID和父ID,以重建在一次追踪过程中不同span之间的关系。如果一个span没有父ID被称为root span。所有span都挂在一个特定的跟踪上,也共用一个跟踪id。

Span数据结构:

type Span struct {

    TraceID    int64  #用于标示一次完整的请求id

    Name       string

    ID         int64  #当前这次调用span_id

    ParentID   int64  #上层服务的调用span_id  最上层服务parent_id为null

    Annotation []Annotation  #用于标记的时间戳

    Debug      bool

}

Trace是什么?

类似于 树结构的Span集合,表示一次完整的跟踪,从请求到服务器开始,服务器返回response结束,跟踪每次rpc调用的耗时,存在唯一标识trace_id。比如:你运行的分布式大数据存储一次Trace就由你的一次请求组成。

全链路监控工具pinpoint与zipkin

每种颜色的note标注了一个span,一条链路通过TraceId唯一标识,Span标识发起的请求信息。树节点是整个架构的基本单元,而每一个节点又是对span的引用。节点之间的连线表示的span和它的父span直接的关系。虽然span在日志文件中只是简单的代表span的开始和结束时间,他们在整个树形结构中却是相对独立的。

上一篇:spring-cloud-sleuth-zipkin实现微服务的链路跟踪


下一篇:Win10下安装Zipkin