Python學習day16 監控系統

Created on 2017年7月14日shell

第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()json

 

第3課 CMDB拾遺之API開發 63Minutesapi

服務器信息:
{'hostname':'',
'sn':'',
'model':''
'cpu':'',
'nic':{
status:0,--這裏可能用於判斷,若是爲0則不更新
data:{
eth1:{ip:xx,mac:xxx}
}
}
}

}服務器

第4課 Django擴展之自定義HttpRequest 34Minutes架構

能夠經過斷點的方式向上追查哪一個程序調用
這裏能夠經過查看Request來檢查POST和GET的來源配置
這樣就能夠繼承POST的源類,本身能夠定義一個新類,用於寫PUT的信息
就能夠作到自定義一個新的HttpRequest的方式app

能夠經過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 post

可分佈式的C/S架構監控
可自定義監控模板/監控插件
WEB羅布展現/監控畫圖
監控畫圖的歷史數據如何最小化存儲又不失真

Client Agent:
1.從服務器獲取模板,經過Hostname
2.獲得插件,監控數據
3.生成報警信息
4.發送數據到API
API:
1.處理並保存信息
2.報警策略
後臺管理:
1.生成各類圖表
2.基本信息管理
3.調用其餘APIurl


第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

相關文章
相關標籤/搜索