79

简谈从零开始搭建一套业务相关监控报警系统

 6 years ago
source link: https://mp.weixin.qq.com/s?__biz=MzAwODU3NTMzNg%3D%3D&mid=2470484422&idx=1&sn=34df0fae15923d76d9d1cdd4223f0939&chksm=8dd8f9c1baaf70d71bde8b12e346e8677c428f95912b29b772f7c9977d8fb00c17908e909e79%23rd
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

简谈从零开始搭建一套业务相关监控报警系统

Original 吉敏 编程技术小站 2018-01-03 16:03 Posted on

声明

内容主要为自己在公司从零搭建完整的基于业务的监控报警系统的过程,这个过程中许多决策都不是唯一选择,且主要是基于Java项目来做的。

先来一张监控系统展示图镇楼:

Image

正文

监控对企业级项目特别重要,许多企业都已经拥有了自己的监控报警系统,监控报警系统的重要性就不在这里列举了。那么,从零开始搭建一套完整的业务报警系统要做哪些事情呢?

客户端

首先,需要能生成监控。这时候需要写一个客户端,客户端提供方法给业务端调用来生成监控。客户端都要完成哪些内容呢?

通常监控是每分钟生成一个监控点,客户端需要提供的核心包括:发生了一次或多次(计算QPS)、发生一次花费的时间(计算每次平均花费时间,主要用于对接口的监控)、记录影响的个数(主要记录某个方法单位时间影响结果的总数)、记录最后一次影响的个数(主要记录某个方法单位时间内最后一次执行影响结果的监控),不同的接口可以通过生成不同的监控后缀来区分。在此基础上,还要能支持成功、失败及成功和失败的占比。

以上主要是对业务的支持,对于java项目而言,客户端还可以主动抓取tomcat和jvm信息,每分钟生成一个点。

除此,客户端要提供一个指定接口用于被服务器端抓取最近一分钟的监控,业务端配置这个接口可以被指定的服务器顺利访问。这里没有选择客户端主动推送,是为了让服务器配置合法的客户端,这样控制起来更容易,也可以防止某些环境(dev、beta)不需要记录监控的值不进入服务器端。

服务端

说完客户端,再说一下服务器端。服务器端都要完成哪些内容呢?

接着客户端最后一个点,首先服务器端需要能自己配置对应的客户端地址。简单的方式是直接配置允许的ip:port, 但是对于在docker上部署的项目,ip可能是动态的,这是可以选择配置域名或者读取部署的动态ip列表的接口解析完成。

确定好待抓取的客户端后,接下来就是每分钟遍历客户端去抓每个客户端生成的监控点了,如果客户端过多,可以考虑多开几个进程来抓。

监控点都被抓到服务器端后,需要对每个客户端抓到的监控点进行解析处理。比如,记录qps的监控需要根据这一分钟的次数计算每秒钟的次数,除此,还有一个特别重要的需要处理,就是相同项目多个客户端端数据的merge,在记录监控时,也要记录下单机的监控和整体的监控。

解析完监控数据后,需要对监控点进行入库。监控点这种数据的保存,不能使用普通的关系型数据库来存储了,而要选择时间序列数据库,这里推荐一个开源软件:Graphite。Graphite 支持 Whisper、Carbon和graphite-api, Whisper为固定大小的时间序列数据库,Carbon为数据接收服务,接收到数据以后存储到Whisper中,而graphite-api 则作为WSGI webapp 接口服务,提供的 REST API 进行数据的获取。

说到这里,就不得不提到另外一个开源软件:Grafana。Grafana 主要做数据展示的,grafana可以很好的支持graphite-api 来进行数据渲染。

这样一来,服务器端抓取到监控数据,解析完交给carbon,carbon接收到数据到存储到whisper中,grafana则通过graphite-api 读取监控数据渲染监控页面。如此,监控系统就ok了。具体流程可参考下图:

Image

(语音)报警

graphite 这个软件真的是无比强大,除了可以和grafana 搭配使用外,他还可以和zabbix这个报警搭配使用。通过脚本每分钟把数据同步到zabbix后,就可以zabbix中配置报警了,zabbix如何配置报警就不再这里详细说明了。

zabbix报警本身支持邮件通知、SMS通知及外部脚本通知等,这里重点说一下外部脚本通知:通过外部脚本可以引入语音报警。这里重要说一下我们是如何通过外部脚本完成语音报警的。我们在zabbix里配置了使用外部脚本通知,在脚本里首先是做邮件通知,之后调用一个接口,通知的内容作为参数。调用的接口是单独写了一个新项目提供的。接口在处理时,会根据报警的内容做一些基于业务的分析,比如某些时间段不需要通知、包含某些关键字不需要通知等等,在确定要做语音报警后,调起twilio的接口进行通知,然后根据twilio提供的接口检查语音通知状态,如果发现语音通知的人没有接起电话,进行升级处理,尽量让报警能语音通知到人。

关于语音报警,国内的阿里大于也很不错的,但是收费方式不同。twilio和阿里大于的唤起语音的报警的接口使用起来都比较方便,自己是花一天半左右的时间完成了对api的理解和对业务的封装。

总结

最后总结一下我们搭建的这套监控报警系统。首先是自己手写了客户端和服务端,这个过程会涉及到许多并发的处理和对监控数据细节处理,之后引入了Grafana + Graphite + Zabbix 这套可以完成监控数据处理、展示、报警的开源组件,这三个组件更多涉及到的是安装和配置,以及个别脚本的变写,最后又手写了一个语言报警通知系统,通过调用twilio接口完成语音通知。

其他文章推荐

改造电商交易后台权限管理过程

数据权限通用设计方案

Java项目中使用log记录日志的一些总结

数据库设计技巧:一个字符串细节处理解决递归查询问题

由于正在出 Java多线程并发与高并发、高可用 方面的在线课程,接下来会结合实际需要主要发一些这方面的文章,欢迎关注~ 


如果喜欢这篇文章, 别忘了点赞分享哦~

如果喜欢这个公众号,记得扫码关注哦~

欢迎大家多多留言,说出你想学习的技术、想看的文章或者希望学习的技术栈~

Image

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK