新网Logo
首页>虚机资讯>

Arthas 开源一周年,GitHub Star 16 K ,我们一直在坚持什么?

登录 注册

Arthas 开源一周年,GitHub Star 16 K ,我们一直在坚持什么?

  • 来源:网络
  • 更新日期:2020-08-05

摘要:建站服务器 缘起 最近看到一个很流行的标题,《开源XX年,star XXX,我是如何坚持的》。 看到这样的标题,忽然发觉 Arthas 从 2018 年 9 月开源

建站服务器 缘起

最近看到一个很流行的标题,《开源XX年,star XXX,我是如何坚持的》。
看到这样的标题,忽然发觉 Arthas 从 2018 年 9 月开源以来,刚好一年了,正好在这个秋高气爽的时节做下总结和回顾。


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

Github: https://github.com/alibaba/arthas[1]
文档: https://alibaba.github.io/arthas[2]

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


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 基础教程[3] Arthas 进阶教程[4]

通过基础教程,可以在交互终端里一步步入门,通过进阶教程可以深入理解 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 ,还产生了一些洐生项目,下面是其中两个:

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

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



回馈开源

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

后记

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

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

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


原文链接

本文为云栖社区原创内容,未经允许不得转载。

新网虚拟主机