当我们需要对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()
网友评论