如何使用Arthas提高日常開發(fā)效率题造?

  1. Arthas有什么功能抑诸,怎么用,請看:Arthas使用手冊
  2. Arthas命令比較復(fù)雜弧械,一個幫助生成命令的IDEA插件:arthas idea plugin 使用文檔
  3. 基于Arthas實現(xiàn)的簡單好用的熱部署插件:ArthasHotSwap

一 引言

首先我們應(yīng)該拋棄面向debug編程的思維,debug不一定是最高效的方法空民,遇到線上問題不能debug了怎么辦刃唐。本文介紹如何使用Arthas代替debug提高日常開發(fā)效率。

開始之前界轩,可以先瀏覽下上面推薦的這些文章画饥,下面所使用到的東西在以上的文章都有詳細的講解。大家也可以先瀏覽下面的內(nèi)容浊猾,確定所描述的確實可以提高開發(fā)效率抖甘,再去看上面的文章也是可以的。

首先我們要安裝兩個插件“arthas idea” 和 “ArthasHotSwap”葫慎,IDEA可以直接安裝使用衔彻∞背瑁“arthas idea”是為了高效率生成Arthas命令,“ArthasHotSwap”可以實現(xiàn)簡單快捷的熱部署艰额。接下來我們通過幾個場景來看如何使用Arthas提高日開發(fā)常效率澄港。

二 5分鐘解決一個問題

1 問題表象

問題的表象是預(yù)發(fā)接口返回參數(shù)為空,不知道為什么為空柄沮,關(guān)鍵地方又沒有打日志回梧。怎么辦,debug祖搓?debug端口不好申請狱意,而且一直占用環(huán)境引起公憤。加日志重新部署棕硫?部署時間太長髓涯,而且不一定查看日志就能發(fā)現(xiàn)問題。接下去我將使用Arthas排查問題哈扮。


image

2 如何發(fā)現(xiàn)問題

第一步:定位相關(guān)方法

首先定位到相關(guān)的代碼,代碼如下圖所示蚓再,方法執(zhí)行結(jié)果應(yīng)該要返回一個map滑肉,也就是上面問題的extraData,返回為空摘仅,肯定是這里有問題靶庙,但不知道那行代碼的問題。借助Arthas可以想到的是娃属,我能觀測這個方法的出參和入?yún)⒘模f不定能發(fā)現(xiàn)問題。于是使用Arthas的watch命令觀測方法執(zhí)行情況矾端。


image
第二步:生成方法觀測命令

安裝了“arthas idea”插件之后掏击,在方法名上面單擊右鍵,選擇watch秩铆,如下圖所示砚亭。


image
第三步:登錄應(yīng)用服務(wù)器

一般應(yīng)用都部署在云上或其他遠程服務(wù)器,我們需要登錄應(yīng)用部署的服務(wù)器殴玛。

第四步:安裝Arthas

Arthas 支持在 Linux/Unix/Mac 等平臺上一鍵安裝捅膘,請復(fù)制以下內(nèi)容,并粘貼到命令行中滚粟,敲 回車 執(zhí)行即可寻仗。

curl -L https://arthas.aliyun.com/install.sh | sh
第五步:運行Arthas

上述命令會下載啟動腳本文件 as.sh 到當前目錄,直接在shell下面執(zhí)行./as.sh凡壤,就會進入交互界面署尤。

第六步:執(zhí)行觀測方法命令

第二步執(zhí)行完后蔬咬,觀測方法的命令已經(jīng)在粘貼板了,粘貼執(zhí)行就行沐寺,示例命令如下:

watch com.**.**.endpoint.BargainPlayApplyCycleEndPoint fetchPlayDetailRenderData '{params,returnObj,throwExp}' -n 5 -x 3 'params[0].getPlayToolDO().getId()==588'

命令解釋:'{params,returnObj,throwExp}' 表示觀測對象林艘,這里選擇了入?yún)ⅰ⒊鰠⒑彤惓#?n 5 表示觀測到5次后停止混坞,-x 3 表示打印觀測對象的時候只打印3層嵌套結(jié)構(gòu)狐援,'params[0].getPlayToolDO().getId()==588' 為條件表達式,滿足該條件的才會被觀測到究孕。

第七步:查看觀測結(jié)果

前端重新觸發(fā)執(zhí)行后啥酱,得到觀測結(jié)果如下所示,從入?yún)⒖梢钥吹絧layActivityApplyRequest中的targetId為null厨诸,實際上應(yīng)該要取playActivityRecordDO中的targetId镶殷。從返回結(jié)果可以看到確實是因為商品ID不存在原因。


