fluent-plugin-string-scrub 0.0.4 → 0.1.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.
- checksums.yaml +4 -4
- data/.travis.yml +4 -1
- data/Gemfile.fluentd.lt.0.12 +4 -0
- data/README.md +20 -0
- data/fluent-plugin-string-scrub.gemspec +1 -1
- data/lib/fluent/plugin/filter_string_scrub.rb +60 -0
- data/lib/fluent/plugin/out_string_scrub.rb +21 -13
- data/test/helper.rb +1 -0
- data/test/plugin/test_filter_string-scrub.rb +48 -0
- data/test/plugin/test_out_string-scrub.rb +22 -2
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 22a7e6ce42d946054cdfb80294dbc339215242e5
|
4
|
+
data.tar.gz: 282dccc73abfd4f2c14209a3478f9d3bbe733ccd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6f812ab0fbe3bc87f5e8a46e1a3d715a2da4950e0334631ca456606dbd77b8acd027517a334bea0afcb9e3a75180a5a746c4b0bd1dd82290620f62cb8fc93136
|
7
|
+
data.tar.gz: 8646f2982fe4ca357512f739f67d246c3a6808584798b6f64f16167316a8fab8e95725a9212109b5023fc2d9e0caeba6825def2d490e3e6f388c43f6db695147
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -51,6 +51,26 @@ Or install it yourself as:
|
|
51
51
|
</match>
|
52
52
|
```
|
53
53
|
|
54
|
+
## Filter plugin
|
55
|
+
|
56
|
+
Fluentd >= v0.12 can use filter plugin.
|
57
|
+
|
58
|
+
```
|
59
|
+
<source>
|
60
|
+
type forward
|
61
|
+
</source>
|
62
|
+
|
63
|
+
<filter **>
|
64
|
+
type string_scrub
|
65
|
+
replace_char ?
|
66
|
+
</filter>
|
67
|
+
|
68
|
+
<match **>
|
69
|
+
type stdout
|
70
|
+
</match>
|
71
|
+
```
|
72
|
+
|
73
|
+
|
54
74
|
## Contributing
|
55
75
|
|
56
76
|
1. Fork it ( https://github.com/[my-github-username]/fluent-plugin-string-scrub/fork )
|
@@ -3,7 +3,7 @@ lib = File.expand_path('../lib', __FILE__)
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |spec|
|
5
5
|
spec.name = "fluent-plugin-string-scrub"
|
6
|
-
spec.version = "0.0
|
6
|
+
spec.version = "0.1.0"
|
7
7
|
spec.authors = ["Noriaki Katayama"]
|
8
8
|
spec.email = ["kataring@gmail.com"]
|
9
9
|
spec.summary = %q{Fluentd Output filter plugin.}
|
@@ -0,0 +1,60 @@
|
|
1
|
+
class Fluent::StringScrubFilter < Fluent::Filter
|
2
|
+
Fluent::Plugin.register_filter('string_scrub', self)
|
3
|
+
|
4
|
+
config_param :replace_char, :string, :default => ''
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
super
|
8
|
+
require 'string/scrub' if RUBY_VERSION.to_f < 2.1
|
9
|
+
end
|
10
|
+
|
11
|
+
def configure(conf)
|
12
|
+
super
|
13
|
+
|
14
|
+
if @replace_char =~ /\\u\{*[A-F0-9]{4}\}*/
|
15
|
+
@replace_char = eval("\"#{@replace_char}\"")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def filter_stream(tag, es)
|
20
|
+
new_es = Fluent::MultiEventStream.new
|
21
|
+
es.each do |time,record|
|
22
|
+
begin
|
23
|
+
scrubbed = recv_record(record)
|
24
|
+
next if scrubbed.nil?
|
25
|
+
new_es.add(time, record)
|
26
|
+
rescue => e
|
27
|
+
router.emit_error_event(tag, time, record, e)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
new_es
|
32
|
+
end
|
33
|
+
|
34
|
+
def recv_record(record)
|
35
|
+
scrubbed = {}
|
36
|
+
record.each do |k,v|
|
37
|
+
if v.instance_of? Hash
|
38
|
+
scrubbed[with_scrub(k)] = recv_record(v)
|
39
|
+
else
|
40
|
+
scrubbed[with_scrub(k)] = with_scrub(v)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
scrubbed
|
44
|
+
end
|
45
|
+
|
46
|
+
def with_scrub(string)
|
47
|
+
begin
|
48
|
+
string =~ //
|
49
|
+
return string
|
50
|
+
rescue ArgumentError => e
|
51
|
+
raise e unless e.message.index("invalid byte sequence in") == 0
|
52
|
+
if string.frozen?
|
53
|
+
string = string.dup.scrub!(@replace_char)
|
54
|
+
else
|
55
|
+
string.scrub!(@replace_char)
|
56
|
+
end
|
57
|
+
retry
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end if defined?(Fluent::Filter) # Support only >= v0.12
|
@@ -6,6 +6,11 @@ class Fluent::StringScrubOutput < Fluent::Output
|
|
6
6
|
config_param :add_prefix, :string, :default => nil
|
7
7
|
config_param :replace_char, :string, :default => ''
|
8
8
|
|
9
|
+
# Define `router` method of v0.12 to support v0.10 or earlier
|
10
|
+
unless method_defined?(:router)
|
11
|
+
define_method("router") { Fluent::Engine }
|
12
|
+
end
|
13
|
+
|
9
14
|
def initialize
|
10
15
|
super
|
11
16
|
require 'string/scrub' if RUBY_VERSION.to_f < 2.1
|
@@ -14,19 +19,22 @@ class Fluent::StringScrubOutput < Fluent::Output
|
|
14
19
|
def configure(conf)
|
15
20
|
super
|
16
21
|
|
17
|
-
if
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
22
|
+
if conf['@label'].nil?
|
23
|
+
if not @tag and not @remove_prefix and not @add_prefix
|
24
|
+
raise Fluent::ConfigError, "missing both of remove_prefix and add_prefix"
|
25
|
+
end
|
26
|
+
if @tag and (@remove_prefix or @add_prefix)
|
27
|
+
raise Fluent::ConfigError, "both of tag and remove_prefix/add_prefix must not be specified"
|
28
|
+
end
|
29
|
+
if @remove_prefix
|
30
|
+
@removed_prefix_string = @remove_prefix + '.'
|
31
|
+
@removed_length = @removed_prefix_string.length
|
32
|
+
end
|
33
|
+
if @add_prefix
|
34
|
+
@added_prefix_string = @add_prefix + '.'
|
35
|
+
end
|
29
36
|
end
|
37
|
+
|
30
38
|
if @replace_char =~ /\\u\{*[A-F0-9]{4}\}*/
|
31
39
|
@replace_char = eval("\"#{@replace_char}\"")
|
32
40
|
end
|
@@ -53,7 +61,7 @@ class Fluent::StringScrubOutput < Fluent::Output
|
|
53
61
|
es.each do |time,record|
|
54
62
|
scrubbed = recv_record(record)
|
55
63
|
next if scrubbed.nil?
|
56
|
-
|
64
|
+
router.emit(tag, time, scrubbed)
|
57
65
|
end
|
58
66
|
|
59
67
|
chain.next
|
data/test/helper.rb
CHANGED
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class StringScrubFilterTest < Test::Unit::TestCase
|
4
|
+
include Fluent
|
5
|
+
|
6
|
+
def setup
|
7
|
+
Fluent::Test.setup
|
8
|
+
@time = Fluent::Engine.now
|
9
|
+
end
|
10
|
+
|
11
|
+
CONFIG = %[
|
12
|
+
replace_char ?
|
13
|
+
]
|
14
|
+
|
15
|
+
CONFIG_UNICODE_1 = %[
|
16
|
+
replace_char \uFFFD
|
17
|
+
]
|
18
|
+
|
19
|
+
CONFIG_UNICODE_2 = %[
|
20
|
+
replace_char \u{FFFD}
|
21
|
+
]
|
22
|
+
|
23
|
+
def create_driver(conf=CONFIG, tag='test.filter')
|
24
|
+
Fluent::Test::FilterTestDriver.new(Fluent::StringScrubFilter).configure(conf, tag)
|
25
|
+
end
|
26
|
+
|
27
|
+
def filter(config, msgs)
|
28
|
+
d = create_driver(config)
|
29
|
+
d.run {
|
30
|
+
msgs.each {|msg|
|
31
|
+
d.filter(msg, @time)
|
32
|
+
}
|
33
|
+
}
|
34
|
+
filtered = d.filtered_as_array
|
35
|
+
filtered.map {|m| m[2] }
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_filter1
|
39
|
+
return unless defined? Fluent::Filter
|
40
|
+
|
41
|
+
orig_message = 'testtesttest'
|
42
|
+
invalid_utf8 = "\xff".force_encoding('UTF-8')
|
43
|
+
msg = {"message" => orig_message + invalid_utf8}
|
44
|
+
filtered = filter(CONFIG, [msg])
|
45
|
+
assert_equal([{"message" => orig_message + '?'}], filtered)
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
@@ -28,8 +28,8 @@ class StringScrubOutputTest < Test::Unit::TestCase
|
|
28
28
|
replace_char \u{FFFD}
|
29
29
|
]
|
30
30
|
|
31
|
-
def create_driver(conf=CONFIG,tag='test')
|
32
|
-
Fluent::Test::OutputTestDriver.new(Fluent::StringScrubOutput, tag).configure(conf)
|
31
|
+
def create_driver(conf = CONFIG, tag = 'test', use_v1_config = true)
|
32
|
+
Fluent::Test::OutputTestDriver.new(Fluent::StringScrubOutput, tag).configure(conf, use_v1_config)
|
33
33
|
end
|
34
34
|
|
35
35
|
def test_configure
|
@@ -78,6 +78,26 @@ class StringScrubOutputTest < Test::Unit::TestCase
|
|
78
78
|
}
|
79
79
|
end
|
80
80
|
|
81
|
+
def test_emit_fluentd_0_12
|
82
|
+
if Fluent::VERSION >= "0.12"
|
83
|
+
in_tag = 'input.log'
|
84
|
+
orig_message = 'testtesttest'
|
85
|
+
Fluent::Engine.root_agent.add_label('@foo')
|
86
|
+
d = create_driver(%[
|
87
|
+
@label @foo
|
88
|
+
], in_tag)
|
89
|
+
label = Fluent::Engine.root_agent.find_label('@foo')
|
90
|
+
assert_equal(label.event_router, d.instance.router)
|
91
|
+
|
92
|
+
d.run do
|
93
|
+
d.emit({'message' => orig_message})
|
94
|
+
end
|
95
|
+
emits = d.emits
|
96
|
+
tag, time, record = emits.first
|
97
|
+
assert_equal(in_tag, tag)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
81
101
|
def test_emit1_invalid_string
|
82
102
|
orig_message = 'testtesttest'
|
83
103
|
invalid_utf8 = "\xff".force_encoding('UTF-8')
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-string-scrub
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Noriaki Katayama
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-05-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -62,12 +62,15 @@ files:
|
|
62
62
|
- ".gitignore"
|
63
63
|
- ".travis.yml"
|
64
64
|
- Gemfile
|
65
|
+
- Gemfile.fluentd.lt.0.12
|
65
66
|
- LICENSE.txt
|
66
67
|
- README.md
|
67
68
|
- Rakefile
|
68
69
|
- fluent-plugin-string-scrub.gemspec
|
70
|
+
- lib/fluent/plugin/filter_string_scrub.rb
|
69
71
|
- lib/fluent/plugin/out_string_scrub.rb
|
70
72
|
- test/helper.rb
|
73
|
+
- test/plugin/test_filter_string-scrub.rb
|
71
74
|
- test/plugin/test_out_string-scrub.rb
|
72
75
|
homepage: https://github.com/kataring/fluent-plugin-string-scrub
|
73
76
|
licenses:
|
@@ -95,4 +98,5 @@ specification_version: 4
|
|
95
98
|
summary: Fluentd Output filter plugin.
|
96
99
|
test_files:
|
97
100
|
- test/helper.rb
|
101
|
+
- test/plugin/test_filter_string-scrub.rb
|
98
102
|
- test/plugin/test_out_string-scrub.rb
|