在阿里內(nèi)部是如何 Debug 線上問(wèn)題的偏塞?

在日常工作中我們經(jīng)常會(huì)遇到一些線上異常的情況唱蒸,而且有些問(wèn)題只有在線上才會(huì)出現(xiàn),由于環(huán)境和數(shù)據(jù)不一樣在本地和測(cè)試環(huán)境根本沒(méi)辦法復(fù)現(xiàn)灸叼,而且線上也沒(méi)有輸出日志神汹,那么遇到這種情況我們往往要怎么去解決呢?

常規(guī)做法

如果實(shí)在遇到上面的情況古今,在本地和測(cè)試都無(wú)法復(fù)現(xiàn)屁魏,那最常規(guī)的做法就是拉個(gè)線上分支的版本,增加一些調(diào)試日志捉腥,然后再重新發(fā)布版本進(jìn)行調(diào)試氓拼。運(yùn)氣好加一次日志就可以找到問(wèn)題,運(yùn)氣不好的話可能還要發(fā)布好幾次才能定位到問(wèn)題抵碟。

高級(jí)做法

下載安裝 arthas

Arthas 是阿里開(kāi)源的一款線上監(jiān)控診斷產(chǎn)品桃漾,通過(guò)全局視角實(shí)時(shí)查看應(yīng)用 load、內(nèi)存立磁、gc呈队、線程的狀態(tài)信息,并能在不修改應(yīng)用代碼的情況下唱歧,對(duì)業(yè)務(wù)問(wèn)題進(jìn)行診斷宪摧,包括查看方法調(diào)用的出入?yún)ⅰ惓B溃O(jiān)測(cè)方法執(zhí)行耗時(shí)几于,類加載信息等,大大提升線上問(wèn)題排查效率沿后。

上面的 Arthas 這款工具的官方介紹沿彭,從中我們可以看到這個(gè)工具可以查看方法的出入?yún)ⅲ惓R约氨O(jiān)測(cè)方法的耗時(shí)尖滚,我們排查問(wèn)題的時(shí)候最重要的就是想知道一些方法的入?yún)⒑头祷睾砹酰辛巳雲(yún)⒑头祷氐臄?shù)據(jù)我們就可以模擬出具體的場(chǎng)景從而解決線上的問(wèn)題瞧柔。

注意這里說(shuō)的方法不單單是外層的接口方法,任何 Service 層或者 RPC 層的方法都是可以的睦裳。之所以提出這一點(diǎn)是因?yàn)楹芏鄷r(shí)候線上的接口都會(huì)有請(qǐng)求和結(jié)果的日志記錄造锅,但是并沒(méi)有內(nèi)部某個(gè)具體方法的入?yún)⒑头祷兀ㄟ^(guò) Arthas 我們可以監(jiān)控任何方法的入?yún)⒑头祷刂怠?/p>

我們可以在
https://github.com/alibaba/arthas/releases 這個(gè)地址上下載具體的版本廉邑,下載下來(lái)就可以用哥蔚,沒(méi)什么難度。接下來(lái)阿粉通過(guò)一個(gè)案例來(lái)帶大家使用一下 Arthas蛛蒙。

測(cè)試

首先我們啟動(dòng)一個(gè) Spring Boot 應(yīng)用糙箍,并且對(duì)外一個(gè) http 的接口,具體的 Controller 和 Service 代碼實(shí)現(xiàn)如下牵祟。

package com.example.demo.controller;import com.example.demo.service.HelloService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class HelloController {  @Autowired  private HelloService helloService;  @GetMapping(value = "/hello")  public String hello(@RequestParam("name") String name) {    return helloService.sayHello(name);  }}
package com.example.demo.service;import org.springframework.stereotype.Service;@Servicepublic class HelloService {  public String sayHello(String name) {    String result = doSomething(name);    return "hello: " + result;  }   private String doSomething(String name) {    return name + " 歡迎關(guān)注 Java 極客技術(shù)";  }}

上面的代碼非常簡(jiǎn)單深夯,對(duì)外暴露了一個(gè) hello 接口,接收一個(gè) name 參數(shù)课舍,Service 中通過(guò) sayHello 方法塌西,調(diào)用了一個(gè)內(nèi)部的 doSomething 方法。其中過(guò)后我們?cè)L問(wèn)
http://127.0.0.1:8080/hello?name=ziyou 可以看到如下的內(nèi)容筝尾。

image.png

到這里都沒(méi)什么問(wèn)題捡需,但是我們想象一下,如果在某些 case doSomething 的方法比較復(fù)雜筹淫,我們想知道在執(zhí)行 doSomething 方法的時(shí)候具體的入?yún)⒑头祷刂凳鞘裁凑净裕@個(gè)時(shí)候我們要怎么辦呢?

