class Fluent::Plugin::MackerelOutput

Constants

DEFAULT_FLUSH_INTERVAL
MAX_BUFFER_CHUNK_LIMIT

Attributes

mackerel[R]

Public Class Methods

new() click to toggle source
Calls superclass method
# File lib/fluent/plugin/out_mackerel.rb, line 37
def initialize
  super
end

Public Instance Methods

configure(conf) click to toggle source
Calls superclass method
# File lib/fluent/plugin/out_mackerel.rb, line 41
def configure(conf)
  compat_parameters_convert(conf, :buffer)
  super

  @mackerel = Mackerel::Client.new(:mackerel_api_key => conf['api_key'], :mackerel_origin => conf['origin'])

  if @out_keys
    @out_keys = @out_keys.split(',')
  end
  if @out_key_pattern
    @out_key_pattern = Regexp.new(@out_key_pattern)
  end
  if @out_keys.nil? and @out_key_pattern.nil?
    raise Fluent::ConfigError, "Either 'out_keys' or 'out_key_pattern' must be specifed."
  end

  if @buffer_config.flush_interval and @buffer_config.flush_interval < 60
    raise Fluent::ConfigError, "flush_interval less than 60s is not allowed."
  end

  unless @hostid_path.nil?
    @hostid = File.open(@hostid_path).read
  end

  if @hostid.nil? and @service.nil?
    raise Fluent::ConfigError, "Either 'hostid' or 'hostid_path' or 'service' must be specifed."
  end

  if @hostid and @service
    raise Fluent::ConfigError, "Niether 'hostid' and 'service' cannot be specifed."
  end

  if @remove_prefix and @service.nil?
    raise Fluent::ConfigError, "'remove_prefix' must be used with 'service'."
  end

  unless @hostid.nil?
    if matched = @hostid.match(/^\${tag_parts\[(\d+)\]}$/)
      hostid_idx = matched[1].to_i
      @hostid_processor = Proc.new{ |args| args[:tokens][hostid_idx] }
    else
      @hostid_processor = Proc.new{ @hostid }
    end
  end

  if @metrics_name
    @name_processor = @metrics_name.split('.').map{ |token|
      Proc.new{ |args|
        token.gsub(/\${(out_key|\[(-?\d+)\])}/) {
          if $1 == 'out_key'
            args[:out_key]
          else
            args[:tokens][$1[1..-1].to_i]
          end
        }
      }
    }
  end
end
format(tag, time, record) click to toggle source
# File lib/fluent/plugin/out_mackerel.rb, line 113
def format(tag, time, record)
  [tag, time, record].to_msgpack
end
formatted_to_msgpack_binary() click to toggle source
# File lib/fluent/plugin/out_mackerel.rb, line 109
def formatted_to_msgpack_binary
  true
end
generate_metric(key, tokens, time, value) click to toggle source
# File lib/fluent/plugin/out_mackerel.rb, line 117
def generate_metric(key, tokens, time, value)
  name = @name_processor.nil? ? key :
           @name_processor.map{ |p| p.call(:out_key => key, :tokens => tokens) }.join('.')

  metric = {
    'value' => value,
    'time' => time,
    'name' => @remove_prefix ? name : "%s.%s" % ['custom', name]
  }
  metric['hostId'] = @hostid_processor.call(:tokens => tokens) if @hostid
  return metric
end
send(metrics) click to toggle source
# File lib/fluent/plugin/out_mackerel.rb, line 167
def send(metrics)
  log.debug("out_mackerel: #{metrics}")
  begin
    if @hostid
      @mackerel.post_metrics(metrics)
    else
      @mackerel.post_service_metrics(@service, metrics)
    end
  rescue => e
    log.error("out_mackerel:", :error_class => e.class, :error => e.message)
    raise e
  end
end
shutdown() click to toggle source
Calls superclass method
# File lib/fluent/plugin/out_mackerel.rb, line 105
def shutdown
  super
end
start() click to toggle source
Calls superclass method
# File lib/fluent/plugin/out_mackerel.rb, line 101
def start
  super
end
write(chunk) click to toggle source
# File lib/fluent/plugin/out_mackerel.rb, line 130
def write(chunk)
  metrics = []
  processed = {}
  tags = {}
  time_latest = 0
  chunk.msgpack_each do |(tag,time,record)|
    tags[tag] = true
    tokens = tag.split('.')

    if @out_keys
      out_keys = @out_keys.select{|key| record.has_key?(key)}
    else # @out_key_pattern
      out_keys = record.keys.select{|key| @out_key_pattern.match(key)}
    end

    out_keys.map do |key|
      metrics << generate_metric(key, tokens, time, record[key].to_f)
      time_latest = time if time_latest == 0 || time_latest < time
      processed[tag + "." + key] = true
    end
  end

  if @out_keys && @use_zero_for_empty
    tags.each_key do |tag|
      tokens = tag.split('.')
      @out_keys.each do |key|
        unless processed[tag + "." + key]
          metrics << generate_metric(key, tokens, time_latest, 0.0)
        end
      end
    end
  end

  send(metrics) unless metrics.empty?
  metrics.clear
end