背景
首先说一些平常工做场景:前端
- 你的群里是否常常会发送一些巡检报告,好比qps峰值统计,cpu利用率,机器使用数量统计等等
- 你的领导是否须要你每周发送一次公司业务层级的运行报告,包括上周有没有故障,上周全部业务的qps峰值是多少,周期内的一些业务变动或者运营活动等。
因此你可能会看到相似这样的一些图:
shell
初步思考
基于上述的背景,咱们常规的实现方式有如下几种:后端
- 平常的巡检报告,咱们可能会用一个脚本按期的获取数据,而后发送到企业微信机器人、邮箱、钉钉等
- 周、月巡检报告运营报告这些,咱们可能须要手动建立一个md文件,写上一些数据,截上一些监控图,加上一部分解读和批注,最终发到群里给你们看。
那么基于上述的实现方式,咱们是否能够进一步的去考虑自动化
或者说是平台化
。好比是否能够设想一下:微信
- 把平常的报告、通知发送集中起来管理(目前多是一我的一个脚本,不知道跑在哪一个机器的定时任务上)
- 是否能够模板化,好比定制一些模板,而后拿着这个模板去渲染真实的数据,最终发送出来
- 还能够增长定时任务,好比针对这个模板,我想要按期发送,这样就更简单的托管起来咱们分部在各个机器上的定时脚本了
功能指望
针对上述的思考,咱们团队作了一些建设,目前一期建设想要产出一个稳定性运营平台
,这个平台目前的任务主要有如下几个:markdown
- 接管咱们当前的平常报告的功能(目前的报告都是自动化脚本实现,按期发送qps数据,带宽数据,网关数据等)
- 提供自定义模板功能,能快速定义想要的数据模板
- 能够实现监控图的发送(目前更多的是grafana的图片)
- 接管咱们当前每周的稳定性运营报告的工做,可自动渲染数据,可自定义标注,最终发送
终版报告
给到用户
- 历史数据的存储,目前监控平台会存储全量数据,这个平台只是想要存储一些特定数据或者叫作过滤后有效的数据
- 实现按期发送的功能,可配置定时任务
平台设计
首先这个平台分红了三个大的部分:前端
、后端接口
、定时任务端
框架
这里主要讲解一下非前端部分,首先功能模块分了几个大块:分布式
仪表盘模块 模板模块 变量注册模块 报告模块 数据存储模块 定时任务模块
仪表盘模块
这一块主要是总览展现的功能模块,包括整个平台有多少模板,有多少报告等。 这一快的功能放到二期了,一块儿暂时没作,不过有一个第一版的样子能够看看。阿里云
模板模块
模板模块和变量注册模块是相辅相成的。模板目前主要划分了几种类型:设计
模板类型 | 说明 |
---|---|
基础模板 | 基础模板主要提供接入能力,好比我定义好了域名QPS统计的能力,那么你只须要提供你的域名,我就能够帮你完成统计动做 |
开放模板/周期模板 | 这类模板就相对自由,你能够自定义模板内容,变量,最终定义定时任务来定时的渲染该模板,而后选择发送等 |
模板定义主要的原理就是:建立一个markdown主体内容,而后写上一些变量,最终这些变量都会被真实的值所替换。因此建立模板须要你重要的能力就是:会写markdown
。3d
建立模板大体长这样:
变量注册模块
变量注册主要是定义你在模板中设置的变量,好比这个变量的获取方式是什么样子的,获取的数据字段是哪一个。 对比变量的说明,主要划分了几种:内置变量
、模板变量
、图片变量
针对这三种变量有一个简单的说明:
变量类型 | 变量说明 | 提供信息 |
---|---|---|
内置变量 | 全部模板均可以使用的,能够理解为公共变量 | 提供获取地址 |
模板变量 | 属于模板特有的 | 提供获取地址 |
图片变量 | 专门下载grafana图片的 | 提供grafana地址 |
好比我举个例子:
我在模板中定义了一个变量`DATE`,那么我在变量注册的时候须要提供这些信息: 变量获取地址:https://abc.com/var/date 变量获取字段:data 等到真正渲染模板动做执行的时候,就会去请求这个地址,拿到返回数据中data字段的值来具体的替换个人`DATE`数据,来达到渲染的目标。
我在模板中定义了一个变量`QPS__TREND_IMG`,这个主要是一个图片变量,获取的数据就是一个域名在某段时间的qps趋势图,那他提供的信息就是: grafana地址:http://grafana.c.com/**** grafana的key:这个固然你能够放到服务端配置中去,也能够自定义,随意 等到真正渲染模板动做执行的时候,就会去请求这个下载这个grafana图片,而后上传到你本身的存储,好比阿里云的oss,华为云的obs,最终提供一个图片地址而后替换这个变量,达到渲染的目标。
报告模块
对于报告模块来说,就是咱们最终要发送和呈现的产物,那么咱们能够从几个维度来说解一下:报告如何产生
、报告产生的来源
、报告的状态
报告如何产生
报告产生的惟一入口就是经过模板,咱们能够在模板处选择对应的模板,而后建立报告,建立报告须要几个信息须要填写:
- 模板名称(选哪一个就用哪一个)
- 报告名称
- 时间范围(全部数据都依赖于时间范围,有了时间范围咱们才能产生数据,而后渲染报告)
报告产生的来源
关于报告的来源,平台的规划主要有两个,第一个是手动生成的报告
,第二个是定时任务产生的报告
报告的状态
针对报告,咱们须要有几种状态:未渲染
、渲染中
、待标注
、已发布
(NotRendered、RenderedIng、ToBeLabeled、Published)
数据存储模块
对于数据存储模块,咱们前面定义的是历史数据的存储,目前监控平台会存储全量数据,这个平台只是想要存储一些特定数据或者叫作过滤后有效的数据
。
举个例子,当前咱们平台存储的数据有哪些:
1.qps峰值数据(咱们监控存的是5s一个点的qps数据,不过该平台会每小时取一次时间段内的峰值qps做为存储) 2.snat峰值数据(对于nat网关,咱们也是采用相似的方式,存储过去一小时的峰值数据) 3.带宽峰值数据 4.弹性机器峰值数据(目前k8s集群的机器是弹性的,因此会存储每一小时的峰值数据)
当咱们有了这些数据,咱们能作的就比较多了,好比:
- 咱们基础的监控数据在获取大范围时间内的数据,都是对峰值等数据作了聚合,因此会低于真实峰值,有了每小时的峰值数据,能准确的描绘业务峰值。
- 当咱们须要周报、月报、年报的时候,咱们均可以对这些峰值数据作一些处理和分析
- 从必定角度上讲,咱们能够分析峰值的走势,来辅助业务作一些判断,好比业务的峰值时间愈来愈晚,是否是说明用户睡的愈来愈晚呢?
定时任务模块
定时任务,毋庸置疑,他承担着控制咱们报告的发送时间和频率。好比我在平台能够针对模板建立一个定时任务:什么时间、哪一个模板、发送到哪里。
目前咱们使用的定时任务是对接开源的分布式定时任务框架xxl-job
,二开了一些定时任务接口给到平台使用。
那么须要了解的主要可能有几点:
1.定时任务的发送地方:目前支持发送到企业微信应用、企业微信机器人 2.定时任务的发送频率:主要取决你定时任务表达式的书写
最后说一句
对于这个平台来讲,其实总体功能不难,不过我的感受能接管很多分散的服务和脚本,也使得趋于统一化。 不过弊端也有,说实话当前的功能还比较单一,后续拓展有,可是尚未想好,因此对于单一的功能平台化,就是有点太卷了。