fluent-plugin-route 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 28b027ad4681954b9a1dcf70606fb8ef5d1d7fbf
4
- data.tar.gz: c188b4c04cc03713a510a43ade56f28b883dc1d7
3
+ metadata.gz: 2be56e0033b180819f2229b3c61e6124d4422cbf
4
+ data.tar.gz: 27bdc280417b08b926ca3c5bb5939d2f8e0aca95
5
5
  SHA512:
6
- metadata.gz: 6d6fecf7cadba4e6bbafd40d4f3efd56b7042325fbee3bbb937356aa063162209138fa5527c531e363225fddf3af0a566dfff1963add108ee5055f87596b918f
7
- data.tar.gz: 3e59efff70c9bbdbd8ebc5c4f3ceaec77fc7e1ceb9ff4903d67e5ce856e0ba2d3a832ba4c0f7b4f52734da17254b0aa422e7612add54ca9bae177bfc6308cf1f
6
+ metadata.gz: 64b121f1fe16c1b2d23be44bc5dcc6acc17b9db331c50e272f0886e9153311fe56a936f832c5988d567b05753ab33d953a1fd74d5895f20e6231be497574a770
7
+ data.tar.gz: aca7e79d483a1d2799649410724beee7616d56fb090c9a7502d3985bfb66d2fa51da8b6aee9d688b807e17008b86b22ef727f6962e30f94d279ddd69650cead6
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1
4
+ - 2.2
5
+ - 2.3.1
data/README.md CHANGED
@@ -4,14 +4,14 @@
4
4
 
5
5
  ## Configuration
6
6
 
7
- Configuration example:
7
+ ### Example 1: Use only tag
8
8
 
9
9
  <match worker.**>
10
- type route
10
+ @type route
11
11
  remove_tag_prefix worker
12
12
  <route **>
13
13
  add_tag_prefix metrics.event
14
- copy
14
+ copy # For fall-through. Without copy, routing is stopped here.
15
15
  </route>
16
16
  <route **>
17
17
  add_tag_prefix backup
@@ -20,14 +20,40 @@ Configuration example:
20
20
  </match>
21
21
 
22
22
  <match metrics.event.**>
23
- type stdout
23
+ @type stdout
24
24
  </match>
25
25
 
26
26
  <match backup.**>
27
- type file
27
+ @type file
28
28
  path /var/log/fluent/bakcup
29
29
  </match>
30
30
 
31
+ ### Example 2: Use label
32
+
33
+ <match worker.**>
34
+ @type route
35
+ remove_tag_prefix worker
36
+ add_tag_prefix metrics.event
37
+ <route **>
38
+ copy
39
+ </route>
40
+ <route **>
41
+ copy
42
+ @label @BACKUP
43
+ </route>
44
+ </match>
45
+
46
+ <match metrics.event.**>
47
+ @type stdout
48
+ </match>
49
+
50
+ <label @BACKUP>
51
+ <match metrics.event.**>
52
+ @type file
53
+ path /var/log/fluent/bakcup
54
+ </match>
55
+ </label>
56
+
31
57
  ## TODO
32
58
 
33
59
  * tests
data/Rakefile CHANGED
@@ -1,2 +1,11 @@
1
1
  #!/usr/bin/env rake
2
2
  require "bundler/gem_tasks"
3
+
4
+ require 'rake/testtask'
5
+ Rake::TestTask.new(:test) do |test|
6
+ test.libs << 'lib' << 'test'
7
+ test.pattern = 'test/**/test_*.rb'
8
+ test.verbose = true
9
+ end
10
+
11
+ task :default => :test
@@ -1,7 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  Gem::Specification.new do |gem|
3
3
  gem.name = "fluent-plugin-route"
4
- gem.version = "0.1.3"
4
+ gem.version = "0.1.4"
5
5
  gem.authors = ["TAGOMORI Satoshi", "FURUHASHI Sadayuki"]
6
6
  gem.email = ["tagomoris@gmail.com", "frsyuki@gmail.com"]
7
7
  gem.summary = %q{Fluentd plugin to route messages in fluentd processes}
@@ -15,5 +15,6 @@ Gem::Specification.new do |gem|
15
15
  gem.require_paths = ["lib"]
16
16
 
17
17
  gem.add_runtime_dependency "fluentd"
