调用链追踪jaeger,调用链路追踪
追踪系统是谷歌发表的第一篇论文。
《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》
链路跟踪系统原理
追踪id合并请求形成一个链接:chromE-service A-service B-service C-service D-service e-service C-service A-chromE。完整的链接由服务之间的本地链接形成,并且每个本地链接由全球唯一的跟踪id标识。
Spanid表示请求从小到大的顺序。Spanid和parentid形成父子关系。通过在日志中嵌入点,找到具有相同跟踪id的日志,然后添加父id和span id,可以连接完整的请求调用链。
一些开源组件的地址:
推特zipkin-https://zipkin.io/github-https://github.com/open齐普金/齐普金/
优步耶格-https://www.jaeger tracing.io /
pinpoint-https://github.com/pinpoint-APM/pinpoint优步
walking.Apache.org/
Zipkin
比Jaeger更早的Zipkin是Google Dapper的开源版本,由Twitter进一步开发。基于ZipkinJava语言的APP应用。包括许多服务,每个服务都实现了zipkin特定的功能,并包括用于跟踪用户界面和软件系统框架的接口。每个服务还提供了一套永久存储数据的存储引擎,如内存数据库、MySQL、Cassandra和Elasticsearch。
Zipkin还提供了RabbitMQ、Scribe、HTTP和Kafka等传输机制,以及一个基于节点的服务器,用于在Cassandra中存储数据。Zipkin支持许多常见的高级语言,包括C#、Java和JavaScript。
Jaeger
优步写的,用Go语言写的。除了Zipkin特性集,Jaeger还提供了动态采样、REST API、基于ReactJS的UI接口,以及对Cassandra和Elasticsearch内存数据存储的支持。为了实现这些功能,Jaeger采取了比Zipkin更分散的方式。
Jaeger的体系结构包括跟踪代理、接收代理的入站跨度并将其路由到收集器的客户端。然后,收集器验证、转换并保留“跨度”。
Jaeger的分布式架构提供了高度的可扩展性。此外,耶格有自己的数据收集方法。与其他试图收集轨迹和跨度的系统不同,Jaeger对被监控的数据进行动态采样。这种方法不仅可以处理突然激增的流量,还可以提高Jaeger的整体性能。
Zipkin和Jaeger的优势
Zipkin成熟
Zipkin是一个更成熟的平台。它拥有广泛的行业支持和一个庞大而活跃的社区。Zipkin是用Java写的,非常适合企业环境。但是,它也支持大多数流行的高级语言。如果你不了解也不喜欢Java,那么这个不错。无论您选择哪种语言,Zipkin都支持开放式跟踪、OpenCensus和OpenTelemetry(这三种开放式跟踪框架),并且具有广泛的可扩展性选项和工具集成。
耶格的性能很高
Jaeger类似于Zipkin,但它有一些独特的功能。首先,它有一个更现代的设计和建筑。其更广泛分布的方法具有高灵活性和高性能。Jaeger为您提供了一个基于web的UI,您可以轻松地部署和扩展它。
Zipkin和Jaeger的劣势:
Zipkin的灵活性较低。
由于Zipkin是两者中较老的一个,其较老的设计使用了较低程度的模块化,并且比其新的竞争对手更慢、更不灵活。尽管这种差异对于较小的系统来说可能无关紧要,但当系统开始增长或需要快速扩展时,这可能会成为一个问题。Zipkin的低模块化设计缺乏新方法的灵活性,这可能会影响其整体性能。
Zipkin的核心组件是用Java编写的,这对任何重视稳定性而非性能的组织都非常有用。Zipkin提供了对很多开发语言的支持,但是不支持一些流行的语言(比如Python,Ruby,PHP)。
耶格很复杂,很难维护。
Jaeger可能会更新,但不一定会更好。其实很多人(尤其是企业IT部门的人)都会把Jaeger的相对不成熟视为一种劣势。Jaeger选择了Go作为它的主要语言。Go是作为系统语言来写的,但是远没有Java普及。这意味着你可能不得不学习一门新的语言,而不是一门已知的语言。
Jaeger的另一个有利也有弊的地方是它更现代的设计。这种架构在性能、可靠性和可伸缩性方面提供了许多好处,但是它也更加复杂和难以维护。
Zipkin和Jaeger的
抉择:
Zipkin和Jaeger拥有广泛的可扩展性选项和工具集成,并且都支持虚拟化和容器化。这两种工具都依赖于内存存储,并且面临类似的数据丢失问题。
对于重视稳定性的组织来说,Zipkin是更好的选择。它更成熟,拥有越来越大的社区。Zipkin拥有广泛的行业支持,其基于Java的开发使其适合当前的it世界。
Jaeger虽然不够成熟,但具有高速、高灵活、性能更高、更容易扩展的特点。
Zipkin Slim
ZipkinSlim的结构更小,启动速度更快。它支持内存和Elasticsearch存储,但不支持Kafka或RabbitMQ等消息传输。
Zipkin的整体架构图
仪器化客户端和仪器化服务器需要集成到分布式系统的特定服务中,收集跟踪信息,调用传输,并将跟踪信息发送到Zipkin的服务器。
Transport是Zipkin提供的外部接口,支持HTTP、Kafka、Scribe等通信方式。
Zipkin,即Zipkin服务器,主要包括四个模块:
收集器:用于接收各应用服务发送的跟踪信息;
存储:Zipkin的后端存储,支持In-Memory、MySql、Elasticsearch、Cassandra;
API:提供外部查询接口;
UI:提供外部Web界面。
Http跟踪序列图
Trace Instrumentationlan首先截获用户的请求/foo,并记录标签和时间戳。同时在头中加入跟踪信息,然后传递给后端服务进行处理。处理完成后会正常响应,Trace Instrumentationlan会拦截响应。记录处理延迟后,响应会正常返回给调用者,trace的跨度会异步发送给Zipkin服务器。Span中的TraceId是整个调用链中唯一的Id,用来唯一标识一个调用链。