1. 摘要:
你还在为系统慢、接口方法调用耗时高、代码量大无法找出原因头疼吗?你还在为系统输出日志不够详细无法分析耗时而头疼吗?那么,你会增加日志输出?全面阅读代码针对可疑点输出特定日志来跟踪?打开DEBUG日记模式海量分析日志?要求开发修改框架,针对每个方法都输出耗时?上述这些方法都可以用来分析方法耗时的原因,如果代码量很小都可以轻松找出慢的原因,但如果代码有几万或者更多的时候,这些方法都需要花费很多时间才有可能找出问题根源。
下面将介绍使用javaAgent和Java字节码注入技术开发java探针工具来分析复杂的接口方法,无需修改代码,简单部署就可以实时抓取代码的运行轨迹和方法耗时。
2. 基于javaAgent和Java字节码注入技术的java探针工具技术原理
图0-0:动态代理功能实现说明
我们利用javaAgent和ASM字节码技术开发java探针工具,实现原理如下:
jdk1.5以后引入了javaAgent技术,javaAgent是运行方法之前的拦截器。我们利用javaAgent和ASM字节码技术,在JVM加载class二进制文件的时候,利用ASM动态的修改加载的class文件,在监控的方法前后添加计时器功能,用于计算监控方法耗时,同时将方法耗时及内部调用情况放入处理器,处理器利用栈先进后出的特点对方法调用先后顺序做处理,当一个请求处理结束后,将耗时方法轨迹和入参map输出到文件中,然后根据map中相应参数或耗时方法轨迹中的关键代码区分出我们要抓取的耗时业务。最后将相应耗时轨迹文件取下来,转化为xml格式并进行解析,通过浏览器将代码分层结构展示出来,方便耗时分析,如图0-1所示。
图0-1:java探针工具原理图
Java探针工具功能点:
1、支持方法执行耗时范围抓取设置,根据耗时范围抓取系统运行时出现在设置耗时范围的代码运行轨迹。
2、支持抓取特定的代码配置,方便对配置的特定方法进行抓取,过滤出关系的代码执行耗时情况。
3、支持APP层入口方法过滤,配置入口运行前的方法进行监控,相当于监控特有的方法耗时,进行方法专题分析。
4、支持入口方法参数输出功能,方便跟踪耗时高的时候对应的入参数。
5、提供WEB页面展示接口耗时展示、代码调用关系图展示、方法耗时百分比展示、可疑方法凸显功能。
其中抓取耗时的相关文件输出明细如图0-2所示。
图0-2:耗时抓取明细说明