经常使用基调网络的同学,可能对基调网络对页面元素的性能展示感觉很好。它可以做到对一条URL做详细的检测,包括:阻塞时间、DNS解析时间、建立连接时间、SSL握手时间、发出请求时间、首包时间等。
其实,我们也可以做到。比如Python pycurl 库就可以做到对数据的收集,然后可以对收集的数据写入redis或者Mysql。最后前端使用echars通过图形的形式进行展示出来。
echars是百度一个开源项目,功能很强大(项目URL:http://echarts.baidu.com)可以将数据通过各种图形的形式展现出来。
使用Pycurl 监测指定站点相关系能
Pycurl是个用C语言实现的python库,Pycurl可以用来获取指定URL的响应对象。它支持的协议很多,如:FTP、FTPS、HTTP、HTTPS、TELNET等。
可以使用Pycurl库编写的脚本放到不同地区的CDN节点上,通过Crond Job或者守护进程的方式,在该节点测试指定站点,然后将测试结果通过RPC或者Http方式发送到服务端写入redis或Mysql,最后通过前端页面展现出来。
#!/usr/bin/env python
import pycurl
import sys
import json
WEB_SITES = sys.argv[1]
def main():
c = pycurl.Curl()
c.setopt(pycurl.URL, WEB_SITES) #设置session
c.setopt(pycurl.FOLLOWLOCATION, 1)
content = c.perform() #执行传输动作
dns_time = c.getinfo(pycurl.NAMELOOKUP_TIME) #DNS 建连时间
conn_time = c.getinfo(pycurl.CONNECT_TIME) #TCP/IP 三次握手时间
starttransfer_time = c.getinfo(pycurl.STARTTRANSFER_TIME) #首包时间
total_time = c.getinfo(pycurl.TOTAL_TIME) #上一请求的总时间
http_code = c.getinfo(pycurl.HTTP_CODE) #HTTP响应代码
redirect_count = c.getinfo(pycurl.REDIRECT_COUNT) #重定向次数
size_upload = c.getinfo(pycurl.SIZE_UPLOAD) #上传字节大小
size_download = c.getinfo(pycurl.SIZE_DOWNLOAD) #下载字节大小
header_size = c.getinfo(pycurl.HEADER_SIZE) #头部大小
request_size = c.getinfo(pycurl.REQUEST_SIZE) #请求大小
content_type = c.getinfo(pycurl.CONTENT_TYPE) #请求内容类型
c.close() #关闭处理Curl的session
data = json.dumps({'dns_time':dns_time,
'conn_time':conn_time,
'starttransfer_time':starttransfer_time,
'total_time':total_time,
'http_code':http_code,
'redirect_count':redirect_count,
'size_upload':size_upload,
'size_download':size_download,
'header_size':header_size,
'request_size':request_size,
'content_type':content_type})
return data
if __name__ == "__main__":
print main()
该脚本执行结果如下:
除了上面脚本使用的一些相应信息外,Pycurl还支持很多响应信息:
pycurl.PRETRANSFER_TIME #建立连接后到开始传输的时间
pycurl.REDIRECT_TIME #如果存在跳转,所花费的时间
pycurl.SPEED_UPLOAD #上传速度
pycurl.CONTENT_LENGTH_DOWNLOAD #下载内容长度
pycurl.CONTENT_LENGTH_UPLOAD #上传内容的长度
pycurl.SPEED_DOWNLOAD #下载速度
pycurl.INFO_FILETIME #文件的时间信息
Pycurl.HTTP_CONNECTCODE #HTTP连接代码
这样,各地区Cache节点就可以跑起来了,可以通过RPC或者其他方式将获取的数据传到服务端。最后通过前端页面渲染出来就ok了。由于我们单位买了基调的服务,所以我就没有写前端的页面,如果哪位需要的话,可以搞一下。