发表于 2014年9月21日 作者 root

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

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

首先数据库建表

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

MySQL

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;

1

2

3

4

5

6

7

8

9

10

11

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

1

2

3

4

web

├── flask_web.py

└── templates

└── mon.html

flask_web.py

flask_web.py

Python

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)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

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信息到页面上

mon.html

XHTML

<title>51reboot.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: '51Reboot.com'            },            series: [{                name: '51Reboot.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>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

<title>51reboot.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: '51Reboot.com'

},

series: [{

name: '51Reboot.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

moniItems.py

Python

#!/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://51reboot.com:8888", json.dumps(data), {'Content-Type': 'application/json'})        f = urllib2.urlopen(req)        response = f.read()        print response        f.close()        time.sleep(60)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

#!/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://51reboot.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://51reboot.com:8888 就可以看到我们的监控数据了:效果图如下

转载于:https://blog.51cto.com/kunka/1568991

用Python写一个简单的监控系统相关推荐

  1. 利用python写一个简单的双色球彩票系统

    利用python写一个简单的双色球彩票系统 1.设置每次买的号码一样 写一个双色球彩票系统,系统可以随机产生一组数据,一组彩票数据有六位数,这六位数的的取值范围是0和1. 一张彩票是两块钱,用户可以选 ...

  2. python写一个系统-使用Python写一个量化股票提醒系统

    大家在没有阅读本文之前先看下python的基本概念, Python是一种解释型.面向对象.动态数据类型的高级程序设计语言. Python由Guido van Rossum于1989年底发明,第一个公开 ...

  3. 用python读取股票价格_使用Python写一个量化股票提醒系统

    大家在没有阅读本文之前先看下python的基本概念, Python是一种解释型.面向对象.动态数据类型的高级程序设计语言. Python由Guido van Rossum于1989年底发明,第一个公开 ...

  4. python量化股票源码_使用Python写一个量化股票提醒系统

    大家在没有阅读本文之前先看下python的基本概念, Python是一种解释型.面向对象.动态数据类型的高级程序设计语言. Python由Guido van Rossum于1989年底发明,第一个公开 ...

  5. python写炒股软件_使用Python写一个量化股票提醒系统

    大家在没有阅读本文之前先看下python的基本概念, Python是一种解释型.面向对象.动态数据类型的高级程序设计语言. Python由Guido van Rossum于1989年底发明,第一个公开 ...

  6. 用python写一个简单的web服务器

    人生苦短,我用python 简洁高效,这才是理想的语言啊 分享一点python的学习经验-----如何用python写一个简单的web服务器 首先,我们需要简单地了解一下网络通信协议,这里用白话介绍一 ...

  7. 一个简单的监控系统的设计

    一个简单的监控系统的设计 # // // 为了实现上级需要一个监控的需求,设计一个小的监控系统,结构如下图. // 虽然是一个比较简单的功能,但是仍然对代码的结构的关系进行了设计,使其具备良好的可扩展 ...

  8. python爬虫抢火车票_如何用python写一个简单的12306抢票软件|python 爬火车票 教程...

    python 如果抓取验证码图片 类似12306的登录验证码图片 这个以前做次.最大的麻烦是码的识别算法的识别率太低.12306那种网站登陆错3次就限制你20分钟.所以除非你有33%以上的识别率否则不 ...

  9. 用Python写一个简单的双均线策略分析

    用Python写一个简单的双均线策略 双均线策略 先罗列一下我知道的量化策略: 双均线:一句话来讲就是金叉买死叉卖. 布林带:突破压力线(上轨)清仓,跌破支撑线(下轨)持仓. PEG:根据PE/G调整 ...

最新文章

  1. 树莓派迅雷远程下载 | 树莓派小无相系列
  2. Extjs4 常用布局总结
  3. Jsp实现停车场管理系统
  4. clone是深拷贝还是浅拷贝_Cloneable接口的作用与探索理解浅拷贝与深拷贝
  5. 窗体的ControlBox属性
  6. Spring Ioc 源码分析(一)--Spring Ioc容器的加载
  7. 微信小程序从零开始开发步骤(三)底部导航栏
  8. C++ vector容器删除操作
  9. 如何将本地 Windows 电脑中的文件复制(上传)到远程的 Windows 服务器主机上
  10. 唯美好看的动态个人鹿鸣404单页HTML源码
  11. 最流行的国家级域名是什么?不是.cn 也不是.uk
  12. Java400道面试题通关宝典助你进大厂,赶紧收藏起来!
  13. 用python写一个地铁线路图_python制作一线城市地铁运行动态图
  14. 鄙人最新作JS自动适应的图片弹窗
  15. 车盲普及贴系列.一.到底什么样车才安全
  16. 软考岗位设置与岗位描述
  17. Windows10 LTSB/LTSC 企业版安装应用商店
  18. 荣耀8X0安卓系统切换鸿蒙系统,华为大改安卓Q,EMUI 10将启用全新UI,花粉沸腾:静候鸿蒙...
  19. Git Commit Message校验踩坑指南
  20. uhs3内存卡有哪些_可能是目前性价比最高的UHS-II SD卡

热门文章

  1. LIS 最长递增子序列问题
  2. 用Topo研发管理系统作需求管理
  3. 比较高效的表格行背景变色及选定高亮JS
  4. initrd in linux 2.6.32.27
  5. Apache 服务器端安装配置(Windows版本)
  6. 科技圈CEO用微鲸尬明星脸,除了罗永浩还有哪些大牛光荣上榜?
  7. 前端性能优化——http首部
  8. java自学之路-day19
  9. 使用Python Shells绕过杀毒软件
  10. [框架][MyBatis]MyBatis集锦