二、captureframework运行原理
2.1 关键技术说明javaassist
monitor捕获体系
precap/docap
2.2 架构说明捕获点:支持tomcat、mscp、springboot、jetty埋点。
uavserver单例:作为统一的捕获入口点,提供了同步和异步方法。
standardmonitor:实现了monitor接口,是实时数据抓取实现类,提供了docapture方法,负责抓取行为和生成抓取结果。
monitorelemcaphandler:不同的抓取逻辑和抓取点的共同接口实现不同的埋点逻辑,提供了抓取行为的方法precap与docap以及生成抓取结果的方法prestore。
standardmonitorrepository:存储实时数据抓取数据结构。
dataobserver:暴露了jmx/http接口数据。
2.3 关键类说明monitor实时监控主要是从defaultmonitorsupporter类启动初始化standardmonitor对象,通过captureframework将monitor对象安装到datastore对象中。
dataobserver提供jmx/http服务,供后续ma抓取使用,其中http服务注册了三个handler,分别为httpjeejvmobserver、httpjeemonitorobserver、 httpjeeprofileobserver。不同的handler暴露了不同的接口。
monitorhandler包下的handler类具体处理monitor的指标数据计算和统计。
2.4 捕获点剖析captureframework框架提供了统一的捕获入口点,在uavserver中分别提供了同步方法与异步方法:
同步捕获入口点:runmonitorcaptureonservercappoint
异步捕获入口点:runmonitorasynccaptureonservercappoint
2.4.1 同步与异步调用的差异分析异步比同步多增加了一个参数capturecontextmapfromanotherthread,该参数若不为空,则需要合并上下文的信息。一般情况下在使用异步方法埋点时,在方法执行前调用异步捕获方法传入的capturecontextmapfromanotherthread为空,并返回封装好的上下文信息,在方法执行结束后调用异步捕获方法传入上下文信息,并进行上下文信息合并,再进行具体的捕获操作,具体可参考以下代码片段:
方法执行前的异步调用
方法执行后的异步调用如下,其中ccmap为异步调用返回的封装好的上下文信息
2.5 抓取行为剖析monitor接口:提供了多个接口,其中最主要的是docapture与doprestore方法,docapture用来实现在特定的捕获点执行抓取数据行为,doprestore方法用来实现在存储到数据结构之前的一些捕获动作,做一些特殊数据的处理。
standardmonitor类: monitor接口的具体实现类。
standardmonitorrepository类:存储实时数据抓取数据结构。
monitorelementinstance接口:存储实时数据抓取数据结构的实例接口。
standardmonitorelementinstance类:monitorelementinstance接口的具体实现类。
无论是同步捕获入口点还是异步捕获入口点都会执行docapture方法,代码片段如下:
monitor.docapture是调用了monitor接口中的docapture,其实现类是standardmonitor。
standardmonitor中的docapture方法主要做了如下操作:
根据参数获取当前的monitorelement数组,monitorelement数组通过standardmonitorrepository的getelementbycapid实现;
循环处理monitorelement数组,获取捕捉数据实现类,根据实现类获取当前要执行的handler,最后根据当前获取的handler判断捕获阶段(precap/docap),然后进行相应的处理。不同的handler根据不同的特性处理生成monitorelementinstance,最后将结果存储在standardmonitorrepository数据结构中。
以serverendresptimecaphandler(服务端抓取行为)为例:
precap方法:只记录了服务的开始请求时间。
docap方法:根据不同的monitorelemid进行不同的逻辑处理,最后封装好monitorelementinstance实例,然后再进行抓取行为结果的处理,其中包含最大值消峰、最大值、最小值、返回状态码、时间戳更新、计数等相应的数据处理。
三、实时数据采集3.1 什么是实时数据即运行时数据,指的是在程序运行时产生的信息,程序占用的cpu、堆内存、jvm信息以及提供服务访问与客户端调用的相关统计信息(平均响应时间、访问计数等)。
3.2 服务端数据采集defaultmonitorsupporter的实现
服务端数据采集以defaultmonitorsupporter.start为入口点,构建monitor实例:
默认构建service类型的standardmonitor实例,其中包含standardmonitorrepository实例,standardmonitorrepository实例注册monitor,一个该实例包含多个monitorelement实例,并将所有的monitorelement实例保存在elemsmap属性中。
elemsmap属性根据不同的采集对象保存不同的采集类handler:
serverendresptimecaphandler:采集server、app、url的响应时间和加载计数等.
jvmstatecaphandler:采集jvm状态,包括heap使用、gc计数、线程计数、cpu、class计数等。
代码片段如下:
3.3 客户端数据采集defaultclientmonitorsupporter的实现
客户端数据采集以defaultclientmonitorsupporter.start为入口点,构建monitor实例:
默认构建client类型的standardmonitor实例,其中包含standardmonitorrepository实例,standardmonitorrepository实例注册monitor,一个该实例包含多个monitorelement实例,并将所有的monitorelement实例保存在elemsmap属性中。
elemsmap:属性只保存一个clientresptimecaphandler采集类。
clientresptimecaphandler:采集客户端的响应时间和加载计数等。
无论是客户端的数据采集还是服务端的数据采集,都会将monitor安装到dataobserver中;并且最后都会将构建成功的monitor绑定至指定的捕获方法(即precap和docap)。
3.4 dataobserver的实现dataobserver提供了两种模式来暴露接口数据,分别为jmx和http:
http方式:由httpdataobserverworker.start作为入口点,分别注册了三个handler,分别为获取jvm数据、monitor数据以及profile数据的handler。各个处理器(handler)暴露出独特的接口,但它们都返回 json 格式的数据。
jmx方式:jmx代理通过getmbeaninfo方法获取暴露的接口,来获取数据。
dataobserver还提供了安装与卸载monitor、增加与移除listener以及获取profile和monitor的方法:
以上就是如何进行captureframework框架分析的详细内容。