建立數據庫“falcon”,建表語句如下:
創建表“stat ”(
` id ' int(11)無符號NOT NULL AUTO_INCREMENT,
` host ' varchar(256)默認為空,
` mem_free` int(11)默認為NULL,
` mem_usage` int(11)默認為NULL,
` mem_total` int(11)默認為NULL,
` load _ avg ' varchar(128)默認為NULL,
` time ' bigint(11)默認為NULL,
主鍵(` id `),
鍵` host` (`host`(255))
)ENGINE=InnoDB AUTO_INCREMENT=0默認CHARSET = utf8
首先,我們設計壹個web服務來實現以下功能:
1.完成監控頁面的顯示
2.接受郵寄提交的數據
3.提供json數據獲取接口。
目錄結構如下:
網
├──燒瓶_web.py
└──模板
mon.html└──
flask_web.py
將mysqldb作為MySQL導入
導入json
從燒瓶導入燒瓶,請求,渲染_模板
app = Flask(__name__)
db = mysql.connect(user="reboot ",passwd="reboot123 ",\
db="falcon ",charset="utf8 ")
db .自動提交(True)
c = db.cursor()
@app.route("/",methods=["GET "," POST"])
def hello():
sql = " "
if request.method == "POST ":
data = request.json
嘗試:
結構化查詢語言
= "插入` stat `中
(` host ',` mem_free ',` mem_usage ',` mem_total ',` load_avg ',` time `)
值(' %s ',' %d ',' %d ',' %d ',' %s ',' %d ')"(數據['主機'],
數據['MemFree'],數據['MemUsage'],數據['MemTotal'],數據['LoadAvg'],
int(data['Time']))
ret = c.execute
除了mysql。完整性錯誤:
及格
返回“確定”
否則:
返回render_template("mon.html ")
@app.route("/data ",methods=["GET"])
def getdata():
c.execute("SELECT `time `,從` stat `中選擇` mem_usage ' ")
ones = [[i[0]*1000,i[1]] for i in c.fetchall()]
返回“% s(% s);”% (request.args.get('callback '),json.dumps(ones))
if __name__ == "__main__ ":
app.run(host="0.0.0.0 ",port=8888,debug=True)
這個模板頁面是我復制的高庫存的壹個例子,mon.html。
為了簡單起見,我們只向頁面顯示mem_usage信息。
& lttitle & gt51 reboot . com & lt;/title & gt;
& lt!DOCTYPE HTML & gt
& lthtml & gt
& lthead & gt
& ltmeta/Ajax/libs/jquery/1 . 8 . 2/jquery . min . js " & gt;& lt/script & gt;
& ltstyle type="text/css " >
${demo.css}
& lt/style & gt;
& ltscript type = " text/JavaScript " & gt;
$(function () {
$.getJSON('/data?回調=?',函數(數據){
//創建圖表
$('#container ')。高圖表('股價圖',{
範圍選擇器:{
inputEnabled: $('#container ')。width()>;480,
選中:1
},
標題:{
文本:“51Reboot.com”
},
系列:[{
姓名:' 51Reboot.com ',
數據:數據,
類型:“樣條線”,
工具提示:{
數值小數:2
}
}]
});
});
});
& lt/script & gt;
& lt/head & gt;
& ltbody & gt
& ltscript src = "/Ajax/libs/high stock/2 . 0 . 4/high stock . js " & gt;& lt/script & gt;
& ltscript src = "/modules/exporting . js " & gt;& lt/script & gt;
& ltdiv id = " container " style = " height:400 px " & gt;& lt/div & gt;
& lt/body & gt;
& lt/html & gt;
web演示頁面已經完成,並且正在運行:
Python flask_web.py監聽端口8888。
我們需要成為壹個代理來收集數據並上傳到數據庫。
moniItems.py
#!/usr/bin/env python
進口檢驗
導入時間
導入urllib,urllib2
導入json
導入插座
mon類:
def __init__(self):
self.data = {}
def getTime(自身):
return str(int(time . time())+8 * 3600)
def getHost(self):
返回socket.gethostname()
def getLoadAvg(self):
使用open('/proc/loadavg ')作為load_open:
a = load_open.read()。split()[:3]
返回“,”。加入(a)
def getMemTotal(self):
使用open('/proc/meminfo ')作為mem_open:
a = int(mem_open.readline()。split()[1])
返回a / 1024
def getMemUsage(self,noBufferCache=True):
如果沒有緩存:
使用open('/proc/meminfo ')作為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
否則:
使用open('/proc/meminfo ')作為mem_open:
a = int(mem_open.readline()。split()[1])-int(mem _ open . readline()。split()[1])
返回a / 1024
def getMemFree(self,noBufferCache=True):
如果沒有緩存:
使用open('/proc/meminfo ')作為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
否則:
使用open('/proc/meminfo ')作為mem_open:
mem_open.readline()
a = int(mem_open.readline()。split()[1])
返回a / 1024
def runAllGet(self):
#自動獲取mon類中的所有getXXX方法,以XXX為鍵,以getXXX()的返回值為值構造壹個字典。
為了在inspect.getmembers(self,predicate=inspect.ismethod)中獲得樂趣:
if fun[0][:3] == 'get ':
self . data[fun[0][3:]]= fun[1]()
返回自我數據
if __name__ == "__main__ ":
雖然正確:
m = mon()
data = m.runAllGet()
打印數據
req = urllib2。請求(":8888 ",json.dumps(data),{ ' Content-Type ':' application/JSON ' })
f = urllib2.urlopen(req)
response = f.read()
打印響應
f.close()
時間.睡眠(60)
nohup python moniItems.py & gt/dev/null 2 & gt;& amp1。奔跑