Arthas開源一週年,Github Star 16K,我們一直在堅持什麼?

緣起

最近看到一個很流行的標題,《開源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,感謝他們貢獻的改進:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-R3lWIJwB-1569563648008)(https://opencollective.com/arthas/contributors.svg?width=890&button=false)]

社區提交了一系列的改進,下面列出一些點(不完整):

  • 翻譯了大部分英文文檔的
  • 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。

橫雲斷嶺的專欄

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章