pinpoint和jeager对比
-
功能:
- 应用链路监控。监控方法调用信息、监控跨服务调用信息。
-
背景
-
架构
- pinpoint
- agent:代码插桩
- collector:agent发送数据到collector,collector进行整理并存储数据
- storage:使用hbase,数据存储
- web:UI
- jeager
-
-
client:代码插桩
-
agent:网络代理-收集span,发送给collector
-
collector:收集数据,转存
-
DB: 支持内存;支持两种NOSQL数据库: Cassandra and Elasticsearch;还支持一堆别的数据库
-
query:数据检索中间件
-
UI: UI
-
- pinpoint的agent约等于jeager的client+agent,都是插桩+信息传输
- pinpoint
-
开发语言
- pinpoint:java
- jeager:go
-
基础/思路
- 两种均基于Google Dapper
- Dapper的trace和span结构
- 两种均基于Google Dapper
-
支持
- pinpoint:
- agent有java、C、go、php、node版
- jeager:
- client有Go、java、Python、Node、C#、CPP
- 各自对每种语言的支持监控的框架/协议(例如spring/tomcat有所不同)
- 就java而言,pinpoint支持的协议要多一些:http、grpc、dubbo…
- pinpoint:
-
使用
- pinpoint
- 无侵入,使用javaagent自动插桩,即java -agent pinpoint-agent.jar 业务.jar 即可
- jeager
- 常规:有侵入,需要在业务对http接收和发送时进行header手动解析。如trace生成、id解析等
- 或者使用opentracing社区开发的client插桩。例如java java-specialagent
- 有侵入和无侵入的区别在于是否需要手改代码。
- pinpoint
-
开发
- pinpoint
- 不支持opentracing
ASM
字节码插桩技术。- 开发较为繁琐。需要为特定的协议编写plug,监控某个方法,进行字节码插桩生成。
- 但控制更为细致
- jeager
- 支持opentracing
- 但文档貌似更为强调对网络流量、trace的收集,而非对某个方法的监控。即强调agnet的功能而非client的功能
- 实际开发时,需要对代码进行少量修改
- opentracing实现了对一些语言的常用框架的插桩监控,使用
bytebuddy
,例如java [java-specialagent]( - 开发方便,毕竟opentracing写起来比pinpoint好入门一点。但如果写堆特定应用的插桩,都差不多。毕竟都是dapper的衍生,数据结构和思路都差不多。
- openTracing
- 一种开发规范
- 定义了span、trace等如何构建以及编写。
- 在应用中生成trace时(无论是手动埋点还是自动埋点),都可以忽略监控程序,按照统一的CNCF openTracing API开发
- pinpoint
-
对微服务的支持
- pinpoint:支持,需要为每个服务配置agent(启动应用时随agent启动)。比较难配置应该[#TODO: pinpoint如何处理一个pot中server和development#]
- jeager:支持,容易配置。istio自带jeager。并且jeager原理是收集流量,通过istio代理配置,很容易收集信息。
-
性能损耗:
- pinpoint:文档说3%最多
- jeager: 就普通监控而言,只收集trace,性能肯定要好于插桩了的pinpoint。但如果要方法监控插桩,
bytebuddy
又差于ASM
-
文档
- 就中文以及基本分析而言,pinpoint要明显多于jeager。也许是因为pinpoint开发更为繁琐,需要更多的文档解释。但就入门以及简单开发的需求,两者的文档都可以解释的比较清楚
zipkin
- Twitter开发的监控工具
- 使用时需要在业务逻辑中解析http
- 有多重方法
- 手动解析
- 使用现有库,在spring中自动装配等
- 有多重方法
- 使用和开发类似jaeger