class Fluent::DockerMetricsInput
Public Class Methods
new()
click to toggle source
Calls superclass method
# File lib/fluent/plugin/in_docker_metrics.rb, line 17 def initialize super require 'socket' require 'docker' @hostname = Socket.gethostname @with_systemd = File.exists?("#{@cgroup_path}/systemd") end
Public Instance Methods
configure(conf)
click to toggle source
Calls superclass method
# File lib/fluent/plugin/in_docker_metrics.rb, line 25 def configure(conf) super end
emit_container_metric(id, name, metric_type, metric_filename, opts = {})
click to toggle source
# File lib/fluent/plugin/in_docker_metrics.rb, line 62 def emit_container_metric(id, name, metric_type, metric_filename, opts = {}) if @with_systemd path = "#{@cgroup_path}/#{metric_type}/system.slice/docker-#{id}.scope/#{metric_filename}" else path = "#{@cgroup_path}/#{metric_type}/docker/#{id}/#{metric_filename}" end if File.exists?(path) # the order of these two if's matters if metric_filename == 'blkio.sectors' parser = BlkioSectorsParser.new(path, metric_filename.gsub('.', '_')) elsif metric_type == 'blkio' parser = BlkioStatsParser.new(path, metric_filename.gsub('.', '_')) else parser = KeyValueStatsParser.new(path, metric_filename.gsub('.', '_')) end time = Engine.now tag = "#{@tag_prefix}.#{metric_filename}" mes = MultiEventStream.new parser.parse_each_line do |data| next if not data # TODO: address this more elegantly if data['key'] =~ /^(?:cpuacct|blkio|memory_stat_pg)/ data['type'] = 'counter' else data['type'] = 'gauge' end data["hostname"] = @hostname data["id"] = id data["name"] = name.sub(/^\//, '') mes.add(time, data) end router.emit_stream(tag, mes) else nil end end
get_metrics()
click to toggle source
Metrics collection methods
# File lib/fluent/plugin/in_docker_metrics.rb, line 44 def get_metrics ids = @container_ids || list_container_ids ids.each do |id, name| emit_container_metric(id, name, 'memory', 'memory.stat') emit_container_metric(id, name, 'cpuacct', 'cpuacct.stat') emit_container_metric(id, name, 'blkio', 'blkio.io_serviced') emit_container_metric(id, name, 'blkio', 'blkio.io_service_bytes') emit_container_metric(id, name, 'blkio', 'blkio.io_queued') emit_container_metric(id, name, 'blkio', 'blkio.sectors') end end
list_container_ids()
click to toggle source
# File lib/fluent/plugin/in_docker_metrics.rb, line 56 def list_container_ids Docker::Container.all.map do |container| [container.id, container.info["Names"].first] end end
run()
click to toggle source
# File lib/fluent/plugin/in_docker_metrics.rb, line 36 def run @loop.run rescue log.error "unexpected error", :error=>$!.to_s log.error_backtrace end
shutdown()
click to toggle source
# File lib/fluent/plugin/in_docker_metrics.rb, line 101 def shutdown @loop.stop @thread.join end
start()
click to toggle source
# File lib/fluent/plugin/in_docker_metrics.rb, line 30 def start @loop = Coolio::Loop.new tw = TimerWatcher.new(@stats_interval, true, @log, &method(:get_metrics)) tw.attach(@loop) @thread = Thread.new(&method(:run)) end