Sinatra - 如何计算每个统计信息请求的响应时间?

时间:2016-08-18 10:34:35

标签: ruby sinatra rack

我想测量每个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请求的完整响应时间的正确方法是什么?

1 个答案:

答案 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