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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

阿里开源的那个牛X的问题排查工具——Arthas,推出IDEA插件了! | 文末福利

發布時間:2025/3/16 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 阿里开源的那个牛X的问题排查工具——Arthas,推出IDEA插件了! | 文末福利 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

△Hollis, 一個對Coding有著獨特追求的人△

這是Hollis的第?264篇原創分享

作者 l 汪小哥

來源 l Hollis(ID:hollischuang)

Arthas 對于很多Java開發者來說,已經不可分割了,在我們日常開發、線上問題排查中扮演了非常重要的角色。作為小開發的我,日常需要排查線上運營同學提的各種 bug、各種線上問題診斷、日常運維、線上問題優化等等。

?

在剛來公司時,我是比較恐懼運維任務的,代碼不熟悉、各種問題比較多...幾乎崩潰的狀態,運維的一周基本上沒有干活,完全是全身心投入到運維的任務中,排查問題效率低下。

由于深刻體驗到了這種奔潰,我一直想改變這種狀態,直到 Arthas 的開源,讓我在這種崩潰的狀態中減輕了不少負擔,同時也讓我成為了同事們咨詢 Arthas 排查問題的小幫手~~

?

雖然使用 Arthas 特別方便,但在此過程中也遇到一些問題,作為問題咨詢小幫手也感到有點不方便,因此才造就了 Arthas idea 插件的誕生。

?

目前 Arthas 官方的工具還不夠簡單,需要記住一些命令,特別是一些擴展性特別強的高級語法,比如 ognl 獲取 spring context 為所欲為,watch、trace 不夠簡單,需要構造一些命令工具的信息,因此只需要一個能夠簡單處理字符串信息的插件即可使用。

當在處理線上問題的時候需要最快速、最便捷的命令,因此 Idea Arthas plugin 插件還是有存在的意義和價值的。---這個是最初編寫這個插件的最核心的理由。

Arthas IDEA plugin 實踐

Arthas 的功能點非常的多(詳見下方大圖),這里就不一一的講解了,可以參考使用文檔 ,不過最近一直在更新,使用文檔中的命令名稱可能有變化。

?

插件安裝

下載arthas idea插件:

https://plugins.jetbrains.com/plugin/13581-arthas-idea

  • Mac:?Preferences?->?Plugins

  • Windows:Settings?->?Plugins

Install Plugin form Disk...?導入插件

安裝之后重啟IDEA就可以愉快的使用啦!

獲取static 變量

首先要獲取classloader的hash 值,然后獲取命令,這個是一個交互流程需要連貫性,后續只要是static 的通過static spring context的都需要有這個交互的流程,連貫的,都在同一個界面進行操作.粘貼執行,然后獲取結果即可。

這里的classloader的hash 值緩存起來的


最后合并的腳本如下。

ognl??-x??3?'@com.wangji92.arthas.plugin.demo.controller.StaticTest@INVOKE_STATIC_NAME'?-c?316bc132

反射設置static field

通過反射進行設置static field ,參考:https://github.com/WangJi92/arthas-idea-plugin/issues/1


填寫你想要修改的值、默認根據類型設置默認值 Str->"" Long -> 0L 等等。

ognl?-x?3??'#field=@com.wangji92.arthas.plugin.demo.controller.StaticTest@class.getDeclaredField("INVOKE_STATIC_FINAL"),#modifiers=#field.getClass().getDeclaredField("modifiers"),#modifiers.setAccessible(true),#modifiers.setInt(#field,#field.getModifiers()?&?~@java.lang.reflect.Modifier@FINAL),#field.setAccessible(true),#field.set(null,"設置的值")'?-c?316bc132


Spring Context Invoke

通過spring context 進行調用bean的方法、字段的內容。

Static Spring Context Invoke Method Field

首頁要設置一下static spring context的路徑

由于都是通過ognl 調用static的spring context 都需要classloader,這個就是配置的spring conetxt的地址信息:
@com.wangji92.arthas.plugin.demo.common.ApplicationContextProvider@context 參考demo 就需要配置這個地址。

ognl?-x?3?'#springContext=@com.wangji92.arthas.plugin.demo.common.ApplicationContextProvider@context,#springContext.getBean("commonController").getRandomInteger()'?-c?316bc132

Watch Spring Context Invoke Method Field

watch 這個是支持在spring mvc場景 通過watch 間接的獲取spring context,需要出發一次接口的調用,可以參考 :https://github.com/WangJi92/arthas-idea-plugin/issues/5

