class Proceso::Middleware

Constants

SUBSCRIPTION

Attributes

app[R]
config[R]
notifier[R]
pid[R]

Public Class Methods

logger() click to toggle source
# File lib/proceso/middleware.rb, line 25
def logger
  @logger ||= begin
    Rails.configuration.logger || ActiveSupport::Logger.new(STDOUT)
  end
end
new(app, options = {}) click to toggle source
# File lib/proceso/middleware.rb, line 35
def initialize(app, options = {})
  @app       = app
  @notifier  = ActiveSupport::Notifications
  @pid       = Process.pid
  @config    = ActiveSupport::InheritableOptions.new(options[:config])
end
start_instrument!() click to toggle source
# File lib/proceso/middleware.rb, line 11
def start_instrument!
  logger.info "[Proceso #{Proceso::VERSION}] Proceso Middleware is activated. (#{Rails.env.to_s} mode)"
  subscribe do |name, start, finish, id, payload|
    mem_used    = (payload[:mem_used].to_f / 1024.0).round(1)
    cpu_used    = payload[:cpu_used].to_f.round(1)
    path        = payload[:request].path_info
    logger.debug "[PROCESO] MEM: #{mem_used}KB\tCPU: #{cpu_used}\tPATH: #{path}"
  end
end
subscribe(&blk) click to toggle source
# File lib/proceso/middleware.rb, line 21
def subscribe(&blk)
  ActiveSupport::Notifications.subscribe(SUBSCRIPTION, &blk)
end

Public Instance Methods

build_process_payload() click to toggle source
# File lib/proceso/middleware.rb, line 59
def build_process_payload
  mem   = process.mem_size
  cpu   = process.user_cpu_times
  [mem, cpu]
end
calculate_process_usage(req, m1, m2, c1, c2) click to toggle source
# File lib/proceso/middleware.rb, line 65
def calculate_process_usage(req, m1, m2, c1, c2)
  mem_used  = m2 - m1
  cpu_used  = c2 - c2
  {
    pid:       process.pid,
    mem_used:  mem_used,
    cpu_used:  cpu_used,
    request:   req
  }
end
call(env) click to toggle source
# File lib/proceso/middleware.rb, line 42
def call(env)
  return @app.call(env) if path_excluded?(env["PATH_INFO"])
  capture_process_usage(env) do
    @app.call(env)
  end
end
capture_process_usage(env) { || ... } click to toggle source
# File lib/proceso/middleware.rb, line 49
def capture_process_usage(env)
  request = Rack::Request.new(env)
  mem_1, cpu_1 = build_process_payload
  response = yield
  mem_2, cpu_2 = build_process_payload
  process_payload = calculate_process_usage(request, mem_1, mem_2, cpu_1, cpu_2)
  notifier.instrument(SUBSCRIPTION, process_payload)
  response
end
exclusions() click to toggle source
# File lib/proceso/middleware.rb, line 80
def exclusions
  config.exclusions || []
end
path_excluded?(path) click to toggle source
# File lib/proceso/middleware.rb, line 84
def path_excluded?(path)
  exclusions.any? {|e| path =~ e }
end
process() click to toggle source
# File lib/proceso/middleware.rb, line 76
def process
  @process ||= Proceso::PID.new(pid)
end