fluent-plugin-route 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: