Sha256: b026184e367153532991acfaa21d88831c3ec54bb2836233329ca7c7e5841367

Contents?: true

Size: 1.8 KB

Versions: 2

Compression:

Stored size: 1.8 KB

Contents

module CollectdServer

  class Mapper
    attr_reader :metric_name, :timestamp, :value

    def self.parse(line)
      if klass = mapper_class(line)
        klass.parse(line)
      else
        warn "No Mapper found for '#{line}'"
        []
      end
    end

    def initialize(metric_name, timestamp, value)
      @metric_name, @timestamp, @value = metric_name, timestamp, value
    end

    def to_datapoint
      %Q{"#{@metric_name}",#{@timestamp},#{@value}}
    end

    protected

    def self.mapper_class(line)
      self.subclasses.detect { |c| c.matches?(line) }
    end

    def self.plugin_name(line)
      _, collectd_type, *_ = line.split
      collectd_type.split('/')[1]
    end

    def self.parse_line(line)
      _, path, _, data = line.split(' ')
      timestamp, *values = data.split(':')

      return path, timestamp, values
    end

    def self.metric_name_from_type(collectd_type)
      @parts = collectd_type.split('/')

      @host                     = @parts[0]
      @plugin, @plugin_instance = @parts[1].split('-')
      @type, @type_instance     = @parts[2].split('-')

      return [@host, @plugin, @plugin_instance, @type, @type_instance].join(',')
    end

    def self.subclasses
      @subclasses ||= []
    end

    def self.inherited(subclass)
      subclasses << subclass
    end

  end

  class CPU < Mapper

    def self.matches?(line)
      plugin_name(line) =~ /cpu-[\d+]/
    end

    def self.parse(line)
      path, timestamp, values = parse_line(line)

      metric_name = metric_name_from_type(path)
      values.map do |val|
        self.new(metric_name, timestamp, val)
      end
    end

    def self.metric_name_from_type(collectd_type)
      super

      # apollo, cpu,   0,                idle
      [@host, @plugin, @plugin_instance, @type_instance].join(',')
    end

  end

end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
absperf-collectd_server-0.1.0 lib/collectd_server/mapper.rb
absperf-collectd_server-0.1.1 lib/collectd_server/mapper.rb