问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

怎样用Python写一个简单的监控系统

发布网友 发布时间:2022-04-22 04:14

我来回答

1个回答

热心网友 时间:2022-04-18 15:18

首先数据库建表
建立一个数据库“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

flask_web.py

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.mps(ones))

if __name__ == "__main__":
app.run(host="0.0.0.0", port=8888, debug=True)

这个template页面是我抄的highstock的示例,mon.html
简单起见我们只展示mem_usage信息到页面上
<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/moles/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://51reboot.com:8888", json.mps(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 & 运行起来
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
中山眼科医科的吕林教擅长哪方面治疗,要怎样预约 冰箱冷冻成品区和冷冻生鲜区的区别 东京大学东洋文化研究所前身今世 简单介绍东洋武士文学 东洋西洋区别 追高被套的股票怎么操作? 求助!要有怎样的配置才能玩得起古剑奇谭或仙剑5? 我的配置玩古剑奇谭老重启和卡 高手帮忙看一下怎么解决啊 我的配置玩... 电脑任务栏微信QQ图标怎么消失? qq和微信这样的弹出窗口怎么取消 经常喝酒的人,出现哪几个信号说明肝毒太深?如何... 中兵毒太深的我该怎么办? 做人太毒太狂太嚣会有报应吗? 道士毒太厉害怎么改? 剑三中男生玩咩太好还是毒太好 十有八九是肝毒太深了,指的是什么? 光猫路由与路由器有什么区别 公募基金指的是什么? 光猫和路由器区别 中国的公募基金有哪些 野兽家族第二季大结局是什么,大结局,人物最终 野兽家族第二季大结局是什么,大结局,人物最终结局 跪求《野兽家族 第一季》2016年百度云资源,艾伦·巴... 跪求《野兽家族 第一季》2018年百度云资源 一个支付宝可以绑定多少个淘宝账户? 有大神有2016年上映的艾伦·巴金主演的美国剧情片《... 一个支付宝可以绑定几个淘宝店? 《野兽家族第四季(2019)》百度云无删减完整版在线... 一个支付宝账号可以绑定多个淘宝账户吗 一个支付宝可以绑定几个淘宝账户? 中《爱的被告》的毒太深,有什么好剧可缓解毒性发作? U盘 无法格式化 而且里面的毒太厉害了 一插机器... 监控系统如何设计 男朋友嘴太毒太贱,很讨人厌怎么办 组态王监控界面设计是什么软件 肝毒不清浑身病,哪些信号肝毒太深,1招快速排肝毒? 我有一套让人眼前一亮的视屏监控软件界面设计,想... 手上长了好多小水泡好痒,都快半年了,医生说是我... 种毒太深 求助毕业设计 MCGS组态软件 温湿度监控界面设计的问题 卡巴斯基杀一起毒太久如何解决? 如何监控200台设备的运行人机界面设计 给一个小区监控的图纸 如何进行设计 放置什么类型 win7恶意软件启用administrator,我禁用后又出现,... 怎样选择适合的舆情监控软件? Autorun这毒太牛了..谁能制服他? 高分悬赏.! 犯小人了怎么破,隔壁邻居嘴太毒太碎,怎么破这个... 做监控设计必备哪些软件? 中毒太深代表什么意思啊?? 求网络监控系统设计数据流图的资料(好则追30分)