watch?-x?3?-n?1??org.springframework.web.servlet.DispatcherServlet?doDispatch?'@org.springframework.web.context.support.WebApplicationContextUtils@getWebApplicationContext(params[0].getServletContext()).getBean("commonController").getRandomInteger()'

TimeTunnel Spring Context Invoke Method Field

這個是參考了橫云斷嶺?的arthas 通過tt 獲取spring context 為所欲為 ,可以參考這個文檔:https://github.com/WangJi92/arthas-idea-plugin/issues/4 這里做了些什么?將整個連貫了起來,不需要記住參數信息,然后對于調用的參數進行簡單的默認封裝,復雜的參數場景不支持,需要手動拼接。


記錄獲取spring context

tt?-t?org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter?invokeHandlerMethod

然后根據這個target 獲取spring context 調用方法

tt?-w?'target.getApplicationContext().getBean("commonController").getRandomInteger()'?-x?3?-i?1000


獲取某個spring 環境變量

獲取spring 環境變量這里依托,static spring context ,當然這個watch 、和 tt 獲取spring context的場景也是支持的。在線上環境、測試環境程序多復雜,你怎么知道環境中的變量一定是你配置的?在nacos等等配置中心的場景,估計手速慢了一點點,可能就沒有上去,這個時候就有這種需求獲取當前的環境變量。選中變量,然后右鍵執行命令。由于使用靜態的static spring context 依然需要classloader的值.這里已經基本上是arthas的上層應用啦。

ognl?-x?3?'#springContext=@com.wangji92.arthas.plugin.demo.common.ApplicationContextProvider@context,#springContext.getEnvironment().getProperty("custom.name")'?-c?316bc132


獲取全部的spring 環境變量

比較優先級,最前面的一定優先級最高,你一定被spring的各種優先級順序搞暈了,那么怎么辦呢?arthas idea plugin 支持獲取當前的全部的環境變量,依次打印出來,這樣就可以了解優先級,特別是接入了nacos、diamond等遠程的配置中心,實現不一樣肯定更暈了。參考文檔:https://blog.csdn.net/xunjiushi9717/article/details/94050139

ognl?-x?3?'#springContext=@com.wangji92.arthas.plugin.demo.common.ApplicationContextProvider@context,#allProperties={},#standardServletEnvironment=#propertySourceIterator=#springContext.getEnvironment(),#propertySourceIterator=#standardServletEnvironment.getPropertySources().iterator(),#propertySourceIterator.{#key=#this.getName(),#allProperties.add("????????????????"),#allProperties.add("-------------------------?name:"+#key),#this.getSource()?instanceof?java.util.Map??#this.getSource().entrySet().iterator.{#key=#this.key,#allProperties.add(#key+"="+#standardServletEnvironment.getProperty(#key))}:#{}},#allProperties'?-c?316bc132


TimeTunnel Tt

方法執行數據的時空隧道,記錄下指定方法每次調用的入參和返回信息,并能對這些不同的時間下調用進行觀測(可以重新觸發,周期觸發,唯一缺點對于ThreadLocal 信息丟失[隱含參數]、引用對象數據變更無效),這個方便二次觸發,特別是自己調試不方便的情況下記錄下來,二次觸發、周期觸發,不過自從段嶺大神tt 為所欲為之后都被帶偏了。這里arthas 插件做了一些什么?增加了二次觸發的一些常用的命令,不讓使用者愁于記憶,整個過程更加的具有連貫性。

stack 堆棧

獲取方法從哪里執行的調用棧(用途:源碼學習調用堆棧,了解調用流程) 這個是非常好用的功能,對于喜歡樂于排查問題的小伙伴真是福音,arthas idea 插件只是修改的命令的集成,之前也處理自己編碼過程中的問題,源碼、問題排查技巧-Java Debug and Arthas:https://blog.csdn.net/u012881904/article/details/104591529

stack?com.wangji92.arthas.plugin.demo.controller.CommonController?getRandomInteger?-n?5


Decompile Class Jad

反編譯方法、類的源碼, 有時候需要查看提交的代碼是否上線呢?這個功能就非常的友好。參考文檔:https://github.com/WangJi92/arthas-idea-plugin/issues/2

jad?--source-only?com.wangji92.arthas.plugin.demo.controller.CommonController?getRandomInteger


watch、trace

增加了默認參數、默認展開的層級 限制次數,使用者不用知道這些核心的參數,簡單的使用就好了,要使用更加的高級的自己help 一下就知道了。

