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 自动补全(vim)
Nov 30 Python
python实现在windows服务中新建进程的方法
Jun 30 Python
Python打造出适合自己的定制化Eclipse IDE
Mar 02 Python
Python 搭建Web站点之Web服务器与Web框架
Nov 06 Python
python3中int(整型)的使用教程
Mar 23 Python
学生信息管理系统python版
Oct 17 Python
python assert的用处示例详解
Apr 01 Python
python绘制多个子图的实例
Jul 07 Python
在django模板中实现超链接配置
Aug 21 Python
python GUI库图形界面开发之PyQt5布局控件QGridLayout详细使用方法与实例
Mar 06 Python
Python实现归一化算法详情
Mar 18 Python
使用Python通过企业微信应用给企业成员发消息
Apr 18 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
上海地方志办公室-上海电子仪表工业志
2021/03/04 无线电
php输出表格的实现代码(修正版)
2010/12/29 PHP
phpadmin如何导入导出大数据文件及php.ini参数修改
2013/02/18 PHP
PHP生成验证码时“图像因其本身有错无法显示”的解决方法
2013/08/07 PHP
PHP调试的强悍利器之PHPDBG
2016/02/22 PHP
php gd等比例缩放压缩图片函数
2016/06/12 PHP
php指定长度分割字符串str_split函数用法示例
2017/01/30 PHP
Yii框架连表查询操作示例
2019/09/06 PHP
JS自动适应的图片弹窗实例
2013/06/29 Javascript
jquery 循环显示div的示例代码
2013/10/18 Javascript
被遗忘的javascript的slice() 方法
2015/04/20 Javascript
js实现简单div拖拽功能实例
2015/05/12 Javascript
JavaScript的字符串方法汇总
2016/07/31 Javascript
用Vue.js实现监听属性的变化
2016/11/17 Javascript
谈谈Vue.js——vue-resource全攻略
2017/01/16 Javascript
Vuejs 页面的区域化与组件封装的实现
2017/09/11 Javascript
详解React服务端渲染从入门到精通
2019/03/28 Javascript
JavaScript怎样在删除前添加确认弹出框?
2019/05/27 Javascript
Python标准库笔记struct模块的使用
2018/02/22 Python
python去除文件中重复的行实例
2018/06/29 Python
python实现推箱子游戏
2020/03/25 Python
Python使用matplotlib绘制三维参数曲线操作示例
2019/09/10 Python
Python3并发写文件与Python对比
2019/11/20 Python
使用Python合成图片的实现代码(图片添加个性化文本,图片上叠加其他图片)
2020/04/30 Python
记一次python 爬虫爬取深圳租房信息的过程及遇到的问题
2020/11/24 Python
Julep官网:美容产品和指甲油
2017/02/25 全球购物
你对IPv6了解程度
2016/02/09 面试题
师范生实习个人的自我评价
2013/09/28 职场文书
酒店总经理欢迎词
2014/01/08 职场文书
万年牢教学反思
2014/02/15 职场文书
信息管理应届生求职信
2014/03/07 职场文书
党的群众路线教育实践活动个人对照检查材料(医生)
2014/11/05 职场文书
装饰施工员岗位职责
2015/04/11 职场文书
中学校园广播稿
2015/08/18 职场文书
Python 流媒体播放器的实现(基于VLC)
2021/04/28 Python
浅谈Python数学建模之数据导入
2021/06/23 Python