这里以监控内存使用率为例,写的一个简单demo性程序,具体操作根据51reboot提供的教程写如下。
一、建库建表
创建falcon数据库:
mysql>create database falcon character setutf8;
QueryOK,1row affected (0.00sec)
创建内存监控使用的表stat,表结构如下:
CREATE TABLE `stat`(
`id`int(11)unsigned NOT NULL AUTO_INCREMENT,
`host`varchar(256)DEFAULT NULL,
`mem_free`int(11)DEFAULT NULL,
`mem_usage`int(11)DEFAULT NULL,
`mem_total`int(11)DEFAULT NULL,
`load_avg`varchar(128)DEFAULT NULL,
`time`bigint(11)DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `host`(`host`(255))
)ENGINE=InnoDBAUTO_INCREMENT=0DEFAULT CHARSET=utf8;
二、flask web端设置
首先我们设计一个web服务,实现如下功能:
完成监控页面展示
接受POST提交上来的数据
提供json数据GET接口
具体框架结构图如下:
目录结构如下:
web
├──flask_web.py
└──templates
└──mon.html
flask_web代码如下:
importMySQLdbasmysql
importjson
fromflask importFlask,request,render_template
app =Flask(__name__)
db =mysql.connect(user="361way",passwd="123456",\
db="falcon",charset="utf8")
db.autocommit(True)
c =db.cursor()
@app.route("/",methods=["GET","POST"])
defhello():
sql =""
ifrequest.method =="POST":
data =request.json
try:
sql ="INSERT INTO `stat` (`host`,`mem_free`,`mem_usage`,`mem_total`,`load_avg`,`time`) VALUES('%s', '%d', '%d', '%d', '%s', '%d')"%(data['Host'],data['MemFree'],data['MemUsage'],data['MemTotal'],data['LoadAvg'],int(data['Time']))
ret =c.execute(sql)
exceptmysql.IntegrityError:
pass
return"OK"
else:
returnrender_template("mon.html")
@app.route("/data",methods=["GET"])
defgetdata():
c.execute("SELECT `time`,`mem_usage` FROM `stat`")
ones =[[i[0]*1000,i[1]]fori inc.fetchall()]
return"%s(%s);"%(request.args.get('callback'),json.dumps(ones))
if__name__ =="__main__":
app.run(host="0.0.0.0",port=8888,debug=True)
这里使用的汇图JS为highcharts、highstock ,具体模板页面内容如下:
[root@91it templates]#cat mon.html
memory monitorHighstockExample${demo.css}
$(function(){
$.getJSON('/data?callback=?',function(data){
// Create the chart
$('#container').highcharts('StockChart',{
rangeSelector:{
inputEnabled:$('#container').width()>480,
selected:1
},
title:{
text:'memory monitor'
},
series:[{
name:'memory monitor',
data:data,
type:'spline',
tooltip:{
valueDecimals:2
}
}]
});
});
});
注:这里的JS代码都直接使用互联网上的代码,如果主机无法连接互联网的,可以将上面的三段代取取下来,在templates 的同级目录创建static 目录,将下载下来的三个文件放到该目录,删除模板中三处引用javascript处的代码,使用当前注释的三段。
三、agent被监控端设置
web展示页面完成了,运行起来:python flask_web.py 监听在8888端口上。我们需要做一个agent来采集数据,并通过post方法请求flask_web页面,将数据上传写入数据库。这里以监控内存为例,具体监控代码如下:
#!/usr/bin/env python
#coding=utf-8
importinspect
importtime
importurllib,urllib2
importjson
importsocket
classmon:
def__init__(self):
self.data ={}
defgetTime(self):
returnstr(int(time.time())+8*3600)
defgetHost(self):
returnsocket.gethostname()
defgetLoadAvg(self):
withopen('/proc/loadavg')asload_open:
a =load_open.read().split()[:3]
return','.join(a)
defgetMemTotal(self):
withopen('/proc/meminfo')asmem_open:
a =int(mem_open.readline().split()[1])
returna /1024
defgetMemUsage(self,noBufferCache=True):
ifnoBufferCache:
withopen('/proc/meminfo')asmem_open:
T =int(mem_open.readline().split()[1])
F =int(mem_open.readline().split()[1])
B =int(mem_open.readline().split()[1])
C =int(mem_open.readline().split()[1])
return(T-F-B-C)/1024
else:
withopen('/proc/meminfo')asmem_open:
a =int(mem_open.readline().split()[1])-int(mem_open.readline().split()[1])
returna /1024
defgetMemFree(self,noBufferCache=True):
ifnoBufferCache:
withopen('/proc/meminfo')asmem_open:
T =int(mem_open.readline().split()[1])
F =int(mem_open.readline().split()[1])
B =int(mem_open.readline().split()[1])
C =int(mem_open.readline().split()[1])
return(F+B+C)/1024
else:
withopen('/proc/meminfo')asmem_open:
mem_open.readline()
a =int(mem_open.readline().split()[1])
returna /1024
defrunAllGet(self):
#自动获取mon类里的所有getXXX方法,用XXX作为key,getXXX()的返回值作为value,构造字典
forfun ininspect.getmembers(self,predicate=inspect.ismethod):
iffun[0][:3]=='get':
self.data[fun[0][3:]]=fun[1]()
returnself.data
if__name__ =="__main__":
whileTrue:
m =mon()
data =m.runAllGet()
printdata
req =urllib2.Request("http://test.361way.com:8888",json.dumps(data),{'Content-Type':'application/json'})
f =urllib2.urlopen(req)
response =f.read()
printresponse
f.close()
time.sleep(60)
nohup python moniItems.py >/dev/null 2>&1 & 在被监控主机上运行,如果出于实验目的,想尽快的看到展示效果,可以将time.sleep(60) 改为time.sleep(2) ,这样每2秒就会取一次数据写入数据库。
访问 http://test.361way.com:8888 就可以看到我们的监控数据了:效果图如下
highcharts支持将按时间拖动,也支持按指定时间段查看。并且查看到的图片可以直接保存为png、jpg或pdf、csv等格式查看。