其主要目的是:基于 Python 編程語言來監控服務器的 CPU、內存、/目錄、/appslog、/bigdata目錄使用率以及網卡接收和發送情況。
該腳本部署場景分為:服務端和客戶端。
服務端:一臺固定 IP 地址的服務器
客戶端:N 臺指定固定 IP 地址的服務器
服務端腳本:
- - coding:utf-8 - -
import io
import os
import sys
import logging
from logging import handlers
import MySQLdb
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.utils import formataddr
import requests, json
import datetime
import time
import shutil,re
import uuid
import socket
import SocketServer
if sys.getdefaultencoding() != 'utf-8':
reload(sys)
sys.setdefaultencoding('utf-8')
class Logger(object):
level_relations = {
'debug': logging.DEBUG,
'info': logging.INFO,
'warning': logging.WARNING,
'error': logging.ERROR,
'crit': logging.CRITICAL
} # 日志級別關系映射
def init (self,logname, level='info', when='D', backCount=10, fmt='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'):
CURRENT_DIR = os.path.dirname(file)
LOG_FILE = os.path.abspath(os.path.join(CURRENT_DIR, logname))
self.logger = logging.getLogger(LOG_FILE)
format_str = logging.Formatter(fmt) # 設置日志格式
self.logger.setLevel(self.level_relations.get(level)) # 設置日志級別
sh = logging.StreamHandler() # 往屏幕上輸出
sh.setFormatter(format_str) # 設置屏幕上顯示的格式
th = handlers.TimedRotatingFileHandler(
filename=LOG_FILE, when=when, backupCount=backCount, encoding='utf-8') # 往文件里寫入#指定間隔時間自動生成文件的處理器
#實例化TimedRotatingFileHandler
#interval是時間間隔,backupCount是備份文件的個數,如果超過這個個數,就會自動刪除,when是間隔的時間單位,單位有以下幾種:
S 秒
M 分
H 小時、
D 天、
W 每星期(interval==0時代表星期一)
midnight 每天凌晨
th.setFormatter(format_str) # 設置文件里寫入的格式
#self.logger.addHandler(sh) # 把對象加到logger里
if not self.logger.handlers:
self.logger.addHandler(th)
class Analysis(object):
def buildMsg(self,msg):
print('構造預警信息'+str(msg))
icount = 0
if(float(msg[4]) > 90):
icount+=1
CPU ="> CPU預警:使用率高于90%,使用"+str(msg[4])+"% \\n"
else:
CPU=""
if(float(msg[5]) > 90):
icount+=1
mem ="> 內存預警:使用率高于90%,使用"+str(msg[5])+"% \\n"
else:
mem=""
if(float(msg[6]) > 85):
icount+=1
disk_root ="> 磁盤根目錄預警:使用率高于85%,使用"+str(msg[6])+"% \\n"
else:
disk_root=""
if(float(msg[7]) > 85):
icount+=1
disk_appslog ="> 業務磁盤預警:使用率高于85%,使用"+str(msg[7])+"% \\n"
else:
disk_appslog=""
if(float(msg[8]) > 3000):
icount+=1
networkRecv ="> 網卡10秒內接收數據預警:接收數據大于4000M,接收"+str(msg[8])+"M \\n"
else:
networkRecv=""
if(float(msg[9]) > 3000):
icount+=1
networkSend ="> 網卡10秒內發送數據預警:發送數據大于4000M,發送"+str(msg[9])+"M \\n"
else:
networkSend=""
s= alarmName+"\\n"+msg[2]+":" +msg[3]+"\\n" +CPU+mem+disk_root+disk_appslog+networkRecv+networkSend
#print(s)
log.logger.info('預警信息:'+s)
#發送預警
if(icount>0):
#發送預警郵件、企業微信
if mailconf ==1:
self.send_mail(s,msg[3])
if wxconf ==1:
self.send_WX(s)
def send_mail(self,content,ip):
smtpserver = 'smtp.163.com'
mail_user="xxx@163.com"
mail_pass="passwordxxx"
mail_res=["xxx@163.com","xxx@163.com","xxx@163.com","xxx@163.com","xxx@163.com","xxx@163.com","xxx@163.com"]
sub = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
msg = MIMEText( sub + "\\n"+content, _subtype='plain',_charset='utf-8')
msg['Subject'] = Header(alarmName+':'+ip, 'utf-8' )
#msg['From'] = Header("系統預警", 'utf-8')
msg['From'] = formataddr(pair=('設備預警', mail_user))
msg['To'] = ', '.join(mail_res)
smtp = smtplib.SMTP()
smtp.connect(smtpserver)
smtp.starttls()
smtp.login(mail_user, mail_pass)
smtp.sendmail(mail_user, mail_res, msg.as_string())
smtp.quit()
def send_WX(self,msg):
headers = {"Content-Type": "text/plain"}
#s="服務器預警:{},驗證碼{}".format({str(printCode)},{str(verifyCode)})
data = {
"msgtype": "text",
"text": {
"content": msg,
}
}
r = requests.post(
url='企業微信機器人地址(需要根據實際機器人地址配置)',
headers=headers, json=data)
print(r.text)
def Write_to_Mysql_alarm(self,valuelist):
#log = Logger('all.log',level='debug')
#業務監控:id,project,tpye,exceptiontype,details(xx,大數據,無es進程/es集群不健康,)
try:
db = MySQLdb.connect("xxx", "xxx", "xxx", "xxx", charset='utf8' )
log.logger.info("數據庫連接成功")
except:
log.logger.info("數據庫連接失敗")
創建游標
cursor = db.cursor()
uid = uuid.uuid1()
result=0
sql =''
try:
sql = 'insert into test_serverresourcealarm values (%s, %s, %s, %s,%s, %s, %s, %s, %s, %s, %s, %s, %s,%s)'
#val = (str(uid),valuelist[1], valuelist[2], valuelist[3], valuelist[4],valuelist[5], valuelist[6],'',valuelist[7], valuelist[8],valuelist[9],valuelist[10],'','','')
val = (str(uid),valuelist[2], valuelist[3], valuelist[4], valuelist[5],valuelist[6], valuelist[7],'',valuelist[8], valuelist[9],valuelist[10],'','','')
cursor.execute(sql,val)
db.commit()
log.logger.error('設備預警信息已入庫!')
#發送企業微信預警信息
self.buildMsg(valuelist)
except:
into = sys.exc_info()
#log.logger.error('插入數據失?。?)
log.logger.error('設備預警信息入庫失敗!'+str(into))
result=0
#str = self.obj_to_string(sys.exc_info(), self)
print('error',into)
# 關閉游標
db.close()
return result
def Write_to_Mysql_temp(self,valuelist):
打開數據庫連接
#db = MySQLdb.connect("xxx", "xxx", "xxx", "xxx", charset='utf8' )
try:
db = MySQLdb.connect("xxx", "xxx", "xxx", "xxx", charset='utf8' )
log.logger.info("數據庫連接成功")
except:
log.logger.info("數據庫連接失敗")
使用cursor()方法獲取操作游標
cursor = db.cursor()
uid = uuid.uuid1()
result=0
try:
sql = 'insert into test_serverresourcetemp values (%s, %s, %s, %s,%s, %s, %s, %s, %s, %s, %s, %s, %s,%s)'
val = (str(uid),valuelist[2], valuelist[3], valuelist[4], valuelist[5],valuelist[6], valuelist[7],'',valuelist[8], valuelist[9],valuelist[10],'','','')
cursor.execute(sql,val)
db.commit()
result=1
log.logger.info("臨時表sql執行狀態:"+str(result))
except:
into = sys.exc_info()
result = 0
print(into)
log.logger.info('臨時表sql執行失敗: '+str(into))
關閉數據庫連接
db.close()
return result
class MyServer(SocketServer.BaseRequestHandler):
def handle(self):
conn = self.request
log.logger.info('... connected from {}'.format(self.client_address))
#print('1多線程監控')
Flag = True
while Flag:
data = conn.recv(1024)
#print(data)
if len(data)>10:
log.logger.info('接收到的客戶端數據:'+data)
conn.sendall('1')
sub = data.strip('\\n')
str = sub.split('|')
#print(str)
a = Analysis()
#報警信息入庫,#將監控數據寫入臨時表中test_serverresourcetemp_lty
result = a.Write_to_Mysql_temp(str)
if(float(str[4])>90 or float(str[5])>90 or float(str[6])>85 or float(str[7])>85 or float(str[8])>3000 or float(str[9])>3000):
result1 = a.Write_to_Mysql_alarm(str)
#result = 1
if result == 0:
log.logger.info('預警信息入庫失?。?)
else:
log.logger.info('預警信息入庫完成!')
#發送預警郵件、企業微信
#a.buildMsg(str)
if data =='exit':
log.logger.info('... connecte end ...')
Flag = False
if name == " main ":
#每分鐘執行一次
log = Logger('socketservice.logs')
log.logger.info('----start----')
alarmName ='服務器資源預警'
#是否開啟郵件報警,1為開啟,0為關閉
mailconf =1
#是否開啟企業微信報警,1為開啟,0為關閉
wxconf =0
server = SocketServer.ThreadingTCPServer(('IP',port),MyServer)
server.serve_forever()
原文鏈接:https://blog.csdn.net/eagle89/article/details/128579002
-
監控
+關注
關注
6文章
2238瀏覽量
55387 -
服務器
+關注
關注
12文章
9331瀏覽量
86131
發布評論請先 登錄
相關推薦
評論