用Python的Flask框架结合MySQL写一个内存监控程序


Posted in Python onNovember 07, 2015

这里以监控内存使用率为例,写的一个简单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接口
具体框架结构图如下:

用Python的Flask框架结合MySQL写一个内存监控程序

目录结构如下:

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
<title>memory monitor</title>
<!DOCTYPE HTML>
<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <title>Highstock Example</title>
  <!-- <script type="text/javascript" src="{{ url_for('static', filename='jquery.min.js') }}"></script> -->
  <script type="text/javascript" src="http://ajax.useso.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
  <style type="text/css">
${demo.css}
  </style>
  <script type="text/javascript">
$(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>
 </head>
 <body>
<!-- <script src="{{ url_for('static', filename='highstock.js') }}"></script> -->
<script src="http://cdnjs.cloudflare.com/ajax/libs/highstock/2.0.4/highstock.js"></script>
<!-- <script src="{{ url_for('static', filename='exporting.js') }}"></script> -->
<script src="http://code.highcharts.com/modules/exporting.js"></script>
<div id="container" style="height: 400px"></div>
 </body>
</html>

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

用Python的Flask框架结合MySQL写一个内存监控程序

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

Python 相关文章推荐
python字典多条件排序方法实例
Jun 30 Python
在Django中限制已登录用户的访问的方法
Jul 23 Python
详解Python编程中基本的数学计算使用
Feb 04 Python
解决pycharm回车之后不能换行或不能缩进的问题
Jan 16 Python
浅谈Scrapy网络爬虫框架的工作原理和数据采集
Feb 07 Python
Python3批量移动指定文件到指定文件夹方法示例
Sep 02 Python
matplotlib.pyplot画图并导出保存的实例
Dec 07 Python
python对象销毁实例(垃圾回收)
Jan 16 Python
python GUI库图形界面开发之PyQt5图片显示控件QPixmap详细使用方法与实例
Feb 27 Python
Django模板之基本的 for 循环 和 List内容的显示方式
Mar 31 Python
如何在sublime编辑器中安装python
May 20 Python
 分享一个Python 遇到数据库超好用的模块
Apr 06 Python
Python的Flask框架中SQLAlchemy使用时的乱码问题解决
Nov 07 #Python
举例讲解Linux系统下Python调用系统Shell的方法
Nov 07 #Python
使用Python导出Excel图表以及导出为图片的方法
Nov 07 #Python
Windows下为Python安装Matplotlib模块
Nov 06 #Python
python 的列表遍历删除实现代码
Apr 12 #Python
举例讲解Python中的死锁、可重入锁和互斥锁
Nov 05 #Python
用Python写飞机大战游戏之pygame入门(4):获取鼠标的位置及运动
Nov 05 #Python
You might like
php adodb连接不同数据库
2009/03/19 PHP
PHP安全配置详细说明
2011/09/26 PHP
鸡肋的PHP单例模式应用详解
2013/06/03 PHP
Symfony页面的基本创建实例详解
2015/01/26 PHP
php获取文件类型和文件信息的方法
2015/07/10 PHP
整理8个很棒的 jQuery 倒计时插件和教程
2011/12/12 Javascript
jquery如何判断表格同一列不同行input数据是否重复
2014/05/14 Javascript
js+div实现文字滚动和图片切换效果代码
2015/08/27 Javascript
JS获取文件大小方法小结
2015/12/08 Javascript
JS验证input输入框(字母,数字,符号,中文)
2017/03/23 Javascript
基于ajax和jsonp的原生封装(实例)
2017/10/16 Javascript
vue的无缝滚动组件vue-seamless-scroll实例
2017/12/18 Javascript
深入浅出理解JavaScript高级定时器原理与用法
2018/08/02 Javascript
AngularJs中$cookies简单用法分析
2019/05/30 Javascript
vue移动端的左右滑动事件详解
2020/06/17 Javascript
超详细小程序定位地图模块全系列开发教学
2020/11/24 Javascript
[00:43]拉比克至宝魔导师密钥展示
2018/12/20 DOTA
如何处理Python3.4 使用pymssql 乱码问题
2016/01/08 Python
Python 3中print函数的使用方法总结
2017/08/08 Python
使用tensorflow实现线性回归
2018/09/08 Python
Python面向对象类编写细节分析【类,方法,继承,超类,接口等】
2019/01/05 Python
python可视化爬虫界面之天气查询
2019/07/03 Python
python实现多进程通信实例分析
2019/09/01 Python
python3使用GUI统计代码量
2019/09/18 Python
Python 实现一个手机号码获取妹子名字的功能
2019/09/25 Python
python绘制BA无标度网络示例代码
2019/11/21 Python
Python Flask上下文管理机制实例解析
2020/03/16 Python
canvas实现图片镜像翻转的2种方式
2020/07/22 HTML / CSS
ivx平台开发之不用代码实现一个九宫格抽奖功能
2021/01/27 HTML / CSS
毕业生找工作推荐信
2013/11/21 职场文书
2014国庆节餐厅促销活动策划方案
2014/09/16 职场文书
中学生运动会通讯稿大全
2014/09/18 职场文书
大学运动会加油稿200字(5篇)
2014/09/27 职场文书
2014年环卫工作总结
2014/11/22 职场文书
超搞笑婚前保证书
2015/05/08 职场文书
创业计划书之青年旅馆
2019/09/23 职场文书