热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python写的一个简单监控系统

这篇文章主要介绍了Python写的一个简单监控系统,本文讲解了详细的编码步骤,并给给出相应的实现代码,需要的朋友可以参考下
市面上有很多开源的监控系统: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信息到页面上




  
    
    

    
    
    
  
  




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


推荐阅读
  • 通常情况下,修改my.cnf配置文件后需要重启MySQL服务才能使新参数生效。然而,通过特定命令可以在不重启服务的情况下实现配置的即时更新。本文将详细介绍如何在线调整MySQL配置,并验证其有效性。 ... [详细]
  • 利用Selenium与ChromeDriver实现豆瓣网页全屏截图
    本文介绍了一种使用Selenium和ChromeDriver结合Python代码,轻松实现对豆瓣网站进行完整页面截图的方法。该方法不仅简单易行,而且解决了新版Selenium不再支持PhantomJS的问题。 ... [详细]
  • Python自动化测试入门:Selenium环境搭建
    本文详细介绍如何在Python环境中安装和配置Selenium,包括开发工具PyCharm的安装、Python环境的设置以及Selenium包的安装方法。此外,还提供了编写和运行第一个自动化测试脚本的步骤。 ... [详细]
  • Python 内存管理机制详解
    本文深入探讨了Python的内存管理机制,涵盖了垃圾回收、引用计数和内存池机制。通过具体示例和专业解释,帮助读者理解Python如何高效地管理和释放内存资源。 ... [详细]
  • 目录一、salt-job管理#job存放数据目录#缓存时间设置#Others二、returns模块配置job数据入库#配置returns返回值信息#mysql安全设置#创建模块相关 ... [详细]
  • 本文详细介绍如何使用CSS自定义HTML5视频播放器的样式,涵盖常见属性及跨浏览器兼容性问题。发布时间:2020-09-14 14:46:29;来源:亿速云;阅读量:58;作者:小新。 ... [详细]
  • Appium + Java 自动化测试中处理页面空白区域点击问题
    在进行移动应用自动化测试时,有时会遇到某些页面没有返回按钮,只能通过点击空白区域返回的情况。本文将探讨如何在Appium + Java环境中有效解决此类问题,并提供详细的解决方案。 ... [详细]
  • 如何清除Chrome浏览器地址栏的特定历史记录
    在使用Chrome浏览器时,你可能会发现地址栏保存了大量浏览记录。有时你可能希望删除某些特定的历史记录而不影响其他数据。本文将详细介绍如何单独删除地址栏中的特定记录以及批量清除所有历史记录的方法。 ... [详细]
  • 简化报表生成:EasyReport工具的全面解析
    本文详细介绍了EasyReport,一个易于使用的开源Web报表工具。该工具支持Hadoop、HBase及多种关系型数据库,能够将SQL查询结果转换为HTML表格,并提供Excel导出、图表显示和表头冻结等功能。 ... [详细]
  • 探索新一代API文档工具,告别Swagger的繁琐
    对于后端开发者而言,编写和维护API文档既繁琐又不可或缺。本文将介绍一款全新的API文档工具,帮助团队更高效地协作,简化API文档生成流程。 ... [详细]
  • 本文探讨了在构建应用程序时,如何对不同类型的数据进行结构化设计。主要分为三类:全局配置、用户个人设置和用户关系链。每种类型的数据都有其独特的用途和应用场景,合理规划这些数据结构有助于提升用户体验和系统的可维护性。 ... [详细]
  • 气象对比分析
    本文探讨了不同地区和时间段的天气模式,通过详细的图表和数据分析,揭示了气候变化的趋势及其对环境和社会的影响。 ... [详细]
  • CSS高级技巧:动态高亮当前页面导航
    本文介绍了如何使用CSS实现网站导航栏中当前页面的高亮显示,提升用户体验。通过为每个页面的body元素添加特定ID,并结合导航项的类名,可以轻松实现这一功能。 ... [详细]
  • 本文详细介绍如何在 iOS 7 环境下申请苹果开发者账号,涵盖从访问开发者网站到最终激活账号的完整流程。包括选择个人或企业账号类型、付款方式及注意事项等。 ... [详细]
  • JSOI2010 蔬菜庆典:树结构中的无限大权值问题
    本文探讨了 JSOI2010 的蔬菜庆典问题,主要关注如何处理非根非叶子节点的无限大权值情况。通过分析根节点及其子树的特性,提出了有效的解决方案,并详细解释了算法的实现过程。 ... [详细]
author-avatar
H_debug
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有