我想测量每个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请求的完整响应时间?