随着云计算技术的广泛应用,越来越多的项目部署和迁移到云端,传统的监控告警系统在短时间内还不能适配云上的服务。为了实现实时系统运行状态的展示、故障的及时告警、历史状态的回看,可以基于开源的时序数据库Prometheus和可视化工具Grafana,搭配相关工具,快速搭建一个可靠准确的监控告警系统。本文记录了整个设计和搭建过程,以及遇到的一些问题和解决方法。
时序数据库(Time Series Database)是一种为了处理时间序列数据而特别优化的数据库,区别于传统的关系型数据库,时序数据库以时间为主索引,特别适合于按照时间顺序变化数据的存储和检索。它主要有以下几个特点:
DB-Engines统计了目前流行的时序数据库,在本实践中,我们选取了Prometheus作为整个监控系统的底层时序数据存储。Prometheus是由SoundCloud开源的监控告警专用时序数据库,目前Github上已有24k+的star,已经被许多公司运用到项目的监控当中。
Prometheus主要特性如下:
这里举例一个Prometheus的监控项来说明数据的格式:
监控数据上报器(moni-exporter)是定制开发的一个HTTP服务器,部署在所有业务服务器上,主要负责收集共享内存(shm)的监控数据,把收集的数据转化为Prometheus规定的监控数据格式。Prometheus会间隔一定的时间(配置为1分钟)访问该接口获取监控数据并集中保存。由于是Prometheus主动Pull模式,简单的方式可以在Prometheus配置文件填写需要拉取的服务器地址,也可以采用服务发现的方式。本文采用配置文件的方式。
对于业务服务器上的监控数据,我们也可以手动curl这个接口来获取,如:
curl -s -X GET http://127.0.0.1:9108/metrics
数据格式必须符合Prometheus定义的标准,由3部分组成,例如:
# HELP http_req_total The total number of HTTP requests.
# TYPE http_req_total counter
http_req_total{method="post"} 1027 1395066363000
Prometheus Release包提供工具promtool用于检查Exporter数据格式的合法性:
curl -s -X GET http://127.0.0.1:9108/metrics | ./promtool check metrics
这里为了统一监控数据的格式,借鉴腾讯QQ团队的监控告警Monitor系统的思路:
采用uint32格式的数字作为指标标识,每个指标标识ID都不相同。
(1)累计量(counter),如某个接口的请求量,成功量,超时量等
(2)瞬时量(gauge),如内存使用量,CPU使用率等
(1)API上报,这种方式需要在业务程序埋点,调用对应API进行上报(目前开发了C/C++、Go、Python的API包)
(2)脚本上报,这部分主要用于旁路监控,如抓取服务器基础信息,数据库运行状态等信息进行上报
Grafana是一个支持多数据源的图形化展示系统。Grafana后端实现了访问Prometheus的代理,配置好数据源后,我们只需要在Grafana视图上编写PromQL查询语句,即可配置指标可视化视图。Grafana组织视图的方式为:文件夹—> Dashboard —> Panel。
除了配置指标视图外,Grafana还具备配置指标告警,如对指标值的min()、max()、avg()等进行告警监控。告警的通知方式也有很多种,我们选择了webhook的方式,当告警发生时,发送一条HTTP请求到指定的地址,请求内容包含指标的相关信息。这样我们就可以灵活处理告警的后续行为,如发短信、发邮件等。
虽然Prometheus也有告警组件,但我们使用Grafana设置告警有如下优点:
除了视图展示和告警功能外,Grafana还具备视图分类(文件夹),用户登录,用户分组,用户权限(文件夹权限,视图权限,视图可读可写权限)等功能,更多使用方法可以查看Grafana官方文档。
虽然Grafana具备指标可视化展示和告警功能,但如果每个指标Panel都手工配置,会很繁琐。幸运的是,Grafana开放了HTTP API的功能,可以通过调用API来创建视图。官方文档对创建Dashboard的示例比较简单,没有一一说明参数,这里我根据使用经验梳理了必要的参数,写了一个视图注册脚本gen_dashboard.py。
使用gen_dashboard.py前,需要配置gen_dashboard.json:
然后定义好指标描述文件attr.desc(示例格式),作为参数传入脚本运行即可生成完整的监控告警视图。
前面我们提到告警采用的是Grafana的webhook方式,所以对应的我们需要有个后端服务moni-alert来接收和处理告警。这里我们采用及时有效的短信告警方式来通知负责人,使用前需要在alert.json配置腾讯云短信的AppId和AppKey以及负责人的手机号码。在attr.desc文件中,我们设置了每个指标的负责人列表,webhook告警会把告警负责人列表和告警信息发送到moni-alert, moni-alert从配置文件查找负责人手机号实现短信的发送。
根据经验,监控服务器或实例的数量在100台以内的话,我们可以把Prometheus、Grafana、指标&告警注册工具、moni-alert都部署到4C8G的服务器上。额外复制一份实现容灾。
以上就是基于时序数据库Prometheus和可视化工具Grafana快速构建监控告警系统的原理和实践过程。涉及的代码都在这个地址(传送门),欢迎一起讨论。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。