Arthas是一款開源且非常棒的在線診斷工具,阿里巴巴在16年就出品了,經過幾年的功能迭代以及代碼重構又出了不少新的診斷命令
在Github上面搜索Arthas即可下載源碼,原生的Arthas實現了TunnelClient和TunnelServer的交互,但是總的來說還是單機版本的,在大企業中使用的時候避免不了需要封裝改造下,不可能每次監控都去手動輸入一個registerId,下面就介紹我們對他的改造過程,讓他變成一個平臺化的診斷工具
我們這邊的設計思路是這樣的:
- 先改造arthas-client通過容器的環境變量等參數註冊自身應用信息到arthas-server
- arthas-client 植入到基礎鏡像中,然後通過agent方式運行arthas-client
- 改造arthas-server源碼,植入公司權限系統以及可視化應用-節點選擇自動鏈接診斷
arthas-agent方式啓動的話,需要幾個入參,原先client-server交互是通過netty的socket來實現的,原先完整發送的socket-url是:ws://xxx/ws,註冊ID是server端隨機生成的,我們改造後變成ws://xx/ws/project/appname/ip,參數解析:項目名,應用名,應用ip,這些參數主要是爲了server端的web頁面可以下拉選可視化操作使用的
我們在這裏分析agent源碼後發現,源碼中的premain是需要找到arthas-core.jar的,我們處理時一起放到基礎鏡像中,然後在premain中指定core的路徑
arthas-client的改造只需要到這裏就可以了,剩下的是server端的改造,主要思路是:server端接收到client註冊請求後,將項目名、應用名、節點ip、arthas註冊id存儲到數據庫中,供前端web頁面可以下拉選
我們也對server端代碼進行了部分重構,原先代碼結構還是比較混亂的,簡單介紹下核心需要關注的server源碼類
主要需要關注這三個類,RegisterHandler是client進行socket連接時使用到的,ConnectionHandler是web-socket鏈接server時的第一步操作,成功之後會使用OpenTunnel