fluent-plugin-flowcounter 0.4.3 → 1.0.0
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 +4 -4
- data/.travis.yml +1 -0
- data/README.md +24 -14
- data/fluent-plugin-flowcounter.gemspec +2 -3
- data/lib/fluent/plugin/out_flowcounter.rb +14 -55
- data/test/helper.rb +1 -0
- data/test/plugin/test_out_flowcounter.rb +56 -64
- metadata +3 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 873629b9804e92822b8a2b854a5df3da2798bf45
|
4
|
+
data.tar.gz: f3d79ae17a63763f9dc0ca8073982022d8b0759e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9b92f7be19ad17f125244c10efab034df307f0581f6db4ba82d06551eee513e3002453080221494b8ec5e746601ee3a55a5540f87e93ded866e9222df1391d33
|
7
|
+
data.tar.gz: dd56f20d75dfb69f309170fdb59a520a69da0fca58e5188c46cc98106c8448e1c20d7c00e79ea4fbf98aeccda6835d98ca3caddfe322cb440ea26f8a83958b9f
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -25,7 +25,7 @@ If you want to count only records, omit `count_keys` configuration.
|
|
25
25
|
|
26
26
|
## Configuration
|
27
27
|
|
28
|
-
Counts from fields 'field1' and 'field2', per minute(default), aggregates per tags(default), output with tag 'flowcount'(default).
|
28
|
+
Counts from fields 'field1' and 'field2', per minute(default), aggregates per tags(default), output with tag 'flowcount'(default). It is strongly recommended to specify `@label` to control event stream routing.
|
29
29
|
|
30
30
|
<match **>
|
31
31
|
@type copy
|
@@ -34,13 +34,16 @@ Counts from fields 'field1' and 'field2', per minute(default), aggregates per ta
|
|
34
34
|
</store>
|
35
35
|
<store>
|
36
36
|
@type flowcounter
|
37
|
+
@label @counts
|
37
38
|
count_keys field1,field2
|
38
39
|
</store>
|
39
40
|
</match>
|
40
41
|
|
41
|
-
<
|
42
|
-
|
43
|
-
|
42
|
+
<label @counts>
|
43
|
+
<match flowcount>
|
44
|
+
# output configurations where to send count results
|
45
|
+
</match>
|
46
|
+
</label>
|
44
47
|
|
45
48
|
Counts from field 'message', per hour, aggregates all tags, output with tag 'fluentd.traffic'.
|
46
49
|
|
@@ -51,6 +54,7 @@ Counts from field 'message', per hour, aggregates all tags, output with tag 'flu
|
|
51
54
|
</store>
|
52
55
|
<store>
|
53
56
|
@type flowcounter
|
57
|
+
@label @counts
|
54
58
|
count_keys message
|
55
59
|
unit hour
|
56
60
|
aggregate all
|
@@ -58,9 +62,11 @@ Counts from field 'message', per hour, aggregates all tags, output with tag 'flu
|
|
58
62
|
</store>
|
59
63
|
</match>
|
60
64
|
|
61
|
-
<
|
62
|
-
|
63
|
-
|
65
|
+
<label @counts>
|
66
|
+
<match fluentd.traffic>
|
67
|
+
# output configurations where to send count results
|
68
|
+
</match>
|
69
|
+
</label>
|
64
70
|
|
65
71
|
To count with all fields in messages, specify 'count_keys *'.
|
66
72
|
|
@@ -81,27 +87,31 @@ To count records only (without bytes), omit `count_keys` (it runs in better perf
|
|
81
87
|
tag fluentd.traffic
|
82
88
|
</match>
|
83
89
|
|
84
|
-
|
90
|
+
Counts active tag, stop count records if the tag message stoped(when aggragates per tag).
|
85
91
|
|
86
92
|
<match target.**>
|
87
93
|
@type flowcounter
|
88
94
|
count_keys *
|
89
|
-
tag
|
95
|
+
aggregate tag
|
96
|
+
delete_idle true
|
90
97
|
</match>
|
91
98
|
|
92
|
-
|
99
|
+
### Embedding Hostname
|
100
|
+
|
101
|
+
The current version of this plugin doesn't support `${hostname}` placeholders. Use ruby code embedding for such purpose:
|
93
102
|
|
94
103
|
<match target.**>
|
95
104
|
@type flowcounter
|
96
105
|
count_keys *
|
97
|
-
|
98
|
-
delete_idle true
|
106
|
+
tag "fluentd.node.#{Socket.gethostname}"
|
99
107
|
</match>
|
100
108
|
|
109
|
+
See [Fluentd document page](https://docs.fluentd.org/articles/config-file#embedded-ruby-code) for further details.
|
110
|
+
|
101
111
|
## TODO
|
102
112
|
|
103
|
-
*
|
104
|
-
*
|
113
|
+
* Support Counter API when it's supported in Fluentd core
|
114
|
+
* Patches welcome!
|
105
115
|
|
106
116
|
## Copyright
|
107
117
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
Gem::Specification.new do |gem|
|
3
3
|
gem.name = "fluent-plugin-flowcounter"
|
4
|
-
gem.version = "0.
|
4
|
+
gem.version = "1.0.0"
|
5
5
|
gem.authors = ["TAGOMORI Satoshi"]
|
6
6
|
gem.email = ["tagomoris@gmail.com"]
|
7
7
|
gem.summary = %q{Fluent plugin to count message flow}
|
@@ -16,6 +16,5 @@ Gem::Specification.new do |gem|
|
|
16
16
|
|
17
17
|
gem.add_development_dependency "rake"
|
18
18
|
gem.add_development_dependency "test-unit"
|
19
|
-
gem.add_runtime_dependency "fluentd",
|
20
|
-
gem.add_runtime_dependency "fluent-mixin-config-placeholders", ">= 0.3.0"
|
19
|
+
gem.add_runtime_dependency "fluentd", "~> 0.14.0"
|
21
20
|
end
|
@@ -1,29 +1,19 @@
|
|
1
|
-
require 'fluent/
|
1
|
+
require 'fluent/plugin/output'
|
2
2
|
|
3
|
-
class Fluent::FlowCounterOutput < Fluent::Output
|
3
|
+
class Fluent::Plugin::FlowCounterOutput < Fluent::Plugin::Output
|
4
4
|
Fluent::Plugin.register_output('flowcounter', self)
|
5
5
|
|
6
|
-
|
7
|
-
unless method_defined?(:log)
|
8
|
-
define_method("log") { $log }
|
9
|
-
end
|
10
|
-
|
11
|
-
# Define `router` method of v0.12 to support v0.10 or earlier
|
12
|
-
unless method_defined?(:router)
|
13
|
-
define_method("router") { ::Fluent::Engine }
|
14
|
-
end
|
6
|
+
helpers :event_emitter, :timer
|
15
7
|
|
16
|
-
config_param :unit, :
|
17
|
-
config_param :aggregate, :
|
18
|
-
config_param :output_style, :
|
8
|
+
config_param :unit, :enum, list: [:second, :minute, :hour, :day], default: :minute
|
9
|
+
config_param :aggregate, :enum, list: [:tag, :all], default: :tag
|
10
|
+
config_param :output_style, :enum, list: [:joined, :tagged], default: :joined
|
19
11
|
config_param :tag, :string, default: 'flowcount'
|
20
12
|
config_param :input_tag_remove_prefix, :string, default: nil
|
21
13
|
config_param :count_keys, :string, default: nil
|
22
14
|
config_param :delimiter, :string, default: '_'
|
23
15
|
config_param :delete_idle, :bool, default: false
|
24
16
|
|
25
|
-
include Fluent::Mixin::ConfigPlaceholders
|
26
|
-
|
27
17
|
attr_accessor :counts
|
28
18
|
attr_accessor :last_checked
|
29
19
|
attr_accessor :count_all
|
@@ -32,14 +22,6 @@ class Fluent::FlowCounterOutput < Fluent::Output
|
|
32
22
|
def configure(conf)
|
33
23
|
super
|
34
24
|
|
35
|
-
@unit = case @unit
|
36
|
-
when 'second' then :second
|
37
|
-
when 'minute' then :minute
|
38
|
-
when 'hour' then :hour
|
39
|
-
when 'day' then :day
|
40
|
-
else
|
41
|
-
raise Fluent::ConfigError, "flowcounter unit allows second/minute/hour/day"
|
42
|
-
end
|
43
25
|
@tick = case @unit
|
44
26
|
when :second then 1
|
45
27
|
when :minute then 60
|
@@ -48,18 +30,6 @@ class Fluent::FlowCounterOutput < Fluent::Output
|
|
48
30
|
else
|
49
31
|
raise Fluent::ConfigError, "flowcounter unit allows second/minute/hour/day"
|
50
32
|
end
|
51
|
-
@aggregate = case @aggregate
|
52
|
-
when 'tag' then :tag
|
53
|
-
when 'all' then :all
|
54
|
-
else
|
55
|
-
raise Fluent::ConfigError, "flowcounter aggregate allows tag/all"
|
56
|
-
end
|
57
|
-
@output_style = case @output_style
|
58
|
-
when 'joined' then :joined
|
59
|
-
when 'tagged' then :tagged
|
60
|
-
else
|
61
|
-
raise Fluent::ConfigError, "flowcounter output_style allows joined/tagged"
|
62
|
-
end
|
63
33
|
if @output_style == :tagged and @aggregate != :tag
|
64
34
|
raise Fluent::ConfigError, "flowcounter aggregate must be 'tag' when output_style is 'tagged'"
|
65
35
|
end
|
@@ -67,6 +37,7 @@ class Fluent::FlowCounterOutput < Fluent::Output
|
|
67
37
|
@removed_prefix_string = @input_tag_remove_prefix + '.'
|
68
38
|
@removed_length = @removed_prefix_string.length
|
69
39
|
end
|
40
|
+
@count_all = false
|
70
41
|
if @count_keys
|
71
42
|
@count_keys = @count_keys.split(',').map(&:strip)
|
72
43
|
@count_all = (@count_keys == ['*'])
|
@@ -84,12 +55,6 @@ class Fluent::FlowCounterOutput < Fluent::Output
|
|
84
55
|
start_watch
|
85
56
|
end
|
86
57
|
|
87
|
-
def shutdown
|
88
|
-
super
|
89
|
-
@watcher.terminate
|
90
|
-
@watcher.join
|
91
|
-
end
|
92
|
-
|
93
58
|
def count_initialized(keys=nil)
|
94
59
|
if @aggregate == :all
|
95
60
|
if @count_bytes
|
@@ -160,26 +125,22 @@ class Fluent::FlowCounterOutput < Fluent::Output
|
|
160
125
|
end
|
161
126
|
|
162
127
|
def start_watch
|
128
|
+
@last_checked = Fluent::Engine.now
|
163
129
|
# for internal, or tests only
|
164
|
-
|
130
|
+
timer_execute(:out_flowcounter_watcher, 0.5, &method(:watch))
|
165
131
|
end
|
166
132
|
|
167
133
|
def watch
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
if Fluent::Engine.now - @last_checked >= @tick
|
173
|
-
now = Fluent::Engine.now
|
174
|
-
flush_emit(now - @last_checked)
|
175
|
-
@last_checked = now
|
176
|
-
end
|
134
|
+
if Fluent::Engine.now - @last_checked >= @tick
|
135
|
+
now = Fluent::Engine.now
|
136
|
+
flush_emit(now - @last_checked)
|
137
|
+
@last_checked = now
|
177
138
|
end
|
178
139
|
end
|
179
140
|
|
180
141
|
FOR_MISSING = ''
|
181
142
|
|
182
|
-
def
|
143
|
+
def process(tag, es)
|
183
144
|
name = tag
|
184
145
|
if @input_tag_remove_prefix and
|
185
146
|
( (tag.start_with?(@removed_prefix_string) and tag.length > @removed_length) or tag == @input_tag_remove_prefix)
|
@@ -198,7 +159,5 @@ class Fluent::FlowCounterOutput < Fluent::Output
|
|
198
159
|
}
|
199
160
|
end
|
200
161
|
countup(name, c, b)
|
201
|
-
|
202
|
-
chain.next
|
203
162
|
end
|
204
163
|
end
|
data/test/helper.rb
CHANGED
@@ -12,6 +12,7 @@ require 'test/unit'
|
|
12
12
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
13
13
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
14
14
|
require 'fluent/test'
|
15
|
+
require 'fluent/test/driver/output'
|
15
16
|
require 'fluent/plugin/out_flowcounter'
|
16
17
|
|
17
18
|
class Test::Unit::TestCase
|
@@ -13,8 +13,8 @@ input_tag_remove_prefix test
|
|
13
13
|
count_keys message
|
14
14
|
]
|
15
15
|
|
16
|
-
def create_driver(conf=CONFIG
|
17
|
-
Fluent::Test::
|
16
|
+
def create_driver(conf=CONFIG)
|
17
|
+
Fluent::Test::Driver::Output.new(Fluent::Plugin::FlowCounterOutput).configure(conf)
|
18
18
|
end
|
19
19
|
|
20
20
|
def test_configure
|
@@ -128,15 +128,6 @@ count_keys message
|
|
128
128
|
assert d.instance.count_all
|
129
129
|
end
|
130
130
|
|
131
|
-
def test_configure_placeholders
|
132
|
-
d = create_driver %[
|
133
|
-
hostname testing.node.local
|
134
|
-
tag test.flowcount.${hostname}
|
135
|
-
count_keys *
|
136
|
-
]
|
137
|
-
assert_equal 'test.flowcount.testing.node.local', d.instance.tag
|
138
|
-
end
|
139
|
-
|
140
131
|
def test_count_initialized
|
141
132
|
d = create_driver %[
|
142
133
|
aggregate all
|
@@ -203,13 +194,13 @@ count_keys message
|
|
203
194
|
end
|
204
195
|
|
205
196
|
def test_emit
|
206
|
-
d1 = create_driver(CONFIG
|
197
|
+
d1 = create_driver(CONFIG)
|
207
198
|
time = Time.parse("2012-01-02 13:14:15").to_i
|
208
|
-
d1.run do
|
199
|
+
d1.run(default_tag: 'test.tag1') do
|
209
200
|
3600.times do
|
210
|
-
d1.
|
211
|
-
d1.
|
212
|
-
d1.
|
201
|
+
d1.feed(time, {'message'=> 'a' * 100})
|
202
|
+
d1.feed(time, {'message'=> 'b' * 100})
|
203
|
+
d1.feed(time, {'message'=> 'c' * 100})
|
213
204
|
end
|
214
205
|
end
|
215
206
|
r1 = d1.instance.flush(3600 * 24)
|
@@ -223,11 +214,11 @@ count_keys message
|
|
223
214
|
aggregate all
|
224
215
|
tag flow
|
225
216
|
count_keys f1,f2,f3
|
226
|
-
]
|
217
|
+
])
|
227
218
|
time = Time.parse("2012-01-02 13:14:15").to_i
|
228
|
-
d3.run do
|
219
|
+
d3.run(default_tag: 'test.tag1') do
|
229
220
|
60.times do
|
230
|
-
d3.
|
221
|
+
d3.feed({'f1'=>'1'*10, 'f2'=>'2'*20, 'f3'=>'3'*10})
|
231
222
|
end
|
232
223
|
end
|
233
224
|
r3 = d3.instance.flush(60)
|
@@ -244,21 +235,21 @@ count_keys message
|
|
244
235
|
tag flowcount
|
245
236
|
input_tag_remove_prefix test
|
246
237
|
count_keys f1,f2,f3
|
247
|
-
]
|
238
|
+
])
|
248
239
|
time = Time.now.to_i
|
249
|
-
d2.run do
|
240
|
+
d2.run(default_tag: 'test.tag2') do
|
250
241
|
60.times do
|
251
|
-
d2.
|
252
|
-
d2.
|
253
|
-
d2.
|
254
|
-
d2.
|
255
|
-
d2.
|
242
|
+
d2.feed(time, {'f1' => 'abcde', 'f2' => 'vwxyz', 'f3' => '0123456789'})
|
243
|
+
d2.feed(time, {'f1' => 'abcde', 'f2' => 'vwxyz', 'f3' => '0123456789'})
|
244
|
+
d2.feed(time, {'f1' => 'abcde', 'f2' => 'vwxyz', 'f3' => '0123456789'})
|
245
|
+
d2.feed(time, {'f1' => 'abcde', 'f2' => 'vwxyz', 'f3' => '0123456789'})
|
246
|
+
d2.feed(time, {'f1' => 'abcde', 'f2' => 'vwxyz', 'f3' => '0123456789'})
|
256
247
|
end
|
248
|
+
d2.instance.flush_emit(60)
|
257
249
|
end
|
258
|
-
d2.
|
259
|
-
|
260
|
-
|
261
|
-
data = emits[0]
|
250
|
+
events = d2.events
|
251
|
+
assert_equal 1, events.length
|
252
|
+
data = events[0]
|
262
253
|
assert_equal 'flowcount', data[0] # tag
|
263
254
|
assert_equal 60*5, data[2]['count']
|
264
255
|
assert_equal 60*5*20, data[2]['bytes']
|
@@ -271,21 +262,21 @@ count_keys message
|
|
271
262
|
tag flowcount
|
272
263
|
input_tag_remove_prefix test
|
273
264
|
count_keys *
|
274
|
-
]
|
265
|
+
])
|
275
266
|
time = Time.now.to_i
|
276
|
-
d3.run do
|
267
|
+
d3.run(default_tag: 'test.tag3') do
|
277
268
|
60.times do
|
278
|
-
d3.
|
279
|
-
d3.
|
280
|
-
d3.
|
281
|
-
d3.
|
282
|
-
d3.
|
269
|
+
d3.feed(time, {'f1' => 'abcde', 'f2' => 'vwxyz', 'f3' => '0123456789'})
|
270
|
+
d3.feed(time, {'f1' => 'abcde', 'f2' => 'vwxyz', 'f3' => '0123456789'})
|
271
|
+
d3.feed(time, {'f1' => 'abcde', 'f2' => 'vwxyz', 'f3' => '0123456789'})
|
272
|
+
d3.feed(time, {'f1' => 'abcde', 'f2' => 'vwxyz', 'f3' => '0123456789'})
|
273
|
+
d3.feed(time, {'f1' => 'abcde', 'f2' => 'vwxyz', 'f3' => '0123456789'})
|
283
274
|
end
|
275
|
+
d3.instance.flush_emit(60)
|
284
276
|
end
|
285
|
-
d3.
|
286
|
-
|
287
|
-
|
288
|
-
data = emits[0]
|
277
|
+
events = d3.events
|
278
|
+
assert_equal 1, events.length
|
279
|
+
data = events[0]
|
289
280
|
assert_equal 'flowcount', data[0] # tag
|
290
281
|
assert_equal 60*5, data[2]['count']
|
291
282
|
msgpack_size = {'f1' => 'abcde', 'f2' => 'vwxyz', 'f3' => '0123456789'}.to_msgpack.bytesize * 5 * 60
|
@@ -300,11 +291,11 @@ count_keys message
|
|
300
291
|
tag flow
|
301
292
|
input_tag_remove_prefix test
|
302
293
|
count_keys *
|
303
|
-
]
|
294
|
+
])
|
304
295
|
time = Time.parse("2012-01-02 13:14:15").to_i
|
305
|
-
d1.run do
|
296
|
+
d1.run(default_tag: 'test.tag1') do
|
306
297
|
60.times do
|
307
|
-
d1.
|
298
|
+
d1.feed(time, {'message'=> 'hello'})
|
308
299
|
end
|
309
300
|
end
|
310
301
|
r1 = d1.instance.tagged_flush(60)
|
@@ -322,16 +313,17 @@ count_keys message
|
|
322
313
|
aggregate tag
|
323
314
|
tag flowcount
|
324
315
|
input_tag_remove_prefix test
|
325
|
-
]
|
316
|
+
])
|
326
317
|
time = Time.parse("2012-01-02 13:14:15").to_i
|
327
|
-
|
318
|
+
r1 = {}
|
319
|
+
d1.run(default_tag: 'test.tag1') do
|
328
320
|
3600.times do
|
329
|
-
d1.
|
330
|
-
d1.
|
331
|
-
d1.
|
321
|
+
d1.feed(time, {'message'=> 'a' * 100})
|
322
|
+
d1.feed(time, {'message'=> 'b' * 100})
|
323
|
+
d1.feed(time, {'message'=> 'c' * 100})
|
332
324
|
end
|
325
|
+
r1 = d1.instance.flush(3600 * 24)
|
333
326
|
end
|
334
|
-
r1 = d1.instance.flush(3600 * 24)
|
335
327
|
assert_equal 3600*3, r1['tag1_count']
|
336
328
|
assert_nil r1['tag1_bytes']
|
337
329
|
assert_equal (300/24.0).floor / 100.0, r1['tag1_count_rate'] # 3 * 3600 / (60 * 60 * 24) as xx.xx
|
@@ -341,11 +333,11 @@ count_keys message
|
|
341
333
|
unit minute
|
342
334
|
aggregate all
|
343
335
|
tag flow
|
344
|
-
]
|
336
|
+
])
|
345
337
|
time = Time.parse("2012-01-02 13:14:15").to_i
|
346
|
-
d3.run do
|
338
|
+
d3.run(default_tag: 'test.tag1') do
|
347
339
|
60.times do
|
348
|
-
d3.
|
340
|
+
d3.feed({'f1'=>'1'*10, 'f2'=>'2'*20, 'f3'=>'3'*10})
|
349
341
|
end
|
350
342
|
end
|
351
343
|
r3 = d3.instance.flush(60)
|
@@ -362,21 +354,21 @@ count_keys message
|
|
362
354
|
tag flowcount
|
363
355
|
input_tag_remove_prefix test
|
364
356
|
count_keys f4
|
365
|
-
]
|
357
|
+
])
|
366
358
|
time = Time.now.to_i
|
367
|
-
d3.run do
|
359
|
+
d3.run(default_tag: 'test.tag4', expect_emits: 1) do
|
368
360
|
60.times do
|
369
|
-
d3.
|
370
|
-
d3.
|
371
|
-
d3.
|
372
|
-
d3.
|
373
|
-
d3.
|
361
|
+
d3.feed(time, {'f1' => 'abcde', 'f2' => 'vwxyz', 'f3' => '0123456789'})
|
362
|
+
d3.feed(time, {'f1' => 'abcde', 'f2' => 'vwxyz', 'f3' => '0123456789'})
|
363
|
+
d3.feed(time, {'f1' => 'abcde', 'f2' => 'vwxyz', 'f3' => '0123456789'})
|
364
|
+
d3.feed(time, {'f1' => 'abcde', 'f2' => 'vwxyz', 'f3' => '0123456789'})
|
365
|
+
d3.feed(time, {'f1' => 'abcde', 'f2' => 'vwxyz', 'f3' => '0123456789'})
|
374
366
|
end
|
367
|
+
d3.instance.flush_emit(60)
|
375
368
|
end
|
376
|
-
d3.
|
377
|
-
|
378
|
-
|
379
|
-
data = emits[0]
|
369
|
+
events = d3.events
|
370
|
+
assert_equal 1, events.length
|
371
|
+
data = events[0]
|
380
372
|
assert_equal 'flowcount', data[0]
|
381
373
|
assert_equal 60*5, data[2]['count']
|
382
374
|
assert_equal 0, data[2]['bytes']
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-flowcounter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- TAGOMORI Satoshi
|
@@ -42,36 +42,16 @@ dependencies:
|
|
42
42
|
name: fluentd
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: 0.10.59
|
48
|
-
- - "<"
|
45
|
+
- - "~>"
|
49
46
|
- !ruby/object:Gem::Version
|
50
47
|
version: 0.14.0
|
51
48
|
type: :runtime
|
52
49
|
prerelease: false
|
53
50
|
version_requirements: !ruby/object:Gem::Requirement
|
54
51
|
requirements:
|
55
|
-
- - "
|
56
|
-
- !ruby/object:Gem::Version
|
57
|
-
version: 0.10.59
|
58
|
-
- - "<"
|
52
|
+
- - "~>"
|
59
53
|
- !ruby/object:Gem::Version
|
60
54
|
version: 0.14.0
|
61
|
-
- !ruby/object:Gem::Dependency
|
62
|
-
name: fluent-mixin-config-placeholders
|
63
|
-
requirement: !ruby/object:Gem::Requirement
|
64
|
-
requirements:
|
65
|
-
- - ">="
|
66
|
-
- !ruby/object:Gem::Version
|
67
|
-
version: 0.3.0
|
68
|
-
type: :runtime
|
69
|
-
prerelease: false
|
70
|
-
version_requirements: !ruby/object:Gem::Requirement
|
71
|
-
requirements:
|
72
|
-
- - ">="
|
73
|
-
- !ruby/object:Gem::Version
|
74
|
-
version: 0.3.0
|
75
55
|
description: Plugin to counts messages/bytes that matches, per minutes/hours/days
|
76
56
|
email:
|
77
57
|
- tagomoris@gmail.com
|