code-lever/brigade-monitor-gem

View on GitHub
lib/brigade/monitor/fetcher.rb

Summary

Maintainability
A
2 hrs
Test Coverage
module Brigade
  module Monitor

    class Fetcher

      def initialize(client, name, logger)
        @client = client
        @name = name
        @log = logger
      end

      def get_update
        version = @client.version
        summary = @client.summary
        devs = @client.devs
        pools = @client.pools

        # XXX check status replies on each command?

        update = host_info(summary, version)

        devs.body.each do |dev|
          if dev.has_key? 'GPU'
            update[:gpus] << gpu_info(dev)
          elsif dev.has_key? 'ASC'
            update[:asics] << asic_info(dev)
          elsif dev.has_key? 'PGA'
            update[:fpgas] << fpga_info(dev)
          else
            @log.warn("Skipped unknown device: #{dev}")
          end
        end

        pools.body.each do |pool|
          update[:pools] << pool_info(pool)
        end

        @log.debug("Built update: #{update}")
        update
      end

      private

      def find_mhash_current(blob)
        blob[blob.keys.select { |k| /MHS \ds/.match(k) }.first] || 0
      end

      def host_info(summary, version)
        sum = summary.body[0]
        ver = version.body[0]
        {
          host: @name,
          uptime: sum['Elapsed'],
          mhash_average: sum['MHS av'],
          mhash_current: find_mhash_current(sum),
          found_blocks: sum['Found Blocks'],
          getworks: sum['Getworks'],
          accepted: sum['Accepted'],
          rejected: sum['Rejected'],
          hardware_errors: sum['Hardware Errors'],
          utility: sum['Utility'],
          discarded: sum['Discarded'],
          stale: sum['Stale'],
          get_failures: sum['Get Failures'],
          local_work: sum['Local Work'],
          remote_failures: sum['Remote Failures'],
          network_blocks: sum['Network Blocks'],
          total_mhash: sum['Total MH'],
          work_utility: sum['Work Utility'],
          difficulty_accepted: sum['Difficulty Accepted'],
          difficulty_rejected: sum['Difficulty Rejected'],
          difficulty_stale: sum['Difficulty Stale'],
          best_share: sum['Best Share'],
          device_hardware_percent: sum['Device Hardware%'],
          device_rejected_percent: sum['Device Rejected%'],
          pool_rejected_percent: sum['Pool Rejected%'],
          pool_stale_percent: sum['Pool Stale%'],
          api_version: ver['API'],
          cgminer_version: ver['CGMiner'],
          sgminer_version: ver['SGMiner'],
          asics: [],
          fpgas: [],
          gpus: [],
          pools: [],
          agent: {
            name: 'brigade-monitor-gem',
            platform: RUBY_PLATFORM,
            version: Brigade::Monitor::VERSION
          }
        }
      end

      def device_info(device)
        {
          temperature: device['Temperature'],
          enabled: device['Enabled'] == 'Y',
          status: device['Status'],
          uptime: device['Device Elapsed'],
          mhash_average: device['MHS av'],
          mhash_current: find_mhash_current(device),
          accepted: device['Accepted'],
          rejected: device['Rejected'],
          hardware_errors: device['Hardware Errors'],
          utility: device['Utility'],
          rejected_percent: device['Device Rejected%'],
          last_share_pool: device['Last Share Pool'],
          last_share_time: device['Last Share Time'],
          total_mhash: device['Total MH'],
          diff1_work: device['Diff1 Work'],
          difficulty_accepted: device['Difficulty Accepted'],
          difficulty_rejected: device['Difficulty Rejected'],
          last_share_difficulty: device['Last Share Difficulty'],
          last_valid_work: device['Last Valid Work'],
        }
      end

      def asic_info(device)
        {
          index: device['ASC'],
        }.merge(device_info(device))
      end

      def fpga_info(device)
        {
          index: device['PGA'],
          frequency: device['Frequency'],
        }.merge(device_info(device))
      end

      def gpu_info(device)
        {
          index: device['GPU'],
          fan_speed: device['Fan Speed'],
          fan_percent: device['Fan Percent'],
          gpu_clock: device['GPU Clock'],
          memory_clock: device['Memory Clock'],
          gpu_voltage: device['GPU Voltage'],
          gpu_activity: device['GPU Activity'],
          powertune: device['Powertune'],
          intensity: device['Intensity'],
        }.merge(device_info(device))
      end

      def pool_info(pool)
        {
          index: pool['POOL'],
          url: pool['URL'],
          status: pool['Status'],
          priority: pool['Priority'],
          quota: pool['Quota'],
          longpoll: pool['Long Poll'] == 'Y',
          getworks: pool['Getworks'],
          accepted: pool['Accepted'],
          rejected: pool['Rejected'],
          works: pool['Works'],
          discarded: pool['Discarded'],
          stale: pool['Stale'],
          get_failures: pool['Get Failures'],
          remote_failures: pool['Remote Failures'],
          user: pool['User'],
          last_share_time: pool['Last Share Time'],
          diff1_shares: pool['Diff1 Shares'],
          proxy_type: pool['Proxy Type'],
          proxy: pool['Proxy'],
          difficulty_accepted: pool['Difficulty Accepted'],
          difficulty_rejected: pool['Difficulty Rejected'],
          difficulty_stale: pool['Difficulty Stale'],
          last_share_difficulty: pool['Last Share Difficulty'],
          has_stratum: pool['Has Stratum'],
          stratum_url: pool['Stratum URL'],
          has_gbt: pool['Has GBT'],
          best_share: pool['Best Share'],
          active: pool['Stratum Active'],
          pool_rejected_percent: pool['Pool Rejected%'],
          pool_stale_percent: pool['Pool Stale%'],
        }
      end

    end

  end
end