前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于时序数据库的监控告警系统搭建实践

基于时序数据库的监控告警系统搭建实践

原创
作者头像
JimmyDeng
修改2019-07-05 18:57:07
3.6K0
修改2019-07-05 18:57:07
举报
文章被收录于专栏:云架构分享云架构分享

随着云计算技术的广泛应用,越来越多的项目部署和迁移到云端,传统的监控告警系统在短时间内还不能适配云上的服务。为了实现实时系统运行状态的展示、故障的及时告警、历史状态的回看,可以基于开源的时序数据库Prometheus和可视化工具Grafana,搭配相关工具,快速搭建一个可靠准确的监控告警系统。本文记录了整个设计和搭建过程,以及遇到的一些问题和解决方法。

1. 总体架构

总架构图
总架构图

2. 时序数据库

时序数据库(Time Series Database)是一种为了处理时间序列数据而特别优化的数据库,区别于传统的关系型数据库,时序数据库以时间为主索引,特别适合于按照时间顺序变化数据的存储和检索。它主要有以下几个特点:

  • 存储的数据都有时间属性,随着时间顺序写入
  • 写多读少,数据量大,且一般不支持数据的更新
  • 数据顺序读、区间范围读
DB-Engines时序数据库排名
DB-Engines时序数据库排名

DB-Engines统计了目前流行的时序数据库,在本实践中,我们选取了Prometheus作为整个监控系统的底层时序数据存储。Prometheus是由SoundCloud开源的监控告警专用时序数据库,目前Github上已有24k+的star,已经被许多公司运用到项目的监控当中。

Prometheus主要特性如下:

  • 多维数据模型,一个监控项可以添加多个标签(Label),并支持索引查询
  • 灵活的查询语句(PromQL数据查询语言)
  • 采用HTTP协议,使用Pull模式拉取被监控对象的数据
  • 监控目标,可以采用服务发现或者静态配置的方式

这里举例一个Prometheus的监控项来说明数据的格式:

Prometheus监控项格式
Prometheus监控项格式
  • Metric: 指标(监控项),需保证唯一,如http总请求数。
  • Label: 标签,一系列的key-value对,可用于对指标的细分过滤。
  • Value: 监控值,类型为float64
  • Timestamp: Unix时间戳,单位为毫秒

3. 监控数据上报器(moni-exporter)

监控数据上报器(moni-exporter)是定制开发的一个HTTP服务器,部署在所有业务服务器上,主要负责收集共享内存(shm)的监控数据,把收集的数据转化为Prometheus规定的监控数据格式。Prometheus会间隔一定的时间(配置为1分钟)访问该接口获取监控数据并集中保存。由于是Prometheus主动Pull模式,简单的方式可以在Prometheus配置文件填写需要拉取的服务器地址,也可以采用服务发现的方式。本文采用配置文件的方式。

对于业务服务器上的监控数据,我们也可以手动curl这个接口来获取,如:

代码语言:txt
复制
curl -s -X GET http://127.0.0.1:9108/metrics

数据格式必须符合Prometheus定义的标准,由3部分组成,例如:

代码语言:txt
复制
# 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数据格式的合法性:

代码语言:txt
复制
curl -s -X GET http://127.0.0.1:9108/metrics | ./promtool check metrics

这里为了统一监控数据的格式,借鉴腾讯QQ团队的监控告警Monitor系统的思路:

  • 指标标识:

    采用uint32格式的数字作为指标标识,每个指标标识ID都不相同。

  • 指标分类:按照实际使用场景,指标分成2类:

(1)累计量(counter),如某个接口的请求量,成功量,超时量等

(2)瞬时量(gauge),如内存使用量,CPU使用率等

  • 指标上报

(1)API上报,这种方式需要在业务程序埋点,调用对应API进行上报(目前开发了C/C++、Go、Python的API包)

(2)脚本上报,这部分主要用于旁路监控,如抓取服务器基础信息,数据库运行状态等信息进行上报

4. 图形化展示(Grafana)

Grafana是一个支持多数据源的图形化展示系统。Grafana后端实现了访问Prometheus的代理,配置好数据源后,我们只需要在Grafana视图上编写PromQL查询语句,即可配置指标可视化视图。Grafana组织视图的方式为:文件夹—> Dashboard —> Panel。

Grafana指标面板编写PromQL查询语句
Grafana指标面板编写PromQL查询语句

除了配置指标视图外,Grafana还具备配置指标告警,如对指标值的min()、max()、avg()等进行告警监控。告警的通知方式也有很多种,我们选择了webhook的方式,当告警发生时,发送一条HTTP请求到指定的地址,请求内容包含指标的相关信息。这样我们就可以灵活处理告警的后续行为,如发短信、发邮件等。

Grafana告警模式配置
Grafana告警模式配置

虽然Prometheus也有告警组件,但我们使用Grafana设置告警有如下优点:

  • 在Grafana设置告警,告警的阈值线、发生告警的提示都可以在图形上展示,比较直观。
  • 在配置指标视图的时候,只要配置Grafana的配置即可,不需要另外再配置Prometheus。
Grafana指标面板告警图
Grafana指标面板告警图

除了视图展示和告警功能外,Grafana还具备视图分类(文件夹),用户登录,用户分组,用户权限(文件夹权限,视图权限,视图可读可写权限)等功能,更多使用方法可以查看Grafana官方文档

5. 指标&告警注册工具

虽然Grafana具备指标可视化展示和告警功能,但如果每个指标Panel都手工配置,会很繁琐。幸运的是,Grafana开放了HTTP API的功能,可以通过调用API来创建视图。官方文档对创建Dashboard的示例比较简单,没有一一说明参数,这里我根据使用经验梳理了必要的参数,写了一个视图注册脚本gen_dashboard.py

使用gen_dashboard.py前,需要配置gen_dashboard.json:

  • Grafana的后端服务地址
  • Grafana的HTTP API Key,需要在Grafana Web页预先设置好
  • Grafana数据源名称

然后定义好指标描述文件attr.desc(示例格式),作为参数传入脚本运行即可生成完整的监控告警视图。

Dashboard(视图)样例图
Dashboard(视图)样例图

6. 告警(moni-alert)

前面我们提到告警采用的是Grafana的webhook方式,所以对应的我们需要有个后端服务moni-alert来接收和处理告警。这里我们采用及时有效的短信告警方式来通知负责人,使用前需要在alert.json配置腾讯云短信的AppId和AppKey以及负责人的手机号码。在attr.desc文件中,我们设置了每个指标的负责人列表,webhook告警会把告警负责人列表和告警信息发送到moni-alert, moni-alert从配置文件查找负责人手机号实现短信的发送。

7. 部署

根据经验,监控服务器或实例的数量在100台以内的话,我们可以把Prometheus、Grafana、指标&告警注册工具、moni-alert都部署到4C8G的服务器上。额外复制一份实现容灾。

8. 总结

以上就是基于时序数据库Prometheus和可视化工具Grafana快速构建监控告警系统的原理和实践过程。涉及的代码都在这个地址(传送门),欢迎一起讨论。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 总体架构
  • 2. 时序数据库
  • 3. 监控数据上报器(moni-exporter)
  • 4. 图形化展示(Grafana)
  • 5. 指标&告警注册工具
  • 6. 告警(moni-alert)
  • 7. 部署
  • 8. 总结
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档