Arthas入门篇

# Arthas入门篇

简介:

Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。

官网地址:简介 | arthas (aliyun.com)

功能清单:

启动arthas:

  • 本地启动:

    本地通过cmd命令启动,首先通过命令下载arthas的jar包,再通过命令启动,attach到需要检测的java进程上。

     

    arduino

    代码解读

    复制代码

    curl -O https://arthas.aliyun.com/arthas-boot.jar java -jar arthas-boot.jar
  • k8s容器启动

  • 线上docker容器内容器(需要root权限)

    1. 复制容器id
    1. 进入容器

       

      csharp

      代码解读

      复制代码

      [root@cm-nginx-node-swarm spider-patrol]# docker exec -it 628a1e1b90f3 bash bash-4.4# cd /root bash-4.4# cd arthas/ bash-4.4# java -jar arthas-boot.jar 1

arthas idea plugin 实践

该插件使用教程可以参考插件作者汪小哥的文档

安装下载:

直接通过IDEA下载,或链接下载plugins.jetbrains.com/plugin/1358…

基础使用

在使用之前首先要获取classloader的hash 值,然后获取命令,这个是一个交互流程需要连贯性,后续只要是static 的通过static spring context的都需要有这个交互的流程,连贯的,都在同一个界面进行操作.粘贴执行,然后获取结果即可。

 

perl

代码解读

复制代码

[arthas@20796]$ sc -d com.cloudstore.leaf.DeviceAbnormalController | grep classLoaderHash classLoaderHash   18b4aac2  #类加载器的hashcode [arthas@20796]$

获取static变量

粘贴命令,可以看到控制台打印出了静态变量的值。

设置static变量

 

scala

代码解读

复制代码

ognl -x 3 '#field=@com.cloudstore.leaf.DeviceAbnormalController@class.getDeclaredField("ARTHAS_STR"),#field.setAccessible(true),#field.set(null,"设置的字符串")'  -c 18b4aac2

可以看到,变量已经被修改。

注意:变量如果被final关键字修饰后,则不能通过此方法修改。

通过spring context 进行调用bean的方法、字段的内容

当获取到spring的上下文对象后,便可以通过context获得bean,进行一系列操作。

  1. 首先需要一个类获取Spring:

     

    typescript

    代码解读

    复制代码

    /** * @author wangrongyi * @description 提供给arthas ognl 获取context的信息 */ @Component public class ApplicationContextProvider implements ApplicationContextAware { private static ApplicationContext context; ​ public ApplicationContext getApplicationContext() { return context; } ​ @Override public void setApplicationContext(ApplicationContext ctx) { context = ctx; } }
  2. 设置一下static spring context的路径,就是上面静态ApplicationContext变量的路径

  3. 设置完之后就可以通过ognl命令调用方法

    ognl的完整使用以及如何调用带参数的方法参考:【Arthas】命令之ognl使用姿势

     

    less

    代码解读

    复制代码

    ognl -x 3 '#springContext=@com.cloudstore.leaf.core.config.ApplicationContextProvider@context,#springContext.getBean("deviceAbnormalController").testArthas()' -c 18b4aac2

    tips:私有方法也可以调用。Arthas可以与JRebel热部署插件结合在本地使用,不用写单测和接口就能对任意方法进行调用测试,对提升开发效率有奇效。

监控命令monitor、watch、trace、tt

jad反编译:

可以通过反编译查看部署的代码是否生效。

image-20230703111242184

反编译整个类: jad --source-only com.cloudstore.leaf.DeviceAbnormalController

反编译指定方法: jad --source-only com.cloudstore.leaf.DeviceAbnormalController testArthas

arthas实现热更新(线上环境慎用!)

修改前:

image-20230703141838619

修改后:

  1. 打包上传需要替换掉的.class文件,

  2. 获取该类加载器的hashcode

     

    perl

    代码解读

    复制代码

    [arthas@20796]$ sc -d com.cloudstore.leaf.DeviceAbnormalController | grep classLoaderHash classLoaderHash 18b4aac2  #类加载器的hashcode [arthas@20796]$
  3. 通过redefine命令替换对应的.class文件

    image-20230703135941756

     

    ruby

    代码解读

    复制代码

    [arthas@20796]$ redefine -c 18b4aac2 "D:\JavaProjects\spider\spider-leaf\leaf-api\target\classes\com\cloudstore\leaf\DeviceAbnormalController.class" redefine success, size: 1, classes: com.cloudstore.leaf.DeviceAbnormalController [arthas@20796]$

    image-20230703140244864

    注意:这种方法替换的是该java进程的二进制文件,并未修改.class 文件,所以反编译.class文件是看不到改动的。

  • 15
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值