天天看點

Arthas開源一周年,Star 160K,我們一直在堅持什麼?緣起持續改進易用性持續增加好用的指令從開源社群中擷取力量,回報社群後記

緣起

最近看到一個很流行的标題,《開源XX年,star XXX,我是如何堅持的》。

看到這樣的标題,忽然發覺Arthas從2018年9月開源以來,剛好一年了,正好在這個秋高氣爽的時節做下總結和回顧。

Arthas開源一周年,Star 160K,我們一直在堅持什麼?緣起持續改進易用性持續增加好用的指令從開源社群中擷取力量,回報社群後記

Arthas是Alibaba開源的Java診斷工具,深受開發者喜愛。

回顧Arthas Star數的曆史,一直保持快速增長,目前已經突破160K。

Arthas開源一周年,Star 160K,我們一直在堅持什麼?緣起持續改進易用性持續增加好用的指令從開源社群中擷取力量,回報社群後記

感謝使用者的支援,既是壓力也是動力。在過去開源的一年裡,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,感謝他們貢獻的改進:

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

  • 翻譯了大部分英文文檔的
  • trace指令支援行号
  • 打包格式支援rpm/deb
  • 改進指令行提示符為 arthas@pid
  • 改進對windows的支援
  • 增加mbean指令
  • 改進webconsole的體驗

另外,有83個公司/組織登記了他們的使用資訊,歡迎更多的使用者來登記:

Arthas開源一周年,Star 160K,我們一直在堅持什麼?緣起持續改進易用性持續增加好用的指令從開源社群中擷取力量,回報社群後記

洐生項目

基于Arthas,還産生了一些洐生項目,下面是其中兩個:

  • Bistoury: 去哪兒網開源的內建了Arthas的項目
  • arthas-mvel: 一個使用MVEL腳本的fork

使用者案例分享

廣大使用者在使用Arthas排查問題過程中,分享了很多排查過程和心得,歡迎大家來分享。

Arthas開源一周年,Star 160K,我們一直在堅持什麼?緣起持續改進易用性持續增加好用的指令從開源社群中擷取力量,回報社群後記

回饋開源

Arthas本身使用了很多開源項目的代碼,在開源過程中,我們給netty, ognl, cfr等都貢獻了改進代碼,回饋上遊。

後記

在做Arthas宣傳小冊子時,Arthas的宣傳語是:

“贈人玫瑰之手,經久猶有餘香”

希望Arthas未來能幫助到更多的使用者解決問題,也希望廣大的開發者對Arthas提出更多的改進和建議。