100行程式碼,搞定http監控框架
叢集資訊管理,員工資訊管理,告警策略管理,幾篇前戲已經鋪墊足夠,今天,分享如何用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 : http://daojia.com/
result : 家政
即,訪問http://daojia.com/,返回結果必須包含“家政”。
以獲取使用者資訊RESTful介面為例,監控項核心資訊為:
[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,返回結果必須包含“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監控比這強多了