0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

监控服务器资源利用率的服务端脚本

麦辣鸡腿堡 来源:CSDN博客 作者:jerry-89 2023-01-22 16:02 次阅读

其主要目的是:基于 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

    文章

    1986

    浏览量

    54591
  • 服务器
    +关注

    关注

    12

    文章

    8125

    浏览量

    82544
收藏 人收藏

    评论

    相关推荐

    TCP服务端测试工具

    本帖最后由 小子个 于 2024-3-20 22:58 编辑 该TCP服务端工具可以理解为 “TCP服务端” 或者 “服务器” ,目的是帮助大家在没有服务器的情况下,完成客户
    发表于 06-29 09:22

    服务端视角看高并发难题

    `所谓服务器大流量高并发指的是:在同时或极短时间内,有大量的请求到达服务端,每个请求都需要服务端耗费资源进行处理,并做出相应的反馈。 从服务端
    发表于 11-02 15:11

    TCP服务端的实现

    Swoole TCP服务端与客户 持续更新
    发表于 09-26 16:04

    如何获得每个块的路由资源利用率

    我想知道每个块使用的详细路由资源。 “设计路线状态”仅提供整个设计的网络总数。有谁知道如何获得每个块的路由资源利用率(网络数量,交换机盒等)?
    发表于 05-21 15:35

    寻找!嵌入式linux利用web服务器升级

    利用http搭建一个服务器,通过web操作,+后台服务端+终端升级嵌入式linux通过服务端后台对设备进行远程升级升级内容:内核、驱动、文
    发表于 06-24 11:11

    监控系统客户服务端设计

    项目开发报告1 项目简介1.1 概述1.2 开发环境1.3 其他支持1.4 应用界面1.4.1 服务器端1.4.2 客户1.5 程序使用2 项目开发2.1 搭建基于实验平台数据库2.1.1 数据库
    发表于 12-21 07:02

    openEuler 资源利用率提升之道 01:概论

    存在共峰资源不足的问题,该问题会导致部分业务服务质量(QoS)受损。如何在提升资源利用率之后,保障业务 QoS 不受损是技术上的关键挑战。此外,云上业务的多样性和复杂性进一步加大了保障
    发表于 07-06 09:54

    ARM服务器准备如何解决服务端渲染的问题

    针对云手机、视频流云游戏行业,ARM服务器准备如何解决服务端渲染的问题?目前的状况了解,PCIE显卡对安卓游戏的支持还不够成熟
    发表于 09-13 14:58

    openEuler 资源利用率提升之道 04:CPU 抢占和 SMT 隔离控制

    服务器的平均利用率保持在较低的水平,使得当突发流量带来请求洪峰时,仍有充足资源用于计算与响应,从而避免了请求堆积造成的服务瘫痪,保证用户能够拥有良好的体验。但是这样做造成了大批的空闲
    发表于 09-22 16:50

    CPU利用率问题求解

    “你能不能实现一个理想情况下应该在每个时间片开始时执行的监控任务,并确定前一个时间片的利用率。如果利用率过高,则应发出警告。如果我们可以使用空闲时间,那么我们就可以衡量利用率。为了设置
    发表于 12-06 06:00

    专家谈如何提高服务器利用率

    专家谈如何提高服务器利用率  如今,数据中心节能已成为热点话题,为减少功耗,各大厂商纷纷推出相应产品和解决方案。近日,Microsoft的utility
    发表于 01-27 11:46 667次阅读

    中标麒麟虚拟化平台软件可大幅度提高资源利用率

    池化并统一管理调度;为您的关键业务提供灵活的基础资源调度,优越的性能和稳定性。系统实现对海光、PowerPC 及X86平台的支持。 中标麒麟虚拟化平台软件能够在提高数据中心空间利用率服务器
    发表于 09-02 10:31 1208次阅读

    如何监控服务器性能?

    (CPU) 和内存 每当服务器性能下降时,通常会怀疑服务器CPU利用率和内存资源。如果您的服务器的CPU使
    的头像 发表于 07-19 16:01 5867次阅读

    监控服务器资源利用率的客户端脚本

    客户端脚本: 端脚本: - - coding:utf-8 - - import io import os import sys import time import datetime import
    的头像 发表于 01-22 16:04 495次阅读

    利用Python写了一个监控服务器资源利用率脚本

    研究了一个脚本,其主要目的是:基于 Python 编程语言来监控服务器的 CPU、内存、/目录、/appslog、/bigdata目录使用率以及网卡接收和发送情况。
    的头像 发表于 01-29 15:08 474次阅读