天天看點

100行代碼,搞定http監控架構

叢集資訊管理,員工資訊管理,告警政策管理,幾篇前戲已經鋪墊足夠,今天,分享如何用100行代碼搞定一個可擴充,通用的http監控架構。

一、常見的http監控玩法

提問:有哪些常見http監控需求?

回答:常見的http監控需求有兩類:

  • html頁面監控
  • 傳回json資料的http接口

提問:常見的http監控怎麼玩?

回答:一般access日志,通過觀測以下兩個參數來實施告警:

  • http非200狀态碼
  • http請求響應時間

二、常見的http監控存在什麼問題?

提問:常見的http非200狀态碼,以及響應時間監控有什麼弊端?

回答:每個公司都有自己的404頁面,例如58到家的404頁面大概長這樣:

100行代碼,搞定http監控架構

這個頁面的http狀态碼是200,且傳回速度極快,根本不能代表html頁面的真實運作情況,很難起到真正的監控作用。

畫外音:不是說http狀态碼監控沒用,相反,http狀态碼的監控是很有必要的,http狀态碼404說明系統一定有問題,但http狀态碼200不能說明系統沒有問題。

提問:http狀态碼不能說明問題,那什麼才能代表http沒有問題呢?

回答:每個http都有自己的業務特性。

特性一:需要傳回特定的頁面内容,例如,58到家的官網大概長成這樣:

100行代碼,搞定http監控架構

即,通路

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監控平台架構細節

100行代碼,搞定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監控項資訊:通過配置檔案搞
  • 叢集資訊:通過配置檔案搞
  • 員工資訊:通過配置檔案搞
  • 告警政策資訊:不搞告警政策了,異常就發短信
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監控比這強多了

繼續閱讀