class Snmp2mkr::Engine

Attributes

config[R]
host_manager[R]
logger[R]
metrics_state_holder[R]
mib[R]

Public Class Methods

new(config, log_level: 'info', logdev: $stdout) click to toggle source
# File lib/snmp2mkr/engine.rb, line 19
def initialize(config, log_level: 'info', logdev: $stdout)
  @config = config
  @log_level = log_level
  @logdev = logdev

  @shutdown = nil
  @logger = new_logger('engine')

  @mib = Mib.new(
    load_path: config.mib_load_path,
    modules: config.mib_no_default_modules ? config.mib_modules : [*Mib::DEFAULT_MODULES, *config.mib_modules],
  )

  @host_manager = nil
  @metrics_state_holder = nil

  @worker_queue = nil
  @sender_queue = nil

  @timer = nil
  @worker_threads = nil
  @sender_threads = nil
end

Public Instance Methods

handle_signals() click to toggle source
# File lib/snmp2mkr/engine.rb, line 108
def handle_signals
  r,w = IO.pipe
  handler_th = Thread.new(r) { |io|
    io.gets
    stop
    io.gets
    logger.warn "Force shut down"
    exit
  }
  handler = proc do
    w.puts "quit"
  end
  trap(:INT, handler)
  trap(:TERM, handler)
  handler_th.abort_on_exception = true
end
init() click to toggle source
# File lib/snmp2mkr/engine.rb, line 191
def init
  discovery
  load_timer
end
initial_discover() click to toggle source
# File lib/snmp2mkr/engine.rb, line 65
def initial_discover
  host_manager.each_host do |host|
    logger.info "Initial discovery of #{host.inspect}"
    Snmp2mkr::Discoverer.new(host, host_manager: host_manager).perform!
  end
  logger.info "Initial discovery completed"
end
initial_host_update() click to toggle source
# File lib/snmp2mkr/engine.rb, line 125
def initial_host_update
  host_updater_logger = new_logger('host_updater')
  host_manager.each_host do |host|
    @worker_queue << HostUpdater.new(host, sender_queue: @sender_queue, logger: host_updater_logger)
  end
end
load_hosts() click to toggle source
# File lib/snmp2mkr/engine.rb, line 57
def load_hosts
  config.hosts.evaluate.each do |name, hostdef|
    host = Snmp2mkr::Host.new(hostdef, template_collection: config.templates)
    logger.info "Loaded host: #{host.inspect}"
    host_manager.add_host host
  end
end
load_timer() click to toggle source
# File lib/snmp2mkr/engine.rb, line 132
def load_timer
  discoverer_logger = new_logger('discoverer')
  host_updater_logger = new_logger('host_updater')
  collector_logger = new_logger('collector')

  host_manager.each_host do |host|
    @timer.add(host.definition.discover_interval) do
      next if @shutdown
      @worker_queue << Discoverer.new(host, host_manager: host_manager,  logger: discoverer_logger)
      @worker_queue << HostUpdater.new(host, sender_queue: @sender_queue, logger: host_updater_logger)
    end

    @timer.add(host.definition.interval) do
      next if @shutdown
      @worker_queue << Collector.new(host, metrics_state_holder: metrics_state_holder, host_manager: host_manager, sender_queue: @sender_queue, logger: collector_logger)
    end
  end
end
new_logger(progname) click to toggle source
# File lib/snmp2mkr/engine.rb, line 45
def new_logger(progname)
  Logger.new(@logdev).tap { |_| _.progname = progname; _.level = @log_level }
end
prepare() click to toggle source
# File lib/snmp2mkr/engine.rb, line 49
def prepare
  @host_manager = HostManager.new(persist_file: config.persist_file.evaluate)
  @metrics_state_holder = MetricsStateHolder.new

  load_hosts
  initial_discover
end
run!(signals: true) click to toggle source
# File lib/snmp2mkr/engine.rb, line 181
def run!(signals: true)
  start(signals: signals)
  wait
end
shutdown!() click to toggle source
# File lib/snmp2mkr/engine.rb, line 186
def shutdown!
  stop
  wait
end
start(signals: false) click to toggle source
# File lib/snmp2mkr/engine.rb, line 73
def start(signals: false)
  raise 'already ran' unless @shutdown.nil?
  @shutdown = false

  prepare

  @worker_queue = Queue.new
  @sender_queue = Queue.new

  @timer = EngineThreads::Timer.new(logger: new_logger('timer'))

  @worker_threads = 2.times.map do
    EngineThreads::Worker.new(queue: @worker_queue, logger: new_logger('worker'))
  end

  @sender_threads = 2.times.map do
    EngineThreads::Sender.new(
      mackerel: Mackerel::Client.new(mackerel_api_key: config.api_key.evaluate),
      host_manager: host_manager,
      queue: @sender_queue,
      logger: new_logger('sender'),
    )
  end

  @worker_threads.each(&:start)
  @sender_threads.each(&:start)

  @timer.start

  handle_signals if signals

  initial_host_update
  load_timer
end
stop() click to toggle source
# File lib/snmp2mkr/engine.rb, line 151
def stop
  logger.info "Shutting down..."
  @shutdown = true
  @timer.stop
  @worker_queue.close
  @sender_queue.close
end
wait() click to toggle source
# File lib/snmp2mkr/engine.rb, line 159
def wait
  @timer.join
  [*@worker_threads, *@sender_threads].each(&:join)
end
wait_stop() click to toggle source
# File lib/snmp2mkr/engine.rb, line 164
def wait_stop
  logger.debug "Waiting timer to stop"
  @timer.join
  logger.debug "timer stopped"

  logger.debug "Waiting workers to stop"
  @worker_threads.each { |th|
    logger.debug "Waiting #{th.inspect}"
    th.join
  }
  logger.debug "Waiting senders to stop"
  @sender_threads.each { |th|
    logger.debug "Waiting #{th.inspect}"
    th.join
  }
end