Sha256: ac1b3a0f577b426de5f72e740c8220af4afce880a60ee352bb252a62b2123fdc

Contents?: true

Size: 1.29 KB

Versions: 5

Compression:

Stored size: 1.29 KB

Contents

# frozen_string_literal: true

module RailsAutoscaleAgent
  class Request
    include Logger

    def initialize(env, config)
      @config = config
      @id = env['HTTP_X_REQUEST_ID']
      @size = env['rack.input'].respond_to?(:size) ? env['rack.input'].size : 0
      @request_body_wait = env['puma.request_body_wait'].to_i

      @entered_queue_at = if unix_millis = env['HTTP_X_REQUEST_START']
        Time.at(unix_millis.to_f / 1000)
      elsif config.dev_mode?
        # In dev mode, fake a queue time of 0-1000ms
        Time.now - rand + @request_body_wait
      end
    end

    def ignore?
      @config.ignore_large_requests? && @size > @config.max_request_size
    end

    def queue_time
      if @entered_queue_at
        queue_time = ((Time.now - @entered_queue_at) * 1000).to_i

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

        logger.debug "Request queue_time=#{queue_time}ms body_wait=#{@request_body_wait}ms request_id=#{@id} size=#{@size}"

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

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
rails_autoscale_agent-0.9.1 lib/rails_autoscale_agent/request.rb
rails_autoscale_agent-0.9.0 lib/rails_autoscale_agent/request.rb
rails_autoscale_agent-0.9.0.beta.5 lib/rails_autoscale_agent/request.rb
rails_autoscale_agent-0.9.0.beta.4 lib/rails_autoscale_agent/request.rb
rails_autoscale_agent-0.9.0.beta.2 lib/rails_autoscale_agent/request.rb