fluent-plugin-datacalculator 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +0 -7
- data/example.conf +0 -15
- data/fluent-plugin-datacalculator.gemspec +1 -1
- data/lib/fluent/plugin/out_datacalculator.rb +31 -28
- metadata +7 -19
- data/test/plugin/test_out_datacalculator_fomulas.rb +0 -79
data/Rakefile
CHANGED
@@ -7,12 +7,5 @@ Rake::TestTask.new(:test) do |test|
|
|
7
7
|
test.verbose = true
|
8
8
|
end
|
9
9
|
|
10
|
-
desc "fomulas test"
|
11
|
-
Rake::TestTask.new(:fomulas) do |test|
|
12
|
-
test.libs << 'lib' << 'test'
|
13
|
-
test.pattern = 'test/**/test_out_datacalculator_fomulas.rb'
|
14
|
-
test.verbose = true
|
15
|
-
end
|
16
|
-
|
17
10
|
task :default => :test
|
18
11
|
|
data/example.conf
CHANGED
@@ -2,21 +2,6 @@
|
|
2
2
|
type forward
|
3
3
|
</source>
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
<match payment.install>
|
8
|
-
type datacalculator
|
9
|
-
tag result.install
|
10
|
-
count_interval 5s
|
11
|
-
aggregate keys area_id, mission_id
|
12
|
-
formulas sum = amount * price, cnt = 1, total = amount
|
13
|
-
finalizer name = "area_" + cnt.to_s
|
14
|
-
<unmatched>
|
15
|
-
type file
|
16
|
-
path unmatched
|
17
|
-
</unmatched>
|
18
|
-
</match>
|
19
|
-
|
20
5
|
<match payment.quest>
|
21
6
|
type datacalculator
|
22
7
|
tag result.quest
|
@@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__)
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "fluent-plugin-datacalculator"
|
6
|
-
s.version = "0.0.
|
6
|
+
s.version = "0.0.5"
|
7
7
|
s.authors = ["Muddy Dixon"]
|
8
8
|
s.email = ["muddydixon@gmail.com"]
|
9
9
|
s.homepage = "https://github.com/muddydixon/fluent-plugin-datacalculator"
|
@@ -24,15 +24,27 @@ class Fluent::DataCalculatorOutput < Fluent::Output
|
|
24
24
|
if @count_interval
|
25
25
|
@tick = @count_interval.to_i
|
26
26
|
else
|
27
|
-
@
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
27
|
+
if @unit.index('sec') == 0
|
28
|
+
@tick = 1
|
29
|
+
elsif @unit.index('sec') != nil
|
30
|
+
@tick = @unit[0, @unit.index('sec')].to_i
|
31
|
+
elsif @unit.index('minute') == 0
|
32
|
+
@tick = 60
|
33
|
+
elsif @unit.index('minute') != nil
|
34
|
+
@tick = @unit[0, @unit.index('minute')].to_i * 60
|
35
|
+
elsif @unit.index('hour') == 0
|
36
|
+
@tick = 3600
|
37
|
+
elsif @unit.index('hour') != nil
|
38
|
+
@tick = @unit[0, @unit.index('hour')].to_i * 3600
|
39
|
+
elsif @unit.index('day') == 0
|
40
|
+
@tick = 86400
|
41
|
+
elsif @unit.index('day') != nil
|
42
|
+
@tick = @unit[0, @unit.index('day')].to_i * 86400
|
43
|
+
else
|
44
|
+
raise RuntimeError, "@unit must be one of Xsec[onds]/Xminute[s]/Xhour[s]/Xday[s]"
|
45
|
+
end
|
34
46
|
end
|
35
|
-
|
47
|
+
|
36
48
|
|
37
49
|
conf.elements.each do |element|
|
38
50
|
element.keys.each do |k|
|
@@ -70,12 +82,8 @@ class Fluent::DataCalculatorOutput < Fluent::Output
|
|
70
82
|
def createFunc (cnt, str)
|
71
83
|
str.strip!
|
72
84
|
left, right = str.split(/\s*=\s*/, 2)
|
73
|
-
|
74
|
-
rights = right.
|
75
|
-
rights = rights.scan(/[a-zA-Z][\w\d_\.\$\:\@]*/).uniq.select{|x| not x.match(/^[A-Z]/)}
|
76
|
-
rights = rights.map do|var|
|
77
|
-
var.sub(/[\.:].+$/, '')
|
78
|
-
end
|
85
|
+
# Fluent moduleだけはOK
|
86
|
+
rights = right.scan(/[a-zA-Z][\w\d_\.\$\:\@]*/).uniq.select{|x| x.index('Fluent') != 0}
|
79
87
|
|
80
88
|
begin
|
81
89
|
f = eval('lambda {|'+rights.join(',')+'| '+right + '}')
|
@@ -96,13 +104,9 @@ class Fluent::DataCalculatorOutput < Fluent::Output
|
|
96
104
|
if tag != nil and tag != 'all'
|
97
105
|
arg = tag + '_' + arg
|
98
106
|
end
|
99
|
-
_argv.push obj[arg]
|
107
|
+
_argv.push obj[arg].to_f
|
100
108
|
}
|
101
|
-
|
102
|
-
formula.call(*_argv)
|
103
|
-
rescue ArgumentError
|
104
|
-
raise Fluent::RuntimeError, "argument error " + _argv + " are adapted to "+ formula
|
105
|
-
end
|
109
|
+
formula.call(*_argv)
|
106
110
|
end
|
107
111
|
|
108
112
|
@_formulas = []
|
@@ -167,7 +171,7 @@ class Fluent::DataCalculatorOutput < Fluent::Output
|
|
167
171
|
if @aggregate == :all
|
168
172
|
tag = 'all'
|
169
173
|
end
|
170
|
-
|
174
|
+
|
171
175
|
@mutex.synchronize {
|
172
176
|
@counts[tag] ||= [0] * @_formulas.length
|
173
177
|
counts.each_with_index do |count, i|
|
@@ -208,7 +212,7 @@ class Fluent::DataCalculatorOutput < Fluent::Output
|
|
208
212
|
name = @_formulas[i][1]
|
209
213
|
output[name] = count
|
210
214
|
end
|
211
|
-
|
215
|
+
|
212
216
|
@aggregate_keys.each_with_index do |key, i|
|
213
217
|
output[@aggregate_keys[i]] = pat_val[i]
|
214
218
|
end
|
@@ -216,10 +220,10 @@ class Fluent::DataCalculatorOutput < Fluent::Output
|
|
216
220
|
if @_finalizer
|
217
221
|
output[@_finalizer[1]] = execFunc('all', output, @_finalizer[2], @_finalizer[3])
|
218
222
|
end
|
219
|
-
|
223
|
+
|
220
224
|
outputs.push(output)
|
221
225
|
end
|
222
|
-
|
226
|
+
|
223
227
|
return outputs
|
224
228
|
end
|
225
229
|
|
@@ -253,7 +257,7 @@ class Fluent::DataCalculatorOutput < Fluent::Output
|
|
253
257
|
# for internal, or tests only
|
254
258
|
@watcher = Thread.new(&method(:watch))
|
255
259
|
end
|
256
|
-
|
260
|
+
|
257
261
|
def watch
|
258
262
|
# instance variable, and public accessable, for test
|
259
263
|
@last_checked = Fluent::Engine.now
|
@@ -277,7 +281,7 @@ class Fluent::DataCalculatorOutput < Fluent::Output
|
|
277
281
|
end
|
278
282
|
|
279
283
|
def emit (tag, es, chain)
|
280
|
-
|
284
|
+
|
281
285
|
if @aggregate == 'keys'
|
282
286
|
emit_aggregate_keys(tag, es, chain)
|
283
287
|
else
|
@@ -314,13 +318,12 @@ class Fluent::DataCalculatorOutput < Fluent::Output
|
|
314
318
|
|
315
319
|
def emit_single_tag (tag, es, chain)
|
316
320
|
c = [0] * @_formulas.length
|
317
|
-
|
321
|
+
|
318
322
|
es.each do |time,record|
|
319
323
|
matched = false
|
320
324
|
if @_formulas.length > 0
|
321
325
|
@_formulas.each do |index, outkey, inkeys, formula|
|
322
326
|
next unless formula and checkArgs(record, inkeys)
|
323
|
-
|
324
327
|
c[index] += execFunc(nil, record, inkeys, formula)
|
325
328
|
matched = true
|
326
329
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-datacalculator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-07-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: fluentd
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirement: &2164769940 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,15 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
25
|
-
none: false
|
26
|
-
requirements:
|
27
|
-
- - ! '>='
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: '0'
|
24
|
+
version_requirements: *2164769940
|
30
25
|
- !ruby/object:Gem::Dependency
|
31
26
|
name: fluentd
|
32
|
-
requirement: !ruby/object:Gem::Requirement
|
27
|
+
requirement: &2164769420 !ruby/object:Gem::Requirement
|
33
28
|
none: false
|
34
29
|
requirements:
|
35
30
|
- - ! '>='
|
@@ -37,12 +32,7 @@ dependencies:
|
|
37
32
|
version: '0'
|
38
33
|
type: :runtime
|
39
34
|
prerelease: false
|
40
|
-
version_requirements:
|
41
|
-
none: false
|
42
|
-
requirements:
|
43
|
-
- - ! '>='
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
version: '0'
|
35
|
+
version_requirements: *2164769420
|
46
36
|
description: Output filter plugin to calculate messages that matches specified conditions
|
47
37
|
email:
|
48
38
|
- muddydixon@gmail.com
|
@@ -61,7 +51,6 @@ files:
|
|
61
51
|
- lib/fluent/plugin/out_datacalculator.rb
|
62
52
|
- test/helper.rb
|
63
53
|
- test/plugin/test_out_datacalculator.rb
|
64
|
-
- test/plugin/test_out_datacalculator_fomulas.rb
|
65
54
|
homepage: https://github.com/muddydixon/fluent-plugin-datacalculator
|
66
55
|
licenses: []
|
67
56
|
post_install_message:
|
@@ -82,11 +71,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
82
71
|
version: '0'
|
83
72
|
requirements: []
|
84
73
|
rubyforge_project: fluent-plugin-datacalculator
|
85
|
-
rubygems_version: 1.8.
|
74
|
+
rubygems_version: 1.8.11
|
86
75
|
signing_key:
|
87
76
|
specification_version: 3
|
88
77
|
summary: Output filter plugin to calculate messages that matches specified conditions
|
89
78
|
test_files:
|
90
79
|
- test/helper.rb
|
91
80
|
- test/plugin/test_out_datacalculator.rb
|
92
|
-
- test/plugin/test_out_datacalculator_fomulas.rb
|
@@ -1,79 +0,0 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
require 'helper'
|
3
|
-
|
4
|
-
class DataCalculatorOutputTest < Test::Unit::TestCase
|
5
|
-
def setup
|
6
|
-
Fluent::Test.setup
|
7
|
-
end
|
8
|
-
|
9
|
-
CONFIG = %[
|
10
|
-
unit minute
|
11
|
-
aggregate tag
|
12
|
-
input_tag_remove_prefix test
|
13
|
-
formulas sum = amount * price, amounts = amount, record = 1
|
14
|
-
finalizer ave = amounts > 0 ? 1.0 * sum / amounts : 0
|
15
|
-
]
|
16
|
-
|
17
|
-
def create_driver(conf = CONFIG, tag='test.input')
|
18
|
-
Fluent::Test::OutputTestDriver.new(Fluent::DataCalculatorOutput, tag).configure(conf)
|
19
|
-
end
|
20
|
-
|
21
|
-
def test_create_formula
|
22
|
-
|
23
|
-
# case: common case
|
24
|
-
d = create_driver %[
|
25
|
-
aggregate all
|
26
|
-
formulas sum = amount * price, cnt = amount
|
27
|
-
]
|
28
|
-
assert_equal 0, d.instance._formulas[0][0]
|
29
|
-
assert_equal 'sum', d.instance._formulas[0][1]
|
30
|
-
assert_equal ['amount', 'price'], d.instance._formulas[0][2]
|
31
|
-
assert_equal 1, d.instance._formulas[1][0]
|
32
|
-
assert_equal 'cnt', d.instance._formulas[1][1]
|
33
|
-
assert_equal ['amount'], d.instance._formulas[1][2]
|
34
|
-
|
35
|
-
assert_equal 200, d.instance._formulas[0][3].call(10, 20)
|
36
|
-
assert_equal 20, d.instance._formulas[1][3].call(20)
|
37
|
-
assert_raise(ArgumentError){
|
38
|
-
d.instance._formulas[0][3].call(10)
|
39
|
-
}
|
40
|
-
|
41
|
-
# case: use Class
|
42
|
-
d = create_driver %[
|
43
|
-
aggregate all
|
44
|
-
formulas time = Fluent::Engine.now
|
45
|
-
]
|
46
|
-
assert_equal 0, d.instance._formulas[0][0]
|
47
|
-
assert_equal 'time', d.instance._formulas[0][1]
|
48
|
-
assert_equal [], d.instance._formulas[0][2]
|
49
|
-
assert_equal Time.now.to_i, d.instance._formulas[0][3].call()
|
50
|
-
|
51
|
-
# case: use instance.method
|
52
|
-
d = create_driver %[
|
53
|
-
aggregate all
|
54
|
-
formulas sum = amount.to_i * price, cnt = amount
|
55
|
-
]
|
56
|
-
assert_equal 0, d.instance._formulas[0][0]
|
57
|
-
assert_equal 'sum', d.instance._formulas[0][1]
|
58
|
-
assert_equal ['amount', 'price'], d.instance._formulas[0][2]
|
59
|
-
assert_equal 1, d.instance._formulas[1][0]
|
60
|
-
assert_equal 'cnt', d.instance._formulas[1][1]
|
61
|
-
assert_equal ['amount'], d.instance._formulas[1][2]
|
62
|
-
|
63
|
-
assert_equal 200, d.instance._formulas[0][3].call("10", 20)
|
64
|
-
assert_equal 20, d.instance._formulas[1][3].call(20)
|
65
|
-
assert_raise(ArgumentError){
|
66
|
-
d.instance._formulas[0][3].call(10)
|
67
|
-
}
|
68
|
-
|
69
|
-
# case: use string
|
70
|
-
d = create_driver %[
|
71
|
-
aggregate all
|
72
|
-
formulas cnt = 1
|
73
|
-
finalizer name = "muddy" + "dixon" + cnt.to_s
|
74
|
-
]
|
75
|
-
assert_equal 0, d.instance._finalizer[0]
|
76
|
-
assert_equal ['cnt'], d.instance._finalizer[2]
|
77
|
-
assert_equal "muddydixon20", d.instance._finalizer[3].call(20)
|
78
|
-
end
|
79
|
-
end
|