Arthas 是 Alibaba 開源的 Java 診斷工具,深受開發(fā)者喜愛。
Github:
https://github.com/alibaba/arthas[1]
文檔:
https://alibaba.github.io/arthas[2]
回顧 Arthas Star 數(shù)的歷史,一直保持快速增長,目前已經(jīng)突破 16 K。
Arthas Github Star歷史曲線
感謝用戶的支持,既是壓力也是動力。在過去開源的一年里, Arthas 發(fā)布了 7 個 Release 版本,我們一直堅持三點:
持續(xù)改進易用性
持續(xù)增加好用的命令
從開源社區(qū)中獲取力量,回報社區(qū)
持續(xù)改進易用性
Arthas 一直把易用性放在第一位,在開源之后,我們做了下面的改進:
開發(fā) arthas boot ,支持 Windows/Linux/Mac 統(tǒng)一體驗
絲滑的自動補全,參考了 jshell 的體驗
高效的歷史命令匹配, Up/Down 直達
改進類搜索匹配功能,更好支持 lambda 和內(nèi)部類
完善重定向機制
支持 JDK 9/10/11
支持 docker
支持 rpm/deb 包安裝
盡管我們在易用性下了很大的功夫,但是發(fā)現(xiàn)很多時候用戶比較難入門,因此,我們參考了 k8s 的 Interactive Tutorial ,推出了 Arthas 的在線教程:
Arthas 基礎(chǔ)教程[3]
Arthas 進階教程[4]
通過基礎(chǔ)教程,可以在交互終端里一步步入門,通過進階教程可以深入理解 Arthas 排查問題的案例。
另外,為了方便用戶大規(guī)模部署,我們實現(xiàn)了 tunnel server 和用戶數(shù)據(jù)回報功能:
增加 tunnel server ,統(tǒng)一管理 Agent 連接
增加用戶數(shù)據(jù)回報功能,方便做安全管控
持續(xù)增加好用的命令
Arthas 號稱是 Java 應(yīng)用診斷利器,那么我們自己要對得起這個口號。在開源之后, Arthas 持續(xù)增加了 10 多個命令。
ognl 命令任意代碼執(zhí)行
mc 線上內(nèi)存編譯器
redefine 命令線上熱更新代碼
logger 命令一鍵查看應(yīng)用里的所有 logger 配置
sysprop 查看更新 System Properties
sysenv 查看環(huán)境變量
vmoption 查看更新 VM option
logger 查看 logger 配置,更新 level
mbean 查看 JMX 信息
heapdump 堆內(nèi)存快照
下面重點介紹兩個功能。
jad/mc/redefine 一條龍熱更新線上代碼
以 Arthas 在線教程 里的 UserController 為例:
1、使用 jad 反編譯代碼
jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java
2、使用 vim 編譯代碼
當(dāng) 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
在網(wǎng)站壓力大的時候(比如雙 11 ),有個緩解措施就是把應(yīng)用的日志 level 修改為 ERROR 。那么有兩個問題:
復(fù)雜應(yīng)用的日志系統(tǒng)可能會有多個,那么哪個日志系統(tǒng)配置真正生效了?
怎樣在線上動態(tài)修改 logger 的 level ?
通過 logger 命令,可以查看應(yīng)用里 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.
從開源社區(qū)中獲取力量,回報社區(qū)
感謝 67 位 Contributors
Arthas 開源以來,一共有 67 位 Contributors ,感謝他們貢獻的改進:
Arthas Contributors
社區(qū)提交了一系列的改進,下面列出一些點(不完整):
翻譯了大部分英文文檔的
trace 命令支持行號
打包格式支持 rpm/deb
改進命令行提示符為 arthas@pid
改進對 windows 的支持
增加 mbean 命令
改進 webconsole 的體驗
另外,有 83 個公司/組織登記了他們的使用信息,歡迎更多的用戶來登記:
洐生項目
基于 Arthas ,還產(chǎn)生了一些洐生項目,下面是其中兩個:
Bistoury : 去哪兒網(wǎng)開源的集成了 Arthas 的項目
arthas-mvel : 一個使用 MVEL 腳本的 fork
用戶案例分享
廣大用戶在使用 Arthas 排查問題過程中,分享了很多排查過程和心得,歡迎大家來分享。
回饋開源
Arthas 本身使用了很多開源項目的代碼,在開源過程中,我們給 netty, ognl, cfr 等都貢獻了改進代碼,回饋上游。
后記
在做 Arthas 宣傳小冊子時, Arthas 的宣傳語是:
“贈人玫瑰之手,經(jīng)久猶有余香”
希望 Arthas 未來能幫助到更多的用戶解決問題,也希望廣大的開發(fā)者對 Arthas 提出更多的改進和建議。
原文鏈接
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
更多關(guān)于云服務(wù)器,域名注冊,虛擬主機的問題,請訪問西部數(shù)碼官網(wǎng):ps-sw.cn