Trace: 一次服务调用追踪链路。
Span: 追踪服务调基本结构,多span形成树形结构组合成一次Trace追踪记录。
Annotation: 在span中的标注点,记录整个span时间段内发生的事件。
BinaryAnnotation: 属于Annotation一种类型和普通Annotation区别,这键值对形式标注在span中发生的事件,和一些其他相关的信息。
日志收集方式与CAT类似。支持自适应采样,规则粗暴简单,对于每秒钟的请求次数进行统计,如果超过100,就按照10%的比率进行采样。
开源项目已于2013年6月停止维护。
Twitter—OpenZipkin功能、数据跟踪模型与hydra类似。Zipkin本身不开源,开源社区的是另外一套scala实现,依托于finagle这个RPC框架。架构如下:
Zipkin与其他Trace系统的不同之处在于:
Zipkin中针对 HttpClient、jax-rs2、jersey/jersey2等HTTP客户端封装了拦截器。可以在较小的代码侵入条件下实现URl请求的拦截、时间统计和日志记录等操作。
日志收集Cat是直接将日志发往消费集群;hydra是发给日志收集器,日志收集器推到消息队列;Zipkin的client将统计日志发往消息队列,日志收集器读取后落地存储;Dapper和Eagle eye是记录本地文件,后台进程定期扫描。
Trace系统现状分析以上几款链路跟踪系统都各自满足了请求链路追踪的功能,但落实到我们自己的生产环境中时,这些Trace系统存在诸多问题:Google和alibaba的Trace系统不开源,但现阶段来说阿里是做得最好的,如果用的是阿里的服务器,可考虑直接用阿里的追踪系统以节省开发代价;
京东和点评的虽然开源,但是已经多年没有维护,项目依赖的jdk版本以及第三方框架过于陈旧等等,不适合用在生产环境中;
Twitter的OpenZipkin使用scala开发,而且其实现基于twitter内部的RPC框架finagle,第三方依赖比较多,接入和运维的成本非常高。
如果不是用阿里的服务,我们可以借鉴这些开源实现的思想, 自行开发Trace系统。那是自己从0开始开发还是基于开源方案二次开发? 这里面也要考虑到跨平台,如NET和java环境,尽量减少原系统的侵入性或只需要更改少量的代码即可接入,在这里可以基于zipkin和pinpoint进行二次开发,功能可参考阿里的系统。
Zipkin 和 Pinpoint 选型对比Pinpoint 与 Zipkin 都是基于 Google Dapper 的那篇论文,因此理论基础大致相同。Pinpoint 与 Zipkin 有明显的差异,主要体现在如下几个方面:
Pinpoint 是一个完整的性能监控解决方案:有从探针、收集器、存储到 Web 界面等全套体系;而 Zipkin 只侧重收集器和存储服务,虽然也有用户界面,但其功能与 Pinpoint 不可同日而语。反而 Zipkin 提供有 Query 接口,更强大的用户界面和系统集成能力,可以基于该接口二次开发实现。
Zipkin 官方提供有基于 Finagle 框架(Scala 语言)的接口,而其他框架的接口由社区贡献,目前可以支持 Java、Scala、Node、Go、Python、Ruby 和 C# 等主流开发语言和框架;但是 Pinpoint 目前只有官方提供的 Java Agent 探针,其他的都在请求社区支援中。
Pinpoint 提供有 Java Agent 探针,通过字节码注入的方式实现调用拦截和数据收集,可以做到真正的代码无侵入,只需要在启动服务器的时候添加一些参数,就可以完成探针的部署;而 Zipkin 的 Java 接口实现 Brave,只提供了基本的操作 API,如果需要与框架或者项目集成的话,就需要手动添加配置文件或增加代码。
Pinpoint 的后端存储基于 HBase,而 Zipkin 基于 Cassandra。
接入难度