class Fluent::StackdriverV1MetricsOutput

Public Class Methods

new() click to toggle source
Calls superclass method
# File lib/fluent/plugin/out_stackdriver-v1_metrics.rb, line 6
def initialize
  super
  require 'stackdriver'
end

Public Instance Methods

configure(conf) click to toggle source
Calls superclass method
# File lib/fluent/plugin/out_stackdriver-v1_metrics.rb, line 18
def configure(conf)
  super(conf) {
    @api_key = conf.delete('api_key')
    @instance_id = conf.delete('instance_id')
    @counter_maps = conf.delete('counter_maps')
    @counter_defaults = conf.delete('counter_defaults')
    @metric_maps = conf.delete('metric_maps')
    @metric_defaults = conf.delete('metric_defaults')
  }

  @base_entry = {}
  @base_entry['instance'] = @instance_id if @instance_id

end
format(tag, time, record) click to toggle source
# File lib/fluent/plugin/out_stackdriver-v1_metrics.rb, line 33
def format(tag, time, record)
  # Everything goes into the buffer in a JSON format.
  { 'tag' => tag, 'time' => time, 'record' => record }.to_json + "\n"
end
write(chunk) click to toggle source
# File lib/fluent/plugin/out_stackdriver-v1_metrics.rb, line 38
def write(chunk)

  timestamp = Time.now.to_i
  data = []

  count_data = {}
  metric_data = {}

  chunk.read.chomp.split("\n").each do |line|
    event = JSON.parse(line)

    @counter_maps.each do |k,v|
      if eval(k)
        name = eval(v) 
        count_data[name] ||= 0
        count_data[name] += 1
      end
    end

    @metric_maps.each do |k,v|
      if eval(k)
        if eval(v)
          data << @base_entry.merge({ 'collected_at' => event['time'].to_i }).merge(eval(v))
        end
      end
    end

  end

  count_data.each do |name,value|
    data << @base_entry.merge({
      'name' => name,
      'value' => value,
      'collected_at' => timestamp
    })
  end

  @counter_defaults.each do |e|
    if not count_data.key?(e['name'])
      data << @base_entry.merge({'collected_at' => timestamp}).merge(e)
    end
  end

  @metric_defaults.each do |e|
    if not metric_data.key?(e['name'])
      data << @base_entry.merge({'collected_at' => timestamp}).merge(e)
    end
  end

  if data
    StackDriver.init @api_key
    StackDriver.send_multi_metrics data
  end

end