18
- gem.add_runtime_dependency "fluent-mixin-config-placeholders", ">= 0.3.0"
18
+ gem.add_development_dependency "rake"
19
+ gem.add_development_dependency "test-unit"
19
20
  end
@@ -15,42 +15,99 @@
15
15
  # See the License for the specific language governing permissions and
16
16
  # limitations under the License.
17
17
  #
18
- require 'fluent/mixin/config_placeholders'
18
+ require 'fluent/output'
19
19
 
20
20
  module Fluent
21
+ class RouteOutput < MultiOutput
22
+ Plugin.register_output('route', self)
21
23
 
24
+ class Route
25
+ include Configurable
22
26
 
23
- class RouteOutput < MultiOutput
24
- Plugin.register_output('route', self)
27
+ config_param :remove_tag_prefix, :string, :default => nil
28
+ config_param :add_tag_prefix, :string, :default => nil
29
+ # TODO tag_transform regexp
30
+ attr_accessor :copy
25
31
 
26
- include Fluent::Mixin::ConfigPlaceholders
32
+ def initialize(pattern, router)
33
+ super()
34
+ if !pattern || pattern.empty?
35
+ pattern = '**'
36
+ end
37
+ @router = router
38
+ @pattern = MatchPattern.create(pattern)
39
+ @tag_cache = {}
40
+ end
41
+
42
+ def match?(tag)
43
+ @pattern.match(tag)
44
+ end
45
+
46
+ def configure(conf)
47
+ super
48
+ if conf['copy']
49
+ @copy = true
50
+ else
51
+ @copy = false
52
+ end
53
+ if label_name = conf['@label']
54
+ label = Fluent::Engine.root_agent.find_label(label_name)
55
+ @router = label.event_router
56
+ end
57
+ if @remove_tag_prefix
58
+ @prefix_match = /^#{Regexp.escape(@remove_tag_prefix)}\.?/
59
+ else
60
+ @prefix_match = //
61
+ end
62
+ if @add_tag_prefix
63
+ @tag_prefix = "#{@add_tag_prefix}."
64
+ else
65
+ @tag_prefix = ""
66
+ end
67
+ end
68
+
69
+ def copy?
70
+ @copy
71
+ end
72
+
73
+ def emit(tag, es)
74
+ ntag = @tag_cache[tag]
75
+ unless ntag
76
+ ntag = tag.sub(@prefix_match, @tag_prefix)
77
+ if @tag_cache.size < 1024 # TODO size limit
78
+ @tag_cache[tag] = ntag
79
+ end
80
+ end
81
+ @router.emit_stream(ntag, es)
82
+ end
83
+ end
27
84
 
28
- class Route
29
- include Configurable
85
+ def initialize
86
+ super
87
+ @routes = []
88
+ @tag_cache = {}
89
+ @match_cache = {}
90
+ end
30
91
 
31
92
  config_param :remove_tag_prefix, :string, :default => nil
32
93
  config_param :add_tag_prefix, :string, :default => nil
33
94
  # TODO tag_transform regexp
34
- attr_accessor :copy
35
95
 
36
- def initialize(pattern)
37
- super()
38
- if !pattern || pattern.empty?
39
- pattern = '**'
40
- end
41
- @pattern = MatchPattern.create(pattern)
42
- @tag_cache = {}
96
+ attr_reader :routes
97
+
98
+ # Define `log` method for v0.10.42 or earlier
99
+ unless method_defined?(:log)
100
+ define_method("log") { $log }
43
101
  end
44
102
 
45
- def match?(tag)
46
- @pattern.match(tag)
103
+ # Define `router` method of v0.12 to support v0.10 or earlier
104
+ unless method_defined?(:router)
105
+ define_method("router") { ::Fluent::Engine }
47
106
  end
48
107
 
49
108
  def configure(conf)
50
109
  super
51
- if conf['copy']
52
- @copy = true
53
- end
110
+
54
111
  if @remove_tag_prefix
55
112
  @prefix_match = /^#{Regexp.escape(@remove_tag_prefix)}\.?/
56
113
  else
@@ -61,103 +118,51 @@ class RouteOutput < MultiOutput
61
118
  else
62
119
  @tag_prefix = ""
63
120
  end
64
- end
65
121
 
66
- def copy?
67
- @copy
122
+ conf.elements.select {|e|
123
+ e.name == 'route'
124
+ }.each {|e|
125
+ route = Route.new(e.arg, router)
126
+ route.configure(e)
127
+ @routes << route
128
+ }
68
129
  end
