这里以监控内存使用率为例,写的一个简单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. `time` bigint(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接口

具体框架结构图如下:

目录结构如下:

  1. web
  2. ├── flask_web.py
  3. └── templates
  4. └── mon.html

flask_web代码如下:

  1. import MySQLdb as mysql
  2. import json
  3. from flask import Flask, request, render_template
  4. app = Flask(__name__)
  5. db = mysql.connect(user="361way", passwd="123456", \
  6. db="falcon", charset="utf8")
  7. db.autocommit(True)
  8. c = db.cursor()
  9. @app.route("/", methods=["GET", "POST"])
  10. def hello():
  11. sql = ""
  12. if request.method == "POST":
  13. data = request.json
  14. try:
  15. 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']))
  16. ret = c.execute(sql)
  17. except mysql.IntegrityError:
  18. pass
  19. return "OK"
  20. else:
  21. return render_template("mon.html")
  22. @app.route("/data", methods=["GET"])
  23. def getdata():
  24. c.execute("SELECT `time`,`mem_usage` FROM `stat`")
  25. ones = [[i[0]*1000, i[1]] for i in c.fetchall()]
  26. return "%s(%s);" % (request.args.get('callback'), json.dumps(ones))
  27. if __name__ == "__main__":
  28. 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 就可以看到我们的监控数据了:效果图如下

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

flask + mysql写的简单监控系统的更多相关文章

  1. MySQL写压力性能监控与调优

    写压力调优:数据库的写.写压力性能监控.写压力调优参数 一.关于DB的写 1.数据库是一个写频繁的系统 2.后台写.写缓存 3.commit需要写入 4.写缓存失效或者写满-->写压力陡增--& ...

  2. 10min 手写一个内存监控系统

    本文的目的在于,尽可能用简单的代码,让大家了解内存监控的原理,及思想.更容易去理解Nagios.Zabbix.Ganglia监控原理,文章最后还有视频教程链接哦,从零敲出来的全过程 思路分为下面几块: ...

  3. GO开发:用go写个日志监控系统

    日志收集系统架构 1.项目背景 a. 每个系统都有日志,当系统出现问题时,需要通过日志解决问题 b. 当系统机器比较少时,登陆到服务器上查看即可满足 c. 当系统机器规模巨大,登陆到机器上查看几乎不现 ...

  4. JSP+Servlet+C3P0+Mysql实现的简单新闻系统

    项目简介 项目来源于:https://gitee.com/glotion/servlet-jsp_news 本系统基于JSP+Servlet+C3P0+Mysql.涉及技术少,易于理解,适合JavaW ...

  5. DAY5 php + mysql 写一个简单的sql注入平台

    php mysql 在浏览器输入用户名,去数据库查询.查到则显示在浏览器,查不到则显示空. sql 里面三个字段 id username password create table t1 (id in ...

  6. php+mysql+apache实现登录注册系统

    Php+mysql写网页注册登录系统 1.搭建msyql+php+apache的网站环境 (1) 在云服务器上搭建服务器,推荐使用宝塔集成 (2) 在本地windows搭建,推荐自己采用分开安装,这样 ...

  7. Python运维三十六式:用Python写一个简单的监控系统

    市面上有很多开源的监控系统:Cacti.Nagios.Zabbix.感觉都不符合我的需求,为什么不自己做一个呢? 用Python两个小时徒手撸了一个简易的监控系统,给大家分享一下,希望能对大家有所启发 ...

  8. 用python 10min手写一个简易的实时内存监控系统

    简易的内存监控系统 本文需要有一定的python和前端基础,如果没基础的,请关注我后续的基础教程系列博客 文章github源地址,还可以看到具体的代码,喜欢请在原链接右上角加个star 腾讯视频链接 ...

  9. [转]用python 10min手写一个简易的实时内存监控系统

    简易的内存监控系统 本文需要有一定的python和前端基础,如果没基础的,请关注我后续的基础教程系列博客 文章github源地址,还可以看到具体的代码,喜欢请在原链接右上角加个star 腾讯视频链接 ...

随机推荐

  1. android 系统广播

    Version:0.9 StartHTML:-1 EndHTML:-1 StartFragment:00000099 EndFragment:00012731 String ADD_SHORTCUT_ ...

  2. Android wpa_supplicant 启动过程

    记录wpa_supplicant启动过程 ini脚本: service wpa_supplicant /vendor/bin/hw/wpa_supplicant \ -ip2p0 -Dnl80211 ...

  3. zXing使用注意事项-转

    zXing使用注意事项   ------------------ zxing和zbar的比较: ZXing项目的示例程序对于摄像头的控制写的非常全面,ZBar的没有ZBar基于C语言编写,解码效率高于 ...

  4. unity--------shader之standard 标准参数

    [Unity3D自学记录]Unity5 之 standard参数 标签: unity3d 2016-07-13 10:17 2428人阅读 评论(0) 收藏 举报  分类: Unity3D(70)   ...

  5. Git -- 工作区 和 暂存区

    Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念. 先来看名词解释. 工作区(Working Directory) 就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工 ...

  6. ZooKeeper系列之二:Zookeeper常用命令

    https://my.oschina.net/u/347386/blog/313037

  7. 工作所用的日常 Git 命令

    几乎每个开发人员都在使用 Git,当然很可能是 GitHub.但大多数开发者大概有 99% 的时间只是使用这三个命令: #使用命令git add <file>,将文件添加到暂存区 git ...

  8. Castle.Windsor依赖注入的高级应用_Castle.Windsor.3.1.0

    [转]Castle.Windsor依赖注入的高级应用_Castle.Windsor.3.1.0 1. 使用代码方式进行组件注册[依赖服务类] using System; using System.Co ...

  9. YII2 搭建redis拓展

    安装redis扩展: 1.通过composer进行安装,到项目根目录cmd运行(推荐) php composer.phar require --prefer-dist yiisoft/yii2-red ...

  10. Spock集成入门

    本文基于SpringBoot 在pom.xml添加Spock依赖 <!-- test --> <dependency> <groupId>org.codehaus. ...