系統(tǒng)監(jiān)控,是做系統(tǒng)必須解決的一個(gè)問題。創(chuàng)業(yè)型公司,微服務(wù)以前,如何用半天的時(shí)間,搞定一個(gè)可擴(kuò)展,通用的http監(jiān)控框架,是今天要聊的話題。(2)返回json數(shù)據(jù)的http接口;可以通過access日志,觀測參數(shù)來實(shí)施告警:(2)http請(qǐng)求響應(yīng)時(shí)間;常見的http非200狀態(tài)碼,以及響應(yīng)時(shí)間監(jiān)控有什么弊端?畫外音:當(dāng)然,不排除有些公司把tomcat異常信息透傳到頁面的。這個(gè)頁面的http狀態(tài)碼是200,且返回速度極快,根本不能代表html頁面的真實(shí)運(yùn)行情況,很難起到真正的監(jiān)控作用。畫外音:不是說http狀態(tài)碼監(jiān)控沒用,相反,http狀態(tài)碼的監(jiān)控是很有必要的,http狀態(tài)碼404說明系統(tǒng)一定有問題,但http狀態(tài)碼200不能說明系統(tǒng)沒有問題。http狀態(tài)碼不能說明問題,那什么才能代表http沒有問題呢?每個(gè)http都有自己的業(yè)務(wù)特性,必須符合業(yè)務(wù)特性的頁面,才是正常的。例如,訪問http://daojia.com/,一定要返回一個(gè)含“家政”字眼的html頁面,才是正確的。例如,RESTful的獲取用戶信息接口,假設(shè)傳入uid=123,會(huì)傳回:{“RET”:”SUCCESS”, “name”:”shenjian”, “uid”:”123”}即,http://daojia.com/userinfo/get/?uid=123,一定要返回一個(gè)含“shenjian”的字符串,才是正確的。于是乎,得到了可擴(kuò)展通用http監(jiān)控框架的思路:不僅僅要監(jiān)控http狀態(tài)碼,更重要的是,要監(jiān)控http返回內(nèi)容的業(yè)務(wù)特性。可擴(kuò)展通用http監(jiān)控框架的細(xì)節(jié)如何?整個(gè)http監(jiān)控平臺(tái)的架構(gòu)如上,分為監(jiān)控平臺(tái)模塊,信息管理模塊,基礎(chǔ)服務(wù)模塊。(1)http監(jiān)控中心:實(shí)施監(jiān)控的主程序;(2)http監(jiān)控配置:可擴(kuò)展的監(jiān)控項(xiàng)信息管理;(1)被監(jiān)控的html頁面/RESTful接口屬于哪個(gè)集群;(3)被監(jiān)控的URL需要傳入的數(shù)據(jù),包含GET/POST/COOKIE等數(shù)據(jù);(4)被監(jiān)控的http返回的數(shù)據(jù)中必須包含什么業(yè)務(wù)特性字符串;例如,到家官網(wǎng)html為例,監(jiān)控項(xiàng)核心信息為:[http.monitor.item]
cluster.name : daojia_main
url : http://daojia.com/
result : 家政
即,訪問http://daojia.com/,返回結(jié)果必須包含“家政”。以獲取用戶信息RESTful接口為例,監(jiān)控項(xiàng)核心信息為:[http.monitor.item]
cluster.name : daojia_user
url : http://daojia.com/userinfo/get/
get.data : uid=123
post.data : NULL
cookie.data : NULL
result : shenjian
即,訪問http://daojia.com/userinfo/get/?uid=123,返回結(jié)果必須包含“shenjian”。框架初期,可以以配置的形式管理監(jiān)控項(xiàng),但如果要做成平臺(tái),需要有一個(gè)監(jiān)控項(xiàng)管理后臺(tái),來新增/修改/管理監(jiān)控項(xiàng)。監(jiān)控中心,會(huì)遍歷所有監(jiān)控項(xiàng),并發(fā)對(duì)各個(gè)http監(jiān)控項(xiàng)實(shí)施監(jiān)控。信息管理模塊又分為:集群信息管理模塊,員工信息管理模塊,告警策略管理模塊。Info Service::getClusterInfo(String clusterName)集群信息有很多,和監(jiān)控相關(guān)的主要有這么幾個(gè)信息:(1)集群ip列表,每個(gè)web-server都應(yīng)該被監(jiān)控到;(2)集群負(fù)責(zé)人,如果監(jiān)控異常,要將告警發(fā)給誰;Info Service::getYuanGongInfo(String name)員工信息有很多,和監(jiān)控相關(guān)的主要有這么幾個(gè)信息:(1)員工手機(jī)號(hào),郵箱,微信號(hào),釘釘號(hào)等通訊信息;(2)如果要實(shí)現(xiàn)多級(jí)告警策略,還需要獲取員工部門及l(fā)eader的相關(guān)信息;Bool Service::trySendAlarm(
???????? String clusterName,
???????? String yuangongName,
???????? String ip,
???????? String url,
???????? …
)
即,一旦發(fā)現(xiàn)接口有異常,嘗試發(fā)送告警。這個(gè)嘗試發(fā)送告警,并不意味著一定會(huì)發(fā)送短信或者郵件,因?yàn)樾枰獙?shí)現(xiàn)一系列人性化的告警策略:- 定時(shí)定頻策略,可以通過yuangongName去重
- 白天黑夜策略,可以通過告警發(fā)送時(shí)間實(shí)施
進(jìn)行完告警策略過濾后,如果真實(shí)需要發(fā)送告警,調(diào)用基礎(chǔ)服務(wù)模塊發(fā)出。發(fā)送郵件,發(fā)送短信這些基礎(chǔ)服務(wù)模塊,相信每個(gè)公司都有,這里就不展開敘述了。進(jìn)一步的,可擴(kuò)展通用http監(jiān)控框架細(xì)節(jié)如何?早期,如果系統(tǒng)沒有平臺(tái)化和服務(wù)化,可以通過配置文件,搞定上面的各個(gè)可擴(kuò)展模塊:(1)http監(jiān)控項(xiàng)信息:通過配置文件搞;(4)告警策略信息:不搞告警策略了,異常就發(fā)短信;于是乎,http監(jiān)控框架變成了這個(gè)樣子,模塊都用配置文件代替了:http監(jiān)控項(xiàng)配置,monitor-item.config[http.monitor.item]
cluster.name : daojia_main
url : http://daojia.com/
result : 家政
[http.monitor.item]
cluster.name : daojia_user
url : http://daojia.com/userinfo/get/
get.data : uid=123
post.data : NULL
cookie.data : NULL
result : shenjian
集群信息配置,cluster-info.config:[daojia_main]
ip.list : ip1, ip2, ip3
port : 80
owner.list: shenjian, zhangsan, lisi
[daojia_user]
ip.list : ip11, ip22, ip33
port : 8080
owner.list: shenjian
[shenjian]
email : [email protected]
phone :15912345678
[zhangsan]
email : [email protected]
phone :18611220099
// 解析配置文件,取出監(jiān)控項(xiàng)、集群、員工等信息
Array[monitor-item] A1=Parse(monitor-item.config);
Array[cluster-info] A2= Parse(cluster-info.config);
Array[owner-info] A3=Parse(owner-info.config);
// 遍歷所有監(jiān)控項(xiàng)
for(each item in A1){
?// 取出監(jiān)控項(xiàng)的集群名,URL,http數(shù)據(jù),結(jié)果等信息
?clusterName= item.clusterName;
?url= item.url;
?getData= item.getData;
?postData= item.postData;
?cookieData= item.cookieData;
?result= item.result
?// 由集群名,獲取集群信息
?clusterInfo= A2[clusterName];
?// 由集群信息,獲取集群ip列表,集群負(fù)責(zé)人列表
?Listips = clusterInfo.ip;
?Listowners = clusterinfo.owner;
?// 集群內(nèi)的每一個(gè)ip實(shí)例web-server,都需要監(jiān)控
?for(each ip in ips){
? // 根據(jù)ip,url,http數(shù)據(jù)構(gòu)造請(qǐng)求
? httpClient client = new httpClient(ip, url, getData, postData, cookieData);
? // 獲取http請(qǐng)求執(zhí)行結(jié)果
? httpResponse resp = client.execute();
? // 如果返回為200,并且包含監(jiān)控項(xiàng)里的業(yè)務(wù)特性結(jié)果
? if(resp.code==200&& resp.contain(result)){
? ? //正常,繼續(xù)監(jiān)控
? ? continue;
? }
? // 否則,對(duì)所有集群負(fù)責(zé)人發(fā)送告警
? for(each owner in owners){
? ?// 取出負(fù)責(zé)人郵箱和手機(jī)號(hào)
? ?email =A3[owner].email;
? ?phone =A3[owner].phone;
? ?// 發(fā)送郵件與短信告警
? ?sendEmail(email, ip,url, owner);
? ?snedSM(phone, ip, url,owner);
? }
?}
}
如此一來,一個(gè)小型的,可擴(kuò)展的,滿足創(chuàng)業(yè)型公司需求的http監(jiān)控框架,就搞定了。畫外音:先不用糾結(jié)是用服務(wù),還是cron,還是多線程這些細(xì)節(jié),也不用糾結(jié)一行能不能parse完整個(gè)配置文件,用過xml的都懂,上面的配置文件只是demo示例而已。這個(gè)框架的擴(kuò)展性非常好,能很好的通過配置文件擴(kuò)展。monitor-item.config,監(jiān)控項(xiàng)擴(kuò)展性:(1)新增html頁面監(jiān)控,或者json的RESTful接口監(jiān)控,只需要在配置中增加一個(gè)item;(2)配置支持url,get,post,cookie等參數(shù)拼裝任意http監(jiān)控請(qǐng)求;(3)配置支持不同業(yè)務(wù)邏輯返回不同的result的業(yè)務(wù)特性檢查;cluster-info.config,集群信息擴(kuò)展性:(1)新增集群,只需在配置中增加一個(gè)item;(2)集群加了一個(gè)實(shí)例,只需增加一個(gè)ip;(3)集群加了一個(gè)負(fù)責(zé)人,只需增加一個(gè)owner;owner-info.config,負(fù)責(zé)人信息擴(kuò)展性:(1)新增負(fù)責(zé)人,只需要在配置中增加一個(gè)item;(2)換了手機(jī)號(hào)/郵箱,只需修改相應(yīng)配置;最后一個(gè)問題,為什么要拆分成3個(gè)配置文件,而不是只用一個(gè)?呵呵,設(shè)計(jì)解耦,我們都需要多多修煉。
思路比結(jié)論更重要,希望大家有收獲。
貴司的http,是怎么監(jiān)控的?謝轉(zhuǎn)。