1. 程式人生 > 其它 >100行程式碼,搞定http監控框架

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監控比這強多了