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 +4 -4
- data/.travis.yml +5 -0
- data/README.md +31 -5
- data/Rakefile +9 -0
- data/fluent-plugin-route.gemspec +3 -2
- data/lib/fluent/plugin/out_route.rb +111 -106
- data/test/plugin/test_out_route.rb +91 -0
- metadata +25 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2be56e0033b180819f2229b3c61e6124d4422cbf
|
4
|
+
data.tar.gz: 27bdc280417b08b926ca3c5bb5939d2f8e0aca95
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 64b121f1fe16c1b2d23be44bc5dcc6acc17b9db331c50e272f0886e9153311fe56a936f832c5988d567b05753ab33d953a1fd74d5895f20e6231be497574a770
|
7
|
+
data.tar.gz: aca7e79d483a1d2799649410724beee7616d56fb090c9a7502d3985bfb66d2fa51da8b6aee9d688b807e17008b86b22ef727f6962e30f94d279ddd69650cead6
|
data/README.md
CHANGED
@@ -4,14 +4,14 @@
|
|
4
4
|
|
5
5
|
## Configuration
|
6
6
|
|
7
|
-
|
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
data/fluent-plugin-route.gemspec
CHANGED
@@ -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.
|
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.
|
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/
|
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
|
-
|
24
|
-
|
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
|
-
|
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
|
-
|
29
|
-
|
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
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
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
|
-
|
46
|
-
|
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
|
-
|
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
|
-
|
67
|
-
|
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 = @
|
72
|
-
unless
|
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
|
-
|
75
|
-
|
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
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
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
|
-
|
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
|
-
|
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.
|
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:
|
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:
|
29
|
+
name: rake
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
32
|
- - ">="
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version: 0
|
35
|
-
type: :
|
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
|
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.
|
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:
|