Module: Boxxspring::Worker::Metrics

Included in:
Base
Defined in:
lib/boxxspring/worker/metrics.rb

Constant Summary collapse

METRICS_MUTEX =
Mutex.new
METRICS_CLIENT =
Aws::CloudWatch::Client.new
METRICS_UPLOAD_INTERVAL =
0.5

Instance Method Summary collapse

Instance Method Details

#initialize(*arguments) ⇒ Object



13
14
15
16
17
18
19
20
21
22
# File 'lib/boxxspring/worker/metrics.rb', line 13

def initialize( *arguments )
  super

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

  Thread.new do
    upload_metrics
  end
end

#metric(*arguments) ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# 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 = {}) ⇒ Object



53
54
55
56
57
58
59
60
# 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_metricsObject



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# 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