基于类和redis的监控系统开发
最近学习python运维开发,编写得一个简单的监控系统,现记录如下,仅供学习参考。
整个程序分为7个部分:
第一个部分根据监控架构设计文档架构如下:
.
├── m_client
│ ├── config
│ │ ├── __init__.py
│ │ └── __init__.pyc
│ ├── core
│ │ ├── client.py
│ │ ├── client.py~
│ │ ├── global_setting.py
│ │ ├── global_setting.py~
│ │ ├── global_setting.pyc
│ │ ├── __init__.py
│ │ ├── plugin_api.py
│ │ ├── plugin_api.py~
│ │ ├── plugin_api.pyc
│ │ ├── redis_connector.py
│ │ └── redis_connector.pyc
│ ├── __init__.py
│ └── plugins
│ ├── assetsCollection
│ │ ├── hardinfor.txt
│ │ ├── xml2json.py
│ │ └── xml2json.pyc
│ ├── assetsCollect_linux.py
│ ├── assetsCollect.py
│ ├── assetsCollect.pyc
│ ├── assets.py
│ ├── assets.pyc
│ ├── cpu.py
│ ├── cpu.py~
│ ├── cpu.pyc
│ ├── disk.py
│ ├── __init__.py
│ ├── __init__.pyc
│ ├── json.txt
│ ├── load.py
│ ├── load.pyc
│ ├── logical_disk.py
│ ├── memory.py
│ ├── memory.pyc
│ ├── mem.py
│ ├── mem.pyc
│ ├── netinfo.py
│ ├── old
│ │ ├── cpu.py
│ │ ├── disk.py
│ │ ├── logical_disk.py
│ │ ├── memory.py
│ │ ├── netinfo.py
│ │ ├── physical_disk.py
│ │ └── sys_Info.py
│ ├── physical_disk.py
│ ├── result_deal.py
│ ├── result_deal.pyc
│ ├── sys_Info.py
│ ├── upCheck.py
│ ├── upCheck.pyc
│ ├── win_cpu.py
│ ├── win_cpu.pyc
│ ├── xml2json.py
│ └── xml2json.pyc
└── m_server
├── config
│ ├── host.py
│ ├── host.py~
│ ├── host.pyc
│ ├── __init__.py
│ ├── __init__.pyc
│ ├── services
│ │ ├── generic.py
│ │ ├── generic.py~
│ │ ├── generic.pyc
│ │ ├── __init__.py
│ │ ├── __init__.pyc
│ │ ├── linux.py
│ │ ├── linux.pyc
│ │ └── liunx.py~
│ ├── templates.py
│ ├── templates.py~
│ └── templates.pyc
├── core
│ ├── global_setting.py
│ ├── global_setting.py~
│ ├── global_setting.pyc
│ ├── main_server.py
│ ├── main_server.py~
│ ├── redis_connector.py
│ └── redis_connector.pyc
└── __init__.py
第二部分自定义监控内容:
#!/usr/bin/env python
#coding:utf-8
from generic import DefaultService
'''
class ngnix(DefaultService):
name = "Ngnix status"
interval = 30
triggers ={
'alive': [int , 1]
}
'''
class cpu(DefaultService):
name = 'cpu'
interval = 30
plugin_name = 'cpu_info'
triggers = {
'iowait': ['percentage', 5.5,90],
'system': ['percentage', 5,90],
'idle': ['percentage', 20,10],
'user': ['percentage', 80,90],
'steal': ['percentage', 80,90],
'nice': [None, 80,90],#进程评级
}
graph_index ={#画图
'index' :['iowait','system','idle','user'],
'title' :'CPU usage',
}
lt_operator = ['idle']
class load(DefaultService):
name = 'load'
interval = 300
plugin_name = 'load_info'
triggers = {
'uptime': ['string', 'd',90],
#'ptime': ['string', 'd',90],
'load1': [int, 4,9],
'load5': [int, 3,7],
'load15': [int, 3,9],
}
graph_index = {
'index':['load1', 'load5', 'load15'],
'title': 'Load status' ,
}
class memory(DefaultService):
name = 'memory'
plugin_name = 'mem_info'
triggers = {
'SwapUsage_p':['percentage', 66, 91],
'MemUsage_p': ['percentage', 68, 92],
'MemUsage': [None, 60, 65],
}
graph_index = {
'index': ['MemUsage','SwapUsage'],
}
第三部分:设计模板
#!/usr/bin/env python
#coding:utf-8
from services import generic, linux
class BaseTemplate:
name = None
alert_policy = None
groups = None
hosts = None
ip=None
port=None
services = None
os =None
class LinuxGeneralServices(BaseTemplate):
name = 'Linux General Services'
groups = ['TestGroup',]
#hosts = ['localhost','www.baidu.com']
services = {
'cpu': linux.cpu(),#这样和别的类相连
'memory': linux.memory(),
'load': linux.load(),
'upCheck': generic.upCheck(),
}
class WindowsGeneralService(BaseTemplate):
name = 'Windows General Services'
#groups = ['BJ']
hosts = ['localhost','www.baidu.com']
services = {
'load': linux.load(),
'memory': linux.memory(),
'cpu': linux.cpu(),
}
enabled_templates =(
LinuxGeneralServices(),
WindowsGeneralService()
#TestBaseTemplate(),
)
第四部分:设置主机服务实例化
#!/usr/bin/env python
#coding:utf-8
import templates
import copy
#host h1
h1=templates.LinuxGeneralServices()
h1.services = copy.deepcopy(h1.services)
h1.services['cpu'].triggers= copy.deepcopy(h1.services['cpu'].triggers)
h1.name = 'yue'
h1.ip = '192.168.1.3'
h1.port = 22
h1.os='ubuntu 15.0.4'
h1.services['cpu'].interval = 40
h1.services['cpu'].triggers['iowait'] = ['percentage', 20,50]#修改
#print h1.services['cpu']
#host h2
h2 = templates.LinuxGeneralServices()
h2.services = copy.deepcopy(h2.services)
h2.services['cpu'].triggers= copy.deepcopy(h2.services['cpu'].triggers)
h2.name = 'ubuntu'
h2.ip = '192.168.76.144'
h2.port = 8000
h2.os='ubuntu 16.0.4'
h2.services['cpu'].triggers['system'] = [int, 80,90]
monitored_hosts = (
h1, h2
)
第五部分:配置环境变量及编写连接reids服务代码
#!/usr/bin/env python
#coding:utf-8
import os,sys
#BASE_DIR = os.path.dirname(os.path.dirname(__file__))
BASE_DIR = '/home/xxxx/桌面/day7/monitor/m_server/'
sys.path.append(BASE_DIR)#添加到环境变量
#!/usr/bin/env python
import redis
r = redis.Redis(host='localhost', port=6379, db=0)
第六部分:使用redis订阅和发布功能,并且写好接收来自客户端的消息
#!/usr/bin/env python
#coding:utf-8
import global_setting
from config import host
import redis_connector as redis
import json
def push_configure_data_to_redis():
for h in host.monitored_hosts:
config_dic={}
for k,v in h.services.items():
config_dic[k]=[v.interval,v.plugin_name,0]#0是为起始初始时间
print config_dic
redis.r['configuration::%s'%h.name]=json.dumps(config_dic)#dumps至redis
#push_configure_data_to_redis()
#第二部分接收客户端发来的消息
count =0
channel ='chan_103'
msg_queue=redis.r.pubsub()#bind listen instance
msg_queue.subscribe(channel)
msg_queue.parse_response()
while True:
data=msg_queue.parse_response()
#print data
print 'round %s::'%count,json.loads(data[2])
count+=1
第七部分客户端编写
首先根据插件集编写相应的插件,简单的插件集如下:
import global_setting
from plugins import upCheck,cpu,load,memory
def upCheck_info():
return upCheck.monitor()
def cpu_info():
data = cpu.monitor()
#print data
return data
def load_info():
data =load.monitor()
#print data
return data
def mem_info():
return memory.monitor()
#load_info()
然后编写从reids取配置及把消息异步发送到redis的程序模块
#!/usr/bin/env python
#coding:utf-8
import global_setting
import json
import time,sys
import threading
import plugin_api
import redis_connector as redis
name='yue'
channel='chan_103'
def pull_config_from_redis():
config_data=redis.r.get('configuration::%s'%name)
if config_data is not None:
config_data=json.loads(config_data)
else:
sys.exit('Error:could not find any config_data')
return config_data
#print pull_config_rom_redis()
def run(service_config):
service_name,interval,plugin_name=service_config
#print service_name,interval,plugin_name
plugin_func=getattr(plugin_api,plugin_name)
res=plugin_func()
#把数据发送服务端,但是必须标明主机名,所发送内容的分类及时间
c_time= str(time.strftime("%Y-%m-%d %H:%M:%X"))
data={'time':c_time,'hostname':name,'service_name':service_name,'data':res}
redis.r.publish(channel,json.dumps(data))
print res
return res
host_config=pull_config_from_redis()
'''
#多线程起来各自获取配置后运行起来监控
for k,v in host_config.items():
temp=(k,v[0],v[1])
#print temp
t=threading.Thread(target=run,args=(temp,))
t.start()
'''
while True:
for k,v in host_config.items():
interval,plugin_name,last_run=v
if(time.time()-last_run)>=interval:
t=threading.Thread(target=run,args=((k,interval,plugin_name),))
t.start()
#update time stamp
host_config[k][2]=time.time()
else:
next_run_time=interval-(time.time()-last_run)
print "\033[31;1m services %s will run in next %s..\033[0m"%(k,next_run_time)
time.sleep(1)#防止无限刷屏
基于类和redis的监控系统开发的更多相关文章
- Python之路,Day20 - 分布式监控系统开发
Python之路,Day20 - 分布式监控系统开发 本节内容 为什么要做监控? 常用监控系统设计讨论 监控系统架构设计 监控表结构设计 为什么要做监控? –熟悉IT监控系统的设计原理 –开发一个 ...
- 基于SSH框架的网上书店系统开发的质量属性
基于SSH框架的网上书店系统开发的质量属性 对于我的基于SSH框架的网上书店系统的开发要实现的质量属性有可用性.可修改性.性能.安全性.易用性和可测试性. 1.对于可用性方面的战术: 可用性(Avai ...
- 运维开发实践——基于Sentry搭建错误日志监控系统
错误日志监控也可称为业务逻辑监控, 旨在对业务系统运行过程中产生的错误日志进行收集归纳和监控告警.似乎有那么点曾相识?没错... 就是提到的“APM应用性能监控”.但它又与APM不同,APM系统主要注 ...
- 分布式监控系统开发【day37】:需求讨论(一)
本节内容 为什么要做监控? 常用监控系统设计讨论 监控需求讨论 如何实现监控服务器的水平扩展? 监控系统架构设计 一.为什么要做监控? 熟悉IT监控系统的设计原理 开发一个简版的类Zabbix监控系统 ...
- 基于SSH框架的在线考勤系统开发的质量属性
我要开发的是一个基于SSH框架的在线考勤系统. 质量属性是指影响质量的相关因素,下面我将分别从6个系统质量属性(可用性,易用性,可修改性,性能,安全性,可测试性)来分析我的系统,以及如何实现这些质量属 ...
- Python之分布式监控系统开发
为什么要做监控? –熟悉IT监控系统的设计原理 –开发一个简版的类Zabbix监控系统 –掌握自动化开发项目的程序设计思路及架构解藕原则 常用监控系统设计讨论 Zabbix Nagios 监控系统需求 ...
- 基于ssh框架的在线考试系统开发的质量属性
我做的系统是基于ssh框架的在线考试系统.在线考试系统有以下几点特性:(1)系统响应时间需要非常快,可以迅速的出题,答题.(2)系统的负载量也需要非常大,可以支持多人在线考试(3)还有系统的安全性也需 ...
- day26 分布式监控系统开发
本节内容 为什么要做监控? 常用监控系统设计讨论 监控系统架构设计 监控表结构设计 为什么要做监控? –熟悉IT监控系统的设计原理 –开发一个简版的类Zabbix监控系统 –掌握自动化开发项目的程序设 ...
- 基于邮件系统的远程实时监控系统的实现 Python版
人生苦短,我用Python~ 界内的Python宣传标语,对Python而言,这是种标榜,实际上,Python确实是当下最好用的开发语言之一. 在相继学习了C++/C#/Java之后,接触Python ...
随机推荐
- ubuntu彻底卸载搜狗拼音输入法
ubuntu彻底卸载搜狗拼音输入法,ubuntu安装搜狗输入法后如果觉得搜狗不是很适合自己,那应该怎么样彻底的卸载搜狗输入法呢?下面我们就来一步步彻底卸载掉搜狗输入法... 方法/步骤 1 找到安装的 ...
- js select onchange事件
<select id='a' name='a' onchange="javascript:alert('测试');">
- STM32 驱动12864液晶显示汉字、图片、画点、横线、竖线、斜线
我做本实验的软件平台为MDK软件,选用STM32VET6,12864液晶屏5v供电采用并行接法.之前本来想网上找一个现成的程序实验一下,但都没找到合适的,于是就自己编写了一个,最终可在12864液晶屏 ...
- cglib源码分析(四):cglib 动态代理原理分析
本文分下面三个部分来分析cglib动态代理的原理. cglib 动态代理示例 代理类分析 Fastclass 机制分析 一.cglib 动态代理示例 public class Target{ publ ...
- 线程间操作无效 progressBar2线程不能被访问
出现这个问题解决的方法有两种第一种就是使用 // Form1.CheckForIllegalCrossThreadCalls = false;//不对跨线程的调用 使用这个的时候是判断线程是否运行正常 ...
- frameset和iframe--框架对象及元素标签对象
chrome不兼容:不支持跨frame的变量的获取 var oParent = parent.document.getElementById('contentFrm'); //frameset标签对象 ...
- shell脚本结构示例1
2013年以来自己因为偷懒,少写了很多东西,今年计划把以前积累的总结出来. 先从shell开始写起吧. 干了快3年游戏运维,期间经常会写一些shell本,不少脚本其实有很多可以复用的部分. 按照自己的 ...
- Orchard 学习-手动安装Orchard
通过Orchard zip 文件手动配置网站 这篇文章将引导你如果通过Zip文件来安装Orchard. 我们会使用三种不同的方法来承载Orchard: IIS. WebMatrix and IIS E ...
- CAS 单点登录,通过ticket 获取登录用户
string url =SSOValidate+"?service=" + WebValidate + "&ticket=" + Ticket + &q ...
- 关于Handler与异步消息处理循环的摘抄
Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue 统一队列,终由Handler处理. Handler:处理者,负责Message的发送及处理.使用Ha ...