V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hengyunabc
V2EX  ›  程序员

定体文|摸鱼|Arthas 开源一周年, Star 16K,我们一直在坚持什么?

  •  1
     
  •   hengyunabc ·
    hengyunabc · 2019-09-27 11:40:43 +08:00 · 1631 次点击
    这是一个创建于 1882 天前的主题,其中的信息可能已经有所发展或是发生改变。

    迟到了😂

    缘起

    最近看到一个很流行的标题,《开源 XX 年,star XXX,我是如何坚持的》。

    看到这样的标题,忽然发觉 Arthas 从 2018 年 9 月开源以来,刚好一年了,正好在这个秋高气爽的时节做下总结和回顾。

    Arthas

    Arthas是 Alibaba 开源的 Java 诊断工具,深受开发者喜爱。

    回顾 Arthas Star 数的历史,一直保持快速增长,目前已经突破 16K。

    Arthas Github Star 历史曲线

    感谢用户的支持,既是压力也是动力。在过去开源的一年里,Arthas 发布了 7 个 Release 版本,我们一直 坚持三点:

    • 持续改进易用性
    • 持续增加好用的命令
    • 从开源社区中获取力量,回报社区

    持续改进易用性

    Arthas 一直把易用性放在第一位,在开源之后,我们做了下面的改进:

    • 开发 arthas boot,支持 Windows/Linux/Mac 统一体验
    • 丝滑的自动补全,参考了 jshell 的体验
    • 高效的历史命令匹配,Up/Down直达
    • 改进类搜索匹配功能,更好支持 lambda 和内部类
    • 完善重定向机制
    • 支持 JDK 9/10/11
    • 支持 Docker
    • 支持 rpm/deb 包安装

    尽管我们在易用性下了很大的功夫,但是发现很多时候用户比较难入门,因此,我们参考了 k8s 的 Interactive Tutorial,推出了 Arthas 的在线教程:

    通过基础教程,可以在交互终端里一步步入门,通过进阶教程可以深入理解 Arthas 排查问题的案例。

    另外,为了方便用户大规模部署,我们实现了 tunnel server 和用户数据回报功能:

    • 增加 tunnel server,统一管理 Agent 连接
    • 增加用户数据回报功能,方便做安全管控

    持续增加好用的命令

    Arthas 号称是 Java 应用诊断利器,那么我们自己要对得起这个口号。在开源之后,Arthas 持续增加了 10 多个命令。

    • ognl 命令任意代码执行
    • mc 线上内存编译器
    • redefine 命令线上热更新代码
    • logger 命令一键查看应用里的所有 logger 配置
    • sysprop 查看更新 System Properties
    • sysenv 查看环境变量
    • vmoption 查看更新 VM option
    • logger 查看 logger 配置,更新 level
    • mbean 查看 JMX 信息
    • heapdump 堆内存快照

    下面重点介绍两个功能。

    jad/mc/redefine 一条龙热更新线上代码

    Arthas 在线教程 里的UserController为例:

    1. 使用 jad 反编译代码

      jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java
      
    2. 使用 vim 编译代码

      当 user id 小于 1 时,也正常返回,不抛出异常:

          @GetMapping("/user/{id}")
          public User findUserById(@PathVariable Integer id) {
              logger.info("id: {}" , id);
      
              if (id != null && id < 1) {
                  return new User(id, "name" + id);
                  // throw new IllegalArgumentException("id < 1");
              } else {
                  return new User(id, "name" + id);
              }
          }
      
    3. 使用mc命令编译修改后的UserController.java

      $ mc /tmp/UserController.java -d /tmp
      Memory compiler output:
      /tmp/com/example/demo/arthas/user/UserController.class
      Affect(row-cnt:1) cost in 346 ms
      
    4. 使用redefine命令,因为可以热更新代码

      $ redefine /tmp/com/example/demo/arthas/user/UserController.class
      redefine success, size: 1
      

    通过 logger 命令查看配置,修改 level

    在网站压力大的时候(比如双 11 ),有个缓解措施就是把应用的日志 level 修改为 ERROR。 那么有两个问题:

    • 复杂应用的日志系统可能会有多个,那么哪个日志系统配置真正生效了?
    • 怎样在线上动态修改 logger 的 level ?

    通过logger命令,可以查看应用里 logger 的详细配置信息,比如FileAppender输出的文件,AsyncAppender是否blocking

    [arthas@2062]$ logger
     name                                   ROOT
     class                                  ch.qos.logback.classic.Logger
     classLoader                            sun.misc.Launcher$AppClassLoader@2a139a55
     classLoaderHash                        2a139a55
     level                                  INFO
     effectiveLevel                         INFO
     additivity                             true
     codeSource                             file:/Users/hengyunabc/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar
     appenders                              name            CONSOLE
                                            class           ch.qos.logback.core.ConsoleAppender
                                            classLoader     sun.misc.Launcher$AppClassLoader@2a139a55
                                            classLoaderHash 2a139a55
                                            target          System.out
                                            name            APPLICATION
                                            class           ch.qos.logback.core.rolling.RollingFileAppender
                                            classLoader     sun.misc.Launcher$AppClassLoader@2a139a55
                                            classLoaderHash 2a139a55
                                            file            app.log
                                            name            ASYNC
                                            class           ch.qos.logback.classic.AsyncAppender
                                            classLoader     sun.misc.Launcher$AppClassLoader@2a139a55
                                            classLoaderHash 2a139a55
                                            blocking        false
                                            appenderRef     [APPLICATION]
    

    也可以在线修改 logger 的 level:

    [arthas@2062]$ logger --name ROOT --level debug
    update logger level success.
    

    从开源社区中获取力量,回报社区

    感谢 67 位 Contributors

    Arthas 开源以来,一共有 67 位 Contributors,感谢他们贡献的改进:

    Arthas Contributors

    社区提交了一系列的改进,下面列出一些点(不完整):

    • 翻译了大部分英文文档的
    • trace 命令支持行号
    • 打包格式支持 rpm/deb
    • 改进命令行提示符为 arthas@pid
    • 改进对 windows 的支持
    • 增加mbean命令
    • 改进 webconsole 的体验

    另外,有 83 个公司 /组织登记了他们的使用信息,欢迎更多的用户来登记:

    Arthas Users

    洐生项目

    基于 Arthas,还产生了一些洐生项目,下面是其中两个:

    • Bistoury: 去哪儿网开源的集成了 Arthas 的项目
    • arthas-mvel: 一个使用 MVEL 脚本的 fork

    用户案例分享

    广大用户在使用 Arthas 排查问题过程中,分享了很多排查过程和心得,欢迎大家来分享。

    Arthas 用户案例分享

    回馈开源

    Arthas 本身使用了很多开源项目的代码,在开源过程中,我们给 netty, ognl, cfr 等都贡献了改进代码,回馈上游。

    后记

    在做 Arthas 宣传小册子时,Arthas 的宣传语是:

    “赠人玫瑰之手,经久犹有余香”

    希望 Arthas 未来能帮助到更多的用户解决问题,也希望广大的开发者对 Arthas 提出更多的改进和建议。

    最后是抽奖 环节,大家可以转发文章,在公众号后台留言自己和 Arthas 的故事,或者给 Arthas 提出建议,奖品是 Arthas 的卫衣一件:

    Arthas 卫衣

    公众号

    欢迎关注横云断岭的专栏,专注 Java,Spring Boot,Arthas,Dubbo。

    横云断岭的专栏

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   985 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 21:08 · PVG 05:08 · LAX 13:08 · JFK 16:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.