class Fluent::StatsiteFilterOutput

Constants

CONFIG_VALIDATION_WAIT

TODO: should be configurable?

Public Class Methods

new() click to toggle source

TODO: should support input_counter?

Calls superclass method
# File lib/fluent/plugin/out_statsite_filter.rb, line 30
def initialize
  super
end

Public Instance Methods

before_shutdown() click to toggle source
Calls superclass method
# File lib/fluent/plugin/out_statsite_filter.rb, line 69
def before_shutdown
  super
  $log.debug "out_statsite#before_shutdown called"
  @child.finished = true
  sleep 0.5  # TODO wait time before killing child process
end
configure(conf) click to toggle source
Calls superclass method
# File lib/fluent/plugin/out_statsite_filter.rb, line 34
def configure(conf)
  super
  @metrics = validate_metrics
  @metrics.each{|m| @log.info "out_statsite: #{m}"}

  @histograms = validate_histograms

  @respawns = configure_respawns

  @parser = StatsiteParser.new(method(:on_message))
  @formatter = StatsiteFormatter.new(@metrics)

  $log.info "out_statsite: statsite config\n\n#{config}"
  @conf = Tempfile.new('fluent-plugin-statsite-')
  @conf.puts config
  @conf.flush

  @child = ChildProcess.new(@parser, @respawns, log)

  @cmd = "#{@statsite_path} -f #{@conf.path}"
  validate_statsite_confg
end
format(tag, time, record) click to toggle source
# File lib/fluent/plugin/out_statsite_filter.rb, line 82
def format(tag, time, record)
  @formatter.call(record)
end
shutdown() click to toggle source
Calls superclass method
# File lib/fluent/plugin/out_statsite_filter.rb, line 76
def shutdown
  super
  @conf.close
  @child.shutdown
end
start() click to toggle source
Calls superclass method
# File lib/fluent/plugin/out_statsite_filter.rb, line 57
def start
  super

  begin
    $log.info "out_statsite: launching statsite process", cmd: @cmd
    @child.start(@cmd)
  rescue
    shutdown
    raise
  end
end
write(chunk) click to toggle source
# File lib/fluent/plugin/out_statsite_filter.rb, line 86
def write(chunk)
  @child.write chunk
end

Private Instance Methods

config() click to toggle source
# File lib/fluent/plugin/out_statsite_filter.rb, line 138
    def config
      <<-CONFIG
[statsite]
port = 0
udp_port = 0
parse_stdin = 1
log_level = INFO
flush_interval = #{@statsite_flush_interval}
timer_eps = #{@timer_eps}
set_eps = #{@set_eps}
stream_cmd = #{@stream_cmd}

#{@histograms.map(&:to_ini).join("\n\n")}
      CONFIG
    end
configure_respawns() click to toggle source
# File lib/fluent/plugin/out_statsite_filter.rb, line 99
def configure_respawns
  if @child_respawn.nil? or @child_respawn == 'none' or @child_respawn == '0'
    0
  elsif @child_respawn == 'inf' or @child_respawn == '-1'
    -1
  elsif @child_respawn =~ /^\d+$/
    @child_respawn.to_i
  else
    raise ConfigError, "child_respawn option argument invalid: none(or 0), inf(or -1) or positive number"
  end
end
on_message(time, record) click to toggle source
# File lib/fluent/plugin/out_statsite_filter.rb, line 154
def on_message(time, record)
  Engine.emit(@tag, time, record)
end
run() click to toggle source
# File lib/fluent/plugin/out_statsite_filter.rb, line 92
def run
  @loop.run
rescue => e
  log.error "out_statsite: unexpected error", :error => e, :error_class => e.class
  log.error_backtrace
end
validate_histograms() click to toggle source
# File lib/fluent/plugin/out_statsite_filter.rb, line 115
def validate_histograms
  @histograms.map {|h| Histogram.validate(h)}
end
validate_metrics() click to toggle source
# File lib/fluent/plugin/out_statsite_filter.rb, line 111
def validate_metrics
  @metrics.map {|m| Metric.validate(m)}
end
validate_statsite_confg() click to toggle source
# File lib/fluent/plugin/out_statsite_filter.rb, line 119
def validate_statsite_confg
  $log.debug "lanuch statsite process to validate statsite config"
  pid = spawn(@cmd, out: '/dev/null')
  if pid.nil?
    raise ConfigError, 'failed to launch statsite process', cmd: @cmd
  else
    begin
      Timeout::timeout(CONFIG_VALIDATION_WAIT) do
        Process.waitpid(pid)
      end
      raise ConfigError, 'Statsite process cannot be launched correctly. A config is probably invalid.'
    rescue Timeout::Error
      # launched correctly
      Process.kill(:KILL, pid)
      Process.waitpid(pid)
    end
  end
end