溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Arthas中如何使用watch命令

發(fā)布時(shí)間:2021-07-30 16:58:21 來源:億速云 閱讀:282 作者:Leah 欄目:云計(jì)算

Arthas中如何使用watch命令,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

Arthas 是什么

Arthas 官網(wǎng)是這么介紹自己的:

Arthas 是 Alibaba 開源的 Java 診斷工具,深受開發(fā)者喜愛。 當(dāng)你遇到以下類似問題而束手無策時(shí),Arthas 可以幫助你解決:

  1. 這個(gè)類從哪個(gè) jar 包加載的?為什么會(huì)報(bào)各種類相關(guān)的 Exception?

  2. 我改的代碼為什么沒有執(zhí)行到?難道是我沒 commit?分支搞錯(cuò)了?

  3. 遇到問題無法在線上 debug,難道只能通過加日志再重新發(fā)布嗎?

  4. 線上遇到某個(gè)用戶的數(shù)據(jù)處理有問題,但線上同樣無法 debug,線下無法重現(xiàn)!

  5. 是否有一個(gè)全局視角來查看系統(tǒng)的運(yùn)行狀況?

  6. 有什么辦法可以監(jiān)控到 JVM 的實(shí)時(shí)運(yùn)行狀態(tài)?

  7. 怎么快速定位應(yīng)用的熱點(diǎn),生成火焰圖?

一鍵安裝并啟動(dòng) Arthas

  • 方式一:通過 Cloud Toolkit 實(shí)現(xiàn) Arthas 一鍵遠(yuǎn)程診斷

Cloud Toolkit 是阿里云發(fā)布的免費(fèi)本地 IDE 插件,幫助開發(fā)者更高效地開發(fā)、測(cè)試、診斷并部署應(yīng)用。通過插件,可以將本地應(yīng)用一鍵部署到任意服務(wù)器,甚至云端(ECS、EDAS、ACK、ACR 和 小程序云等);并且還內(nèi)置了 Arthas 診斷、Dubbo工具、Terminal 終端、文件上傳、函數(shù)計(jì)算 和 MySQL 執(zhí)行器等工具。不僅僅有 IntelliJ IDEA 主流版本,還有 Eclipse、Pycharm、Maven 等其他版本。

推薦使用 IDEA 插件下載 Cloud Toolkit 來使用 Arthas:http://t.tb.cn/2A5CbHWveOXzI7sFakaCw8 

  • 方式二:直接下載

地址:https://github.com/alibaba/arthas。

curl -O https://alibaba.github.io/arthas/arthas-boot.jar && java -Dfile.encoding=UTF-8 -jar arthas-boot.jar
復(fù)制代碼

稍微解釋一下上面這條 shell 命令。命令分為兩部分,&& 之前的部分是下載 Arthas,之后的部分是啟動(dòng) Arthas。

你可能會(huì)疑惑下載文件為什么不用 wget 而是用 curl?這是因?yàn)橛行┓?wù)器是沒有預(yù)裝 wget 的,但是基本都預(yù)裝了 curl。如果你的服務(wù)器預(yù)裝了 wget 的話完全可以把 'curl' 改成 wget。

如果使用 wget 的話命令可以改成:

# wget 版命令
wget https://alibaba.github.io/arthas/arthas-boot.jar && java -Dfile.encoding=UTF-8 -jar arthas-boot.jar
復(fù)制代碼

另外一個(gè)需要解釋的點(diǎn)是 -Dfile.encoding=UTF-8,這個(gè) Java 設(shè)置是為了讓 Arthas 輸出中文的時(shí)候不會(huì)亂碼,這一點(diǎn)可以看一下我以前的文章 由 Arthas 中文亂碼引發(fā)的 Java 默認(rèn)編碼思考。

Arthas watch 命令

