Skip to content

Instantly share code, notes, and snippets.

@neerajsingh0101
Created March 4, 2025 10:11
Show Gist options
  • Select an option

  • Save neerajsingh0101/35e5307fb197b08ac6a62aa725cafec6 to your computer and use it in GitHub Desktop.

Select an option

Save neerajsingh0101/35e5307fb197b08ac6a62aa725cafec6 to your computer and use it in GitHub Desktop.
class RequestQueueTimeMiddleware
MILLISECONDS_CUTOFF = Time.new(2000, 1, 1).to_i * 1000
MICROSECONDS_CUTOFF = MILLISECONDS_CUTOFF * 1000
NANOSECONDS_CUTOFF = MICROSECONDS_CUTOFF * 1000
def initialize(app)
@app = app
end
def call(env)
queue_time = calculate_queue_time(env)
status, headers, body = @app.call(env)
if queue_time
# Replace this with your APM agent
NewRelic::Agent.add_custom_attributes({request_queue_time: queue_time})
end
[status, headers, body]
end
def calculate_queue_time(env)
request_start = parse_request_start(env["HTTP_X_REQUEST_START"])
return nil unless request_start
now = Time.zone.now
queue_time = ((now - request_start) * 1000).to_i
queue_time -= env["puma.request_body_wait"].to_i
(queue_time > 0) ? queue_time : 0
end
def parse_request_start(header)
return nil unless header
value = header.gsub(/[^0-9.]/, "").to_f
if value > NANOSECONDS_CUTOFF
Time.zone.at(value / 1_000_000_000.0)
elsif value > MICROSECONDS_CUTOFF
Time.zone.at(value / 1_000_000.0)
elsif value > MILLISECONDS_CUTOFF
Time.zone.at(value / 1000.0)
else
Time.zone.at(value)
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment