如何使用Arthas提高日常开发效率?
簡介:?1. Arthas有什么功能,怎么用,請看:Arthas使用手冊 2. Arthas命令比較復雜,一個幫助生成命令的IDEA插件:arthas idea plugin 使用文檔 3. 基于Arthas實現的簡單好用的熱部署插件:ArthasHotSwap
作者 | 默達
來源 | 阿里技術公眾號
一 引言
首先我們應該拋棄面向debug編程的思維,debug不一定是最高效的方法,遇到線上問題不能debug了怎么辦。本文介紹如何使用Arthas代替debug提高日常開發效率。
開始之前,可以先瀏覽下上面推薦的這些文章,下面所使用到的東西在以上的文章都有詳細的講解。大家也可以先瀏覽下面的內容,確定所描述的確實可以提高開發效率,再去看上面的文章也是可以的。
首先我們要安裝兩個插件“arthas idea” 和 “ArthasHotSwap”,IDEA可以直接安裝使用。“arthas idea”是為了高效率生成Arthas命令,“ArthasHotSwap”可以實現簡單快捷的熱部署。接下來我們通過幾個場景來看如何使用Arthas提高日開發常效率。
二 5分鐘解決一個問題
1 問題表象
問題的表象是預發接口返回參數為空,不知道為什么為空,關鍵地方又沒有打日志。怎么辦,debug?debug端口不好申請,而且一直占用環境引起公憤。加日志重新部署?部署時間太長,而且不一定查看日志就能發現問題。接下去我將使用Arthas排查問題。
2 如何發現問題
第一步:定位相關方法
首先定位到相關的代碼,代碼如下圖所示,方法執行結果應該要返回一個map,也就是上面問題的extraData,返回為空,肯定是這里有問題,但不知道那行代碼的問題。借助Arthas可以想到的是,我能觀測這個方法的出參和入參,說不定能發現問題。于是使用Arthas的watch命令觀測方法執行情況。
第二步:生成方法觀測命令
安裝了“arthas idea”插件之后,在方法名上面單擊右鍵,選擇watch,如下圖所示。
第三步:登錄應用服務器
一般應用都部署在云上或其他遠程服務器,我們需要登錄應用部署的服務器。
第四步:安裝Arthas
Arthas 支持在 Linux/Unix/Mac 等平臺上一鍵安裝,請復制以下內容,并粘貼到命令行中,敲 回車 執行即可。
curl -L https://arthas.aliyun.com/install.sh | sh第五步:運行Arthas
上述命令會下載啟動腳本文件 as.sh 到當前目錄,直接在shell下面執行./as.sh,就會進入交互界面。
第六步:執行觀測方法命令
第二步執行完后,觀測方法的命令已經在粘貼板了,粘貼執行就行,示例命令如下:
watch com.**.**.endpoint.BargainPlayApplyCycleEndPoint fetchPlayDetailRenderData '{params,returnObj,throwExp}' -n 5 -x 3 'params[0].getPlayToolDO().getId()==588'命令解釋:'{params,returnObj,throwExp}' 表示觀測對象,這里選擇了入參、出參和異常,-n 5 表示觀測到5次后停止,-x 3 表示打印觀測對象的時候只打印3層嵌套結構,'params[0].getPlayToolDO().getId()==588' 為條件表達式,滿足該條件的才會被觀測到。
第七步:查看觀測結果
前端重新觸發執行后,得到觀測結果如下所示,從入參可以看到playActivityApplyRequest中的targetId為null,實際上應該要取playActivityRecordDO中的targetId。從返回結果可以看到確實是因為商品ID不存在原因。
3 更進一步解決問題
截止目前已經發現了問題所在,一般的同學都是修改代碼重新部署,等上10多分鐘。我們要做不一般的同學,接下去就輪到ArthasHotSwap熱部署插件上場了。在IDEA的插件倉庫搜索并安裝ArthasHotSwap。
ArthasHotSwap 熱部署
修改代碼 -> maven編譯 -> 單擊右鍵選擇swap this class -> 熱部署命令已經復制到粘貼板 -> 登錄遠程服務器粘貼并執行熱部署命令 -> 熱部署成功
問題解決
熱部署成功,問題解決,前端重新請求,前端展示正常。
雖然整個鏈路看上去很長,但是都是一些很簡單的復制粘貼操作,這是我在聯調過程中處理的實際問題,整個過程差不多就是5分鐘左右,切身感受到Arthas的便利,忍不住分享一下。
4 一些限制
arthas redefine有一些限制導致熱部署也有同樣的限制。熱部署時候,不能修改方法名、屬性字段,只能修改方法體里面的代碼。
redefine 命令和 jad/watch/trace/monitor/tt 等命令會沖突。執行完 redefine 之后,如果再執行上面提到的命令,則會把 redefine 的字節碼重置。也就是說,熱部署執行完成之后,再執行 jad/watch/trace/monitor/tt 等命令,會使熱部署失效,所以在適當的時候還是需要重新部署下。我們也可以采用其他方法規避,比如使用watch的時候,觀測其他類的方法,而不是熱部署的那個類。
三 方法執行的時間隧道
上面的場景講到了使用watch命令觀測方法執行參數,但是watch是觀測方法執行瞬間的情況。如果我們想重現上次的調用該怎么辦呢。
在日常開發過程中,環境問題是非常影響開發效率的,特別是涉及其他團隊的應用的時候,有時候希望上游再次觸發一次調用都是很困難的一件事情。當你用上面的方法解決了你的問題之后,你想調試一下,發現已經夜深了,不好意思再讓上游應用觸發一次調用,該怎么辦呢,自己根據watch觀測的方法入參組裝參數使用hsf控制臺調用?我們要做不一般的同學,用工具解放生產力。
1 獲取tt命令
Arthas的tt命令可以獲取方法執行數據的時空隧道,記錄下指定方法每次調用的入參和返回信息,并能對這些不同的時間下調用進行觀測。
安裝好arthas idea插件之后,在需要記錄執行的方法上面單擊右鍵,選擇TimeTunnel Tt,出現下面的選擇框,第一個紅框是獲取記錄方法執行的命令。第二個紅框是記錄方法執行之后需要對記錄進行的操作,包括查看記錄列表、查看記錄執行情況、重現調用等。
2 記錄方法執行
登錄遠程服務器,運行以下兩條運行arthas,然后執行從idea插件復制的tt -t命令來記錄方法執行,如下圖所示。如果想停止記錄可以輸入q,查看記錄使用tt -l。
curl -L https://arthas.aliyun.com/install.sh | sh ./as.sh3 搜索方法執行記錄
tt -l可以查看所有的方法執行記錄,但是我們要和我們相關的執行記錄,那么可以使用tt -s命令進行搜索。tt -s 命令后面需要攜帶過濾條件。條件表達式是使用OGNL編寫,下面介紹幾個通常的過濾表達式。首先介紹下幾個對象,params表示入參,params[0]表示第一個參數,params[1]表示第二個參數,returnObj表示返回對象。
- 根據入參過濾:tt -s 'params[2].getRecordId() == 110213603'
- 根據返回結果過濾:tt -s 'returnObj.isSuccess() == false'
- 根據入參和返回結果過濾:tt -s 'returnObj.isSuccess() == true && params[2].getRecordId() == 110213603'
4 查看方法執行情況
tt -w 相當于tt下面的watch命令,可以用來查看方法執行情況。使用idea插件獲取tt -w 命令更方便。
5 重新觸發
如果需要重新觸發某條記錄也是可行的,因為tt命令記錄當時調用的情況,所以可以本地發起一次調用,tt -p -i 1000 命令的意思重新觸發idex=1000的那條記錄。不僅僅可以重新觸發,還可以間隔時間內多次觸發,tt -p --replay-times 5 --replay-interval 2000 -i 1000 表示重新觸發5次,每次間隔2s。
重新觸發的時候我們可能還想再watch下方法執行情況,怎么辦呢,另外再打開一個頁面登錄遠程服務器,運行arthas,執行 watch 命令。
6 一些限制
ThreadLocal 信息丟失
很多框架偷偷的將一些環境變量信息塞到了發起調用線程的 ThreadLocal 中,由于調用線程發生了變化,這些 ThreadLocal 線程信息無法通過 Arthas 保存,所以這些信息將會丟失。一些常見的 CASE 比如:鷹眼的 TraceId 等。
引用的對象
需要強調的是,tt 命令是將當前環境的對象引用保存起來,但僅僅也只能保存一個引用而已。如果方法內部對入參進行了變更,或者返回的對象經過了后續的處理,那么在 tt 查看的時候將無法看到當時最準確的值。這也是為什么 watch 命令存在的意義。
原文鏈接
本文為阿里云原創內容,未經允許不得轉載。
總結
以上是生活随笔為你收集整理的如何使用Arthas提高日常开发效率?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里云助力江苏省财政厅力推统一公共支付平
- 下一篇: 3千字带你搞懂XXL-JOB任务调度平台