gpt4 book ai didi

ruby - Sinatra - 如何为统计目的计算每个请求的响应时间?

转载 作者:数据小太阳 更新时间:2023-10-29 07:38:57 25 4
gpt4 key购买 nike

我想测量每个 Sinatra 路由的执行时间,包括完整的请求/响应周期持续时间,然后将此指标发送到 Graphite 服务器。

我的第一个方法是使用 Rack::Runtime,然后从 Sinatra after 过滤器的响应头中获取我需要的值,但我发现这个过滤器在响应完全发送到客户端之前实际执行。

所以不仅我无法访问 after block 中的许多响应信息,我也无法使用此 block 以任何其他方式将指标发送到 Graphite,因为它们不会反射(reflect)真实的响应时间.

我在其他主题中读到,一种可能的方法是创建一个 Rack 中间件 来包装应用程序并执行基准测试,我以这样的方式结束:

class GraphiteRoutesReporter

def initialize(app)
@app = app
end

def call(env)
start_time = Time.now
status, headers, body = @app.call(env)
time_taken = (1000 * (Time.now - start_time))

# send #{time_taken} to my stats server

[status, headers, body]
end
end

我可以将其包含在 config.ru 中并且看起来工作正常。

但我担心这段代码会扰乱核心 Rack 请求链,我担心我对 Sinatra 公共(public) API 的使用不正确。

获取 Sinatra 请求的完整响应时间的正确方法是什么?

最佳答案

如果我要为非关键业务原因(所以我们说的是“有趣”场景)找到解决方案,我会定期“解析”(awk) sinatra 的默认日志输出,其中包括响应时间(在最后:示例中的 0.1093 秒 - 如果我没记错的话)

179.24.226.1 - felixb [22/Aug/2016:13:30:46 +0200] "GET /index HTTP/1.0" 200 11546 0.1093

这可能会让我想到实现一个简单的 Logger,它会执行输出中应该发生的任何事情(是的,这就是 hack)。

但话虽如此,我觉得你的方法很好,只要确保卸载 # send #{time_taken} 到我的统计服务器 - 你不想让你的用户等待,因为你的 Graphite 是太难了,无法快速咬牙。

此外,如果它是关于分析您的网络应用程序/服务器的,请查看 https://github.com/MiniProfiler/rack-mini-profiler .

关于ruby - Sinatra - 如何为统计目的计算每个请求的响应时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39015971/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com