Python定时监测服务接口是否异常

简介:通过请求服务的接口,获取返回的状态码,如果某个接口得到的异常状态为3次(次数可以控制),就会去重启这个服务。每60秒钟执行一次请求

分为两个版本:一个是python3.10版,另一个是3.10以下的。区别无非是条件判断语句发生了改变,这也是新版本python3.10以来加入的新语句,实现了与C、Java、JavaScript、Rust等语言中相类似的语句(switch...case)。Python中为:match...case 具体的语法与特性,请参考官方文档。

使用方式:安装requests库,修改代码类下面的两个属性列表,然后运行py文件即可。参考命令:nohup python3 request_service.py &

说明:类下的属性列表分为两个:urls填写接口的完整url,sername填写对应的接口名(自定义名称,方便自己查看及后面的判断)。两个列表的先后顺序要对应上。

此篇文章,建议有一定基础的读者阅读,需要先读懂代码整体结构,有些地方是需要自己根据实际情况去进行更改的。后续如果感觉好用的情况下,我会进行封装优化,使用者不用直接代码内容。

Python3.10版:request_service.py

#!encoding=utf-8
"""
    auth:chenhao
    date:2022/06/14

"""

import requests
import logging
import os.path
import traceback
import urllib3
from subprocess import getstatusoutput

logging.basicConfig(level=logging.INFO, filename=os.path.abspath(os.path.dirname(__file__)) + '/requests.log',
                    format='%(asctime)s - %(funcName)s{} -%(levelname)s : %(message)s'.format("方法"))


class Respones(object):
    """判断接口是否正常且重启的类"""
    urls = [
        'https://域名或IP/forestar-patrol-sthly-cs',
        'https://域名或IP/sthlyxxgl-cs',
        'https://域名或IP/geodbService-cs'
    ]
    sername = [
        '大数据应用系统',
        '人员信息管理系统',
        'geodb系统'
    ]

    def __init__(self):
        """初始化方法"""
        self.patrol_error = []
        self.xxgl_error = []
        self.geodb_error = []

    def restart(self, cmd, servicename):
        """重启服务的方法"""
        logging.warning("进入重启jar包的方法")
        res = getstatusoutput(cmd)
        res_stat = res[0]
        if res_stat == 0 or res_stat == -9:
            logging.info("{0}服务重启完毕!sys状态{1}".format(servicename, res_stat))
        else:
            logging.error("{0}服务重启失败,抛出异常!\n{1}".format(servicename, traceback.format_exc()))

    def request_service(self):
        """请求接口的方法"""
        for url, name in zip(self.urls, self.sername):
            urllib3.disable_warnings()
            http_get = requests.get(url, timeout=30, verify=False)
            http_code = http_get.status_code
            match http_code:
                case 200:
                    logging.info("{0}服务正常!返回状态码:{1}".format(name, http_code))
                    if name == '大数据应用系统':
                        self.patrol_error.clear()
                    elif name == '人员信息管理系统':
                        self.xxgl_error.clear()
                    elif name == 'geodb系统':
                        self.geodb_error.clear()
                case 301 | 302:
                    logging.warning("{0}服务可能出现了问题,似乎对系统没有影响。返回状态码:{1}".format(name, http_code))
                    if name == '大数据应用系统':
                        self.patrol_error.clear()
                    elif name == '人员信息管理系统':
                        self.xxgl_error.clear()
                    elif name == 'geodb系统':
                        self.geodb_error.clear()
                case 400 | 403 | 404 | 500 | 502 | 503:
                    logging.error("{0}服务异常!返回状态码:{1}".format(name, http_code))
                    if name == '大数据应用系统':
                        self.patrol_error.append(http_code)
                    elif name == '人员信息管理系统':
                        self.xxgl_error.append(http_code)
                    elif name == 'geodb系统':
                        self.geodb_error.append(http_code)
                case _:
                    logging.warning("{0}服务返回了一个无效状态码,请确认!返回状态码:{1}".format(name, http_code))


if __name__ == '__main__':
    """主程序"""
    from time import sleep

    respones = Respones()
    while True:
        respones.request_service()
        logging.warning("大数据应用系统错误码:{}".format(respones.patrol_error))
        logging.warning("信息管理系统错误码:{}".format(respones.xxgl_error))
        logging.warning("geodb系统错误码:{}".format(respones.geodb_error))
        if len(respones.patrol_error) >= 3:
            logging.info("大数据应用系统执行重启方法")
            respones.restart('cd /data/jl/service-18086-forestar-patrol-web && ./restart.sh', '大数据应用系统')
            respones.patrol_error.clear()
        elif len(respones.xxgl_error) >= 3:
            logging.info("人员信息管理系统执行重启方法")
            respones.restart('cd /data/jl/service-9334-sthlyxxgl && ./restart.sh', '人员信息管理系统')
            respones.xxgl_error.clear()
        elif len(respones.geodb_error) >= 3:
            logging.info("geodb系统执行重启方法")
            respones.restart('cd /data/jl/Tomcat-9001-geodbService && ./restart.sh', 'geodb系统')
            respones.geodb_error.clear()
        sleep(60)

