class MemoryMonitoring::Rack

Public Class Methods

new(app) click to toggle source
# File lib/memory_monitoring/rack.rb, line 6
def initialize(app)
  @app = app
  logger.formatter = SimpleFormatter.new
  reset # 重置计数器
end

Public Instance Methods

call(env) click to toggle source
# File lib/memory_monitoring/rack.rb, line 12
def call(env)
  request_uri = env['HTTP_HOST'] + env['PATH_INFO']
  @messages = []
  # 除静态文件外,读取当前内存
  unless request_uri =~ /\/(assets|uploads|images|fonts|js|css)|.(js|css|png|gif|jpg|jpeg|woff|txt|ico|eot|map|svg|ttf)/
    @start_rss = current_memory
     @start_at = Time.now 
  end
  # 获取输出内容
  status, headers, response = @app.call(env)
# rescue => e # 出错了
ensure
  unless messages.empty?
    @level = :error if status.nil? || status.between?(400, 600)
    logger.send @level, (@messages + [ request_uri ]).join("\t")
    unless response.nil?
      body = (response.respond_to?(:body) ? response.body : response).first
      injector = Injector.new(@messages)
      return [status, headers, [injector.injection(env['HTTP_ACCEPT'], body)]]
    end
  end
end

Private Instance Methods

current_memory() click to toggle source
# File lib/memory_monitoring/rack.rb, line 60
def current_memory
  (`ps -o rss= -p #{$$}`.to_f / 1024).round(2)
end
distance() click to toggle source
# File lib/memory_monitoring/rack.rb, line 56
def distance # 内存差
  (@ended_rss - @start_rss).round(2)
end
logger() click to toggle source
# File lib/memory_monitoring/rack.rb, line 64
def logger
  @logger ||= ::Logger.new './log/memory.log', 'daily'
end
messages() click to toggle source
# File lib/memory_monitoring/rack.rb, line 37
def messages
  if @start_rss > 0
    @ended_rss = current_memory
     @ended_at = Time.now
    if distance > 0 
      @messages << "Response Time: #{(@ended_at - @start_at).round(3)} sec."
      @messages << "Consume Memory: #{distance} MB."
      @messages << "Now: #{@ended_rss} MB."
    end
    reset # 重置计数器
  end
  @messages
end
reset() click to toggle source
# File lib/memory_monitoring/rack.rb, line 51
def reset
  @level = :info
  @start_rss = @ended_rss = 0
end