基于Arthas的應(yīng)用在線診斷平臺實(shí)踐
背景介紹
在日常系統(tǒng)運(yùn)行過程中,故障總是不期而遇。一旦出現(xiàn)故障通常是查監(jiān)控,翻各種日志,從大量的日志中尋找蛛絲馬跡。如果問題現(xiàn)場的日志記錄缺失,會嘗試在本地重現(xiàn)問題并調(diào)試解決,本地難以重現(xiàn)的,只能再加日志,再部署,再重現(xiàn),然后再查日志,效率較低。對于復(fù)雜一些的比如程序性能問題,如何定位性能瓶頸,一不小心又要回到加日志、部署、查日志、再加日志的老路,不僅效率不高,也破壞了問題現(xiàn)場。
所以針對以上問題,我們的目標(biāo)是建立一個(gè)Java應(yīng)用在線診斷平臺,讓開發(fā)人員無需登錄機(jī)器或修改系統(tǒng),就可以從日志、內(nèi)存、線程、類信息、調(diào)試、機(jī)器和系統(tǒng)屬性等各個(gè)方面對應(yīng)用進(jìn)行診斷,提升開發(fā)人員診斷問題的效率和能力。
系統(tǒng)架構(gòu)
我們期望有一套架構(gòu),讓開發(fā)人員以Web UI的方式使用各類在線診斷能力。
架構(gòu)概覽
架構(gòu)概覽
瀏覽器
瀏覽器是開發(fā)人員進(jìn)行在線診斷的入口,tunnel server通過Web UI的方式提供在線診斷能力,支持復(fù)雜的交互場景。
tunnel server
提供兩個(gè)方面的功能,分別是:
管理功能
瀏覽器通過http與tunnel server的12201端口進(jìn)行交互;
連接指定IP的arthas agent機(jī)器、斷開指定IP的arthas agent機(jī)器、查看指定IP的arthas agent生成的文件。
診斷功能
瀏覽器通過websocket與tunnel server的12202端口進(jìn)行交互;
支持各種arthas診斷指令:dashboard、heapdump、thread、vmtool等。
應(yīng)用程序服務(wù)器
arthas agent作為websocket客戶端與tunnel server的12202端口進(jìn)行交互;
arthas agent通過attach應(yīng)用進(jìn)程實(shí)現(xiàn)對應(yīng)用進(jìn)程的診斷。
原理介紹
核心流程
流程說明:
1.1 tunnel server 監(jiān)聽12201端口,該端口用于展示W(wǎng)eb UI
1.2 tunnel server監(jiān)聽12202端口,該端口用于與瀏覽器進(jìn)行websocket交互,也用于與arthas agent進(jìn)行websocket交互
1.3 應(yīng)用程序通過引入arthas pom依賴,在應(yīng)用部署的時(shí)候?qū)rthas安裝包安裝到服務(wù)器上
2.1 通過在瀏覽器上訪問:
http://tunner_server_ip:12201,打開Web UI
2.2 在Web UI上輸入要診斷的服務(wù)器IP,點(diǎn)擊Connect,建立與tunner server 12202端口的websocket連接,發(fā)送請求為:
ws://tunner_server_ip:12202/ws?method=connectArthas&id=服務(wù)器IP
2.3 tunner server根據(jù)服務(wù)器IP獲取與arthas agent的control connection
2.4 如果control connection沒有建立,則通過訪問
http://arthas_agent_IP:12230?tunnerserver=ws://tunner_server_ip:12202/ws,觸發(fā)arthas agent初始化、attach應(yīng)用進(jìn)程。
2.5 arthas agent創(chuàng)建與tunner server的websocket連接:
- arthas agent tunnel client connect to tunnel server with URL: ws://tunner_server_ip:12202/ws?method=agentRegister
- tunnel server response a text frame message: response:/?method=agentRegister&id=服務(wù)器IP
此時(shí)創(chuàng)建的websocket連接稱為:control connection。
2.6 control connection已創(chuàng)建成功,則向arthas agent tunnel client發(fā)送:response:/?method=startTunnel&id=服務(wù)器IP&clientCnotallow=connectionIDxxx,請求建立連接;
arthas agent tunnel client收到startTunnel請求后,新建與tunnel server的連接,并發(fā)送:ws://tunner_server_ip:12202/ws/?method=openTunnel&clientCnotallow=connectionIDxxx&id=服務(wù)器IP
此時(shí)創(chuàng)建的websocket連接稱為:tunnel connection;
同時(shí)創(chuàng)建與arthas agent的本地連接:ws://127.0.0.1:3658/ws,此時(shí)創(chuàng)建的連接稱為:local connection
3.13.2 執(zhí)行診斷命令鏈路如下:
交互邏輯
關(guān)鍵問題分析
arthas本身提供了tunner server功能,我們主要需要解決的有兩個(gè)問題:
- 如何安裝arthas到指定服務(wù)器
- 如何按需加載arthas agent,即只有對指定服務(wù)器進(jìn)行診斷的時(shí)候才進(jìn)行arthas agent的初始化
安裝Arthas
獨(dú)立安裝運(yùn)維
將arthas打包進(jìn)操作系統(tǒng)鏡像中,保證新初始化的ECS實(shí)例中含有最新版本的arthas;對于已經(jīng)存在的ECS實(shí)例則需要想辦法進(jìn)行arthas版本更新。
通過SSH腳本
第2.2步驟當(dāng)對指定服務(wù)器進(jìn)行診斷的時(shí)候,在tunnel server或其他旁路系統(tǒng)通過ssh方式將arthas安裝包拷貝的指定服務(wù)器。
通過javaagent
在應(yīng)用進(jìn)程初始化的時(shí)候,加載自定義的javaagent,該javaagent實(shí)現(xiàn)下載、解壓arthas的功能。
第2.2步驟當(dāng)對指定服務(wù)器進(jìn)行診斷的時(shí)候,tunnel server或其他旁路系統(tǒng)通過與指定服務(wù)器javaagent通訊,通過javaagent完成arthas下載、解壓。
通過POM
應(yīng)用通過引入arthas pom,將arthas打包進(jìn)應(yīng)用部署包中。
初始化ArthasAgent
復(fù)用Web Server端口
在應(yīng)用工程中新建一個(gè)Controller,該Controller實(shí)現(xiàn)arthas agent初始化功能。
tunnel server通過現(xiàn)有的Web Server訪問Controller接口觸發(fā)arthas agent初始化。
注意:
- 需要tunnel server能夠訪問Web Server端口
- 不同應(yīng)用的Web Server Context路徑可能不一樣
通過獨(dú)立的HTTPServer
創(chuàng)建獨(dú)立的HTTP Server,主要是為了使得tunnel server能夠訪問新監(jiān)聽的端口,解決【復(fù)用Web Server】端口面臨的兩個(gè)問題。
注意:
- 新監(jiān)聽的http端口需要對tunnel server開放
- http server的context路徑都是一致的
通過HSF/gRPC/dubbo等RPC
根據(jù)應(yīng)用使用的RPC框架,新建對應(yīng)的RPC Provider,tunnel server直接調(diào)用指定IP的RPC Provider完成arthas agent的初始化。該方式的好處是不用新開放監(jiān)聽端口。
注意:
- RPC Client需要能夠調(diào)用指定IP的RPC Provider
通過MQ
tunnel server作為MQ Producer發(fā)送報(bào)文(報(bào)文中包含指定服務(wù)器的IP)到MQ Broker,應(yīng)用中新建MQ Consumer消費(fèi)tunnel server的報(bào)文,如果報(bào)文中IP與本機(jī)一致則處理,不一致則丟棄。
通過Apollo等配置中心
思路與【通過MQ】一致,按照apollo等配置中心相關(guān)API進(jìn)行實(shí)現(xiàn)。
通過Redis緩存
思路與【通過MQ】一致,按照Redis相關(guān)通訊機(jī)制進(jìn)行實(shí)現(xiàn)。
通過SSH
tunner server或旁路系統(tǒng)有權(quán)限直接ssh指定服務(wù)器,通過腳本方式觸發(fā)arthas agent初始化。
展示效果
tunnel server
在AgentId的文本框里輸入要診斷的服務(wù)器IP,稍等一會就可以進(jìn)行診斷了。
web console
指定服務(wù)器Web UI
dashboard
dashboard
immediacy
thread示例
thread
real time
monitor示例
monitor
option
JVM options示例
jvm options
console
console
terminal
terminal與tunner server UI基本一致,不同的是該terminal是直接訪問的目標(biāo)服務(wù)器。
總結(jié)
以上方案只是簡單的應(yīng)用,期望以后可以不斷的迭代優(yōu)化。