flask restless mysql_flask + mysql写的简单监控系统

本文介绍了一个使用flask、restless和MySQL构建的简单内存监控系统的实现过程。首先创建数据库和表,然后通过flask搭建web服务,接收POST提交的数据并提供JSON数据接口。同时,还提供了在被监控端的agent代码,用于采集内存数据并发送到web服务。监控页面使用了highcharts库进行展示,支持多种时间范围的查看和数据导出。
摘要由CSDN通过智能技术生成

这里以监控内存使用率为例,写的一个简单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接口

具体框架结构图如下:

f6ce1c5e8d1b6ea1983bfdb57f242375.png

目录结构如下:

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 就可以看到我们的监控数据了:效果图如下

fef105c5e8f2d5e19922506b297c9608.png

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值