fluent-plugin-numeric-monitor 0.1.4 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +48 -0
- data/fluent-plugin-numeric-monitor.gemspec +1 -1
- data/lib/fluent/plugin/out_numeric_monitor.rb +57 -33
- data/test/plugin/test_out_numeric_monitor.rb +237 -0
- metadata +11 -17
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f0e34e02fb3c60ee05565ff9e7ed9c31bbf1f677
|
4
|
+
data.tar.gz: b74595ed3a9194bb3da3f21d8d47749b97059bcd
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 9031f88688412a012a965d9240639e51c65716bcc5248085c8bdff1e85bcde52b8b12d3703df11442464427a5b9c1459c26d8bfec907a60ec18fdfe62d72e21f
|
7
|
+
data.tar.gz: 9ee81f7dfbe2483631df14dbea7553cced143f62c5631d23c25386cc1dcd6c669aa7b92fd59870b23a1c380090293031d44a9c6a9ee9c68ca2e71c22c8d8e31b
|
data/README.md
CHANGED
@@ -26,6 +26,54 @@ Output messages like:
|
|
26
26
|
|
27
27
|
{"min":3012,"max":913243,"avg":100123.51,"percentile_90":154390,"percentile_95":223110,"num":50012}
|
28
28
|
|
29
|
+
|
30
|
+
## Parameters
|
31
|
+
|
32
|
+
* monitor\_key (required)
|
33
|
+
|
34
|
+
The key to monitor in the event record.
|
35
|
+
|
36
|
+
* percentiles
|
37
|
+
|
38
|
+
Activate the percentile monitoring. Must be specified between `1` and `99` by integer separeted by , (comma).
|
39
|
+
|
40
|
+
* tag
|
41
|
+
|
42
|
+
The output tag. Default is `monitor`.
|
43
|
+
|
44
|
+
* tag\_prefix
|
45
|
+
|
46
|
+
The prefix string which will be added to the input tag. `output_per_tag yes` must be specified together.
|
47
|
+
|
48
|
+
* input\_tag\_remove\_prefix
|
49
|
+
|
50
|
+
The prefix string which will be removed from the input tag.
|
51
|
+
|
52
|
+
* count\_interval
|
53
|
+
|
54
|
+
The interval time to monitor in seconds. Default is `60`.
|
55
|
+
|
56
|
+
* unit
|
57
|
+
|
58
|
+
The interval time to monitor specified an unit (either of `minute`, `hour`, or `day`).
|
59
|
+
Use either of `count_interval` or `unit`.
|
60
|
+
|
61
|
+
* aggregate
|
62
|
+
|
63
|
+
Calculate in each input `tag` separetely, or `all` records in a mass. Default is `tag`
|
64
|
+
|
65
|
+
* ouput\_per\_tag
|
66
|
+
|
67
|
+
Emit for each input tag. `tag_prefix` must be specified together. Default is `no`.
|
68
|
+
|
69
|
+
* output\_key\_prefix
|
70
|
+
|
71
|
+
The prefix string which will be added to the output key.
|
72
|
+
|
73
|
+
* samples\_limit
|
74
|
+
|
75
|
+
The limit number of sampling. Default is `1000000`.
|
76
|
+
|
29
77
|
## TODO
|
30
78
|
|
31
79
|
* more tests
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
Gem::Specification.new do |gem|
|
3
3
|
gem.name = "fluent-plugin-numeric-monitor"
|
4
|
-
gem.version = "0.1.
|
4
|
+
gem.version = "0.1.5"
|
5
5
|
gem.authors = ["TAGOMORI Satoshi"]
|
6
6
|
gem.email = ["tagomoris@gmail.com"]
|
7
7
|
gem.description = %q{Fluentd plugin to calculate min/max/avg/Xpercentile values, and emit these data as message}
|
@@ -6,7 +6,9 @@ class Fluent::NumericMonitorOutput < Fluent::Output
|
|
6
6
|
config_param :count_interval, :time, :default => 60
|
7
7
|
config_param :unit, :string, :default => nil
|
8
8
|
config_param :tag, :string, :default => 'monitor'
|
9
|
+
config_param :tag_prefix, :string, :default => nil
|
9
10
|
|
11
|
+
config_param :output_per_tag, :bool, :default => false
|
10
12
|
config_param :aggregate, :default => 'tag' do |val|
|
11
13
|
case val
|
12
14
|
when 'tag' then :tag
|
@@ -17,6 +19,7 @@ class Fluent::NumericMonitorOutput < Fluent::Output
|
|
17
19
|
end
|
18
20
|
config_param :input_tag_remove_prefix, :string, :default => nil
|
19
21
|
config_param :monitor_key, :string
|
22
|
+
config_param :output_key_prefix, :string, :default => nil
|
20
23
|
config_param :percentiles, :default => nil do |val|
|
21
24
|
values = val.split(",").map(&:to_i)
|
22
25
|
if values.select{|i| i < 1 or i > 99 }.size > 0
|
@@ -46,6 +49,16 @@ class Fluent::NumericMonitorOutput < Fluent::Output
|
|
46
49
|
@removed_prefix_string = @input_tag_remove_prefix + '.'
|
47
50
|
@removed_length = @removed_prefix_string.length
|
48
51
|
end
|
52
|
+
|
53
|
+
@key_prefix_string = ''
|
54
|
+
if @output_key_prefix
|
55
|
+
@key_prefix_string = @output_key_prefix + '_'
|
56
|
+
end
|
57
|
+
|
58
|
+
if (@output_per_tag || @tag_prefix) && (!@output_per_tag || !@tag_prefix)
|
59
|
+
raise Fluent::ConfigError, 'Specify both of output_per_tag and tag_prefix'
|
60
|
+
end
|
61
|
+
@tag_prefix_string = @tag_prefix + '.' if @output_per_tag
|
49
62
|
|
50
63
|
@count = count_initialized
|
51
64
|
@mutex = Mutex.new
|
@@ -106,42 +119,46 @@ class Fluent::NumericMonitorOutput < Fluent::Output
|
|
106
119
|
tag
|
107
120
|
end
|
108
121
|
|
109
|
-
def
|
110
|
-
output =
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
i = (c[:num] * p / 100).floor
|
121
|
-
if i > 0
|
122
|
-
i -= 1
|
123
|
-
end
|
124
|
-
output["percentile_#{p}"] = sorted[i]
|
122
|
+
def generate_fields(count, key_prefix = '', output = {})
|
123
|
+
output[key_prefix + 'num'] = count[:num] if count[:num]
|
124
|
+
output[key_prefix + 'min'] = count[:min] if count[:min]
|
125
|
+
output[key_prefix + 'max'] = count[:max] if count[:max]
|
126
|
+
output[key_prefix + 'avg'] = (count[:sum] / (count[:num] * 1.0)) if count[:num] > 0
|
127
|
+
if @percentiles
|
128
|
+
sorted = count[:sample].sort
|
129
|
+
@percentiles.each do |p|
|
130
|
+
i = (count[:num] * p / 100).floor
|
131
|
+
if i > 0
|
132
|
+
i -= 1
|
125
133
|
end
|
134
|
+
output[key_prefix + "percentile_#{p}"] = sorted[i]
|
126
135
|
end
|
127
|
-
return output
|
128
136
|
end
|
137
|
+
output
|
138
|
+
end
|
129
139
|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
140
|
+
def generate_output(count)
|
141
|
+
if @aggregate == :all
|
142
|
+
if @output_per_tag
|
143
|
+
# tag_prefix_all: { 'key_prefix_min' => -10, 'key_prefix_max' => 10, ... } }
|
144
|
+
output = {'all' => generate_fields(count['all'], @key_prefix_string)}
|
145
|
+
else
|
146
|
+
# tag: { 'key_prefix_min' => -10, 'key_prefix_max' => 10, ... }
|
147
|
+
output = generate_fields(count['all'], @key_prefix_string)
|
148
|
+
end
|
149
|
+
else
|
150
|
+
output = {}
|
151
|
+
if @output_per_tag
|
152
|
+
# tag_prefix_tag1: { 'key_prefix_min' => -10, 'key_prefix_max' => 10, ... }
|
153
|
+
# tag_prefix_tag2: { 'key_prefix_min' => -10, 'key_prefix_max' => 10, ... }
|
154
|
+
count.keys.each do |tag|
|
155
|
+
output[stripped_tag(tag)] = generate_fields(count[tag], @key_prefix_string)
|
156
|
+
end
|
157
|
+
else
|
158
|
+
# tag: { 'key_prefix_tag1_min' => -10, 'key_prefix_tag1_max' => 10, ..., 'key_prefix_tag2_min' => -10, 'key_prefix_tag2_max' => 10, ... }
|
159
|
+
count.keys.each do |tag|
|
160
|
+
key_prefix = @key_prefix_string + stripped_tag(tag) + '_'
|
161
|
+
generate_fields(count[tag], key_prefix, output)
|
145
162
|
end
|
146
163
|
end
|
147
164
|
end
|
@@ -154,7 +171,14 @@ class Fluent::NumericMonitorOutput < Fluent::Output
|
|
154
171
|
end
|
155
172
|
|
156
173
|
def flush_emit
|
157
|
-
|
174
|
+
if @output_per_tag
|
175
|
+
time = Fluent::Engine.now
|
176
|
+
flush.each do |tag, message|
|
177
|
+
Fluent::Engine.emit(@tag_prefix_string + tag, time, message)
|
178
|
+
end
|
179
|
+
else
|
180
|
+
Fluent::Engine.emit(@tag, Fluent::Engine.now, flush)
|
181
|
+
end
|
158
182
|
end
|
159
183
|
|
160
184
|
def countups(tag, min, max, sum, num, sample)
|
@@ -18,6 +18,19 @@ class NumericMonitorOutputTest < Test::Unit::TestCase
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def test_configure
|
21
|
+
assert_raise(Fluent::ConfigError) {
|
22
|
+
d = create_driver('')
|
23
|
+
}
|
24
|
+
assert_raise(Fluent::ConfigError) {
|
25
|
+
d = create_driver CONFIG + %[
|
26
|
+
output_per_tag true
|
27
|
+
]
|
28
|
+
}
|
29
|
+
assert_raise(Fluent::ConfigError) {
|
30
|
+
d = create_driver CONFIG + %[
|
31
|
+
tag_prefix prefix
|
32
|
+
]
|
33
|
+
}
|
21
34
|
#TODO
|
22
35
|
end
|
23
36
|
|
@@ -115,4 +128,228 @@ class NumericMonitorOutputTest < Test::Unit::TestCase
|
|
115
128
|
assert_equal 2, r['test_avg']
|
116
129
|
assert_equal 3, r['test_num']
|
117
130
|
end
|
131
|
+
|
132
|
+
def test_output_per_tag
|
133
|
+
d = create_driver(CONFIG + %[
|
134
|
+
aggregate tag
|
135
|
+
output_per_tag true
|
136
|
+
tag_prefix tag_prefix
|
137
|
+
], 'tag')
|
138
|
+
d.run do
|
139
|
+
d.tag = 'tag1'
|
140
|
+
d.emit({'field1' => 1})
|
141
|
+
d.emit({'field1' => 2})
|
142
|
+
d.emit({'field1' => 3})
|
143
|
+
d.tag = 'tag2'
|
144
|
+
d.emit({'field1' => 1})
|
145
|
+
d.emit({'field1' => 2})
|
146
|
+
d.emit({'field1' => 3})
|
147
|
+
end
|
148
|
+
d.instance.flush_emit
|
149
|
+
assert_equal 2, d.emits.size
|
150
|
+
tag, r = d.emits[0][0], d.emits[0][2]
|
151
|
+
assert_equal 'tag_prefix.tag1', tag
|
152
|
+
assert_equal 1, r['min']
|
153
|
+
assert_equal 3, r['max']
|
154
|
+
assert_equal 2, r['avg']
|
155
|
+
assert_equal 3, r['num']
|
156
|
+
tag, r = d.emits[1][0], d.emits[1][2]
|
157
|
+
assert_equal 'tag_prefix.tag2', tag
|
158
|
+
assert_equal 1, r['min']
|
159
|
+
assert_equal 3, r['max']
|
160
|
+
assert_equal 2, r['avg']
|
161
|
+
assert_equal 3, r['num']
|
162
|
+
|
163
|
+
d = create_driver(CONFIG + %[
|
164
|
+
aggregate tag
|
165
|
+
output_per_tag false
|
166
|
+
tag output_tag
|
167
|
+
], 'tag')
|
168
|
+
d.run do
|
169
|
+
d.tag = 'tag1'
|
170
|
+
d.emit({'field1' => 1})
|
171
|
+
d.emit({'field1' => 2})
|
172
|
+
d.emit({'field1' => 3})
|
173
|
+
d.tag = 'tag2'
|
174
|
+
d.emit({'field1' => 1})
|
175
|
+
d.emit({'field1' => 2})
|
176
|
+
d.emit({'field1' => 3})
|
177
|
+
end
|
178
|
+
d.instance.flush_emit
|
179
|
+
assert_equal 1, d.emits.size
|
180
|
+
tag, r = d.emits[0][0], d.emits[0][2]
|
181
|
+
assert_equal 'output_tag', tag
|
182
|
+
assert_equal 1, r['tag1_min']
|
183
|
+
assert_equal 3, r['tag1_max']
|
184
|
+
assert_equal 2, r['tag1_avg']
|
185
|
+
assert_equal 3, r['tag1_num']
|
186
|
+
assert_equal 1, r['tag2_min']
|
187
|
+
assert_equal 3, r['tag2_max']
|
188
|
+
assert_equal 2, r['tag2_avg']
|
189
|
+
assert_equal 3, r['tag2_num']
|
190
|
+
|
191
|
+
d = create_driver(CONFIG + %[
|
192
|
+
aggregate all
|
193
|
+
output_per_tag true
|
194
|
+
tag_prefix tag_prefix
|
195
|
+
], 'tag')
|
196
|
+
d.run do
|
197
|
+
d.tag = 'tag1'
|
198
|
+
d.emit({'field1' => 1})
|
199
|
+
d.emit({'field1' => 2})
|
200
|
+
d.emit({'field1' => 3})
|
201
|
+
d.tag = 'tag2'
|
202
|
+
d.emit({'field1' => 1})
|
203
|
+
d.emit({'field1' => 2})
|
204
|
+
d.emit({'field1' => 3})
|
205
|
+
end
|
206
|
+
d.instance.flush_emit
|
207
|
+
assert_equal 1, d.emits.size
|
208
|
+
tag = d.emits[0][0]
|
209
|
+
r = d.emits[0][2]
|
210
|
+
assert_equal 'tag_prefix.all', tag
|
211
|
+
assert_equal 1, r['min']
|
212
|
+
assert_equal 3, r['max']
|
213
|
+
assert_equal 2, r['avg']
|
214
|
+
assert_equal 6, r['num']
|
215
|
+
|
216
|
+
d = create_driver(CONFIG + %[
|
217
|
+
aggregate all
|
218
|
+
output_per_tag false
|
219
|
+
tag output_tag
|
220
|
+
], 'tag')
|
221
|
+
d.run do
|
222
|
+
d.tag = 'tag1'
|
223
|
+
d.emit({'field1' => 1})
|
224
|
+
d.emit({'field1' => 2})
|
225
|
+
d.emit({'field1' => 3})
|
226
|
+
d.tag = 'tag2'
|
227
|
+
d.emit({'field1' => 1})
|
228
|
+
d.emit({'field1' => 2})
|
229
|
+
d.emit({'field1' => 3})
|
230
|
+
end
|
231
|
+
d.instance.flush_emit
|
232
|
+
assert_equal 1, d.emits.size
|
233
|
+
tag = d.emits[0][0]
|
234
|
+
r = d.emits[0][2]
|
235
|
+
assert_equal 'output_tag', tag
|
236
|
+
assert_equal 1, r['min']
|
237
|
+
assert_equal 3, r['max']
|
238
|
+
assert_equal 2, r['avg']
|
239
|
+
assert_equal 6, r['num']
|
240
|
+
end
|
241
|
+
|
242
|
+
def test_output_key_prefix
|
243
|
+
d = create_driver(CONFIG + %[
|
244
|
+
aggregate tag
|
245
|
+
output_per_tag true
|
246
|
+
tag_prefix tag_prefix
|
247
|
+
output_key_prefix key_prefix
|
248
|
+
], 'tag')
|
249
|
+
d.run do
|
250
|
+
d.tag = 'tag1'
|
251
|
+
d.emit({'field1' => 1})
|
252
|
+
d.emit({'field1' => 2})
|
253
|
+
d.emit({'field1' => 3})
|
254
|
+
d.tag = 'tag2'
|
255
|
+
d.emit({'field1' => 1})
|
256
|
+
d.emit({'field1' => 2})
|
257
|
+
d.emit({'field1' => 3})
|
258
|
+
end
|
259
|
+
d.instance.flush_emit
|
260
|
+
assert_equal 2, d.emits.size
|
261
|
+
tag, r = d.emits[0][0], d.emits[0][2]
|
262
|
+
assert_equal 'tag_prefix.tag1', tag
|
263
|
+
assert_equal 1, r['key_prefix_min']
|
264
|
+
assert_equal 3, r['key_prefix_max']
|
265
|
+
assert_equal 2, r['key_prefix_avg']
|
266
|
+
assert_equal 3, r['key_prefix_num']
|
267
|
+
tag, r = d.emits[1][0], d.emits[1][2]
|
268
|
+
assert_equal 'tag_prefix.tag2', tag
|
269
|
+
assert_equal 1, r['key_prefix_min']
|
270
|
+
assert_equal 3, r['key_prefix_max']
|
271
|
+
assert_equal 2, r['key_prefix_avg']
|
272
|
+
assert_equal 3, r['key_prefix_num']
|
273
|
+
|
274
|
+
d = create_driver(CONFIG + %[
|
275
|
+
aggregate tag
|
276
|
+
output_per_tag false
|
277
|
+
tag output_tag
|
278
|
+
output_key_prefix key_prefix
|
279
|
+
], 'tag')
|
280
|
+
d.run do
|
281
|
+
d.tag = 'tag1'
|
282
|
+
d.emit({'field1' => 1})
|
283
|
+
d.emit({'field1' => 2})
|
284
|
+
d.emit({'field1' => 3})
|
285
|
+
d.tag = 'tag2'
|
286
|
+
d.emit({'field1' => 1})
|
287
|
+
d.emit({'field1' => 2})
|
288
|
+
d.emit({'field1' => 3})
|
289
|
+
end
|
290
|
+
d.instance.flush_emit
|
291
|
+
assert_equal 1, d.emits.size
|
292
|
+
tag, r = d.emits[0][0], d.emits[0][2]
|
293
|
+
assert_equal 'output_tag', tag
|
294
|
+
assert_equal 1, r['key_prefix_tag1_min']
|
295
|
+
assert_equal 3, r['key_prefix_tag1_max']
|
296
|
+
assert_equal 2, r['key_prefix_tag1_avg']
|
297
|
+
assert_equal 3, r['key_prefix_tag1_num']
|
298
|
+
assert_equal 1, r['key_prefix_tag2_min']
|
299
|
+
assert_equal 3, r['key_prefix_tag2_max']
|
300
|
+
assert_equal 2, r['key_prefix_tag2_avg']
|
301
|
+
assert_equal 3, r['key_prefix_tag2_num']
|
302
|
+
|
303
|
+
d = create_driver(CONFIG + %[
|
304
|
+
aggregate all
|
305
|
+
output_per_tag true
|
306
|
+
tag_prefix tag_prefix
|
307
|
+
output_key_prefix key_prefix
|
308
|
+
], 'tag')
|
309
|
+
d.run do
|
310
|
+
d.tag = 'tag1'
|
311
|
+
d.emit({'field1' => 1})
|
312
|
+
d.emit({'field1' => 2})
|
313
|
+
d.emit({'field1' => 3})
|
314
|
+
d.tag = 'tag2'
|
315
|
+
d.emit({'field1' => 1})
|
316
|
+
d.emit({'field1' => 2})
|
317
|
+
d.emit({'field1' => 3})
|
318
|
+
end
|
319
|
+
d.instance.flush_emit
|
320
|
+
assert_equal 1, d.emits.size
|
321
|
+
tag = d.emits[0][0]
|
322
|
+
r = d.emits[0][2]
|
323
|
+
assert_equal 'tag_prefix.all', tag
|
324
|
+
assert_equal 1, r['key_prefix_min']
|
325
|
+
assert_equal 3, r['key_prefix_max']
|
326
|
+
assert_equal 2, r['key_prefix_avg']
|
327
|
+
assert_equal 6, r['key_prefix_num']
|
328
|
+
|
329
|
+
d = create_driver(CONFIG + %[
|
330
|
+
aggregate all
|
331
|
+
output_per_tag false
|
332
|
+
tag output_tag
|
333
|
+
output_key_prefix key_prefix
|
334
|
+
], 'tag')
|
335
|
+
d.run do
|
336
|
+
d.tag = 'tag1'
|
337
|
+
d.emit({'field1' => 1})
|
338
|
+
d.emit({'field1' => 2})
|
339
|
+
d.emit({'field1' => 3})
|
340
|
+
d.tag = 'tag2'
|
341
|
+
d.emit({'field1' => 1})
|
342
|
+
d.emit({'field1' => 2})
|
343
|
+
d.emit({'field1' => 3})
|
344
|
+
end
|
345
|
+
d.instance.flush_emit
|
346
|
+
assert_equal 1, d.emits.size
|
347
|
+
tag = d.emits[0][0]
|
348
|
+
r = d.emits[0][2]
|
349
|
+
assert_equal 'output_tag', tag
|
350
|
+
assert_equal 1, r['key_prefix_min']
|
351
|
+
assert_equal 3, r['key_prefix_max']
|
352
|
+
assert_equal 2, r['key_prefix_avg']
|
353
|
+
assert_equal 6, r['key_prefix_num']
|
354
|
+
end
|
118
355
|
end
|
metadata
CHANGED
@@ -1,46 +1,41 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-numeric-monitor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
5
|
-
prerelease:
|
4
|
+
version: 0.1.5
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- TAGOMORI Satoshi
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-
|
11
|
+
date: 2013-06-07 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: rake
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :development
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - '>='
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '0'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: fluentd
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - '>='
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: '0'
|
38
34
|
type: :runtime
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - '>='
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: '0'
|
46
41
|
description: Fluentd plugin to calculate min/max/avg/Xpercentile values, and emit
|
@@ -62,27 +57,26 @@ files:
|
|
62
57
|
- test/plugin/test_out_numeric_monitor.rb
|
63
58
|
homepage: https://github.com/tagomoris/fluent-plugin-numeric-monitor
|
64
59
|
licenses: []
|
60
|
+
metadata: {}
|
65
61
|
post_install_message:
|
66
62
|
rdoc_options: []
|
67
63
|
require_paths:
|
68
64
|
- lib
|
69
65
|
required_ruby_version: !ruby/object:Gem::Requirement
|
70
|
-
none: false
|
71
66
|
requirements:
|
72
|
-
- -
|
67
|
+
- - '>='
|
73
68
|
- !ruby/object:Gem::Version
|
74
69
|
version: '0'
|
75
70
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
76
|
-
none: false
|
77
71
|
requirements:
|
78
|
-
- -
|
72
|
+
- - '>='
|
79
73
|
- !ruby/object:Gem::Version
|
80
74
|
version: '0'
|
81
75
|
requirements: []
|
82
76
|
rubyforge_project:
|
83
|
-
rubygems_version:
|
77
|
+
rubygems_version: 2.0.2
|
84
78
|
signing_key:
|
85
|
-
specification_version:
|
79
|
+
specification_version: 4
|
86
80
|
summary: Fluentd plugin to calculate min/max/avg/Xpercentile values
|
87
81
|
test_files:
|
88
82
|
- test/helper.rb
|