docker使用atrhas

简介

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 简化了我们排查问题的步骤。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容