Python写的一个简单监控系统


Posted in Python onJune 19, 2015

市面上有很多开源的监控系统:Cacti、nagios、zabbix。感觉都不符合我的需求,为什么不自己做一个呢

用Python两个小时徒手撸了一个简易的监控系统,给大家分享一下,希望能对大家有所启发

首先数据库建表

建立一个数据库“falcon”,建表语句如下:

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;

首先我们设计一个web服务,实现如下功能:

1.完成监控页面展示
2.接受POST提交上来的数据
3.提供json数据GET接口

目录结构如下:

web
├── flask_web.py
└── templates
  └── mon.html
[/code]
flask_web.py
[code]
import MySQLdb as mysql
import json
from flask import Flask, request, render_template
app = Flask(__name__)
db = mysql.connect(user="reboot", passwd="reboot123", \
    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)

这个template页面是我抄的highstock的示例,mon.html

简单起见我们只展示mem_usage信息到页面上

<title>3water.com</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="http://ajax.googleapis.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: '3water.com'
      },

      series: [{
        name: '3water.com',
        data: data,
        type: 'spline',
        tooltip: {
          valueDecimals: 2
        }
      }]
    });
  });
});
    </script>
  </head>
  <body>
<script src="http://cdnjs.cloudflare.com/ajax/libs/highstock/2.0.4/highstock.js"></script>
<script src="http://code.highcharts.com/modules/exporting.js"></script>


<div id="container" style="height: 400px"></div>
  </body>
</html>

web展示页面完成了,运行起来:

Python flask_web.py 监听在8888端口上

我们需要做一个agent来采集数据,并上传数据库

moniItems.py

#!/usr/bin/env python
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://3water.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 & 运行起来

访问 http://3water.com:8888 就可以看到我们的监控数据了:效果图如下

Python写的一个简单监控系统

Python 相关文章推荐
如何使用python爬取csdn博客访问量
Feb 14 Python
Python设计模式编程中Adapter适配器模式的使用实例
Mar 02 Python
在python3.5中使用OpenCV的实例讲解
Apr 02 Python
Python读取txt文件数据的方法(用于接口自动化参数化数据)
Jun 27 Python
python 自动重连wifi windows的方法
Dec 18 Python
python 中pyqt5 树节点点击实现多窗口切换问题
Jul 04 Python
python对绑定事件的鼠标、按键的判断实例
Jul 17 Python
Django框架教程之中间件MiddleWare浅析
Dec 29 Python
Python爬虫库BeautifulSoup的介绍与简单使用实例
Jan 25 Python
python利用Excel读取和存储测试数据完成接口自动化教程
Apr 30 Python
Python破解极验滑动验证码详细步骤
May 21 Python
pytorch中的 .view()函数的用法介绍
Mar 17 Python
详解Python中的日志模块logging
Jun 19 #Python
使用httplib模块来制作Python下HTTP客户端的方法
Jun 19 #Python
举例详解Python中threading模块的几个常用方法
Jun 18 #Python
Python的time模块中的常用方法整理
Jun 18 #Python
Python抽象类的新写法
Jun 18 #Python
Python实现的彩票机选器实例
Jun 17 #Python
Python基于Tkinter实现的记事本实例
Jun 17 #Python
You might like
PHP 遍历文件实现代码
2011/05/04 PHP
PHP利用str_replace防注入的方法
2013/11/10 PHP
php弹出对话框实现重定向代码
2014/01/23 PHP
PHP 魔术变量和魔术函数详解
2015/02/25 PHP
学习jquery必备 api中英文对照的chm手册 下载
2007/05/03 Javascript
鼠标滚轴控制文本框值的JS代码
2013/11/19 Javascript
jQuery复制表单元素附源码分享效果演示
2015/09/30 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形网络(1)
2015/11/30 Javascript
全面解析JavaScript中apply和call以及bind(推荐)
2016/06/15 Javascript
详解Vue.js动态绑定class
2016/12/20 Javascript
JavaScript基本类型值-Undefined、Null、Boolean
2017/02/23 Javascript
jQuery实现checkbox即点即改批量删除及中间遇到的坑
2017/11/11 jQuery
微信小程序 Animation实现图片旋转动画示例
2018/08/22 Javascript
在vue中使用inheritAttrs实现组件的扩展性介绍
2020/12/07 Vue.js
[07:26]2015国际邀请赛第二日TOP10集锦
2015/08/06 DOTA
利用selenium 3.7和python3添加cookie模拟登陆的实现
2017/11/20 Python
Python语言生成水仙花数代码示例
2017/12/18 Python
pthon贪吃蛇游戏详细代码
2019/01/27 Python
python 对字典按照value进行排序的方法
2019/05/09 Python
wxPython电子表格功能wx.grid实例教程
2019/11/19 Python
Python内置数据类型list各方法的性能测试过程解析
2020/01/07 Python
PyQt5+Pycharm安装和配置图文教程详解
2020/03/24 Python
python实现学生管理系统开发
2020/07/24 Python
四川internet信息高速公路(C#)笔试题
2012/02/29 面试题
Linux常见面试题
2013/03/18 面试题
信息专业学生学习的自我评价
2014/02/17 职场文书
《画风》教学反思
2014/04/16 职场文书
《周恩来的四个昼夜》观后思想汇报范文两篇
2014/09/10 职场文书
机关作风整顿个人剖析材料
2014/10/06 职场文书
党员转正介绍人意见
2015/06/03 职场文书
锦旗赠语
2015/06/23 职场文书
2015大学生暑期实习报告
2015/07/13 职场文书
导游词之澳门玫瑰圣母堂
2019/12/03 职场文书
Nginx配置文件详解以及优化建议指南
2021/09/15 Servers
vue实现滑动解锁功能
2022/03/03 Vue.js
Three.js实现雪糕地球的使用示例详解
2022/07/07 Javascript