fluent-plugin-select 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -16,8 +16,9 @@ This sample config outputs access logs that have status code 200.
16
16
  </source>
17
17
  <match tag>
18
18
  type select
19
- select_if record["code"] == "200"
19
+ select record["code"] == "200"
20
20
  add_prefix filtered
21
+ timeout 1s
21
22
  </match>
22
23
  <match filtered.tag>
23
24
  type file
@@ -26,3 +27,20 @@ This sample config outputs access logs that have status code 200.
26
27
 
27
28
 
28
29
  The parameter "select" can use 3 variables in event log; tag, time, record. The format of time is an integer number of seconds since the Epoch. The format of record is hash.
30
+
31
+
32
+ tag is alternative for add\_prefix. The 2 following match directives are same:
33
+
34
+ <match tag>
35
+ type select
36
+ select record["code"] == "200"
37
+ add_prefix filtered
38
+ timeout 1s
39
+ </match>
40
+ <match tag>
41
+ type select
42
+ select record["code"] == "200"
43
+ tag filtered.tag
44
+ timeout 1s
45
+ </match>
46
+
@@ -3,14 +3,14 @@ $:.push File.expand_path("../lib", __FILE__)
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "fluent-plugin-select"
6
- s.version = "0.0.2"
6
+ s.version = "0.0.3"
7
7
  s.authors = ["Kohei Tomita"]
8
8
  s.email = ["tommy.fmale@gmail.com"]
9
9
  s.homepage = "https://github.com/tomity/fluent-plugin-select"
10
10
  s.summary = %q{fluent-plugin-select is the non-buffered plugin that can be filtered by ruby script. }
11
11
  s.description = %q{fluent-plugin-select is the non-buffered plugin that can be filtered by ruby script. }
12
12
 
13
- s.rubyforge_project = "fluent-plugin-select-if"
13
+ s.rubyforge_project = "fluent-plugin-select"
14
14
 
15
15
  s.files = `git ls-files`.split("\n")
16
16
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
@@ -4,30 +4,60 @@ module Fluent
4
4
  Fluent::Plugin.register_output('select', self)
5
5
 
6
6
  config_param :select, :string
7
- config_param :add_prefix, :string
8
- config_param :timeout, :integer, :default => 1
7
+ config_param :add_prefix, :string, :default => nil
8
+ config_param :tag, :string, :default => nil
9
+ config_param :timeout, :time, :default => 1
10
+
11
+ def configure(conf)
12
+ super
13
+ if @add_prefix
14
+ @mode = "add_prefix"
15
+ elsif @tag
16
+ @mode = "tag"
17
+ else
18
+ raise ConfigError, "Either add_prefix or tag is required "
19
+ end
20
+ end
9
21
 
10
22
  def emit(tag, es, chain)
11
23
  begin
12
- time_records = []
13
- es.each {|time, record|
14
- if eval(@select)
15
- $log.trace {"hoge"}
16
- time_records << [time, record]
17
- else
18
- $log.trace {"filtered: #{Time.at(time)} #{tag} #{record.inspect}"}
19
- end
20
- }
21
- time_records.each do |time, record|
22
- Fluent::Engine::emit(@add_prefix + "." + tag, time, record)
24
+ output_es = do_select(tag, es)
25
+ if @mode == "add_prefix"
26
+ Fluent::Engine::emit_stream(@add_prefix + "." + tag, output_es)
27
+ else
28
+ Fluent::Engine::emit_stream(@tag, output_es)
23
29
  end
24
30
  chain.next
25
- time_records #for test
31
+ output_es #for test
26
32
  rescue SyntaxError => e
27
33
  chain.next
28
34
  $log.error "Select command is syntax error: #{@select}"
29
35
  e #for test
30
36
  end
31
37
  end
