#!/usr/bin/python # coding: utf-8 import psutil import time from datetime import * import os import rpyc import types loop=[] #时间格式 dt = datetime.now() date = dt.strftime('%Y-%m-%d-%H:%M:%S') ip="10.150.1.231" passwd='passwd01' cpu_use_percent_total = psutil.cpu_percent(interval=0.10000000000000001, percpu=False) cpu_use_percent_total_str = str (cpu_use_percent_total) #cpu_use_percent_total_data = {'type':'cpu_use_percent','description':'cpu_use_percent_total','value':cpu_use_percent_total_str,'tim':date,'ip':ip} cpu_use_percent_total_data = (ip,'cpu_use_percent','cpu_use_percent_total',cpu_use_percent_total,date) #print cpu_use_percent_total_data #print '========================================================' memory_use_percent = psutil.virtual_memory().percent memory_use_percent_str = str (memory_use_percent) #memory_use_percent_data = {'type':'memory_use_percent','description':'memory_use_percent','value':memory_use_percent_str,'tim':date,'ip':ip} memory_use_percent_data = (ip,'memory_use_percent','memory_use_percent',memory_use_percent,date) #print memory_use_percent_data #print '========================================================' disk_use_percent_data_all = [] for i in psutil.disk_partitions(): disk_use_percent = psutil.disk_usage(i[1]).percent disk_use_percent_str = str (disk_use_percent) # disk_use_percent_data = {'type':'disk_use_percent','description':'disk_use_percent_'+str(i[1]),'value':disk_use_percent_str,'tim':date,'ip':ip} disk_use_percent_data = (ip,'disk_use_percent','disk_use_percent_'+str(i[1]),disk_use_percent,date) disk_use_percent_data_all.append(disk_use_percent_data) #print disk_use_percent_data_all #print '=========================================================+++++++++++++++++++++++++++++++++++++++++++++++' cpu_use_percent_total_data=('10.150.1.231', 'cpu_use_percent', 'cpu_use_percent_total', 90.0, '2013-08-29-18:36:19') loop.append(cpu_use_percent_total_data) loop.append(memory_use_percent_data) loop.append(disk_use_percent_data_all) conn = rpyc.connect('10.150.1.230',9911) for i in loop: conn = rpyc.connect('10.150.1.230',9911) # 参数主要是host, port # test是服务端的那个以"exposed_"开头的方法 if isinstance(i,list): for j in i: conn = rpyc.connect('10.150.1.230',9911) print j cResult = conn.root.test(j,passwd) print cResult else: print i cResult = conn.root.test(i,passwd) print cResult
cfg.py
#!/usr/bin/python # coding: utf-8 #mawengang@2013.9.3 #告警阈值 warning_level={'cpu_use_percent':80,'memory_use_percent':80,'disk_use_percent':80} mysql_host='10.150.1.231' mysql_user='root' mysql_passwd='123456' mysql_port=3306 ## redis_host='10.150.1.231' redis_port=6379 redis_db=0 ## #重复告警时间间隔 set_expire_time=300 #建单后最短结单时间,防止短时间内反复建单结单 set_destroy_time=120 #设置基础时间,ttl低于此时间仍然接到告警消息将重置ttl至“expire_time(set_expire_time+base_ttl)“ #即时低于“base_ttl”仍然有“base_ttl”秒长的时间去重置告警时间,或者恢复告警通知。防止系统自动清除告警记录而无通知 #如果在“expire_time(set_expire_time+base_ttl)”超时仍然未接收到服务器的消息,系统自动清除告警记录而无通知 #"set_expire_time"超时后,告警记录仍然有”base_ttl“秒的销毁超时时间。在此时间内如果系统仍然收到超过预警阈值消息则重复告警并重置”set_expire_time“,如果收到未超过预警阈值消息则说明服务器正常(因为低于base_ttl肯定已经超过了”set_expire_time“,而set_expire_time肯定大于set_destroy_time) base_ttl=600 ## passwdserver='passwd01' local_ip='10.150.1.230' mobiles='13439735956' contents='测试-刚刚'
mmonitor_master.py
#!/usr/bin/python # coding: utf-8 #mawengang@2013.9.3 import string #from contrast import * from rpyc import Service from rpyc.utils.server import ThreadedServer from cfg import * import MySQLdb import threading import time import sys import os #passwdserver='passwd01' ##local_ip='10.150.1.230' ##mobiles='13439735956' ##contents='测试-刚刚' ################## class smsx(object): def __init__(self,local_ip,mobiles,contents): self.local_ip=local_ip self.mobiles=mobiles self.contents=contents def get_local_ip(self,ifname = 'eth0'): import socket, fcntl, struct s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) inet = fcntl.ioctl(s.fileno(), 0x8915, struct.pack('256s', ifname[:15])) ret = socket.inet_ntoa(inet[20:24]) return ret def md5(self,str99): import hashlib h=hashlib.md5() h.update(str99) return h.hexdigest() def curl(self,urlx): import pycurl,cStringIO buf = cStringIO.StringIO() c = pycurl.Curl() c.setopt(c.URL, urlx) c.setopt(c.WRITEFUNCTION, buf.write) c.perform() a = buf.getvalue() buf.close() return a def sms(self): import time key = '81485dc39c9e70c0b0e35eda70a188f8' appid = '3' ## mobiles = '13439735956' ## contents = '测试a' time1 = time.time() time2 ="%f"%time1 ## ip = get_local_ip("eth0") str1 = appid+self.mobiles+self.contents+time2+self.local_ip+key sign = self.md5(str1) url = "http://sms.youyoule.com:8888/sendsms.php?appid="+appid+"&mobiles="+self.mobiles+"&contents="+self.contents+"&time="+time2+"&ip="+self.local_ip+"&sign="+sign a = self.curl(url) print url return a ##################### def mysql_write_data(valuex): conn_mysql=MySQLdb.connect(host=mysql_host,user=mysql_user,passwd=mysql_passwd,port=mysql_port) cur=conn_mysql.cursor() # cur.execute('create database if not exists monitor') conn_mysql.select_db('monitor') # cur.execute('create table if not exists monitor_data(Id int primary key AUTO_INCREMENT,ip varchar(50),type varchar(50),description varchar(50),monitor_value FLOAT,time_fromserver datetime,time_localwrite TIMESTAMP)') sql='insert into monitor_data(ip,type,description,monitor_value,time_fromserver) values(%s,%s,%s,%s,%s)' cur.execute(sql,valuex) conn_mysql.commit() cur.close() conn_mysql.close() def warning(valuex): import redis import time # time.sleep(20) connect = redis.Redis(host=redis_host,port=redis_port,db=redis_db) ## warning_level={'cpu_use_percent':80,'memory_use_percent':80,'disk_use_percent':80} keys=valuex[0:3] now_ttl=connect.ttl(keys) #获取当前时间戳 timex=time.time() ###################################### #设置基础时间,ttl低于此时间仍然接到告警消息将重置ttl至“expire_time(set_expire_time+base_ttl)“ #即时低于“base_ttl”仍然有“base_ttl”秒长的时间去重置告警时间,或者恢复告警通知。防止系统自动清除告警记录而无通知 #如果在“expire_time(set_expire_time+base_ttl)”超时仍然未接收到服务器的消息,系统自动清除告警记录而无通知 ## base_ttl=600 #建单后最短结单时间(秒)防止重复建单 ## set_destroy_time=120 destroy_time=base_ttl+set_destroy_time #两次相同告警间隔时间(重新建单时间)(秒) ## set_expire_time=300 if set_destroy_time>=set_expire_time: print "set_destroy_time必须小于set_expire_time" os._exit(0) expire_time=set_expire_time+base_ttl ###################################### datax=valuex[3] warning_levelx=warning_level[valuex[1]] if datax >= warning_levelx: print '超过告警阈值' if now_ttl<base_ttl: print '告警,发送消息通知出现告警,建单,记录日志' ##发送告警消息 contents='引发告警:'+valuex[0]+'_'+valuex[2]+':'+str(valuex[3])+'%'+','+valuex[4] sms_send=smsx(local_ip,mobiles,contents) result=sms_send.sms() print result ##记录redis connect.set(keys,timex) connect.expire(keys,expire_time) else: print '告警冲动...两次告警间隔不低于%s秒,前建单时长%s秒'%(set_expire_time,expire_time-now_ttl) else: if now_ttl<base_ttl: print '服务器正常' else: #最短结单时间不得低于“destroy_time,防止频繁建单结单” if expire_time-now_ttl<set_destroy_time: print '服务器恢复冲动...最短结单时间%s秒,当前建单时长%s秒'%(set_destroy_time,expire_time-now_ttl) else: connect.delete(keys) print '务器恢复正常,发送消息通知告警恢复,结单,记录日志' contents='告警恢复:'+valuex[0]+'_'+valuex[2]+':'+str(valuex[3])+'%'+','+valuex[4] sms_send=smsx(local_ip,mobiles,contents) result=sms_send.sms() #多进程调用 #def diaoyong(valuex): # import os ## mysql_write_data(valuex) # pid = os.fork() # if pid == 0: # mysql_write_data(valuex) # warning(valuex) #多线程调用 class MyThread(threading.Thread): def run(self): mysql_write_data(self.valuex) warning(self.valuex) #建立SOCKET端口 class TestService(Service): # 对于服务端来说, 只有以"exposed_"打头的方法才能被客户端调用,所以要提供给客户端的方法都得加"exposed_" def exposed_test(self,valuex,passwd): if (passwd==passwdserver): # dyong(data) t = MyThread() t.valuex=valuex t.start() return "yes" else: return "no" sr = ThreadedServer(TestService, port=9911, auto_register=False) sr.start()