image

3 更進一步解決問題

截止目前已經(jīng)發(fā)現(xiàn)了問題所在微酬,一般的同學都是修改代碼重新部署绘趋,等上10多分鐘。我們要做不一般的同學颗管,接下去就輪到ArthasHotSwap熱部署插件上場了陷遮。在IDEA的插件倉庫搜索并安裝ArthasHotSwap。

ArthasHotSwap 熱部署

修改代碼 -> maven編譯 -> 單擊右鍵選擇swap this class -> 熱部署命令已經(jīng)復(fù)制到粘貼板 -> 登錄遠程服務(wù)器粘貼并執(zhí)行熱部署命令 -> 熱部署成功

image
問題解決

熱部署成功垦江,問題解決帽馋,前端重新請求,前端展示正常比吭。

image

雖然整個鏈路看上去很長绽族,但是都是一些很簡單的復(fù)制粘貼操作,這是我在聯(lián)調(diào)過程中處理的實際問題衩藤,整個過程差不多就是5分鐘左右吧慢,切身感受到Arthas的便利,忍不住分享一下慷彤。

4 一些限制

arthas redefine有一些限制導致熱部署也有同樣的限制娄蔼。熱部署時候,不能修改方法名底哗、屬性字段岁诉,只能修改方法體里面的代碼。

redefine 命令和 jad/watch/trace/monitor/tt 等命令會沖突跋选。執(zhí)行完 redefine 之后涕癣,如果再執(zhí)行上面提到的命令,則會把 redefine 的字節(jié)碼重置。也就是說坠韩,熱部署執(zhí)行完成之后距潘,再執(zhí)行 jad/watch/trace/monitor/tt 等命令,會使熱部署失效只搁,所以在適當?shù)臅r候還是需要重新部署下音比。我們也可以采用其他方法規(guī)避,比如使用watch的時候氢惋,觀測其他類的方法洞翩,而不是熱部署的那個類。

三 方法執(zhí)行的時間隧道

上面的場景講到了使用watch命令觀測方法執(zhí)行參數(shù)焰望,但是watch是觀測方法執(zhí)行瞬間的情況骚亿。如果我們想重現(xiàn)上次的調(diào)用該怎么辦呢。

在日常開發(fā)過程中熊赖,環(huán)境問題是非常影響開發(fā)效率的来屠,特別是涉及其他團隊的應(yīng)用的時候,有時候希望上游再次觸發(fā)一次調(diào)用都是很困難的一件事情震鹉。當你用上面的方法解決了你的問題之后俱笛,你想調(diào)試一下,發(fā)現(xiàn)已經(jīng)夜深了足陨,不好意思再讓上游應(yīng)用觸發(fā)一次調(diào)用嫂粟,該怎么辦呢,自己根據(jù)watch觀測的方法入?yún)⒔M裝參數(shù)使用hsf控制臺調(diào)用墨缘?我們要做不一般的同學,用工具解放生產(chǎn)力零抬。

1 獲取tt命令

Arthas的tt命令可以獲取方法執(zhí)行數(shù)據(jù)的時空隧道镊讼,記錄下指定方法每次調(diào)用的入?yún)⒑头祷匦畔ⅲ⒛軐@些不同的時間下調(diào)用進行觀測平夜。

安裝好arthas idea插件之后蝶棋,在需要記錄執(zhí)行的方法上面單擊右鍵,選擇TimeTunnel Tt忽妒,出現(xiàn)下面的選擇框玩裙,第一個紅框是獲取記錄方法執(zhí)行的命令。第二個紅框是記錄方法執(zhí)行之后需要對記錄進行的操作段直,包括查看記錄列表吃溅、查看記錄執(zhí)行情況、重現(xiàn)調(diào)用等鸯檬。

image

2 記錄方法執(zhí)行

登錄遠程服務(wù)器决侈,運行以下兩條運行arthas,然后執(zhí)行從idea插件復(fù)制的tt -t命令來記錄方法執(zhí)行喧务,如下圖所示赖歌。如果想停止記錄可以輸入q枉圃,查看記錄使用tt -l。

curl -L https://arthas.aliyun.com/install.sh | sh
./as.sh
image

3 搜索方法執(zhí)行記錄

