最近需要对PinPoint监控进行了解,项目工程需要除了性能进行监控外,业务层面也得进行个性化定制。因此做了些关于PinPoint的研究,网上关于PinPoint的使用更多是安装教程和一些简单的说明。更多关于一些解析的资料则是比较匮乏,现在把自己所获得的一些感悟拿出来分享。
1.什么是pinpoint
首先我们要知道PinPoint的定位是款开源的 APM (Application Performance Management/应用性能管理)工具,用于基于java的大规模分布式系统。我们可以从它的页面大概知道pinpoint的功能
从这可以看出pinpoint是一款更注重性能监控的监控性应用,对于一些物理上的应用信息进行监视(如应用的cpu使用,内存的占用),而我觉得作为一款性能监控的应用,PinPoint的强大之处,还在于,首先它是一款用于监控整个链路级别的监控应用。(后面会讲),其次,采取的字节码增强技巧使得它可以实现监控应用的无代码级别的侵入方式。这也是很多人采用它的原因。毕竟随着时间推移,一些古老应用可能难以维护和修改,谁也不愿意去修改这里面的代码,然而还得实时对应用的状况进行监视
。
2.链路级别的监控,基于RPC的收发机制(实现)
下面说说什么是基于链路级别的监控,也是PinPoint的一个消息传输机制。
首先得明白RPC是什么,
RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
对的,百度原话,也是我觉得迄今为止描述最清楚的。说白了,你可以把它当一个复杂的http请求(有一定误差,便于比喻罢了),当请求发送至服务器端时,首先到达前端,然后发送两个RPC到服务器B和C。B会马上做出反应,但是C需要和后端的D和E交互之后再返还给A,由A来响应最初的请求。对于这样一个请求,简单实用的分布式跟踪的实现,就是为服务器上每一次你发送和接收动作来收集跟踪标识符(message identifiers)和时间戳(timestamped events)。吐槽下 pinpoint 采取的是
thrift框架进行RPC调用
上述是一个简单的请求调用过程,简单讲解了一次rpc调用时如何跟踪整个应用链的消息,并进行记录。
拆分和补充下
当在 TomcatA 和 TomcatB 中安装pinpoint的数据。可以把单个节点的跟踪数据看成single traction,提现分布式事务跟踪的流程。
-
当请求到达TomcatA时, Pinpoint agent 产生一个 TraceId.
- TX_ID: TomcatA^TIME^1
- SpanId: 10
- ParentSpanId: -1(Root)
-
从spring MVC 控制器中记录数据
-
插入HttpClient.execute()方法的调用并在HTTPGet中配置TraceId
-
创建一个子TraceId
- TX_ID: TomcatA^TIME^1 -> TomcatA^TIME^1
- SPAN_ID: 10 -> 20
- PARENT_SPAN_ID: -1 -> 10 (父 SpanId)
-
在HTTP header中配置子 TraceId
- HttpGet.setHeader(PINPOINT_TX_ID, "TomcatA^TIME^1")
- HttpGet.setHeader(PINPOINT_SPAN_ID, "20")
- HttpGet.setHeader(PINPOINT_PARENT_SPAN_ID, "10")
-
-
传输打好tag的请求到TomcatB.
-
TomcatB 检查传输过来的请求的header
HttpServletRequest.getHeader(PINPOINT_TX_ID)
-
TomcatB 作为子节点工作因为它识别了header中的TraceId
- TX_ID: TomcatA^TIME^1
- SPAN_ID: 20
- PARENT_SPAN_ID: 10
-
-
从spring mvc控制器中记录数据并完成请求
-
当从tomcatB回来的请求完成时,pinpoint agent发送跟踪数据到pinpoint collector就此存储在HBase中
-
在对tomcatB的HTTP调用结束后,TomcatA的请求也完成了。pinpoint agent发送跟踪数据到pinpoint collector就此存储在HBase中
-
UI从HBase中读取跟踪数据并通过排序树来创建调用栈
当然,其实PinPoint这一套并不是自己独创的,而是基于谷歌的Dapper系统借鉴而来(棒子们的借鉴精神),原文可以看
http://bigbully.github.io/Dapper-translation/
3.字节码增强技术实现无侵入式监控
讲了那么多到了这才是PinPoint的技术精华,这方面网上有比较好的资料
这篇博客我觉得是讲的比较细致的