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