利用Python批量测试一组HTTP服务的可用性

简介:

   用Python实现批量测试一组url的可用性(可以包括HTTP状态、响应时间等)并统计出现不可用情况的次数和频率等。

    类似的,这样的脚本可以判断某个服务的可用性,以及在众多的服务提供者中选择最优的。

需求以及脚本实现的功能如下:

  1. 默认情况下,执行脚本会检测一组url的可用性。

  2. 如果可用,返回从脚本所在的机器到HTTP服务器所消耗的时间和内容等信息。

  3. 如果url不可用,则记录并提示用户,并显示不可用发生的时间。

  4. 默认情况下,允许最大的错误次数是200,数目可以自定义,如果达到允许的最大错误次数,则在输出信息的最后,根据每一个url做出错误统计。

  5. 如果用户手动停止脚本,则需要在输出信息的最后,根据每一个url做出错误统计。

脚本中涉及的一些技巧:

  1. 使用gevent并发处理多个HTTP请求,多个请求之间无须等待响应(gevent还有很多使用技巧,可再自行学习);

  2. 使用signal模块捕获信号,如果捕获到则处理并退出,避免主进程接收到KeyboardInterrupt直接退出但无法处理的问题;

  3. 注意留意脚本中关于统计次数方面的小技巧;

脚本运行效果图(如果图片看不清楚,请选择“在新标签页中打开图片”)如下:

image

脚本可以参见Github,https://github.com/DingGuodong/LinuxBashShellScriptForOps/tree/master/projects/checkServicesAvailability/HttpService

脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#!/usr/bin/python
# encoding: utf-8
# -*- coding: utf8 -*-
"""
Created by PyCharm.
File:               LinuxBashShellScriptForOps:testNoHttpResponseException,testHttpHostAvailability.py
User:               Guodong
Create Date:        2016/10/26
Create Time:        12:09
 
Function:
     test Http Host Availability
 
Some helpful message:
     For CentOS: yum -y install python-devel python-pip; pip install gevent
     For Ubuntu: apt-get -y install python-dev python-pip; pip install gevent
     For Windows: pip install gevent
  """
import  signal
import  time
import  sys
#  execute some operations concurrently using python
from  gevent  import  monkey
 
monkey.patch_all()
import  gevent
import  urllib2
 
hosts  =  [ 'https://webpush.wx2.qq.com/cgi-bin/mmwebwx-bin/synccheck' ,
          'https://webpush.wx.qq.com/cgi-bin/mmwebwx-bin/synccheck' , ]
 
errorStopCounts  =  200
 
quit_flag  =  False
statistics  =  dict ()
 
 
def  changeQuit_flag(signum, frame):
     del  signum, frame
     global  quit_flag
     quit_flag  =  True
     print  "Canceled task on their own by the user."
 
 
def  testNoHttpResponseException(url):
     tryFlag  =  True
     global  quit_flag
     errorCounts  =  0
     tryCounts  =  0
     global  statistics
     globalStartTime  =  time.time()
     while  tryFlag:
         if  not  quit_flag:
             tryCounts  + =  1
             print ( 'GET: %s'  %  url)
             try :
                 startTime  =  time.time()
                 resp  =  urllib2.urlopen(url)   # using module 'request' will be better, request will return header info..
                 endTime  =  time.time()
                 data  =  resp.read()
                 responseTime  =  endTime  -  startTime
                 print  '%d bytes received from %s. response time is: %s'  %  ( len (data), url, responseTime)
                 print  "data received from %s at %d try is: %s"  %  (url, tryCounts, data)
                 gevent.sleep( 2 )
             except  urllib2.HTTPError as e:
                 errorCounts  + =  1
                 statistics[url]  =  errorCounts
                 currentTime  =  time.strftime( '%Y-%m-%d %H:%M:%S' , time.localtime())
                 print  "HTTPError occurred, %s, and this is %d times(total) occurs on %s at %s."  %  (
                     e, statistics[url], url, currentTime)
 
                 if  errorCounts > =  errorStopCounts:
                     globalEndTime  =  time.time()
                     tryFlag  =  False
         else :
             globalEndTime  =  time.time()
             break
 
     for  url  in  statistics:
         print  "Total error counts is %d on %s"  %  (statistics[url], url)
         hosts.remove(url)
     for  url  in  hosts:
         print  "Total error counts is 0 on %s"  %  url
     globalUsedTime  =  globalEndTime  -  globalStartTime
     print  "Total time use is %s"  %  globalUsedTime
     sys.exit( 0 )
 
 
try :
     # Even if the user cancelled the task,
     # it also can statistics the number of errors and the consumption of time for each host.
     signal.signal(signal.SIGINT, changeQuit_flag)
 
     gevent.joinall([gevent.spawn(testNoHttpResponseException, host)  for  host  in  hosts])
except  KeyboardInterrupt:
     # Note: this line can NOT be reached, because signal has been captured!
     print  "Canceled task on their own by the user."
     sys.exit( 0 )


tag:python计算HTTp可用性,python 统计次数,python gevent

--end--





