国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Linux > 正文

flask與mysql寫的簡單監控系統示例

2024-08-27 23:59:40
字體:
來源:轉載
供稿:網友

監控系統我們都知道用來監控服務器系統的一個穩定性了,下面整理了一篇flask + mysql寫的簡單監控系統的配置例子,希望對各位有幫助.

這里以監控內存使用率為例,寫的一個簡單demo性程序,具體操作根據51reboot提供的教程寫如下.

一、建庫建表,創建falcon數據庫:

  1. mysql> create database falcon character set utf8; 
  2. Query OK, 1 row affected (0.00 sec) 

創建內存監控使用的表stat,表結構如下:

  1. CREATE TABLE `stat` ( 
  2.   `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
  3.   `host` varchar(256) DEFAULT NULL
  4.   `mem_free` int(11) DEFAULT NULL
  5.   `mem_usage` int(11) DEFAULT NULL
  6.   `mem_total` int(11) DEFAULT NULL
  7.   `load_avg` varchar(128) DEFAULT NULL
  8.   `timebigint(11) DEFAULT NULL
  9.   PRIMARY KEY (`id`), 
  10.   KEY `host` (`host`(255)) 
  11. ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8; 

二、flask web端設置

首先我們設計一個web服務,實現如下功能,完成監控頁面展示,接受POST提交上來的數據 ,提供json數據GET接口,具體框架結構圖如下:

flask-monitor

目錄結構如下:

  1. web 
  2. ├── flask_web.py 
  3. └── templates 
  4.     └── mon.html 
  5. flask_web代碼如下: 
  6. import MySQLdb as mysql 
  7. import json 
  8. from flask import Flask, request, render_template 
  9. app = Flask(__name__) 
  10. db = mysql.connect(user="361way", passwd="123456", / 
  11.         db="falcon", charset="utf8"
  12. db.autocommit(True) 
  13. c = db.cursor() 
  14. @app.route("/", methods=["GET""POST"]) 
  15. def hello(): 
  16.     sql = "" 
  17.     if request.method == "POST"
  18.         data = request.json 
  19.         try: 
  20.             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'])) 
  21.             ret = c.execute(sql) 
  22.         except mysql.IntegrityError: 
  23.             pass 
  24.         return "OK" 
  25.     else
  26.         return render_template("mon.html"
  27. @app.route("/data", methods=["GET"]) 
  28. def getdata(): 
  29.     c.execute("SELECT `time`,`mem_usage` FROM `stat`"
  30.     ones = [[i[0]*1000, i[1]] for i in c.fetchall()] 
  31.     return "%s(%s);" % (request.args.get('callback'), json.dumps(ones))  //Vevb.com 
  32. if __name__ == "__main__"
  33.     app.run(host="0.0.0.0", port=8888, debug=True) 

這里使用的匯圖JS為highcharts、highstock,具體模板頁面內容如下:

  1. [root@91it templates]# cat mon.html 
  2. <title>memory monitor</title> 
  3. <!DOCTYPE HTML> 
  4. <html> 
  5.     <head> 
  6.         <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
  7.         <title>Highstock Example</title> 
  8.         <!-- <script type="text/javascript" src="{{ url_for('static', filename='jquery.min.js') }}"></script> --> 
  9.         <script type="text/javascript" src="http://ajax.useso.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script> 
  10.         <style type="text/css"> 
  11. ${demo.css} 
  12.         </style> 
  13.         <script type="text/javascript"> 
  14. $(function () { 
  15.     $.getJSON('/data?callback=?', function (data) { 
  16.         // Create the chart 
  17.         $('#container').highcharts('StockChart', { 
  18.             rangeSelector: { 
  19.                 inputEnabled: $('#container').width() > 480, 
  20.                 selected: 1 
  21.             }, 
  22.             title: { 
  23.                 text: 'memory monitor' 
  24.             }, 
  25.             series: [{ 
  26.                 name: 'memory monitor', 
  27.                 data: data, 
  28.                 type: 'spline', 
  29.                 tooltip: { 
  30.                     valueDecimals: 2 
  31.                 } 
  32.             }] 
  33.         }); 
  34.     }); 
  35. }); 
  36.         </script> 
  37.     </head> 
  38.     <body> 
  39. <!-- <script src="{{ url_for('static', filename='highstock.js') }}"></script> --> 
  40. <script src="http://cdnjs.cloudflare.com/ajax/libs/highstock/2.0.4/highstock.js"></script> 
  41. <!-- <script src="{{ url_for('static', filename='exporting.js') }}"></script> --> 
  42. <script src="http://code.highcharts.com/modules/exporting.js"></script> 
  43. <div id="container" style="height: 400px"></div> 
  44.     </body> 
  45. </html> 

注:這里的JS代碼都直接使用互聯網上的代碼,如果主機無法連接互聯網的,可以將上面的三段代取取下來,在templates 的同級目錄創建static 目錄,將下載下來的三個文件放到該目錄,刪除模板中三處引用javascript處的代碼,使用當前注釋的三段.

三、agent被監控端設置

web展示頁面完成了,運行起來:python flask_web.py 監聽在8888端口上,我們需要做一個agent來采集數據,并通過post方法請求flask_web頁面,將數據上傳寫入數據庫,這里以監控內存為例,具體監控代碼如下:

  1. #!/usr/bin/env python 
  2. #coding=utf-8 
  3. import inspect 
  4. import time 
  5. import urllib, urllib2 
  6. import json 
  7. import socket 
  8. class mon: 
  9.     def __init__(self): 
  10.         self.data = {} 
  11.     def getTime(self): 
  12.         return str(int(time.time()) + 8 * 3600) 
  13.     def getHost(self): 
  14.         return socket.gethostname() 
  15.     def getLoadAvg(self): 
  16.         with open('/proc/loadavg'as load_open: 
  17.             a = load_open.read().split()[:3] 
  18.             return ','.join(a) 
  19.     def getMemTotal(self): 
  20.         with open('/proc/meminfo'as mem_open: 
  21.             a = int(mem_open.readline().split()[1]) 
  22.             return a / 1024 
  23.     def getMemUsage(self, noBufferCache=True): 
  24.         if noBufferCache: 
  25.             with open('/proc/meminfo'as mem_open: 
  26.                 T = int(mem_open.readline().split()[1]) 
  27.                 F = int(mem_open.readline().split()[1]) 
  28.                 B = int(mem_open.readline().split()[1]) 
  29.                 C = int(mem_open.readline().split()[1]) 
  30.                 return (T-F-B-C)/1024 
  31.         else
  32.             with open('/proc/meminfo'as mem_open: 
  33.                 a = int(mem_open.readline().split()[1]) - int(mem_open.readline().split()[1]) 
  34.                 return a / 1024 
  35.     def getMemFree(self, noBufferCache=True): 
  36.         if noBufferCache: 
  37.             with open('/proc/meminfo'as mem_open: 
  38.                 T = int(mem_open.readline().split()[1]) 
  39.                 F = int(mem_open.readline().split()[1]) 
  40.                 B = int(mem_open.readline().split()[1]) 
  41.                 C = int(mem_open.readline().split()[1]) 
  42.                 return (F+B+C)/1024 
  43.         else
  44.             with open('/proc/meminfo'as mem_open: 
  45.                 mem_open.readline() 
  46.                 a = int(mem_open.readline().split()[1]) 
  47.                 return a / 1024 
  48.     def runAllGet(self): 
  49.         #自動獲取mon類里的所有getXXX方法,用XXX作為key,getXXX()的返回值作為value,構造字典 
  50.         for fun in inspect.getmembers(self, predicate=inspect.ismethod): 
  51.             if fun[0][:3] == 'get'
  52.                 self.data[fun[0][3:]] = fun[1]() 
  53.         return self.data 
  54. if __name__ == "__main__"
  55.     while True: 
  56.         m = mon() 
  57.         data = m.runAllGet() 
  58.         print data 
  59.         req = urllib2.Request("http://test.361way.com:8888", json.dumps(data), {'Content-Type''application/json'}) 
  60.         f = urllib2.urlopen(req) 
  61.         response = f.read() 
  62.         print response 
  63.         f.close() 
  64.         time.sleep(60) 

nohup python moniItems.py >/dev/null 2>&1 & 在被監控主機上運行,如果出于實驗目的,想盡快的看到展示效果,可以將time.sleep(60) 改為time.sleep(2),這樣每2秒就會取一次數據寫入數據庫.

訪問 http://test.361way.com:8888 就可以看到我們的監控數據了.

flask-highcharts

highcharts支持將按時間拖動,也支持按指定時間段查看,并且查看到的圖片可以直接保存為png、jpg或pdf、csv等格式查看.

這只是一個簡單的監控系統了其實是非常的簡單了,當然要做和高準確還是需要其它的專業工具來實現了.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 静安区| 汝南县| 平远县| 桐乡市| 琼海市| 阿克苏市| 新兴县| 长治市| 鸡东县| 无为县| 明溪县| 广昌县| 罗江县| 瑞金市| 西平县| 瓮安县| 军事| 德州市| 新绛县| 凌云县| 自贡市| 手机| 商城县| 韶山市| 吉隆县| 吐鲁番市| 府谷县| 遂川县| 军事| 沽源县| 合山市| 虹口区| 白河县| 宜春市| 六枝特区| 玛曲县| 内江市| 和顺县| 翁牛特旗| 睢宁县| 慈溪市|