fluent-plugin-data-rejecter 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 422a4edcad8c5e9645e5da2a922af480ff148f15
4
+ data.tar.gz: 0d83f59a3da8dd460d4210dcee89206d508b7375
5
+ SHA512:
6
+ metadata.gz: 9744819ba2a0ab404e0058f90f827adeba79d89924b341b2f45622330abea24319bb776fa2d3bf436cb6a2887b20dfb9b85fce5d674859a9e619753d265b1f89
7
+ data.tar.gz: 8ed81b35b5433bc0dff08ceb3bf12365b29b9ebea4d73d1c624c05ae1d8f527203446bbf6f84dd73d2c833947d3d8ea2859c4b3509921ce6e8617ed94acfa88d
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.swp
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 hirotaka tajiri
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,54 @@
1
+ #fluent-plugin-data-rejecter
2
+
3
+ ## Overview
4
+
5
+ Output plugin to reject key pairs
6
+
7
+ * reject key pairs
8
+ * remove tag prefix
9
+ * add tag prefix
10
+
11
+ ## Parameters
12
+
13
+ - remove_prefix
14
+
15
+ remove tag if tag matches this pattern
16
+
17
+ - add_prefix
18
+
19
+ add tag for re-emit.
20
+
21
+ - reject_keys
22
+
23
+ reject key pair for re-emit.
24
+
25
+ ## Configuration
26
+
27
+ Example:
28
+
29
+ <match abc.def.**>
30
+ type data_rejecter
31
+ remove_prefix abc
32
+ add_prefix 123
33
+ reject_keys key key1
34
+ </match>
35
+
36
+ input
37
+
38
+ abc.def.tag: {"dat":"message", "key":"value", "key1":"value2", "key2":"value2", ....}
39
+
40
+ output
41
+
42
+ 123.def.tag: {"dat":"message", "key2":"value2", ....}
43
+
44
+ ### remove_prefix (complete matching)
45
+
46
+ config | tag #=> result
47
+
48
+ abc | abc.def.tag #=> removed
49
+ abc. | abc.def.tag #=> removed
50
+ ab | abc.def.tag #=> not removed
51
+
52
+ ## Copyright
53
+
54
+ Copyright (c) 2014 Hirotaka Tajiri. See [LICENSE](LICENSE.txt) for details.
@@ -0,0 +1,9 @@
1
+ # encoding: utf-8
2
+ require "bundler/gem_tasks"
3
+
4
+ require 'rspec/core'
5
+ require 'rspec/core/rake_task'
6
+ RSpec::Core::RakeTask.new(:spec) do | spec |
7
+ spec.pattern = FileList['spec/*_spec.rb']
8
+ end
9
+ task :default => :spec
@@ -0,0 +1,24 @@
1
+ # encoding: utf-8
2
+
3
+ $:.push File.expand_path('../lib', __FILE__)
4
+
5
+ Gem::Specification.new do | gs |
6
+ gs.name = "fluent-plugin-data-rejecter"
7
+ gs.version = "1.0.0"
8
+ gs.authors = ["Hirotaka Tajiri"]
9
+ gs.email = "ganryu_koziro@excite.co.jp"
10
+ gs.homepage = "https://github.com/hirotaka-tajiri/fluent-plugin-data-rejecter"
11
+ gs.description = "Fluent plugin Output filer to reject key pair"
12
+ gs.summary = "Output filter plugin to reject key pair"
13
+ gs.licenses = ["MIT"]
14
+ gs.has_rdoc = false
15
+
16
+ gs.files = `git ls-files`.split("\n")
17
+ gs.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ gs.executables = `git ls-files -- bin/*`.split("\n").map{| f | File.basename(f)}
19
+ gs.require_paths = ['lib']
20
+
21
+ gs.add_dependency 'fluentd', "~> 0.10"
22
+ gs.add_development_dependency "rake", '~>0'
23
+ gs.add_development_dependency "rspec", '~>0'
24
+ end
@@ -0,0 +1,32 @@
1
+ module Fluent
2
+ class DataRejecterOutput < Output
3
+ Fluent::Plugin.register_output('data_rejecter', self)
4
+
5
+ config_param :remove_prefix, :string, :default => ''
6
+ config_param :add_prefix, :string, :default => ''
7
+ config_param :reject_keys, :string, :default => ''
8
+
9
+ def configure(conf)
10
+ super
11
+ @remove = @remove_prefix.end_with?('.') ? @remove_prefix : @remove_prefix + '.'
12
+ @add = @add_prefix.end_with?('.') ? @add_prefix : @add_prefix + '.'
13
+ @add_p = @add.chop
14
+ end
15
+
16
+ def emit(tag, es, chain)
17
+ tmptag = (tag[@remove.size .. -1] if tag.start_with?(@remove)) || (tag == @remove_prefix ? '' : tag)
18
+ tag = @add_p.size.zero? ? (tmptag.size.zero? ? "data_rejecter.tag_lost" : tmptag) : (tmptag.size.zero? ? @add_p : @add + tmptag)
19
+
20
+ es.each {| time, record |
21
+ Engine.emit(tag, time, reject_record(record))
22
+ }
23
+ chain.next
24
+ end
25
+
26
+ private
27
+ def reject_record(record)
28
+ @reject_keys.split.each{| v | record.delete(v) if record.has_key?(v)}
29
+ record
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,270 @@
1
+ # encoding: UTF-8
2
+ require_relative 'spec_helper'
3
+ describe Fluent::DataRejecterOutput do
4
+
5
+ before { Fluent::Test.setup }
6
+
7
+ def create_driver(conf, tag='default.tag')
8
+ Fluent::Test::OutputTestDriver.new(Fluent::DataRejecterOutput, tag).configure(conf)
9
+ end
10
+
11
+ let(:time_now) { Time.now }
12
+
13
+ describe 'test config ' do
14
+
15
+ it 'Check remove prefix AND add prefix AND reject_keys2' do
16
+ d = create_driver %[
17
+ remove_prefix abc
18
+ add_prefix 123
19
+ reject_keys key1 key2
20
+ ]
21
+ d.instance.inspect
22
+ expect(d.instance.remove_prefix).to eq "abc"
23
+ expect(d.instance.add_prefix ).to eq "123"
24
+ expect(d.instance.reject_keys ).to eq "key1 key2"
25
+ end
26
+
27
+ end
28
+
29
+ describe 'Emit test ' do
30
+
31
+ it 'tag change(remove & add)' do
32
+ d = create_driver(%[
33
+ remove_prefix abc
34
+ add_prefix 123
35
+ reject_keys key1
36
+ ], 'abc.def.tag')
37
+ d.run do
38
+ d.emit({'a' => 'b'}, time_now)
39
+ d.emit({'c' => 'd', 'e' => 'f'}, time_now)
40
+ end
41
+ emits = d.emits
42
+ expect(emits.size ).to eq 2
43
+ expect(emits[0][0] ).to eq '123.def.tag'
44
+ expect(emits[0][2].size).to eq 1
45
+ expect(emits[1][0] ).to eq '123.def.tag'
46
+ expect(emits[1][2].size).to eq 2
47
+ end
48
+
49
+ it 'tag change(remove. & add)' do
50
+ d = create_driver(%[
51
+ remove_prefix abc
52
+ add_prefix 123.
53
+ reject_keys key1
54
+ ], 'abc.def.tag')
55
+ d.run do
56
+ d.emit({'a' => 'b'}, time_now)
57
+ d.emit({'c' => 'd', 'e' => 'f'}, time_now)
58
+ end
59
+ emits = d.emits
60
+ expect(emits.size ).to eq 2
61
+ expect(emits[0][0] ).to eq '123.def.tag'
62
+ expect(emits[0][2].size).to eq 1
63
+ expect(emits[1][0] ).to eq '123.def.tag'
64
+ expect(emits[1][2].size).to eq 2
65
+ end
66
+
67
+ it 'tag change(remove & add.)' do
68
+ d = create_driver(%[
69
+ remove_prefix abc
70
+ add_prefix 123.
71
+ reject_keys key1
72
+ ], 'abc.def.tag')
73
+ d.run do
74
+ d.emit({'a' => 'b'}, time_now)
75
+ d.emit({'c' => 'd', 'e' => 'f'}, time_now)
76
+ end
77
+ emits = d.emits
78
+ expect(emits.size ).to eq 2
79
+ expect(emits[0][0] ).to eq '123.def.tag'
80
+ expect(emits[0][2].size).to eq 1
81
+ expect(emits[1][0] ).to eq '123.def.tag'
82
+ expect(emits[1][2].size).to eq 2
83
+ end
84
+
85
+ it 'tag change(remove. & add.)' do
86
+ d = create_driver(%[
87
+ remove_prefix abc.
88
+ add_prefix 123.
89
+ reject_keys key1
90
+ ], 'abc.def.tag')
91
+ d.run do
92
+ d.emit({'a' => 'b'}, time_now)
93
+ d.emit({'c' => 'd', 'e' => 'f'}, time_now)
94
+ end
95
+ emits = d.emits
96
+ expect(emits.size ).to eq 2
97
+ expect(emits[0][0] ).to eq '123.def.tag'
98
+ expect(emits[0][2].size).to eq 1
99
+ expect(emits[1][0] ).to eq '123.def.tag'
100
+ expect(emits[1][2].size).to eq 2
101
+ end
102
+
103
+ it 'tag change(no_remove & add)' do
104
+ d = create_driver(%[
105
+ add_prefix 123
106
+ reject_keys key1
107
+ ], 'abc.def.tag')
108
+ d.run do
109
+ d.emit({'a' => 'b'}, time_now)
110
+ d.emit({'c' => 'd', 'e' => 'f'}, time_now)
111
+ end
112
+ emits = d.emits
113
+ expect(emits.size ).to eq 2
114
+ expect(emits[0][0] ).to eq '123.abc.def.tag'
115
+ expect(emits[0][2].size).to eq 1
116
+ expect(emits[1][0] ).to eq '123.abc.def.tag'
117
+ expect(emits[1][2].size).to eq 2
118
+ end
119
+
120
+ it 'tag change(remove & no_add)' do
121
+ d = create_driver(%[
122
+ remove_prefix abc
123
+ reject_keys key1
124
+ ], 'abc.def.tag')
125
+ d.run do
126
+ d.emit({'a' => 'b'}, time_now)
127
+ d.emit({'c' => 'd', 'e' => 'f'}, time_now)
128
+ end
129
+ emits = d.emits
130
+ expect(emits.size ).to eq 2
131
+ expect(emits[0][0] ).to eq 'def.tag'
132
+ expect(emits[0][2].size).to eq 1
133
+ expect(emits[1][0] ).to eq 'def.tag'
134
+ expect(emits[1][2].size).to eq 2
135
+ end
136
+
137
+ it 'tag change(remove_not_match & add)' do
138
+ d = create_driver(%[
139
+ remove_prefix xyz
140
+ add_prefix 123
141
+ reject_keys key1
142
+ ], 'abc.def.tag')
143
+ d.run do
144
+ d.emit({'a' => 'b'}, time_now)
145
+ d.emit({'c' => 'd', 'e' => 'f'}, time_now)
146
+ end
147
+ emits = d.emits
148
+ expect(emits.size ).to eq 2
149
+ expect(emits[0][0] ).to eq '123.abc.def.tag'
150
+ expect(emits[0][2].size).to eq 1
151
+ expect(emits[1][0] ).to eq '123.abc.def.tag'
152
+ expect(emits[1][2].size).to eq 2
153
+ end
154
+
155
+ it 'tag change(not_remove(not perfect match) & add)' do
156
+ d = create_driver(%[
157
+ remove_prefix ab
158
+ add_prefix 123
159
+ reject_keys key1
160
+ ], 'abc.def.tag')
161
+ d.run do
162
+ d.emit({'a' => 'b'}, time_now)
163
+ d.emit({'c' => 'd', 'e' => 'f'}, time_now)
164
+ end
165
+ emits = d.emits
166
+ expect(emits.size ).to eq 2
167
+ expect(emits[0][0] ).to eq '123.abc.def.tag'
168
+ expect(emits[0][2].size).to eq 1
169
+ expect(emits[1][0] ).to eq '123.abc.def.tag'
170
+ expect(emits[1][2].size).to eq 2
171
+ end
172
+
173
+ it 'tag change(all_remove & add)' do
174
+ d = create_driver(%[
175
+ remove_prefix old.tag
176
+ add_prefix new.tag
177
+ reject_keys key1
178
+ ], 'old.tag')
179
+ d.run do
180
+ d.emit({'a' => 'b'}, time_now)
181
+ d.emit({'c' => 'd', 'e' => 'f'}, time_now)
182
+ end
183
+ emits = d.emits
184
+ expect(emits.size ).to eq 2
185
+ expect(emits[0][0] ).to eq 'new.tag'
186
+ expect(emits[0][2].size).to eq 1
187
+ expect(emits[1][0] ).to eq 'new.tag'
188
+ expect(emits[1][2].size).to eq 2
189
+ end
190
+
191
+ it 'tag change & data reject1 & add)' do
192
+ d = create_driver(%[
193
+ remove_prefix abc
194
+ add_prefix 123
195
+ reject_keys key
196
+ ], 'abc.def.tag')
197
+ d.run do
198
+ d.emit({'dat' => 'val'}, time_now)
199
+ d.emit({'dat' => 'val', 'key' => 'vl'}, time_now)
200
+ d.emit({'dat' => 'val', 'key1' => 'vl1'}, time_now)
201
+ end
202
+ emits = d.emits
203
+ rlt = {'dat' => 'val'}
204
+ rlt1 = {'dat' => 'val', 'key1' => 'vl1'}
205
+ expect(emits.size ).to eq 3
206
+ expect(emits[0][0] ).to eq '123.def.tag'
207
+ expect(emits[0][2].size).to eq 1
208
+ expect(emits[0][2] ).to eq rlt
209
+ expect(emits[1][0] ).to eq '123.def.tag'
210
+ expect(emits[1][2].size).to eq 1
211
+ expect(emits[1][2] ).to eq rlt
212
+ expect(emits[2][0] ).to eq '123.def.tag'
213
+ expect(emits[2][2].size).to eq 2
214
+ expect(emits[2][2] ).to eq rlt1
215
+ end
216
+
217
+ it 'tag change & data reject2 & add)' do
218
+ d = create_driver(%[
219
+ remove_prefix abc
220
+ add_prefix 123
221
+ reject_keys key key1
222
+ ], 'abc.def.tag')
223
+ d.run do
224
+ d.emit({'dat' => 'val'}, time_now)
225
+ d.emit({'dat' => 'val', 'key' => 'vl'}, time_now)
226
+ d.emit({'dat' => 'val', 'key1' => 'vl1'}, time_now)
227
+ d.emit({'dat' => 'val', 'key2' => 'vl2'}, time_now)
228
+ d.emit({'dat' => 'val', 'key' => 'vl', 'key1' => 'vl1'}, time_now)
229
+ d.emit({'dat' => 'val', 'key1' => 'vl1', 'key' => 'vl'}, time_now)
230
+ d.emit({'dat' => 'val', 'key' => 'vl', 'key1' => 'vl1', 'key2' => 'vl2'}, time_now)
231
+ d.emit({'dat' => 'val', 'key' => 'vl', 'key2' => 'vl2', 'key1' => 'vl1'}, time_now)
232
+ d.emit({'dat' => 'val', 'key1' => 'vl1', 'key2' => 'vl2', 'key' => 'vl'}, time_now)
233
+ end
234
+ emits = d.emits
235
+ rlt = {'dat' => 'val'}
236
+ rlt1 = {'dat' => 'val', 'key2' => 'vl2'}
237
+ expect(emits.size ).to eq 9
238
+ expect(emits[0][0] ).to eq '123.def.tag'
239
+ expect(emits[0][2].size).to eq 1
240
+ expect(emits[0][2] ).to eq rlt
241
+ expect(emits[1][0] ).to eq '123.def.tag'
242
+ expect(emits[1][2].size).to eq 1
243
+ expect(emits[1][2] ).to eq rlt
244
+ expect(emits[2][0] ).to eq '123.def.tag'
245
+ expect(emits[2][2].size).to eq 1
246
+ expect(emits[2][2] ).to eq rlt
247
+ expect(emits[3][0] ).to eq '123.def.tag'
248
+ expect(emits[3][2].size).to eq 2
249
+ expect(emits[3][2] ).to eq rlt1
250
+ expect(emits[4][0] ).to eq '123.def.tag'
251
+ expect(emits[4][2].size).to eq 1
252
+ expect(emits[4][2] ).to eq rlt
253
+ expect(emits[5][0] ).to eq '123.def.tag'
254
+ expect(emits[5][2].size).to eq 1
255
+ expect(emits[5][2] ).to eq rlt
256
+ expect(emits[6][0] ).to eq '123.def.tag'
257
+ expect(emits[6][2].size).to eq 2
258
+ expect(emits[6][2] ).to eq rlt1
259
+ expect(emits[7][0] ).to eq '123.def.tag'
260
+ expect(emits[7][2].size).to eq 2
261
+ expect(emits[7][2] ).to eq rlt1
262
+ expect(emits[8][0] ).to eq '123.def.tag'
263
+ expect(emits[8][2].size).to eq 2
264
+ expect(emits[8][2] ).to eq rlt1
265
+ end
266
+
267
+ end
268
+
269
+
270
+ end
@@ -0,0 +1,8 @@
1
+ # encoding: UTF-8
2
+ require 'rubygems'
3
+ require 'bundler'
4
+
5
+ require 'rspec'
6
+ require 'fluent/test'
7
+
8
+ Dir["./lib/**/*.rb"].each{| f | require f}
metadata ADDED
@@ -0,0 +1,96 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fluent-plugin-data-rejecter
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Hirotaka Tajiri
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-01-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: fluentd
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.10'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.10'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: Fluent plugin Output filer to reject key pair
56
+ email: ganryu_koziro@excite.co.jp
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files: []
60
+ files:
61
+ - ".gitignore"
62
+ - Gemfile
63
+ - LICENSE.txt
64
+ - README.md
65
+ - Rakefile
66
+ - fluent-plugin-data-rejecter.gemspec
67
+ - lib/fluent/plugin/out_data_rejecter.rb
68
+ - spec/out_data_rejecter_spec.rb
69
+ - spec/spec_helper.rb
70
+ homepage: https://github.com/hirotaka-tajiri/fluent-plugin-data-rejecter
71
+ licenses:
72
+ - MIT
73
+ metadata: {}
74
+ post_install_message:
75
+ rdoc_options: []
76
+ require_paths:
77
+ - lib
78
+ required_ruby_version: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ required_rubygems_version: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ requirements: []
89
+ rubyforge_project:
90
+ rubygems_version: 2.1.11
91
+ signing_key:
92
+ specification_version: 4
93
+ summary: Output filter plugin to reject key pair
94
+ test_files:
95
+ - spec/out_data_rejecter_spec.rb
96
+ - spec/spec_helper.rb