tt -l可以查看所有的方法執(zhí)行記錄庐冯,但是我們要和我們相關(guān)的執(zhí)行記錄孽亲,那么可以使用tt -s命令進行搜索。tt -s 命令后面需要攜帶過濾條件展父。條件表達式是使用OGNL編寫返劲,下面介紹幾個通常的過濾表達式。首先介紹下幾個對象犯祠,params表示入?yún)⑿竦龋琾arams[0]表示第一個參數(shù),params[1]表示第二個參數(shù)衡载,returnObj表示返回對象搔耕。

根據(jù)入?yún)⑦^濾:tt -s 'params[2].getRecordId() == 110213603'

根據(jù)返回結(jié)果過濾:tt -s 'returnObj.isSuccess() == false'

根據(jù)入?yún)⒑头祷亟Y(jié)果過濾:tt -s 'returnObj.isSuccess() == true && params[2].getRecordId() == 110213603'

4 查看方法執(zhí)行情況

tt -w 相當于tt下面的watch命令,可以用來查看方法執(zhí)行情況痰娱。使用idea插件獲取tt -w 命令更方便弃榨。

5 重新觸發(fā)

如果需要重新觸發(fā)某條記錄也是可行的,因為tt命令記錄當時調(diào)用的情況梨睁,所以可以本地發(fā)起一次調(diào)用鲸睛,tt -p -i 1000 命令的意思重新觸發(fā)idex=1000的那條記錄。不僅僅可以重新觸發(fā)坡贺,還可以間隔時間內(nèi)多次觸發(fā)官辈,tt -p --replay-times 5 --replay-interval 2000 -i 1000 表示重新觸發(fā)5次,每次間隔2s遍坟。

重新觸發(fā)的時候我們可能還想再watch下方法執(zhí)行情況拳亿,怎么辦呢,另外再打開一個頁面登錄遠程服務(wù)器愿伴,運行arthas肺魁,執(zhí)行 watch 命令。

6 一些限制

ThreadLocal 信息丟失

很多框架偷偷的將一些環(huán)境變量信息塞到了發(fā)起調(diào)用線程的 ThreadLocal 中隔节,由于調(diào)用線程發(fā)生了變化鹅经,這些 ThreadLocal 線程信息無法通過 Arthas 保存,所以這些信息將會丟失怎诫。一些常見的 CASE 比如:鷹眼的 TraceId 等瘾晃。

引用的對象

需要強調(diào)的是,tt 命令是將當前環(huán)境的對象引用保存起來刽虹,但僅僅也只能保存一個引用而已酗捌。如果方法內(nèi)部對入?yún)⑦M行了變更,或者返回的對象經(jīng)過了后續(xù)的處理,那么在 tt 查看的時候?qū)o法看到當時最準確的值胖缤。這也是為什么 watch 命令存在的意義尚镰。

轉(zhuǎn)載自

阿里技術(shù)-如何使用Arthas提高日常開發(fā)效率?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末哪廓,一起剝皮案震驚了整個濱河市狗唉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌涡真,老刑警劉巖分俯,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異哆料,居然都是意外死亡缸剪,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門东亦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來杏节,“玉大人,你說我怎么就攤上這事典阵》苡妫” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵壮啊,是天一觀的道長嫉鲸。 經(jīng)常有香客問我,道長歹啼,這世上最難降的妖魔是什么玄渗? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮狸眼,結(jié)果婚禮上捻爷,老公的妹妹穿的比我還像新娘。我一直安慰自己份企,他們只是感情好,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布巡莹。 她就那樣靜靜地躺著司志,像睡著了一般。 火紅的嫁衣襯著肌膚如雪降宅。 梳的紋絲不亂的頭發(fā)上骂远,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天,我揣著相機與錄音腰根,去河邊找鬼激才。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的瘸恼。 我是一名探鬼主播劣挫,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼东帅!你這毒婦竟也來了压固?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤靠闭,失蹤者是張志新(化名)和其女友劉穎帐我,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體愧膀,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡拦键,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了檩淋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芬为。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖狼钮,靈堂內(nèi)的尸體忽然破棺而出碳柱,到底是詐尸還是另有隱情,我是刑警寧澤熬芜,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布莲镣,位于F島的核電站,受9級特大地震影響涎拉,放射性物質(zhì)發(fā)生泄漏瑞侮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一鼓拧、第九天 我趴在偏房一處隱蔽的房頂上張望半火。 院中可真熱鬧,春花似錦季俩、人聲如沸钮糖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽店归。三九已至,卻和暖如春酪我,著一層夾襖步出監(jiān)牢的瞬間消痛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工都哭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留秩伞,地道東北人逞带。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像纱新,于是被迫代替她去往敵國和親展氓。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容