class DockerBoss::Module::InfluxDB

Public Class Methods

new(config) click to toggle source
# File lib/docker_boss/module/influxdb.rb, line 11
def initialize(config)
  @config = config
  @mutex = Mutex.new
  @containers = []
  docker_cg = File.exists? "#{config['cgroup_path']}/blkio/docker"
  @config['docker_cg'] = docker_cg

  @pool = Worker.pool(args: [@config])
  DockerBoss.logger.debug "influxdb: Set up to connect to #{@config['server']['protocol']}://[#{@config['server']['host']}]:#{@config['server']['port']}"
  @timers = Timers::Group.new
end

Public Instance Methods

connection() click to toggle source
# File lib/docker_boss/module/influxdb.rb, line 23
def connection
  @http ||= begin
    raise ArgumentError, "Unknown InfluxDB protocol #{@config['server']['protocol']}" unless ['http', 'https'].include? @config['server']['protocol']
    http = Net::HTTP.new(@config['server']['host'], @config['server']['port'])
    http.use_ssl = @config['server']['protocol'] == 'https'
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE if @config['server'].fetch('no_verify', false)
    http
  end
end
do_post!(data) click to toggle source
# File lib/docker_boss/module/influxdb.rb, line 45
def do_post!(data)
  request = Net::HTTP::Post.new("/db/#{@config['database']}/series?time_precision=s")
  request.basic_auth @config['server']['user'], @config['server']['pass']
  request.add_field('Content-Type', 'application/json')
  request.body = data.to_json
  response = connection.request(request)
  raise Error.new response.body unless response.kind_of? Net::HTTPSuccess
end
do_query(q) click to toggle source
# File lib/docker_boss/module/influxdb.rb, line 33
def do_query(q)
  request = Net::HTTP::Get.new("/db/#{@config['database']}/series?q=#{CGI.escape(q)}")
  request.basic_auth @config['server']['user'], @config['server']['pass']
  connection.request(request)
end
run() click to toggle source
# File lib/docker_boss/module/influxdb.rb, line 54
def run
  @timers.every(@config['interval']) { sample }

  Thread.new do
    loop { @timers.wait }
  end
end
sample() click to toggle source
# File lib/docker_boss/module/influxdb.rb, line 68
def sample
  containers = []

  @mutex.synchronize {
    containers = @containers.map { |c| { id: c['Id'], name: c['Name'][1..-1] } }
  }

  futures = containers.map { |c| @pool.future :sample_container, c }

  data = futures.map { |f| f.value }

  begin
    do_post! data
  rescue DockerBoss::Module::InfluxDB::Error => e
    DockerBoss.logger.error "influxdb: Error posting update: #{e.message}"
  rescue Net::OpenTimeout => e
    DockerBoss.logger.error "influxdb: Error posting update: #{e.message}"
  rescue Errno::ECONNREFUSED => e
    DockerBoss.logger.error "influxdb: Error posting update: #{e.message}"
  rescue SocketError => e
    DockerBoss.logger.error "influxdb: Error posting update: #{e.message}"
  end
end
test_connection!() click to toggle source
# File lib/docker_boss/module/influxdb.rb, line 39
def test_connection!
  response = do_query('list series')
  raise Error.new response.body unless response.kind_of? Net::HTTPSuccess
  DockerBoss.logger.debug "influxdb: Connection tested successfully"
end
trigger(containers, trigger_id) click to toggle source
# File lib/docker_boss/module/influxdb.rb, line 62
def trigger(containers, trigger_id)
  @mutex.synchronize {
    @containers = containers
  }
end