乾貨分享!JAVA診斷工具Arthas在Rainbond上實踐~

2022-09-08 18:02:07

別再擔心線上 Java 業務出問題怎麼辦了,Arthas 幫助你解決以下常見問題:

  • 這個類從哪個 jar 包載入的?為什麼會報各種類相關的 Exception?
  • 我改的程式碼為什麼沒有執行到?難道是我沒 commit?分支搞錯了?
  • 遇到問題無法線上上 debug,難道只能通過加紀錄檔再重新發布嗎?
  • 線上遇到某個使用者的資料處理有問題,但線上同樣無法 debug,線下無法重現!
  • 是否有一個全域性視角來檢視系統的執行狀況?
  • 有什麼辦法可以監控到 JVM 的實時執行狀態?
  • 怎麼快速定位應用的熱點,生成火焰圖?
  • 怎樣直接從 JVM 內查詢某個類的範例?

Arthas(阿爾薩斯)是一款線上監控診斷產品,通過全域性視角實時檢視應用 load、記憶體、gc、執行緒的狀態資訊,並能在不修改應用程式碼的情況下,對業務問題進行診斷,包括檢視方法呼叫的出入參、異常,監測方法執行耗時,類載入資訊等,大大提升線上問題排查效率。

Arthas 採用命令列互動模式,同時提供豐富的 Tab 自動補全功能,進一步方便進行問題的定位和診斷。

同時 Arthas 也支援通過 Web Console 進入命令列互動模式,這適用於開發人員沒有伺服器許可權時通過 Arthas Web Console 診斷業務。

Arthas 在 Rainbond 上整合

1. 外掛整合

通過 Rainbond 外掛的機制,從 Rainbond 開源應用商店一鍵安裝 Arthas 外掛並在元件中開通,元件啟動時會自動下載 arthas-agent.jar 結合環境變數設定使用 javaagent 方式啟動。

2. Arthas Tunnel 整合

當我們的微服務業務有 10+,這時通過 Arthas 去診斷就會比較麻煩,開發人員沒有伺服器的許可權並且通過 Web Console 存取的話也會由於存取地址太多導致特別混亂。這時就需要通過 Arthas Tunnel Server/Client 來遠端管理/連線多個 Agent。

Arthas Agent 會通過 WS 註冊到 Arthas Tunnel 中,實現統一管理。

Arthas Tunnel 可通過 Rainbond 開源應用商店一鍵安裝。

3. Arthas Web Console

