Linux笔记:自动化运维之自动化监控与报警:监控硬件使用率和自动发送邮件微信通知报警

概述

在项目上线后,总有很多不确定的因素存在,例如并发高,代码逻辑错误等, 这些异常往往会导致很严重的后果,造成服务中断, 需要尽早的发现问题, 所以对服务器各方面的监控就变得尤为重要
我们需要使用程序自动监控服务器状态,并且在出现异常后主动告诉我们。

自动监控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
  • 部署完成就可以执行该程序了:$python3 monitor.py 进行时时监控

  • 程序优化:此程序反馈的是时时监控,其实我们收到一条信息即可了,可以优化程序设置半小时之内不再重复报警, 加个函数节流即可实现, 时间设置为半小时, 此处不再举例

发布了403 篇原创文章 · 获赞 198 · 访问量 69万+

猜你喜欢

转载自blog.csdn.net/Tyro_java/article/details/104172961