flask + mysql写的简单监控系统
这里以监控内存使用率为例,写的一个简单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 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 就可以看到我们的监控数据了:效果图如下
highcharts支持将按时间拖动,也支持按指定时间段查看。并且查看到的图片可以直接保存为png、jpg或pdf、csv等格式查看。
flask + mysql写的简单监控系统的更多相关文章
- MySQL写压力性能监控与调优
写压力调优:数据库的写.写压力性能监控.写压力调优参数 一.关于DB的写 1.数据库是一个写频繁的系统 2.后台写.写缓存 3.commit需要写入 4.写缓存失效或者写满-->写压力陡增--& ...
- 10min 手写一个内存监控系统
本文的目的在于,尽可能用简单的代码,让大家了解内存监控的原理,及思想.更容易去理解Nagios.Zabbix.Ganglia监控原理,文章最后还有视频教程链接哦,从零敲出来的全过程 思路分为下面几块: ...
- GO开发:用go写个日志监控系统
日志收集系统架构 1.项目背景 a. 每个系统都有日志,当系统出现问题时,需要通过日志解决问题 b. 当系统机器比较少时,登陆到服务器上查看即可满足 c. 当系统机器规模巨大,登陆到机器上查看几乎不现 ...
- JSP+Servlet+C3P0+Mysql实现的简单新闻系统
项目简介 项目来源于:https://gitee.com/glotion/servlet-jsp_news 本系统基于JSP+Servlet+C3P0+Mysql.涉及技术少,易于理解,适合JavaW ...
- DAY5 php + mysql 写一个简单的sql注入平台
php mysql 在浏览器输入用户名,去数据库查询.查到则显示在浏览器,查不到则显示空. sql 里面三个字段 id username password create table t1 (id in ...
- php+mysql+apache实现登录注册系统
Php+mysql写网页注册登录系统 1.搭建msyql+php+apache的网站环境 (1) 在云服务器上搭建服务器,推荐使用宝塔集成 (2) 在本地windows搭建,推荐自己采用分开安装,这样 ...
- Python运维三十六式:用Python写一个简单的监控系统
市面上有很多开源的监控系统:Cacti.Nagios.Zabbix.感觉都不符合我的需求,为什么不自己做一个呢? 用Python两个小时徒手撸了一个简易的监控系统,给大家分享一下,希望能对大家有所启发 ...
- 用python 10min手写一个简易的实时内存监控系统
简易的内存监控系统 本文需要有一定的python和前端基础,如果没基础的,请关注我后续的基础教程系列博客 文章github源地址,还可以看到具体的代码,喜欢请在原链接右上角加个star 腾讯视频链接 ...
- [转]用python 10min手写一个简易的实时内存监控系统
简易的内存监控系统 本文需要有一定的python和前端基础,如果没基础的,请关注我后续的基础教程系列博客 文章github源地址,还可以看到具体的代码,喜欢请在原链接右上角加个star 腾讯视频链接 ...
随机推荐
- FreeRDP的安装配置(错误信息:SSL_read: Failure in SSL library (protocol error?))
最新文章:Virson's Blog 使用xfreerdp [serveripaddress]命令,连接xp/windows 2003都正常,但是在连接win7/2008时总是出错: ;------- ...
- Linux进程间通信之管道(pipe)、命名管道(FIFO)与信号(Signal)
整理自网络 Unix IPC包括:管道(pipe).命名管道(FIFO)与信号(Signal) 管道(pipe) 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道 ...
- grub的boot loader安装在磁盘上的位置
在很多资料上介绍grub的引导过程时,都是:bios->MBR->boot loaderboot loader是grub或者lilo.但是他是放在什么位置?很多资料上都没有标明. 通过阅读 ...
- pandas Series KeyError: -1
前几天写分析方法,遇到的一个错误: 具体我已经在stackoverflow 里面得到了详细的解答,下面我把问题和解决办法总结一下,方便日后的回顾 问题: sql = "select {}, ...
- 一个完整的SAP RFC调用接口封装
因为经常需要访问sap操作数据,就封装了一个类方便调用,运行条件需要安装sap客户端,在sap客户端安装之后会带有一个com接口,本接口就通过这个com访问sap,因为com的后期绑定问题故使用了vb ...
- 【转】【WPF】关于依赖属性的ValidateValueCallback,PropertyChangedCallback和CoerceValueCallback的执行顺序
三个回调对应依赖属性的验证过程,改变过程和强制转换过程. class Dobj : DependencyObject { //依赖属性包装 public int MyProperty { get { ...
- 高性能分布式哈希表FastDHT
高性能分布式哈希表FastDHT介绍及安装配置 FastDHT-高效分布式Hash系统 FastDHT(分布式hash系统)安装和与FastDFS整合实现自定义文件ID Centos6.3 停安装 F ...
- C# 时间比较方法DateTime.Compare
public static int Compare(DateTime t1,DateTime t2) 返回值 类型:System..::.Int32 有符号数字,指示 t1 和 t2 的相对值. 值类 ...
- Oracle RAC集群资料收集
RAC优势和劣势 http://tech.it168.com/a2012/0814/1384/000001384756_all.shtml 双机热备与RAC并行模式对比 WAS数据源设置 http:/ ...
- js 创建多行字符串
function heredoc(fn) { ,-).join('\n') + '\n' } var tmpl = heredoc(function(){/* !!! 5 html include h ...