现在有很多开源的监控软件可以通过监控我们的程序的进程是否还存在确认我们的服务是否异常。
但是对于假死的情况很难监控到,假死的情况下服务的进程等还在,但是访问都是返回502等错误。
在此,我们就会考虑通过调用我们服务的部分接口判断服务是否异常,如果服务躲多起来,而且接口经常发生变化,那么直接使用业务接口就会显得很麻烦。
因此,我们的每个项目都开发有一个公共的监控模块,对外提供统一的接口。同时,该监控模块会调用相关的后台服务,判断所所依赖的其他服务是否有异常。
这样,运维的兄弟调用这个监控接口,可以通过接口返回码判断当前服务是否异常,通过返回值判断所依赖的服务是否正常。
比如:http://api.XXX.com/healthCheck返回如下的内容:
[{"serviceName":"sms","costTime":"0ms","normal":true},{"serviceName":"DB","costTime":"1ms","normal":true}]
内容有2条数据,表示我们的服务依赖另外两个服务——短信sms和数据库DB,costTime表示调用该服务的时间,normal表示所依赖服务的状态。
通过接口返回值(httpcode)可以判断服务是否正常,通过costTime和normal判断所依赖的服务是否正常。
如果normal返回的只不是true或者costTime耗时过大,则可以判断该服务已经有了异常,此时,运维同学就会对该服务进行干预处理。