叢集資訊管理,員工資訊管理,告警政策管理,幾篇前戲已經鋪墊足夠,今天,分享如何用100行代碼搞定一個可擴充,通用的http監控架構。
一、常見的http監控玩法
提問:有哪些常見http監控需求?
回答:常見的http監控需求有兩類:
- html頁面監控
- 傳回json資料的http接口
提問:常見的http監控怎麼玩?
回答:一般access日志,通過觀測以下兩個參數來實施告警:
- http非200狀态碼
- http請求響應時間
二、常見的http監控存在什麼問題?
提問:常見的http非200狀态碼,以及響應時間監控有什麼弊端?
回答:每個公司都有自己的404頁面,例如58到家的404頁面大概長這樣:

這個頁面的http狀态碼是200,且傳回速度極快,根本不能代表html頁面的真實運作情況,很難起到真正的監控作用。
畫外音:不是說http狀态碼監控沒用,相反,http狀态碼的監控是很有必要的,http狀态碼404說明系統一定有問題,但http狀态碼200不能說明系統沒有問題。
提問:http狀态碼不能說明問題,那什麼才能代表http沒有問題呢?
回答:每個http都有自己的業務特性。
特性一:需要傳回特定的頁面内容,例如,58到家的官網大概長成這樣:
即,通路
http://daojia.com/,一定要傳回一個含“家政”字眼的html頁面,才是正确的。
特性二:需要傳回特定的接口内容,例如,RESTful的擷取使用者資訊接口,假設傳入uid=123,會傳回:
{“RET”:”SUCCESS”, “name”:”shenjian”, “uid”:”123”}
即,
http://daojia.com/userinfo/get/?uid=123,一定要傳回一個含“shenjian”的字元串,才是正确的。
于是乎,得到了可擴充通用http監控平台(架構)的思路:不僅僅要監控http狀态碼,更重要的是,要監控http傳回内容的業務特性。
三、可擴充通用http監控平台架構細節
整個http監控平台的架構如上,分為監控平台層,資訊管理層,基礎服務層。
監控平台層
- http監控中心:實施監控的主程式
- http監控配置:可擴充的監控項資訊管理
監控項核心資訊包含:
- 被監控的html頁面/RESTful接口屬于哪個叢集
- 被監控的URL
- 被監控的URL需要傳入的資料,包含GET/POST/COOKIE等資料
- 監控的http傳回的資料中必須包含什麼業務特性字元串
以58到家官網html為例,監控項核心資訊為:
[http.monitor.item]
cluster.name : daojia_main
url :
result : 家政
,傳回結果必須包含“家政”。
以擷取使用者資訊RESTful接口為例,監控項核心資訊為:
cluster.name : daojia_user
http://daojia.com/userinfo/get/get.data : uid=123
post.data : NULL
cookie.data : NULL
result : shenjian
,傳回結果必須包含“shenjian”。
如果要做成平台,需要有一個監控項管理背景,來新增/修改/管理監控項。
監控中心,會周遊所有監控項,并發對各個http監控項實施監控。
資訊管理層
資訊管理層又分為:叢集資訊管理服務,員工資訊管理服務,告警政策管理服務。
畫外音:沒錯,就是最近兩篇文章《叢集資訊管理》和《員工資訊管理,告警政策管理》聊的内容,要不你以為為何提前講這兩篇。
叢集資訊管理服務,主要提供這個接口:
Info Service::getClusterInfo(String clusterName)
即,通過叢集名,擷取叢集資訊。
叢集資訊有很多,和監控相關的主要有這麼幾個資訊:
叢集ip清單,每個web-server都應該被監控到
叢集負責人,如果監控異常,要将告警發給誰
使用者資訊管理服務,主要提供這個接口:
Info Service::getYuanGongInfo(String name)
即,通過員工名,擷取員工資訊。
員工資訊有很多,和監控相關的主要有這麼幾個資訊:
員工手機号,郵箱,微信号,釘釘号等通訊資訊
如果要實作多級告警政策,還需要擷取員工部門及leader的相關資訊
告警政策管理服務,主要提供這個接口:
Bool Service::trySendAlarm(
String clusterName,
String yuangongName,
String ip,
String url,
…
)
即,一旦發現接口有異常,嘗試發送告警。
這個嘗試發送告警,并不意味着一定會發送短信或者郵件,因為需要實作一系列人性化的告警政策:
- 叢集收斂政策,可以通過clusterName去重
- 接口收斂政策,可以通過url去重
- 定時定頻政策,可以通過yuangongName去重
- 白天黑夜政策,可以通過告警發送時間實施
- …
基礎服務層
進行完告警政策過濾後,如果真實需要發送告警,調用基礎服務層的服務發出。
發送郵件,發送短信這些基礎服務,相信每個公司都有,這裡就不展開叙述了。
畫外音:聽說你們公司沒有發郵件,發短信的服務?你真的在一家網際網路公司麼?
四、可擴充通用http監控架構細節
樓主,你在搞笑?我在一個創業型公司,你上面說的http監控配置服務,叢集資訊管理服務,員工資訊管理服務,告警政策管理服務,我們公司都沒有!隻有一個能發短信的接口,能整出個http監控架構不?還要通用可擴充喲。樓主你個騙子,說好的100行代碼實作呢?
額,别急,上面的所有服務即使都沒有,隻要能發短信告警,就能整:
- http監控項資訊:通過配置檔案搞
- 叢集資訊:通過配置檔案搞
- 員工資訊:通過配置檔案搞
- 告警政策資訊:不搞告警政策了,異常就發短信
于是乎,http監控架構變成了這個樣子,服務都用配置檔案代替了:
http監控項配置,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
員工資訊配置,owner-info.config
[shenjian]
email : [email protected]
phone :15912345678
[zhangsan]
email : [email protected]
phone :18611220099
五、http監控架構僞代碼
// 解析配置檔案,取出監控項、叢集、員工等資訊
Array[monitor-item] A1=Parse(monitor-item.config);
Array[cluster-info] A2= Parse(cluster-info.config);
Array[owner-info] A3=Parse(owner-info.config);
// 周遊所有監控項
for(each item in A1){
// 取出監控項的叢集名,URL,http資料,結果等資訊
clusterName= item.clusterName;
url= item.url;
getData= item.getData;
postData= item.postData;
cookieData= item.cookieData;
result= item.result
// 由叢集名,擷取叢集資訊
clusterInfo= A2[clusterName];
// 由叢集資訊,擷取叢集ip清單,叢集負責人清單
List<String>ips = clusterInfo.ip;
List<String>owners = clusterinfo.owner;
// 叢集内的每一個ip執行個體web-server,都需要監控
for(each ip in ips){
// 根據ip,url,http資料構造請求
httpClient client = new httpClient(ip, url, getData, postData, cookieData);
// 擷取http請求執行結果
httpResponse resp = client.execute();
// 如果傳回為200,并且包含監控項裡的業務特性結果
if(resp.code==200&& resp.contain(result)){
//正常,繼續監控
continue;
}
// 否則,對所有叢集負責人發送告警
for(each owner in owners){
// 取出負責人郵箱和手機号
email =A3[owner].email;
phone =A3[owner].phone;
// 發送郵件與短信告警
sendEmail(email, ip,url, owner);
snedSM(phone, ip, url,owner);
}
}
}
把上面的僞代碼多看幾遍,相信一定會有收獲。
不用糾結是用服務,還是cron,還是多線程這些細節,也不用糾結一行能不能parse完整個配置檔案,用過xml的都懂,上面的配置檔案隻是sample示例而已。
這個架構的擴充性非常好,能很好的通過配置檔案擴充。
monitor-item.config,監控項擴充性
- 新增html頁面監控,或者json的RESTful接口監控,隻需要在配置中增加一個item
- 配置支援url,get,post,cookie等參數拼裝任意http監控請求
- 配置支援不同業務邏輯傳回不同的result的業務特性檢查
cluster-info.config,叢集資訊擴充性
- 新增叢集,隻需在配置中增加一個item
- 叢集加了一個執行個體,隻需增加一個ip
- 叢集加了一個負責人,隻需增加一個owner
owner-info.config,負責人資訊擴充性
- 新增負責人,隻需要在配置中增加一個item
- 換了手機号/郵箱,隻需修改相應配置
提問:最後一個問題,為什麼要拆分成3個配置檔案,而不是隻用一個?
回答:呵呵,設計解耦,我們都需要多多修煉。
推薦,強相關的兩篇文章,看了了解本文更深刻:
- 叢集資訊管理
- 員工資訊管理,告警政策管理
調研,對于http監控架構,你的感受是:
- ca,有點意思,回去整一個
- 架構化,擴充性挺好,我們公司也實作了
- 平台化,我們公司也實作了
- 弱雞,我們的http監控比這強多了