對於 Spring Boot 應用則無需通過 Arthas Tunnel 存取 Web Console,在元件內新增8563埠即可存取 Web Console。(注意:域名存取需開啟 Websocket 支援

使用Arthas診斷Rainbond上的Spring Boot應用

本小節使用若依SpringBoot作為範例。

首先需要安裝 Rainbond雲原生應用管理平臺,可參閱檔案 安裝 Rainbond Allinone

1. 部署 Spring Boot 應用

團隊 -> 新增 -> 基於應用商店建立元件 -> 在應用商店中搜尋 若依SpringBoot 進行一鍵部署。

2. 安裝 Arthas Java Agent 外掛並設定

2.1 安裝外掛

團隊 -> 外掛 -> 從應用商店安裝外掛 -> 在應用商店中搜尋 Arthas-Agent 進行一鍵部署。

2.2 開通外掛

ruoyi-admin 開通 Arthas Agent 外掛,在元件內 -> 外掛 -> 未開通 -> 開通外掛。

2.3 環境變數設定

ruoyi-admin 元件設定環境變數,在元件內 -> 環境變數 -> 新增變數。

變數名 變數值
JAVA_OPTS -javaagent:/arthas/arthas-agent.jar
ARTHAS_APP_NAME ruoyi-admin
ARTHAS_AGENT_ID ruoyi-admin

2.4 新增埠並更新

ruoyi-admin 元件新增 8563 埠並開啟對外服務,更新元件完成後可通過預設域名存取 Web Console。

使用Arthas診斷Rainbond上的SpringCloud應用

使用 Arthas 診斷部署在 Rainbond 上的微服務 Spring Cloud Pig,並通過 Arthas Tunnel 統一管理 Arthas agent。本小節將使用 Spring Cloud Pig 作為範例。

首先需要安裝 Rainbond雲原生應用管理平臺,可參閱檔案 安裝 Rainbond Allinone

1. 部署 Spring Cloud Pig

團隊 -> 新增 -> 基於應用商店建立元件 -> 在應用商店中搜尋 SpringCloud-Pig 進行一鍵部署。

2. 部署 Arthas Tunnel

團隊 -> 新增 -> 基於應用商店建立元件 -> 在應用商店中搜尋 Arthas-Tunnel 進行一鍵部署。

3. 安裝 Arthas Agent 外掛並設定

1. 安裝外掛

團隊 -> 外掛 -> 從應用商店安裝外掛 -> 在應用商店中搜尋 Arthas-Agent 進行一鍵部署。

2. 開通外掛

為每個微服務元件都開通外掛,進入微服務元件 -> 外掛 -> 開通外掛 Arthas-Agent

3. 設定環境變數

為每個微服務元件設定環境變數,在元件內 -> 環境變數 -> 新增變數。

變數名 變數值 說明
JAVA_OPTS -javaagent:/arthas/arthas-agent.jar JAVA 啟動引數
ARTHAS_APP_NAME register arthas app name,根據實際情況修改
ARTHAS_AGENT_ID register arthas agent ID 不可與其他 ID相同,是唯一的

4. 設定依賴關係

將所有微服務元件依賴至 arthas tunnel,應用檢視切換到編排模式進行拖拉拽。

5. 批次更新

更新/重啟所有微服務相關元件。可在 列表 中批次操作。

4. 通過 Arthas Tunnel 連線到其他 Agent 進行診斷

1.可通過 Arthas Tunnel 8080 埠預設生成的域名存取 Web Console。

2.在 Web Console 中的 IP:PORT 填寫 Arthas Tunnel 7777 的對外伺服器埠,7777 埠是 Agent 連線到 Tunnel 的。所以在通過 Web 遠端連線到其他服務時修改 AgentId 即可連線

Arthas 使用入門

1. Arthas 命令使用

Arthas 採用命令列互動模式,同時提供豐富的 Tab 自動補全功能,進一步方便進行問題的定位和診斷,以下是部分命令,詳細請參閱檔案 Arthas命令列表

  • dashboard - 當前系統的實時資料面板
  • getstatic - 檢視類的靜態屬性
  • heapdump - dump java heap, 類似 jmap 命令的 heap dump 功能
  • jvm - 檢視當前 JVM 的資訊
  • logger - 檢視和修改 logger
  • mbean - 檢視 Mbean 的資訊
  • memory - 檢視 JVM 的記憶體資訊
  • ognl - 執行 ognl 表示式
  • perfcounter - 檢視當前 JVM 的 Perf Counter 資訊
  • sysenv - 檢視 JVM 的環境變數
  • sysprop - 檢視和修改 JVM 的系統屬性
  • thread - 檢視當前 JVM 的執行緒堆疊資訊
  • vmoption - 檢視和修改 JVM 裡診斷相關的 option
  • vmtool - 從 jvm 裡查詢物件,執行 forceGc

以下是部分命令的使用截圖:

2. 生成火焰圖

profiler 命令支援生成應用熱點的火焰圖。本質上是通過不斷的取樣,然後把收集到的取樣結果生成火焰圖。
以下命令均在Arthas Tunnel Web Console 中執行。

1.啟動 profiler

$ profiler start
Started [cpu] profiling

2.停止 profiler 並生成火焰圖

預設情況下,結果檔案是html格式,也可以用--format引數指定:

$ profiler stop --format html
OK
profiler output file: /app/arthas-output/20220907-214802.html

3.通過瀏覽器檢視火焰圖

上一步生成的 html 檔案在指定的微服務元件中,所以需要在該微服務元件中檢視火焰圖。

進入到該微服務元件中,例如:pig-auth,在元件埠中新增 3658 埠並開啟對外服務並存取 http://domain/arthas-output

最後

Arthas 是款非常好的 Java 診斷工具,而在 Kubernetes 中使用較為複雜。Rainbond 底層基於 Kubernetes,在此之上抽象了應用模型,使使用者更方便的在 Kubernets 中部署管理應用,並且通過 Rainbond 的外掛機制讓使用者更便捷的使用 Arthas 診斷業務,降低了在 Kubernetes 中使用 Arthas 的門檻,使用者只需關注業務。