文章目录
- 二、命令列表
- 2.3 monitor/watch/trace/stack/tt 相关
- 2.3.5 watch (方法执行数据观测)
- 举例1:监控方法
- 举例2:同时观察函数调用前和函数返回后
二、命令列表
2.3 monitor/watch/trace/stack/tt 相关
2.3.5 watch (方法执行数据观测)
提示
函数执行数据观测
让你能方便的观察到指定函数的调用情况。能观察到的范围为:
返回值
、抛出异常
、入参
,通过编写 OGNL 表达式进行对应变量的查看。
参数说明:
参数名称 | 参数说明 |
---|---|
class-pattern | 类名表达式匹配 |
method-pattern | 函数名表达式匹配 |
express | 观察表达式,默认值:{params, target, returnObj} |
condition-express | 条件表达式 |
[b] | 在函数调用之前观察 |
[e] | 在函数异常之后观察 |
[s] | 在函数返回之后观察 |
[f] | 在函数结束之后(正常返回和异常返回)观察 |
[E] | 开启正则表达式匹配,默认为通配符匹配 |
[x:] | 指定输出结果的属性遍历深度,默认为 1,最大值是 4 |
[m <arg>] | 指定 Class 最大匹配数量,默认值为 50。长格式为[maxMatch <arg>] 。 |
特别说明:
- watch 命令定义了 4 个观察事件点,即
-b
函数调用前,-e
函数异常后,-s
函数返回后,-f
函数结束后 - 4 个观察事件点
-b
、-e
、-s
默认关闭,-f
默认打开,当指定观察点被打开后,在相应事件点会对观察表达式进行求值并输出 - 这里要注意
函数入参
和函数出参
的区别,有可能在中间被修改导致前后不一致,除了-b
事件点params
代表函数入参外,其余事件都代表函数出参 - 当使用
-b
时,由于观察事件点是在函数调用前,此时返回值或异常均不存在 - 在 watch 命令的结果里,会打印出
location
信息。location
有三种可能值:AtEnter
,AtExit
,AtExceptionExit
。对应函数入口,函数正常 return,函数抛出异常。
举例1:监控方法
基础语法
:watch 全路径类名 方法名 {params,returnObj,throwExp} -x 8
[arthas@7265]$ watch com.hero.lte.ems.security.service.impl.LdapService login {params,returnObj,throwExp} -x 8
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 237 ms, listenerId: 7
ts=2024-09-19 14:15:42; [cost=10.802626ms] result=@ArrayList[@Object[][@LdapLoginRequest[username=@String[testuser2],password=@String[Hero@1993],principal=@String[testuser2@MS-DCS.BEE.VIMPELCOM.RU],keytabFilePath=null,ldapFlag=null,domainName=@String[ms-dcs.bee.vimpelcom.ru],baseDn=@String[dc=ms-dcs,dc=bee,dc=vimpelcom,dc=ru],adminBindDn=@String[cn=Tech_Hytera_MS,ou=TechDir_Msk,ou=Moscow,dc=ms-dcs,dc=bee,dc=vimpelcom,dc=ru],adminBindPassword=@String[Bingo@1993],userSearchDn=@String[],userSearchScope=@Integer[2],userIdAttribute=@String[sAMAccountName],groupSearchDn=@String[DC=ms-dcs,DC=bee,DC=vimpelcom,DC=ru],groupSearchScope=@Integer[2],groupFilter=@String[(objectClass=*)],groupMemberAttribute=@String[member],createTime=@Date[2024-09-17 16:20:38,000],updateTime=@Date[2024-09-17 16:20:38,000],ldapConnectionSecurityMode=@Integer[0],port=@Integer[636],ignoreReferrals=@Integer[0],enableFullDnForGroupMemberAttribute=@Integer[0],validGroup=@String[testou1,APP_Hytera_MS],searchGroupFilter=@String[(&(objectClass=*)(member=*))],],],@ResultSet[errorCode=@String[43],errorString=@String[kerberos authentication failed.],errorParams=null,resultVal=null,],null,
]
举例2:同时观察函数调用前和函数返回后
基础语法
:watch 全路径类名 方法名 {params,returnObj,throwExp} -x 8 -b -s
代码:请求前传入ouValues参数,方法返回的也是这个参数
public static List<Object> extractOUValues(String dn, List<Object> ouValues) {// 定义正则表达式,用于匹配 OU 属性及其值String ouPattern = "OU=([^,]+)";// 创建 Pattern 和 Matcher 对象Pattern pattern = Pattern.compile(ouPattern);Matcher matcher = pattern.matcher(dn);// 查找所有匹配的 OU 值并添加到列表while (matcher.find()) {if (!ouValues.contains(matcher.group(1))) {ouValues.add(matcher.group(1));}}return ouValues;}
[arthas@9890]$ watch com.hero.lte.ems.security.service.impl.LdapService extractOUValues {params,returnObj,throwExp} -x 8 -b -s
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 190 ms, listenerId: 2
ts=2024-09-19 14:53:14; [cost=0.909333ms] result=@ArrayList[@Object[][@String[CN=testuser1,OU=testou1,OU=TechDir_Msk,OU=Moscow,DC=ms-dcs,DC=bee,DC=vimpelcom,DC=ru],@ArrayList[isEmpty=true;size=0],],null,null,
]
ts=2024-09-19 14:53:14; [cost=4.773943466517351E9ms] result=@ArrayList[@Object[][@String[CN=testuser1,OU=testou1,OU=TechDir_Msk,OU=Moscow,DC=ms-dcs,DC=bee,DC=vimpelcom,DC=ru],@ArrayList[@String[testou1],@String[TechDir_Msk],@String[Moscow],],],@ArrayList[@String[testou1],@String[TechDir_Msk],@String[Moscow],],null,
]