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 分析Nginx访问日志并保存到MySQL数据库实例
Mar 13 Python
初步探究Python程序的执行原理
Apr 11 Python
Python写的一个简单监控系统
Jun 19 Python
浅谈python import引入不同路径下的模块
Jul 11 Python
python中判断文件编码的chardet(实例讲解)
Dec 21 Python
python实现堆和索引堆的代码示例
Mar 19 Python
python 从csv读数据到mysql的实例
Jun 21 Python
Sanic框架基于类的视图用法示例
Jul 18 Python
TensorFlow实现iris数据集线性回归
Sep 07 Python
Python和Sublime整合过程图示
Dec 25 Python
Python re正则表达式元字符分组()用法分享
Feb 10 Python
PyPDF2读取PDF文件内容保存到本地TXT实例
May 12 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设计模式 Visitor 访问者模式
2011/06/28 PHP
163的邮件用phpmailer发送(实例详解)
2013/06/24 PHP
PHP批量上传图片的具体实现方法介绍.
2014/02/26 PHP
php中关于socket的系列函数总结
2015/05/18 PHP
Javascript 面向对象 继承
2010/05/13 Javascript
jQuery查询数据返回object和字符串影响原因是什么
2013/08/09 Javascript
详解参数传递四种形式
2015/07/21 Javascript
js脚本分页代码分享(7种样式)
2015/08/19 Javascript
Jquery时间轴特效(三种不同类型)
2015/11/02 Javascript
js时间戳转为日期格式的方法
2015/12/28 Javascript
JavaScript DOM节点操作方法总结
2016/08/23 Javascript
用headjs来管理和加载js 提高网站加载速度
2016/11/29 Javascript
Vue系列:通过vue-router如何传递参数示例
2017/01/16 Javascript
js图片加载效果实例代码(延迟加载+瀑布流加载)
2017/05/12 Javascript
Node.js使用orm2进行update操作时关联字段无法修改的解决方法
2017/06/13 Javascript
详解使用路由延迟加载 Angular 模块
2017/10/12 Javascript
微信小程序wx.request实现后台数据交互功能分析
2017/11/25 Javascript
详解Node.js读写中文内容文件操作
2018/10/10 Javascript
JavaScript实现的联动菜单特效示例
2019/07/08 Javascript
layui实现数据表格table分页功能(ajax异步)
2019/07/27 Javascript
JavaScript实现省份城市的三级联动
2020/02/11 Javascript
JS 设计模式之:单例模式定义与实现方法浅析
2020/05/06 Javascript
vue下载二进制流图片操作
2020/10/26 Javascript
[47:50]Secret vs VP 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
基于Python实现文件大小输出
2016/01/11 Python
Python实现将doc转化pdf格式文档的方法
2018/01/19 Python
Python flask框架实现查询数据库并显示数据
2020/06/04 Python
KIKO比利时官网:意大利彩妆品牌
2017/07/23 全球购物
校园元旦活动总结
2014/07/09 职场文书
环境科学专业求职信
2014/08/04 职场文书
师德师风剖析材料
2014/09/30 职场文书
大学生求职简历自我评价
2015/03/02 职场文书
怎样写观后感
2015/06/19 职场文书
志愿者工作心得体会
2016/01/15 职场文书
Python pandas之求和运算和非空值个数统计
2021/08/07 Python
MySQL限制查询和数据排序介绍
2022/03/25 MySQL