zoukankan      html  css  js  c++  java
  • [Python]实践:实现探测Web服务质量

    来源:Python 自动化运维 技术与最佳实践

      HTTP服务是最流行的互联网应用之一,服务质量的好坏关系到用户体验以及网站的运营服务水平,最常用的有两个标准:1、服务的可用性,比是否处于正常提供服务状态,而不是出现404页面未找到或者500页面错误等;2、服务的响应速度,比如静态类文件下载时间都控制在毫秒级,动态CGI为秒级。

           该示例使用pycurl的setopt与getinfo方法实现HTTP服务质量的探测,获取监控URL返回的HTTP状态码,HTTP状态码采用pycurl.HTTP_CODE常量得到,以及从HTTP请求到完成下载期间各环节的响应时间,通过pycurl.NAMELOOKUP_TIME,pycurl.CONNECT_TIME,pycurl.PRETRANSFER_TIME,pycurl.R等常量来实现。另外通过pycurl.WRITEHEADER,pycurl.WRITEDATA常量得到目标URL的HTTP响应头部及页面内容。 

    一、安装 pycurl模块

    1.要求curl-config包支持,需要源码方式重新安装curl

     

    #wget http://curl.haxx.se/download/curl-7.36.0.tar.gz
    #tar -zxvf  curl-7.36.0.tar.gz
    #cd curl-7.36.0.tar.gz
    #./configure
    #make && make install
    #export LD_LIBRARY_PATH=/usr/local/lib
    #

    2.安装pycurl

    下载地址:https://pypi.python.org/pypi/pycurl,上传至服务器

    # tar -zxvf  pycurl-7.43.0.1.tar.gz
    # cd pycurl-7.43.0.1/
    # python setup.py install --curl-config=/usr/local/bin/curl-config

     3.检验安装结果

    二、编写脚本simple.py

    #!/usr/bin/python
    # -*- coding:UTF-8 -*-
    import os, sys
    import time
    import pycurl
    
    #探测的目标URL
    URL= "http://www.baidu.com"
    #创建一个Curl对象
    c = pycurl.Curl()
    
    #定义请求的URL常量
    c.setopt(pycurl.URL, URL)
    #定义请求连接的等待时间
    c.setopt(pycurl.CONNECTTIMEOUT, 5)
    #定义请求超时时间
    c.setopt(pycurl.TIMEOUT, 5)
    #屏蔽下载进度条
    c.setopt(pycurl.NOPROGRESS, 1)
    #完成交互后强制断开连接,不重用
    c.setopt(pycurl.FORBID_REUSE, 1)
    #指定HTTP重定向的最大数为1
    c.setopt(pycurl.MAXREDIRS, 1)
    #设置保存DNS信息的时间为30秒
    c.setopt(pycurl.DNS_CACHE_TIMEOUT, 30)
    #创建一个文件对象,以“wb”方式打开,用来存储返回的http头部及页面内容
    indexfile = open(os.path.dirname(os.path.realpath(__file__)) + "/content.txt", "wb")
    #将返回的HTTP HEADER定向到indexfile文件
    c.setopt(pycurl.WRITEHEADER, indexfile)
    #将返回的HTML内容定向到indexfile文件对象
    c.setopt(pycurl.WRITEDATA, indexfile)
    try:
        #提交请求
        c.perform()
    except Exception, e:
        print "connection error: " + str(e)
        indexfile.close()
        c.close()
        sys.exit()
        
    #获取DNS解析时间
    NAMELOOKUP_TIME = c.getinfo(c.NAMELOOKUP_TIME)
    #获取建立连接时间
    CONNECT_TIME = c.getinfo(c.CONNECT_TIME)
    #获取从建立连接到准备传输所消耗的时间
    PRETRANSFER_TIME = c.getinfo(c.PRETRANSFER_TIME)
    #获取从建立连接到传输开始消耗的时间
    STARTTRANSFER_TIME = c.getinfo(c.STARTTRANSFER_TIME)
    #获取传输的总时间
    TOTAL_TIME = c.getinfo(c.TOTAL_TIME)
    #获取HTTP状态码
    HTTP_CODE = c.getinfo(c.HTTP_CODE)
    #获取下载数据包大小
    SIZE_DOWNLOAD = c.getinfo(c.SIZE_DOWNLOAD)
    #获取HTTP头部大小
    HEADER_SIZE = c.getinfo(c.HEADER_SIZE)
    #获取平均下载速度
    SPEED_DOWNLOAD = c.getinfo(c.SPEED_DOWNLOAD)
    #打印输出相关数据
    print "HTTP状态码: %d" % (HTTP_CODE)
    print "DNS解析时间: %.2f ms" % (NAMELOOKUP_TIME * 1000)
    print "建立连接时间: %.2f ms" % (CONNECT_TIME * 1000)
    print "准备传输时间: %.2f ms" % (PRETRANSFER_TIME * 1000)
    print "传输开始时间: %.2f ms" % (STARTTRANSFER_TIME * 1000)
    print "传输结束总时间: %.2f ms" %(TOTAL_TIME * 1000)
    print "下载数据包大小: %d bytes/s" %(SIZE_DOWNLOAD)
    print "HTTP头部大小: %d byte" %(HEADER_SIZE)
    print "平均下载速度: %d bytes/s" %(SPEED_DOWNLOAD)
    #关闭文件及Curl对象
    indexfile.close()
    c.close()

    chmod +x simple.py   #授予执行权限

    ./simple.py    #执行脚本

    执行结果如下:

  • 相关阅读:
    P2762 [网络流24题]太空飞行计划问题(最小割)
    poj2987 Firing[最小割]
    P2051 [AHOI2009]中国象棋[线性DP]
    poj1637 Sightseeing tour[最大流+欧拉回路]
    hdu3739 Anti LIS[最小割]
    P2766 [网络流24题]最长不下降子序列问题
    P2764 [网络流24题]最小路径覆盖问题[最大流]
    P2936(BZOJ3396) [USACO09JAN]全流Total Flow[最大流]
    BZOJ4278 [ONTAK2015]Tasowanie[后缀数组+贪心]
    Robot framework之元素定位实战
  • 原文地址:https://www.cnblogs.com/jzhg/p/8383574.html
Copyright © 2011-2022 走看看