一种基于java代码跟踪型的数据采集方法与流程

文档序号:28815912发布日期:2022-02-09 06:02阅读:292来源:国知局
一种基于java代码跟踪型的数据采集方法与流程

1.本发明涉及数据采集技术领域,具体为一种基于java代码跟踪型的数据采集方法。


背景技术:

2.随着企业的高速蓬勃发展,相关业务也会变得日渐复杂,相对应也要求技术团队细拆出更多的微服务,来应变日渐复杂的需求。与此同时,就需要面对各个应用的请求统计、链路拓扑、应用依赖、故障诊断效率等问题,所以需要开发一套监控组件,植入到应用中,采集程序运行时的数据,还原程序运行情况。
3.基于以上需求,可以采用aop面向切面编程思想,通过程序运行期动态代理来实现对运行方法拦截,以达到采集程序运行数据的效果。
4.但在aop动态代理技术中,是在运行期基于原java对象动态生成代理对象,来实现拦截运行方法的效果。针对同个java对象不同方法互相调用的情况下,由于没有经过动态代理对象调用,所以拦截效果会失效,导致采集程序运行数据丢失。


技术实现要素:

5.本发明的目的在于提供一种基于java代码跟踪型的数据采集方法,以解决上述背景技术中提出的由于没有经过动态代理对象调用,所以拦截效果会失效,导致采集程序运行数据丢失等问题。
6.为实现上述目的,本发明提供如下技术方案:
7.一种基于java代码跟踪型的数据采集方法,包括以下步骤:
8.s1:定义spi拦截器接口:采用spi插件机制,定义统一的spi拦截器接口,不同的增强逻辑实现不同的spi拦截器接口;
9.s2:定义spi拦截器调度器,提供@runtimetype注解入口;
10.s3:定义agent入口:在agent的premain方法中,通过serviceloader加载spi拦截器实现类,并循环每一个spi拦截器实现类;
11.s4:构建transformer:将spi拦截器注入到拦截器调度器中,再注入到transformer中;
12.s5:构建agentbuilder,将transformer注入到agentbuilder中,实现请求统计增强、链路拓扑增强、远程调用增强;
13.s6:采用maven-shade-plugin插件包成一个javaagent jar;
14.s7:修改应用的启动命令,加上java-javaagent jar包全路径启动参数即可实现基于java代码跟踪型对应用数据的采集。
15.更进一步地,s1中为定义统一的动态代码增强spi拦截器接口,配套提供有前置执行、后置执行、异常处理、类匹配、方法匹配。
16.更进一步地,s2中具体步骤为:将spi拦截器注入到该调度器中,在调度器的执行
方法中,通过java反射技术识别@runtimetype注解结合spi拦截器的前置和后置执行拦截方法,实现对目标字节码的前置和后置增强。
17.更进一步地,s6中具体方法为:采用maven-shade-plugin插件,指定premain-class为s3的premain全路径,从而实现将当前工程代码打包成一个javaagent jar。
18.更进一步地,s7中java-javaagent jar包全路径启动参数包括java-javaagent:/data/agent.jar-jar app.jar。
19.与现有技术相比,本发明的有益效果是:
20.本发明提供的一种基于java代码跟踪型的数据采集方法,采用java字节码增强技术,在字节码加载时期,对字节码进行了动态增强,解决了aop动态代理技术的同对象同方法相互调用代理失效问题,且对应用开发者无侵入、无感知,实现在不修改任何应用代码前提下,完成了对应用的数据采集。
附图说明
21.图1为本发明的方法流程图。
具体实施方式
22.下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
23.请参阅图1,本发明实施例中提供一种基于java代码跟踪型的数据采集方法,包括以下步骤:
24.第一步:定义spi拦截器接口:采用spi插件机制,定义统一的spi拦截器接口,不同的增强逻辑实现不同的spi拦截器接口;其中,为定义统一的动态代码增强spi拦截器接口,配套提供有前置执行、后置执行、异常处理、类匹配、方法匹配;
25.第二步:定义spi拦截器调度器,提供@runtimetype注解入口;
26.第三步:定义agent入口:在agent的premain方法中,通过serviceloader加载spi拦截器实现类,并循环每一个spi拦截器实现类;具体的将spi拦截器注入到该调度器中,在调度器的执行方法中,通过java反射技术识别@runtimetype注解结合spi拦截器的前置和后置执行拦截方法,实现对目标字节码的前置和后置增强;
27.第四步:构建transformer:将spi拦截器注入到拦截器调度器中,再注入到transformer中;
28.第五步:构建agentbuilder,将transformer注入到agentbuilder中,实现请求统计增强、链路拓扑增强、远程调用增强;
29.第六步:采用maven-shade-plugin插件包成一个javaagent jar;具体方法为采用maven-shade-plugin插件,指定premain-class为s3的premain全路径,从而实现将当前工程代码打包成一个javaagent jar;
30.第七步:修改应用的启动命令,加上java-javaagent jar包全路径启动参数即可实现基于java代码跟踪型对应用数据的采集;其中,java-javaagent jar包全路径启动参
数包括java-javaagent:/data/agent.jar-jar app.jar。
31.工作原理:本发明提供的一种基于java代码跟踪型的数据采集方法,采用技术手段对java字节码进行动态增强,对于java字节码动态增强,一般不止单一的增强逻辑,例如需要实现请求统计增强、链路拓扑增强、远程调用增强等,所以本发明实施例采用spi插件机制,定义统一的spi拦截器接口,不同的增强逻辑实现不同的spi拦截器接口。
32.其中,定义统一的动态代码增强spi拦截器接口,提供前置执行、后置执行、异常处理、类匹配、方法匹配等方法;在agent的premain方法中,通过serviceloader加载所有spi拦截器实现类,循环每一个spi拦截器实现类,构建对应的transformer,将spi拦截器注入到transformer中,再构建agentbuilder,将transformer注入到agentbuilder中;需要说明的是,在该方法中,需要定义一个拦截器调度器,将spi拦截器注入到该调度器中,在调度器的执行方法中,通过java反射技术识别@runtimetype注解结合spi拦截器的前置和后置执行拦截方法,实现对目标字节码的前置和后置增强。
33.同时,还需要说明的是,在本发明方法中,由于不同拦截器的职责不一,它们需要拦截的类和方法也不同,所以构建transformer和agentbuilder时,只会匹配拦截器已经指定的类和方法,对其它的类和方法不会执行拦截,从而实现了java字节码动态增加的整体框架,依据此框架,本发明可以根据实际的需求,实现请求统计增强、链路拓扑增强、远程调用增强等spi拦截器,完成一款基于java代码跟踪型的数据采集监控组件;具体方法为:采用maven-shade-plugin插件,指定premain-class为premain全路径,这样就实现了将当前工程代码打包成一个javaagent jar;修改应用的启动命令,加上java-javaagent jar包全路径启动参数,如:java-javaagent:/data/agent.jar-jar app.jar,通过以上方法,即可实现基于java代码跟踪型对应用数据采集。
34.综上所述:本发明提供的一种基于java代码跟踪型的数据采集方法,采用java字节码增强技术,在字节码加载时期,对字节码进行了动态增强,解决了aop动态代理技术的同对象同方法相互调用代理失效问题,且对应用开发者无侵入、无感知,实现在不修改任何应用代码前提下,完成了对应用的数据采集。
35.以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明披露的技术范围内,根据本发明的技术方案及其发明构思加以等同替换或改变,都应涵盖在本发明的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1