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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ec182ccd57b8d91c6b246b25783b1b34487ad43f
4
- data.tar.gz: 3194c1994b373e087aabb571b2b5038f446740d7
3
+ metadata.gz: b7788505e84495465d06f359b75401362f04caaa
4
+ data.tar.gz: 47a5ed1ef3ee3b55cabbcfdf65877374e66642b7
5
5
  SHA512:
6
- metadata.gz: 8edee638e09a09b8246bb36e85f9111490f39826af203fe9669a49c0ec6493ff6b4b4fb3cbbbb6b4b4430a3483439af04663e6eb4e2be9897ece3f2479ed10e7
7
- data.tar.gz: 25d045c021631970ddb83499601c3b569efab22b8abc4b893a3f62e06712d3921b7a808a1fb740abd087516d6c0d3c8eb106ccf1b7364a057b4954ae34eaec85
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
@@ -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
- new_es.add(time, filter(tag, time, record))
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 filter_stream(tag, es)
53
- result_es = MultiEventStream.new
54
- es.each do |time, record|
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
- result_es.add(time, record)
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
- result_es
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
- MonitorAgentInput.collect_children(o, array)
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
@@ -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
- def run(&block)
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
- 10.times { sleep 0.05 }
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
- def filter(tag, time, record)
25
- @instance.filter(tag, time, record)
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 filter_stream(tag, es)
29
- @instance.filter_stream(tag, es)
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
@@ -16,6 +16,6 @@
16
16
 
17
17
  module Fluent
18
18
 
19
- VERSION = '0.12.1'
19
+ VERSION = '0.12.2'
20
20
 
21
21
  end
@@ -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.filter_stream('filter.test', es);
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.filter_stream('filter.test', es);
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.filter_stream(@tag, es)
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.filter_stream(@tag, es)
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|
@@ -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
@@ -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 test_configure
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
- assert d.instance.router
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.1
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-14 00:00:00.000000000 Z
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