利用requests的HTTPAdapter重试机制,检测web服务器状态

当我们需要对web服务器,进行监控时,常用的做法时调用服务器的心跳接口,或者把某个轻量化的接口,当成是心跳接口使用。在项目上需要监控某个服务器状态,开发又没有设计心跳接口,因此调用一个简单的接口,通过判断响应码是否为200来判断服务器状态。
判断的逻辑是:发送间隔5秒,连接超时5秒,超过4个周期未能获取到响应,测打印心跳检测失败。requests模块为常用的http请求模块,K神的开山之作,几行代码实现http请求。网上的知识点很多,今天讲几个脚本中用的知识点。
1.发送和接收超时,在请求中增加一个timeout参数,传一个数时,表示发送超时,转一个2个数值的列表时,第一个元素表示发送超时,第二个元素表示接收完成超时。如果不设置超时,超时是tcp默认超时,会卡很久。
2.超时后进行重试。如果是单个请求,我们可以在每个请求捕获超时写个循环重试一下,但当有多个请求的时候,显得不够优雅。requests.adapters.HTTPAdapter 的对象 ,可以设置最大的重试次数(实际发送次数为重试次数加1)
实践的代码如下:

# -*- coding:utf-8 -*-
# @Time      :2020/7/31
# 检测http响应码是否为200判断web服务器是否可用
# 检测周期5秒
import time
import requests
from loguru import logger
from requests.adapters import HTTPAdapter
import threading

logger.add('heart.log')

# 设置3次重试
session = requests.Session()
session.mount('http://', HTTPAdapter(max_retries=3))


def get_func(host):
    try:
        # 发送超时5秒,接收完成超时10
        rsp = session.get(f'http://{host}/api/heart.json', timeout=(5, 10))
        if rsp.status_code == 200:
            return True
        else:
            logger.error(f'{host}心跳检测失败:{rsp.text}')
            return False
    except requests.exceptions.RequestException as e:
        logger.error(f'{host}重试3次后仍未成功{e}')
        return False


def check_heart(host):
    logger.info(f'开始检测服务器{host}')
    while 1:
        if get_func(host):
            # logger.info(f'{host}检测成功')
            pass
        time.sleep(5)


if __name__ == "__main__":
    host_list = ['192.168.54.109', '192.168.54.108']
    job_list = []
    for host in host_list:
        job_list.append(threading.Thread(target=check_heart, args=(host,)))
    for job in job_list:
        job.start()
    for job in job_list:
        job.join()

你可能感兴趣的:(利用requests的HTTPAdapter重试机制,检测web服务器状态)