38
+
39
+ def do_select(tag, es)
40
+ output_es = MultiEventStream.new
41
+ es.each {|time, record|
42
+ timeout_block{
43
+ if eval(@select)
44
+ output_es.add(time, record)
45
+ else
46
+ $log.trace {"filtered: #{Time.at(time)} #{tag} #{record.inspect}"}
47
+ end
48
+ }
49
+ }
50
+ output_es
51
+ end
52
+
53
+ def timeout_block
54
+ begin
55
+ Timeout.timeout(@timeout){
56
+ yield
57
+ }
58
+ rescue Timeout::Error
59
+ $log.error {"Timeout: #{Time.at(time)} #{tag} #{record.inspect}"}
60
+ end
61
+ end
32
62
  end
33
63
  end
@@ -66,8 +66,8 @@ class SelectOutputTest < Test::Unit::TestCase
66
66
  d1.run do
67
67
  d1.emit(record, time)
68
68
  end
69
- emits = d1.emits
70
- assert_equal 0, emits.length
69
+ es = d1.emits
70
+ assert_equal 0, es.length
71
71
  end
72
72
 
73
73
  def test_syntax_error
@@ -86,4 +86,49 @@ class SelectOutputTest < Test::Unit::TestCase
86
86
  e = d1.instance.emit(tag, es, chain)
87
87
  assert e.kind_of?(SyntaxError)
88
88
  end
89
+
90
+ def test_match_tag_using_tag_param
91
+ tag = 'tag' #match
92
+ time = Time.local(2012, 10, 10, 10, 10, 10) #not match
93
+ record = {'code' => '300'} #not match
94
+
95
+ d1 = create_driver %[
96
+ select tag == "tag" or record["code"] == "200" or Time.at(time).sec == 0
97
+ tag prefix.tag
98
+ ], tag
99
+ d1.run do
100
+ d1.emit(record, time)
101
+ end
102
+ emits = d1.emits
103
+ assert_equal 1, emits.length
104
+ assert_equal ["prefix.#{tag}", time.to_i, record], emits[0]
105
+ end
106
+
107
+ def test_config_error
108
+ tag = 'tag' #match
109
+ time = Time.local(2012, 10, 10, 10, 10, 10) #not match
110
+ record = {'code' => '300'} #not match
111
+
112
+ assert_raise(Fluent::ConfigError){
113
+ create_driver %[
114
+ select tag == "tag" or record["code"] == "200" or Time.at(time).sec == 0
115
+ ], tag
116
+ }
117
+ end
118
+
119
+ def test_timeout
120
+ tag = 'tag' #match
121
+ time = Time.local(2012, 10, 10, 10, 10, 10) #not match
122
+ record = {'code' => '300'} #not match
123
+
124
+ d1 = create_driver %[
125
+ select sleep 10
126
+ add_prefix prefix
127
+ ], tag
128
+ d1.run do
129
+ d1.emit(record, time)
130
+ end
131
+ emits = d1.emits
132
+ assert_equal 0, emits.length
133
+ end
89
134
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-select
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-08-11 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
16
- requirement: &70228126073860 !ruby/object:Gem::Requirement
16
+ requirement: &70178059895040 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.9.2.2
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70228126073860
24
+ version_requirements: *70178059895040
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: fluentd
27
- requirement: &70228126071880 !ruby/object:Gem::Requirement
27
+ requirement: &70178059894500 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,7 +32,7 @@ dependencies:
32
32
  version: 0.10.24
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70228126071880
35
+ version_requirements: *70178059894500
36
36
  description: ! 'fluent-plugin-select is the non-buffered plugin that can be filtered
37
37
  by ruby script. '
38
38
  email:
@@ -68,7 +68,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
68
68
  - !ruby/object:Gem::Version
69
69
  version: '0'
70
70
  requirements: []
71
- rubyforge_project: fluent-plugin-select-if
71
+ rubyforge_project: fluent-plugin-select
72
72
  rubygems_version: 1.8.17
73
73
  signing_key:
74
74
  specification_version: 3