APM工具对比

APM工具对比

本文转自:APM工具对比

市面上有很多分布式链路监控的工具,客观对比。

调研

市面上的APM(Application Performance Management)理论模型大多都是借鉴,Google Dapper论文。

我最近也在选取使用哪一个工具,这里的对比是在Spring Cloud 中的使用。

对比三种工具:

  • zipkin:Twitter公司开源的一个分布式追踪工具,被Spring Cloud Sleuth集成,使用广泛而稳定
  • skywalking:中国人吴晟(华为)开源的一款分布式追踪,分析,告警的工具,现在是Apache旗下开源项目
  • cat:大众点评开源的一款分布式链路追踪工具。

整体架构

zipkin

[外链图片转存失败(img-ZlnePiaU-1563283461136)(https://gentlezuo.github.io/2019/07/13/APM%E5%B7%A5%E5%85%B7%E5%AF%B9%E6%AF%94/architecture-skywalking.png)]

zipkin分为zipkin服务端和客户端,每一个被监控的服务都是客户端。

组件:

  • 追踪器:位于客户端,并记录有关发生的操作的时间和元数据,对用户透明
  • Reporter: 将数据发送到Zipkin的检测应用程序
  • Transport :传输数据:HTTP, Kafka and Scribe.
  • Collector:位于服务端中,收集传输来的数据
  • Storage :存储数据,默认存储在内存中
  • search :查询api,JSON应用编程接口,被UI调用
  • UI :Web UI提供了一种基于服务,时间Annotation查看跟踪的方法。UI中没有内置身份验证

skywalking

[外链图片转存中...(img-L3X8OOIz-1563283325758)]

组件:

skywalking分为四个部分:探针,平台后端,存储,UI

  • Probes,探针,探针因使用的语言不同而不通,收集数据并且格式化为skywalking所需的格式。
  • Platform backend 平台后端,对应于zipkin server,可以集群部署,聚合,分析,将数据展示在UI中
  • Storage:存储,可扩展的存储,可以使es,H2,MySQL集群
  • UI 丰富的可视化功能,提供身份验证

cat

[外链图片转存中...(img-vFXbimed-1563283325759)]

  • cat-client 业务模块,埋点,发送消息给consumer
  • cat-consumer,分析从client接收的数据
  • cat-home 将数据展示在控制端
  • 存储

基本原理

zipkin

┌─────────────┐ ┌───────────────────────┐  ┌─────────────┐  ┌──────────────────┐
│ User Code   │ │ Trace Instrumentation │  │ Http Client │  │ Zipkin Collector │
└─────────────┘ └───────────────────────┘  └─────────────┘  └──────────────────┘
       │                 │                         │                 │
           ┌─────────┐
       │ ──┤GET /foo ├─▶ │ ────┐                   │                 │
           └─────────┘         │ record tags
       │                 │ ◀───┘                   │                 │
                           ────┐
       │                 │     │ add trace headers │                 │
                           ◀───┘
       │                 │ ────┐                   │                 │
                               │ record timestamp
       │                 │ ◀───┘                   │                 │
                             ┌─────────────────┐
       │                 │ ──┤GET /foo         ├─▶ │                 │
                             │X-B3-TraceId: aa │     ────┐
       │                 │   │X-B3-SpanId: 6b  │   │     │           │
                             └─────────────────┘         │ invoke
       │                 │                         │     │ request   │
                                                         │
       │                 │                         │     │           │
                                 ┌────────┐          ◀───┘
       │                 │ ◀─────┤200 OK  ├─────── │                 │
                           ────┐ └────────┘
       │                 │     │ record duration   │                 │
            ┌────────┐     ◀───┘
       │ ◀──┤200 OK  ├── │                         │                 │
            └────────┘       ┌────────────────────────────────┐
       │                 │ ──┤ asynchronously report span     ├────▶ │
                             │                                │
                             │{                               │
                             │  "traceId": "aa",              │
                             │  "id": "6b",                   │
                             │  "name": "get",                │
                             │  "timestamp": 1483945573944000,│
                             │  "duration": 386000,           │
                             │  "annotations": [              │
                             │--snip--                        │
                             └────────────────────────────────┘
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

当发起一个调用,Trace Instrumentation会拦截请求,添加tag,添加traceID和spanID进http头,当服务返回时,它会异步地向Collector发送数据。Collector受到数据后存储,分析,同时UI会展示数据在界面上。

skywalking

探针将数据通过gRPC或者HTTP传输给后端平台(server),后端平台将数据存储在Storage中,并且分析数据将结果展示在UI中

cat

客户端:收集数据通过ThreadLocal,将数据存在ThreadLocal中,当结束时发送数据给服务端。

举例:

[外链图片转存中...(img-hIH9tNTC-1563283325760)]

序列化与通信:自定义的序列化协议,Netty数据传输

服务端:

[外链图片转存中...(img-Q2prnIr9-1563283325761)]

监控模型:

  • Transaction:适合记录跨越系统边界的程序访问行为,比如远程调用,数据库调用,也适合执行时间较长的业务逻辑监控,Transaction用来记录一段代码的执行时间和次数
  • Event:用来记录一件事发生的次数,开销较小
  • Heartbeat:表示程序内定期产生的统计信息, 如CPU利用率, 内存利用率, 连接池状态, 系统负载等
  • Metric:用于记录业务指标、指标可能包含对一个指标记录次数、记录平均值、记录总和,业务指标最低统计粒度为1分钟
类别实现方式
zipkin拦截请求
skywalkingjava探针,字节码增强
cat代码埋点

接入方式

类别接入方式agent到collector的协议
zipkinsleuth,引入依赖和配置http,mq
skywalkingjavaanentgRPC,http
cat代码侵入http/tcp

数据收集

类别数据
zipkin链路,耗时
skywalking链路,耗时,cpu,mem,JVM
cat链路,耗时,cpu,mem,JVM

UI

类别丰富度
zipkin一般
skywalking丰富
cat丰富

数据存储方案

类别存储方案
zipkin内存,mysql,es,Cassandra
skywalkinges,mysql,h2,TiDB
catmysql,hdfs

支持语言

类别语言
zipkinC#,Go,Java,JS,Ruby,Scala,PHP;社区支持c++,Python
skywalkingJava,c#,PHP,Node.js
catJava, C/C++, Node.js, Python, Go

使用者

类别使用者
zipkin
skywalking
cat较多

版本迭代速度

类别速度
zipkin
skywalking
cat

其它

类别作者粒度traceID查询告警依赖分析OpenTracing标准
zipkintwitter接口级yesnoyes部分支持
skywalking吴晟,华为方法级yesyesyes完全支持
cat吴其敏,尤勇,大众点评代码级noyesno不支持

注:OpenTracing通过提供平台无关、厂商无关的API,使得开发人员能够方便的添加(或更换)追踪系统的实现。

总结

zipkin

  • 优点:轻量级,springcloud集成,使用人数多,成熟
  • 不足:功能简单,只有链路监控

skywalking

  • 优点:采集数据丰富,UI友好,扩展性高,使用者多,支持中间件以及框架多,社区活跃
  • 不足:成熟度不够高

cat

  • 优点采集数据非常丰富,UI友好,粒度最细
  • 代码侵入,需改动业务代码,git不够活跃,更新缓慢,存储支持不够广泛

这些工具各有长短,根据实际场景不同选择之。

参考文档

https://zipkin.io/
https://github.com/apache/skywalking
https://github.com/dianping/cat/wiki
https://juejin.im/post/5a274614518825592c07f8b8
https://www.jianshu.com/p/0fbbf99a236e

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值