fluent-plugin-docker-metrics-v2 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG +7 -0
- data/Gemfile +3 -0
- data/README.md +41 -0
- data/Rakefile +10 -0
- data/fluent-plugin-docker-metrics.gemspec +26 -0
- data/lib/fluent/plugin/in_docker_metrics.rb +175 -0
- data/test/data/blkio.io_queued +6 -0
- data/test/data/blkio.io_service_bytes +6 -0
- data/test/data/blkio.io_serviced +6 -0
- data/test/data/blkio.sectors +1 -0
- data/test/data/cpuacct.stat +2 -0
- data/test/data/memory.stat +28 -0
- data/test/test_in_docker_metrics.rb +136 -0
- metadata +162 -0
checksums.yaml
ADDED
@@ -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
|
data/CHANGELOG
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -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
|
+
|
data/Rakefile
ADDED
@@ -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 @@
|
|
1
|
+
8:0 816
|
@@ -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
|