Class: TjScaleRuby::RackQueueTimeMiddleware
- Inherits:
-
Object
- Object
- TjScaleRuby::RackQueueTimeMiddleware
- Defined in:
- lib/tj_scale_ruby/rack_queue_time_middleware.rb
Overview
Records approximate router queue wait from Heroku’s X-Request-Start so web.1 metrics can send queue_time_ms without relying on a static ENV value.
Enable with TJ_SCALE_ENABLE_QUEUE_TIME_MIDDLEWARE=1 (see Railtie).
Class Method Summary collapse
-
.queue_wait_ms(env) ⇒ Integer?
Milliseconds since request entered the router, or nil if header missing/invalid.
Instance Method Summary collapse
- #call(env) ⇒ Object
-
#initialize(app) ⇒ RackQueueTimeMiddleware
constructor
A new instance of RackQueueTimeMiddleware.
Constructor Details
#initialize(app) ⇒ RackQueueTimeMiddleware
Returns a new instance of RackQueueTimeMiddleware.
9 10 11 |
# File 'lib/tj_scale_ruby/rack_queue_time_middleware.rb', line 9 def initialize(app) @app = app end |
Class Method Details
.queue_wait_ms(env) ⇒ Integer?
Returns milliseconds since request entered the router, or nil if header missing/invalid.
24 25 26 27 28 29 30 |
# File 'lib/tj_scale_ruby/rack_queue_time_middleware.rb', line 24 def self.queue_wait_ms(env) start_ms = request_start_epoch_ms(env) return nil unless start_ms now_ms = (Time.now.utc.to_f * 1000).round [now_ms - start_ms, 0].max end |
Instance Method Details
#call(env) ⇒ Object
13 14 15 16 17 18 19 20 21 |
# File 'lib/tj_scale_ruby/rack_queue_time_middleware.rb', line 13 def call(env) t0 = Process.clock_gettime(Process::CLOCK_MONOTONIC, :float_millisecond) ms = self.class.queue_wait_ms(env) TjScaleRuby.record_web_queue_time_ms!(ms) unless ms.nil? status, headers, body = @app.call(env) elapsed = (Process.clock_gettime(Process::CLOCK_MONOTONIC, :float_millisecond) - t0).round TjScaleRuby.record_web_request_finished!(elapsed) [status, headers, body] end |