- 本书赞誉
- 前言
- 第一部分 基础篇
- 第1章 系统基础信息模块详解
- 第2章 业务服务监控详解
- 第3章 定制业务质量报表详解
- 第4章 Python 与系统安全
- 第二部分 高级篇
- 第5章 系统批量运维管理器 pexpect 详解
- 第6章 系统批量运维管理器 paramiko 详解
- 第7章 系统批量运维管理器Fabric详解
- 第8章 从零开发一个轻量级 WebServer
- 第9章 集中化管理平台 Ansible 详解
- 第10章 集中化管理平台 Saltstack 详解
- 第11章 统一网络控制器 Func 详解
- 第12章 Python 大数据应用详解
- 第三部分 案例篇
- 第13章 从零开始打造 B/S 自动化运维平台
- 第14章 打造 Linux 系统安全审计功能
- 第15章 构建分布式质量监控平台
- 第16章 构建桌面版 C/S 自动化运维平台
15.5 服务器端功能设计
服务器端以Web的形式作为服务平台,以Django作为开发框架,结合rrdtool模块实现了业务添加(rrdtool create)、报表绘图(rrdtool graph)等功能。另外,项目改用直接操作SQL方式来代替Django的ORM,为熟悉SQL的人员提供另一种选择。下面详细介绍项目配置及功能实现方法。
15.5.1 Django配置
作为一个新Django项目,第一步需要创建一个项目,操作如下:
# cd /data/www # django-admin.py startproject Servermonitor
在创建的omaudit目录中修改urls.py,添加App的URL映射规则,内容如下:
from django.conf.urls.defaults import * urlpatterns = patterns('webmonitor.views', (r'^$','index'), #映射到index方法,实现前端首页渲染 (r'add_do/','adddo'), #映射到adddo方法,实现新增业务提交服务器端处理 (r'add/','add'), #映射到add方法,实现新增业务页面渲染 (r'monitorlist/','monitorlist'), #映射到monitorlist方法,实现前端扫描记录列表展示 )
修改项目settings.py,关键配置项如下:
import os BASE_DIR = os.path.dirname(os.path.abspath(__file__)) SYSTEM_NAME="分布式质量监控平台 V1.0" #定义系统名称 IDC={'ct':'电信','cnc':'联通','cmcc':'移动'} #定义采集IDC RRDPATH=BASE_DIR+"/rrd" #rrdtool rrd文件存储路径 PNGPATH=BASE_DIR+"/site_media/rrdtool" #rrdtool 生成png存储路径 #定义webmonitor app路径,调用graphrrd.sh用rrd绘图相关参数 MAINAPPPATH=BASE_DIR+"/webmonitor" # TIME_ALARM=1 #定义“业务请求响应时间统计”图表告警线阈值(HRULE),单位为秒 TIME_YMAX=1 #定义“业务请求响应时间统计”图表Y轴最大值,单位为秒 DOWN_APEED_YMAX=8388608 #定义“业务下载速度统计”图表Y轴最大值,单位为字节
项目包括两个App,其中,webmonitor为功能应用,publicclass用于提供公共方法调用。以下结合具体功能对两个App进行介绍。
15.5.2 业务增加功能
业务增加模块后台实现了两个功能点:一为将业务信息写入MySQL数据库,包括业务名称、监控URL、告警通知方式、探测点及规则等;二为创建所选择的探测点三个图表对应的rrdtool文件,图表包括业务请求响应时间统计、业务下载速度、业务可用性统计。前端功能截图如图15-4所示。
图15-4 前端功能截图
创建rrd文件功能利用了rrdtool模块的create方法实现,实现源码如下:
""" =创建rrd -create_rrd(url) """ def create_rrd(url): URL=url domain=GetURLdomain(url) #调用GetURLdomain方法获取URL域名部分 HID=[] cur_time=str(int(time.time)) #获取当前Linux时间戳,作为rrdool.create方法的start参数值 HID=getID(URL) #调用getID方法获取URL对应的所有采集点ID for id in HID: #遍历采集点ID try: #参数指定rrd文件路径,如“项目根目录/rrd/www.baidu.com/17_time.rrd”; # step指定步长,设置为300秒,即每隔5分钟收到一个值;start指定第一条记录的起 #始时间,使用cur_time变量指定 rrd_time=rrdtool.create(settings.RRDPATH+'/'+str(domain)+'/'+str(id)+ \ '_time.rrd','--step','300','--start',cur_time, 'DS:NAMELOOKUP_TIME:GAUGE:600:0:U', #定义数据5个数据源(DS) 'DS:CONNECT_TIME:GAUGE:600:0:U', #GAUGE计量类型,收到数据后 #直接存入RRD; 'DS:PRETRANSFER_TIME:GAUGE:600:0:U', #‘600’为心跳值,即两 #个刻度无效时,使用 'DS:STARTTRANSFER_TIME:GAUGE:600:0:U', #UNKNOWN填充;0:U #输入数据的界限 'DS:TOTAL_TIME:GAUGE:600:0:U', 'RRA:AVERAGE:0.5:1:600', #定义数据存放格式(RRA),分别为平均、 #最大、最小合并数据 'RRA:AVERAGE:0.5:6:700', #方式,其他参数说明可参考3.2节案例 #源码说明 'RRA:AVERAGE:0.5:24:775', 'RRA:AVERAGE:0.5:288:797', 'RRA:MAX:0.5:1:600', 'RRA:MAX:0.5:6:700', 'RRA:MAX:0.5:24:775', 'RRA:MAX:0.5:444:797', 'RRA:MIN:0.5:1:600', 'RRA:MIN:0.5:6:700', 'RRA:MIN:0.5:24:775', 'RRA:MIN:0.5:444:797') if rrd_time: logging.error(rrdtool.error) (其他两张图表rrdtool.create方法类似,此处省略) except Exception,e: logging.error('create rrd error!'+str(e))
针对“www.baidu.com”业务增加成功后,执行“#ll rrd/www.baidu.com”,输出已生成的rrd文件清单,见图15-5。前缀“17_、18_”代表不同运营商探测点ID。对采集端而言,一个运营商被视为一个独立业务,产生的数据也是独立的。比如,在增加业务时选择了电信、联通两个运营商探测点,对该业务做数据采集时,将产生两份数据。
图15-5 生成不同运营商的rrd数据文件
15.5.3 业务报表功能
分布式质量监控平台提供了非常丰富的报表功能,常规报表包括最近3小时、当天、当前月、当前年;自定义报表根据选择的时间范围定制。在页面中提交前保持起始时间与结束时间为空则为常规报表,最新3小时报表具体见图15-6。
图15-6 输出业务“当前(最新3小时)”报表
自定义报表根据选择的时间范围进行rrdtool查询,结果如图15-7所示。
图15-7 输出自定义时间报表
两种报表实现原理是通过定制graph方法的“--start”参数来实现,如常规报表中当前、日、月、年图表对应分别为“-3h、-1day、-1month、-1year”,参数“--end”为当前时间;自定义报表采用提交的起始时间与结束时间来对应“--start”与“--end”参数。平台rrdtool graph生成图表时要求有中文支持,但Python的rrdtool模块没有封装“--font”参数,为了解决此问题,最终采用原生rrdtool命令行方案,在Django中视图中通过os.system方法来调用,实现关键代码如下:
【/data/www/Servermonitor/webmonitor/graphrrd.sh】
#!/bin/sh rrdfile=$1 #接收rrdtool文件路径 pngfile=$2 #接收生成png图片路径 rrdtype=$3 #接收rrd类别,区分定义的三种图表 appname=$4 #接收业务名称 GraphStart=$5 #接收rrdtool起始时间 GraphEnd=$6 #接收rrdtool结束时间 ymax=$7 #接收Y轴最大值 Alarm=$8 #接收告警红线值 #定义两种字体 rrdtool_font_msyhbd="/data/www/Servermonitor/site_media/font/msyhbd.ttf" rrdtool_font_msyh="/data/www/Servermonitor/site_media/font/msyh.ttf" if [ "$rrdtype" == "time" ]; then /usr/local/rrdtool/bin/rrdtool graph ${pngfile} -w 500 -h 207 \ -n TITLE:9:${rrdtool_font_msyhbd} \ #定义标题字体 -n UNIT:8:${rrdtool_font_msyh} \ #定义Y轴单位字体 -n LEGEND:8:${rrdtool_font_msyh} \ #定义图例字体 -n AXIS:8:${rrdtool_font_msyh} \ #定义坐标轴字体 -c SHADEA#808080 \ #左上边框颜色 -c SHADEB#808080 \ #右上边框颜色 -c FRAME#006600 \ #数据标记说明边框颜色 -c ARROW#FF0000 \ #X、Y轴箭头颜色 -c AXIS#000000 \ #X、Y轴线颜色 -c FONT#000000 \ #图形所有字体颜色 -c CANVAS#eeffff \ #图形数据区域背景颜色 -c BACK#ffffff \ #图形背景(不含数据区域) 颜色 --title "业务请求响应时间统计-${appname}" -v "速度 (秒)" \ #图表标题 --start ${GraphStart} \ #图表起始时间 --end ${GraphEnd} \ #图表结束时间 --lower-limit=0 \ #限制 Y 轴的下限 --base=1024 \ #修改1k对应的刻度,默认为1000 -u ${ymax} -r \ #定义Y轴最大值 DEF:NAMELOOKUP_TIME=${rrdfile}:NAMELOOKUP_TIME:AVERAGE \ #定义数据源及合并统计 #类型为AVERAGE DEF:CONNECT_TIME=${rrdfile}:CONNECT_TIME:AVERAGE \ DEF:PRETRANSFER_TIME=${rrdfile}:PRETRANSFER_TIME:AVERAGE \ DEF:STARTTRANSFER_TIME=${rrdfile}:STARTTRANSFER_TIME:AVERAGE \ DEF:TOTAL_TIME=${rrdfile}:TOTAL_TIME:AVERAGE \ COMMENT:" \n" \ AREA:TOTAL_TIME#0011ff:总共时间 \ #用“方块”的形式来绘制“总共时间”数据 #GPRINT定义图表下方的文字说明,参数TOTAL_TIME定义数据来源变量;LAST定义合并(统计)类型, #指显示当前值; #其他部分为输出的文字及数值格式 GPRINT:TOTAL_TIME:LAST:"当前\:%0.2lf %Ss" \ GPRINT:TOTAL_TIME:AVERAGE:"平均\:%0.2lf %Ss" \ GPRINT:TOTAL_TIME:MAX:"最大\:%0.2lf %Ss" \ GPRINT:TOTAL_TIME:MIN:"最小\:%0.2lf %Ss" \ COMMENT:" \n" \ LINE1:NAMELOOKUP_TIME#eeee00:域名解析 \ #用“线条”的形式来绘制“域名解析”数据 GPRINT:NAMELOOKUP_TIME:LAST:"当前\:%0.2lf %Ss" \ GPRINT:NAMELOOKUP_TIME:AVERAGE:"平均\:%0.2lf %Ss" \ GPRINT:NAMELOOKUP_TIME:MAX:"最大\:%0.2lf %Ss" \ GPRINT:NAMELOOKUP_TIME:MIN:"最小\:%0.2lf %Ss" \ COMMENT:" \n" \ (“连接时间”、“开始传输”、“第一字节”定义与“域名解析”,此处省略) HRULE:${Alarm}#ff0000:"(告警值)" \ #输出告警红线值 COMMENT:" \n" \ COMMENT:" \n" \ COMMENT:"\t\t\t\t\t\t\t\t\t\t最后更新 \:$(date '+%Y-%m-%d %H\:%M')\n" (其他两张图表rrdtool graph参数类似,此处省略)
生成的图表png文件在前端页面中进行引用:
#下面为渲染后的HTML标签 <img src="/site_media/rrdtool/www.baidu.com/15_time.png?,Math.random;" width="597" />
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论