69
130
 
70
- def emit(tag, es)
71
- ntag = @tag_cache[tag]
72
- unless ntag
131
+ def emit(tag, es, chain)
132
+ ntag, targets = @match_cache[tag]
133
+ unless targets
73
134
  ntag = tag.sub(@prefix_match, @tag_prefix)
74
- if @tag_cache.size < 1024 # TODO size limit
75
- @tag_cache[tag] = ntag
135
+ targets = []
136
+ @routes.each {|r|
137
+ if r.match?(ntag)
138
+ targets << r
139
+ break unless r.copy?
140
+ end
141
+ }
142
+ if @match_cache.size < 1024 # TODO size limit
143
+ @match_cache[tag] = [ntag, targets]
76
144
  end
77
145
  end
78
- Engine.emit_stream(ntag, es)
79
- end
80
- end
81
-
82
- def initialize
83
- super
84
- @routes = []
85
- @tag_cache = {}
86
- @match_cache = {}
87
- end
88
-
89
- config_param :remove_tag_prefix, :string, :default => nil
90
- config_param :add_tag_prefix, :string, :default => nil
91
- # TODO tag_transform regexp
92
-
93
- attr_reader :routes
94
-
95
- # Define `log` method for v0.10.42 or earlier
96
- unless method_defined?(:log)
97
- define_method("log") { $log }
98
- end
99
-
100
- def configure(conf)
101
- super
102
-
103
- if @remove_tag_prefix
104
- @prefix_match = /^#{Regexp.escape(@remove_tag_prefix)}\.?/
105
- else
106
- @prefix_match = //
107
- end
108
- if @add_tag_prefix
109
- @tag_prefix = "#{@add_tag_prefix}."
110
- else
111
- @tag_prefix = ""
112
- end
113
146
 
