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