Class: Judoscale::RequestMetrics

Inherits:
Object
  • Object
show all
Defined in:
lib/judoscale/request_metrics.rb

Constant Summary collapse

MILLISECONDS_CUTOFF =
Time.new(2000, 1, 1).to_i * 1000
MICROSECONDS_CUTOFF =
MILLISECONDS_CUTOFF * 1000
NANOSECONDS_CUTOFF =
MICROSECONDS_CUTOFF * 1000

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(env, config = Config.instance) ⇒ RequestMetrics

Returns a new instance of RequestMetrics.



11
12
13
14
15
16
17
# File 'lib/judoscale/request_metrics.rb', line 11

def initialize(env, config = Config.instance)
  @config = config
  @request_id = env["HTTP_X_REQUEST_ID"]
  @size = env["rack.input"].respond_to?(:size) ? env["rack.input"].size : 0
  @network_time = env["puma.request_body_wait"].to_i
  @request_start_header = env["HTTP_X_REQUEST_START"]
end

Instance Attribute Details

#network_timeObject (readonly)

Returns the value of attribute network_time.



9
10
11
# File 'lib/judoscale/request_metrics.rb', line 9

def network_time
  @network_time
end

#request_idObject (readonly)

Returns the value of attribute request_id.



9
10
11
# File 'lib/judoscale/request_metrics.rb', line 9

def request_id
  @request_id
end

#sizeObject (readonly)

Returns the value of attribute size.



9
10
11
# File 'lib/judoscale/request_metrics.rb', line 9

def size
  @size
end

Instance Method Details

#elapsed_timeObject



34
35
36
37
38
39
40
41
# File 'lib/judoscale/request_metrics.rb', line 34

def elapsed_time
  start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
  response = yield
  finish = Process.clock_gettime(Process::CLOCK_MONOTONIC)

  elapsed = ((finish - start) * 1000).to_i
  [elapsed, response]
end

#queue_time(now = Time.now) ⇒ Object



23
24
25
26
27
28
29
30
31
32
# File 'lib/judoscale/request_metrics.rb', line 23

def queue_time(now = Time.now)
  queue_time = ((now.utc - started_at.utc) * 1000).to_i

  # Subtract the time Puma spent waiting on the request body, i.e. the network time. It's irrelevant to
  # capacity-related queue time. Without this, slow clients and large request payloads will skew queue time.
  queue_time -= network_time

  # Safeguard against negative queue times (should not happen in practice)
  (queue_time > 0) ? queue_time : 0
end

#track_queue_time?Boolean

Returns:

  • (Boolean)


19
20
21
# File 'lib/judoscale/request_metrics.rb', line 19

def track_queue_time?
  @request_start_header && !ignore_large_request?
end