其实也是在easyhadoop做第二次重构的时候用到了这个嵌入式的webserver去做服务器状态的监控,可以单独摘出来写个东西。

思路主要是用python脚本获取linux服务器的各种状态信息,然后用webserver的方式,以json数据发给http,主控节点去读取webserver返回的json,生成系统监控报表。代码简单,开发和部署都很方便。

用到的主要东西是python的第三方嵌入式web模块叫cherrypy,之所以选择cherrypy,主要原因就是开发快速,学习也很快,基本我用了一天多就基本学会了怎么来写了。当然,也可以用python自带的simpleHTTPserver。不过那个确实太simple了。cherrypy的优点在于,多线程,多并发。又不像Tornado和Django那样重量级。因为我们返回的是json,也用不到什么html模板,数据库的功能。当然也可以选择web.py,不过相比还是cherrypy更好一点我认为,web.py也借鉴了cherrypy不少的思想。

其实我的集群里都装了Ganglia, Cacti, Nagios。但是我想看实时的图表生成,就自己写了这样一段程序。做自动化运维的朋友可以当一个参考,添加自己的方法,监控别的也是可以的。

主要流程是这样:

想办法读取Linux系统的各种数据  --->  解析数据转成json发给http服务器  --->  监控服务器扫描数据生成图表

