- 本书赞誉
- 前言
- 第一部分 基础篇
- 第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.4 系统环境部署
15.4.1 系统环境说明
前面介绍了分布式质量监控平台的三种角色,为了便于读者理解,下面对不同角色的环境、实现方法进行详细说明,环境设备角色表如表15-1所示。
表15-1 系统环境说明表
15.4.2 数据采集角色
数据采集功能角色需要完成两个任务:一为采集远程业务服务集群HTTP响应数据,并将数据写入远程MySQL数据库;二为提供异常HTTP响应告警支持。本示例部署192.168.1.20、192.168.1.21主机,分别模拟电信与联通网络。下面详细说明。
数据采集端只有两个Python文件,一个为config.py,其定义了数据库信息、运营商网络代码、连接超时时间等,内容如下:
【/data/detector/config.py】
# -*- coding: utf-8 -*- #定义MySQL数据信息 DBNAME='WebMonitor' DBUSER='webmonitor_user' DBPASSWORD='SKJDH3745tgDTS' DBHOST='192.168.1.10' # 修改成探测运营商网络代码(重要) # settings.py 中定义IDC={'ct':'电信','cnc':'联通','cmcc':'移动'} # “ct”代表电信探测点网络,联通网络修改成“cnc”,移动网络修改成“cmcc”,其他类似 IDC="ct" #连接的等待时间 CONNECTTIMEOUT = 5 #请求超时时间 TIMEOUT = 10 #告警邮件地址 MAILTO="user1@domain.com,user2@domain.com" #告警手机号 MOBILETO="136****3463"
另一个为提供业务服务质量采集功能的runmonitor.py,采用了pycurl模块实现,通过定义setopt方法定量参数,模拟一个HTTP请求器(request),也可以理解成一个简单的浏览器。再通过getinfo定义的定量获取HTTP返回结果(response),采集的数据将即时入库,异常响应将触发告警,关键代码如下:
【/data/detector/runmonitor.py】
…… Curlobj = pycurl.Curl #创建Curl对象 Curlobj.setopt(Curlobj.URL, url) #定义请求的URL #定义setopt请求器常量,各参数详细说明见2.4节 Curlobj.setopt(Curlobj.CONNECTTIMEOUT, CONNECTTIMEOUT) Curlobj.setopt(Curlobj.TIMEOUT, TIMEOUT) Curlobj.setopt(Curlobj.NOPROGRESS, 0) Curlobj.setopt(Curlobj.FOLLOWLOCATION, 1) Curlobj.setopt(Curlobj.MAXREDIRS, 5) Curlobj.setopt(Curlobj.OPT_FILETIME, 1) Curlobj.setopt(Curlobj.NOPROGRESS, 1) bodyfile = open(os.path.dirname(os.path.realpath(__file__))+"/_body", "wb") Curlobj.setopt(Curlobj.WRITEDATA, bodyfile) Curlobj.perform bodyfile.close #定义getinfo响应返回常量,各参数详细说明见2.4节 self.NAMELOOKUP_TIME=Decimal(str(round(Curlobj.getinfo(Curlobj.NAMELOOKUP_TIME), 2))) self.CONNECT_TIME=Decimal(str(round(Curlobj.getinfo(Curlobj.CONNECT_TIME),2))) self.PRETRANSFER_TIME=Decimal(str(round(Curlobj.getinfo(Curlobj.PRETRANSFER_TIME),2))) self.STARTTRANSFER_TIME=Decimal(str(round(Curlobj.getinfo(Curlobj.STARTTRANSFER_TIME),2))) self.TOTAL_TIME = Decimal(str(round(Curlobj.getinfo(Curlobj.TOTAL_TIME),2))) self.HTTP_CODE = Curlobj.getinfo(Curlobj.HTTP_CODE) ……
最后,配置系统crontab,5分钟作一次数据采集,内容如下:
*/5 * * * * /usr/bin/python /data/detector/runmonitor.py > /dev/null 2>&1
15.4.3 rrdtool作业
rrdtool作业实现从MySQL导出数据并更新到rrdtool中,以便为后面的rrdtool报表功能提供数据支持。具体方法是通过查询webmonitor_monitordata表字段MARK为'0'的记录,再将数据通过rrdtool.updatev方法做rrdtool更新,最后更新数据库标志MARK为'1'。rrdtool作业部署在任一台安装rrdtool模块的主机上即可,本示例的rrdtool作业与Web Server部署在同一台主机上。部分关键源码如下:
【/data/www/Servermonitor/webmonitor/updaterrd.py】
def updateRRD(self,rowobj): #更新rrd文件方法 if str(rowobj["HTTP_CODE"])=="200": #非HTTP200状态标志“1” unavailablevalue=0 else: unavailablevalue=1 FID=rowobj["FID"] time_rrdpath=RRDPATH+'/'+str(self.getURL(FID))+'/'+str(FID)+'_'+\ str(self.rrdfiletype[0])+'.rrd' #指定三个特性数据rrdtool文件位置 download_rrdpath=RRDPATH+'/'+str(self.getURL(FID))+'/'+str(FID)+'_'+\ str(self.rrdfiletype[1])+'.rrd' unavailable_rrdpath=RRDPATH+'/'+str(self.getURL(FID))+'/'+str(FID)+'_'+\ str(self.rrdfiletype[2])+'.rrd' try: #将查询的MySQL记录更新到rrd文件 rrdtool.updatev(time_rrdpath,'%s:%s:%s:%s:%s:%s' %(str(rowobj["DATETIME"])\ ,str(rowobj["NAMELOOKUP_TIME"]),str(rowobj["CONNECT_TIME"]),str(rowobj["PRETRANSFER_TIME"]),str(rowobj["STARTTRANSFER_TIME"]),str(rowobj["TOTAL_TIME"]))) rrdtool.updatev(download_rrdpath,'%s:%s' %(str(rowobj ["DATETIME"]),\ str(rowobj["SPEED_DOWNLOAD"]))) rrdtool.updatev(unavailable_rrdpath,'%s:%s' % (str(rowobj ["DATETIME"])\ ,str(unavailablevalue))) self.setMARK(rowobj["ID"]) #更新数据库标志 except Exception,e: logging.error('Update rrd error:'+str(e)) def setMARK(self,_id): #更新已标志记录方法 try: self.cursor.execute("update webmonitor_monitordata set \ MARK='1' where ID='%s'"%(_id)) self.conn.commit except Exception,e: logging.error('SetMark datebase error:'+str(e)) def getNewdata(self): #获取未标志的新记录方法 try: self.cursor.execute("select ID,FID,NAMELOOKUP_TIME,CONNECT_ TIME,PRETRANSFER_TIME,STARTTRANSFER_TIME,TOTAL_TIME,HTTP_CODE,SPEED_DOWNLOAD,DATETIME from webmonitor_monitordata where MARK='0'") for row in self.cursor.fetchall: self.updateRRD(row) except Exception,e: logging.error('Get new database error:'+str(e))
同目录下的config.py为rrdtool作业配置文件,定义了数据库连接信息及项目路径等信息,可根据实际情况相应修改,最后配置系统crontab,建议与采集同一执行频率,如每5分钟,内容如下:
*/5 * * * * /usr/bin/python /data/www/Servermonitor/webmonitor/updaterrd.py > /dev/null 2>&1
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论