用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接口
具体框架结构图如下:

2015117174700956.png (907×380)

目录结构如下:

web
├── flask_web.py
└── templates
└── mon.html

flask_web代码如下:

import mysqldb as mysql
import json
from flask import flask, 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”])
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
《script》

$(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
}
}]
});
});
});
《script》

《script》
《script》

注:这里的js代码都直接使用互联网上的代码,如果主机无法连接互联网的,可以将上面的三段代取取下来,在templates 的同级目录创建static 目录,将下载下来的三个文件放到该目录,删除模板中三处引用javascript处的代码,使用当前注释的三段。

三、agent被监控端设置

web展示页面完成了,运行起来:python flask_web.py 监听在8888端口上。我们需要做一个agent来采集数据,并通过post方法请求flask_web页面,将数据上传写入数据库。这里以监控内存为例,具体监控代码如下:

#!/usr/bin/env python
#coding=utf-8
import inspect
import time
import urllib, urllib2
import json
import socket
class 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.data
if __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 就可以看到我们的监控数据了:效果图如下

2015117175842218.png (793×435)

highcharts支持将按时间拖动,也支持按指定时间段查看。并且查看到的图片可以直接保存为png、jpg或pdf、csv等格式查看。

Posted in 未分类

发表评论