#!/usr/bin/python
# -*- coding: utf8 -*-
import sys
import cherrypy
import platform
import os
import time
#python 2.4为simplejson,python 2.6以上为json
try:import json
except ImportError:import simplejson as json#假装做一个index出来
class Index(object):#下面这句表示修饰index方法,这个index方法是暴露给http server的@cherrypy.exposedef index(self):return "hello cherrypy"class Node(object):'''url /node/dist/'''#获取目标机器的发行分支,版本号,架构类型,主机名称等等,返回json@cherrypy.exposedef dist(self):dist_json = ''sysinstaller = ''installer = ''ostype = platform.dist()if(ostype[0] in ['Ubuntu','debian','ubuntu','Debian']):sysinstaller = 'apt-get'installer = 'dpkg'elif(ostype[0] in ['SuSE']):sysinstaller = 'zypper'installer = 'rpm'elif(ostype[0] in ['CentOS', 'centos', 'redhat','RedHat']):sysinstaller = 'yum'installer = 'rpm'machine = platform.machine()hostname = platform.node()dist_json = {'os.system':ostype[0], 'os.version':ostype[1], 'os.release':ostype[2], 'os.sysinstall':sysinstaller, 'os.installer':installer, 'os.arch':machine, 'os.hostname':hostname}return json.dumps(dist_json, sort_keys=False, indent=4, separators=(',', ': '))'''url /node/GetCpuInfo/'''#获取CPU型号等,返回json@cherrypy.exposedef GetCpuInfo(self):cpu = []cpuinfo = {}f = open("/proc/cpuinfo")lines = f.readlines()f.close()for line in lines:if line == 'n':cpu.append(cpuinfo)cpuinfo = {}if len(line) < 2: continuename = line.split(':')[0].strip().replace(' ','_')var = line.split(':')[1].strip()cpuinfo[name] = varreturn json.dumps(cpuinfo, sort_keys=False, indent=4, separators=(',', ': '))'''url /node/GetMemInfo/'''#获取内存使用的详细信息@cherrypy.exposedef GetMemInfo(self):mem = {}f = open("/proc/meminfo")lines = f.readlines()f.close()for line in lines:if len(line) < 2:continuename = line.split(':')[0]var = line.split(':')[1].split()[0]mem[name] = long(var) * 1024.0mem['MemUsed'] = mem['MemTotal'] - mem['MemFree'] - mem['Buffers'] - mem['Cached']return json.dumps(mem, sort_keys=False, indent=4, separators=(',', ': '))'''url /node/GetLoadAvg//'''#获取系统负载的详细信息@cherrypy.exposedef GetLoadAvg(self):loadavg = {}f = open("/proc/loadavg")con = f.read().split()f.close()loadavg['lavg_1']=con[0]loadavg['lavg_5']=con[1]loadavg['lavg_15']=con[2]loadavg['nr']=con[3]loadavg['last_pid']=con[4]return json.dumps(loadavg, sort_keys=False, indent=4, separators=(',', ': '))'''url /node/GetIfInfo/eth(x)'''获取指定网卡的流量信息,这里面有点复杂@cherrypy.exposedef GetIfInfo(self, interface):dist_json = self.dist()f = open("/proc/net/dev")lines = f.readlines()f.close()intf = {}for line in lines[2:]:con = line.split()#if部分是给centos使用的,centos在流量大的情况下,网卡信息里面字符串会连上,所以需要单独拆分处理,else部分则是ubuntu或者其他系统格式化很好的使用if con[0][-1].isdigit() == True:offset = con[0].split(':')intf['interface'] = str(offset[0])intf['ReceiveBytes'] = str(offset[1])intf['ReceivePackets'] = str(con[1])intf['ReceiveErrs'] = str(con[2])intf['ReceiveDrop'] = str(con[3])intf['ReceiveFifo'] = str(con[4])intf['ReceiveFrames'] = str(con[5])intf['ReceiveCompressed'] = str(con[6])intf['ReceiveMulticast'] = str(con[7])intf['TransmitBytes'] = str(con[8])intf['TransmitPackets'] = str(con[9])intf['TransmitErrs'] = str(con[10])intf['TransmitDrop'] = str(con[11])intf['TransmitFifo'] = str(con[12])intf['TransmitFrames'] = str(con[13])intf['TransmitCompressed'] = str(con[14])intf['TransmitMulticast'] = str(con[15])else:intf['interface'] = str(con[0])intf['ReceiveBytes'] = str(con[1])intf['ReceivePackets'] = str(con[2])intf['ReceiveErrs'] = str(con[3])intf['ReceiveDrop'] = str(con[4])intf['ReceiveFifo'] = str(con[5])intf['ReceiveFrames'] = str(con[6])intf['ReceiveCompressed'] = str(con[7])intf['ReceiveMulticast'] = str(con[8])intf['TransmitBytes'] = str(con[9])intf['TransmitPackets'] = str(con[10])intf['TransmitErrs'] = str(con[11])intf['TransmitDrop'] = str(con[12])intf['TransmitFifo'] = str(con[13])intf['TransmitFrames'] = str(con[14])intf['TransmitCompressed'] = str(con[15])intf['TransmitMulticast'] = str(con[16])return json.dumps(intf, sort_keys=False)#获取全部网卡的接口和流量信息@cherrypy.exposedef GetIfTraffic(self):ifs = []nettraffic = {}f = open("/proc/net/dev")lines = f.readlines()f.close()for line in lines[2:]:con = line.split()ifname = con[0].split(':')if(ifname[0].strip() != 'lo'):ifs.append(ifname[0].strip())else:continuefor interface in ifs:nettraffic[interface] = self.GetIfInfo( interface)return json.dumps(nettraffic)#获取硬盘的分区信息和使用量@cherrypy.exposedef GetHddInfo(self):hdds = []mount = {}file_system = []type = []size = []used = []avail = []used_percent = []mounted_on = []hdds = os.popen('df -lhT  | grep -v tmpfs | grep -v boot | grep -v usr | grep -v tmp | sed \'1d;/ /!N;s/\\n//;s/[ ]*[ ]/\\t/g;\'').readlines()for line in hdds:file_system.append(line.replace('\\n','').replace('\\t',' ').split()[0])type.append(line.replace('\\n','').replace('\\t',' ').split()[1])size.append(line.replace('\\n','').replace('\\t',' ').split()[2])used.append(line.replace('\\n','').replace('\\t',' ').split()[3])avail.append(line.replace('\\n','').replace('\\t',' ').split()[4])used_percent.append(line.replace('\\n','').replace('\\t',' ').split()[5])mounted_on.append(line.replace('\\n','').replace('\\t',' ').split()[6])mount['file_system'] = file_systemmount['type'] = typemount['size'] = sizemount['used'] = usedmount['avail'] = availmount['used_percent'] = used_percentmount['mounted_on'] = mounted_ondist_json = json.dumps(mount)return dist_json#获取CPU的使用量信息,需要系统安装sysstat支持@cherrypy.exposedef GetCpuDetail(self):dist_json = self.dist()dist = json.loads(dist_json)if(dist['os.system'] in ['CentOS', 'centos', 'redhat', 'RedHat']):if(int(dist['os.version'].split('.')[0])  < 6):  #For CentOS onlycmd = 'mpstat 1 1 | sed \'1d;2d;3d;4d\' | awk \'{print "{\\\"user\\\":\\\"\"$3\"\\\",\\\"nice\\\":\\\"\"$4\"\\\",\\\"sys\\\":\\\"\"$5\"\\\",\\\"iowait\\\":\\\"\"$6\"\\\",\\\"irq\\\":\\\"\"$7\"\\\",\\\"soft\\\":\\\"\"$8\"\\\",\\\"steal\\\":\\\"\"$9\"\\\",\\\"idle\\\":\\\"\"$10\"\\\"}"}\''else:cmd = 'mpstat 1 1 | sed \'1d;2d;3d;4d\' | awk \'{print "{\\\"user\\\":\\\"\"$3\"\\\",\\\"nice\\\":\\\"\"$4\"\\\",\\\"sys\\\":\\\"\"$5\"\\\",\\\"iowait\\\":\\\"\"$6\"\\\",\\\"irq\\\":\\\"\"$7\"\\\",\\\"soft\\\":\\\"\"$8\"\\\",\\\"steal\\\":\\\"\"$9\"\\\",\\\"idle\\\":\\\"\"$11\"\\\"}"}\''else:cmd = 'mpstat 1 1 | sed \'1d;2d;3d;4d\' | awk \'{print "{\\\"user\\\":\\\"\"$3\"\\\",\\\"nice\\\":\\\"\"$4\"\\\",\\\"sys\\\":\\\"\"$5\"\\\",\\\"iowait\\\":\\\"\"$6\"\\\",\\\"irq\\\":\\\"\"$7\"\\\",\\\"soft\\\":\\\"\"$8\"\\\",\\\"steal\\\":\\\"\"$9\"\\\",\\\"idle\\\":\\\"\"$11\"\\\"}"}\''cpu = os.popen(cmd).readline().strip()return cpu
if "__main__" == __name__:#服务器配置settings = {'global': {#绑定端口'server.socket_port' : 60090,#ip地址设置,觉得够安全就用0.0.0.0,否则就单独写那台服务器的ip'server.socket_host': '0.0.0.0','server.socket_file': '','server.socket_queue_size': 100,'server.protocol_version': 'HTTP/1.1','server.log_to_screen': True,'server.log_file': '','server.reverse_dns': False,'server.thread_pool': 200,'server.environment': 'production','engine.timeout_monitor.on': False}}#使用配置和映射路由并启动webservercherrypy.config.update(settings)cherrypy.tree.mount(Index(), '/')cherrypy.tree.mount(Node(), '/node')cherrypy.engine.start()

