系统监控,是做系统必须解决的一个问题。创业型公司,微服务以前,如何用半天的时间,搞定一个 可扩展,通用 的 http 监控框架
,是今天要聊的话题。
有哪些常见 http 监控需求?
常见的 http 监控需求有两类:
- html 页面监控;
- 返回 json 数据的 http 接口;
常见的 http 监控怎么玩?
可以通过 access 日志,观测参数来实施告警:
- http 非 200 状态码;
- http 请求响应时间;
常见的 http 非 200 状态码,以及响应时间监控有什么弊端?
大部分公司,都有自己的 404 页面。
画外音:当然,不排除有些公司把 tomcat 异常信息透传到页面的。
这个页面的 http 状态码是 200,且返回速度极快,根本不能代表 html 页面的真实运行情况,很难起到真正的监控作用。
画外音:不是说 http 状态码监控没用,相反,http 状态码的监控是很有必要的,http 状态码 404 说明系统一定有问题,但 http 状态码 200 不能说明系统没有问题。
http 状态码不能说明问题,那什么才能代表 http 没有问题呢?
每个 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 监控框架的细节如何?
整个 http 监控平台的架构如上,分为监控平台模块,信息管理模块,基础服务模块
。
一、监控平台模块
- http 监控中心:实施监控的主程序;
- http 监控配置:可扩展的监控项信息管理;
监控项核心信息包含:
- 被监控的 html 页面/RESTful 接口属于哪个集群;
- 被监控的 URL;
- 被监控的 URL 需要传入的数据,包含 GET/POST/COOKIE 等数据;
- 被监控的 http 返回的数据中必须包含什么业务特性字符串;
例如,到家官网 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 监控框架变成了这个样子,模块都用配置文件代替了:
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 :XX@XX.com
phone :15912345678
[zhangsan]
email :YY@YY.com
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, p, url,owner);
}
}
}
如此一来,一个小型的,可扩展的,满足创业型公司需求的 http 监控框架,就搞定了。
画外音:先不用纠结是用服务,还是 cron,还是多线程这些细节,也不用纠结一行能不能 parse 完整个配置文件,用过 xml 的都懂,上面的配置文件只是 demo 示例而已。
这个框架的扩展性非常好,能很好的通过配置文件扩展。
monitor-item.config,监控项扩展性:
- 新增 html 页面监控,或者 json 的 RESTful 接口监控,只需要在配置中增加一个 item;
- 配置支持 url,get,post,cookie 等参数拼装任意 http 监控请求;
- 配置支持不同业务逻辑返回不同的 result 的业务特性检查;
cluster-info.config,集群信息扩展性:
- 新增集群,只需在配置中增加一个 item;
- 集群加了一个实例,只需增加一个 ip;
- 集群加了一个负责人,只需增加一个 owner;
owner-info.config,负责人信息扩展性:
- 新增负责人,只需要在配置中增加一个 item;
- 换了手机号/邮箱,只需修改相应配置;
最后一个问题,为什么要拆分成 3 个配置文件,而不是只用一个?
呵呵,设计解耦,我们都需要多多修炼。
思路比结论更重要,希望大家有收获。
参考文章
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!