用Python的Flask架構結合MySQL寫一個記憶體監控程式

來源:互聯網
上載者:User
這裡以監控記憶體使用量率為例,寫的一個簡單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等格式查看。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.