概述
在项目上线后,总有很多不确定的因素存在,例如并发高,代码逻辑错误等, 这些异常往往会导致很严重的后果,造成服务中断, 需要尽早的发现问题, 所以对服务器各方面的监控就变得尤为重要
我们需要使用程序自动监控服务器状态,并且在出现异常后主动告诉我们。
自动监控CPU、内存使用率
-
创建文件监控文件monitor.py, 这里的一些方法都是类方法,可以直接调用,不需要实例化
import psutil, time class Monitor(): cpu_data = [] # 用于存放cpu的数据 @classmethod def mem(cls, max=90): val = psutil.virtual_memory().percent # print(val) if val > max: cls.send_msg('内存使用率为{:1.f}%,超过了{}%,请关注'.format(val, max)) @classmethod def cpu(cls, max=90): val = psutil.cpu_percent(1) cls.cpu_data.append(val) print(cls.cpu_data) # 超过三次开始处理 if len(cls.cpu_data) >= 3: avg = sum(cls.cpu_data) / len(cls) if avg > max: cls.send_msg('CPU使用率为{:1.f}%,超过了{}%,请关注'.format(val, max)) cls.cpu_data.pop(0) # 去除最开始的一个 @classmethod def send_msg(cls, content): print(content) pass while True: Monitor.mem(85) # 监控内存 Monitor.cpu(85) # 监控cpu # 最近三次的值超过才报警 time.sleep(3)
-
部署到服务器上并运行,即可时时监控系统CPU、内存状态,其他指标也可以同样处理
自动发送报警邮件
- 首先准备好我们系统需要发邮件的邮箱比如:
[email protected]
- 然后开通该邮箱的
smtp
服务(邮件发送服务),然后根据smtp的协议, 通过python代码将我们想要发送的内容传递到邮件服务器上, 服务器就会把邮件发送给接收者- 例如QQ邮箱,在设置/账户选项中找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务开启POP3/SMTP服务
- 在旁边还有一个说明文档链接,根据内容, 将发件服务器地址(例:smtp.qq.com)和端口(465)记录下来
- 点击下面的生成授权码提示,获取相应的授权码
- 紧接着我们开始继续编辑monitor.py文件, 补充和编辑以下代码, 进行发送邮件的代码处理
# 添加如下类方法 @classmethod def mail(self, content): import smtplib from email.mine.text import MIMEText from email.utils import formataddr # 第一步 准备基本数据 nickname='监控程序' sender='[email protected]' # 这里配置成自己的邮箱 password='这里填写上面获取的授权码' receiver = '[email protected]' # 这里填写接受者的邮箱 # 第二步 构建一封邮件 msg = MIMEText(content, 'html', 'utf-8') # 邮件内容,邮件类型,邮件编码 msg['From'] = formataddr([nickname, sender]) msg['Subject'] = '自动报警' # 第三步 开始发送 server = smtplib.SMTP_SSL('smtp.qq.com', 465) # 这里是上面所说的邮件服务器和端口 try: server.login(sender, password) # 这里进行登录 server.sendmail(sender, [receiver], msg.as_string()) # 发送人,接受者,将内容转为字符串 except Exception as ex: print(ex) finally: server.quit() # 下面开始编辑send_msg方法,将发邮件方法加入其中 @classmethod def send_msg(cls, content): # print(content) cls.mail(content) # 调用发邮件功能
- 在这个过程中,我们是将邮件从一个邮箱地址发送到另一个邮箱地址
- 再次运行测试,很快就会收到邮件了
自动发送报警微信
-
进入微信公众平台,注册自己的公众号(个人可以注册订阅号, 企业可以注册服务号)
-
如果仅仅是开发,可以不用注册,直接申请一个用于开发的测试号即可!
-
具体操作路径:公众号文档/开始开发/接口测试号申请/进入微信公众帐号测试号申请系统/登录/扫码
-
扫码登录后直接进入测试号管理, 可以看到自己的appID和appsecret
-
我们报警监控需要不限制次数的使用,所以我们选择模板消息:公众号文档/消息管理/模板消息接口
-
在测试号中使用非常简单, 点击"新增测试模板",添加模板标题, 模板内容
-
模板标题:
服务器报警
此处仅作为举例 -
模板内容:
扫描二维码关注公众号,回复: 9009674 查看本文章服务器发生异常: 异常情况:{{msg.DATA}} 发生时间:{{time.DATA}} 请关注!
-
点击提交
-
我们看到有了服务器报警标题的模板,我们主要使用到这个模板ID
-
然后我们可以关注测试号的二维码, 关注成功后刷新该页面,发现在旁边的用户列表中出现了自己的微信号
-
在python中有个wechatpy的模块专门处理微信平台的开发 $
pip3 install wechatpy
-
同时需要安装一下加密的库:$
pip3 install cryptography
或者 $pip3 install PyCrypto
-
备注:install的时候当然可以写在一起,这里为了区分方便和写作清晰,哪个加密库可用就安装哪个即可
-
紧接着我们开始继续编辑monitor.py文件, 补充和编辑以下代码, 进行发送微信模板消息的代码处理
@classmethod def wechat(cls, content): #wechatpy from wechatpy import WeChatClient import datetime client = WeChatClient('你的appID', '你的appsecret') template_id = '刚才的模板id' openid = '你要发送的openID' data = { 'msg': { "value": content, "color": "#173177" }, "time": { "value": datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), "color": "#173177" } } client.message.sent_template(openid, template_id, data) # 开始测试 执行该文件,由此手机上接收到了模板消息的推送 # Monitor.wechat('CPU超过90%') # 这里的内容是content的内容,可以按上面发送邮件的方式处理, 此处做举例 # 下面开始编辑send_msg方法,将发邮件方法加入其中 @classmethod def send_msg(cls, content): # print(content) cls.mail(content) # 调用发邮件功能 cls.wechat(content) # 调用发微信消息模板功能
-
测试完成后补充上述
send_msg
代码将微信功能加入, 然后将代码进行服务器部署- windows下:下载pscp命令(putty提供的命令) 比如下载到了
c:\pscp.exe
, 拷贝命令:$c:\pscp.exe monitor.py [email protected]:/root
输入密码即可 - linux下:使用scp命令即可,此处不再赘述
- Mac下:同linux
- windows下:下载pscp命令(putty提供的命令) 比如下载到了
-
部署完成就可以执行该程序了:$
python3 monitor.py
进行时时监控 -
程序优化:此程序反馈的是时时监控,其实我们收到一条信息即可了,可以优化程序设置半小时之内不再重复报警, 加个函数节流即可实现, 时间设置为半小时, 此处不再举例