arthas--watch函数执行数据观测

这篇具有很好参考价值的文章主要介绍了arthas--watch函数执行数据观测。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

背景

参数说明

参考


背景

watch能方便的观察到指定函数的调用情况。能观察到的范围为:返回值抛出异常入参,通过编写 OGNL 表达式进行对应变量的查看。ognl学习,可以参考:https://xiaopanjia.blog.csdn.net/article/details/130429470

参数说明

watch 的参数比较多,主要是因为它能在 4 个不同的场景观察对象

参数名称 参数说明
class-pattern 类名表达式匹配
method-pattern 函数名表达式匹配
express 观察表达式,默认值:{params, target, returnObj}
condition-express 条件表达式
[b] 函数调用之前观察
[e] 函数异常之后观察
[s] 函数返回之后观察
[f] 函数结束之后(正常返回和异常返回)观察
[E] 开启正则表达式匹配,默认为通配符匹配
[x:] 指定输出结果的属性遍历深度,默认为 1,最大值是 4
[m <arg>] 指定 Class 最大匹配数量,默认值为 50。长格式为[maxMatch <arg>]
[n] 设置执行的次数

特别说明:
1、注意函数入参函数出参的区别,有可能在中间被修改导致前后不一致,除了 -b 事件点 params 代表函数入参外,其余事件都代表函数出参
2、当使用 -b 时,由于观察事件点是在函数调用前,此时返回值或异常均不存在
3、4 个观察事件点 -b-e-s 默认关闭,-f 默认打开,当指定观察点被打开后,在相应事件点会对观察表达式进行求值并输出

例如:

1、观察函数调用返回时的参数、this 对象和返回值

$ watch demo.MathGame primeFactors -x 2
method=demo.MathGame.primeFactors location=AtExit
ts=2021-08-31 15:22:58; [cost=1.020982ms] result=@ArrayList[
    @Object[][
        @Integer[1],
    ],
    @MathGame[
        random=@Random[java.util.Random@31cefde0],
        illegalArgumentCount=@Integer[44],
    ],
    @ArrayList[
        @Integer[2],
        @Integer[2],
        @Integer[26947],
    ],
]

2、观察函数调用入口的参数和返回值

$ watch demo.MathGame primeFactors "{params,returnObj}" -x 2 -b
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 50 ms.
ts=2018-12-03 19:23:23; [cost=0.0353ms] result=@ArrayList[
    @Object[][
        @Integer[-1077465243],
    ],
    null,
]

事件点为函数执行前,因此获取不到返回值。

3、同时观察函数调用前和函数返回后

$ watch demo.MathGame primeFactors "{params,target,returnObj}" -x 2 -b -s -n 2
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 46 ms.
ts=2018-12-03 19:29:54; [cost=0.01696ms] result=@ArrayList[
    @Object[][
        @Integer[1],
    ],
    @MathGame[
        random=@Random[java.util.Random@522b408a],
        illegalArgumentCount=@Integer[13038],
    ],
    null,
]
ts=2018-12-03 19:29:54; [cost=4.277392ms] result=@ArrayList[
    @Object[][
        @Integer[1],
    ],
    @MathGame[
        random=@Random[java.util.Random@522b408a],
        illegalArgumentCount=@Integer[13038],
    ],
    @ArrayList[
        @Integer[2],
        @Integer[2],
        @Integer[2],
        @Integer[5],
        @Integer[5],
        @Integer[73],
        @Integer[241],
        @Integer[439],
    ],
]

特殊说明:

  • 参数里-n 2,表示只执行两次

  • 这里输出结果中,第一次输出的是函数调用前的观察表达式的结果,第二次输出的是函数返回后的表达式的结果

  • 结果的输出顺序和事件发生的先后顺序一致,和命令中 -s -b 的顺序无关

4、条件表达式的例子

只有满足条件的调用,才会有响应

$ watch demo.MathGame primeFactors "{params[0],target}" "params[0]<0"
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 68 ms.
ts=2018-12-03 19:36:04; [cost=0.530255ms] result=@ArrayList[
    @Integer[-18178089],
    @MathGame[demo.MathGame@41cf53f9],
]

5、观察异常信息的例子

