一畏邢、需求
Tomcat:
(1)模塊啟動(dòng)時(shí)間
(2)模塊交互耗時(shí)
二分预、現(xiàn)狀
現(xiàn)代APM體系趴梢,基本都是參考Google的Dapper(大規(guī)模分布式系統(tǒng)的跟蹤系統(tǒng))的體系來(lái)做的。通過(guò)跟蹤請(qǐng)求的處理過(guò)程秀睛,來(lái)對(duì)應(yīng)用系統(tǒng)在前后端處理尔当、服務(wù)端調(diào)用的性能消耗進(jìn)行跟蹤,關(guān)于Dapper的介紹可以看這個(gè)鏈接:http://bigbully.github.io/Dapper-translation/
下面重點(diǎn)選5個(gè)比較有名的server端探針進(jìn)行簡(jiǎn)單介紹:
2.1 Pinpoint(開(kāi)源)
github地址:https://github.com/naver/pinpoint
java領(lǐng)域的性能分析的開(kāi)源項(xiàng)目,這個(gè)是一個(gè)韓國(guó)團(tuán)隊(duì)開(kāi)源出來(lái)的椭迎,通過(guò)JavaAgent的機(jī)制來(lái)做字節(jié)碼代碼植入锐帜,實(shí)現(xiàn)加入traceid和抓取性能數(shù)據(jù)的目的。
NewRelic畜号、Oneapm之類(lèi)的工具在java平臺(tái)上的性能分析也是類(lèi)似的機(jī)制缴阎。
2.2 Zipkin(開(kāi)源)
官網(wǎng):OpenZipkin · http://zipkin.io/
github地址:https://github.com/openzipkin/zipkin
這個(gè)是twitter開(kāi)源出來(lái)的,也是參考Dapper的體系來(lái)做的简软。
Zipkin的java應(yīng)用端是通過(guò)一個(gè)叫Brave的組件來(lái)實(shí)現(xiàn)對(duì)應(yīng)用內(nèi)部的性能分析數(shù)據(jù)采集蛮拔。
Brave的github地址:https://github.com/openzipkin/brave
這個(gè)組件通過(guò)實(shí)現(xiàn)一系列的java攔截器,來(lái)做到對(duì)http/servlet請(qǐng)求痹升、數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)的調(diào)用過(guò)程跟蹤建炫。
然后通過(guò)在spring之類(lèi)的配置文件里加入這些攔截器,完成對(duì)java應(yīng)用的性能數(shù)據(jù)采集疼蛾。
2.3 CAT(開(kāi)源)
github地址:https://github.com/dianping/cat
這個(gè)是大眾點(diǎn)評(píng)開(kāi)源出來(lái)的肛跌,實(shí)現(xiàn)的功能也還是蠻豐富的,國(guó)內(nèi)也有一些公司在用了据过。
不過(guò)他實(shí)現(xiàn)跟蹤的手段惋砂,是要在代碼里硬編碼寫(xiě)一些“埋點(diǎn)”妒挎,也就是侵入式的绳锅。
這樣做有利有弊,好處是可以在自己需要的地方加埋點(diǎn)酝掩,比較有針對(duì)性鳞芙;壞處是必須改動(dòng)現(xiàn)有系統(tǒng),很多開(kāi)發(fā)團(tuán)隊(duì)不愿意期虾。
2.4 NewRelic(閉源原朝,代碼不混淆)
2.5 聽(tīng)云(閉源,代碼混淆)
http://www.tingyun.com/tingyun_server.html
探針能力介紹:http://doc.tingyun.com/server/html/phpzhichiliebiao.html
三镶苞、探針能力匯總
3.1 支持
(1)應(yīng)用運(yùn)行環(huán)境:PHP, Java, .NET喳坠,Node.js, Python,Ruby等
(2)云:阿里云茂蚓、騰訊云壕鹉、AWS、金山云聋涨、青云晾浴、華為云等
(3)Database:MySQL, Oracle, MS SQL Server, PostgreSQL等
(4)Framework:Spring, Yii牍白,Django脊凰,Tomcat,JBoss茂腥,WebLogic等
(5)NoSQL:Memcached狸涌,MongoDB切省,Redis等非關(guān)系型數(shù)據(jù)庫(kù)服務(wù)
(6)API:監(jiān)控HTTP、Dubbo帕胆、Thrift協(xié)議下當(dāng)前應(yīng)用調(diào)用的外部服務(wù)数尿,如微博、微信第三方API接口等惶楼,并支持跨應(yīng)用分析
3.2 核心功能
(1)web應(yīng)用過(guò)程:分析url調(diào)用過(guò)程中性能消耗原因,抓取超過(guò)閾值url的詳細(xì)數(shù)據(jù)
(2)數(shù)據(jù)庫(kù)性能:支持多種數(shù)據(jù)庫(kù)類(lèi)型的監(jiān)測(cè)右蹦,定位并追蹤慢SQL語(yǔ)句問(wèn)題
(3)錯(cuò)誤分析:記錄錯(cuò)誤發(fā)生時(shí)的詳細(xì)信息,統(tǒng)計(jì)應(yīng)用錯(cuò)誤率歼捐,定位問(wèn)題具體至代碼行
(4)外部API調(diào)用:可以監(jiān)測(cè)所有服務(wù)端應(yīng)用外部調(diào)用API的耗時(shí)何陆,并進(jìn)行匯總統(tǒng)計(jì)
(5)線(xiàn)程剖析:可以實(shí)現(xiàn)生產(chǎn)環(huán)境下實(shí)時(shí)在線(xiàn)的線(xiàn)程剖析,可在運(yùn)行時(shí)了解代碼性能
(6)NoSQL分析:實(shí)時(shí)監(jiān)控Memcache, MongoDB,Redis等NoSQL數(shù)據(jù)庫(kù)的性能問(wèn)題
(7)JVM性能:實(shí)時(shí)監(jiān)控 JVM 運(yùn)行狀態(tài)豹储,通過(guò)圖表展示 JVM 內(nèi)存分配情況贷盲、內(nèi)存使用情況、垃圾收集信息剥扣、類(lèi)加載數(shù)量巩剖、JVM 線(xiàn)程信息以及會(huì)話(huà)信息。
(8)HTTP 會(huì)話(huà):分析每個(gè)應(yīng)用程序的 HTTP 會(huì)話(huà)數(shù)钠怯,包括:活躍佳魔、過(guò)期、拒絕的會(huì)話(huà)晦炊。
四鞠鲜、詳細(xì)介紹(只關(guān)注能解決需求的部分)
用競(jìng)品的server探針監(jiān)控Tomcat+Spring MVC的demo。在demo里只實(shí)現(xiàn)了path=/hello/hello的GET請(qǐng)求断国。如下:
以下是使用聽(tīng)云和NewRelic分別監(jiān)控到的Tomcat接收GET請(qǐng)求后的調(diào)用追蹤及其耗時(shí)贤姆。
4.1 聽(tīng)云
慢事務(wù)追蹤
4.2 NewRelic
慢事務(wù)追蹤
4.3 監(jiān)控 Tomcat 中 Java 應(yīng)用的主要特點(diǎn)
監(jiān)視分布式應(yīng)用程序的跨應(yīng)用程序追蹤
將主要業(yè)務(wù)軌跡的關(guān)鍵業(yè)務(wù)進(jìn)行拓?fù)浞治?br>
用性能剖析分析方法調(diào)用棧軌跡
五、Server探針Demo SDK
(1)監(jiān)控功能:模塊交互耗時(shí)
監(jiān)測(cè)Tomcat + Spring MVC搭建的服務(wù)稳衬,當(dāng)后端收到“GET http://localhost:8080/hello/hello”請(qǐng)求時(shí)霞捡,HelloController模塊的printHello的調(diào)用耗時(shí)。
printHello調(diào)用如下薄疚,里面人為增加2s延遲碧信。
(2)Server探針功能:
監(jiān)控模塊的函數(shù)調(diào)用耗時(shí)
(3)Server探針實(shí)現(xiàn)方式:
通過(guò)JVM的JavaAgent的機(jī)制來(lái)做字節(jié)碼代碼,在目標(biāo)模塊的函數(shù)調(diào)用前后打點(diǎn)输涕。
代碼行數(shù):1270行
實(shí)現(xiàn)時(shí)間:一天
NewRelic代碼行數(shù):8w行
(4)實(shí)驗(yàn)結(jié)果:
六音婶、調(diào)研結(jié)論
目前競(jìng)品(NewRelic、聽(tīng)云)的方案能滿(mǎn)足需求莱坎。
有可參考的競(jìng)品:NewRelic衣式,雖然不開(kāi)源,但代碼反編譯后未混淆,可以基本讀懂碴卧。