Python 需要根据Akamai标头的内容测量HTTP请求延迟并将结果发送到graphite

Python 需要根据Akamai标头的内容测量HTTP请求延迟并将结果发送到graphite,python,httplib,Python,Httplib,我不是程序员 我一直在寻找一种编写python脚本的方法,以测量发送到Akamai URL的web请求的延迟,并根据Akamai缓存是否报告命中或未命中,通过statsd将此数据发送到graphite,以便我可以图形化地查看一段时间内命中和未命中延迟的差异 到目前为止,我所拥有的: 向包含自定义标题的URL发送请求: headers = {"Pragma": "akamai-x-cache-on,akamai-x-cache-remote-on", "Accept": "text/plain"}

我不是程序员

我一直在寻找一种编写python脚本的方法,以测量发送到Akamai URL的web请求的延迟,并根据Akamai缓存是否报告命中或未命中,通过statsd将此数据发送到graphite,以便我可以图形化地查看一段时间内命中和未命中延迟的差异

到目前为止,我所拥有的:

向包含自定义标题的URL发送请求:

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\u REFRESH\u MISS”就是结果。我需要向statsd发送一个命中计数器,以便它将此计数为“TCP\u刷新\u未命中”。例如,如果它是“TCP_HIT”,我需要将它发送给statsd。对于每个“x-cache”响应,我还需要将呼叫的延迟时间发送给Akamai。一旦我在statsd中有了它,我会将统计数据发送给graphite,这样我就可以在图表上看到每种类型的命中和未命中的延迟。这将使我们的开发团队能够评估我们所做的任何更改是否会影响延迟。

类似的操作应该会起作用:

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发送数据,这两个包中的任何一个都可能是您想要的:


您能否发布标题内容,以及您所追求的逻辑的更多细节?OP将使用此信息进行更新。谢谢if语句假定可能的头值是已知的,并且对每个头值执行不同的操作。在我们的例子中,无论value.startswith包含什么,都将执行相同的操作,我们只想将此值和调用的延迟发送到statsd。我将查看您提供的链接,以确定如何最好地向statsd发送统计数据。这很有帮助。快速更新以显示使用statds包有多容易。这看起来进展不错。现在我所需要的就是计时部件,我将在开发环境中进行尝试。