fluentd 0.12.1 → 0.12.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of fluentd might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/ChangeLog +15 -0
- data/lib/fluent/filter.rb +3 -1
- data/lib/fluent/plugin/filter_grep.rb +8 -8
- data/lib/fluent/plugin/in_monitor_agent.rb +10 -5
- data/lib/fluent/test/base.rb +6 -2
- data/lib/fluent/test/filter_test.rb +46 -5
- data/lib/fluent/version.rb +1 -1
- data/test/plugin/test_filter_grep.rb +7 -10
- data/test/plugin/test_filter_record_transformer.rb +11 -13
- data/test/test_filter.rb +79 -0
- data/test/test_input.rb +8 -7
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b7788505e84495465d06f359b75401362f04caaa
|
4
|
+
data.tar.gz: 47a5ed1ef3ee3b55cabbcfdf65877374e66642b7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7b174bf87334d6c06db915f3c244e39dbc637c7f21872fc227046f9b8c4e332809972e956013c0f0c4fea1ed187e89a45656723d698e733f8fcf78e85cf8f7d0
|
7
|
+
data.tar.gz: 602154651def0f60ddc693b6ba1b1bd5c7d7ce0f2efbc7b4413ba16905929239fb7928e41fd00f93838f4a3ee909f5978737dded60b2fcf6c8fd035221cc381d
|
data/ChangeLog
CHANGED
@@ -2,6 +2,21 @@
|
|
2
2
|
|
3
3
|
## Release 0.12.1 - 2014/12/14
|
4
4
|
|
5
|
+
### New Features
|
6
|
+
|
7
|
+
* filter: Change filter behaviour. If filter method returns nil, its record is removed from stream.
|
8
|
+
|
9
|
+
### Enhancement
|
10
|
+
|
11
|
+
* in_monitor_agent: Render filter plugins
|
12
|
+
* test: FilterTestDriver has run, emit and getting result methods
|
13
|
+
|
14
|
+
### Bug fixes
|
15
|
+
|
16
|
+
* test: Support @label by TestDriver
|
17
|
+
|
18
|
+
## Release 0.12.1 - 2014/12/14
|
19
|
+
|
5
20
|
### Bug fixes
|
6
21
|
|
7
22
|
* plugin: Fix router is nil inside out_copy, out_roundrobin, and BufferedOutput secondary
|
data/lib/fluent/filter.rb
CHANGED
@@ -44,13 +44,15 @@ module Fluent
|
|
44
44
|
end
|
45
45
|
|
46
46
|
def filter(tag, time, record)
|
47
|
+
raise NotImplementedError, "Implement this method in child class"
|
47
48
|
end
|
48
49
|
|
49
50
|
def filter_stream(tag, es)
|
50
51
|
new_es = MultiEventStream.new
|
51
52
|
es.each { |time, record|
|
52
53
|
begin
|
53
|
-
|
54
|
+
filtered_record = filter(tag, time, record)
|
55
|
+
new_es.add(time, filtered_record) if filtered_record
|
54
56
|
rescue => e
|
55
57
|
router.emit_error_event(tag, time, record, e)
|
56
58
|
end
|
@@ -49,9 +49,9 @@ module Fluent
|
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
52
|
-
def
|
53
|
-
|
54
|
-
|
52
|
+
def filter(tag, time, record)
|
53
|
+
result = nil
|
54
|
+
begin
|
55
55
|
catch(:break_loop) do
|
56
56
|
@regexps.each do |key, regexp|
|
57
57
|
throw :break_loop unless match(regexp, record[key].to_s)
|
@@ -59,13 +59,13 @@ module Fluent
|
|
59
59
|
@excludes.each do |key, exclude|
|
60
60
|
throw :break_loop if match(exclude, record[key].to_s)
|
61
61
|
end
|
62
|
-
|
62
|
+
result = record
|
63
63
|
end
|
64
|
+
rescue => e
|
65
|
+
log.warn "failed to grep events", :error_class => e.class, :error => e.message
|
66
|
+
log.warn_backtrace
|
64
67
|
end
|
65
|
-
|
66
|
-
rescue => e
|
67
|
-
log.warn "failed to grep events", :error_class => e.class, :error => e.message
|
68
|
-
log.warn_backtrace
|
68
|
+
result
|
69
69
|
end
|
70
70
|
|
71
71
|
private
|
@@ -228,7 +228,7 @@ module Fluent
|
|
228
228
|
end
|
229
229
|
|
230
230
|
MONITOR_INFO = {
|
231
|
-
'output_plugin' => 'is_a?(::Fluent::Output)',
|
231
|
+
'output_plugin' => 'is_a?(::Fluent::Output)', # deprecated. Use plugin_category instead
|
232
232
|
'buffer_queue_length' => '@buffer.queue_size',
|
233
233
|
'buffer_total_queued_size' => '@buffer.total_queued_chunk_size',
|
234
234
|
'retry_count' => '@num_errors',
|
@@ -244,11 +244,14 @@ module Fluent
|
|
244
244
|
Engine.root_agent.outputs.each { |o|
|
245
245
|
MonitorAgentInput.collect_children(o, array)
|
246
246
|
}
|
247
|
+
# get all filter plugins
|
248
|
+
Engine.root_agent.filters.each { |f|
|
249
|
+
MonitorAgentInput.collect_children(f, array)
|
250
|
+
}
|
247
251
|
Engine.root_agent.labels.each { |name, l|
|
248
|
-
# TODO: Add label name to outputs for identifing plugins
|
249
|
-
l.outputs.each { |o|
|
250
|
-
|
251
|
-
}
|
252
|
+
# TODO: Add label name to outputs / filters for identifing plugins
|
253
|
+
l.outputs.each { |o| MonitorAgentInput.collect_children(o, array) }
|
254
|
+
l.filters.each { |f| MonitorAgentInput.collect_children(f, array) }
|
252
255
|
}
|
253
256
|
|
254
257
|
array
|
@@ -348,6 +351,8 @@ module Fluent
|
|
348
351
|
'input'.freeze
|
349
352
|
when Fluent::Output
|
350
353
|
'output'.freeze
|
354
|
+
when Fluent::Filter
|
355
|
+
'filter'.freeze
|
351
356
|
else
|
352
357
|
'unknown'.freeze
|
353
358
|
end
|
data/lib/fluent/test/base.rb
CHANGED
@@ -59,15 +59,19 @@ module Fluent
|
|
59
59
|
else
|
60
60
|
@config = Config.parse(str, "(test)", "(test_dir)", use_v1)
|
61
61
|
end
|
62
|
+
if label_name = @config['@label']
|
63
|
+
Engine.root_agent.add_label(label_name)
|
64
|
+
end
|
62
65
|
@instance.configure(@config)
|
63
66
|
self
|
64
67
|
end
|
65
68
|
|
66
|
-
|
69
|
+
# num_waits is for checking thread status. This will be removed after improved plugin API
|
70
|
+
def run(num_waits = 10, &block)
|
67
71
|
@instance.start
|
68
72
|
begin
|
69
73
|
# wait until thread starts
|
70
|
-
|
74
|
+
num_waits.times { sleep 0.05 }
|
71
75
|
return yield
|
72
76
|
ensure
|
73
77
|
@instance.shutdown
|
@@ -17,16 +17,57 @@
|
|
17
17
|
module Fluent
|
18
18
|
module Test
|
19
19
|
class FilterTestDriver < TestDriver
|
20
|
-
def initialize(klass, &block)
|
20
|
+
def initialize(klass, tag = 'filter.test', &block)
|
21
21
|
super(klass, &block)
|
22
|
+
@tag = tag
|
23
|
+
@events = {}
|
24
|
+
@filtered = MultiEventStream.new
|
22
25
|
end
|
23
26
|
|
24
|
-
|
25
|
-
|
27
|
+
attr_reader :filtered
|
28
|
+
attr_accessor :tag
|
29
|
+
|
30
|
+
def emit(record, time = Engine.now)
|
31
|
+
emit_with_tag(@tag, record, time)
|
32
|
+
end
|
33
|
+
alias_method :filter, :emit
|
34
|
+
|
35
|
+
def emit_with_tag(tag, record, time = Engine.now)
|
36
|
+
@events[tag] ||= MultiEventStream.new
|
37
|
+
@events[tag].add(time, record)
|
38
|
+
end
|
39
|
+
alias_method :filter_with_tag, :emit_with_tag
|
40
|
+
|
41
|
+
def filter_stream(es)
|
42
|
+
filter_stream_with_tag(@tag, es)
|
26
43
|
end
|
27
44
|
|
28
|
-
def
|
29
|
-
@
|
45
|
+
def filter_stream_with_tag(tag, es)
|
46
|
+
@events[tag] = es
|
47
|
+
end
|
48
|
+
|
49
|
+
def filtered_as_array
|
50
|
+
all = []
|
51
|
+
@filtered.each { |time, record|
|
52
|
+
all << [@tag, time, record]
|
53
|
+
}
|
54
|
+
all
|
55
|
+
end
|
56
|
+
alias_method :emits, :filtered_as_array # emits is for consistent with other drivers
|
57
|
+
|
58
|
+
# Almost filters don't use threads so default is 0. It reduces test time.
|
59
|
+
def run(num_waits = 0, &block)
|
60
|
+
super(num_waits) {
|
61
|
+
block.call if block
|
62
|
+
|
63
|
+
@events.each { |tag, es|
|
64
|
+
processed = @instance.filter_stream(tag, es)
|
65
|
+
processed.each { |time, record|
|
66
|
+
@filtered.add(time, record)
|
67
|
+
}
|
68
|
+
}
|
69
|
+
}
|
70
|
+
self
|
30
71
|
end
|
31
72
|
end
|
32
73
|
end
|
data/lib/fluent/version.rb
CHANGED
@@ -42,13 +42,12 @@ class GrepFilterTest < Test::Unit::TestCase
|
|
42
42
|
end
|
43
43
|
|
44
44
|
def emit(config, msgs)
|
45
|
-
es = Fluent::MultiEventStream.new
|
46
|
-
msgs.each { |msg|
|
47
|
-
es.add(@time, {'foo' => 'bar', 'message' => msg})
|
48
|
-
}
|
49
|
-
|
50
45
|
d = create_driver(config)
|
51
|
-
d.
|
46
|
+
d.run {
|
47
|
+
msgs.each { |msg|
|
48
|
+
d.emit({'foo' => 'bar', 'message' => msg}, @time)
|
49
|
+
}
|
50
|
+
}.filtered
|
52
51
|
end
|
53
52
|
|
54
53
|
test 'empty config' do
|
@@ -93,11 +92,9 @@ class GrepFilterTest < Test::Unit::TestCase
|
|
93
92
|
|
94
93
|
sub_test_case 'grep non-string jsonable values' do
|
95
94
|
def emit(msg, config = 'regexp1 message 0')
|
96
|
-
es = Fluent::MultiEventStream.new
|
97
|
-
es.add(@time, {'foo' => 'bar', 'message' => msg})
|
98
|
-
|
99
95
|
d = create_driver(config)
|
100
|
-
d.
|
96
|
+
d.emit({'foo' => 'bar', 'message' => msg}, @time)
|
97
|
+
d.run.filtered
|
101
98
|
end
|
102
99
|
|
103
100
|
data(
|
@@ -19,7 +19,7 @@ class RecordTransformerFilterTest < Test::Unit::TestCase
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def create_driver(conf = '')
|
22
|
-
Test::FilterTestDriver.new(RecordTransformerFilter).configure(conf, true)
|
22
|
+
Test::FilterTestDriver.new(RecordTransformerFilter, @tag).configure(conf, true)
|
23
23
|
end
|
24
24
|
|
25
25
|
sub_test_case 'configure' do
|
@@ -38,13 +38,12 @@ class RecordTransformerFilterTest < Test::Unit::TestCase
|
|
38
38
|
|
39
39
|
sub_test_case "test options" do
|
40
40
|
def emit(config, msgs = [''])
|
41
|
-
es = Fluent::MultiEventStream.new
|
42
|
-
msgs.each do |msg|
|
43
|
-
es.add(@time, {'foo' => 'bar', 'message' => msg})
|
44
|
-
end
|
45
|
-
|
46
41
|
d = create_driver(config)
|
47
|
-
d.
|
42
|
+
d.run {
|
43
|
+
msgs.each { |msg|
|
44
|
+
d.emit({'foo' => 'bar', 'message' => msg}, @time)
|
45
|
+
}
|
46
|
+
}.filtered
|
48
47
|
end
|
49
48
|
|
50
49
|
CONFIG = %[
|
@@ -120,14 +119,13 @@ class RecordTransformerFilterTest < Test::Unit::TestCase
|
|
120
119
|
|
121
120
|
sub_test_case 'test placeholders' do
|
122
121
|
def emit(config, msgs = [''])
|
123
|
-
es = Fluent::MultiEventStream.new
|
124
|
-
msgs.each do |msg|
|
125
|
-
es.add(@time, {'eventType0' => 'bar', 'message' => msg})
|
126
|
-
end
|
127
|
-
|
128
122
|
d = create_driver(config)
|
129
123
|
yield d if block_given?
|
130
|
-
d.
|
124
|
+
d.run {
|
125
|
+
msgs.each do |msg|
|
126
|
+
d.emit({'eventType0' => 'bar', 'message' => msg}, @time)
|
127
|
+
end
|
128
|
+
}.filtered
|
131
129
|
end
|
132
130
|
|
133
131
|
%w[yes no].each do |enable_ruby|
|
data/test/test_filter.rb
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
require_relative 'helper'
|
2
|
+
require 'fluent/filter'
|
3
|
+
|
4
|
+
class FilterTest < Test::Unit::TestCase
|
5
|
+
include Fluent
|
6
|
+
|
7
|
+
setup do
|
8
|
+
Fluent::Test.setup
|
9
|
+
@time = Fluent::Engine.now
|
10
|
+
end
|
11
|
+
|
12
|
+
def create_driver(klass = Fluent::Filter, conf = '')
|
13
|
+
Test::FilterTestDriver.new(klass).configure(conf, true)
|
14
|
+
end
|
15
|
+
|
16
|
+
def emit(klass, msgs, conf = '')
|
17
|
+
d = create_driver(klass, conf)
|
18
|
+
d.run {
|
19
|
+
msgs.each {|msg|
|
20
|
+
d.emit({'message' => msg}, @time)
|
21
|
+
}
|
22
|
+
}.filtered
|
23
|
+
end
|
24
|
+
|
25
|
+
sub_test_case 'configure' do
|
26
|
+
test 'check default' do
|
27
|
+
assert_nothing_raised { create_driver }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
sub_test_case 'filter' do
|
32
|
+
test 'NotImplementedError' do
|
33
|
+
not_implemented_filter = Class.new(Fluent::Filter)
|
34
|
+
assert_raise(NotImplementedError) { emit(not_implemented_filter, ['foo']) }
|
35
|
+
end
|
36
|
+
|
37
|
+
test 'null filter' do
|
38
|
+
null_filter = Class.new(Fluent::Filter) do |c|
|
39
|
+
def filter(tag, time, record)
|
40
|
+
nil
|
41
|
+
end
|
42
|
+
end
|
43
|
+
es = emit(null_filter, ['foo'])
|
44
|
+
assert_equal(0, es.instance_variable_get(:@record_array).size)
|
45
|
+
end
|
46
|
+
|
47
|
+
test 'pass filter' do
|
48
|
+
pass_filter = Class.new(Fluent::Filter) do |c|
|
49
|
+
def filter(tag, time, record)
|
50
|
+
record
|
51
|
+
end
|
52
|
+
end
|
53
|
+
es = emit(pass_filter, ['foo'])
|
54
|
+
assert_equal(1, es.instance_variable_get(:@record_array).size)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
sub_test_case 'filter_stream' do
|
59
|
+
test 'null filter' do
|
60
|
+
null_filter = Class.new(Fluent::Filter) do |c|
|
61
|
+
def filter_stream(tag, es)
|
62
|
+
MultiEventStream.new
|
63
|
+
end
|
64
|
+
end
|
65
|
+
es = emit(null_filter, ['foo'])
|
66
|
+
assert_equal(0, es.instance_variable_get(:@record_array).size)
|
67
|
+
end
|
68
|
+
|
69
|
+
test 'pass filter' do
|
70
|
+
pass_filter = Class.new(Fluent::Filter) do |c|
|
71
|
+
def filter_stream(tag, es)
|
72
|
+
es
|
73
|
+
end
|
74
|
+
end
|
75
|
+
es = emit(pass_filter, ['foo'])
|
76
|
+
assert_equal(1, es.instance_variable_get(:@record_array).size)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
data/test/test_input.rb
CHANGED
@@ -12,19 +12,20 @@ class FluentInputTest < ::Test::Unit::TestCase
|
|
12
12
|
Fluent::Test::InputTestDriver.new(Fluent::Input).configure(conf, true)
|
13
13
|
end
|
14
14
|
|
15
|
-
def
|
15
|
+
def test_router
|
16
16
|
d = create_driver
|
17
17
|
assert_equal Engine.root_agent.event_router, d.instance.router
|
18
18
|
|
19
|
-
assert_raise(ArgumentError) {
|
20
|
-
create_driver('@label @unknown')
|
21
|
-
}
|
22
|
-
|
23
|
-
Engine.root_agent.add_label('@known')
|
24
19
|
d = nil
|
25
20
|
assert_nothing_raised {
|
26
21
|
d = create_driver('@label @known')
|
27
22
|
}
|
28
|
-
|
23
|
+
expected = Engine.root_agent.find_label('@known').event_router
|
24
|
+
assert_equal expected, d.instance.router
|
25
|
+
|
26
|
+
# TestDriver helps to create a label instance automatically, so directly test here
|
27
|
+
assert_raise(ArgumentError) {
|
28
|
+
Fluent::Input.new.configure(Config.parse('@label @unknown', '(test)', '(test_dir)', true))
|
29
|
+
}
|
29
30
|
end
|
30
31
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluentd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.12.
|
4
|
+
version: 0.12.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sadayuki Furuhashi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-12-
|
11
|
+
date: 2014-12-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: msgpack
|
@@ -426,6 +426,7 @@ files:
|
|
426
426
|
- test/test_config.rb
|
427
427
|
- test/test_configdsl.rb
|
428
428
|
- test/test_event_router.rb
|
429
|
+
- test/test_filter.rb
|
429
430
|
- test/test_formatter.rb
|
430
431
|
- test/test_input.rb
|
431
432
|
- test/test_match.rb
|
@@ -506,6 +507,7 @@ test_files:
|
|
506
507
|
- test/test_config.rb
|
507
508
|
- test/test_configdsl.rb
|
508
509
|
- test/test_event_router.rb
|
510
|
+
- test/test_filter.rb
|
509
511
|
- test/test_formatter.rb
|
510
512
|
- test/test_input.rb
|
511
513
|
- test/test_match.rb
|