1. 挡板原理
agent增强后,在指定的方法体第一行加入代码,agent判断是压测流量执行挡板逻辑。
1.1 agent日志
self_pradar.log.0 探针日志
白名单、挡板(挡板编译增强日志、挡板执行日志)
查看挡板报错信息:grep “demo.MathGame#main” self_pradar.log.0
pradar_trace.log.0 链路追踪日志
判断压测流量:grep “|1|” pradar_trace.log.0
1.2 arthas介绍
Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。
当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:
这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
是否有一个全局视角来查看系统的运行状况?
有什么办法可以监控到JVM的实时运行状态?
怎么快速定位应用的热点,生成火焰图?
Arthas支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。
2. 挡板错误分类
2.1 常见报错
关键词:”link guard get Invoker null. className:{} method:{}”说明挡板编译出错。
查看self日志确认是否
关键词:”invoke link gurad class error! class:{} method:{}”说明挡板执行报错。
2.2 arthas排查方法
启动arthas
java -jar arthas-boot.jar
一个完整的arthas参数含义
常见arthas命令
watch demo.MathGame primeFactors “{params,target,returnObj}” -x 2 -b -s -n 2
观察方法执行的参数值、过程值、返回值
jad demo.MathGame main
反编译方法
trace demo.MathGame primeFactors
跟踪方法执行的代码路径
如何筛选压测流量:arthas参数后面增加 “@com.pamirs.pradar.Pradar@isClusterTest()” 作为过滤条件
trace demo.MathGame primeFactors “@com.pamirs.pradar.Pradar@isClusterTest()”
watch demo.MathGame primeFactors “{params,target,returnObj}” “@com.pamirs.pradar.Pradar@isClusterTest()” -x 2 -b -s -n 2
2.3 挡板编写注意事项
1、挡板不能对接口生效(如果是调用dubbo:消费者接入agent的从消费者端方法拦截,消费者没有接入agent的单独抽出调用dubbo方法拦截)
2、需要加挡板的方法是void的情况,挡板方法实现里面需要 return null
3、书写的挡板的方法体里面不能有泛型,也不能有菱形符号(List list = new ArrayList())
4、挡板方法体中任何需要引入的包一定要引入进来(java.lang目录下除外)
5、挡板方法体如果返回的是基本数据类型,需要使用包装类转换,如return 1改为return Integer.valueOf(1)
6、抽象类的具体方法子类没有重写的,需要使用父类#方法名
7、抽象类抽象方法需要拦截继承类的实现方法
8、内部类创建对象使用全路径名称
9、获取挡板方法的参数可以使用 Object obj =(Object) args[0] ,args为方法参数数组
10、方法重载的情况会对所有重载的方法增强生效
11、不可以用foreach语句
2.4 挡板异常排查流程
测试同学反馈增强挡板之后业务逻辑出现问题
1、启动arthas
2、反编译确认增强成功 jad
3、trace挡板方法发现确实走的逻辑跟业务正常流量的方法路径不一致
以下如果感兴趣可以找张正详细了解
4、应用开启远程debug端口,应用jvm参数增加 -agentlib:jdwp=transport=dt_socket,address=20000,server=y,suspend=n
5、idea配置应用ip+debug端口
报错日志显示CustCOntroStrategyResp这个类找不到
1、启动arthas
2、反编译确认类没有
3、jad com.xx.xx.CustCOntroStrategyResp