Class: TjScaleRuby::RackQueueTimeMiddleware

Inherits:
Object
  • Object
show all
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

Instance Method Summary collapse

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.

Returns:

  • (Integer, nil)

    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