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 提出更多的改進和建議。
原文鏈接
本文為云棲社區原創內容,未經允許不得轉載。
更多關于云服務器,域名注冊,虛擬主機的問題,請訪問三五互聯官網:m.shinetop.cn