ruby – Sinatra – 如何计算每个请求统计信息的响应时间?
我想测量每个Sinatra路由的执行时间,包括完整的请求/响应周期持续时间,然后将此指标发送到Graphite服务器.
我的第一种方法是使用Rack :: Runtime,然后在过滤后从Sinatra的响应头中获取我需要的值,但我发现这个过滤器实际上是在响应完全发送到客户端之前执行的. 因此,我不仅无法在后块中访问许多响应信息,我也无法使用此块以任何其他方式将指标发送到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,body] end end 我可以在config.ru中包含它,似乎它工作正常. 但我担心的是这个代码搞乱了核心Rack请求链,我担心我错误地使用了Sinatra公共API. 获取Sinatra请求的完整响应时间的正确方法是什么? 解决方法
如果我找到一个非商业关键原因的解决方案(所以我们谈论一个“有趣的” – 场景)我会经常“解析”(awk)sinatra的默认日志输出,其中包含响应时间(at最后:示例中的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}卸载到我的统计服务器上 – 你不想让你的用户等待,因为你的Graphite太难以快速掌握. 此外,如果是关于分析您的网络应用程序/服务器,请查看https://github.com/MiniProfiler/rack-mini-profiler. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |