摘要:
大概是全網(wǎng)介紹監(jiān)控最全面的文章了
在億萬(wàn)服務(wù)、海量數(shù)據(jù)的今天,對(duì)于互聯(lián)網(wǎng)服務(wù)的要求就是三高,高并發(fā)、高性能、高可用。為了實(shí)現(xiàn)“三高”,程序員們可真是使盡渾身解數(shù),在技術(shù)架構(gòu)上使用微服務(wù)架構(gòu),在部署方式上使用Docker、Kubernetes,在彈性擴(kuò)容方面使用云計(jì)算等等。而今天要給大家介紹的便是應(yīng)用監(jiān)控體系。監(jiān)控就像應(yīng)用的跟屁蟲一樣,走到哪跟到哪,做了什么全知道并記錄下來(lái),通過(guò)監(jiān)控體系的搭建,當(dāng)應(yīng)用有問(wèn)題時(shí)可以快速“回放”應(yīng)用軌跡,找到原因,長(zhǎng)遠(yuǎn)來(lái)說(shuō),還可以預(yù)測(cè)故障的發(fā)生,提前避免。
那么一個(gè)應(yīng)用體系是怎么樣的呢?用戶通過(guò)在PC或智能終端(手機(jī))通過(guò)瀏覽器或APP對(duì)應(yīng)用發(fā)起請(qǐng)求,請(qǐng)求通過(guò)網(wǎng)絡(luò)傳輸?shù)綐I(yè)務(wù)系統(tǒng),業(yè)務(wù)系統(tǒng)的函數(shù)通過(guò)應(yīng)用框架、中間件運(yùn)行起來(lái),運(yùn)行系統(tǒng)又依托于操作系統(tǒng),操作系統(tǒng)需要網(wǎng)絡(luò)設(shè)備如網(wǎng)卡等與外界建立通訊,而這全套軟件都是安裝在硬件之上,如服務(wù)器、網(wǎng)卡等硬件設(shè)備都是安裝在機(jī)房中。因此對(duì)一個(gè)應(yīng)用體系的全棧監(jiān)控就包含APP監(jiān)控、瀏覽器監(jiān)控、服務(wù)器監(jiān)控、網(wǎng)絡(luò)監(jiān)控、日志監(jiān)控、基礎(chǔ)設(shè)施監(jiān)控、物理環(huán)境監(jiān)控。
目前APP的主流操作系統(tǒng)有Android、IOS,因此每個(gè)APP開發(fā)時(shí)都會(huì)有兩個(gè)版本,APP的開發(fā)流程是研發(fā)根據(jù)產(chǎn)品需求進(jìn)行功能的開發(fā),開發(fā)完成后打?qū)?yīng)的Android包、IOS包在安卓應(yīng)用商店、蘋果應(yīng)用商品進(jìn)行上線。因此對(duì)于APP的監(jiān)控是通過(guò)打包時(shí)將探針安裝在對(duì)應(yīng)的應(yīng)用包里,形成正式包對(duì)外發(fā)布。
當(dāng)用戶手機(jī)下載了APP后,在使用APP的各個(gè)功能時(shí),整個(gè)的行為軌跡也被探針記錄下來(lái)了。探針會(huì)采集兩類數(shù)據(jù),用戶數(shù)據(jù)和APP運(yùn)行數(shù)據(jù),用戶數(shù)據(jù)包括設(shè)備所在的地域、城市、設(shè)備的操作系統(tǒng)、使用時(shí)長(zhǎng)、使用次數(shù),運(yùn)行數(shù)據(jù)包括APP運(yùn)行網(wǎng)絡(luò)情況、卡頓情況、緩慢情況。獲取到用戶數(shù)據(jù)和運(yùn)行數(shù)據(jù)后就可以運(yùn)營(yíng)分析和運(yùn)維監(jiān)控了,了解開發(fā)的APP用戶日活、訪問(wèn)區(qū)域、訪問(wèn)版本等,幫助產(chǎn)品運(yùn)營(yíng)同學(xué)進(jìn)行產(chǎn)品的優(yōu)化迭代提供意見;通過(guò)運(yùn)維數(shù)據(jù)可以知道用戶打開APP是否白屏、是否卡頓、是否緩慢、是否網(wǎng)絡(luò)被運(yùn)營(yíng)商劫持,從而幫助研發(fā)人員快速解決問(wèn)題,提高用戶留存率。
對(duì)于瀏覽器的監(jiān)控,起源于早期互聯(lián)網(wǎng)時(shí)代,購(gòu)物、購(gòu)票、辦公等都是在PC端進(jìn)行,隨著移動(dòng)互聯(lián)網(wǎng)的興起,逐步的被弱化,但是卻是不可缺少的,因此瀏覽器監(jiān)控也是監(jiān)控體系中不可缺少的一環(huán)節(jié)。瀏覽器監(jiān)控體系也是包含三部分,探針采集數(shù)據(jù)發(fā)送后端、后端處理數(shù)據(jù)給到前端、前端呈現(xiàn)給用戶。
探針的實(shí)現(xiàn)取決于應(yīng)用如何運(yùn)行,對(duì)于瀏覽器應(yīng)用來(lái)說(shuō),主要是前端基于HTML/CSS、JavaScript進(jìn)行開發(fā),用戶在瀏覽器輸入U(xiǎn)RL,首先在本地進(jìn)行緩存查詢是否有該地址對(duì)應(yīng)的IP地址,如果沒(méi)有則再使用DNS進(jìn)行域名解析,找到提供服務(wù)的地址,其次再對(duì)該地址進(jìn)行TCP三次握手連接,發(fā)送請(qǐng)求獲取請(qǐng)求數(shù)據(jù),獲取到數(shù)據(jù)后進(jìn)行數(shù)據(jù)解析,包括HTML文檔解析、DOM構(gòu)建、頁(yè)面渲染,最后呈現(xiàn)給到可視化頁(yè)面用戶。
因此瀏覽器探針是一段JS代碼,通過(guò)瀏覽器的加載事件、導(dǎo)航事件等獲取頁(yè)面訪問(wèn)的數(shù)據(jù),比如瀏覽器基本信息、采集頁(yè)面性能數(shù)據(jù)、采集Ajax性能數(shù)據(jù)和請(qǐng)求響應(yīng)數(shù)據(jù)、JS錯(cuò)誤數(shù)據(jù)、頁(yè)面追蹤數(shù)據(jù)等,再發(fā)送給到后臺(tái)處理加工,形成用戶運(yùn)營(yíng)數(shù)據(jù)(比如頁(yè)面PV、運(yùn)營(yíng)商信息、瀏覽器信息、訪問(wèn)城市省會(huì)信息)、運(yùn)維數(shù)據(jù)(比如Ajax錯(cuò)誤信息、JS緩慢頁(yè)面信息),幫助運(yùn)營(yíng)了解產(chǎn)品用戶情況,更好的推廣營(yíng)銷、幫助研發(fā)運(yùn)維團(tuán)隊(duì)解決產(chǎn)品生產(chǎn)環(huán)境中的功能性能問(wèn)題。
對(duì)于服務(wù)器監(jiān)控主要是監(jiān)控后端系統(tǒng)的運(yùn)行情況,因Java、Python、PHP、.Net/.NetCore、C/C++、Golang等語(yǔ)言都可以開發(fā)后端應(yīng)用,因此服務(wù)器探針也包含各種語(yǔ)言的探針。從這八種開發(fā)語(yǔ)言的特性來(lái)看,有的語(yǔ)言是編譯型,即將源代碼翻譯成機(jī)器碼后才能運(yùn)行,例如Golang,C/C++;有的語(yǔ)言是解釋型,邊執(zhí)行邊翻譯,例如PHP、Python;有的語(yǔ)言是混合型,介于編譯型和解釋型之間,即把代碼編譯成中間碼再在語(yǔ)言提供的平臺(tái)運(yùn)行,例如Java、.Net/.NetCore。因此不同類型語(yǔ)言的探針實(shí)現(xiàn)也不一樣。
對(duì)于解釋型語(yǔ)言來(lái)說(shuō),使用HookApi的方式實(shí)現(xiàn),例如Python在運(yùn)行過(guò)程中會(huì)需要調(diào)用框架和函數(shù),因此Python探針針對(duì)各個(gè)框架各數(shù)據(jù)庫(kù)需要專門定義Hook函數(shù),探針啟動(dòng)時(shí)會(huì)將我們寫好的Hook函數(shù)(針對(duì)WEB框架,WSGI,數(shù)據(jù)庫(kù)等)加入sys_meta_path中,這樣用戶函數(shù)在執(zhí)行后就會(huì)先執(zhí)行我們定義好的Hook函數(shù),采集數(shù)據(jù);對(duì)于編譯型語(yǔ)言來(lái)說(shuō),使用SDK的方式實(shí)現(xiàn),總體的思路和HookAPI一致,差別在于SDK是完全封裝好的內(nèi)容;對(duì)于混合型語(yǔ)言來(lái)說(shuō),使用Agent的方式實(shí)現(xiàn),比如Java探針在JavaSE的Instrumention上做開發(fā),在Java代碼編譯的時(shí)候進(jìn)行了代碼注入,Java探針依附在Java進(jìn)程里,不會(huì)創(chuàng)建新的進(jìn)程,而是創(chuàng)建多個(gè)線程來(lái)采集和匯總數(shù)據(jù),如下圖所示 用戶的類A.class通過(guò)ClassLoader裝載進(jìn)JVM時(shí)會(huì)調(diào)用Javaagent嵌入監(jiān)控代碼生成A'.class,當(dāng)有用戶請(qǐng)求進(jìn)來(lái)時(shí),Engine會(huì)找到A'.class執(zhí)行正常的業(yè)務(wù)邏輯,邏輯執(zhí)行完畢后Engine會(huì)將監(jiān)控Data寫入監(jiān)控?cái)?shù)據(jù)緩存區(qū)(即一次采集周期),并且每隔60s會(huì)向Server發(fā)送數(shù)據(jù),清理緩存區(qū)。
探針采集了應(yīng)用運(yùn)行函數(shù)的時(shí)間運(yùn)行軌跡、調(diào)用數(shù)據(jù)庫(kù)、第三方服務(wù)、消息中間件、下一個(gè)業(yè)務(wù)系統(tǒng)的時(shí)長(zhǎng)和調(diào)用語(yǔ)句,經(jīng)過(guò)后端處理分析,呈現(xiàn)給用戶應(yīng)用調(diào)用全鏈路拓?fù)鋱D、函數(shù)執(zhí)行堆棧、函數(shù)響應(yīng)時(shí)間和調(diào)用次數(shù)、慢/錯(cuò)SQL語(yǔ)句、慢外部調(diào)用語(yǔ)句,幫助研發(fā)人員了解整體業(yè)務(wù)運(yùn)行情況,快速定位分析后端錯(cuò)誤、優(yōu)化應(yīng)用性能。
對(duì)于網(wǎng)絡(luò)監(jiān)控,主要是獲取應(yīng)用運(yùn)行過(guò)程中的網(wǎng)絡(luò)情況定位數(shù)據(jù)傳輸過(guò)程中的網(wǎng)絡(luò)問(wèn)題。實(shí)現(xiàn)方式是探針安裝用戶的數(shù)據(jù)中心,通過(guò)將流經(jīng)交換機(jī)的流量拷貝出來(lái)(即旁路鏡像),解析網(wǎng)絡(luò)協(xié)議(如TCP、SNMP)獲取數(shù)據(jù),然后將數(shù)據(jù)發(fā)送給后端進(jìn)行處理分析,最后在前端呈現(xiàn)給用戶。用戶通過(guò)網(wǎng)絡(luò)監(jiān)控可獲取網(wǎng)絡(luò)流量、吞吐量、帶寬利用率、丟包率、包連接情況、連接嘗試情況、建鏈時(shí)間、網(wǎng)絡(luò)傳輸時(shí)間、URL頁(yè)面耗時(shí)、SQL執(zhí)行耗時(shí)等,快速定位網(wǎng)絡(luò)問(wèn)題、帶寬問(wèn)題,優(yōu)化網(wǎng)絡(luò)使用情況。這種方式最大的好處就是對(duì)用戶業(yè)務(wù)沒(méi)有入侵,因?yàn)槭菍⒘髁客耆截惓鰜?lái)再做分析處理,通常銀行、金融等對(duì)業(yè)務(wù)可用性要求極高的行業(yè)會(huì)使用此類監(jiān)控方式。
日志即服務(wù)的運(yùn)行軌跡,所有的服務(wù)在運(yùn)行中都會(huì)產(chǎn)生日志,主要有主機(jī)日志、網(wǎng)絡(luò)設(shè)備日志、應(yīng)用日志、中間件日志、數(shù)據(jù)庫(kù)日志等五種類型。日志監(jiān)控的實(shí)現(xiàn)邏輯是通過(guò)日志探針、上傳日志、對(duì)接MQ隊(duì)列接口獲取數(shù)據(jù)源,再給到后臺(tái)處理分析,最后在前端呈現(xiàn)。用戶可在前端根據(jù)業(yè)務(wù)出現(xiàn)問(wèn)題的時(shí)間范圍來(lái)獲取該段時(shí)間內(nèi)的日志,也可以輸入關(guān)鍵字進(jìn)行搜索日志,通過(guò)日志可了解應(yīng)用的原生運(yùn)行情況,幫助研發(fā)人員快速定位問(wèn)題。日志平臺(tái)最重要的兩個(gè)能力是存儲(chǔ)大量數(shù)據(jù)、快速搜索能力,對(duì)于搜索來(lái)說(shuō)一般采用Eleasearch大數(shù)據(jù)來(lái)提供數(shù)據(jù)的存儲(chǔ)和搜索功能。
基礎(chǔ)設(shè)施包括物理機(jī)房、服務(wù)器、網(wǎng)絡(luò)設(shè)備、中間件、數(shù)據(jù)庫(kù)、存儲(chǔ)、虛擬化等,對(duì)于基礎(chǔ)設(shè)施的監(jiān)控則包含該機(jī)房運(yùn)行環(huán)境的溫度濕度、服務(wù)器的CPU內(nèi)存磁盤網(wǎng)絡(luò)、數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)類型、版本、字符集、IP端口、狀態(tài)、安裝路徑和數(shù)據(jù)庫(kù)大小等。對(duì)于非物理機(jī)房類型的實(shí)現(xiàn)邏輯是通過(guò)各種協(xié)議(SNMP、WMI、Telnet、SSH、IPMI、JMX、JDBC、Agent等)對(duì)各種原始數(shù)據(jù)進(jìn)行采集,再通過(guò)協(xié)議解析數(shù)據(jù),后臺(tái)處理加工,前臺(tái)呈現(xiàn)給到用戶;對(duì)于物理機(jī)房的實(shí)現(xiàn)邏輯是通過(guò)API接口調(diào)用服務(wù)器的數(shù)據(jù)。運(yùn)維人員通過(guò)基礎(chǔ)設(shè)施監(jiān)控,便能全景了解整個(gè)業(yè)務(wù)物理情況,當(dāng)機(jī)房斷電或服務(wù)器CPU內(nèi)存指標(biāo)異常時(shí),通過(guò)升級(jí)硬件的方式便能解決問(wèn)題。
通過(guò)上述各類監(jiān)控平臺(tái)的介紹,相信你對(duì)監(jiān)控產(chǎn)品的類別、監(jiān)控的使用與價(jià)值、實(shí)現(xiàn)原理已經(jīng)清晰了吧。對(duì)于研發(fā)人員來(lái)說(shuō),選對(duì)了監(jiān)控產(chǎn)品,在業(yè)務(wù)運(yùn)行過(guò)程中便能事半功倍,大幅度提高開發(fā)效率;對(duì)于運(yùn)維人員來(lái)說(shuō),選對(duì)了合適的監(jiān)控產(chǎn)品,在業(yè)務(wù)運(yùn)維過(guò)程中也更能保障業(yè)務(wù)的正常運(yùn)行,提高用戶滿意度;對(duì)于想入門監(jiān)控的同學(xué)來(lái)說(shuō),每一個(gè)方向的監(jiān)控原理和用戶價(jià)值都很清晰了,結(jié)合自己興趣,選擇最適合自己的運(yùn)維監(jiān)控領(lǐng)域即可。
因此本文大概是全網(wǎng)介紹監(jiān)控最全面的文章了。