您好,欢迎访问一九零五行业门户网

用Python的Flask框架结合MySQL写一个内存监控程序

这里以监控内存使用率为例,写的一个简单demo性程序,具体操作根据51reboot提供的教程写如下。
一、建库建表
创建falcon数据库:
mysql> create database falcon character set utf8;query ok, 1 row affected (0.00 sec)
创建内存监控使用的表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=innodb auto_increment=0 default charset=utf8;
二、flask web端设置
首先我们设计一个web服务,实现如下功能:
完成监控页面展示
接受post提交上来的数据
提供json数据get接口
具体框架结构图如下:
目录结构如下:
web├── flask_web.py└── templates └── mon.html
flask_web代码如下:
import mysqldb as mysqlimport jsonfrom flask import flask, request, render_templateapp = flask(__name__)db = mysql.connect(user=361way, passwd=123456, \ db=falcon, charset=utf8)db.autocommit(true)c = db.cursor()@app.route(/, methods=[get, post])def hello(): sql = if request.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) except mysql.integrityerror: pass return ok else: return render_template(mon.html)@app.route(/data, methods=[get])def getdata(): c.execute(select `time`,`mem_usage` from `stat`) ones = [[i[0]*1000, i[1]] for i in c.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 monitor highstock example

注:这里的js代码都直接使用互联网上的代码,如果主机无法连接互联网的,可以将上面的三段代取取下来,在templates 的同级目录创建static 目录,将下载下来的三个文件放到该目录,删除模板中三处引用javascript处的代码,使用当前注释的三段。
三、agent被监控端设置
web展示页面完成了,运行起来:python flask_web.py 监听在8888端口上。我们需要做一个agent来采集数据,并通过post方法请求flask_web页面,将数据上传写入数据库。这里以监控内存为例,具体监控代码如下:
#!/usr/bin/env python#coding=utf-8import inspectimport timeimport urllib, urllib2import jsonimport socketclass mon: def __init__(self): self.data = {} def gettime(self): return str(int(time.time()) + 8 * 3600) def gethost(self): return socket.gethostname() def getloadavg(self): with open('/proc/loadavg') as load_open: a = load_open.read().split()[:3] return ','.join(a) def getmemtotal(self): with open('/proc/meminfo') as mem_open: a = int(mem_open.readline().split()[1]) return a / 1024 def getmemusage(self, nobuffercache=true): if nobuffercache: with open('/proc/meminfo') as mem_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: with open('/proc/meminfo') as mem_open: a = int(mem_open.readline().split()[1]) - int(mem_open.readline().split()[1]) return a / 1024 def getmemfree(self, nobuffercache=true): if nobuffercache: with open('/proc/meminfo') as mem_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: with open('/proc/meminfo') as mem_open: mem_open.readline() a = int(mem_open.readline().split()[1]) return a / 1024 def runallget(self): #自动获取mon类里的所有getxxx方法,用xxx作为key,getxxx()的返回值作为value,构造字典 for fun in inspect.getmembers(self, predicate=inspect.ismethod): if fun[0][:3] == 'get': self.data[fun[0][3:]] = fun[1]() return self.dataif __name__ == __main__: while true: m = mon() data = m.runallget() print data req = urllib2.request(http://test.361way.com:8888, json.dumps(data), {'content-type': 'application/json'}) f = urllib2.urlopen(req) response = f.read() print response 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等格式查看。
其它类似信息

推荐信息