fluent-plugin-docker-metrics-v2 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: efa365192704ccf603a7d9f856fc64ead0954757
4
+ data.tar.gz: 16bfa49d533f6a7c01341287ddc8e25dfd59e29f
5
+ SHA512:
6
+ metadata.gz: 2925f9ee57a4df7e2866aede03e712bcfb8eed1b917655828e4a8423ccad0e8a71d16e8c643b61db3399d3b9e62801045e4e336f62600adb00c2ce9a0aad1a54
7
+ data.tar.gz: 33a83e4927af7306d70d7f6d2e30aee8929cc919cc7bd315d4ae05479d79857bbe0e8d4e415bb2ddb440fd7345584746f5a7c18c9122120e6cd043048c4b1a40
@@ -0,0 +1,7 @@
1
+ ## v0.0.2 2014/11/22
2
+
3
+ - Change the output format. The "source" field is deprecated. Instead, it has "hostname", "id", and "container".
4
+
5
+ ## v0.0.1 2014/06/27
6
+
7
+ - Initial release
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
@@ -0,0 +1,41 @@
1
+ # Fluentd Docker Metrics Input Plugin
2
+
3
+ This is a [Fluentd](http://www.fluentd.org) plugin to collect Docker metrics periodically.
4
+
5
+ ## How it works
6
+
7
+ It's assumed to run on the host server. It periodically runs Docker Remote API calls to fetch container IDs and looks at `/sys/fs/cgroups/<metric_type>/docker/<container_id>/`
8
+ for relevant stats. You can say this is an implementation of the metric collection strategy outlined in [this blog post](http://blog.docker.com/2013/10/gathering-lxc-docker-containers-metrics/).
9
+
10
+ ## Installing
11
+
12
+ to be uploaded on Rubygems
13
+
14
+ ## Example config
15
+
16
+ ```
17
+ <source>
18
+ type docker_metrics
19
+ stats_interval 1m
20
+ </source>
21
+ ```
22
+
23
+ ## Parameters
24
+
25
+ * **stats_interval**: how often to poll Docker containers for stats. The default is every minute.
26
+ * **cgroup_path**: The path to cgroups pseudofiles. The default is `sys/fs/cgroup`.
27
+ * **tag_prefix**: The tag prefix. The default value is "docker"
28
+
29
+ ## Example output
30
+
31
+ ```
32
+ 2014-11-22 17:48:26 +0000 docker.blkio.io_queued: {"key":"blkio_io_queued_total","value":0,"type":"counter","hostname":"precise64","id":"24f5fb3bfc429e88aa3dbacd704667899dc496067cedcfa58dd84da42e7cb3cf","name":"/world"}
33
+ 2014-11-22 17:48:26 +0000 docker.blkio.sectors: {"key":"blkio_sectors","value":136,"type":"counter","hostname":"precise64","id":"24f5fb3bfc429e88aa3dbacd704667899dc496067cedcfa58dd84da42e7cb3cf","name":"/world"}
34
+ ```
35
+
36
+ In particular, each event is a key-value pair of individual metrics. Also, it has
37
+
38
+ - `hostname` is the hostname of the Docker host
39
+ - `id` is the ID of the container
40
+ - `name` is the descriptive name of the container (a la `docker inspect --format '{{ .Names }}'`)
41
+
@@ -0,0 +1,10 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new(:test) do |test|
5
+ test.libs << "test" << "lib"
6
+ test.pattern = 'test/test_*.rb'
7
+ test.verbose = true
8
+ end
9
+
10
+ task :default => :test
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "fluent-plugin-docker-metrics-v2"
7
+ spec.version = "0.0.1"
8
+ spec.authors = ["orr"]
9
+ spec.email = ["orr@innovid.com"]
10
+ spec.summary = %q{Fluentd plugin to collect Docker container metrics}
11
+ spec.homepage = "https://github.com/kiyoto/fluent-plugin-docker-metrics"
12
+ spec.license = "Apache-2.0"
13
+
14
+ spec.files = `git ls-files`.split($/)
15
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
16
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
17
+ spec.require_paths = ["lib"]
18
+
19
+ spec.add_development_dependency "bundler"
20
+ spec.add_development_dependency "rake"
21
+ spec.add_development_dependency "fakefs"
22
+ spec.add_development_dependency "test-unit", "~> 3.1"
23
+ spec.add_development_dependency "minitest", "~> 5.8"
24
+ spec.add_runtime_dependency "fluentd"
25
+ spec.add_runtime_dependency "docker-api"
26
+ end
@@ -0,0 +1,175 @@
1
+ require 'fluent/input'
2
+
3
+ module Fluent
4
+ class DockerMetricsInput < Input
5
+ Plugin.register_input('docker_metrics', self)
6
+
7
+ # Define `router` method of v0.12 to support v0.10 or earlier
8
+ unless method_defined?(:router)
9
+ define_method("router") { Engine }
10
+ end
11
+
12
+ config_param :cgroup_path, :string, :default => '/sys/fs/cgroup'
13
+ config_param :stats_interval, :time, :default => 60 # every minute
14
+ config_param :tag_prefix, :string, :default => "docker"
15
+ config_param :container_ids, :array, :default => nil # mainly for testing
16
+
17
+ def initialize
18
+ super
19
+ require 'socket'
20
+ require 'docker'
21
+ @hostname = Socket.gethostname
22
+ @with_systemd = File.exists?("#{@cgroup_path}/systemd")
23
+ end
24
+
25
+ def configure(conf)
26
+ super
27
+
28
+ end
29
+
30
+ def start
31
+ @loop = Coolio::Loop.new
32
+ tw = TimerWatcher.new(@stats_interval, true, @log, &method(:get_metrics))
33
+ tw.attach(@loop)
34
+ @thread = Thread.new(&method(:run))
35
+ end
36
+ def run
37
+ @loop.run
38
+ rescue
39
+ log.error "unexpected error", :error=>$!.to_s
40
+ log.error_backtrace
41
+ end
42
+
43
+ # Metrics collection methods
44
+ def get_metrics
45
+ ids = @container_ids || list_container_ids
46
+ ids.each do |id, name|
47
+ emit_container_metric(id, name, 'memory', 'memory.stat')
48
+ emit_container_metric(id, name, 'cpuacct', 'cpuacct.stat')
49
+ emit_container_metric(id, name, 'blkio', 'blkio.io_serviced')
50
+ emit_container_metric(id, name, 'blkio', 'blkio.io_service_bytes')
51
+ emit_container_metric(id, name, 'blkio', 'blkio.io_queued')
52
+ emit_container_metric(id, name, 'blkio', 'blkio.sectors')
53
+ end
54
+ end
55
+
56
+ def list_container_ids
57
+ Docker::Container.all.map do |container|
58
+ [container.id, container.info["Names"].first]
59
+ end
60
+ end
61
+
62
+ def emit_container_metric(id, name, metric_type, metric_filename, opts = {})
63
+
64
+ if @with_systemd
65
+ path = "#{@cgroup_path}/#{metric_type}/system.slice/docker-#{id}.scope/#{metric_filename}"
66
+ else
67
+ path = "#{@cgroup_path}/#{metric_type}/docker/#{id}/#{metric_filename}"
68
+ end
69
+
70
+ if File.exists?(path)
71
+ # the order of these two if's matters
72
+ if metric_filename == 'blkio.sectors'
73
+ parser = BlkioSectorsParser.new(path, metric_filename.gsub('.', '_'))
74
+ elsif metric_type == 'blkio'
75
+ parser = BlkioStatsParser.new(path, metric_filename.gsub('.', '_'))
76
+ else
77
+ parser = KeyValueStatsParser.new(path, metric_filename.gsub('.', '_'))
78
+ end
79
+ time = Engine.now
80
+ tag = "#{@tag_prefix}.#{metric_filename}"
81
+ mes = MultiEventStream.new
82
+ parser.parse_each_line do |data|
83
+ next if not data
84
+ # TODO: address this more elegantly
85
+ if data['key'] =~ /^(?:cpuacct|blkio|memory_stat_pg)/
86
+ data['type'] = 'counter'
87
+ else
88
+ data['type'] = 'gauge'
89
+ end
90
+ data["hostname"] = @hostname
91
+ data["id"] = id
92
+ data["name"] = name.sub(/^\//, '')
93
+ mes.add(time, data)
94
+ end
95
+ router.emit_stream(tag, mes)
96
+ else
97
+ nil
98
+ end
99
+ end
100
+
101
+ def shutdown
102
+ @loop.stop
103
+ @thread.join
104
+ end
105
+
106
+ class TimerWatcher < Coolio::TimerWatcher
107
+
108
+ def initialize(interval, repeat, log, &callback)
109
+ @callback = callback
110
+ @log = log
111
+ super(interval, repeat)
112
+ end
113
+ def on_timer
114
+ @callback.call
115
+ rescue
116
+ @log.error $!.to_s
117
+ @log.error_backtrace
118
+ end
119
+ end
120
+
121
+ class CGroupStatsParser
122
+ def initialize(path, metric_type)
123
+ raise ConfigError if not File.exists?(path)
124
+ @path = path
125
+ @metric_type = metric_type
126
+ end
127
+
128
+ def parse_line(line)
129
+ end
130
+
131
+ def parse_each_line(&block)
132
+ File.new(@path).each_line do |line|
133
+ block.call(parse_line(line))
134
+ end
135
+ end
136
+ end
137
+
138
+ class KeyValueStatsParser < CGroupStatsParser
139
+ def parse_line(line)
140
+ k, v = line.split(/\s+/, 2)
141
+ if k and v
142
+ { 'key' => @metric_type + "_" + k, 'value' => v.to_i }
143
+ else
144
+ nil
145
+ end
146
+ end
147
+ end
148
+
149
+ class BlkioStatsParser < CGroupStatsParser
150
+ BlkioLineRegexp = /^(?<major>\d+):(?<minor>\d+) (?<key>[^ ]+) (?<value>\d+)/
151
+
152
+ def parse_line(line)
153
+ m = BlkioLineRegexp.match(line)
154
+ if m
155
+ { 'key' => @metric_type + "_" + m["key"].downcase, 'value' => m["value"].to_i }
156
+ else
157
+ nil
158
+ end
159
+ end
160
+ end
161
+
162
+ class BlkioSectorsParser < CGroupStatsParser
163
+ BlkioSectorsLineRegexp = /^(?<major>\d+):(?<minor>\d+) (?<value>\d+)/
164
+
165
+ def parse_line(line)
166
+ m = BlkioSectorsLineRegexp.match(line)
167
+ if m
168
+ { 'key' => @metric_type, 'value' => m["value"].to_i }
169
+ else
170
+ nil
171
+ end
172
+ end
173
+ end
174
+ end
175
+ end
@@ -0,0 +1,6 @@
1
+ 8:0 Read 0
2
+ 8:0 Write 0
3
+ 8:0 Sync 0
4
+ 8:0 Async 0
5
+ 8:0 Total 0
6
+ Total 0
@@ -0,0 +1,6 @@
1
+ 8:0 Read 14970880
2
+ 8:0 Write 4096
3
+ 8:0 Sync 14974976
4
+ 8:0 Async 0
5
+ 8:0 Total 14974976
6
+ Total 14974976
@@ -0,0 +1,6 @@
1
+ 8:0 Read 822
2
+ 8:0 Write 1
3
+ 8:0 Sync 823
4
+ 8:0 Async 0
5
+ 8:0 Total 823
6
+ Total 823
@@ -0,0 +1 @@
1
+ 8:0 816
@@ -0,0 +1,2 @@
1
+ user 0
2
+ system 0
@@ -0,0 +1,28 @@
1
+ cache 32768
2
+ rss 471040
3
+ mapped_file 0
4
+ pgpgin 293
5
+ pgpgout 170
6
+ swap 0
7
+ pgfault 1254
8
+ pgmajfault 0
9
+ inactive_anon 20480
10
+ active_anon 483328
11
+ inactive_file 0
12
+ active_file 0
13
+ unevictable 0
14
+ hierarchical_memory_limit 9223372036854775807
15
+ hierarchical_memsw_limit 9223372036854775807
16
+ total_cache 32768
17
+ total_rss 471040
18
+ total_mapped_file 0
19
+ total_pgpgin 293
20
+ total_pgpgout 170
21
+ total_swap 0
22
+ total_pgfault 1254
23
+ total_pgmajfault 0
24
+ total_inactive_anon 20480
25
+ total_active_anon 483328
26
+ total_inactive_file 0
27
+ total_active_file 0
28
+ total_unevictable 0
@@ -0,0 +1,136 @@
1
+ require 'fluent/test'
2
+ require 'fluent/plugin/in_docker_metrics'
3
+ require 'fakefs/safe'
4
+ require 'minitest/autorun'
5
+
6
+ class TestDockerMetricsInput < Minitest::Test
7
+ METRICS = [
8
+ ['memory', 'memory.stat'],
9
+ ['cpuacct', 'cpuacct.stat'],
10
+ ['blkio', 'blkio.io_serviced'],
11
+ ['blkio', 'blkio.io_service_bytes'],
12
+ ['blkio', 'blkio.io_queued'],
13
+ ['blkio', 'blkio.sectors']
14
+ ]
15
+
16
+ def setup
17
+ Fluent::Test.setup
18
+ @container_id = 'sadais1337hacker'
19
+ @container_name = 'sample_container'
20
+ @mock_metrics = read_mock_metrics
21
+ FakeFS.activate!
22
+ setup_proc_files
23
+ end
24
+
25
+ def read_mock_metrics
26
+ metrics = {}
27
+ METRICS.each do |_, file|
28
+ p = "#{File.dirname(File.expand_path(__FILE__))}/data/#{file}"
29
+ if not File.exists?(p)
30
+ raise IOError, p
31
+ end
32
+ metrics[file] = File.new(p).read
33
+ end
34
+ metrics
35
+ end
36
+
37
+ def setup_proc_files
38
+ METRICS.each do |type, file|
39
+ path = "/sys/fs/cgroup/#{type}/docker/#{@container_id}"
40
+ FileUtils.mkdir_p(path)
41
+ fh = File.new("#{path}/#{file}", "w")
42
+ fh.write(@mock_metrics[file])
43
+ fh.close
44
+ end
45
+ end
46
+
47
+ def create_driver
48
+ Fluent::Test::InputTestDriver.new(Fluent::DockerMetricsInput).configure(%[
49
+ container_ids [["#{@container_id}", "#{@container_name}"]]
50
+ stats_interval 5s
51
+ ])
52
+ end
53
+
54
+ def test_outputs
55
+ d = create_driver
56
+ d.run do
57
+ sleep 2
58
+ end
59
+
60
+ emits = d.emits
61
+ check_metric_type(emits, 'memory.stat', [
62
+ {"key"=>"memory_stat_cache", "value"=>32768},
63
+ {"key"=>"memory_stat_rss", "value"=>471040},
64
+ {"key"=>"memory_stat_mapped_file", "value"=>0},
65
+ {"key"=>"memory_stat_pgpgin", "value"=>293},
66
+ {"key"=>"memory_stat_pgpgout", "value"=>170},
67
+ {"key"=>"memory_stat_swap", "value"=>0},
68
+ {"key"=>"memory_stat_pgfault", "value"=>1254},
69
+ {"key"=>"memory_stat_pgmajfault", "value"=>0},
70
+ {"key"=>"memory_stat_inactive_anon", "value"=>20480},
71
+ {"key"=>"memory_stat_active_anon", "value"=>483328},
72
+ {"key"=>"memory_stat_inactive_file", "value"=>0},
73
+ {"key"=>"memory_stat_active_file", "value"=>0},
74
+ {"key"=>"memory_stat_unevictable", "value"=>0},
75
+ {"key"=>"memory_stat_hierarchical_memory_limit", "value"=>9223372036854775807},
76
+ {"key"=>"memory_stat_hierarchical_memsw_limit", "value"=>9223372036854775807},
77
+ {"key"=>"memory_stat_total_cache", "value"=>32768},
78
+ {"key"=>"memory_stat_total_rss", "value"=>471040},
79
+ {"key"=>"memory_stat_total_mapped_file", "value"=>0},
80
+ {"key"=>"memory_stat_total_pgpgin", "value"=>293},
81
+ {"key"=>"memory_stat_total_pgpgout", "value"=>170},
82
+ {"key"=>"memory_stat_total_swap", "value"=>0},
83
+ {"key"=>"memory_stat_total_pgfault", "value"=>1254},
84
+ {"key"=>"memory_stat_total_pgmajfault", "value"=>0},
85
+ {"key"=>"memory_stat_total_inactive_anon", "value"=>20480},
86
+ {"key"=>"memory_stat_total_active_anon", "value"=>483328},
87
+ {"key"=>"memory_stat_total_inactive_file", "value"=>0},
88
+ {"key"=>"memory_stat_total_active_file", "value"=>0},
89
+ {"key"=>"memory_stat_total_unevictable", "value"=>0}
90
+ ])
91
+ check_metric_type(emits, 'cpuacct.stat', [
92
+ {"key"=>"cpuacct_stat_user", "value"=>0},
93
+ {"key"=>"cpuacct_stat_system", "value"=>0}
94
+ ])
95
+ check_metric_type(emits, 'blkio.io_queued', [
96
+ {"key"=>"blkio_io_queued_read", "value"=>0},
97
+ {"key"=>"blkio_io_queued_write", "value"=>0},
98
+ {"key"=>"blkio_io_queued_sync", "value"=>0},
99
+ {"key"=>"blkio_io_queued_async", "value"=>0},
100
+ {"key"=>"blkio_io_queued_total", "value"=>0}
101
+ ])
102
+ check_metric_type(emits, 'blkio.io_serviced', [
103
+ {"key"=>"blkio_io_serviced_read", "value"=>822},
104
+ {"key"=>"blkio_io_serviced_write", "value"=>1},
105
+ {"key"=>"blkio_io_serviced_sync", "value"=>823},
106
+ {"key"=>"blkio_io_serviced_async", "value"=>0},
107
+ {"key"=>"blkio_io_serviced_total", "value"=>823}
108
+ ])
109
+ check_metric_type(emits, 'blkio.sectors', [
110
+ {"key"=>"blkio_sectors", "value"=>816}
111
+ ])
112
+ end
113
+
114
+ def check_metric_type(emits, type, records)
115
+ stats = emits.select do |tag, time, record| tag == "docker.#{type}" end
116
+ assert_equal records.length, stats.length, "Mismatch for #{type}"
117
+ assert_equal @container_id, emits.first[2]["id"]
118
+ assert_equal @container_name, emits.first[2]["name"]
119
+ records.each do |record|
120
+ find_metric(stats, record)
121
+ end
122
+ end
123
+
124
+ def find_metric(emits, expected_record)
125
+ match = emits.select do |_, _, record|
126
+ record["key"] == expected_record["key"] &&
127
+ record["value"] == expected_record["value"]
128
+ end
129
+
130
+ assert_equal 1, match.length, "Didn't find #{expected_record.to_json} among #{emits.to_json}"
131
+ end
132
+
133
+ def teardown
134
+ FakeFS.deactivate!
135
+ end
136
+ end
metadata ADDED
@@ -0,0 +1,162 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fluent-plugin-docker-metrics-v2
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - orr
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-11-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: fakefs
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: test-unit
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.1'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.1'
69
+ - !ruby/object:Gem::Dependency
70
+ name: minitest
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '5.8'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '5.8'
83
+ - !ruby/object:Gem::Dependency
84
+ name: fluentd
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: docker-api
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description:
112
+ email:
113
+ - orr@innovid.com
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - CHANGELOG
119
+ - Gemfile
120
+ - README.md
121
+ - Rakefile
122
+ - fluent-plugin-docker-metrics.gemspec
123
+ - lib/fluent/plugin/in_docker_metrics.rb
124
+ - test/data/blkio.io_queued
125
+ - test/data/blkio.io_service_bytes
126
+ - test/data/blkio.io_serviced
127
+ - test/data/blkio.sectors
128
+ - test/data/cpuacct.stat
129
+ - test/data/memory.stat
130
+ - test/test_in_docker_metrics.rb
131
+ homepage: https://github.com/kiyoto/fluent-plugin-docker-metrics
132
+ licenses:
133
+ - Apache-2.0
134
+ metadata: {}
135
+ post_install_message:
136
+ rdoc_options: []
137
+ require_paths:
138
+ - lib
139
+ required_ruby_version: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - ">="
142
+ - !ruby/object:Gem::Version
143
+ version: '0'
144
+ required_rubygems_version: !ruby/object:Gem::Requirement
145
+ requirements:
146
+ - - ">="
147
+ - !ruby/object:Gem::Version
148
+ version: '0'
149
+ requirements: []
150
+ rubyforge_project:
151
+ rubygems_version: 2.5.1
152
+ signing_key:
153
+ specification_version: 4
154
+ summary: Fluentd plugin to collect Docker container metrics
155
+ test_files:
156
+ - test/data/blkio.io_queued
157
+ - test/data/blkio.io_service_bytes
158
+ - test/data/blkio.io_serviced
159
+ - test/data/blkio.sectors
160
+ - test/data/cpuacct.stat
161
+ - test/data/memory.stat
162
+ - test/test_in_docker_metrics.rb