2016-08-18 233 views
4

我想測量每條Sinatra路線的執行時間,包括完整的請求/響應週期時間,然後將此度量標準發送到一個Graphite服務器。Sinatra - 如何計算每個統計請求的響應時間?

我的第一種方法是使用Rack::Runtime,然後取我從西納特拉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,似乎它的工作正常。

但我擔心這個代碼搞亂了核心Rack請求鏈,我擔心我對Sinatra公共API的使用不正確。

哪種方法可以獲得Sinatra請求的完整響應時間?

回答

0

如果我找到一個非關鍵業務的原因(所以我們談論一個「好玩」 -scenario)我會經常「解析」(awk)西納特拉在默認日誌輸出解決方案響應時間包括(在最後:在本例中0.1093秒 - 如果我沒看錯)

179.24.226.1 - felixb [22/Aug/2016:13:30:46 +0200] "GET /index HTTP/1.0" 200 11546 0.1093 

這可能會帶我去實現一個簡單的記錄器誰不應該與輸出發生任何的想法(是的,這是一個黑客)。

但是這樣說,您的方法對我來說看起來很好,只要確保卸載# send #{time_taken} to my stats server - 您不希望讓用戶等待,因爲您的Graphite太難以快速獲取牙齒。

此外,如果是關於分析您的網絡應用程序/服務器,請看看https://github.com/MiniProfiler/rack-mini-profiler