基于开源框架 Flask 的运维监控系统的设计
燕飞宇 王晓明
(渤海大学 信息科学与技术学院,辽宁 锦州 121000)
摘 要:笔者开发一个基于开源框架的运维监控平台的设计过程。该系统采用轻量级的 Web 服务器 mod_wsgi(Apache),
其后端实现建议采用基于 Python 语言的 Flask 开源 Web 框架,进而增强扩展性。数据库建议采用轻量级关系型数据库
Sqlite3,前端页面使用 Bootstrap 框架。平台面向公司或组织的运维管理人员,提供服务器数据记录、动态监视报警、
可视化操作、数据实时展现等功能,目的在于降低运维工作复杂度,满足运维开发(DevOps)人员需求。
关键词:运维开发;DevOps;Python;Flask;Sqlite3
中图分类号:TN943.6 文献标识码:A 文章编号:1003-9767(2016)20-113-03
1 概述
随着运维 2.0 时代的到来,技术运维正在逐渐转变升级
为服务运维,向公司提供专业服务。DevOps 在实际操作中,
其实际操作方法和项目管理的手段是什么样的即具体情况,
几乎无人能有一个完美的答案。DevOps 在最初是让开发、
运维、QA 之间加强沟通,通过不同的工具来消除隔阂。而
隔阂的形成有两个原因,一是信息不对称,部分研发可能无
法获取到运维的数据或者只能获取运维的部分数据而存在盲
点,同时运维无法解读代码的错误信息;二是不同的组织、
集体和个人所秉持观点不同,这直接导致了不同部门之间的
目标有差异。而 DevOps 是倡导大家一起来面对问题、共同
解决问题。实现开发环境和部署环境的快速迁移,帮助产品
快速上线。监控工具越来越多,明确负载问题是计算资源不
足的问题,还是代码质量的问题。
该文旨在简要描述如何根据需求设计一款系统监控平
台,并通过该监控平台实现监控操作系统、数据库和中间件
具体的运行情况,实现基于指标判断不同的情况启动报警,
对数据集中展现和管理。
2 系统设计
2.1 设计思路
该运维监控平台采用 C/S 和 B/S 模式,被监控端通过使
用探针将数据上传至服务器,服务器将收到的数据进行分析
处理和备份;浏览器端将服务器端整合过的数据和分析结果
台服务流程主要包括探针采集数据、数据分析、数据可视化、
设置报警规则、监控报警等。这些模块彼此相互联系,组成
功能强大的监控系统,实现对操作系统、数据库、中间件等
服务和模块的性能监控和应急响应处理。
2.2 开发平台
根据功能需求,平台采用 Flask 框架进行开发。Flask 是
一个用 Python 语言编写的轻量级 Web 应用框架,WSGI 组件
采用 Werkzeug,模板渲染引擎采用 Jinja2。数据库服务使用
Mongo DB 数据库。Mongo DB 是一个基于分布式文件存储
的数据库,由 C++ 语言编写,旨在为 Web 应用提供可扩展
的高性能数据存储解决方案。Mongo DB 是一个介于关系数
据库和非关系数据库之间的产品,是非关系数据库当中功能
最丰富、最像关系数据库的数据库。由于探针采集数据庞大,
数据交换频繁,故选择最像关系型数据库的 Mongo DB。
2.3 数据表的设计
根据功能,设计数据表如下。
User 数据表用来存储管理员和用户的信息,同时起到划
定部门职能等作用。该数据表的字段主要有:(1)_id 域用
来存储管理员用户的唯一性标识符,其在该数据表中根据记
录的不同而不同,同时以自增的形式存在以便唯一地显示用
户信息;(2)group 域用来记录管理员或者用户所在的用户
级别组,在具体的应用中可以有针对性地为不同的用户设计
不同的级别和小组,再通过该字段予以显示;(3)profile
进行拉取,并将其可视化展现给运维管理人员。性能监控平
用来保存管理员的个人详细信息(如姓名、部门、头像等),
作者简介:燕飞宇(1995-),男,辽宁辽中人,本科在读。研究方向:计算机软件开发。
— 113 —
2016年信息与电脑10下-正文.indd 113
2017/2/4 17:00:23
2016年第20期信息与电脑China Computer&Communication软件开发与应用
在 group 的基础上进一步明确管理员或者用户的信息;(4)
last_seen 用于记录管理员或者用户最后一次登录的时间,便
于追查管理员和用户对系统信息的获取的同时也能在一定程
度上保证行为安全。
Instance 集合用于存储所有被监控的实例机探针取回的
海量采样数据,实例包括但不限于操作系统、中间件、数据
库服务。该数据表的字段主要包括:(1)_id 用来存储被监
控实例的唯一性标识符,用以区别不同的被监控实例;(2)
owner_group[] 列表用于存放所属的管理员组,并且一个实
例可以被多个管理员组所控制;(3)Data 子集用来存放与
实例相关的所有探针发回来的数据记录,其中可以包括 cpu_
percent(通过百分比的形式以数字方式来反映 CPU 使用率
的信息)、lavg1(表示每分钟的 Load Average)、lavg5(按
照 5 分钟的时间段来显示出来的平均值)、lavg15、ip[](实
例有多个 IP 地址,故用列表数据类型来存储)、net_speed_
r(描述网络数据包的下行速率)、net_speed_t(描述网络数
据包的上行速率)、time(反应数据集的采样时间戳)。
Dashboard 表用于存放仪表盘展示页面上的仪表盘组件
配置信息,包括字段有:(1)instance_id 作为与仪表盘绑定
的数据源实例的唯一性标识符,用于区别于仪表盘绑定的不
同的数据源实例;(2)title 用来表示仪表盘的大标题,并且
通过大标题显示内容的大致方向等;(3)module 标记要显
示的数据的来源模块,以便区别来自于不同来源的数据以及
信息等。
Event 表存放着一切发生的事件,如探针信号捕获与丢
失,警报出发时的状态等。其包括字段有:(1)_id 为事件
的唯一编号,不同的事件记录拥有不同值,同时该字段也是
该数据表中任何一条字段所不可或缺的信息和记录;(2)
level、title、content 三个字段分别表示为触发的事件的安全
等级、事件的大标题、事件的详细报告(包含报警触发规则
以及触发时实例的状态信息),从不同的角度来描述事件的
发生、发展等;(3)created_at 域记录事件第一次触发时的
时间戳,实质记录了对应事件发生第一次发生的时间;(4)
updated_at 对某些特殊事件,随着事件的重复发生相应的刷
新重复触发时间。
Strategy 集合用于记录运维人员自定义的报警规则。主
要包括:(1)_id 为警报策略的唯一性标识符,用以区别
不同的报警策略的标志;(2)instance_id 子集标记了警报
所针对的所有实例编号,区别警报同时根据不同的实例做出
记载;(3)is_enable 为 Boolean 数据类型,标记警报策略
规则的开启 / 关闭状态,其值为整数型数据类型,单数表示
True,双数表示 False;(4)域 module 标记所要监控的模
块,condition 存储警报触发条件,合法的数据如 lt(小于)、
gt(大于)、gte(大于等于)、lte(小于等于)、ne(不等
于)等条件标志;(5)standard 域标记着数据阈值,这样根
据采样得到的数据通过 condition 和 standard 来比较就能定制
触发规则;(6)created_at 记录规则被管理员创建的时间戳,
created_by 记录创建该规则的管理员用户编号,这两个直接
记录对应管理员针对此操作的实际行为信息。
需要注意的一点是由于 Mongo DB 不方便直接实现对
Boolean 类 型 数 据 的 控 制, 故 is_enable 列 需 要 用 单 双 数 来
判断规则开启情况,进行切换操作只需要使用 MongoDB 的
API 将 is_enable 加 1 即可进行下一步的操作。
2.4 功能设计
2.4.1 RESTFUL API 设计
这个方面的设计涉及的内容主要有以下几方面。(1)
向 实 例插入采集数据记录的口:http://example.com/rest/add_
data,post 递交的数据格式为 JSON 文件格式,结构如数据
集合 instance 中的 data 域;(2)实例信号请求注册的接口:
http://example.com/rest/add_info;(3)拉取实例最近 n 条数据
的接口:http://example.com/rest/get_latest_data/instance_id;(4)
拉取实例最近 N 个小时的数据的接口:http://example.com/rest/
get_data_by_timedelta/instance_id;(5)拉取实例配置信息的
接口:http://example.com/rest/get_info/instance_id。
2.4.2 实例信息概览
该页面展现各个监控实例的基本信息,如服务器实例的
CPU 使用率、IOWait 和 LOAD15 等基础指标,数据每秒进
行一次更新。其页面显示可以以黑色为主要的色调,同时界
面上的字体以白色线条显示以示差别,便于管理员和用户在
实际操作中能够看清楚。并且以内容的概括性说法为大标题,
例如“实例”,而细小的内容部分可以通过小一些的字来显
示,显示的内容可以使用实例的名字、状态、CPU 使用百分
率、IOWait、LOAD15、平台服务等来表示具体的信息含义,
再将信息的内容与含义一一对应地显示出来,以便管理员或
者用户能够获得对应的信息。
2.4.3 自定义仪表盘
随着现在业务的复杂化,一个应用很可能会在多台服务
— 114 —
2016年信息与电脑10下-正文.indd 114
2017/2/4 17:00:23
2016年第20期信息与电脑China Computer&Communication软件开发与应用
器上部署,故而需要同时监控多台服务器,如果只需要看某
高工作效率,建立一套系统科学的运维监控体系是路网平台
一台服务器的某项指标,可以使用仪表盘。用户可以在仪表
集中运维模式下实现精细化管理的基础,也是系统运维监控
盘页面自定义多个数据指标图表,支持任意时间段数据查询,
默认显示最近 30 分钟内的数据,用户可以自定义具体时间段。
2.4.4 报警策略
引入各种服务的报警事件,也可以针对自身的主机监控
和平台服务监控,管理报警事件。当 CPU 利用率过高,或者
第三方 API 的可用性达到某个触底阈值时,则会触发报警条
件,发出警报,并且通过邮件、短信等多种渠道,流转到具
体的承责人员身上。
的最终目标。
本文的研究仅仅是一种建议,实质上为众多运维监控
系统设计中的一小部分,其描述了一个基于开源框架的运维
监控平台的设计过程。系统采用轻量级的 Web 服务器 mod_
wsgi(Apache),后端实现采用基于 Python 语言的 Flask 开
源 Web 框架,进而获得扩展性良好的优势,数据库采用轻量
级关系型数据库 Sqlite3,前端页面使用 Bootstrap 框架。然
而本文所讨论的内容局限在设计过程,对具体实现如何编码、
在具体报警策略的显示中,按照与“实例信息浏览”页
编码过程中应该使用的具体技术等并没有加以讨论,有待日
面类似的方式通过黑色的背景白色的字和内容来突出显示相
后完善。
关信息,而对于按钮可以采用的色彩则以灰色和红色两种并
且加以区分。内容采用状态、名称、创建人、指标、TAGS、
参考文献
最后触发值、最后触发时间等,以便能够描述清晰对应的策
[1] 李淑娟 , 赵泽宇 , 宓泳 . 信息化校园应用的运维监控
略,具体的信息和参数等则依然采用“实例信息描述”类似
的方式与状态、名称、创建人、指标、TAGS、最后触发值、
保障研究 [J]. 实验技术与管理 ,2008(8):11-14.
[2] 王桂叔 . 基于 ITIL 的运维监控智能管理平台建设与
最后触发时间几种表示含义的一一对应再显示出来,以便管
应用 [J]. 软件产业与工程 ,2014(1):39-42.
理员或者用户获悉信息。
3 结 语
性能监控的意义在于让运维变得高效、智能。团队沟通、
协作的根本目的也在于通过一切方式提高效率。该自动化监
视平台帮助大家一起来面对问题、解决问题,通过可视化图
表及报警功能及时发现性能问题。
然而系统运维从来都没有一劳永逸的解决方案。立足于
业务需求,制定出属于自己的一套方案,为其他所有业务系
统提供一个最为坚实的基础,降低管理人员的工作强度,提
[3] 雷晓萍 , 马君 , 苏蔚 . 信息运维监控一体化平台的自
主研发与应用 [J]. 信息技术与信息化 ,2015(4):214-216.
[4] 马锐 . 基于监控平台的信息化运维管理平台设计 [J].
信息网络安全 ,2013(10):161-163.
[5] 管东升 , 李俊安 . 信息化大运维监控管理平台的方案
探讨 [J]. 信息系统工程 ,2013(4):113-117.
[6] 何世有 . 基于业务数据研究的证券运维监控系统 [J].
中国科技信息 ,2014(15):143-146.
— 115 —
2016年信息与电脑10下-正文.indd 115
2017/2/4 17:00:23
2016年第20期信息与电脑China Computer&Communication软件开发与应用