Class: Trashed::Rack::MeasureResourceUsage

Inherits:
Object
  • Object
show all
Defined in:
lib/trashed/rack.rb

Instance Method Summary collapse

Constructor Details

#initialize(app, options = {}) ⇒ MeasureResourceUsage

Returns a new instance of MeasureResourceUsage.



4
5
6
7
8
9
10
# File 'lib/trashed/rack.rb', line 4

def initialize(app, options = {})
  @app = app
  @debug, @logger, @statsd, @sample_rate = options.values_at(:debug, :logger, :statsd, :sample_rate)
  @sample_rate ||= 0.1

  @request_namespaces, @sampler_namespaces = options.values_at(:statsd_request_namespaces, :statsd_sampler_namespaces)
end

Instance Method Details

#call(env) ⇒ Object



12
13
14
15
16
# File 'lib/trashed/rack.rb', line 12

def call(env)
  response = nil
  instrument(env) { response = @app.call(env) }
  response
end

#instrument(env, &block) ⇒ Object



18
19
20
21
22
# File 'lib/trashed/rack.rb', line 18

def instrument(env, &block)
  change = ResourceUsage.instrument(&block)
  usage  = ResourceUsage.gauge
  record env, change, usage
end

#record(env, change, usage) ⇒ Object



24
25
26
27
28
# File 'lib/trashed/rack.rb', line 24

def record(env, change, usage)
  record_env    env, change, usage
  record_logger env, change, usage if @logger
  record_statsd env, change, usage if @statsd
end

#record_debug_logger(env, change, usage) ⇒ Object



40
41
42
43
# File 'lib/trashed/rack.rb', line 40

def record_debug_logger(env, change, usage)
  @logger.debug "Changes: #{change.to_yaml}"
  @logger.debug "Usage: #{usage.to_yaml}"
end

#record_env(env, change, usage) ⇒ Object



30
31
32
33
# File 'lib/trashed/rack.rb', line 30

def record_env(env, change, usage)
  env['trashed.change'] = change
  env['trashed.usage']  = usage
end

#record_logger(env, change, usage) ⇒ Object



35
36
37
38
# File 'lib/trashed/rack.rb', line 35

def record_logger(env, change, usage)
  @logger.info "Rack handled in %dms (GC runs: %d)" % change.values_at('Time.wall', 'GC.count')
  record_debug_logger env, change, usage if @debug
end

#record_statsd(env, change, usage) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/trashed/rack.rb', line 45

def record_statsd(env, change, usage)
  record_statsd_timing change, :'Rack.Request.All'
  record_statsd_timing usage,  :'Rack.Server.All'

  Array(@request_namespaces.call(env)).each do |namespace|
    record_statsd_timing change, "Rack.Request.#{namespace}"
  end if @request_namespaces

  Array(@sampler_namespaces.call(env)).each do |namespace|
    record_statsd_timing usage, "Rack.Server.#{namespace}"
  end if @sampler_namespaces
end

#record_statsd_timing(data, namespace = nil) ⇒ Object



58
59
60
61
62
63
# File 'lib/trashed/rack.rb', line 58

def record_statsd_timing(data, namespace = nil)
  data.each do |name, value|
    name = "#{namespace}.#{name}" if namespace
    @statsd.timing name, value, @sample_rate
  end
end