watch 讓你能方便地觀察到指定方法的調(diào)用情況。能觀察到的范圍為:返回值、拋出異常、入?yún)?/code>(還能觀察執(zhí)行函數(shù)的對(duì)象本身,不知道為什么官方介紹的時(shí)候沒說這個(gè)」,通過編寫 OGNL 表達(dá)式進(jìn)行對(duì)應(yīng)變量的查看。

# watch -h
# USAGE
watch [-b] [-e] [-x <value>] [-f] [-h] [-n <value>] [-E] [-M <value>] [-s] class-pattern method-pattern express [condition-express]
復(fù)制代碼

1. 觀察方法返回結(jié)果 returnObj

使用方式看著復(fù)雜,其實(shí)很簡(jiǎn)單。來個(gè)最簡(jiǎn)單的示例: 假設(shè)我們要觀察下面這段代碼中字符串的 contains 方法。

public class App {
    public static void main(String[] args) throws IOException {
        String hello = "Hello Arthas";
        while (true) {
            boolean contains = StringUtils.contains(hello, "Arthas");
            System.out.println(contains);
        }
    }
}
復(fù)制代碼

可以使用如下語句:

## 觀察 contains 返回結(jié)果
[arthas@11939]$ watch org.apache.commons.lang3.StringUtils contains returnObj -n 3
# Press Q or Ctrl+C to abort.
# Affect(class-cnt:1 , method-cnt:2) cost in 68 ms.
# ts=2020-05-02 16:46:04; [cost=2.424254ms] result=@Boolean[true]
# ts=2020-05-02 16:46:05; [cost=0.21033ms] result=@Boolean[true]
# ts=2020-05-02 16:46:06; [cost=0.165514ms] result=@Boolean[true]
復(fù)制代碼

-n 3 表示只執(zhí)行三次,這參數(shù)挺常用,不然很容易被輸出刷屏。

2. 過濾不關(guān)心的調(diào)用 condition-express

顯然,真實(shí)的案例肯定不會(huì)如上面的示例那么簡(jiǎn)單。 真實(shí)的服務(wù)代碼中,肯定不止一個(gè)地方調(diào)用了 String 的 contains 方法。我們需要把無關(guān)的調(diào)用過濾掉。

## 觀察 contains 返回結(jié)果,并且過濾掉無關(guān)調(diào)用
[arthas@11939]$ watch org.apache.commons.lang3.StringUtils contains returnObj 'params[1]=="Arthas"'
# Press Q or Ctrl+C to abort.
# Affect(class-cnt:1 , method-cnt:2) cost in 29 ms.
# ts=2020-05-02 16:48:50; [cost=0.331109ms] result=@Boolean[true]
# ts=2020-05-02 16:48:51; [cost=0.175224ms] result=@Boolean[true]
# ts=2020-05-02 16:48:52; [cost=0.138984ms] result=@Boolean[true]
復(fù)制代碼

入?yún)⑹且粋€(gè)很容易把不同調(diào)用區(qū)分開的方法,通過 params[1]=="Arthas" 這個(gè) condition-express,我們可以只保留第二個(gè)入?yún)⑹?Arthas 的函數(shù)調(diào)用。

3. 同時(shí)觀察入?yún)⒑徒Y(jié)果

[arthas@11939]$ watch org.apache.commons.lang3.StringUtils contains {params,returnObj} 'params[1]=="Arthas"'
# Press Q or Ctrl+C to abort.
# Affect(class-cnt:1 , method-cnt:2) cost in 33 ms.
# ts=2020-05-02 16:51:27; [cost=0.507486ms] result=@ArrayList[
#     @Object[][isEmpty=false;size=2],
#     @Boolean[true],
# ]
復(fù)制代碼

通過 {} 把字段包起來,可以同時(shí)觀察想觀察的字段??梢宰⒁獾揭粋€(gè)點(diǎn),params 是一個(gè)數(shù)組,但是打印 params 的時(shí)候并沒有把具體內(nèi)容打印出來,這個(gè)時(shí)候可以使用 -x 2 來指定打印對(duì)象的屬性遍歷深度。

arthas@11939]$ watch org.apache.commons.lang3.StringUtils contains  {params,returnObj} 'params[1]=="Arthas"' -x 2
# Press Q or Ctrl+C to abort.
# Affect(class-cnt:1 , method-cnt:2) cost in 35 ms.
# ts=2020-05-02 16:51:33; [cost=0.391218ms] result=@ArrayList[
#     @Object[][
#         @String[Hello Arthas],
#         @String[Arthas],
#     ],
#     @Boolean[true],
# ]
復(fù)制代碼

4. 給大家來幾個(gè)我實(shí)際用到的例子

在陌陌做動(dòng)態(tài)推薦開發(fā)的時(shí)候,測(cè)試時(shí)經(jīng)常會(huì)遇到查看某個(gè)用戶是否開啟了相應(yīng)的業(yè)務(wù)開關(guān),經(jīng)常就會(huì)需要查看某個(gè)實(shí)驗(yàn)開關(guān)是否開啟。

## 查看陌陌用戶 1234567 是否開啟 ElasticSearch 開關(guān)
watch com.momo.Experiment enableElasticSearch returnObj 'target.momoId=="1234567"'
# ts=2020-05-02 20:09:46; [cost=24.443527ms] result=@Boolean[true]
復(fù)制代碼

我還經(jīng)常會(huì)根據(jù)入?yún)⒌哪澳坝脩?id 進(jìn)行判斷,查看返回結(jié)果或者異常:

## 查看 MorecControlFlow 類的 process 方法返回結(jié)果
## process 方法第一個(gè)參數(shù)的 momoId 屬性值為 “123454567” 才生效
## 類路徑和陌陌號(hào)都非真實(shí)數(shù)據(jù)
watch com.momo.MorecControlFlow process returnObj 'params[0].momoId=="123454567"'
# ts=2019-03-18 21:09:46; [cost=264.434972ms] result=@Boolean[true]
## 查看 IMorecShuffler 類的 shuffle 拋的異常
## process 方法第一個(gè)參數(shù)的 momoId 屬性值為 “123454567” 才生效
watch com.momo.plugins.shuffler.IMorecShuffler shuffle throwExp 'params[0].morecRequest.momoId=="123454567"'
# ts=2019-03-27 20:54:29; [cost=46.642339ms] result=java.lang.IndexOutOfBoundsException: Index: 12, Size: 11
	at java.util.ArrayList.rangeCheckForAdd(ArrayList.java:665)
	at java.util.ArrayList.add(ArrayList.java:477)
	at com.momo.plugin.shuffler.RoomShuffler.shuffle(RoomShuffler:45)

看完上述內(nèi)容,你們掌握Arthas中如何使用watch命令的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI