一窗骑、監(jiān)控系統(tǒng)需要完成的功能為:
全棧監(jiān)控但惶;
關(guān)聯(lián)分析耳鸯;
跨系統(tǒng)調(diào)用的串聯(lián);
實(shí)時(shí)報(bào)警和自動(dòng)處置膀曾;
系統(tǒng)性能分析县爬。
多層體系的監(jiān)控
二、全棧監(jiān)控(就是三層監(jiān)控)
基礎(chǔ)層:CPU添谊、內(nèi)存财喳、網(wǎng)絡(luò)吞吐、硬盤 I/O斩狱、硬盤使用等耳高。
中間層:Nginx、Redis喊废、ActiveMQ、Kafka栗弟、MySQL污筷、Tomcat等。
應(yīng)用層:HTTP 訪問(wèn)的吞吐量乍赫、響應(yīng)時(shí)間瓣蛀、返回碼,調(diào)用鏈路分析雷厂,性能瓶頸惋增,還包括用戶端的監(jiān)控。
監(jiān)控的標(biāo)準(zhǔn)化:
(1)日志數(shù)據(jù)結(jié)構(gòu)化改鲫;
(2)監(jiān)控?cái)?shù)據(jù)格式標(biāo)準(zhǔn)化诈皿;
(3)統(tǒng)一的監(jiān)控平臺(tái)林束;
(4)統(tǒng)一的日志分析。
三稽亏、什么才是好的監(jiān)控系統(tǒng)
1.監(jiān)控做不好壶冒,它們主要有兩個(gè)很大的問(wèn)題。
監(jiān)控?cái)?shù)據(jù)是隔離截歉。因?yàn)楣痉止さ膯?wèn)題胖腾,開發(fā)、應(yīng)用運(yùn)維瘪松、系統(tǒng)運(yùn)維咸作,各管各的,所以很多公司的監(jiān)控系統(tǒng)也是各是各的宵睦,完全串不起來(lái)记罚。
監(jiān)控的數(shù)據(jù)項(xiàng)太多。信息太多等于沒(méi)有信息
2.好的監(jiān)控系統(tǒng)應(yīng)該有以下幾個(gè)特征:
(1)關(guān)注于整體應(yīng)用的 SLA(Service-Level Agreement服務(wù)等級(jí)協(xié)議)状飞。主要從為用戶服務(wù)的 API 來(lái)監(jiān)控整個(gè)系統(tǒng)毫胜。
(2)關(guān)聯(lián)指標(biāo)聚合。 把有關(guān)聯(lián)的系統(tǒng)及其指標(biāo)聚合展示诬辈。主要是三層系統(tǒng)數(shù)據(jù):基礎(chǔ)層酵使、平臺(tái)中間件層和應(yīng)用層。其中焙糟,最重要的是把服務(wù)和相關(guān)的中間件以及主機(jī)關(guān)聯(lián)在一起口渔,服務(wù)有可能運(yùn)行在Docker 中,也有可能運(yùn)行在微服務(wù)平臺(tái)上的多個(gè) JVM 中穿撮,也有可能運(yùn)行在 Tomcat 中缺脉。無(wú)論運(yùn)行在哪里,都要把服務(wù)的具體實(shí)例和主機(jī)關(guān)聯(lián)在一起,否則定位問(wèn)題猶如大海撈針悦穿。
(3)快速故障定位攻礼。 做用戶請(qǐng)求跟蹤的 trace 監(jiān)控,監(jiān)控到所有的請(qǐng)求在分布式系統(tǒng)中的調(diào)用鏈栗柒,做成沒(méi)有侵入性的礁扮。
3.好的監(jiān)控系統(tǒng)主要是為以下兩個(gè)場(chǎng)景所設(shè)計(jì)的
“體檢”
容量管理。 提供一個(gè)全局的系統(tǒng)運(yùn)行時(shí)數(shù)據(jù)的展示瞬沦,可以讓工程師團(tuán)隊(duì)知道是否需要增加機(jī)器或者其它資源太伊。
性能管理」渥辏可以通過(guò)查看大盤僚焦,找到系統(tǒng)瓶頸,并有針對(duì)性地優(yōu)化系統(tǒng)和相應(yīng)代碼曙痘。
“急診”
定位問(wèn)題芳悲×⒅猓可以快速地暴露并找到問(wèn)題的發(fā)生點(diǎn),幫助技術(shù)人員診斷問(wèn)題芭概。
性能分析赛不。當(dāng)出現(xiàn)非預(yù)期的流量提升時(shí),可以快速地找到系統(tǒng)的瓶頸罢洲,并可以幫助開發(fā)人員深入代碼踢故。
四、如何做出一個(gè)好的監(jiān)控系統(tǒng)
1.服務(wù)調(diào)用鏈跟蹤
監(jiān)控系統(tǒng)從對(duì)外的 API 開始惹苗,將后臺(tái)的實(shí)際服務(wù)關(guān)聯(lián)起來(lái)殿较,服務(wù)的依賴服務(wù)給關(guān)聯(lián)起來(lái),直到最后一個(gè)服務(wù)(如 MySQL 或 Redis)桩蓉,整個(gè)系統(tǒng)服務(wù)全部串連淋纲。
對(duì)于 Java 類的服務(wù),使用字節(jié)碼技術(shù)進(jìn)行字節(jié)碼注入院究,做無(wú)侵入式洽瞬。
如下圖所示(截圖來(lái)自我做的一個(gè) APM 的監(jiān)控系統(tǒng))。
2.服務(wù)調(diào)用時(shí)長(zhǎng)分布
下圖是 Zipkin 的服務(wù)調(diào)用時(shí)間分布业汰』锴裕可以看到一個(gè)服務(wù)調(diào)用鏈上的時(shí)間分布,知道最耗時(shí)的服務(wù)是什么样漆。
3.服務(wù)的 TOP N 視圖
三種排名的方法:a)按調(diào)用量排名为障,b) 按請(qǐng)求最耗時(shí)排名,c)按熱點(diǎn)排名(一個(gè)時(shí)間段內(nèi)的請(qǐng)求次數(shù)的響應(yīng)時(shí)間和)放祟。
4.數(shù)據(jù)庫(kù)操作關(guān)聯(lián)
對(duì)于 Java 應(yīng)用鳍怨,我們可以很方便地通過(guò) JavaAgent 字節(jié)碼注入技術(shù)拿到JDBC 執(zhí)行數(shù)據(jù)庫(kù)操作的執(zhí)行時(shí)間和相關(guān)的請(qǐng)求對(duì)應(yīng)起來(lái)。
5.服務(wù)資源跟蹤跪妥。
我們的服務(wù)可能運(yùn)行在物理機(jī)/虛擬機(jī)里/Docker 的容器里(運(yùn)行在物理機(jī)或是虛擬機(jī)上)鞋喇。我們需要把服務(wù)運(yùn)行的機(jī)器節(jié)點(diǎn)上的數(shù)據(jù)(如 CPU、MEM眉撵、I/O侦香、DISK、NETWORK)關(guān)聯(lián)起來(lái)执桌。到如下的目標(biāo)鄙皇。
????當(dāng)一臺(tái)機(jī)器掛掉是因?yàn)?CPU 或 I/O 過(guò)高芜赌、SQL 操作過(guò)慢仰挣、消息隊(duì)列擁塞的時(shí)候,我們馬上可以知道其會(huì)影響到哪些對(duì)外服務(wù)API缠沈。
????當(dāng)一個(gè)服務(wù)響應(yīng)過(guò)慢的時(shí)候膘壶,我們馬上能關(guān)聯(lián)出來(lái)是否在做 Java GC错蝴,或是其所在的計(jì)算結(jié)點(diǎn)上是否有資源不足的情況,或是依賴的服務(wù)是否出現(xiàn)了問(wèn)題颓芭。
一旦發(fā)現(xiàn)某個(gè)服務(wù)過(guò)慢是因?yàn)?CPU 使用過(guò)多顷锰,我們就可以做彈性伸縮。
一旦發(fā)現(xiàn)某個(gè)服務(wù)過(guò)慢是因?yàn)?MySQL 出現(xiàn)了一個(gè)慢查詢亡问,做流量限制或降級(jí)操作了官紫。
所以,一個(gè)分布式系統(tǒng)州藕,或是一個(gè)自動(dòng)化運(yùn)維系統(tǒng)束世,或是一個(gè) Cloud Native 的云化系統(tǒng),最重要的事就是把監(jiān)控系統(tǒng)做好床玻。在把數(shù)據(jù)收集好毁涉、關(guān)聯(lián)好。這樣锈死,我們才可能很快地定位故障贫堰,進(jìn)而才能進(jìn)行自動(dòng)化調(diào)度。
上圖只是簡(jiǎn)單地展示了一個(gè)分布式系統(tǒng)的服務(wù)調(diào)用鏈接上都在報(bào)錯(cuò)待牵,其根本原因是數(shù)據(jù)庫(kù)鏈接過(guò)多其屏,服務(wù)不過(guò)來(lái)。另外一個(gè)原因是洲敢,Java 在做 Full GC 導(dǎo)致處理過(guò)慢漫玄。于是,消息隊(duì)列出現(xiàn)消息堆積堵塞压彭。這個(gè)圖只是一個(gè)示例睦优,其形象地體現(xiàn)了在分布式系統(tǒng)中監(jiān)控?cái)?shù)據(jù)關(guān)聯(lián)的重要性。