新聞中心
背景介紹
在日常系統(tǒng)運(yùn)行過程中,故障總是不期而遇。一旦出現(xiàn)故障通常是查監(jiān)控,翻各種日志,從大量的日志中尋找蛛絲馬跡。如果問題現(xiàn)場的日志記錄缺失,會(huì)嘗試在本地重現(xiàn)問題并調(diào)試解決,本地難以重現(xiàn)的,只能再加日志,再部署,再重現(xiàn),然后再查日志,效率較低。對(duì)于復(fù)雜一些的比如程序性能問題,如何定位性能瓶頸,一不小心又要回到加日志、部署、查日志、再加日志的老路,不僅效率不高,也破壞了問題現(xiàn)場。

創(chuàng)新互聯(lián)專注于企業(yè)營銷型網(wǎng)站建設(shè)、網(wǎng)站重做改版、察哈爾右翼后網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5、商城系統(tǒng)網(wǎng)站開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為察哈爾右翼后等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
所以針對(duì)以上問題,我們的目標(biāo)是建立一個(gè)Java應(yīng)用在線診斷平臺(tái),讓開發(fā)人員無需登錄機(jī)器或修改系統(tǒng),就可以從日志、內(nèi)存、線程、類信息、調(diào)試、機(jī)器和系統(tǒng)屬性等各個(gè)方面對(duì)應(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)對(duì)應(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ā)送請(qǐng)求為:
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,請(qǐng)求建立連接;
arthas agent tunnel client收到startTunnel請(qǐng)求后,新建與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,即只有對(duì)指定服務(wù)器進(jìn)行診斷的時(shí)候才進(jìn)行arthas agent的初始化
安裝Arthas
獨(dú)立安裝運(yùn)維
將arthas打包進(jìn)操作系統(tǒng)鏡像中,保證新初始化的ECS實(shí)例中含有最新版本的arthas;對(duì)于已經(jīng)存在的ECS實(shí)例則需要想辦法進(jìn)行arthas版本更新。
通過SSH腳本
第2.2步驟當(dāng)對(duì)指定服務(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)對(duì)指定服務(wù)器進(jìn)行診斷的時(shí)候,tunnel server或其他旁路系統(tǒng)通過與指定服務(wù)器javaagent通訊,通過javaagent完成arthas下載、解壓。
通過POM
應(yīng)用通過引入arthas pom,將arthas打包進(jìn)應(yīng)用部署包中。
com.taobao.arthas
arthas-agent-attach
3.6.7
com.taobao.arthas
arthas-packaging
3.6.7
初始化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端口需要對(duì)tunnel server開放
- http server的context路徑都是一致的
通過HSF/gRPC/dubbo等RPC
根據(jù)應(yīng)用使用的RPC框架,新建對(duì)應(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,稍等一會(huì)就可以進(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)化。
當(dāng)前題目:基于Arthas的應(yīng)用在線診斷平臺(tái)實(shí)踐
文章分享:http://www.dlmjj.cn/article/dpjjpdp.html


咨詢
建站咨詢
