欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python练习——监控网站的nginx健康检查接口状态,确定其联通性及可用性,并通过163邮箱报警

程序员文章站 2022-03-22 16:45:45
...

工作中需要对一个网站的连通性进行监控,为此,我和专业的开发沟通了下,准备直接监控他的nginx健康检查接口,通过访问健康检查接口的页面,抓取状态,用判断是否正常,如果联不通,那就抓不到数据,发邮件报警,如果联通了,但是状态有异常,也会发邮件报警。

再这里,健康检查的接口大概是下面这张图的样子:
python练习——监控网站的nginx健康检查接口状态,确定其联通性及可用性,并通过163邮箱报警
所以就是对里面的status这个字段检测,看他是不是up的状态,如果是就ok,不是就出故障了。

其代码实现大概是这个样子的


import requests

#lxml和etree主要是用来抓页面数据用的,也是从网上拼凑,感觉还是蛮好用的,抓表格挺方便,但很多功能还是瞎猫碰死耗子,还需要学习
from lxml import etree

#这个datetime主要是用于显示系统时间用的,再最后吗有用
from datetime import datetime

import time

#这三个是需要用来发邮件的,调用163邮箱
import smtplib
from email.mime.text import MIMEText
from email.header import Header




#欢迎界面
print('欢迎使用"xxxxxxx"状态监控程序,不断优化开发中,技术支持:xxxxxxx')
print('请输入检测https://xx.xx.xx/status页面的时间间隔')
s=input('请输入(单位:秒)')
email=input('请输入邮箱地址:仅限163邮箱')
username=input('请输入邮箱用户名:')
password=input('请输入邮箱密码')


#将健康检查的接口设定个标准值,将其存到list‘infostatus’
info_status = ['192.168.4.103:8090 up','192.168.4.104:8090 up', '192.168.4.103:8091 up', '192.168.4.104:8091 up']

error = 'No Error'

#设定info_check函数,,这个函数的功能就是利用lxml库的etree类来抓取健康检查接口里的表格
def info_check(url):
    response = requests.get(url)
    html = etree.HTML(response.content.decode('utf-8'))
    table = html.xpath("//table//tr[position()>1]")
    dep = []
    for i in table:  # 遍历tr列表
        name = ''.join(i.xpath(".//td[3]//text()"))  # 获取当前tr标签下的第一个td标签,并用text()方法获取文本内容,赋值给p
        status = ''.join(i.xpath(".//td[4]//text()"))
        ipstatus = name+' '+status
        dep.append(ipstatus)
    if dep == info_status:
        print('ok')
    else:
        print('no')
        global error
        error ='Error Detected'
        print(error)



'''
def timercheck(n):
    while True:
        print(datetime.now().strftime("%Y-%m-%d  %H:%M:%S"))
        info_check('https://xx.xx.xx/status')
#        if error != 'No Error':
#               email('no')
               
        
        
        time.sleep(n)

        

timercheck(s)
'''

# 每n秒执行一次
#这块也是从网上抄的实际上,我不会配置,实际上只能用163的邮箱,其他邮箱的话收不到。不过自己用,也无所谓了
while True:
    print(datetime.now().strftime("%Y-%m-%d  %H:%M:%S"))
    info_check('https://xx.xx.xx/status')
    if error != 'No Error':
        # 第三方 SMTP 服务
        mail_host="smtp.163.com"  #设置服务器
        mail_user=username    #用户名
        mail_pass=password   #口令
        sender = email
        receivers = [email]  # 接收邮件,可设置为你的QQ邮箱或者其他邮
        message = MIMEText('发现访问异常', 'plain', 'utf-8')
        message['From'] = Header("info", 'utf-8')
        message['To'] =  Header("info", 'utf-8')
        subject = '服务器监控'
        message['Subject'] = Header(subject, 'utf-8')
        smtpObj = smtplib.SMTP()
        smtpObj.connect(mail_host, 25)    # 25 为 SMTP 端口号
        smtpObj.login(mail_user,mail_pass)
        smtpObj.sendmail(sender, receivers, message.as_string())
        print('邮件已发送至aaa@qq.com')

    
    time.sleep(int(s))

这个程序,用pyinstaller打包的,直接再cmd中,跑到这个程序的.py文件保存的目录,再cmd中运行下面这句代码就可以了。

pyinstaller -F xxx.py 

这个程序执行的样子:
python练习——监控网站的nginx健康检查接口状态,确定其联通性及可用性,并通过163邮箱报警
但不得不说,门外汉就是门外汉,这个程序再我的服务器上总是自动关闭,已经再windows定时任务管理器中添加了好几个,但是还是经常被系统关掉,不知道为什么,耽误工作啊
python练习——监控网站的nginx健康检查接口状态,确定其联通性及可用性,并通过163邮箱报警