日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

      歡迎訪問 生活随笔!

      生活随笔

      當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

      编程问答

      Arthas watch 命令使用指南

      發(fā)布時間:2025/3/20 编程问答 34 豆豆
      生活随笔 收集整理的這篇文章主要介紹了 Arthas watch 命令使用指南 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

      作者 | Agentd

      Arthas watch 命令使用指南

      Arthas 是我很喜歡的一款 Java 領(lǐng)域的開發(fā)調(diào)試工具。

      每次測試遇到問題的時候,當(dāng)別人為了加一條日志而重發(fā)代碼,我都會欣慰地拿出我的 Arthas 并且告訴他們:少年,你不用再為了加日志就重發(fā)代碼而煩惱了。Arthas,你值得擁有。

      這次我要介紹的是我使用最多的一個功能:watch。Arthas 功能雖多,但我最喜歡的還是這一個。使用 watch 之后,我再也不用為了觀察函數(shù)調(diào)用而加日志了。

      Arthas 是什么

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

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

    1. 這個類從哪個 jar 包加載的?為什么會報各種類相關(guān)的 Exception?
    2. 我改的代碼為什么沒有執(zhí)行到?難道是我沒 commit?分支搞錯了?
    3. 遇到問題無法在線上 debug,難道只能通過加日志再重新發(fā)布嗎?
    4. 線上遇到某個用戶的數(shù)據(jù)處理有問題,但線上同樣無法 debug,線下無法重現(xiàn)!
    5. 是否有一個全局視角來查看系統(tǒng)的運行狀況?
    6. 有什么辦法可以監(jiān)控到 JVM 的實時運行狀態(tài)?
    7. 怎么快速定位應(yīng)用的熱點,生成火焰圖?
    8. 一鍵安裝并啟動 Arthas

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

      Cloud Toolkit 是阿里云發(fā)布的免費本地 IDE 插件,幫助開發(fā)者更高效地開發(fā)、測試、診斷并部署應(yīng)用。通過插件,可以將本地應(yīng)用一鍵部署到任意服務(wù)器,甚至云端(ECS、EDAS、ACK、ACR 和 小程序云等);并且還內(nèi)置了 Arthas 診斷、Dubbo工具、Terminal 終端、文件上傳、函數(shù)計算 和 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,之后的部分是啟動 Arthas。

      你可能會疑惑下載文件為什么不用 wget 而是用 curl?這是因為有些服務(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ù)制代碼

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

      Arthas watch 命令

      watch 讓你能方便地觀察到指定方法的調(diào)用情況。能觀察到的范圍為:返回值、拋出異常、入?yún)?#xff08;還能觀察執(zhí)行函數(shù)的對象本身,不知道為什么官方介紹的時候沒說這個」,通過編寫 OGNL 表達式進行對應(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è)我們要觀察下面這段代碼中字符串的 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

      顯然,真實的案例肯定不會如上面的示例那么簡單。 真實的服務(wù)代碼中,肯定不止一個地方調(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)⑹且粋€很容易把不同調(diào)用區(qū)分開的方法,通過 params[1]=="Arthas" 這個 condition-express,我們可以只保留第二個入?yún)⑹?Arthas 的函數(shù)調(diào)用。

      3. 同時觀察入?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ù)制代碼

      通過 {} 把字段包起來,可以同時觀察想觀察的字段。可以注意到一個點,params 是一個數(shù)組,但是打印 params 的時候并沒有把具體內(nèi)容打印出來,這個時候可以使用 -x 2 來指定打印對象的屬性遍歷深度。

      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. 給大家來幾個我實際用到的例子

      在陌陌做動態(tài)推薦開發(fā)的時候,測試時經(jīng)常會遇到查看某個用戶是否開啟了相應(yīng)的業(yè)務(wù)開關(guān),經(jīng)常就會需要查看某個實驗開關(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)常會根據(jù)入?yún)⒌哪澳坝脩?id 進行判斷,查看返回結(jié)果或者異常:

      ## 查看 MorecControlFlow 類的 process 方法返回結(jié)果 ## process 方法第一個參數(shù)的 momoId 屬性值為 “123454567” 才生效 ## 類路徑和陌陌號都非真實數(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 方法第一個參數(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: 11at java.util.ArrayList.rangeCheckForAdd(ArrayList.java:665)at java.util.ArrayList.add(ArrayList.java:477)at com.momo.plugin.shuffler.RoomShuffler.shuffle(RoomShuffler:45) 復(fù)制代碼

      一些小提示

      上面我只是列了一下常用的觀察方式和參數(shù),watch 支持的命令還有很多,你可以查看 Arthas 的 watch 命令官方文檔。

      還可以通過啟動 arthas 命令之后使用 watch -h 查看。

      使用 Arthas 的過程中很多人會覺得獲取類的全限定名很費勁,其實這個可以通過 Idea 的 Copy Refrence 快捷鍵解決。我自己定義的快捷鍵是 ???C。

      還有一點就是寫代碼的時候最好把代碼拆細,盡量把小功能也封裝成單獨的函數(shù),等你需要使用 Arthas 觀察函數(shù)調(diào)用的時候,你會回來感謝自己的。

      Arthas 征文活動火熱進行中

      Arthas 官方正在舉行征文活動,如果你有:

      • 使用 Arthas 排查過的問題
      • 對 Arthas 進行源碼解讀
      • 對 Arthas 提出建議
      • 不限,其它與 Arthas 有關(guān)的內(nèi)容

      歡迎參加征文活動,還有獎品拿哦~點擊投稿

      “阿里巴巴云原生關(guān)注微服務(wù)、Serverless、容器、Service Mesh 等技術(shù)領(lǐng)域、聚焦云原生流行技術(shù)趨勢、云原生大規(guī)模的落地實踐,做最懂云原生開發(fā)者的公眾號。”

      總結(jié)

      以上是生活随笔為你收集整理的Arthas watch 命令使用指南的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

      如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。