自帶IDEA插件的阿裡開源診斷神器Arthas線上項目BUG調試
前言
記得之前寫過一篇Arthas使用教程 ,通過使用Arthas我們既可以實現線上調試,還可以實現熱修復。最近逛瞭下Arthas的官網,發現它已經支持直接集成到SpringBoot應用中去,並且還出瞭專用的IDEA插件。今天我們再來體驗下它,看看它的功能是不是更強大瞭!
SpringBoot實戰電商項目mall(50k+star)地址:https://github.com/macrozheng/mall
Arthas簡介
Arthas是Alibaba開源的Java診斷利器,深受開發者喜愛,目前在Github上已有29K+Star。它采用命令行交互模式,同時提供豐富的 Tab 自動補全功能,進一步方便進行問題的定位和診斷。
ArthasTunnel
為瞭演示一個更加真實的線上環境,接下來我們將對Docker容器中的SpringBoot應用進行診斷。我們將使用ArthasTunnel
來實現,ArthasTunnel
相當於一個Web控制臺,使用它我們無需進入應用容器即可對應用進行診斷,非常方便。
首先我們需要下載ArthasTunnel
的安裝包,下載地址:
https://github.com/alibaba/arthas/releases
由於官方隻提供瞭JAR包,如果你想通過Docker方式啟動的話,可以自行打包Docker鏡像,打包使用的Dockerfile腳本如下:
# 該鏡像需要依賴的基礎鏡像 FROM java:8 # 將當前目錄下的jar包復制到docker容器的/目錄下 ADD arthas-tunnel-server.jar /arthas-tunnel-server.jar # 聲明服務運行的端口 EXPOSE 8080 7777 # 指定docker容器啟動時運行jar包 ENTRYPOINT ["java", "-jar","/arthas-tunnel-server.jar"] # 指定維護者的名字 MAINTAINER macro
這裡再提供一個一鍵打包運行ArthasTunnel
容器的執行腳本run.sh
,腳本內容如下;
#!/usr/bin/env bash # 定義應用組名 group_name='mall-tiny' # 定義應用名稱 app_name='arthas-tunnel-server' # 定義應用版本 app_version='1.0-SNAPSHOT' echo '----copy jar----' docker stop ${app_name} echo '----stop container----' docker rm ${app_name} echo '----rm container----' docker rmi ${group_name}/${app_name}:${app_version} echo '----rm image----' # 打包編譯docker鏡像 docker build -t ${group_name}/${app_name}:${app_version} . echo '----build image----' docker run -p 8080:8080 -p 7777:7777 --name ${app_name} \ -e TZ="Asia/Shanghai" \ -v /etc/localtime:/etc/localtime \ -v /mydata/app/${app_name}/logs:/var/logs \ -d ${group_name}/${app_name}:${app_version} echo '----start container----'
接下來吧ArthasTunnel
的JAR包、Dockerfile文件、執行腳本run.sh
上傳到Linux服務器上,然後使用./run.sh
命令運行即可;
運行成功後,可以直接訪問ArthasTunnel
的Web控制臺,訪問地址:http://192.168.3.105:8080
SpringBoot集成
在SpringBoot應用中直接集成Arthas並使用,無疑是最方便的,接下來我們將采用此種方法。
首先在項目的pom.xml
中添加如下依賴,可以對比下Arthas使用教程 中的使用方法,直接集成確實簡單不少;
<!--集成Java診斷利器Arthas--> <dependency> <groupId>com.taobao.arthas</groupId> <artifactId>arthas-spring-boot-starter</artifactId> <version>3.6.1</version> </dependency>
然後修改配置文件application.yml
,記住這個agent-id
,ArthasTunnel
連接需要使用,由於我們將會把應用容器通過--link
的方式連接到ArthasTunnel
容器,這裡的tunnel-server
按下面進行配置;
management: endpoints: web: exposure: # 暴露端點`/actuator/arthas` include: 'arthas' arthas: agent-id: mall-tiny-arthas tunnel-server: ws://arthas-tunnel-server:7777/ws
接下來通過之前的Dockerfile和run.sh
打包應用,run.sh
與之前對比,隻多瞭一行通過--link
連接到ArthasTunnel
容器的命令;
打包使用的Dockerfile和運行腳本run.sh
都已經包含在示例代碼中瞭,結構如下;
接下來在ArthasTunnel
的Web控制臺中輸入AgentId
為mall-tiny-arthas
,並點擊Connect
按鈕即可開始診斷Java應用瞭;
比如通過dashboard
命令來顯示當前系統的實時數據面板,包括線程信息、JVM內存信息及JVM運行時參數;
再比如說使用thread
命令查看當前線程信息,查看線程的堆棧,可以找出當前最占CPU的線程;
當然Arthas的功能非常強大,遠不止這些,支持動態修改日志和熱更新等,具體可以參考Arthas使用教程 。
IDEA插件
由於Arthas的功能很強大,需要記住的命令很多,有時候實在記不住,於是有瞭這款IDEA插件,該插件主要用於幫助生成Arthas命令。
直接在IDEA的插件市場搜索arthas
即可找到該插件,然後點擊安裝即可;
安裝完成後我們來聊聊如何使用,比如當我們覺得線上代碼和預期不一致,可以使用jad
命令反編譯下看看,直接選擇類,右鍵選擇Arthas命令然後選擇Jad反編譯;
此時將會直接把命令拷貝到剪切板,然後到ArthasTunnel
右鍵粘貼即可使用,比手打命令簡單多瞭吧!
如果你想觀察方法執行過程中的參數和返回值,可以使用watch
命令,選擇需要觀察的方法右鍵選擇即可;
這裡觀察下Controller中的方法的執行過程;
我們還可單獨修改某個類的日志級別,選中類名後右鍵選擇logger
命令;
先拷貝下logger sc
命令查看下當前類的日志級別為INFO
;
拷貝下ClassLoader的Hash值,這裡由於在Linux中Ctrl+C
鍵有沖突,使用Ctrl+Insert
組合來拷貝;
接下來輸入ClassLoader的Hash值,修改下日志級別,然後拷貝修改日志級別的命令;
執行完後再查看下日志級別,已經被改為瞭DEBUG
級別
總結
今天體驗瞭一把新版的Arthas,搭配ArthasTunnel和IDEA插件使用,確實非常方便!並且它還能和SpringBoot無縫集成,確實非常給力,更多Arthas的使用可以參考Arthas使用教程 。
參考資料
項目官網:https://github.com/alibaba/arthas
官方文檔:https://arthas.aliyun.com/doc/index.html
DEA插件使用文檔:https://www.yuque.com/arthas-idea-plugin
項目源碼地址
https://github.com/macrozheng/mall-learning/tree/master/mall-tiny-arthas2
更多關於Arthas線上項目BUG調試的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- 阿裡SpringBoot應用自動化部署實現IDEA版Jenkins
- Arthas排查Kubernetes中應用頻繁掛掉重啟異常
- Jenkins一鍵打包部署SpringBoot應用的方法步驟
- java之生產故障定位Arthas問題
- 一篇文章學會java死鎖與CPU 100%的排查