fluent-plugin-data-rejecter 1.0.0

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.
@@ -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