code-lever/mobileminer-adapter-gem

View on GitHub
lib/mobileminer/adapter/monitor.rb

Summary

Maintainability
B
4 hrs
Test Coverage
require 'json'

module Mobileminer
  module Adapter

    class Monitor

      def initialize(email, key, miners, logger)
        @email = email
        @key = key
        @miners = miners.map do |m|
          fetcher = Mobileminer::Adapter::Fetcher.new(m[:client], m[:name], logger)
          { fetcher: fetcher }.merge(m)
        end
        @log = logger
      end

      def run
        api = Mobileminer::Adapter::API.new(@email, @key, @log)

        @log.info("Monitoring #{@miners.length} miners")
        loop do
          @miners.each do |miner|
            @log.debug("Beginning miner: #{miner}")

            begin
              update = miner[:fetcher].get_update
            rescue Timeout::Error => e
              @log.warn("Timeout::Error building update for #{miner[:name]} (#{e})")
              next
              # XXX put something in the update to indicate it barfed?
            rescue SystemCallError => e
              @log.error("SystemCallError building update for #{miner[:name]} (#{e})")
              next
              # XXX put something in the update to indicate it barfed?
            rescue Exception => e
              @log.error("Exception building update for #{miner[:name]} (#{e})")
              next
              # XXX put something in the update to indicate it barfed?
            end

            @log.info("Submitting update for #{miner[:name]}")
            begin
              tries ||= 3
              response = api.statistics(miner[:name], update)
            rescue Exception => e
              @log.error("Exception submitting updates (#{e})")
              unless (tries -= 1).zero?
                @log.error('Retrying...')
                retry
              else
                @log.error('Giving up for this update...')
              end
            else
              if 201 == response.code
                @log.debug('Successfully submitted update')
              else
                @log.error('Error submitting updates, check API key!')
              end
            end
          end

          sleep 60
        end
      end

    end

  end
end