美文网首页
docker使用atrhas

docker使用atrhas

作者: dsjaikdnsajdnua | 来源:发表于2020-12-24 10:02 被阅读0次

简介

Arthas 是一款Alibaba开源的Java诊断工具,可以直接热更新代码,无需重启应用。这个对于我们排查问题十分的方便。官方有非常好的教程,提供临时服务器,在线执行命令可以很方便快速的入门:https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn

有时候,我们在测试环境需要打印一些日志,但是代码里面并没有输出。所以,以往我们会在本地添加对应日志之后,再推送到git,然后再到Jenkins构建,这样会比较麻烦。我们可以通过arthas直接添加需要的日志进行监控

下面说下在docker容器下如何使用。

安装

  1. 找到对应的镜像id

    sudo docker ps
    
  2. 进入对应镜像id的docker容器:

    docker exec -it [容器ID]  bash
    
  3. 下载Arthas的jar包

    curl -O https://arthas.aliyun.com/arthas-boot.jar
    

    下载完成,可以查看到当前目录下已经下载好了arthas的jar包,我们就可以直接运行该jar包:arthas-boot.jar

  4. 运行Arthas,并选择监控的java进程

    java -jar arthas-boot.jar
    

    出现如下提示:

    root@localhost:/usr# java -jar arthas-boot.jar
    [INFO] arthas-boot version: 3.4.5
    [INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
    * [1]: 6 /demo.jar
    

    并选择对应的java进程序号,比如需要监控demo应用,那么就输入:1。选择后,arthas完成启动,并打印以下信息:

    [INFO] arthas home: /root/.arthas/lib/3.4.5/arthas
    [INFO] Try to attach process 6
    [INFO] Attach process 6 success.
    [INFO] arthas-client connect 127.0.0.1 3658
      ,---.  ,------. ,--------.,--.  ,--.  ,---.   ,---.                           
     /  O  \ |  .--. ''--.  .--'|  '--'  | /  O  \ '   .-'                          
    |  .-.  ||  '--'.'   |  |   |  .--.  ||  .-.  |`.  `-.                          
    |  | |  ||  |\  \    |  |   |  |  |  ||  | |  |.-'    |                         
    `--' `--'`--' '--'   `--'   `--'  `--'`--' `--'`-----'                                                                      
    

修改java文件

有时候,我们在测试环境需要打印一些日志,但是代码里面并没有输出。所以,以往我们会在本地添加对应日志之后,再推送到git,然后再到Jenkins构建,这样会比较麻烦。我们可以通过arthas直接添加需要的日志进行监控

  1. 找到对应的类并反编译

    比如下面我们需要在UserController这个类添加一些日志,那么需要找到对应的包路经然后,反编译到docker容器内的/tmp文件夹下

    jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java
    

    执行成功后,对应的java文件就会出现在docker容器的/tmp目录下了。这时候,我们需要另开一个会话窗口在容器内进行操作

  2. 编辑对应的类

    因为这个类我们是通过反编译出来的,所以代码上会有一些优化,可读性不如我们的工程里面的代码。我们也可以直接拿工程里面的代码替换上去。但是反编译的话比较方便点。

    使用vi/vim命令编辑

    vim /tmp/UserController.java
    

    如果提示vim编辑器没有安装,我们也可以把代码拷贝到容器外面进行修改:

    我们返回到或者新建一个服务器的回话窗口,并把对应容器id的对应java文件拷贝到当前用户目录下:

    sudo docker cp [容器id]:/tmp/UserController.java ~
    
    # 编辑文件
    vi ~/UserController.java
    

    修改完成后,再把文件拷贝回容器内:

    sudo docker cp ~/UserController.java [容器ID]:/tmp/UserController.java
    
  3. 寻找对应的类加载器【我们后面编译的时候需要用到】

    执行命令,查看对应类的类加载器的hash

    sc -d *UserController | grep classLoaderHash
    

    列出所有类加载器的hash

    classloader -l 
    
    #############################显示如下#####################
    name                                                         loadedCount   hash
    org.springframework.boot.loader.LaunchedURLClassLoader@31221be2  18083        31221be2  sun.misc.Launcher$AppClassLoader@7f31245a                                       
     sun.misc.Launcher$AppClassLoader@7f31245a                        47           7f31245a  sun.misc.Launcher$ExtClassLoader@3ba9ad43                                       
     sun.misc.Launcher$ExtClassLoader@3ba9ad43                        41           3ba9ad43                     
    

    可以看到对应的类加载器就是:LaunchedURLClassLoader

  4. 通过mc命令进行内存编译

    mc --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader /tmp/UserController.java -d /tmp
    

    执行后会输出编译好的class文件位置:Memory compiler output: **/tmp/com/example/demo/arthas/user/UserController.class** Affect(row-cnt:1) cost in 346 ms

  5. 再使用redefine 重新加载对应的class文件

    redefine /tmp/com/example/demo/arthas/user/UserController.class
    

    完成,接下来就正常的执行原逻辑代码吧,如果没有提示编译错误,就可以看到添加的代码了。

总结

Arthas 简化了我们排查问题的步骤。

相关文章

网友评论

      本文标题:docker使用atrhas

      本文链接:https://www.haomeiwen.com/subject/hfopnktx.html