module Boxxspring::Worker::Metrics

Constants

METRICS_CLIENT
METRICS_MUTEX
METRICS_UPLOAD_INTERVAL

Public Class Methods

new( *arguments ) click to toggle source
Calls superclass method
# File lib/boxxspring/worker/metrics.rb, line 13
def initialize( *arguments )
  super

  @metrics = []
  @metric_defaults = [ {} ]

  Thread.new do
    upload_metrics
  end
end

Public Instance Methods

metric( *arguments ) { || ... } click to toggle source
# File lib/boxxspring/worker/metrics.rb, line 62
def metric ( *arguments )
  arguments = [ arguments ] unless arguments.first.is_a? Array
  computers = arguments.map do | metric |
    parsed_metric = parse_metric( metric )

    computer_class =
      "#{ parsed_metric[ :unit ].to_s.capitalize }MetricComputer".constantize
    computer_class.new( parsed_metric, @metric_defaults.last )
  end

  if block_given?
    computers.each( &:start )
    yield
    computers.each( &:stop )
  end

  METRICS_MUTEX.synchronize do
    @metrics = @metrics.concat(
      computers.map( &:to_json ).delete_if { | json | json.blank? }
    )
  end

end
metric_defaults( defaults = {} ) { || ... } click to toggle source
# File lib/boxxspring/worker/metrics.rb, line 53
def metric_defaults( defaults = {} )
  previous_defaults = @metric_defaults.last
  @metric_defaults.push( previous_defaults.merge( defaults ) )

  yield
  @metric_defaults.pop

end
upload_metrics() click to toggle source
# File lib/boxxspring/worker/metrics.rb, line 24
def upload_metrics
  loop do
    unless @metrics.empty?
      begin
        metrics_payload = nil

        METRICS_MUTEX.synchronize do
          metrics_payload = @metrics.shift(20)
        end

        METRICS_CLIENT.put_metric_data( {
          namespace: 'Unimatrix/Worker',
          metric_data: metrics_payload
        } )

      rescue => error
        logger.error(
          "An error has occured when making a request to the AWS " +
          "Cloudwatch endpoint 'put_metric_data'. - Error message: " +
          "#{ error.message }"
        )
      end

    end

    sleep METRICS_UPLOAD_INTERVAL
  end
end

Private Instance Methods

parse_metric( unparsed_metrics ) click to toggle source
# File lib/boxxspring/worker/metrics.rb, line 86
         def parse_metric ( unparsed_metrics )
  name, data, unit = unparsed_metrics.first, 1, :count

  data = unparsed_metrics[ 1 ] if unparsed_metrics[ 1 ].is_a? Integer
  unit = unparsed_metrics[ 1 ] if unparsed_metrics[ 1 ].is_a? Symbol
  unit = unparsed_metrics[ 2 ] unless unparsed_metrics[ 2 ].nil?

  { name: name, data: data, unit: unit }
end