class Solanum::Source::Diskstats

Constants

FIELDS
STAT_FILE

Attributes

devices[R]

Public Class Methods

new(opts) click to toggle source
Calls superclass method Solanum::Source::new
# File lib/solanum/source/diskstats.rb, line 16
def initialize(opts)
  super(opts)
  @devices = opts['devices'] || []
  @detailed = opts['detailed'] || false
  @last = {}
end

Public Instance Methods

collect!() click to toggle source
# File lib/solanum/source/diskstats.rb, line 31
def collect!
  events = []

  File.readlines(STAT_FILE).each do |line|
    stats = parse_stats(line)
    device = stats['name']

    if @devices.include?(device) || (@devices.empty? && device =~ /^sd[a-z]$/)
      if @last[device]
        diff = Hash.new(0)
        FIELDS.drop(3).each do |field|
          diff[field] = stats[field] - @last[device][field]
        end
        prefix = "diskstats #{device}"

        # Reads

        events << {
          service: "#{prefix} read sectors",
          metric: diff['read_sectors'],
        }

        events << {
          service: "#{prefix} read time",
          metric: diff['read_time'],
        }

        if @detailed
          events << {
            service: "#{prefix} read completed",
            metric: diff['reads_completed'],
          }

          events << {
            service: "#{prefix} read merged",
            metric: diff['reads_merged'],
          }
        end

        # Writes

        events << {
          service: "#{prefix} write sectors",
          metric: diff['write_sectors'],
        }

        events << {
          service: "#{prefix} write time",
          metric: diff['write_time'],
        }

        if @detailed
          events << {
            service: "#{prefix} write completed",
            metric: diff['writes_completed'],
          }

          events << {
            service: "#{prefix} write merged",
            metric: diff['writes_merged'],
          }
        end

        # IO

        events << {
          service: "#{prefix} io active",
          metric: diff['io_active'],
        }

        events << {
          service: "#{prefix} io time",
          metric: diff['io_time'],
        }

        events << {
          service: "#{prefix} io weighted-time",
          metric: diff['io_weighted_time'],
        }
      end
      @last[device] = stats
    end
  end

  events
end
parse_stats(line) click to toggle source
# File lib/solanum/source/diskstats.rb, line 24
def parse_stats(line)
  columns = line.strip.split(/\s+/)
  columns = columns.take(3) + columns.drop(3).map(&:to_i)
  Hash[FIELDS.zip(columns)]
end