pinpoint入门及介绍part1

pinpoint入门及介绍part1

总览

现在的服务都包含了很多不同组件,并且这些组件相互调用。一次请求或事务经过哪些组件就成为黑盒子。
pinpoint跟踪请求,可以跟踪多个子系统或组件,并且提供可视化的视图显示错误区域和潜在瓶颈。
pinpoint入门及介绍part1_第1张图片

服务地图(ServerMap)

显示服务的系统拓扑图(内部组件和外部组件连接关系),并且单击某个节点可以查看当前节点的状态、事务数量等

实时线程图表(RealTime Active Thread Chart)

监控应用实时线程

请求响应统计(Request/Response Scatter Chart)

可视化的请求数量、响应时间定位潜在问题。并且可以用个框住图表的区域查看详细调用链

调用链(CallStack)

通过框住请求响应区域查看详细调用链,可以定位请求瓶颈(很容易看出哪些请求慢或者出错)

监视器(Inspector)

CPU使用请求、内存使用及回收请求、TPS、JVM配置参数等

历史

2012年开始开发,2015年开源。

为什么开发PinPoint及其特征

相比于微服务的兴起,以前的应用都是比较简单的,用户少,并且一般都是二层(web服务--数据库)或三层架构(web服务--应用服务--数据库)。
当前随着SOA或微服务架构的不断流行,很多应用都是超过三层应用架构了,这导致在排查系统问题时比较麻烦,需要一个一个应用逐步排查,效率低。
并且如果应用很复杂,可能排查错误都很麻烦。
为了应对上面的情况很多APM(Application Performance Management)应运而生,但是这些APM处理效率低,所以NAVER团队开始研发PinPoint。其主要
特性有:
1. 分布式调用链追踪
2. 自动检测系统拓扑图
3. 支持水平扩展
4. 提供代码调用视图方便定位错误和瓶颈
5. 基于动态字节码技术,不会侵入应用

技术细节

分布式请求追踪

参考Google的Dapper,精确追踪每一个请求链

Dapper和PinPoint

Dapper基于在HTTP请求头追加应用调用标识,来确定某次请求来自某个应用;PinPoint参考Dapper并做了修改,在请求头加上一个请求的标识(TraceId)来定位具体的每个请求链

PinPoint数据结构

Span: RPC的基础单元,每个Span都包含一个TraceId
Trace: Span的集合,将多个RPC请求关联起来,拥有相同的TraceId共享同一个TransactionId。Trace是一棵树,通过SpanId和ParentSpanId串联
TraceId: TransactionId、SpanId和ParentSpanId的集合,TransactionId定义了消息ID,SpanId和ParentSpanId定义了RPC关系
TransactionId: 全局唯一的、用于标识跨多个系统的消息
SpanId: 接收到RPC消息是产生的ID,64位长整型
ParentSpanId: 调用者的SpanId,父调用者的ParentSpanId为-1,64位长整型

字节码技术,无侵入代码

很早以前,我们想让开发修改他们的代码来实现分布式事务追踪,允许开发在RPC调用时新增额外信息,然而如果需要在多个系统扩展,这样的工作又得重复多次。Twitter的Zipkin通过修改jar和定制化容器(Finagle)来实现分布式事务追踪,然而这也是需要应用配合改一些代码。我们通过字节码技术在PinPoint实现了类似功能。PinPoint的代理会自动在RPC调用加上额外的用于追踪的信息

字节码技术的优缺点

优点:无侵入代码,易大批量,可扩展;缺点:投入大,需要更专业的开发者

字节码技术的价值

隐式API: 对应用无感知,改动API不需要应用配合,只需要升级对应的版本即可
开关特性: PinPoint可能会对性能造成很少的影响,但是应用开发者可以随时开启或关闭PinPoint功能,而不需要修改一行代码
开启PinPoint

JVM启动参数配置即可

-javaagent:$AGENT_PATH/pinpoint-bootstrap-$VERSION.jar
-Dpinpoint.agentId=
-Dpinpoint.applicationName=

字节码技术工作原理

直接处理字节码带来了更高的风险,此外开发人员基本不能犯错。PinPoint我们通过抽象拦截器提高生产性和可访问性,在类加载期注入必要的代码来跟踪分布式事务链路,比直接在应用代码写相关代码会更高效

PinPoint代理的优化

二进制格式

我们通过使用二进制(如Thrift)来提高代码效率,尽管二进制很难调试,但它的确通过减少代码的大小来提升网络的效率

可变长的编码和格式

如果你将long型数据转为固定长度的字符串,那么它始终占8字节。然而如果使用变长字符串,字节可根据long的长度控制在1到10。

常量表

通过常量表(存放在HBase)记录,减少存储重复的API信息、SQL信息等。

抽样记录请求

因为流量大的应用,一天的请求数都上亿次,如果每个请求都记录会影响性能。PinPoint采用抽样记录请求来优化

异步数据传输

使用UDP和异步线程传输数据

其他

TraceId

pinpoint入门及介绍part1_第2张图片

ClassLoader

pinpoint入门及介绍part1_第3张图片

示例

pinpoint入门及介绍part1_第4张图片

pinpoint入门及介绍part1_第5张图片

你可能感兴趣的:(Java,PinPoint)