Class: ServerMetrics::MultiCollector

Inherits:
Collector
  • Object
show all
Defined in:
lib/server_metrics/multi_collector.rb

Direct Known Subclasses

Disk, Network

Instance Attribute Summary

Attributes inherited from Collector

#collector_id, #data, #error

Instance Method Summary collapse

Methods inherited from Collector

#convert_to_mb, from_hash, #initialize, #linux?, #normalize_key, #option, #osx?, #run, #to_hash

Constructor Details

This class inherits a constructor from ServerMetrics::Collector

Instance Method Details

#counter(bundle_name, name, value, options = {}, &block) ⇒ Object

counters are also partitioned by bundle name

counter("/dev/desk2", :rkbps, stats['rsect'] / 2, :per => :second)
counter("/dev/desk2", :rpm, request_counter, :per => :minute)
counter("/dev/desk2", :swap_ins, vmstat['pswpin'], :per => :second, :round => true)


54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/server_metrics/multi_collector.rb', line 54

def counter(bundle_name, name, value, options = {}, &block)
  current_time = Time.now

  if data = memory(bundle_name, "_counter_#{name}")
    last_time, last_value = data[:time], data[:value]
    elapsed_seconds = current_time - last_time

    # We won't log it if the value has wrapped or enough time hasn't
    # elapsed
    if value >= last_value && elapsed_seconds >= 1
      if block
        result = block.call(last_value, value)
      else
        result = value - last_value
      end

      case options[:per]
        when :second, 'second'
          result = result / elapsed_seconds.to_f
        when :minute, 'minute'
          result = result / elapsed_seconds.to_f * 60.0
        else
          raise "Unknown option for ':per': #{options[:per].inspect}"
      end

      if options[:round]
        result = (result * (10 ** options[:round])).round / (10 ** options[:round]).to_f
      end
      report(bundle_name, name => result)
    end
  end

  remember(bundle_name, "_counter_#{name}" => {:time => current_time, :value => value})
end

#memory(bundle_name, name) ⇒ Object

for MultiCollector, Memory takes an additional argument specifying the sub-hash (bundle) in memory. The bundle name corresponds to the disk/network/whatever we’re storing memory for.

memory("/dev/desk2", :no_track)
memory.delete("/dev/desk2",:no_track)
memory.clear("/dev/desk2")


33
34
35
36
37
38
39
40
# File 'lib/server_metrics/multi_collector.rb', line 33

def memory(bundle_name, name)
  @memory[bundle_name] ||= {}
  if name.nil?
    @memory[bundle_name]
  else
    @memory[bundle_name][name] || @memory[name.is_a?(String) ? name.to_sym : String(name)]
  end
end

#remember(bundle_name, hash) ⇒ Object

just like the memory function, “remember” takes an additional argument to partition memory by bundle name



43
44
45
46
# File 'lib/server_metrics/multi_collector.rb', line 43

def remember(bundle_name, hash)
  @memory[bundle_name] ||= {}
  @memory[bundle_name].merge!(hash)
end

#report(bundle_name, values) ⇒ Object

report(“/dev/desk2”, :key=>value)



21
22
23
24
# File 'lib/server_metrics/multi_collector.rb', line 21

def report(bundle_name, values)
  @data[bundle_name] ||= {}
  @data[bundle_name].merge!(values)
end