需要测量HTTP请求延迟并根据Akamai头部内容将结果发送到graphite
我不是程序员。
我一直在寻找一种方法,想写一个Python脚本来测量访问Akamai网址的延迟,并根据Akamai缓存的反馈(是命中还是未命中)通过statsd把这些数据发送到graphite,这样我就可以直观地看到命中和未命中的延迟差异。
我现在有的内容:
发送一个带有自定义头部的请求到一个网址:
headers = {"Pragma": "akamai-x-cache-on,akamai-x-cache-remote-on", "Accept": "text/plain"}
进行一个HTTP请求:
conn = httplib.HTTPConnection("api.example.com", 80)
conn.request("GET", "/example.json?app=app1,key=keytext", '', headers)
然后根据响应的头部,看看头部 x-cache
是否是几个可能的答案之一,比如TCP_MEM_HIT、TCP_HIT等,如果是的话,就把这个信息发送到statsd计数器,这样我就可以把数据发送到graphite,并绘制命中和未命中的延迟图。
在这方面我有点无从下手。我可以看到我的响应是200 OK,通过:
r1 = conn.getresponse()
print(r1.status, r1.reason)
而且我可以通过以下方式看到我想要的头部:
print r1.getheaders()
解析内容是我卡住的地方。我相信我可以从网上找到很多示例代码来拼凑在一起,而且我也可以学习Python。也许这里有人能告诉我我是不是走错了方向,或者有没有简单的解决办法。
更新:
这是我脚本当前输出的头部示例:
[('content-length', '27397'), ('x-cache', 'TCP_REFRESH_MISS from a23-220-148-154.deploy.akamaitechnologies.com (AkamaiGHost/6.16.4.2-13281669) (S)'), ('content-language', 'en-US'), ('expires', 'Mon, 25 Aug 2014 15:50:41 GMT'), ('vary', 'Accept-Encoding'), ('connection', 'keep-alive'), ('cache-control', 'public, max-age=297'), ('date', 'Mon, 25 Aug 2014 15:45:44 GMT'), ('content-type', 'application/json;charset=UTF-8'), ('x-cache-remote', 'TCP_REFRESH_MISS from a23-220-148-152.deploy.akamaitechnologies.com (AkamaiGHost/6.16.4.2-13281669) (S)')]
‘x-cache’和‘x-cache-remote’很有意思。目前,我只对‘x-cache’感兴趣,在这个例子中,结果是‘TCP_REFRESH_MISS’。我需要把这个命中计数发送到statsd,这样它就会把这个算作‘TCP_REFRESH_MISS’。如果是‘TCP_HIT’,我就需要把那个发送到statsd。对于每个‘x-cache’响应,我还需要发送访问Akamai的延迟时间。一旦我把这些数据放到statsd里,我就会把统计信息发送到graphite,这样我就可以在图上看到每种命中和未命中的延迟。这将帮助我们的开发团队判断我们所做的任何更改是否会影响延迟。
1 个回答
像这样应该可以工作:
import statsd
HEADERS_OF_INTEREST = ("TCP_REFRESH_MISS", "TCP_HIT")
statsd_client = statsd.StatsClient('YOUR_STATSD_SERVER', 8125)
def process_x_cache_header(value):
for header in HEADERS_OF_INTEREST:
if value.startswith(header):
statsd_client.incr("akami.{}".format(header))
for header, value in r1.getheaders():
if header == "x-cache":
process_x_cache_header(value)
如果你想把数据发送到statsd,下面这两个包可能是你需要的: