首页 > 技术文章 > Python学习day16 监控系统

syother 2017-07-17 22:58 原文

Created on 2017年7月14日

第1课 本节内容介绍 5Minutes
毕业项目功能介绍
架构讲解
CMDB开发

上节作业:
将客户端发来的数据存放到后台并记录到日志中

 

第2课 CMDB拾遗之Agent开发 35Minutes
将Try的功能单独放在一个类中,并对类中的数据进行封装,以后直接调用类,用于判断

#可以定义一个类,用来封装一些值,用于后续方法的判断,这样可以不用写太多的Try。
class BaseResponse():
def __init__(self):
self.status = False
self.data = None
self.error = ''

#这里引用上面的类,Try,出错则将相应的值放到类中,便于下面的调用
def check_hostname():
response = BaseResponse()
try:
hostname = os.environ['computername']
response.status = True
response.data = hostname
except Exception,e:
response.error = e.message

return response

#直接调用类中的值,来做进一步流程控制
def show():
result = check_hostname()
if result.status:
print result.data
print 'ok'
else:
print result.error

show()

 

第3课 CMDB拾遗之API开发 63Minutes

服务器信息:
{'hostname':'',
'sn':'',
'model':''
'cpu':'',
'nic':{
status:0,--这里可能用于判断,如果为0则不更新
data:{
eth1:{ip:xx,mac:xxx}
}
}
}

}

第4课 Django扩展之自定义HttpRequest 34Minutes

可以通过断点的方式向上追查哪个程序调用
这里可以通过查看Request来检查POST和GET的来源配置
这样就可以继承POST的源类,自己可以定义一个新类,用于写PUT的信息
就可以做到自定义一个新的HttpRequest的方式

可以通过request.POST找到下面的方法,更改就行:
def _load_post_and_files(self):
"""Populate self._post and self._files if the content-type is a form type"""
if self.method != 'POST':
self._post, self._files = QueryDict(encoding=self._encoding), MultiValueDict()
return
if self._read_started and not hasattr(self, '_body'):
self._mark_post_parse_error()
return
elif self.content_type == 'application/x-www-form-urlencoded':
self._post, self._files = QueryDict(self.body, encoding=self._encoding), MultiValueDict()
else:
self._post, self._files = QueryDict(encoding=self._encoding), MultiValueDict()


第5课 监控系统架构分析 42Minutes

可分布式的C/S架构监控
可自定义监控模板/监控插件
WEB罗布展示/监控画图
监控画图的历史数据如何最小化存储又不失真

Client Agent:
1.从服务器获取模板,通过Hostname
2.得到插件,监控数据
3.生成报警信息
4.发送数据到API
API:
1.处理并保存信息
2.报警策略
后台管理:
1.生成各种图表
2.基本信息管理
3.调用其他API


第6课 监控系统之Agent开发 16Minutes

#监控基中一个Agent的写法:
import commands
def load_monitor():
shell_command = 'uptime'
status,result = commands.getstatusoutput(shell_command)
if status != 0:
value_dic = {'status':status}
else:
value_dic = {}
uptime = result.split(',')[:1][0]
load1,load5,load15 = result.split('load average:')[1].split[',']
value_dic = {
'uptime':uptime,
'load1':load1,
'load5':load5,
'load15':load15,
'status':status
}
return value_dic



#-----------------------index.py----------------
template = {}

while True:
for key,value in config.items():
currenttime,interel,lasttime = time.time(),value['interval'],value['last_time']
if currenttime-lasttime < interval:
pass
else:
plugin_name = value['plugin_name']
func = getattr(plugin_api,plugin_name)
data = func()
print data
congig[key]['last_time'] = currenttime
time.sleep(10)


第7课 监控系统之数据库表结构设计一 13Minutes
第8课 监控系统之数据库表结构设计二 21Minutes
第9课 监控系统之数据库表结构设计三 17Minutes
一堆的表,表套表
主要4张表:
监控项: Items
监控服务:service
服务模板:service_template
阀值:condition

第10课 监控系统之API开发 26Minutes

#--------get_config--------------------------------------------

def get_config(request):
ret = {'status':0,'data':'','message':''}
try:
data = {}
hostname = request.GET.get('hostname',None)
if not hostname:
return HttpResponse(json.dumps(ret))
hostObj = models.Host.objects.get(hostname=hostname)
hostname = hostObj.hostname
host_group = hostObj.group
service_templates = host_group.servie_template.all()
for item in service_templates:
temp = {}
temp['last_time'] = 0
temp['interval'] = item.check_interval
temp['plugin_name'] = item.service.plugin
temp['element'] = {}

for cond in item.conditions.all():
item_key = cond.item.key
if temp['element'].has_key(item.key):
temp['element'][item_key].append(object)
else:
temp['element'][item_key]= [{}]
data[item.key] = temp
ret['data'] = data
ret['statis'] = 1


第11课 监控系统之完善Agent功能 10Minutes

while True:
for key,value in config.items():
currenttime,interel,lasttime = time.time(),value['interval'],value['last_time']
if currenttime-lasttime < interval:
pass
else:
plugin_name = value['plugin_name']
func = getattr(plugin_api,plugin_name)
data = func()
#根据获取的值和阀值做比对
#将值和信息一起发给API
print data
congig[key]['last_time'] = currenttime
time.sleep(10)

--------------------------------------------------------
def submit_data(self,host,port,source,params,timeout):
headers = {"Content-type": "application/x-www-form-urlencoded",
"Accept": "text/plain"}
try:
conn = httplib.HTTPConnection(host,port,timeout)
conn.request('POST',source,params,headers)
response = conn.getresponse()
original = response.read()
except Exception,e:
raise e
return original
'''
等同于上面的代码
url_str = 'http://%s%s'%(host,url_path)
data = urllib.urlencode(service_data)
req = urllib2.urlopen(url_str,data)
result = req.read()


第12课 监控系统之EasyUI和Highstock的使用 21Minutes

EasyUI更好用,比Bootstarp更少些
Highcharts

第13课 监控系统之结束语 2Minutes

 

 

 

 

 

 

 

推荐阅读