114
- conf.elements.select {|e|
115
- e.name == 'route'
116
- }.each {|e|
117
- route = Route.new(e.arg)
118
- route.configure(e)
119
- @routes << route
120
- }
121
- end
122
-
123
- def emit(tag, es, chain)
124
- ntag, targets = @match_cache[tag]
125
- unless targets
126
- ntag = tag.sub(@prefix_match, @tag_prefix)
127
- targets = []
128
- @routes.each {|r|
129
- if r.match?(ntag)
130
- targets << r
131
- break unless r.copy?
147
+ case targets.size
148
+ when 0
149
+ return
150
+ when 1
151
+ targets.first.emit(ntag, es)
152
+ chain.next
153
+ else
154
+ unless es.repeatable?
155
+ m = MultiEventStream.new
156
+ es.each {|time,record|
157
+ m.add(time, record)
158
+ }
159
+ es = m
132
160
  end
133
- }
134
- if @match_cache.size < 1024 # TODO size limit
135
- @match_cache[tag] = [ntag, targets]
136
- end
137
- end
138
-
139
- case targets.size
140
- when 0
141
- return
142
- when 1
143
- targets.first.emit(ntag, es)
144
- chain.next
145
- else
146
- unless es.repeatable?
147
- m = MultiEventStream.new
148
- es.each {|time,record|
149
- m.add(time, record)
161
+ targets.each {|t|
162
+ t.emit(ntag, es)
150
163
  }
151
- es = m
164
+ chain.next
152
165
  end
153
- targets.each {|t|
154
- t.emit(ntag, es)
155
- }
156
- chain.next
157
166
  end
158
167
  end
159
168
  end
160
-
161
-
162
- end
163
-
@@ -0,0 +1,91 @@
1
+ require 'fluent/test'
2
+ require 'fluent/plugin/out_route'
3
+
4
+ class RouteOutputTest < Test::Unit::TestCase
5
+ def setup
6
+ Fluent::Test.setup
7
+ end
8
+
9
+ CONFIG = %[
10
+ remove_tag_prefix t
11
+ <route t1.*>
12
+ remove_tag_prefix t1
13
+ add_tag_prefix yay
14
+ </route>
15
+ <route t2.*>
16
+ remove_tag_prefix t2
17
+ add_tag_prefix foo
18
+ </route>
19
+ <route **>
20
+ @label @primary
21
+ copy
22
+ </route>
23
+ <route **>
24
+ @label @backup
25
+ </route>
26
+ ]
27
+
28
+ def create_driver(conf, tag)
29
+ d = Fluent::Test::OutputTestDriver.new(Fluent::RouteOutput, tag)
30
+ Fluent::Engine.root_agent.define_singleton_method(:find_label) do |label_name|
31
+ obj = Object.new
32
+ obj.define_singleton_method(:event_router){ d.instance.router } # for test...
33
+ obj
34
+ end
35
+ d.configure(conf, true)
36
+ end
37
+
38
+ def test_configure
39
+ # TODO: write
40
+ end
41
+
42
+ def test_emit_t1
43
+ d = create_driver(CONFIG, "t.t1.test")
44
+
45
+ time = Time.parse("2011-11-11 11:11:11 UTC").to_i
46
+ d.run do
47
+ d.emit({"a" => 1}, time)
48
+ d.emit({"a" => 2}, time)
49
+ end
50
+
51
+ emits = d.emits
52
+ assert_equal 2, emits.size
53
+
54
+ assert_equal ["yay.test", time, {"a" => 1}], emits[0]
55
+ assert_equal ["yay.test", time, {"a" => 2}], emits[1]
56
+ end
57
+
58
+ def test_emit_t2
59
+ d = create_driver(CONFIG, "t.t2.test")
60
+
61
+ time = Time.parse("2011-11-11 11:11:11 UTC").to_i
62
+ d.run do
63
+ d.emit({"a" => 1}, time)
64
+ d.emit({"a" => 2}, time)
65
+ end
66
+
67
+ emits = d.emits
68
+ assert_equal 2, emits.size
69
+
70
+ assert_equal ["foo.test", time, {"a" => 1}], emits[0]
71
+ assert_equal ["foo.test", time, {"a" => 2}], emits[1]
72
+ end
73
+
74
+ def test_emit_others
75
+ d = create_driver(CONFIG, "t.t3.test")
76
+
77
+ time = Time.parse("2011-11-11 11:11:11 UTC").to_i
78
+ d.run do
79
+ d.emit({"a" => 1}, time)
80
+ d.emit({"a" => 2}, time)
81
+ end
82
+
83
+ emits = d.emits
84
+ assert_equal 4, emits.size
85
+
86
+ assert_equal ["t3.test", time, {"a" => 1}], emits[0]
87
+ assert_equal ["t3.test", time, {"a" => 1}], emits[1]
88
+ assert_equal ["t3.test", time, {"a" => 2}], emits[2]
89
+ assert_equal ["t3.test", time, {"a" => 2}], emits[3]
90
+ end
91
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-route
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - TAGOMORI Satoshi
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-09-29 00:00:00.000000000 Z
12
+ date: 2016-11-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: fluentd
@@ -26,19 +26,33 @@ dependencies:
26
26
  - !ruby/object:Gem::Version
27
27
  version: '0'
28
28
  - !ruby/object:Gem::Dependency
29
- name: fluent-mixin-config-placeholders
29
+ name: rake
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
32
  - - ">="
33
33
  - !ruby/object:Gem::Version
34
- version: 0.3.0
35
- type: :runtime
34
+ version: '0'
35
+ type: :development
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
39
  - - ">="
40
40
  - !ruby/object:Gem::Version
41
- version: 0.3.0
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: test-unit
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
42
56
  description: This is copy of out_route.rb originally written by frsyuki
43
57
  email:
44
58
  - tagomoris@gmail.com
@@ -48,12 +62,14 @@ extensions: []
48
62
  extra_rdoc_files: []
49
63
  files:
50
64
  - ".gitignore"
65
+ - ".travis.yml"
51
66
  - Gemfile
52
67
  - LICENSE
53
68
  - README.md
54
69
  - Rakefile
55
70
  - fluent-plugin-route.gemspec
56
71
  - lib/fluent/plugin/out_route.rb
72
+ - test/plugin/test_out_route.rb
57
73
  homepage: https://github.com/tagomoris/fluent-plugin-route
58
74
  licenses:
59
75
  - APLv2
@@ -74,9 +90,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
74
90
  version: '0'
75
91
  requirements: []
76
92
  rubyforge_project:
77
- rubygems_version: 2.2.2
93
+ rubygems_version: 2.5.1
78
94
  signing_key:
79
95
  specification_version: 4
80
96
  summary: Fluentd plugin to route messages in fluentd processes
81
- test_files: []
97
+ test_files:
98
+ - test/plugin/test_out_route.rb
82
99
  has_rdoc: