APM簡(jiǎn)介
APM全稱Application Performance Management 凛捏,目前市面的系統(tǒng)基本都是參考Google的Dapper(大規(guī)模分布式系統(tǒng)的跟蹤系統(tǒng))來做的, 核心思想是在服務(wù)各節(jié)點(diǎn)彼此調(diào)用的時(shí)候部凑,記錄并傳遞一個(gè)應(yīng)用級(jí)別的標(biāo)記仗扬,這個(gè)標(biāo)記可以用來關(guān)聯(lián)各個(gè)服務(wù)節(jié)點(diǎn)之間的關(guān)系铁蹈,最終形成一個(gè)分布式跟蹤的服務(wù)調(diào)用鏈。
APM 要解決的問題
微服務(wù)架構(gòu)下评也,服務(wù)按照不同的維度進(jìn)行拆分,一次請(qǐng)求請(qǐng)求往往需要涉及到多個(gè)服務(wù)谚殊。尤其是大規(guī)纳パ欤互聯(lián)網(wǎng)應(yīng)用,服務(wù)由不同的團(tuán)隊(duì)開發(fā)嫩絮,用不同編程語言來實(shí)現(xiàn)丛肢、并部署在成千上萬態(tài)幾千臺(tái)服務(wù)器上面。我們需要可以幫助我們理解系統(tǒng)行為和進(jìn)行分析性能問題的工具剿干,以便發(fā)生故障的時(shí)候蜂怎,能夠快速定位和解決問題。
市面上的APM工具
Zipkin
由Twitter公司開源置尔,開放源代碼分布式的跟蹤系統(tǒng)
Pinpoint
Pinpoint是一款對(duì)Java編寫的大規(guī)模分布式系統(tǒng)的APM工具杠步,由韓國(guó)人開源的分布式跟蹤系統(tǒng)
Skywalking
國(guó)產(chǎn)的優(yōu)秀APM組件,是一個(gè)對(duì)JAVA分布式應(yīng)用程序集群的業(yè)務(wù)運(yùn)行情況進(jìn)行追蹤榜轿、告警和分析的系統(tǒng)幽歼。
其他類似的組件還有美團(tuán)點(diǎn)評(píng)的CAT,淘寶的鷹眼EgleEye谬盐。
APM鏈路監(jiān)控組件的要求
探針的性能消耗
APM組件服務(wù)的影響對(duì)被監(jiān)控的應(yīng)用應(yīng)該做到足夠小甸私。
代碼的侵入性
監(jiān)控工具對(duì)程序員來說最好是透明的, 有侵入性對(duì)程序員來說是非常不友好的飞傀,程序員需要額外理解監(jiān)控組件皇型,以及要放入的位置诬烹,如果忽略了就監(jiān)控不到,而且可能還容易引起bug
可擴(kuò)展性
能夠支持的組件越多當(dāng)然越好弃鸦,或者能提供插件開發(fā)的API绞吁,對(duì)于一些沒有北監(jiān)控到的組件,應(yīng)用開發(fā)者也可以自行擴(kuò)展
數(shù)據(jù)的分析
數(shù)據(jù)的分析要快 唬格,分析的維度盡可能多家破,實(shí)時(shí)性要求很高,這樣才能在生產(chǎn)環(huán)境下的異常狀況做出快速反應(yīng)购岗,分析并解決問題
Zipkin 與Pinpoint
Zipkin
zipkin主要涉及幾個(gè)組件:collector收集agent的數(shù)據(jù)员舵,storage存儲(chǔ),web UI圖形化界面藕畔,search查詢Storage中存儲(chǔ)的數(shù)據(jù), 提供簡(jiǎn)單的JSON API獲取數(shù)據(jù)。
Spring cloud 提供了 sleuth 方便集成到zipkin庄拇,在Spring cloud 的幫助下我們很快就可以搭建出zipkin的server 和client注服,
PinPonit
Pinpoint 主要由 3 個(gè)組件外加 Hbase 數(shù)據(jù)庫構(gòu)成,三個(gè)組件分別為:Agent措近、Collector 和 Web UI
PinPoint 與ZipKin比較
探針的性能
主要是agent對(duì)服務(wù)的吞吐量溶弟、CPU和內(nèi)存的影響。微服務(wù)的規(guī)模和動(dòng)態(tài)性使得數(shù)據(jù)收集的成本大幅度提高瞭郑。
collector的可擴(kuò)展性
能夠水平擴(kuò)展以便支持大規(guī)模服務(wù)器集群辜御。
全面的調(diào)用鏈路數(shù)據(jù)分析
提供代碼級(jí)別的可見性以便輕松定位失敗點(diǎn)和瓶頸。
對(duì)于開發(fā)透明屈张,容易開關(guān)
添加新功能而無需修改代碼擒权,容易啟用或者禁用。
完整的調(diào)用鏈應(yīng)用拓?fù)?br>自動(dòng)檢測(cè)應(yīng)用拓?fù)涓笞唬瑤椭愀闱宄?yīng)用的架構(gòu)
探針的性能
網(wǎng)上有大神對(duì)skywalking碳抄、zipkin、pinpoint進(jìn)行了壓測(cè)场绿,并與基線(未使用探針)的情況進(jìn)行了對(duì)比剖效。
大神模擬了三種并發(fā)用戶:500,750焰盗,1000璧尸。使用jmeter測(cè)試,每個(gè)線程發(fā)送30個(gè)請(qǐng)求熬拒,設(shè)置思考時(shí)間為10ms爷光,采樣率為100%
在三種鏈路監(jiān)控組件中,skywalking的探針對(duì)吞吐量的影響最小梦湘,zipkin的吞吐量居中瞎颗。pinpoint的探針對(duì)吞吐量的影響較為明顯件甥,在500并發(fā)用戶時(shí),測(cè)試服務(wù)的吞吐量從1385降低到774哼拔,影響很大引有。然后再看下CPU和memory的影響,大牛是在內(nèi)部服務(wù)器進(jìn)行的壓測(cè)倦逐,對(duì)CPU和memory的影響都差不多在10%之內(nèi)譬正。
collector的可擴(kuò)展性
zipkin
zipkin-agent與zipkin-Server通過http或者mq進(jìn)行通信,通過基于mq異步方式通信檬姥,zipkin-Server通過訂閱具體的topic進(jìn)行消費(fèi)曾我。多個(gè)zipkin-Server實(shí)例進(jìn)行異步消費(fèi)mq中的監(jiān)控信息。
PinPoint
pinpoint也是支持集群和單機(jī)部署,pinpoint agent通過thrift通信框架健民,發(fā)送鏈路信息到collector
全面的調(diào)用鏈路數(shù)據(jù)分析
zipkin
zipkin的鏈路監(jiān)控粒度相對(duì)沒有那么細(xì)抒巢,下圖可以看到調(diào)用鏈中具體到接口級(jí)別,再進(jìn)一步的調(diào)用信息不能看到
pinpoin
pinpoint數(shù)據(jù)分析相對(duì)完畢秉犹。提供代碼級(jí)別的可見性以便輕松定位失敗點(diǎn)和瓶頸蛉谜,下圖可以看到對(duì)于執(zhí)行的sql語句,都進(jìn)行了記錄
對(duì)于開發(fā)透明崇堵,容易開關(guān)
Zipkin 使用修改過的類庫和它自己的容器(Finagle)來提供分布式事務(wù)跟蹤的功能型诚,但是它要求在需要時(shí)修改代碼
pinpoint是基于字節(jié)碼增強(qiáng)的方式,開發(fā)人員不需要修改代碼鸳劳,并且可以收集到更多精確的數(shù)據(jù)因?yàn)橛凶止?jié)碼中的更多信息
完整的調(diào)用鏈應(yīng)用拓?fù)?/b>
PinPoint的界面更加豐富狰贯,在這方面可以秒掉zipkin
其它方面
Pinpoint 是一個(gè)完整的性能監(jiān)控解決方案:有從探針、收集器赏廓、存儲(chǔ)到 Web 界面等全套體系涵紊;而 Zipkin 只側(cè)重收集器和存儲(chǔ)服務(wù),雖然也有用戶界面楚昭,但其功能與 Pinpoint 不可同日而語栖袋。反而 Zipkin 提供有 Query 接口,更強(qiáng)大的用戶界面和系統(tǒng)集成能力抚太,可以基于該接口二次開發(fā)實(shí)現(xiàn)塘幅。
Zipkin 官方提供有基于 Finagle 框架(Scala 語言)的接口,而其他框架的接口由社區(qū)貢獻(xiàn)尿贫,目前可以支持 Java电媳、Scala、Node庆亡、Go匾乓、Python、Ruby 和 C# 等主流開發(fā)語言和框架又谋;但是 Pinpoint 目前只有官方提供的 Java Agent 探針拼缝。
Pinpoint 提供有 Java Agent 探針娱局,通過字節(jié)碼注入的方式實(shí)現(xiàn)調(diào)用攔截和數(shù)據(jù)收集,可以做到真正的代碼無侵入咧七,只需要在啟動(dòng)服務(wù)器的時(shí)候添加一些參數(shù)衰齐,就可以完成探針的部署;而 Zipkin 的 Java 接口實(shí)現(xiàn) Brave继阻,只提供了基本的操作 API耻涛,如果需要與框架或者項(xiàng)目集成的話,就需要手動(dòng)添加配置文件或增加代碼瘟檩。
總結(jié)
對(duì)于我們來說Pinpoint 確實(shí)具有壓倒性的優(yōu)勢(shì)抹缕;無需對(duì)項(xiàng)目代碼進(jìn)行任何改動(dòng)就可以部署探針、追蹤數(shù)據(jù)細(xì)聊粒化到方法調(diào)用級(jí)別卓研、功能強(qiáng)大的用戶界面以及幾乎比較全面的 Java 框架支持;關(guān)于由于PinPoint采用的是字節(jié)碼注入的方式導(dǎo)致接口開發(fā)困難度提高一個(gè)數(shù)量級(jí)睹簇,對(duì)于我們2B服務(wù)的互聯(lián)網(wǎng)產(chǎn)品來說或許不是一個(gè)大問題鉴分,我們可以等一等,站在巨人的肩膀上带膀,采取拿來主義的原則,而不是去自己實(shí)現(xiàn)一些接口橙垢,因?yàn)槲覀儾⒉皇亲咴诨ヂ?lián)網(wǎng)的前沿垛叨,所以很多問題走在前沿的開發(fā)人員會(huì)幫助我們解決,他們對(duì)于我們來說就是巨人柜某。
Pinpoint實(shí)戰(zhàn)演示效果
搭建一個(gè)java開源項(xiàng)目jforum嗽元,跑在tomcat下,使用jmeter進(jìn)行壓測(cè)喂击,用戶100個(gè)
服務(wù)器圖(ServerMap)
通過可視化其組件的互連方式來了解任何分布式系統(tǒng)的拓?fù)浼涟螕艄?jié)點(diǎn)將顯示有關(guān)組件的詳細(xì)信息,例如其當(dāng)前狀態(tài)和事務(wù)計(jì)數(shù)翰绊。
實(shí)時(shí)活動(dòng)線程圖(Realtime Active Thread Chart)
實(shí)時(shí)監(jiān)視應(yīng)用程序內(nèi)的活動(dòng)線程佩谷。
請(qǐng)求/響應(yīng)散布圖(Request/Response Scatter Chart)
可視化請(qǐng)求計(jì)數(shù)和響應(yīng)模式,以確定潛在問題监嗜⌒程矗可以通過在圖表上拖動(dòng)來選擇事務(wù)以獲取更多詳細(xì)信息
調(diào)用棧信息(CallStack)
增強(qiáng)分布式環(huán)境中每個(gè)事務(wù)的代碼級(jí)可見性,識(shí)別單個(gè)視圖中的瓶頸和故障點(diǎn)裁奇。
檢查器(Inspector)
查看應(yīng)用程序的其他詳細(xì)信息桐猬,如CPU使用率,內(nèi)存/垃圾收集刽肠,TPS和JVM參數(shù)
Zipkin實(shí)戰(zhàn)演示效果
調(diào)用棧信息(CallStack)
服務(wù)器圖(ServerMap)
參考+引用+抄襲的文章
https://www.cnblogs.com/Bug-Hunter/p/8677435.html
http://www.herohuang.com/2017/03/01/apm-pinpoint/
https://sq.163yun.com/blog/article/168169689970475008
http://www.tangrui.net/2016/pinpoint-plugin-development.html
http://iamlile.github.io/2017/10/06/apm/
http://www.tangrui.net/2016/zipkin-vs-pinpoint.html
https://juejin.im/post/5a0579e6f265da4326524f0f
https://juejin.im/post/5a274614518825592c07f8b8