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

    文章

    2171

    浏览量

    55082
  • 服务器
    +关注

    关注

    12

    文章

    9010

    浏览量

    85160
收藏 人收藏

    评论

    相关推荐

    TCP服务端测试工具

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

    服务端视角看高并发难题

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

    服务器端脚本与动态网页设计,下载

    服务器端脚本与动态网页设计 1. 了解服务器端脚本和动态网页的有关概念 ; 2. 了解ASP、PHP的基本语法和基本功能 ; 3. 熟练掌握JSP的基本语法和基本
    发表于 04-28 16:44 0次下载

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

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

    如何监控服务器性能?

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

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

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

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

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

    在远程服务器上搭建一个OpenVPN服务端

    应公司要求需要在一台远程服务器上搭建一个OpenVPN服务端,在公司本地服务器上搭建一个OpenVPN客户,实现公司内网可以访问远程服务器
    的头像 发表于 05-26 15:03 7319次阅读
    在远程<b class='flag-5'>服务器</b>上搭建一个OpenVPN<b class='flag-5'>服务端</b>

    恒讯科技全面解析:如何有效降低服务器CPU利用率

    降低服务器CPU利用率是一个涉及监控、诊断和优化的全面过程。以下是一些有效的方法: 1、监控CPU使用率: 使用工具如top, htop,
    的头像 发表于 05-10 17:24 668次阅读

    服务端测试和客户测试区别在哪

    服务端测试和客户测试是软件开发过程中的两个重要环节,它们分别针对服务器端和客户的软件进行测试。本文将详细介绍服务端测试和客户
    的头像 发表于 05-30 15:27 2682次阅读

    服务端测试是web测试吗为什么

    服务端测试和Web测试是两个不同的概念,但它们在软件开发和测试过程中是相互关联的。本文将详细解释这两个概念以及它们之间的关系。 服务端测试 服务端测试主要关注服务器端的软件组件,这些组
    的头像 发表于 05-30 15:30 557次阅读

    服务端测试包括什么类型

    服务端测试是确保软件系统在服务器端正常运行和满足性能要求的重要环节。本文将详细介绍服务端测试的类型、方法和最佳实践。 1. 服务端测试的定义 服务端
    的头像 发表于 05-30 16:03 624次阅读