class Metriks::Middleware
Constants
- CONTENT_LENGTH
- ERROR_RESPONSE
- NOT_FOUND_RESPONSE
- NOT_MODIFIED_RESPONSE
- REQUEST_DELAY
- REQUEST_START_HEADER
- VERSION
Public Class Methods
new(app)
click to toggle source
# File lib/metriks/middleware.rb, line 12 def initialize(app) @app = app end
Public Instance Methods
call(env)
click to toggle source
# File lib/metriks/middleware.rb, line 16 def call(env) time_response(env) do record_request_delay env record_response env call_downstream env end end
Protected Instance Methods
call_downstream(env)
click to toggle source
# File lib/metriks/middleware.rb, line 50 def call_downstream(env) status, headers, body = @app.call env record_staus_code status record_content_length headers [status, headers, body] end
duration_since_request_start(env)
click to toggle source
# File lib/metriks/middleware.rb, line 79 def duration_since_request_start(env) request_start = env[REQUEST_START_HEADER] return 0 unless request_start duration = ((Time.now.to_f * 1_000) - request_start.to_f).round duration > 0 ? duration : 0 end
record_content_length(headers)
click to toggle source
# File lib/metriks/middleware.rb, line 69 def record_content_length(headers) content_length = headers.fetch('Content-Length', 0).to_i return unless content_length > 0 Metriks.histogram(CONTENT_LENGTH).update(content_length) end
record_request_delay(env)
click to toggle source
# File lib/metriks/middleware.rb, line 36 def record_request_delay(env) delay = duration_since_request_start(env) Metriks.histogram(REQUEST_DELAY).update(delay) end
record_response(env)
click to toggle source
# File lib/metriks/middleware.rb, line 41 def record_response(env) original_callback = env['async.callback'] env['async.callback'] = lambda do |(status, headers, body)| record_staus_code status record_content_length headers original_callback.call [status, headers, body] end end
record_staus_code(status)
click to toggle source
# File lib/metriks/middleware.rb, line 58 def record_staus_code(status) status = status.to_i if status >= 500 Metriks.meter(ERROR_RESPONSE).mark elsif status == 404 Metriks.meter(NOT_FOUND_RESPONSE).mark elsif status == 304 Metriks.meter(NOT_MODIFIED_RESPONSE).mark end end
response_timer()
click to toggle source
# File lib/metriks/middleware.rb, line 75 def response_timer Metriks.timer('app') end
time_response(env, &handle_request)
click to toggle source
# File lib/metriks/middleware.rb, line 26 def time_response(env, &handle_request) if env.has_key? 'async.close' context = response_timer.time env['async.close'].callback do context.stop end handle_request.call else response_timer.time &handle_request end end