$ watch demo.MathGame primeFactors "{params[0],throwExp}" -e -x 2
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 62 ms.
ts=2018-12-03 19:38:00; [cost=1.414993ms] result=@ArrayList[
    @Integer[-1120397038],
    java.lang.IllegalArgumentException: number is: -1120397038, need >= 2
	at demo.MathGame.primeFactors(MathGame.java:46)
	at demo.MathGame.run(MathGame.java:24)
	at demo.MathGame.main(MathGame.java:16)
,
]

特别说明:

  • -e表示抛出异常时才触发
  • express 中,表示异常信息的变量是throwExp

6、按照耗时进行过滤

$ watch demo.MathGame primeFactors '{params, returnObj}' '#cost>200' -x 2
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 66 ms.
ts=2018-12-03 19:40:28; [cost=2112.168897ms] result=@ArrayList[
    @Object[][
        @Integer[1],
    ],
    @ArrayList[
        @Integer[5],
        @Integer[428379493],
    ],
]
  • #cost>200(单位是ms)表示只有当耗时大于 200ms 时才会输出,过滤掉执行时间小于 200ms 的调用

7、观察当前对象中的属性

查看函数运行前后,当前对象中的属性,可以使用target关键字,代表当前对象。然后使用target.field_name访问当前对象的某个属性。

$ watch demo.MathGame primeFactors 'target'
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 52 ms.
ts=2018-12-03 19:41:52; [cost=0.477882ms] result=@MathGame[
    random=@Random[java.util.Random@522b408a],
    illegalArgumentCount=@Integer[13355],
]

$ watch demo.MathGame primeFactors 'target.illegalArgumentCount'
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 67 ms.
ts=2018-12-03 20:04:34; [cost=131.303498ms] result=@Integer[8]
ts=2018-12-03 20:04:35; [cost=0.961441ms] result=@Integer[8]

8、排除掉指定的类

使用 --exclude-class-pattern 参数可以排除掉指定的类,比如:

watch javax.servlet.Filter * --exclude-class-pattern com.demo.TestFilter

9、投影(Across)

简单的说,就是查看集合中元素的属性或者方法返回值

watch com.example.httpclientdemo.HttpclientDemoApplication doSend 'params[0].{#this.username}' -b -x 2
Press Q or Ctrl+C to abort.
Affect(class-cnt:2 , method-cnt:1) cost in 28 ms.
ts=2019-09-26 15:19:49; [cost=0.006187ms] result=@ArrayList[
    @String[u0],
    @String[u1],
    @String[u2],
    @String[u3],
    @String[u4],
    @String[u5],
    @String[u6],
    @String[u7],
    @String[u8],
    @String[u9],
]

watch com.example.httpclientdemo.HttpclientDemoApplication doSend 'params[0].{? #this.id > 8}' -b -x 2
Press Q or Ctrl+C to abort.
Affect(class-cnt:2 , method-cnt:1) cost in 33 ms.
ts=2019-09-26 15:23:10; [cost=0.006812ms] result=@ArrayList[
    @User[
        username=@String[u9],
        id=@Long[9],
    ],
]

在投影中过滤后计数

watch com.example.HttpclientDemoApplication doSend 'params[0].{? #this.username.endsWith("9")}.size()'

选择第一个匹配项

watch com.example.HttpclientDemoApplication doSend 'params[0].{^#this.username.startsWith("u")}' -b -x 2

选择最后一个匹配项

watch com.example.HttpclientDemoApplication doSend 'params[0].{$#this.username.startsWith("u")}' -b -x 2

 10、条件表达式和观察表达式

ognl有两种表达式,条件表达式和观察表达式,条件表达式关注于这次请求能不能拦截到,观察表达式关注于这次请求打印出什么东西,两者区别如下:

条件表达式过滤的是一次调用,判断该次调用能否返回

观察表达式里的过滤,过滤的是该次调用的数据,不管怎么写,该次调用一定返回

案例如下:

 
watch com.example.HttpclientDemoApplication doSend 
'params[0].{#this.username}' 'params[0].{? #this.id>7}.size()>0'

其中'params[0].{#this.username}’是观察表达式,'params[0].{? #this.id>7}.size()>0’是条件表达式。

观察表达式和条件表达式都可以用ognl。

参考

watch | arthas文章来源地址https://www.toymoban.com/news/detail-431635.html

到了这里,关于arthas--watch函数执行数据观测的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • watch 和 methods 执行顺序

    问题:在平台选择改变的时候获取服务类目,但服务类目中接口入参一直为空 思路:感觉明明在watch已经给platform 赋值过却依然我没值 所以只有一种可能就是,methods中方法的执行顺序 早于 watch 解决办法:就是在平台选择改变时,给接口入参赋值,添加了【代码1】这一行 知

    2024年02月11日
    浏览(29)
  • Linux 反复执行一条命令--watch命令

    在Linux中,我们可能会需要反复的执行一个命令以查看状态的变化,比如之前我在启动一个项目的时候没有什么反应,于是我便自己写脚本反复 curl 这个端口,下面用输出 Hello World 举出这个例子: 我们的需求是非常简单地,只需要不断地间隔一秒输出 Hello World ,但是却需要

    2023年04月21日
    浏览(36)
  • vue 初始化方法 create,beforeMount,mount,computed,watch 方法执行顺序及使用场景

    前言:vue 存在一些基本属性和相关对象如果合理使用,可以避免代码混乱 执行顺序 create beforeMount computed mounted watch 方法说明 created执行时挂载阶段还没有开始,模版还没有渲染成html,所以无法获取元素。created钩子函数主要用来初始化数据。 beforeMount 这一步的时候,模版已经

    2024年02月11日
    浏览(40)
  • 【vueJs源码】阅读之vm.$watch函数

    我们经常使用watch肯定知道它,他和computer一样都是数据发生变化都会触发它。今天我们就来了解一下它的原理。 这是vuejs源码定义,第一个参数是一个表达式,表示要观察的表达式,或者couputed函数在vuejs实例上的变化。 第二个参数是一个回调函数,调用时会从参数得到新数

    2024年02月16日
    浏览(26)
  • Vue3通透教程【六】setup语法糖、computed函数、watch函数

    专栏介绍: 凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章,应粉丝要求开始更新 Vue3 的相关技术文章,Vue 框架目前的地位大家应该都晓得,所谓三大框架使用人数最多,公司选型最多的框架,凉哥之前在文章中也提到过就是 Vue 框架之所以火起来的原因,和 Vue 框架相比其

    2024年01月20日
    浏览(32)
  • 入门漏洞——命令执行漏洞、目录浏览漏洞

    一、命令执行漏洞 1.介绍 命令执行(Command Execution)漏洞即可以直接在Web应用中执行系统命令,从而获取敏感信息或者拿下shell权限,服务器没有对执行的命令进行过滤。用户可以随意执行系统命令,属于高危漏洞 命令执行漏洞可能造成的原因是Web服务器对用户输入命令安全

    2024年02月04日
    浏览(31)
  • 【数据开发】HiveSQL 临时表&分步执行(with, as )与时间函数(时间戳unix_timestamp)

    1、分步执行(with…as…) Hive SQL中的WITH…AS…语句可以用于分步执行,即将一个大的查询语句拆分成多个小的查询语句,每个小的查询语句都可以使用WITH…AS…语句定义一个临时表,然后在后面的查询语句中使用这些临时表。 用法1,增加一张临时表/临时步骤 用法2,增加并

    2024年01月16日
    浏览(33)
  • php限定能执行的php目录以及路径

    server {     listen 80;     server_name www.sdph.org.cn sdph.org.cn;     index index.php index.html index.htm default.php default.htm default.html;     root /www/wwwroot/yixuehui1/public;     location ~* ^/(static|uploads|upload|images|cache|tmp|css|js)/.*.(php|php5)$ {         deny all;      }          location = /index.php {        

    2024年02月06日
    浏览(19)
  • 【阿里云Grafana】数据可观测云监控大盘服务

    新手友好系列之云产品免费试用:https://click.aliyun.com/m/1000370363/ 在监控系统体系里,grafana相信大家都是听说过的,grafana将我们的监控数据以大屏的形式直观的展示出来,作为一个喜欢折腾linux的我来说,自从grafana开源套件的出现,他的展示直观、配置轻便、功能强大、界面

    2024年02月09日
    浏览(23)
  • 统一观测|借助 Prometheus 监控 ClickHouse 数据库

    ClickHouse 作为用于联机分析(OLAP)的列式数据库管理系统(DBMS), 最核心的特点是极致压缩率和极速查询性能。同时,ClickHouse 支持 SQL 查询,在基于大宽表的聚合分析查询场景下展现出优异的性能。因此,获得了广泛的应用。本文旨在分享阿里云可观测监控 Prometheus 版对开源 Cli

    2024年02月14日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包