當(dāng)然如果采用上面的常規(guī)做法损姜,增加一些日志饰剥,當(dāng)然是可以,不過(guò)我們這里就來(lái)演示一下如何使用 Arthas 來(lái)實(shí)現(xiàn)這個(gè)效果摧阅。前面我們已經(jīng)下載了 Arthas 了汰蓉,下載完成后是一個(gè)壓縮包,解壓過(guò)后棒卷,可以通過(guò)命令java -jar arthas-boot.jar 來(lái)啟動(dòng) Arthas顾孽。效果如下


image.png

可以看到啟動(dòng)過(guò)后 Arthas 會(huì)找到目前系統(tǒng)當(dāng)中在運(yùn)行的 Java 進(jìn)程,我這里有四個(gè)進(jìn)程比规,然后輸入我們要監(jiān)控的進(jìn)程編號(hào)若厚,這里是 4,然后回車蜒什,接下來(lái)我們就進(jìn)入了 Arthas 的界面测秸。

接下來(lái)我們使用 Arthas 的 watch 命令來(lái)監(jiān)控入?yún)⒑头祷刂担暾拿钊缦拢簑atch
com.example.demo.service.HelloService doSomething '{params,returnObj}

image.png

接下來(lái)我們?cè)偃ピL問(wèn)一下剛剛的接口,可以看到在終端上面有對(duì)應(yīng)的數(shù)據(jù)輸出霎冯。

image.png

簡(jiǎn)單解釋一下對(duì)應(yīng)的命令和輸出的信息铃拇,watch 是 Arthas 提供的命令,后面根據(jù)第一個(gè)參數(shù)是完整的類路徑肃晚,第二個(gè)參數(shù)是我們要監(jiān)控的方法名锚贱,第三個(gè)參數(shù)是一個(gè)表達(dá)是這里我們可以獲取入?yún)⒁约胺祷刂祷蛘弋惓5刃畔ⅲ瑢?duì)應(yīng)的取值有 params 數(shù)組形式关串,可以通過(guò) params[0] 來(lái)獲取對(duì)應(yīng)的屬性,returnObj 表示返回值监徘,并且這兩個(gè)都是可以通過(guò) .的形式晋修,獲取下面屬性的值的。

image.png

watch 命令后面的第三個(gè)參數(shù)其實(shí)是一個(gè) ognl 表達(dá)式凰盔,如下所示我們是可以做一些計(jì)算和邏輯處理的墓卦,這就帶來(lái)了很多高級(jí)的用法。Arthas的一些特殊用法文檔說(shuō)明
https://github.com/alibaba/arthas/issues/71

image.png
image.png

總結(jié)

Arthas 除了 watch 之外還有很多其他的命令可以使用户敬,比如 trace 可以統(tǒng)計(jì)每個(gè)方法執(zhí)行的耗時(shí)落剪,對(duì)于我們做一些性能優(yōu)化有很大的幫助,還有比如支持熱部署的功能等尿庐。完整的命令和使用方式大家可以在這個(gè)網(wǎng)址找到
https://arthas.aliyun.com/doc/忠怖,并且這里還提供了一套在線演示的功能,可以在在線教程中通過(guò)終端依次親手執(zhí)行每個(gè)命令來(lái)學(xué)習(xí)抄瑟。官方提供了一個(gè)應(yīng)用程序 math-game.jar 可以讓我們?cè)诰€調(diào)試凡泣,感興趣的小伙伴可以去試一試。

image.png

原文
https://developer.51cto.com/article/714859.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末皮假,一起剝皮案震驚了整個(gè)濱河市鞋拟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌惹资,老刑警劉巖贺纲,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異褪测,居然都是意外死亡猴誊,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)汰扭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)稠肘,“玉大人,你說(shuō)我怎么就攤上這事萝毛∠钜酰” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)环揽。 經(jīng)常有香客問(wèn)我略荡,道長(zhǎng),這世上最難降的妖魔是什么歉胶? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任汛兜,我火速辦了婚禮,結(jié)果婚禮上通今,老公的妹妹穿的比我還像新娘粥谬。我一直安慰自己,他們只是感情好辫塌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布漏策。 她就那樣靜靜地躺著,像睡著了一般臼氨。 火紅的嫁衣襯著肌膚如雪掺喻。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天储矩,我揣著相機(jī)與錄音感耙,去河邊找鬼。 笑死持隧,一個(gè)胖子當(dāng)著我的面吹牛即硼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播舆蝴,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼谦絮,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了洁仗?” 一聲冷哼從身側(cè)響起层皱,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赠潦,沒(méi)想到半個(gè)月后叫胖,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡她奥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年瓮增,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哩俭。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡绷跑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出凡资,到底是詐尸還是另有隱情砸捏,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站垦藏,受9級(jí)特大地震影響梆暖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜掂骏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一轰驳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧弟灼,春花似錦级解、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至辛馆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間豁延,已是汗流浹背昙篙。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留诱咏,地道東北人苔可。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像袋狞,于是被迫代替她去往敵國(guó)和親焚辅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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