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 相关文章推荐
Django中URL视图函数的一些高级概念介绍
Jul 20 Python
python中range()与xrange()用法分析
Sep 21 Python
Python 抓取微信公众号账号信息的方法
Jun 14 Python
Python日志无延迟实时写入的示例
Jul 11 Python
python实现代码统计器
Sep 19 Python
python网络爬虫 CrawlSpider使用详解
Sep 27 Python
Python Django框架url反向解析实现动态生成对应的url链接示例
Oct 18 Python
pygame实现俄罗斯方块游戏(AI篇1)
Oct 29 Python
使用python去除图片白色像素的实例
Dec 12 Python
keras模型保存为tensorflow的二进制模型方式
May 25 Python
有关pycharm登录github时有的时候会报错connection reset的问题
Sep 15 Python
Python爬虫教程之利用正则表达式匹配网页内容
Dec 08 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遍历文件夹和文件列表示例分享
2014/03/11 PHP
ci检测是ajax还是页面post提交数据的方法
2014/11/10 PHP
PHP获取毫秒级时间戳的方法
2015/04/15 PHP
PHP的几个常用加密函数
2016/02/03 PHP
CentOS系统中PHP安装扩展的方式汇总
2017/04/09 PHP
php中时间函数date及常用的时间计算
2017/05/12 PHP
google 搜索框添加关键字实现代码
2010/04/24 Javascript
调试代码导致IE出错的避免方法
2014/04/04 Javascript
nodejs实现黑名单中间件设计
2014/06/17 NodeJs
vue.js父组件使用外部对象的方法示例
2017/04/25 Javascript
详解用webpack把我们的业务模块分开打包的方法
2017/07/20 Javascript
vue中过滤器filter的讲解
2019/01/21 Javascript
node之本地服务器图片上传的方法示例
2019/03/26 Javascript
微信小程序-form表单提交代码实例
2019/04/29 Javascript
Node.js利用Express实现用户注册登陆功能(推荐)
2020/10/26 Javascript
[07:52]2014DOTA2 TI逗比武士游V社解说背后的故事
2014/07/10 DOTA
Python语言的12个基础知识点小结
2014/07/10 Python
Python中使用Inotify监控文件实例
2015/02/14 Python
Python爬虫抓取手机APP的传输数据
2016/01/22 Python
Python 窗体(tkinter)按钮 位置实例
2019/06/13 Python
详解Python二维数组与三维数组切片的方法
2019/07/18 Python
Python流程控制 while循环实现解析
2019/09/02 Python
python 中值滤波,椒盐去噪,图片增强实例
2019/12/18 Python
Tensorflow矩阵运算实例(矩阵相乘,点乘,行/列累加)
2020/02/05 Python
TensorFlow实现checkpoint文件转换为pb文件
2020/02/10 Python
查询优化的一般准则有哪些
2015/03/08 面试题
MYSQL支持事务吗
2013/08/09 面试题
大学生职业生涯规划方案
2014/01/03 职场文书
大学生关于奋斗的演讲稿
2014/01/09 职场文书
广告设计应届生求职信
2014/03/01 职场文书
车贷收入证明范本
2014/09/14 职场文书
个人思想政治总结
2015/03/05 职场文书
学历证明范文
2015/06/16 职场文书
创业计划书之DIY自助厨房
2019/09/06 职场文书
mybatis-plus模糊查询指定字段
2022/04/28 Java/Android
JS前端监控采集用户行为的N种姿势
2022/07/23 Javascript