图表生成端随便拿什么语言写就无所谓了,反正数据都是json格式的。

当然,我也用他监控hadoop和hbase。代码加点跟hadoop和hbase相关的就可以了。

转载于:https://blog.51cto.com/slaytanic/1207929

基于嵌入式webserver的服务器状态监控相关推荐

  1. pi数据库系统中国服务器,基于PI数据库的服务器实时监控系统研究与开发

    摘要: 随着智能电网发展战略的提出,电力系统信息化程度的不断提高,电力企业信息系统的服务器.网络设备等信息设备越来越多,其重要性也越来越高.现行的信息系统的运行维护工作模式--信息值班员.系统管理员人 ...

  2. 闸机安装linux系统,基于嵌入式Linux的闸机监控系统设计

    摘要: 闸机监控系统,因其具备安全防范和人员管理功能,而被广泛应用于工厂自动化.安全保卫.物流管理等行业.同时,随着射频身份识别(RFID)技术和嵌入式技术的广泛应用,将三者结合使用,必会极大地提高闸 ...

  3. 怎么修改监控服务器的密码,服务器状态监控怎么设置密码

    服务器状态监控怎么设置密码 内容精选 换一换 本节操作介绍购买云耀云服务器的操作步骤.购买时,为减少您配置参数的时间,部分参数由系统自动分配,以下参数配置供你了解系统的默认配置.购买云耀云服务器仅支持 ...

  4. java项目实现服务器监控,Java实现服务器状态监控

    Java实现服务器状态监控 内容精选 换一换 云容器实例(Cloud Container Instance,CCI)服务提供 Serverless Container(无服务器容器)引擎,让您无需创建 ...

  5. 服务器状态监控app,服务器/网站连接状态监控工具

    本工具是监听服务器或者网站状态的工具,一次可以批量检测多个IP或者服务器,工具是由概念网络自主开发的,本工具为收费软件,没有免费版本下载,程序是用C#开发,需要.Net Framework 3.5及以 ...

  6. 【开源软件】服务器状态监控通知平台

    声明:   本文仅以学习交流为目的分享自己的开发成果,希望为更多人提供开发设计的思路,还请善待笔者的开发成果.有任何问题欢迎在文章下方留言或私信,也欢迎评论或私信指教,和大家共同进步! 1. Serv ...

  7. 基于嵌入式技术的网络视频监控系统

    随着计算机技术及网络技术的迅猛发展,世界掀起一股强大的数字化.网络化浪潮,对于公安.安防行业的发展,必须经历模拟数字混合的阶段,但是最终的趋势必然是全面数字化,即视频在前端进行数字化.网络化,采用嵌入 ...

  8. 服务器状态监控之一背景介绍及解决方案建议

    SCOM与SCVMM 一.背景介绍 XXX公司是一家外商独资企业,主要致力于高品质零售商用地产的投资.开发和管理,其在国内大部分一线及部分二级城市都有分公司或是连锁购中心,随着公司业务规模的不断壮大增 ...

  9. Jmeter压力测试简单教程(包括服务器状态监控)-----转载自lsoqvle 的博客(https://blog.csdn.net/cbzcbzcbzcbz/article/details/780)

    步骤一  安装Jmeter 我用的版本是3.1版本,为什么是3.1,因为3.2有问题,我也是跑了一段时间后才知道3.2版本太新了还是什么的,有些功能就是不行,在此建议大家,不要轻易使用最新版本,次新版 ...

最新文章

  1. Taro+react开发(36)每一个节点要一个view包裹
  2. 基于Java的数据采集(终结篇)
  3. python爬去中国天气网_python爬取中国天气网并展示最低温度
  4. [Python] L1-021. 重要的话说三遍-PAT团体程序设计天梯赛GPLT
  5. bootstrap 固定最底部_防腐木立柱怎么固定
  6. scrapy命令介绍
  7. 【软件工程】-项目开发计划
  8. FlashFXP v3.5.4注册码+FlashFXP v3.6.0注册码+FlashFXP v3.7.2.build.1266...
  9. matlab基于凹点匹配的分割算法,一种基于凹点匹配的重叠图像分割算法
  10. 阿里云 mysql 导出数据_mysql数据库导出数据库
  11. 星巴克在东京开设四层楼的全沉浸式优质咖啡体验门店
  12. ES2015 for of 循环
  13. postman传String类型参数时不能加双引号
  14. Revisiting Pixel-Wise Supervision for Face Anti-Spoofing
  15. un9.9:实现上报及上报状态修改功能。
  16. DevExpress控件学习总结 z
  17. 信息与通信工程——重要国际学术会议和国际顶级期刊(仅供参考)
  18. 静电耳机与普通动圈或动铁耳机有什么区别
  19. 一些常见的Java8 循环实例(筛选、基本函数使用,循环等)
  20. oracle sql常用的函数,界别Oracle和SQL Server常用函数

热门文章

  1. [字符串]与[数组]的互相转换
  2. linux集成开发环境
  3. Connection to node 0 (/192.168.204.131:9092) could not be established
  4. html中dd dt的效果,html中dt dd
  5. 表格过滤器_不用记账软件也可以记录支出明细,这个在线协同表格很方便
  6. android的热修复,Android热修复原理
  7. java redirect 跨域_如何解决跨域重定向携带参数的问题?不使用将参数拼接在重定向url末尾的方式...
  8. 设计模式之模版方法模式的钩子方法
  9. java中Map有哪些实现类
  10. 数据库:MySQL常见的设计规范误区