Python3.10以下版本:request_service.py

#!encoding=utf-8
"""
    auth:chenhao
    date:2022/06/14

"""

import requests
import logging
import os.path
import traceback
import urllib3
from subprocess import getstatusoutput

logging.basicConfig(level=logging.INFO, filename=os.path.abspath(os.path.dirname(__file__)) + '/requests.log',
                    format='%(asctime)s - %(funcName)s{} -%(levelname)s : %(message)s'.format("方法"))


class Respones(object):
    """判断接口是否正常且重启的类"""
    urls = [
        'https://域名或IP/forestar-patrol-sthly-cs',
        'https://域名或IP/sthlyxxgl-cs',
        'https://域名或IP/geodbService-cs'
    ]
    sername = [
        '大数据应用系统',
        '人员信息管理系统',
        'geodb系统'
    ]

    def __init__(self):
        """初始化方法"""
        self.patrol_error = []
        self.xxgl_error = []
        self.geodb_error = []

    def restart(self, cmd, servicename):
        """重启服务的方法"""
        logging.warning("进入重启jar包的方法")
        res = getstatusoutput(cmd)
        res_stat = res[0]
        if res_stat == 0 or res_stat == -9:
            logging.info("{0}服务重启完毕!sys状态{1}".format(servicename, res_stat))
        else:
            logging.error("{0}服务重启失败,抛出异常!\n{1}".format(servicename, traceback.format_exc()))

    def request_service(self):
        """请求接口的方法"""
        for url, name in zip(self.urls, self.sername):
            urllib3.disable_warnings()
            http_get = requests.get(url, timeout=30, verify=False)
            http_code = http_get.status_code
            if http_code == 200:
                logging.info("{0}服务正常!返回状态码:{1}".format(name, http_code))
                if name == '大数据应用系统':
                    self.patrol_error.clear()
                elif name == '人员信息管理系统':
                    self.xxgl_error.clear()
                elif name == 'geodb系统':
                    self.geodb_error.clear()
            elif http_code == 301 or http_code == 302:
                logging.warning("{0}服务可能出现了问题,似乎对系统没有影响。返回状态码:{1}".format(name, http_code))
                if name == '大数据应用系统':
                    self.patrol_error.clear()
                elif name == '人员信息管理系统':
                    self.xxgl_error.clear()
                elif name == 'geodb系统':
                    self.geodb_error.clear()
            elif http_code == 400 or http_code == 403 or http_code == 404 or \
                    http_code == 500 or http_code == 502 or http_code == 503:
                logging.error("{0}服务异常!返回状态码:{1}".format(name, http_code))
                if name == '大数据应用系统':
                    self.patrol_error.append(http_code)
                elif name == '人员信息管理系统':
                    self.xxgl_error.append(http_code)
                elif name == 'geodb系统':
                    self.geodb_error.append(http_code)
            else:
                logging.warning("{0}服务返回了一个无效状态码,请确认!返回状态码:{1}".format(name, http_code))


if __name__ == '__main__':
    """主程序"""
    from time import sleep

    respones = Respones()
    while True:
        respones.request_service()
        logging.warning("大数据应用系统错误码:{}".format(respones.patrol_error))
        logging.warning("信息管理系统错误码:{}".format(respones.xxgl_error))
        logging.warning("geodb系统错误码:{}".format(respones.geodb_error))
        if len(respones.patrol_error) >= 3:
            logging.info("大数据应用系统执行重启方法")
            respones.restart('cd /data/jl/service-18086-forestar-patrol-web && ./restart.sh', '大数据应用系统')
            respones.patrol_error.clear()
        elif len(respones.xxgl_error) >= 3:
            logging.info("人员信息管理系统执行重启方法")
            respones.restart('cd /data/jl/service-9334-sthlyxxgl && ./restart.sh', '人员信息管理系统')
            respones.xxgl_error.clear()
        elif len(respones.geodb_error) >= 3:
            logging.info("geodb系统执行重启方法")
            respones.restart('cd /data/jl/Tomcat-9001-geodbService && ./restart.sh', 'geodb系统')
            respones.geodb_error.clear()
        sleep(60)

日志信息:

使用中出现任何问题请与我联系,谢谢阅读!

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

博客网友陈浩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值