From 3aacec5353abd568e9d95ffad7c20b19909bf0e9 Mon Sep 17 00:00:00 2001 From: Hiroshi Hatake Date: Mon, 25 Sep 2017 16:49:03 +0900 Subject: [PATCH 01/12] Migrate to use v0.14 API --- lib/fluent/plugin/filter_eval.rb | 22 ++--- lib/fluent/plugin/out_eval_filter.rb | 9 +- test/helper.rb | 2 + test/plugin/test_filter_eval.rb | 50 +++++----- test/plugin/test_out_eval_filter.rb | 135 +++++++++++---------------- 5 files changed, 99 insertions(+), 119 deletions(-) diff --git a/lib/fluent/plugin/filter_eval.rb b/lib/fluent/plugin/filter_eval.rb index 7cbfe0d..c03d755 100644 --- a/lib/fluent/plugin/filter_eval.rb +++ b/lib/fluent/plugin/filter_eval.rb @@ -1,4 +1,6 @@ -module Fluent +require 'fluent/plugin/filter' + +module Fluent::Plugin class EvalFilter < Filter Fluent::Plugin.register_filter('eval', self) @@ -43,17 +45,13 @@ def configure(conf) end end - def filter_stream(tag, es) - new_es = MultiEventStream.new - es.each { |time, record| - begin - filtered_record = filter_record(tag, time, record) - new_es.add(*filtered_record) if filtered_record - rescue => e - router.emit_error_event(tag, time, record, e) - end - } - new_es + def filter(tag, time, record) + begin + filtered_record = filter_record(tag, time, record) + return filtered_record if filtered_record + rescue => e + router.emit_error_event(tag, time, record, e) + end end private diff --git a/lib/fluent/plugin/out_eval_filter.rb b/lib/fluent/plugin/out_eval_filter.rb index ec90e5f..2c23fce 100644 --- a/lib/fluent/plugin/out_eval_filter.rb +++ b/lib/fluent/plugin/out_eval_filter.rb @@ -1,7 +1,11 @@ -class Fluent::EvalFilterOutput < Fluent::Output +require 'fluent/plugin/output' + +class Fluent::Plugin::EvalFilterOutput < Fluent::Plugin::Output Fluent::Plugin.register_output('eval_filter', self) + helpers :event_emitter + config_param :requires, :string, default: nil, :desc => "require libraries." # Define `router` method of v0.12 to support v0.10 or earlier @@ -53,7 +57,7 @@ def configure(conf) end end - def emit(tag, es, chain) + def process(tag, es) tag = handle_tag(tag) es.each do |time, record| results = filter_record(tag, time, record) @@ -63,7 +67,6 @@ def emit(tag, es, chain) end end end - chain.next end def handle_tag(tag) diff --git a/test/helper.rb b/test/helper.rb index 55cce87..a683ff9 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -8,6 +8,7 @@ exit e.status_code end require 'test/unit' +require 'fluent/test/helpers' $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib')) $LOAD_PATH.unshift(File.dirname(__FILE__)) @@ -26,4 +27,5 @@ def method_missing(method, *args) require 'fluent/plugin/filter_eval' class Test::Unit::TestCase + include Fluent::Test::Helpers end diff --git a/test/plugin/test_filter_eval.rb b/test/plugin/test_filter_eval.rb index 8110665..20e8ca4 100644 --- a/test/plugin/test_filter_eval.rb +++ b/test/plugin/test_filter_eval.rb @@ -1,4 +1,6 @@ +# coding: utf-8 require 'helper' +require 'fluent/test/driver/filter' class EvalFilterTest < Test::Unit::TestCase include Fluent @@ -9,24 +11,24 @@ class EvalFilterTest < Test::Unit::TestCase end def create_driver(conf = '') - Test::FilterTestDriver.new(EvalFilter).configure(conf) + Test::Driver::Filter.new(Plugin::EvalFilter).configure(conf) end def filter(config, msgs) d = create_driver(config) - d.run { + d.run(default_tag: 'test') { msgs.each {|msg| - d.filter(msg, @time) # Filterプラグインにメッセージを通す + d.feed(@time, msg) # Filterプラグインにメッセージを通す } } - filtered = d.filtered_as_array # 結果を受け取る. [tag, time, record]の配列 + filtered = d.filtered.map{|e| e.last} # 結果を受け取る. [record]の配列 filtered end sub_test_case 'configure' do test 'check default' do config = %[ - filter1 [time, record] if record['status'] == '404' + filter1 "[time, record] if record['status'] == '404'" ] assert_nothing_raised { create_driver(config) @@ -48,13 +50,13 @@ def filter(config, msgs) {'status' => '401', 'message' => 'message'} ] config = %[ - filter1 [time, record] if record['status'] == '404' - filter2 [time, record] if record['status'] == '503' + filter1 "[time, record] if record['status'] == '404'" + filter2 "[time, record] if record['status'] == '503'" ] es = filter(config, msgs) assert_equal(es.size, 2) - assert_equal(es[0][2]['status'], '404') - assert_equal(es[1][2]['status'], '503') + assert_equal(es[0][1]['status'], '404') + assert_equal(es[1][1]['status'], '503') end end @@ -68,15 +70,15 @@ def filter(config, msgs) {'status' => '401', 'message' => 'message'} ] config = %[ - filter1 record['status'] = record['status'].to_i; [time, record] + filter1 "record['status'] = record['status'].to_i; [time, record]" ] es = filter(config, msgs) assert_equal(es.size, 5) - assert_equal(es[0][2]['status'], 301) - assert_equal(es[1][2]['status'], 302) - assert_equal(es[2][2]['status'], 404) - assert_equal(es[3][2]['status'], 503) - assert_equal(es[4][2]['status'], 401) + assert_equal(es[0][1]['status'], 301) + assert_equal(es[1][1]['status'], 302) + assert_equal(es[2][1]['status'], 404) + assert_equal(es[3][1]['status'], 503) + assert_equal(es[4][1]['status'], 401) end end @@ -90,15 +92,15 @@ def filter(config, msgs) {'status' => '401', 'message' => 'user_id:5'} ] config = %[ - filter1 record['user_id'] = record['message'].split(':').last.to_i; [time, record] + filter1 "record['user_id'] = record['message'].split(':').last.to_i; [time, record]" ] es = filter(config, msgs) assert_equal(es.size, 5) - assert_equal(es[0][2]['user_id'], 1) - assert_equal(es[1][2]['user_id'], 2) - assert_equal(es[2][2]['user_id'], 3) - assert_equal(es[3][2]['user_id'], 4) - assert_equal(es[4][2]['user_id'], 5) + assert_equal(es[0][1]['user_id'], 1) + assert_equal(es[1][1]['user_id'], 2) + assert_equal(es[2][1]['user_id'], 3) + assert_equal(es[3][1]['user_id'], 4) + assert_equal(es[4][1]['user_id'], 5) end end @@ -106,7 +108,7 @@ def filter(config, msgs) test 'require yaml' do config = %[ requires yaml - filter1 record.to_yaml; [time, record] + filter1 "record.to_yaml; [time, record]" ] assert_nothing_raised { create_driver(config) @@ -118,11 +120,11 @@ def filter(config, msgs) test 'require error' do config = %[ requires hoge - filter1 record.to_yaml; [time, record] + filter1 "record.to_yaml; [time, record]" ] assert_raise(Fluent::ConfigError) do create_driver(config) end end end -end \ No newline at end of file +end diff --git a/test/plugin/test_out_eval_filter.rb b/test/plugin/test_out_eval_filter.rb index 9e6f751..151b585 100644 --- a/test/plugin/test_out_eval_filter.rb +++ b/test/plugin/test_out_eval_filter.rb @@ -1,4 +1,5 @@ require 'helper' +require 'fluent/test/driver/output' class EvalFilterOutputTest < Test::Unit::TestCase @@ -6,8 +7,8 @@ def setup Fluent::Test.setup end - def create_driver(conf, tag = 'test') - Fluent::Test::OutputTestDriver.new(Fluent::EvalFilterOutput, tag).configure(conf) + def create_driver(conf) + Fluent::Test::Driver::Output.new(Fluent::Plugin::EvalFilterOutput).configure(conf) end def test_configure @@ -17,7 +18,7 @@ def test_configure assert_raise(Fluent::ConfigError) do create_driver(%[config1 @test = "\#{self.to_s}"]) end - assert_raise(Fluent::ConfigError) do + assert_raise(NameError) do create_driver(%[filter1 "\#{tag}"]) end end @@ -26,13 +27,12 @@ def test_remove_tag_prefix d = create_driver(%[ remove_tag_prefix t1 filter1 tag - ], 't1.t2.t3') + ]) - d.run { d.emit({}) } + d.run(default_tag: 't1.t2.t3') { d.feed({}) } - emits = d.emits + emits = d.events assert_equal 1, emits.size - p emits[0] assert_equal 't2.t3', emits[0][0] end @@ -40,13 +40,12 @@ def test_remove_tag_suffix d = create_driver(%[ remove_tag_suffix t3 filter1 tag - ], 't1.t2.t3') + ]) - d.run { d.emit({}) } + d.run(default_tag: 't1.t2.t3') { d.feed({}) } - emits = d.emits + emits = d.events assert_equal 1, emits.size - p emits[0] assert_equal 't1.t2', emits[0][0] end @@ -54,13 +53,12 @@ def test_add_tag_prefix d = create_driver(%[ add_tag_prefix t0 filter1 tag - ], 't1.t2.t3') + ]) - d.run { d.emit({}) } + d.run(default_tag: 't1.t2.t3') { d.feed({}) } - emits = d.emits + emits = d.events assert_equal 1, emits.size - p emits[0] assert_equal 't0.t1.t2.t3', emits[0][0] end @@ -68,13 +66,12 @@ def test_add_tag_suffix d = create_driver(%[ add_tag_suffix t4 filter1 tag - ], 't1.t2.t3') + ]) - d.run { d.emit({}) } + d.run(default_tag: 't1.t2.t3') { d.feed({}) } - emits = d.emits + emits = d.events assert_equal 1, emits.size - p emits[0] assert_equal 't1.t2.t3.t4', emits[0][0] end @@ -85,13 +82,12 @@ def test_handle_tag_all add_tag_prefix t4 add_tag_suffix t5 filter1 tag - ], 't1.t2.t3') + ]) - d.run { d.emit({}) } + d.run(default_tag: 't1.t2.t3') { d.feed({}) } - emits = d.emits + emits = d.events assert_equal 1, emits.size - p emits[0] assert_equal 't4.t2.t5', emits[0][0] end @@ -100,23 +96,21 @@ def test_drop_all_filter filter1 nil ]) - d.run { d.emit({}) } + d.run(default_tag: 't1.t2.t3') { d.feed({}) } - emits = d.emits - p emits + emits = d.events assert_equal 0, emits.size end def test_modify_record_filter d = create_driver(%[ - filter1 record.merge!({'key' => 'value'}) + filter1 "record.merge!({'key' => 'value'})" ]) - d.run { d.emit({}) } + d.run(default_tag: 'test') { d.feed({}) } - emits = d.emits + emits = d.events assert_equal 1, emits.size - p emits[0] assert_equal 'test', emits[0][0] assert_equal 1, emits[0][2].size assert_equal true, emits[0][2].key?('key') @@ -126,14 +120,13 @@ def test_modify_record_filter def test_replace_all_filter d = create_driver(%[ filter1 nil - filter2 ['tag', 0, {'key' => 'value'}] + filter2 "['tag', 0, {'key' => 'value'}]" ]) - d.run { d.emit({}) } + d.run(default_tag: 'test') { d.feed({}) } - emits = d.emits + emits = d.events assert_equal 1, emits.size - p emits[0] assert_equal 'tag', emits[0][0] assert_equal 0, emits[0][1] assert_equal 1, emits[0][2].size @@ -143,24 +136,22 @@ def test_replace_all_filter def test_conditional_filter d = create_driver(%[ - filter1 [['http', tag].join('.'), record] if /^http:/.match(record['url']) - filter2 (record['secure'] = true; [['https', tag].join('.'), record]) if /^https:/.match(record['url']) + filter1 "[['http', tag].join('.'), record] if /^http:/.match(record['url'])" + filter2 "(record['secure'] = true; [['https', tag].join('.'), record]) if /^https:/.match(record['url'])" ]) - d.run do - d.emit({'url' => 'http://example.com/'}) - d.emit({'url' => 'https://example.com/'}) - d.emit({'url' => 'ftp://example.com/'}) + d.run(default_tag: 'test') do + d.feed({'url' => 'http://example.com/'}) + d.feed({'url' => 'https://example.com/'}) + d.feed({'url' => 'ftp://example.com/'}) end - emits = d.emits + emits = d.events assert_equal 2, emits.size - p emits[0] assert_equal 'http.test', emits[0][0] assert_equal 1, emits[0][2].size assert_equal true, emits[0][2].key?('url') assert_equal 'http://example.com/', emits[0][2]['url'] - p emits[1] assert_equal 'https.test', emits[1][0] assert_equal 2, emits[1][2].size assert_equal true, emits[1][2].key?('url') @@ -173,73 +164,63 @@ def test_reference_to_an_instance_variable_filter hostname = `hostname -s`.chomp d = create_driver(%[ config1 @hostname = `hostname -s`.chomp - filter1 [tag, @hostname].join('.') + filter1 "[tag, @hostname].join('.')" ]) - d.run { d.emit({}) } + d.run(default_tag: 'test') { d.feed({}) } - emits = d.emits + emits = d.events assert_equal 1, emits.size - p emits[0] assert_equal "test.#{hostname}", emits[0][0] end def test_amplify_tag_filter d = create_driver(%[ - filter1 (1..3).map { |n| tag + n.to_s }.to_enum + filter1 "(1..3).map { |n| tag + n.to_s }.to_enum" ]) - d.run { d.emit({}) } + d.run(default_tag: 'test') { d.feed({}) } - emits = d.emits + emits = d.events assert_equal 3, emits.size - p emits[0] assert_equal "test1", emits[0][0] - p emits[1] assert_equal "test2", emits[1][0] - p emits[2] assert_equal "test3", emits[2][0] end def test_amplify_time_filter d = create_driver(%[ - filter1 (1..3).map { |n| time + n }.to_enum + filter1 "(1..3).map { |n| time + n }.to_enum" ]) - d.run { d.emit({}) } + d.run(default_tag: 'test') { d.feed({}) } - emits = d.emits + emits = d.events assert_equal 3, emits.size - p emits[0] assert emits[0][1] > 0 - p emits[1] assert_equal emits[0][1] + 1, emits[1][1] - p emits[2] assert_equal emits[1][1] + 1, emits[2][1] end def test_amplify_record_filter d = create_driver(%[ - filter1 (1..3).map { |n| record.merge({'n' => n}) }.to_enum + filter1 "(1..3).map { |n| record.merge({'n' => n}) }.to_enum" ]) - d.run { d.emit({'key' => 'value'}) } + d.run(default_tag: 'test') { d.feed({'key' => 'value'}) } - emits = d.emits + emits = d.events assert_equal 3, emits.size - p emits[0] assert_equal 2, emits[0][2].size assert_equal true, emits[0][2].key?('key') assert_equal 'value', emits[0][2]['key'] assert_equal true, emits[0][2].key?('n') assert_equal 1, emits[0][2]['n'] - p emits[1] assert_equal 2, emits[1][2].size assert_equal true, emits[1][2].key?('key') assert_equal 'value', emits[1][2]['key'] assert_equal true, emits[1][2].key?('n') assert_equal 2, emits[1][2]['n'] - p emits[2] assert_equal 2, emits[2][2].size assert_equal true, emits[2][2].key?('key') assert_equal 'value', emits[2][2]['key'] @@ -249,24 +230,21 @@ def test_amplify_record_filter def test_split_record_filter d = create_driver(%[ - filter1 record.map { |key, value| [[tag, key].join('.'), {'key' => value}] }.to_enum + filter1 "record.map { |key, value| [[tag, key].join('.'), {'key' => value}] }.to_enum" ]) - d.run { d.emit({'key1' => 'value1', 'key2' => 'value2', 'key3' => 'value3'}) } + d.run(default_tag: 'test') { d.feed({'key1' => 'value1', 'key2' => 'value2', 'key3' => 'value3'}) } - emits = d.emits + emits = d.events assert_equal 3, emits.size - p emits[0] assert_equal 'test.key1', emits[0][0] assert_equal 1, emits[0][2].size assert_equal true, emits[0][2].key?('key') assert_equal 'value1', emits[0][2]['key'] - p emits[1] assert_equal 'test.key2', emits[1][0] assert_equal 1, emits[1][2].size assert_equal true, emits[1][2].key?('key') assert_equal 'value2', emits[1][2]['key'] - p emits[2] assert_equal 'test.key3', emits[2][0] assert_equal 1, emits[2][2].size assert_equal true, emits[2][2].key?('key') @@ -275,22 +253,19 @@ def test_split_record_filter def test_split_array_in_record_filter d = create_driver(%[ - filter1 record['array'].map { |v| {'value' => v} }.to_enum + filter1 "record['array'].map { |v| {'value' => v} }.to_enum" ]) - d.run { d.emit({'array' => ['test1', 'test2', 'test3']}) } + d.run(default_tag: 'test') { d.feed({'array' => ['test1', 'test2', 'test3']}) } - emits = d.emits + emits = d.events assert_equal 3, emits.size - p emits[0] assert_equal 1, emits[0][2].size assert_equal true, emits[0][2].key?('value') assert_equal 'test1', emits[0][2]['value'] - p emits[1] assert_equal 1, emits[1][2].size assert_equal true, emits[1][2].key?('value') assert_equal 'test2', emits[1][2]['value'] - p emits[2] assert_equal 1, emits[2][2].size assert_equal true, emits[2][2].key?('value') assert_equal 'test3', emits[2][2]['value'] @@ -299,10 +274,10 @@ def test_split_array_in_record_filter def test_require_libraries d = create_driver(%[ requires yaml - filter1 record.to_yaml; ['tag', 0, record] + filter1 "record.to_yaml; ['tag', 0, record]" ]) assert_nothing_raised { - d.run { d.emit({'key' => 'value'}) } + d.run(default_tag: 'test') { d.feed({'key' => 'value'}) } } end @@ -310,7 +285,7 @@ def test_require_error assert_raise(Fluent::ConfigError) do d = create_driver(%[ requires hoge - filter1 record.to_yaml; ['tag', 0, record] + filter1 "record.to_yaml; ['tag', 0, record]" ]) end end From d04012940a973154e82edcfef83d5e4297f19006 Mon Sep 17 00:00:00 2001 From: Hiroshi Hatake Date: Mon, 25 Sep 2017 16:51:04 +0900 Subject: [PATCH 02/12] Remove legacy code --- lib/fluent/plugin/out_eval_filter.rb | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lib/fluent/plugin/out_eval_filter.rb b/lib/fluent/plugin/out_eval_filter.rb index 2c23fce..a2f3388 100644 --- a/lib/fluent/plugin/out_eval_filter.rb +++ b/lib/fluent/plugin/out_eval_filter.rb @@ -8,11 +8,6 @@ class Fluent::Plugin::EvalFilterOutput < Fluent::Plugin::Output config_param :requires, :string, default: nil, :desc => "require libraries." - # Define `router` method of v0.12 to support v0.10 or earlier - unless method_defined?(:router) - define_method("router") { Fluent::Engine } - end - def configure(conf) super From 69635d64dec8efc26ceb4f49d42ae88d63af675b Mon Sep 17 00:00:00 2001 From: Hiroshi Hatake Date: Mon, 25 Sep 2017 16:52:16 +0900 Subject: [PATCH 03/12] Depends on FLuentd v0.14 or later --- fluent-plugin-eval-filter.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fluent-plugin-eval-filter.gemspec b/fluent-plugin-eval-filter.gemspec index 89ab3ef..8bf7f48 100644 --- a/fluent-plugin-eval-filter.gemspec +++ b/fluent-plugin-eval-filter.gemspec @@ -17,7 +17,7 @@ Gem::Specification.new do |spec| spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) spec.require_paths = ["lib"] - spec.add_dependency "fluentd", "~> 0" + spec.add_dependency "fluentd", [">= 0.14.0", "< 2"] spec.add_development_dependency "rake", "~> 0" spec.add_development_dependency "test-unit", "~> 3.1.0" end From 212492738ba30510fb5be6379c1d95a34fa44982 Mon Sep 17 00:00:00 2001 From: Hiroshi Hatake Date: Mon, 25 Sep 2017 16:56:07 +0900 Subject: [PATCH 04/12] Use v1 syntax in document --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5490e2f..9e2b053 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Or install it yourself as: config1 @hostname = `hostname -s`.chomp - filter1 [[tag, @hostname].join('.'), time, record] if record['method'] == 'GET' + filter1 "[[tag, @hostname].join('.'), time, record] if record['method'] == 'GET'" ``` @@ -38,7 +38,7 @@ Or install it yourself as: config1 @hostname = YAML.load({'hostname' => 'web01'})['hostname'] - filter1 [[tag, @hostname].join('.'), time, record] if record['method'] == 'GET' + filter1 "[[tag, @hostname].join('.'), time, record] if record['method'] == 'GET'" ``` From 0a0cf451b142da2f1f5b61376f2ed3be745b8acb Mon Sep 17 00:00:00 2001 From: Hiroshi Hatake Date: Mon, 25 Sep 2017 16:56:42 +0900 Subject: [PATCH 05/12] Update supported Ruby versions --- .travis.yml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 31bb44c..56c24b8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,8 @@ language: ruby rvm: - - 2.3.0 - - 2.2.0 - - 2.1.0 - - 2.0.0 - - 1.9.3 + - 2.4.2 + - 2.3.5 + - 2.2 + - 2.1 before_install: - gem update --remote bundler From 0308ae3369a801223050556d0f8792df01d46025 Mon Sep 17 00:00:00 2001 From: Hiroshi Hatake Date: Mon, 25 Sep 2017 17:00:20 +0900 Subject: [PATCH 06/12] Use event_time test helpers --- test/plugin/test_filter_eval.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/plugin/test_filter_eval.rb b/test/plugin/test_filter_eval.rb index 20e8ca4..8f45fa2 100644 --- a/test/plugin/test_filter_eval.rb +++ b/test/plugin/test_filter_eval.rb @@ -7,7 +7,7 @@ class EvalFilterTest < Test::Unit::TestCase setup do Fluent::Test.setup - @time = Fluent::Engine.now + @time = event_time end def create_driver(conf = '') From 7d3ded1d200c2bfdfe29c64d05795bd143d9aab3 Mon Sep 17 00:00:00 2001 From: Hiroshi Hatake Date: Tue, 3 Oct 2017 13:11:56 +0900 Subject: [PATCH 07/12] Replace body with `#filter_record` method --- lib/fluent/plugin/filter_eval.rb | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/lib/fluent/plugin/filter_eval.rb b/lib/fluent/plugin/filter_eval.rb index c03d755..734eab3 100644 --- a/lib/fluent/plugin/filter_eval.rb +++ b/lib/fluent/plugin/filter_eval.rb @@ -47,20 +47,14 @@ def configure(conf) def filter(tag, time, record) begin - filtered_record = filter_record(tag, time, record) - return filtered_record if filtered_record + @filters.each do |filter| + filter_results = filter.call(tag, time, record) + return filter_results if filter_results + end + nil rescue => e router.emit_error_event(tag, time, record, e) end end - - private - def filter_record(tag, time, record) - @filters.each do |filter| - filter_results = filter.call(tag, time, record) - return filter_results if filter_results - end - nil - end end end From a541ea8388a77575e339275f6427b559ccf0aea5 Mon Sep 17 00:00:00 2001 From: Hiroshi Hatake Date: Tue, 3 Oct 2017 14:13:54 +0900 Subject: [PATCH 08/12] filter_eval: Use `` config section to specify filter rules --- lib/fluent/plugin/filter_eval.rb | 16 ++++++++++------ test/plugin/test_filter_eval.rb | 28 +++++++++++++++++++++------- 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/lib/fluent/plugin/filter_eval.rb b/lib/fluent/plugin/filter_eval.rb index 734eab3..baf8cf1 100644 --- a/lib/fluent/plugin/filter_eval.rb +++ b/lib/fluent/plugin/filter_eval.rb @@ -5,6 +5,10 @@ class EvalFilter < Filter Fluent::Plugin.register_filter('eval', self) config_param :requires, :string, default: nil, :desc => "require libraries." + config_section :filter, param_name: :filter_config, multi: true do + config_param :filter, :string + config_param :config, :string, default: "" + end def initialize super @@ -23,20 +27,20 @@ def configure(conf) end end - conf.keys.select { |key| key =~ /^config\d+$/ }.sort_by { |key| key.sub('config', '').to_i }.each do |key| + @filter_config.each do |conf| begin - instance_eval("#{conf[key]}") + instance_eval("#{conf.config}") rescue Exception => e - raise Fluent::ConfigError, "#{key} #{conf[key]}\n" + e.to_s + raise Fluent::ConfigError, "#{key} #{conf.config}\n" + e.to_s end end @filters = [] - conf.keys.select { |key| key =~ /^filter\d+$/ }.sort_by { |key| key.sub('filter', '').to_i }.each do |key| + @filter_config.each do |conf| begin - @filters << instance_eval("lambda do |tag, time, record| #{conf[key]} end") + @filters << instance_eval("lambda do |tag, time, record| #{conf.filter} end") rescue Exception => e - raise Fluent::ConfigError, "#{key} #{conf[key]}\n" + e.to_s + raise Fluent::ConfigError, "#{key} #{conf.filter}\n" + e.to_s end end diff --git a/test/plugin/test_filter_eval.rb b/test/plugin/test_filter_eval.rb index 8f45fa2..7b3ae6a 100644 --- a/test/plugin/test_filter_eval.rb +++ b/test/plugin/test_filter_eval.rb @@ -28,7 +28,9 @@ def filter(config, msgs) sub_test_case 'configure' do test 'check default' do config = %[ - filter1 "[time, record] if record['status'] == '404'" + + filter "[time, record] if record['status'] == '404'" + ] assert_nothing_raised { create_driver(config) @@ -50,8 +52,12 @@ def filter(config, msgs) {'status' => '401', 'message' => 'message'} ] config = %[ - filter1 "[time, record] if record['status'] == '404'" - filter2 "[time, record] if record['status'] == '503'" + + filter "[time, record] if record['status'] == '404'" + + + filter "[time, record] if record['status'] == '503'" + ] es = filter(config, msgs) assert_equal(es.size, 2) @@ -70,7 +76,9 @@ def filter(config, msgs) {'status' => '401', 'message' => 'message'} ] config = %[ - filter1 "record['status'] = record['status'].to_i; [time, record]" + + filter "record['status'] = record['status'].to_i; [time, record]" + ] es = filter(config, msgs) assert_equal(es.size, 5) @@ -92,7 +100,9 @@ def filter(config, msgs) {'status' => '401', 'message' => 'user_id:5'} ] config = %[ - filter1 "record['user_id'] = record['message'].split(':').last.to_i; [time, record]" + + filter "record['user_id'] = record['message'].split(':').last.to_i; [time, record]" + ] es = filter(config, msgs) assert_equal(es.size, 5) @@ -108,7 +118,9 @@ def filter(config, msgs) test 'require yaml' do config = %[ requires yaml - filter1 "record.to_yaml; [time, record]" + + filter "record.to_yaml; [time, record]" + ] assert_nothing_raised { create_driver(config) @@ -120,7 +132,9 @@ def filter(config, msgs) test 'require error' do config = %[ requires hoge - filter1 "record.to_yaml; [time, record]" + + filter "record.to_yaml; [time, record]" + ] assert_raise(Fluent::ConfigError) do create_driver(config) From ffcff75dafa6cdda08e339c10a8c8cca979e6628 Mon Sep 17 00:00:00 2001 From: Hiroshi Hatake Date: Tue, 3 Oct 2017 14:22:16 +0900 Subject: [PATCH 09/12] out_eval_filter: Use `` config section to specify filter rules --- lib/fluent/plugin/out_eval_filter.rb | 16 +++-- test/plugin/test_out_eval_filter.rb | 90 +++++++++++++++++++++------- 2 files changed, 78 insertions(+), 28 deletions(-) diff --git a/lib/fluent/plugin/out_eval_filter.rb b/lib/fluent/plugin/out_eval_filter.rb index a2f3388..22362a4 100644 --- a/lib/fluent/plugin/out_eval_filter.rb +++ b/lib/fluent/plugin/out_eval_filter.rb @@ -7,6 +7,10 @@ class Fluent::Plugin::EvalFilterOutput < Fluent::Plugin::Output helpers :event_emitter config_param :requires, :string, default: nil, :desc => "require libraries." + config_section :filter, param_name: :filter_config, multi: true do + config_param :filter, :string + config_param :config, :string, default: "" + end def configure(conf) super @@ -30,20 +34,20 @@ def configure(conf) @add_tag_prefix = conf['add_tag_prefix'] @add_tag_suffix = conf['add_tag_suffix'] - conf.keys.select { |key| key =~ /^config\d+$/ }.sort_by { |key| key.sub('config', '').to_i }.each do |key| + @filter_config.each do |conf| begin - instance_eval("#{conf[key]}") + instance_eval("#{conf.config}") rescue Exception => e - raise Fluent::ConfigError, "#{key} #{conf[key]}\n" + e.to_s + raise Fluent::ConfigError, "#{key} #{conf.config}\n" + e.to_s end end @filters = [] - conf.keys.select { |key| key =~ /^filter\d+$/ }.sort_by { |key| key.sub('filter', '').to_i }.each do |key| + @filter_config.each do |conf| begin - @filters << instance_eval("lambda do |tag, time, record| #{conf[key]} end") + @filters << instance_eval("lambda do |tag, time, record| #{conf.filter} end") rescue Exception => e - raise Fluent::ConfigError, "#{key} #{conf[key]}\n" + e.to_s + raise Fluent::ConfigError, "#{key} #{conf.filter}\n" + e.to_s end end diff --git a/test/plugin/test_out_eval_filter.rb b/test/plugin/test_out_eval_filter.rb index 151b585..4fd445b 100644 --- a/test/plugin/test_out_eval_filter.rb +++ b/test/plugin/test_out_eval_filter.rb @@ -16,17 +16,27 @@ def test_configure create_driver('') end assert_raise(Fluent::ConfigError) do - create_driver(%[config1 @test = "\#{self.to_s}"]) + create_driver(%[ + + config @test = "\#{self.to_s}" + + ]) end assert_raise(NameError) do - create_driver(%[filter1 "\#{tag}"]) + create_driver(%[ + + filter "\#{tag}" + + ]) end end def test_remove_tag_prefix d = create_driver(%[ remove_tag_prefix t1 - filter1 tag + + filter tag + ]) d.run(default_tag: 't1.t2.t3') { d.feed({}) } @@ -39,7 +49,9 @@ def test_remove_tag_prefix def test_remove_tag_suffix d = create_driver(%[ remove_tag_suffix t3 - filter1 tag + + filter tag + ]) d.run(default_tag: 't1.t2.t3') { d.feed({}) } @@ -52,7 +64,9 @@ def test_remove_tag_suffix def test_add_tag_prefix d = create_driver(%[ add_tag_prefix t0 - filter1 tag + + filter tag + ]) d.run(default_tag: 't1.t2.t3') { d.feed({}) } @@ -65,7 +79,9 @@ def test_add_tag_prefix def test_add_tag_suffix d = create_driver(%[ add_tag_suffix t4 - filter1 tag + + filter tag + ]) d.run(default_tag: 't1.t2.t3') { d.feed({}) } @@ -81,7 +97,9 @@ def test_handle_tag_all remove_tag_suffix t3 add_tag_prefix t4 add_tag_suffix t5 - filter1 tag + + filter tag + ]) d.run(default_tag: 't1.t2.t3') { d.feed({}) } @@ -93,7 +111,9 @@ def test_handle_tag_all def test_drop_all_filter d = create_driver(%[ - filter1 nil + + filter nil + ]) d.run(default_tag: 't1.t2.t3') { d.feed({}) } @@ -104,7 +124,9 @@ def test_drop_all_filter def test_modify_record_filter d = create_driver(%[ - filter1 "record.merge!({'key' => 'value'})" + + filter "record.merge!({'key' => 'value'})" + ]) d.run(default_tag: 'test') { d.feed({}) } @@ -119,8 +141,12 @@ def test_modify_record_filter def test_replace_all_filter d = create_driver(%[ - filter1 nil - filter2 "['tag', 0, {'key' => 'value'}]" + + filter nil + + + filter "['tag', 0, {'key' => 'value'}]" + ]) d.run(default_tag: 'test') { d.feed({}) } @@ -136,8 +162,12 @@ def test_replace_all_filter def test_conditional_filter d = create_driver(%[ - filter1 "[['http', tag].join('.'), record] if /^http:/.match(record['url'])" - filter2 "(record['secure'] = true; [['https', tag].join('.'), record]) if /^https:/.match(record['url'])" + + filter "[['http', tag].join('.'), record] if /^http:/.match(record['url'])" + + + filter "(record['secure'] = true; [['https', tag].join('.'), record]) if /^https:/.match(record['url'])" + ]) d.run(default_tag: 'test') do @@ -163,8 +193,10 @@ def test_conditional_filter def test_reference_to_an_instance_variable_filter hostname = `hostname -s`.chomp d = create_driver(%[ - config1 @hostname = `hostname -s`.chomp - filter1 "[tag, @hostname].join('.')" + + config @hostname = `hostname -s`.chomp + filter "[tag, @hostname].join('.')" + ]) d.run(default_tag: 'test') { d.feed({}) } @@ -176,7 +208,9 @@ def test_reference_to_an_instance_variable_filter def test_amplify_tag_filter d = create_driver(%[ - filter1 "(1..3).map { |n| tag + n.to_s }.to_enum" + + filter "(1..3).map { |n| tag + n.to_s }.to_enum" + ]) d.run(default_tag: 'test') { d.feed({}) } @@ -190,7 +224,9 @@ def test_amplify_tag_filter def test_amplify_time_filter d = create_driver(%[ - filter1 "(1..3).map { |n| time + n }.to_enum" + + filter "(1..3).map { |n| time + n }.to_enum" + ]) d.run(default_tag: 'test') { d.feed({}) } @@ -204,7 +240,9 @@ def test_amplify_time_filter def test_amplify_record_filter d = create_driver(%[ - filter1 "(1..3).map { |n| record.merge({'n' => n}) }.to_enum" + + filter "(1..3).map { |n| record.merge({'n' => n}) }.to_enum" + ]) d.run(default_tag: 'test') { d.feed({'key' => 'value'}) } @@ -230,7 +268,9 @@ def test_amplify_record_filter def test_split_record_filter d = create_driver(%[ - filter1 "record.map { |key, value| [[tag, key].join('.'), {'key' => value}] }.to_enum" + + filter "record.map { |key, value| [[tag, key].join('.'), {'key' => value}] }.to_enum" + ]) d.run(default_tag: 'test') { d.feed({'key1' => 'value1', 'key2' => 'value2', 'key3' => 'value3'}) } @@ -253,7 +293,9 @@ def test_split_record_filter def test_split_array_in_record_filter d = create_driver(%[ - filter1 "record['array'].map { |v| {'value' => v} }.to_enum" + + filter "record['array'].map { |v| {'value' => v} }.to_enum" + ]) d.run(default_tag: 'test') { d.feed({'array' => ['test1', 'test2', 'test3']}) } @@ -274,7 +316,9 @@ def test_split_array_in_record_filter def test_require_libraries d = create_driver(%[ requires yaml - filter1 "record.to_yaml; ['tag', 0, record]" + + filter "record.to_yaml; ['tag', 0, record]" + ]) assert_nothing_raised { d.run(default_tag: 'test') { d.feed({'key' => 'value'}) } @@ -285,7 +329,9 @@ def test_require_error assert_raise(Fluent::ConfigError) do d = create_driver(%[ requires hoge - filter1 "record.to_yaml; ['tag', 0, record]" + + filter "record.to_yaml; ['tag', 0, record]" + ]) end end From dff864096194383be9c24bb102bfa9e45cbdc597 Mon Sep 17 00:00:00 2001 From: Hiroshi Hatake Date: Tue, 3 Oct 2017 14:28:03 +0900 Subject: [PATCH 10/12] Modernize documentation --- README.md | 45 ++++++++++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 9e2b053..f375f2f 100644 --- a/README.md +++ b/README.md @@ -18,27 +18,31 @@ Or install it yourself as: ``` - type eval_filter + @type eval_filter remove_tag_prefix raw add_tag_prefix filtered - config1 @hostname = `hostname -s`.chomp + + config @hostname = `hostname -s`.chomp - filter1 "[[tag, @hostname].join('.'), time, record] if record['method'] == 'GET'" + filter "[[tag, @hostname].join('.'), time, record] if record['method'] == 'GET'" + ``` ### require libraries ``` - type eval_filter + @type eval_filter remove_tag_prefix raw add_tag_prefix filtered requires yaml # comma separated values - config1 @hostname = YAML.load({'hostname' => 'web01'})['hostname'] + + config @hostname = YAML.load({'hostname' => 'web01'})['hostname'] - filter1 "[[tag, @hostname].join('.'), time, record] if record['method'] == 'GET'" + filter "[[tag, @hostname].join('.'), time, record] if record['method'] == 'GET'" + ``` @@ -53,24 +57,32 @@ Should return [time, record]. ### filter: - type eval - filter1 "[time, record] if record['status'] == '404'" - filter2 "[time, record] if record['status'] == 'POST'" + @type eval + + filter "[time, record] if record['status'] == '404'" + + + filter "[time, record] if record['status'] == 'POST'" + ### typecast(string to integer): - type eval - filter1 "record['status'] = record['status'].to_i; [time, record]" + @type eval + + filter "record['status'] = record['status'].to_i; [time, record]" + ### modify record(add value): - type eval - filter1 "record['user_id'] = record['message'].split(':').last.to_i; [time, record]" + @type eval + + filter "record['user_id'] = record['message'].split(':').last.to_i; [time, record]" + #### input @@ -94,13 +106,16 @@ Should return [time, record]. Can not be used expression substitution. ``` - filter1 "#{tag}" + @type eval_filter + + filter "#{tag}" + ``` '#' Is interpreted as the beginning of a comment. ``` - filter1 #=> "\"" + filter #=> "\"" ``` ## Contributing From a85a329fab82440764fa612774d374d529734609 Mon Sep 17 00:00:00 2001 From: Hiroshi Hatake Date: Tue, 3 Oct 2017 14:35:17 +0900 Subject: [PATCH 11/12] Use array type instead of string with `#split` Because string with `#split` makes the following a pitfall: ```aconf requires yaml, time filter "record.to_yaml; [Time.now.to_i, record]" ``` is not valid config. `requires yaml, time` will be interpreted as `['yaml', ' time']` and execute: ```ruby require 'yaml' require ' time' ``` This is because why string type with `#split` makes a some pitfall. --- lib/fluent/plugin/filter_eval.rb | 4 ++-- lib/fluent/plugin/out_eval_filter.rb | 4 ++-- test/plugin/test_filter_eval.rb | 12 ++++++++++++ test/plugin/test_out_eval_filter.rb | 12 ++++++++++++ 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/lib/fluent/plugin/filter_eval.rb b/lib/fluent/plugin/filter_eval.rb index baf8cf1..c3297c9 100644 --- a/lib/fluent/plugin/filter_eval.rb +++ b/lib/fluent/plugin/filter_eval.rb @@ -4,7 +4,7 @@ module Fluent::Plugin class EvalFilter < Filter Fluent::Plugin.register_filter('eval', self) - config_param :requires, :string, default: nil, :desc => "require libraries." + config_param :requires, :array, default: [], :desc => "require libraries." config_section :filter, param_name: :filter_config, multi: true do config_param :filter, :string config_param :config, :string, default: "" @@ -18,7 +18,7 @@ def configure(conf) super if @requires - @requires.split(',').each do |lib| + @requires.each do |lib| begin require lib rescue Exception => e diff --git a/lib/fluent/plugin/out_eval_filter.rb b/lib/fluent/plugin/out_eval_filter.rb index 22362a4..bf5ba94 100644 --- a/lib/fluent/plugin/out_eval_filter.rb +++ b/lib/fluent/plugin/out_eval_filter.rb @@ -6,7 +6,7 @@ class Fluent::Plugin::EvalFilterOutput < Fluent::Plugin::Output helpers :event_emitter - config_param :requires, :string, default: nil, :desc => "require libraries." + config_param :requires, :array, default: [], :desc => "require libraries." config_section :filter, param_name: :filter_config, multi: true do config_param :filter, :string config_param :config, :string, default: "" @@ -16,7 +16,7 @@ def configure(conf) super if @requires - @requires.split(',').each do |lib| + @requires.each do |lib| begin require lib rescue Exception => e diff --git a/test/plugin/test_filter_eval.rb b/test/plugin/test_filter_eval.rb index 7b3ae6a..79023fc 100644 --- a/test/plugin/test_filter_eval.rb +++ b/test/plugin/test_filter_eval.rb @@ -129,6 +129,18 @@ def filter(config, msgs) } end + test 'require libraries with whitespace' do + d = create_driver(%[ + requires yaml, time + + filter "record.to_yaml; [Time.now.to_i, record]" + + ]) + assert_nothing_raised { + d.run(default_tag: 'test') { d.feed({'key' => 'value'}) } + } + end + test 'require error' do config = %[ requires hoge diff --git a/test/plugin/test_out_eval_filter.rb b/test/plugin/test_out_eval_filter.rb index 4fd445b..ea04b77 100644 --- a/test/plugin/test_out_eval_filter.rb +++ b/test/plugin/test_out_eval_filter.rb @@ -325,6 +325,18 @@ def test_require_libraries } end + def test_require_libraries_with_whitespace + d = create_driver(%[ + requires yaml, time + + filter "record.to_yaml; ['tag', Time.now.to_i, record]" + + ]) + assert_nothing_raised { + d.run(default_tag: 'test') { d.feed({'key' => 'value'}) } + } + end + def test_require_error assert_raise(Fluent::ConfigError) do d = create_driver(%[ From 9eb4ffdeb21fabbfaf282419343e2d0e9bcca9ab Mon Sep 17 00:00:00 2001 From: Hiroshi Hatake Date: Wed, 4 Oct 2017 11:29:52 +0900 Subject: [PATCH 12/12] Decomposite filter config section into rule and eval --- README.md | 36 +++++------ lib/fluent/plugin/filter_eval.rb | 8 ++- lib/fluent/plugin/out_eval_filter.rb | 9 +-- test/plugin/test_filter_eval.rb | 32 +++++----- test/plugin/test_out_eval_filter.rb | 90 ++++++++++++++-------------- 5 files changed, 91 insertions(+), 84 deletions(-) diff --git a/README.md b/README.md index f375f2f..9ab52e8 100644 --- a/README.md +++ b/README.md @@ -22,11 +22,12 @@ Or install it yourself as: remove_tag_prefix raw add_tag_prefix filtered - + config @hostname = `hostname -s`.chomp - + + filter "[[tag, @hostname].join('.'), time, record] if record['method'] == 'GET'" - + ``` @@ -38,11 +39,12 @@ Or install it yourself as: add_tag_prefix filtered requires yaml # comma separated values - + config @hostname = YAML.load({'hostname' => 'web01'})['hostname'] - + + filter "[[tag, @hostname].join('.'), time, record] if record['method'] == 'GET'" - + ``` @@ -58,12 +60,12 @@ Should return [time, record]. @type eval - + filter "[time, record] if record['status'] == '404'" - - + + filter "[time, record] if record['status'] == 'POST'" - + @@ -71,18 +73,18 @@ Should return [time, record]. @type eval - + filter "record['status'] = record['status'].to_i; [time, record]" - + ### modify record(add value): @type eval - + filter "record['user_id'] = record['message'].split(':').last.to_i; [time, record]" - + #### input @@ -106,10 +108,10 @@ Should return [time, record]. Can not be used expression substitution. ``` - @type eval_filter - + @type eval_rule + filter "#{tag}" - + ``` diff --git a/lib/fluent/plugin/filter_eval.rb b/lib/fluent/plugin/filter_eval.rb index c3297c9..9b03be8 100644 --- a/lib/fluent/plugin/filter_eval.rb +++ b/lib/fluent/plugin/filter_eval.rb @@ -5,9 +5,11 @@ class EvalFilter < Filter Fluent::Plugin.register_filter('eval', self) config_param :requires, :array, default: [], :desc => "require libraries." - config_section :filter, param_name: :filter_config, multi: true do + config_section :rule, param_name: :filter_config, multi: true do config_param :filter, :string - config_param :config, :string, default: "" + end + config_section :eval, param_name: :eval_config, multi: true do + config_param :config, :string end def initialize @@ -27,7 +29,7 @@ def configure(conf) end end - @filter_config.each do |conf| + @eval_config.each do |conf| begin instance_eval("#{conf.config}") rescue Exception => e diff --git a/lib/fluent/plugin/out_eval_filter.rb b/lib/fluent/plugin/out_eval_filter.rb index bf5ba94..5483b1f 100644 --- a/lib/fluent/plugin/out_eval_filter.rb +++ b/lib/fluent/plugin/out_eval_filter.rb @@ -7,11 +7,12 @@ class Fluent::Plugin::EvalFilterOutput < Fluent::Plugin::Output helpers :event_emitter config_param :requires, :array, default: [], :desc => "require libraries." - config_section :filter, param_name: :filter_config, multi: true do + config_section :rule, param_name: :filter_config, multi: true do config_param :filter, :string - config_param :config, :string, default: "" end - + config_section :eval, param_name: :eval_config, multi: true do + config_param :config, :string + end def configure(conf) super @@ -34,7 +35,7 @@ def configure(conf) @add_tag_prefix = conf['add_tag_prefix'] @add_tag_suffix = conf['add_tag_suffix'] - @filter_config.each do |conf| + @eval_config.each do |conf| begin instance_eval("#{conf.config}") rescue Exception => e diff --git a/test/plugin/test_filter_eval.rb b/test/plugin/test_filter_eval.rb index 79023fc..4a9446a 100644 --- a/test/plugin/test_filter_eval.rb +++ b/test/plugin/test_filter_eval.rb @@ -28,9 +28,9 @@ def filter(config, msgs) sub_test_case 'configure' do test 'check default' do config = %[ - + filter "[time, record] if record['status'] == '404'" - + ] assert_nothing_raised { create_driver(config) @@ -52,12 +52,12 @@ def filter(config, msgs) {'status' => '401', 'message' => 'message'} ] config = %[ - + filter "[time, record] if record['status'] == '404'" - - + + filter "[time, record] if record['status'] == '503'" - + ] es = filter(config, msgs) assert_equal(es.size, 2) @@ -76,9 +76,9 @@ def filter(config, msgs) {'status' => '401', 'message' => 'message'} ] config = %[ - + filter "record['status'] = record['status'].to_i; [time, record]" - + ] es = filter(config, msgs) assert_equal(es.size, 5) @@ -100,9 +100,9 @@ def filter(config, msgs) {'status' => '401', 'message' => 'user_id:5'} ] config = %[ - + filter "record['user_id'] = record['message'].split(':').last.to_i; [time, record]" - + ] es = filter(config, msgs) assert_equal(es.size, 5) @@ -118,9 +118,9 @@ def filter(config, msgs) test 'require yaml' do config = %[ requires yaml - + filter "record.to_yaml; [time, record]" - + ] assert_nothing_raised { create_driver(config) @@ -132,9 +132,9 @@ def filter(config, msgs) test 'require libraries with whitespace' do d = create_driver(%[ requires yaml, time - + filter "record.to_yaml; [Time.now.to_i, record]" - + ]) assert_nothing_raised { d.run(default_tag: 'test') { d.feed({'key' => 'value'}) } @@ -144,9 +144,9 @@ def filter(config, msgs) test 'require error' do config = %[ requires hoge - + filter "record.to_yaml; [time, record]" - + ] assert_raise(Fluent::ConfigError) do create_driver(config) diff --git a/test/plugin/test_out_eval_filter.rb b/test/plugin/test_out_eval_filter.rb index ea04b77..6422f72 100644 --- a/test/plugin/test_out_eval_filter.rb +++ b/test/plugin/test_out_eval_filter.rb @@ -17,16 +17,16 @@ def test_configure end assert_raise(Fluent::ConfigError) do create_driver(%[ - + config @test = "\#{self.to_s}" - + ]) end assert_raise(NameError) do create_driver(%[ - + filter "\#{tag}" - + ]) end end @@ -34,9 +34,9 @@ def test_configure def test_remove_tag_prefix d = create_driver(%[ remove_tag_prefix t1 - + filter tag - + ]) d.run(default_tag: 't1.t2.t3') { d.feed({}) } @@ -49,9 +49,9 @@ def test_remove_tag_prefix def test_remove_tag_suffix d = create_driver(%[ remove_tag_suffix t3 - + filter tag - + ]) d.run(default_tag: 't1.t2.t3') { d.feed({}) } @@ -64,9 +64,9 @@ def test_remove_tag_suffix def test_add_tag_prefix d = create_driver(%[ add_tag_prefix t0 - + filter tag - + ]) d.run(default_tag: 't1.t2.t3') { d.feed({}) } @@ -79,9 +79,9 @@ def test_add_tag_prefix def test_add_tag_suffix d = create_driver(%[ add_tag_suffix t4 - + filter tag - + ]) d.run(default_tag: 't1.t2.t3') { d.feed({}) } @@ -97,9 +97,9 @@ def test_handle_tag_all remove_tag_suffix t3 add_tag_prefix t4 add_tag_suffix t5 - + filter tag - + ]) d.run(default_tag: 't1.t2.t3') { d.feed({}) } @@ -111,9 +111,9 @@ def test_handle_tag_all def test_drop_all_filter d = create_driver(%[ - + filter nil - + ]) d.run(default_tag: 't1.t2.t3') { d.feed({}) } @@ -124,9 +124,9 @@ def test_drop_all_filter def test_modify_record_filter d = create_driver(%[ - + filter "record.merge!({'key' => 'value'})" - + ]) d.run(default_tag: 'test') { d.feed({}) } @@ -141,12 +141,12 @@ def test_modify_record_filter def test_replace_all_filter d = create_driver(%[ - + filter nil - - + + filter "['tag', 0, {'key' => 'value'}]" - + ]) d.run(default_tag: 'test') { d.feed({}) } @@ -162,12 +162,12 @@ def test_replace_all_filter def test_conditional_filter d = create_driver(%[ - + filter "[['http', tag].join('.'), record] if /^http:/.match(record['url'])" - - + + filter "(record['secure'] = true; [['https', tag].join('.'), record]) if /^https:/.match(record['url'])" - + ]) d.run(default_tag: 'test') do @@ -193,10 +193,12 @@ def test_conditional_filter def test_reference_to_an_instance_variable_filter hostname = `hostname -s`.chomp d = create_driver(%[ - + config @hostname = `hostname -s`.chomp + + filter "[tag, @hostname].join('.')" - + ]) d.run(default_tag: 'test') { d.feed({}) } @@ -208,9 +210,9 @@ def test_reference_to_an_instance_variable_filter def test_amplify_tag_filter d = create_driver(%[ - + filter "(1..3).map { |n| tag + n.to_s }.to_enum" - + ]) d.run(default_tag: 'test') { d.feed({}) } @@ -224,9 +226,9 @@ def test_amplify_tag_filter def test_amplify_time_filter d = create_driver(%[ - + filter "(1..3).map { |n| time + n }.to_enum" - + ]) d.run(default_tag: 'test') { d.feed({}) } @@ -240,9 +242,9 @@ def test_amplify_time_filter def test_amplify_record_filter d = create_driver(%[ - + filter "(1..3).map { |n| record.merge({'n' => n}) }.to_enum" - + ]) d.run(default_tag: 'test') { d.feed({'key' => 'value'}) } @@ -268,9 +270,9 @@ def test_amplify_record_filter def test_split_record_filter d = create_driver(%[ - + filter "record.map { |key, value| [[tag, key].join('.'), {'key' => value}] }.to_enum" - + ]) d.run(default_tag: 'test') { d.feed({'key1' => 'value1', 'key2' => 'value2', 'key3' => 'value3'}) } @@ -293,9 +295,9 @@ def test_split_record_filter def test_split_array_in_record_filter d = create_driver(%[ - + filter "record['array'].map { |v| {'value' => v} }.to_enum" - + ]) d.run(default_tag: 'test') { d.feed({'array' => ['test1', 'test2', 'test3']}) } @@ -316,9 +318,9 @@ def test_split_array_in_record_filter def test_require_libraries d = create_driver(%[ requires yaml - + filter "record.to_yaml; ['tag', 0, record]" - + ]) assert_nothing_raised { d.run(default_tag: 'test') { d.feed({'key' => 'value'}) } @@ -328,9 +330,9 @@ def test_require_libraries def test_require_libraries_with_whitespace d = create_driver(%[ requires yaml, time - + filter "record.to_yaml; ['tag', Time.now.to_i, record]" - + ]) assert_nothing_raised { d.run(default_tag: 'test') { d.feed({'key' => 'value'}) } @@ -341,9 +343,9 @@ def test_require_error assert_raise(Fluent::ConfigError) do d = create_driver(%[ requires hoge - + filter "record.to_yaml; ['tag', 0, record]" - + ]) end end