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

0 投票
1 回答
653 浏览
提问于 2025-04-18 18:14

我不是程序员。

我一直在寻找一种方法,想写一个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 个回答

0

像这样应该可以工作:

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,下面这两个包可能是你需要的:

撰写回答