class Fluent::MonitorAgentInput

Constants

MONITOR_INFO

Public Class Methods

collect_children(pe, array=[]) click to toggle source

get nexted plugins (such as <store> of the copy plugin) from the plugin `pe` recursively

# File lib/fluent/plugin/in_monitor_agent.rb, line 262
def self.collect_children(pe, array=[])
  array << pe
  if pe.is_a?(MultiOutput) && pe.respond_to?(:outputs)
    pe.outputs.each {|nop|
      collect_children(nop, array)
    }
  end
  array
end
new() click to toggle source
Calls superclass method Fluent::Input.new
# File lib/fluent/plugin/in_monitor_agent.rb, line 23
def initialize
  require 'cgi'
  super
end

Public Instance Methods

all_plugins() click to toggle source
# File lib/fluent/plugin/in_monitor_agent.rb, line 237
def all_plugins
  array = []

  # get all input plugins
  array.concat Engine.root_agent.inputs

  # get all output plugins
  Engine.root_agent.outputs.each { |o|
    MonitorAgentInput.collect_children(o, array)
  }
  # get all filter plugins
  Engine.root_agent.filters.each { |f|
    MonitorAgentInput.collect_children(f, array)
  }
  Engine.root_agent.labels.each { |name, l|
    # TODO: Add label name to outputs / filters for identifing plugins
    l.outputs.each { |o| MonitorAgentInput.collect_children(o, array) }
    l.filters.each { |f| MonitorAgentInput.collect_children(f, array) }
  }

  array
end
fluentd_opts() click to toggle source
# File lib/fluent/plugin/in_monitor_agent.rb, line 361
def fluentd_opts
  @fluentd_opts ||= get_fluentd_opts
end
get_fluentd_opts() click to toggle source
# File lib/fluent/plugin/in_monitor_agent.rb, line 365
def get_fluentd_opts
  opts = {}
  ObjectSpace.each_object(Fluent::Supervisor) { |obj|
    opts.merge!(obj.options)
    break
  }
  opts
end
get_monitor_info(pe, opts={}) click to toggle source

get monitor info from the plugin `pe` and return a hash object

# File lib/fluent/plugin/in_monitor_agent.rb, line 316
def get_monitor_info(pe, opts={})
  obj = {}

  # Common plugin information
  obj['plugin_id'] = pe.plugin_id
  obj['plugin_category'] = plugin_category(pe)
  obj['type'] = pe.config['@type'] || pe.config['type']
  obj['config'] = pe.config

  # run MONITOR_INFO in plugins' instance context and store the info to obj
  MONITOR_INFO.each_pair {|key,code|
    begin
      obj[key] = pe.instance_eval(code)
    rescue
    end
  }

  # include all instance variables if :with_debug_info is set
  if opts[:with_debug_info]
    iv = {}
    pe.instance_eval do
      instance_variables.each {|sym|
        key = sym.to_s[1..-1]  # removes first '@'
        iv[key] = instance_variable_get(sym)
      }
    end
    obj['instance_variables'] = iv
  end

  obj
end
plugin_category(pe) click to toggle source
# File lib/fluent/plugin/in_monitor_agent.rb, line 348
def plugin_category(pe)
  case pe
  when Fluent::Input
    'input'.freeze
  when Fluent::Output
    'output'.freeze
  when Fluent::Filter
    'filter'.freeze
  else
    'unknown'.freeze
  end
end
plugin_info_by_id(plugin_id, opts={}) click to toggle source

search a plugin by plugin_id

# File lib/fluent/plugin/in_monitor_agent.rb, line 287
def plugin_info_by_id(plugin_id, opts={})
  found = all_plugins.find {|pe|
    pe.respond_to?(:plugin_id) && pe.plugin_id.to_s == plugin_id
  }
  if found
    get_monitor_info(found, opts)
  else
    nil
  end
end
plugin_info_by_tag(tag, opts={}) click to toggle source

try to match the tag and get the info from the matched output plugin TODO: Support output in label

# File lib/fluent/plugin/in_monitor_agent.rb, line 274
def plugin_info_by_tag(tag, opts={})
  matches = Engine.root_agent.event_router.instance_variable_get(:@match_rules)
  matches.each { |rule|
    if rule.match?(tag)
      if rule.collector.is_a?(Output)
        return get_monitor_info(rule.collector, opts)
      end
    end
  }
  nil
end
plugins_info_all(opts={}) click to toggle source
# File lib/fluent/plugin/in_monitor_agent.rb, line 309
def plugins_info_all(opts={})
  all_plugins.map {|pe|
    get_monitor_info(pe, opts)
  }
end
plugins_info_by_type(type, opts={}) click to toggle source

This method returns an array because multiple plugins could have the same type

# File lib/fluent/plugin/in_monitor_agent.rb, line 300
def plugins_info_by_type(type, opts={})
  array = all_plugins.select {|pe|
    (pe.config['@type'] == type || pe.config['type'] == type) rescue nil
  }
  array.map {|pe|
    get_monitor_info(pe, opts)
  }
end
shutdown() click to toggle source
# File lib/fluent/plugin/in_monitor_agent.rb, line 219
def shutdown
  if @srv
    @srv.shutdown
    @srv = nil
  end
  if @thread
    @thread.join
    @thread = nil
  end
end
start() click to toggle source
# File lib/fluent/plugin/in_monitor_agent.rb, line 202
def start
  log.debug "listening monitoring http server on http://#{@bind}:#{@port}/api/plugins"
  @srv = WEBrick::HTTPServer.new({
      :BindAddress => @bind,
      :Port => @port,
      :Logger => WEBrick::Log.new(STDERR, WEBrick::Log::FATAL),
      :AccessLog => [],
    })
  @srv.mount('/api/plugins', LTSVMonitorServlet, self)
  @srv.mount('/api/plugins.json', JSONMonitorServlet, self)
  @srv.mount('/api/config', LTSVConfigMonitorServlet, self)
  @srv.mount('/api/config.json', JSONConfigMonitorServlet, self)
  @thread = Thread.new {
    @srv.start
  }
end