我想测量每个Sinatra路由的执行时间,包括完整的请求/响应周期持续时间,然后将此指标发送到 Graphite 服务器。
我的第一种方法是使用Rack::Runtime
,然后从Sinatra after
过滤器中的响应头中获取我需要的值,但我发现在完全发送响应之前实际执行了此过滤器给客户。
因此,我不仅无法在after
块中访问许多响应信息,我也无法使用此块以任何其他方式将指标发送到Graphite,因为它们不会反映真实的响应时间。
我已经读过其他主题,可能的方法是创建一个 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
中包含哪些内容,而且似乎工作正常。
但是我担心这个代码会破坏Core的核心请求链,我担心我错误地使用了Sinatra公共API。
获取Sinatra请求的完整响应时间的正确方法是什么?
答案 0 :(得分:0)
如果我找到非商业关键原因的解决方案(所以我们谈论一个“有趣”的场景)我会经常“解析”(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,它会对输出做任何事情(是的,那就是黑客攻击)。
但是那样说,你的方法看起来很好,只要确保卸载# send #{time_taken} to my stats server
- 你不想让你的用户等待,因为你的Graphite太难以快速掌握。
此外,如果要分析您的网络应用/服务器,请查看https://github.com/MiniProfiler/rack-mini-profiler。