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

Ale*_*ini 5 ruby rack sinatra

我想测量每个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
Run Code Online (Sandbox Code Playgroud)

我可以加入其中,config.ru并且看起来工作正常。

但是我担心此代码会与核心的Rack请求链混淆,并且我担心我没有正确使用Sinatra公共API。

哪种方法可以获取Sinatra请求的完整响应时间?

Fel*_*lix 1

如果我要为非业务关键原因找到解决方案(因此我们谈论“有趣”的场景),我会定期“解析”(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
Run Code Online (Sandbox Code Playgroud)

这可能会让我想到实现一个简单的记录器,它可以对输出执行任何操作(是的,这是一个黑客)。

但话虽如此,你的方法对我来说看起来不错,只要确保卸载# send #{time_taken} to my stats server- 你不想让你的用户等待,因为你的石墨太硬而无法快速啮合。

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