开源链路追踪系统如何选型

本文涉及的产品
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
简介: 【2月更文挑战第10天】

业界比较有名的服务追踪系统实现有阿里的鹰眼、Twitter 开源的 OpenZipkin,还有 Naver 开源的 Pinpoint,它们都是受 Google 发布的 Dapper 论文启发而实现的。


OpenZipkin 是 Twitter 开源的服务追踪系统,下面这张图展示了它的架构设计。

image.png

从图中看,OpenZipkin 主要由四个核心部分组成。

  • Collector:负责收集探针 Reporter 埋点采集的数据,经过验证处理并建立索引。
  • Storage:存储服务调用的链路数据,默认使用的是 Cassandra,是因为 Twitter 内部大量使用了 Cassandra,你也可以替换成 Elasticsearch 或者 MySQL。
  • API:将格式化和建立索引的链路数据以 API 的方式对外提供服务,比如被 UI 调用。
  • UI:以图形化的方式展示服务调用的链路数据。


它的工作原理可以用下面这张图来描述。

image.png

具体流程是,通过在业务的 HTTP Client 前后引入服务追踪代码,这样在 HTTP 方法“/foo”调用前,生成 trace 信息:TraceId:aa、SpanId:6b、annotation:GET /foo,以及当前时刻的 timestamp:1483945573944000,然后调用结果返回后,记录下耗时 duration,之后再把这些 trace 信息和 duration 异步上传给 Zipkin Collector。


Pinpoint 是 Naver 开源的一款深度支持 Java 语言的服务追踪系统,下面这张图是它的架构设计。

image.png

Pinpoint 主要也由四个部分组成。

  • Pinpoint Agent:通过 Java 字节码注入的方式,来收集 JVM 中的调用数据,通过 UDP 协议传递给 Collector,数据采用 Thrift 协议进行编码。
  • Pinpoint Collector:收集 Agent 传过来的数据,然后写到 HBase Storgage。
  • HBase Storage:采用 HBase 集群存储服务调用的链路信息。
  • inpoint Web UI:通过 Web UI 展示服务调用的详细链路信息。


它的工作原理你可以看这张图。

image.png

具体来看,就是请求进入 TomcatA,然后生成 TraceId:TomcatA^ TIME ^ 1、SpanId:10、pSpanId:-1(代表是根请求),接着 TomatA 调用 TomcatB 的 hello 方法,TomcatB 生成 TraceId:TomcatA^ TIME ^1、新的 SpanId:20、pSpanId:10(代表是 TomcatA 的请求),返回调用结果后将 trace 信息发给 Collector,TomcatA 收到调用结果后,将 trace 信息也发给 Collector。Collector 把 trace 信息写入到 HBase 中,Rowkey 就是 traceId,SpanId 和 pSpanId 都是列。然后就可以通过 UI 查询调用链路信息了。


考察服务追踪系统主要从下面这几个方面。

1、埋点探针支持平台的广泛性

OpenZipkin 和 Pinpoint 都支持哪些语言平台呢?


OpenZipkin 提供了不同语言的 Library,不同语言实现时需要引入不同版本的 Library。


官方提供了 C#、Go、Java、JavaScript、Ruby、Scala、PHP 等主流语言版本的 Library,而且开源社区还提供了更丰富的不同语言版本的 Library;而 Pinpoint 目前只支持 Java 语言。


所以从探针支持的语言平台广泛性上来看,OpenZipkin 比 Pinpoint 的使用范围要广,而且开源社区很活跃,生命力更强。


2、系统集成难易程度

以 OpenZipkin 的 Java 探针 Brave 为例,它只提供了基本的操作 API,如果系统要想集成 Brave,必须在配置里手动里添加相应的配置文件并且增加 trace 业务代码。具体来讲,就是你需要先修改工程的 POM 依赖,以引入 Brave 相关的 JAR 包。

<dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>io.zipkin.brave</groupId>
        <artifactId>brave-bom</artifactId>
        <version>${brave.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

然后假如你想收集每一次 HTTP 调用的信息,你就可以使用 Brave 在 Apache Httpclient 基础上封装的 httpClient,它会记录每一次 HTTP 调用的信息,并上报给 OpenZipkin。

httpclient =TracingHttpClientBuilder.create(tracing).build();

而 Pinpoint 是通过字节码注入的方式来实现拦截服务调用,从而收集 trace 信息的,所以不需要代码做任何改动。Java 字节码注入的大致原理你可以参考下图。

image.png

就是 JVM 在加载 class 二进制文件时,动态地修改加载的 class 文件,在方法的前后执行拦截器的 before() 和 after() 方法,在 before() 和 after() 方法里记录 trace() 信息。而应用不需要修改业务代码,只需要在 JVM 启动时,添加类似下面的启动参数就可以了。

-javaagent:$AGENT_PATH/pinpoint-bootstrap-$VERSION.jar
-Dpinpoint.agentId=<Agent's UniqueId>
-Dpinpoint.applicationName=<The name indicating a same service (AgentId collection)

所以从系统集成难易程度上看,Pinpoint 要比 OpenZipkin 简单。


3、调用链路数据的精确度

从下面这张 OpenZipkin 的调用链路图可以看出,OpenZipkin 收集到的数据只到接口级别,进一步的信息就没有了

image.png

来看下 Pinpoint,因为 Pinpoint 采用了字节码注入的方式实现 trace 信息收集,所以它能拿到的信息比 OpenZipkin 多得多。从下面这张图可以看出,它不仅能够查看接口级别的链路调用信息,还能深入到调用所关联的数据库信息。

image.png

同理在绘制链路拓扑图时,OpenZipkin 只能绘制服务与服务之间的调用链路拓扑图,比如下面这张示意图。

image.png

而 Pinpoint 不仅能够绘制服务与服务之间,还能绘制与 DB 之间的调用链路拓扑图,比如下图。

image.png

所以,从调用链路数据的精确度上看,Pinpoint 要比 OpenZipkin 精确得多。


从选型的角度来讲,如果你的业务采用的是 Java 语言,那么采用 Pinpoint 是个不错的选择,因为它不需要业务改动一行代码就可以实现 trace 信息的收集。除此之外,Pinpoint 不仅能看到服务与服务之间的链路调用,还能看到服务内部与资源层的链路调用,功能更为强大,如果你有这方面的需求,Pinpoint 正好能满足。


如果你的业务不是 Java 语言实现,或者采用了多种语言,那毫无疑问应该选择 OpenZipkin,并且,由于其开源社区很活跃,基本上各种语言平台都能找到对应的解决方案。不过想要使用 OpenZipkin,还需要做一些额外的代码开发工作,以引入 OpenZipkin 提供的 Library 到你的系统中。

相关实践学习
基于OpenTelemetry构建全链路追踪与监控
本实验将带领您快速上手可观测链路OpenTelemetry版,包括部署并接入多语言应用、体验TraceId自动注入至日志以实现调用链与日志的关联查询、以及切换调用链透传协议以满足全链路打通的需求。
分布式链路追踪Skywalking
Skywalking是一个基于分布式跟踪的应用程序性能监控系统,用于从服务和云原生等基础设施中收集、分析、聚合以及可视化数据,提供了一种简便的方式来清晰地观测分布式系统,具有分布式追踪、性能指标分析、应用和服务依赖分析等功能。 分布式追踪系统发展很快,种类繁多,给我们带来很大的方便。但在数据采集过程中,有时需要侵入用户代码,并且不同系统的 API 并不兼容,这就导致了如果希望切换追踪系统,往往会带来较大改动。OpenTracing为了解决不同的分布式追踪系统 API 不兼容的问题,诞生了 OpenTracing 规范。OpenTracing 是一个轻量级的标准化层,它位于应用程序/类库和追踪或日志分析程序之间。Skywalking基于OpenTracing规范开发,具有性能好,支持多语言探针,无侵入性等优势,可以帮助我们准确快速的定位到线上故障和性能瓶颈。 在本套课程中,我们将全面的讲解Skywalking相关的知识。从APM系统、分布式调用链等基础概念的学习加深对Skywalking的理解,从0开始搭建一套完整的Skywalking环境,学会对各类应用进行监控,学习Skywalking常用插件。Skywalking原理章节中,将会对Skywalking使用的agent探针技术进行深度剖析,除此之外还会对OpenTracing规范作整体上的介绍。通过对本套课程的学习,不止能学会如何使用Skywalking,还将对其底层原理和分布式架构有更深的理解。本课程由黑马程序员提供。
相关文章
|
存储 Web App开发 消息中间件
原来10张图就可以搞懂分布式链路追踪系统原理
原来10张图就可以搞懂分布式链路追踪系统原理
原来10张图就可以搞懂分布式链路追踪系统原理
|
7月前
|
存储 Web App开发 运维
原来10张图就可以搞懂分布式链路追踪系统原理
原来10张图就可以搞懂分布式链路追踪系统原理
|
算法 数据可视化 Java
微服务下的分布式链路追踪系统Sleuth+Zipkin
微服务下的分布式链路追踪系统Sleuth+Zipkin
|
Prometheus 监控 Cloud Native
Go微服务架构实战 下篇:1. gRPC + Opentracing + Zipkin实现分布式链路追踪系统
Go微服务架构实战 下篇:1. gRPC + Opentracing + Zipkin实现分布式链路追踪系统
|
Dubbo Java 应用服务中间件
Dubbo日志链路追踪TraceId选型
开发排查系统问题用得最多的手段就是查看系统日志,但是在分布式环境下使用日志定位问题还是比较麻烦,需要借助全链路追踪ID把上下文串联起来,本文主要分享基于Spring Boot + Dubbo框架下日志链路追踪ID的实现方案选型思路
4761 0
Dubbo日志链路追踪TraceId选型
|
监控 网络协议 Java
分布式链路追踪- SkyWalking使用手册
分布式链路追踪- SkyWalking使用手册
1233 0
分布式链路追踪- SkyWalking使用手册
|
4月前
|
存储 监控 开发者
分布式链路监控系统问题之系统拆分后链路追踪技术的问题如何解决
分布式链路监控系统问题之系统拆分后链路追踪技术的问题如何解决
|
7月前
|
消息中间件 SpringCloudAlibaba Java
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(八)Config服务配置+bus消息总线+stream消息驱动+Sleuth链路追踪
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(八)Config服务配置+bus消息总线+stream消息驱动+Sleuth链路追踪
1016 0
|
存储 监控 数据可视化
Golang链路追踪:实现高效可靠的分布式系统监控
Golang链路追踪:实现高效可靠的分布式系统监控
|
消息中间件 监控 安全
RocketMQ x OpenTelemetry 分布式全链路追踪最佳实践(3)
RocketMQ x OpenTelemetry 分布式全链路追踪最佳实践
151 0
RocketMQ x OpenTelemetry 分布式全链路追踪最佳实践(3)

热门文章

最新文章