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
- #initialize(*arguments) ⇒ Object
- #metric(*arguments) ⇒ Object
- #metric_defaults(defaults = {}) ⇒ Object
- #upload_metrics ⇒ Object
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_metrics ⇒ Object
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 |