一、背景
目前Arthas 官方的工具還不夠足夠的簡單,需要記住一些命令,特別是一些擴展性特別強的高級語法,比如ognl獲取spring context 為所欲為,watch、trace 不夠簡單,需要構造一些命令工具的信息,因此只需要一個能夠簡單處理字符串信息的插件即可使用。當在處理線上問題的時候需要最快速、最便捷的命令,因此Idea arthas 插件還是有存在的意義和價值的。
二、支持的功能
支持的功能都是平時處理最常用的一些功能,一些快捷的鏈接,在處理緊急問題時候不需要到處查找,都是一些基本的功能,自動復制到剪切板中去,方便快捷。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-cnt72s5t-1579489232408)(./arthas idea plugin 插件,arthas 使用更加絲滑起來/format,png#align=left&display=inline&height=286&name=image-20200119120930544.png&originHeight=572&originWidth=1074&size=241010&status=done&style=none&width=537)]
2.1 watch
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-B4UR3lc3-1579489232409)(./arthas idea plugin 插件,arthas 使用更加絲滑起來/format,png#align=left&display=inline&height=230&name=image-20200119120931284.png&originHeight=460&originWidth=1570&size=326956&status=done&style=none&width=785)]
watch com.command.idea.plugin.utils.StringUtils toLowerFristChar '{params,returnObj,throwExp}' -n 5 -x 3
1
2.2 trace
2.2.1 基本trace
trace com.command.idea.plugin.utils.StringUtils toLowerFristChar -n 5
1
2.2.2 trace -E
trace命令只會trace匹配到的函數里的子調用,並不會向下trace多層。因為trace是代價比較貴的,多層trace可能會導致最終要trace的類和函數非常多。因此Arthas 官方支持 trace -E 特殊獲取多個,該插件支持一下trace -E
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-7Dq2z0z6-1579489232410)(./arthas idea plugin 插件,arthas 使用更加絲滑起來/format,png#align=left&display=inline&height=295&name=image-20200119120931394.png&originHeight=590&originWidth=1144&size=283907&status=done&style=none&width=572)]
trace -E com.github.wangji92.arthas.plugin.utils.ClipboardUtils|com.github.wangji92.arthas.plugin.utils.OgnlPsUtils getClassBeanName|setClipboardString -n 5
1
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-aFnbGISH-1579489232410)(./arthas idea plugin 插件,arthas 使用更加絲滑起來/format,png#align=left&display=inline&height=140&name=image-20200119120930968.png&originHeight=280&originWidth=1086&size=175088&status=done&style=none&width=543)]
2.3 static ognl (字段或者方法)
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-0DptejIm-1579489232410)(./arthas idea plugin 插件,arthas 使用更加絲滑起來/format,png#align=left&display=inline&height=234&name=image-20200119120931185.png&originHeight=468&originWidth=1410&size=304620&status=done&style=none&width=705)]
2.3.1 右鍵static ognl
2.3.2 獲取classload命令
必須要獲取,不然會找不到classload,arthas 官方獲取問題系統的classload,spring 項目應該無法獲取到這個class的信息,因此首先執行一下這個命令
sc -d com.command.idea.plugin.utils.StringUtils
1
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-FWqp2xVl-1579489232411)(./arthas idea plugin 插件,arthas 使用更加絲滑起來/format,png#align=left&display=inline&height=196&name=image-20200119120930527.png&originHeight=392&originWidth=1346&size=218372&status=done&style=none&width=673)]
2.3.2 復制到界面,獲取命令,執行即可
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-FIGnmP4T-1579489232412)(./arthas idea plugin 插件,arthas 使用更加絲滑起來/format,png#align=left&display=inline&height=126&name=image-20200119120930837.png&originHeight=252&originWidth=1290&size=161506&status=done&style=none&width=645)]
ognl -x 3 '@com.command.idea.plugin.utils.StringUtils@toLowerFristChar(" ")' -c 8bed358
1
2.4 Invoke Bean Method
實際上就是根據當前的spring項目中的獲取靜態的spring context這樣可以直接根據這個context直接獲取任何的Bean方法,一般在Java后端服務中都有這樣的Utils類,因此這個可以看為一個常量! 可以參考:http://www.dcalabresi.com/blog/java/spring-context-static-class/ 有了這個,我們可以跟進一步的進行數據簡化,由於在idea這個環節中,可以獲取方法參數,spring bean的名稱等等,非常的方便。
public class ApplicationContextProvider implements ApplicationContextAware {
private static ApplicationContext context;
public ApplicationContext getApplicationContext() {
return context;
}
@Override
public void setApplicationContext(ApplicationContext ctx) {
context = ctx;
}
}
12345678910111213
2.4.1 設置獲取spring context的上下文
ps 這里可以使用@applicationContextProvider@context 這樣,比如還行進行函數調用可以直接使用ognl逗號分割可以繼續執行的語法,比如 @applicationContextProvider@context,#springContext.getBean(“name”).todo() 后續我們需要在界面調用任何的方法都會添加上這句話。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-cixwIoFR-1579489232412)(./arthas idea plugin 插件,arthas 使用更加絲滑起來/format,png#align=left&display=inline&height=701&name=image-20200119120930870.png&originHeight=1402&originWidth=2152&size=547914&status=done&style=none&width=1076)]
2.4.2 右鍵點擊需要調用的方法
這里的策略和static ognl 一樣的,本質還是ognl的調用。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-AaQuVxht-1579489232413)(./arthas idea plugin 插件,arthas 使用更加絲滑起來/format,png#align=left&display=inline&height=191&name=image-20200119120931351.png&originHeight=382&originWidth=1632&size=318255&status=done&style=none&width=816)]
ognl -x 3 '#springContext=@applicationContextProvider@context,#springContext.getBean("arthasInstallCommandAction").actionPerformed(new com.intellij.openapi.actionSystem.AnActionEvent())' -c desw22
1
特別說明
太復雜的參數不太適用於對於線上問題的診斷,因此方法參數盡可能的簡單,這里有一套規則,因為ognl的語法和Java類似的,在獲取到參數的時候會進行默認的參數構造處理。
String ——> “”
Number、Byte 、Char ——> 0
Map ——> #{"":" "} ognl 語法
List ——>{}
數組 int[] ——>new int[]{}
other ——> new XXXClass() 參數太復雜了默認直接new了一個
Special 你的參數可能是從springContext中獲取,你可以修改表達式
…,#newParam= #springContext.getBean(“beanName”).todo(),#springContext.getBean(“other”).to(#newParam)
這樣使用參數定義到你的bash腳本中去,這種屬於特殊用法,不具有一般的通用性
2.5 install(linux)
安裝腳本,可以一鍵的通過as.sh 進行執行
curl -sk https://arthas.gitee.io/arthas-boot.jar -o ~/.arthas-boot.jar && echo "alias as.sh='java -jar ~/.arthas-boot.jar --repo-mirror aliyun --use-http'" >> ~/.bashrc && source ~/.bashrc
1
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-0O7zrdp7-1579489232413)(./arthas idea plugin 插件,arthas 使用更加絲滑起來/format,png#align=left&display=inline&height=257&name=image-20200119120931319.png&originHeight=514&originWidth=2060&size=649699&status=done&style=none&width=1030)]
2.6 常用特殊用法鏈接
- special ognl
- tt get spring context
- get error filter
- dubbo 遇上arthas
- Arthas實踐–jad/mc/redefine線上熱更新一條龍
- ognl 使用姿勢
三、其他
3.1 安裝
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-CgVLtl0W-1579489232414)(./arthas idea plugin 插件,arthas 使用更加絲滑起來/format,png#align=left&display=inline&height=173&name=image-20200119120931225.png&originHeight=346&originWidth=756&size=133740&status=done&style=none&width=378)]
3.2 快捷鍵設置
3.3 代碼地址
https://github.com/WangJi92/arthas-idea-plugin
3.4 插件開發,發布
參考 插件開發: https://www.jianshu.com/p/722841c6d0a9
就可以看到編譯后的zip包了
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-iBZ1C5Gh-1579489232415)(./arthas idea plugin 插件,arthas 使用更加絲滑起來/format,png#align=left&display=inline&height=273&name=image-20200119120931522.png&originHeight=546&originWidth=908&size=347771&status=done&style=none&width=454)]
四、下載地址
https://plugins.jetbrains.com/plugin/13581-arthas-idea,直接搜索arthas 即可下載,idea 官方插件