watch?com.wangji92.arthas.plugin.demo.controller.CommonController?getRandomInteger?'{params,returnObj,throwExp}'?-n?5?-x?3 trace?com.wangji92.arthas.plugin.demo.controller.CommonController?getRandomInteger?-n?5


trace -E(層級的打印trace)

trace -E 自己構造起來非常的麻煩,通過界面操作簡化了一下,需要觀察多個類、多個方法的場景。選擇你需要的場景繼續添加即可。

trace?-E?com.wangji92.arthas.plugin.demo.controller.CommonController|com.wangji92.arthas.plugin.demo.service.ArthasTestService?traceE|doTraceE?-n?5


Heap Dump

打印堆棧,有點類似 jmap -dump:format=b,file=/temp/dump.hprof pid 下載下來使用MAT分析即可。

heapdump??/tmp/dump.hprof?打印堆棧信息?


特殊用法鏈接

這個必須要說一下,這個特殊用法的鏈接在線上自己束手無措的時候可以查看一下,非常有用。


對于通過spring context 調用方法說明

通過spring context 調用復雜的方法其實是不支持的,由于這個操作起來不方便,還是必須手工處理一下。
比如這里的 Map?names 的處理方式可以借鑒一下子。更多可以參考demo https://github.com/WangJi92/arthas-plugin-demo

/***?復雜參數調用?場景*?static?spring?context*?ognl?-x?3?'#user=new?com.wangji92.arthas.plugin.demo.controller.User(),#user.setName("wangji"),#user.setAge(27L),#springContext=@com.wangji92.arthas.plugin.demo.common.ApplicationContextProvider@context,#springContext.getBean("commonController").complexParameterCall(#{"wangji":#user})'?-c?e374b99**?watch?get?spring?context?備注?需要調用一次方法*?watch?-x?3?-n?1??org.springframework.web.servlet.DispatcherServlet?doDispatch?'#user=new?com.wangji92.arthas.plugin.demo.controller.User(),#user.setName("wangji"),#user.setAge(27L),@org.springframework.web.context.support.WebApplicationContextUtils@getWebApplicationContext(params[0].getServletContext()).getBean("commonController").complexParameterCall(#{"wangji":#user})'**?tt?get?spring?context?,only?first?get?time?index?ok*?tt?-w?'#user=new?com.wangji92.arthas.plugin.demo.controller.User(),#user.setName("wangji"),#user.setAge(27L),target.getApplicationContext().getBean("commonController").complexParameterCall(#{"wangji":#user})'?-x?3?-i?1000*?@return*/@RequestMapping("complexParameterCall")@ResponseBodypublic?String?complexParameterCall(@RequestBody??Map<String,?User>?names)?{if?(names?==?null)?{return?"EMPTY";}return?names.toString();}

總結

本文簡單介紹了Arthas IDEA插件的安裝與使用技巧,該插件解放了大家對于 Arthas 使用的一些記憶、機械性的重復工作,歡迎大家試用!

Arthas官方舉行了征文活動,于?3 月 26 日—— 4 月 26 日舉辦,如果你有

  • 使用 Arthas 排查過的問題

  • 對?Arthas 進行源碼解讀

  • 對?Arthas 提出建議

  • 不限,其它與 Arthas 有關的內容

? ?

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

? ?

點擊閱讀原文接入征文活動地址。

福利時間

GIFT TIME

Arthas 技術社區特意將本次征文活動的一部分禮品(天貓精靈1臺、淘公仔2個、CNCF指尖陀螺3個)贊助了給到Hollis的讀者

大家只需要評論說一下你覺得Arthas怎么樣,有沒有幫你解決什么問題,或者有什么建議之類的

點贊第1名獲得天貓精靈、第2-3名獲得淘公仔、第4-6名獲得指尖陀螺。

Java工程師成神之路系列文章

在 GitHub 更新中,歡迎關注,歡迎star。

?

直面Java第309期:HotSpot虛擬機在JDK1.8以后,方法區是怎么實現的

深入并發第013期:拓展synchronized——鎖優化

- MORE | 更多精彩文章 -

  • Java工程師成神之路 | 2020正式版

  • 原諒我一直對B站有誤解!

  • 一口氣說出6種@Transactional注解失效場景

  • 為什么0.1 + 0.2 = 0.300000004

如果你喜歡本文,

請長按二維碼,關注?Hollis.

轉發至朋友圈,是對我最大的支持。

好文章,我在看??

總結

以上是生活随笔為你收集整理的阿里开源的那个牛X的问题排查工具——Arthas,推出IDEA插件了! | 文末福利的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。