本文转自 urey_pp 51CTO博客,原文链接:http://blog.51cto.com/dgd2010/1865925,如需转载请自行联系原作者


相关文章
|
9月前
|
JSON 中间件 Go
Go 网络编程:HTTP服务与客户端开发
Go 语言的 `net/http` 包功能强大,可快速构建高并发 HTTP 服务。本文从创建简单 HTTP 服务入手,逐步讲解请求与响应对象、URL 参数处理、自定义路由、JSON 接口、静态文件服务、中间件编写及 HTTPS 配置等内容。通过示例代码展示如何使用 `http.HandleFunc`、`http.ServeMux`、`http.Client` 等工具实现常见功能,帮助开发者掌握构建高效 Web 应用的核心技能。
466 61
|
9月前
|
应用服务中间件 网络安全 数据安全/隐私保护
网关服务器配置指南:实现自动DHCP地址分配、HTTP服务和SSH无密码登录。
哇哈哈,道具都准备好了,咱们的魔术秀就要开始了。现在,你的网关服务器已经魔法满满,自动分配IP,提供网页服务,SSH登录如入无人之境。而整个世界,只会知道效果,不会知道是你在幕后操控一切。这就是真正的数字世界魔法师,随手拈来,手到擒来。
467 14
|
Dubbo 应用服务中间件 API
使用 Apifox、Postman 测试 Dubbo 服务,Apache Dubbo OpenAPI 即将发布
Apache Dubbo 3.3.3(即将发布)实现了与 OpenAPI 的深度集成,通过与 OpenAPI 的深度集成,用户能够体验到从文档生成到接口调试、测试和优化的全流程自动化支持。不论是减少手动工作量、提升开发效率,还是支持多语言和多环境,Dubbo 3.3.3 都展现了其对开发者体验的极大关注。结合强大的 Mock 数据生成和自动化测试能力,这一版本为开发者提供了极具竞争力的服务治理解决方案。如果你正在寻找高效、易用的微服务框架,Dubbo 3.3.3 将是你不容错过的选择。
1324 252
|
10月前
|
网络协议 API 开发者
分析http.client与requests在Python中的性能差异并优化。
合理地选择 `http.client`和 `requests`库以及在此基础上优化代码,可以帮助你的Python网络编程更加顺利,无论是在性能还是在易用性上。我们通常推荐使用 `requests`库,因为它的易用性。对于需要大量详细控制的任务,或者对性能有严格要求的情况,可以考虑使用 `http.client`库。同时,不断优化并管理员连接、设定合理超时和重试都是提高网络访问效率和稳定性的好方式。
240 19
|
11月前
|
中间件 Go
Golang | Gin:net/http与Gin启动web服务的简单比较
总的来说,`net/http`和 `Gin`都是优秀的库,它们各有优缺点。你应该根据你的需求和经验来选择最适合你的工具。希望这个比较可以帮助你做出决策。
556 35
|
9月前
|
网络协议 API Python
解析http.client与requests在Python中的性能比较和改进策略。
最后,需要明确的是,这两种库各有其优点和适用场景。`http.client` 更适合于基础且并行的请求,`requests` 则因其易用且强大的功能,更适用于复杂的 HTTP 场景。对于哪种更适合你的应用,可能需要你自己进行实际的测试来确定。
227 10
|
9月前
|
测试技术 Python
Python接口自动化测试中Mock服务的实施。
总结一下,Mock服务在接口自动化测试中的应用,可以让我们拥有更高的灵活度。而Python的 `unittest.mock`库为我们提供强大的支持。只要我们正确使用Mock服务,那么在任何情况下,无论是接口是否可用,都可以进行准确有效的测试。这样,就大大提高了自动化测试的稳定性和可靠性。
353 0
|
关系型数据库 MySQL PHP
源码编译安装LAMP(HTTP服务,MYSQL ,PHP,以及bbs论坛)
通过以上步骤,你可以成功地在一台Linux服务器上从源码编译并安装LAMP环境,并配置一个BBS论坛(Discuz!)。这些步骤涵盖了从安装依赖、下载源代码、配置编译到安装完成的所有细节。每个命令的解释确保了过程的透明度,使即使是非专业人士也能够理解整个流程。
351 18
|
存储 算法 文件存储
探秘文件共享服务之哈希表助力 Python 算法实现
在数字化时代,文件共享服务不可或缺。哈希表(散列表)通过键值对存储数据,利用哈希函数将键映射到特定位置,极大提升文件上传、下载和搜索效率。例如,在大型文件共享平台中,文件名等信息作为键,物理地址作为值存入哈希表,用户检索时快速定位文件,减少遍历时间。此外,哈希表还用于文件一致性校验,确保传输文件未被篡改。以Python代码示例展示基于哈希表的文件索引实现,模拟文件共享服务的文件索引构建与检索功能。哈希表及其分布式变体如一致性哈希算法,保障文件均匀分布和负载均衡,持续优化文件共享服务性能。
|
JSON 关系型数据库 测试技术
使用Python和Flask构建RESTful API服务
使用Python和Flask构建RESTful API服务
648 2

推荐镜像

更多