fluent-plugin-filter_codec 0.0.1
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 +7 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/README.md +28 -0
- data/Rakefile +12 -0
- data/fluent-plugin-filter_codec.gemspec +19 -0
- data/lib/fluent/plugin/out_filter_codec.rb +74 -0
- data/test/plugin/test_out_filter_codec.rb +137 -0
- data/test/test_helper.rb +19 -0
- metadata +96 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 21d07fea055581657501e1d4518e7c5e6ddd198d
|
4
|
+
data.tar.gz: 7a7a7f9ca7b26f018f138567c00b8200444300ed
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 80aff95f6a2800a906fd2cb3ab8ce5a3130374ce8bd9cdf68f8d41aebe9f024ad0e37d11ad911c303839057db63413672b539eba803edd566c131a5ca5d8b15e
|
7
|
+
data.tar.gz: 44da4eb7e6356e0fafcd67b6ff41349ef8de0f713f6b170a4c27fbe17230aed630dd23401fdf9ca1e6e0c1c93c9f5fbb51c3a53e9110f6abb1dd2289240864be
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
Example :
|
2
|
+
|
3
|
+
```
|
4
|
+
<match test>
|
5
|
+
type filter_codec
|
6
|
+
add_tag_prefix decoded.
|
7
|
+
codec base64-decode
|
8
|
+
field key1
|
9
|
+
output_field key2
|
10
|
+
</match>
|
11
|
+
```
|
12
|
+
|
13
|
+
Example of records :
|
14
|
+
```
|
15
|
+
{
|
16
|
+
'key1' => "Tmljb2xhcyBDYWdl",
|
17
|
+
'foo' => "bar"
|
18
|
+
}
|
19
|
+
```
|
20
|
+
... will output (unchanged) :
|
21
|
+
```
|
22
|
+
{
|
23
|
+
'key1' => "Nicolas Cage",
|
24
|
+
'foo' => "bar"
|
25
|
+
}
|
26
|
+
```
|
27
|
+
|
28
|
+
You can omit 'output_field' so 'field' value will be replaced by output value.
|
data/Rakefile
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
require "bundler/gem_tasks"
|
3
|
+
require 'rake/testtask'
|
4
|
+
|
5
|
+
desc 'Default: run test.'
|
6
|
+
task :default => :test
|
7
|
+
|
8
|
+
Rake::TestTask.new(:test) do |test|
|
9
|
+
test.libs << 'lib' << 'test'
|
10
|
+
test.pattern = 'test/**/test_*.rb'
|
11
|
+
test.verbose = true
|
12
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
Gem::Specification.new do |spec|
|
2
|
+
spec.name = "fluent-plugin-filter_codec"
|
3
|
+
spec.version = "0.0.1"
|
4
|
+
spec.authors = ["Neozaru"]
|
5
|
+
spec.email = ["neozaru@mailoo.org"]
|
6
|
+
spec.description = %q{Fluentd custom plugin to encode/decode fields}
|
7
|
+
spec.summary = %q{Fluentd custom plugin to encode/decode fields}
|
8
|
+
spec.homepage = "https://github.com/Neozaru/fluent-plugin-filter_codec.git"
|
9
|
+
spec.license = "NONE"
|
10
|
+
|
11
|
+
spec.files = `git ls-files`.split($/)
|
12
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
13
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
14
|
+
spec.require_paths = ["lib"]
|
15
|
+
|
16
|
+
spec.add_development_dependency "bundler"
|
17
|
+
spec.add_development_dependency "rake"
|
18
|
+
spec.add_development_dependency "fluentd"
|
19
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
require "base64"
|
3
|
+
|
4
|
+
module Fluent
|
5
|
+
class FilterCodecOutput < Output
|
6
|
+
include Fluent::HandleTagNameMixin
|
7
|
+
|
8
|
+
Fluent::Plugin.register_output('filter_codec', self)
|
9
|
+
|
10
|
+
config_param :field, :string, :default => nil
|
11
|
+
config_param :output_field, :string, :default => nil
|
12
|
+
config_param :codec, :string, :default => nil
|
13
|
+
|
14
|
+
|
15
|
+
def configure(conf)
|
16
|
+
super
|
17
|
+
|
18
|
+
# Put new functions here
|
19
|
+
@codec_functions = {
|
20
|
+
'base64-decode' => method(:base64_decode),
|
21
|
+
'base64-encode' => method(:base64_encode)
|
22
|
+
}
|
23
|
+
|
24
|
+
if (field.nil? || codec.nil?)
|
25
|
+
raise ConfigError, "filter_codec: Both 'field', and 'codec' are required to be set."
|
26
|
+
end
|
27
|
+
|
28
|
+
if (@codec_functions[codec].nil?)
|
29
|
+
raise ConfigError, "filter_codec: Unknown codec : " + codec
|
30
|
+
end
|
31
|
+
|
32
|
+
@field = field
|
33
|
+
@codec = codec
|
34
|
+
@output_field = output_field || field
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
def emit(tag, es, chain)
|
39
|
+
es.each { |time, record|
|
40
|
+
t = tag.dup
|
41
|
+
filter_record(t, time, record)
|
42
|
+
Engine.emit(t, time, record)
|
43
|
+
}
|
44
|
+
|
45
|
+
chain.next
|
46
|
+
end
|
47
|
+
|
48
|
+
def filter_record(tag, time, record)
|
49
|
+
super(tag, time, record)
|
50
|
+
value_in = record[@field]
|
51
|
+
if (value_in.nil?)
|
52
|
+
return
|
53
|
+
end
|
54
|
+
|
55
|
+
record[@output_field] = process(value_in, @codec) || value_in
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
def process(value, codec)
|
60
|
+
return @codec_functions[codec].call(value)
|
61
|
+
|
62
|
+
return value
|
63
|
+
end
|
64
|
+
|
65
|
+
def base64_decode(value)
|
66
|
+
return Base64.strict_decode64(value)
|
67
|
+
end
|
68
|
+
|
69
|
+
def base64_encode(value)
|
70
|
+
return Base64.strict_encode64(value)
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,137 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
require 'fluent/plugin/out_filter_codec'
|
5
|
+
|
6
|
+
class FilterCodecOutputTest < Test::Unit::TestCase
|
7
|
+
def setup
|
8
|
+
Fluent::Test.setup
|
9
|
+
end
|
10
|
+
|
11
|
+
def create_driver(conf, tag = 'test')
|
12
|
+
Fluent::Test::OutputTestDriver.new(
|
13
|
+
Fluent::FilterCodecOutput, tag
|
14
|
+
).configure(conf)
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_configure_on_success
|
18
|
+
|
19
|
+
# All set
|
20
|
+
d = create_driver(%[
|
21
|
+
add_tag_prefix decoded.
|
22
|
+
field key1
|
23
|
+
output_field key2
|
24
|
+
codec base64-decode
|
25
|
+
])
|
26
|
+
|
27
|
+
assert_equal 'decoded.', d.instance.add_tag_prefix
|
28
|
+
assert_equal 'key1', d.instance.field
|
29
|
+
assert_equal 'key2', d.instance.output_field
|
30
|
+
assert_equal 'base64-decode', d.instance.codec
|
31
|
+
|
32
|
+
# output_field missing
|
33
|
+
d = create_driver(%[
|
34
|
+
add_tag_prefix decoded.
|
35
|
+
field key1
|
36
|
+
codec base64-decode
|
37
|
+
])
|
38
|
+
|
39
|
+
assert_equal 'decoded.', d.instance.add_tag_prefix
|
40
|
+
assert_equal 'key1', d.instance.field
|
41
|
+
assert_equal 'key1', d.instance.output_field
|
42
|
+
assert_equal 'base64-decode', d.instance.codec
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_configure_on_failure
|
47
|
+
# when mandatory keys not set
|
48
|
+
assert_raise(Fluent::ConfigError) do
|
49
|
+
create_driver(%[
|
50
|
+
blah blah
|
51
|
+
])
|
52
|
+
end
|
53
|
+
|
54
|
+
# when 'field' is missing
|
55
|
+
assert_raise(Fluent::ConfigError) do
|
56
|
+
create_driver(%[
|
57
|
+
add_tag_prefix decoded.
|
58
|
+
output_field key2
|
59
|
+
codec base64-decode
|
60
|
+
])
|
61
|
+
end
|
62
|
+
|
63
|
+
# when unknown codec
|
64
|
+
assert_raise(Fluent::ConfigError) do
|
65
|
+
create_driver(%[
|
66
|
+
add_tag_prefix decoded.
|
67
|
+
field key1
|
68
|
+
output_field key2
|
69
|
+
codec unknown-codec
|
70
|
+
])
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_emit_with_base64_decode
|
76
|
+
d = create_driver(%[
|
77
|
+
add_tag_prefix decoded.
|
78
|
+
field key1
|
79
|
+
output_field key2
|
80
|
+
codec base64-decode
|
81
|
+
])
|
82
|
+
|
83
|
+
record = {
|
84
|
+
'key1' => "Tmljb2xhcyBDYWdl",
|
85
|
+
'foo' => "bar"
|
86
|
+
}
|
87
|
+
|
88
|
+
d.run { d.emit(record) }
|
89
|
+
emits = d.emits
|
90
|
+
|
91
|
+
assert_equal 1, emits.count
|
92
|
+
assert_equal 'decoded.test', emits[0][0]
|
93
|
+
assert_equal 'Nicolas Cage',emits[0][2]['key2']
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_emit_with_base64_decode_and_no_output
|
97
|
+
d = create_driver(%[
|
98
|
+
add_tag_prefix decoded.
|
99
|
+
field key1
|
100
|
+
codec base64-decode
|
101
|
+
])
|
102
|
+
|
103
|
+
record = {
|
104
|
+
'key1' => "Tmljb2xhcyBDYWdl",
|
105
|
+
'foo' => "bar"
|
106
|
+
}
|
107
|
+
|
108
|
+
d.run { d.emit(record) }
|
109
|
+
emits = d.emits
|
110
|
+
|
111
|
+
assert_equal 1, emits.count
|
112
|
+
assert_equal 'decoded.test', emits[0][0]
|
113
|
+
assert_equal 'Nicolas Cage',emits[0][2]['key1']
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_emit_with_base64_encode
|
117
|
+
d = create_driver(%[
|
118
|
+
add_tag_prefix encoded.
|
119
|
+
field key1
|
120
|
+
output_field key2
|
121
|
+
codec base64-encode
|
122
|
+
])
|
123
|
+
|
124
|
+
record = {
|
125
|
+
'key1' => "Nicolas Cage",
|
126
|
+
'foo' => "bar"
|
127
|
+
}
|
128
|
+
|
129
|
+
d.run { d.emit(record) }
|
130
|
+
emits = d.emits
|
131
|
+
|
132
|
+
assert_equal 1, emits.count
|
133
|
+
assert_equal 'encoded.test', emits[0][0]
|
134
|
+
assert_equal 'Tmljb2xhcyBDYWdl',emits[0][2]['key2']
|
135
|
+
end
|
136
|
+
|
137
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
|
3
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
4
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
5
|
+
|
6
|
+
require 'fluent/test'
|
7
|
+
|
8
|
+
unless ENV.has_key?('VERBOSE')
|
9
|
+
nulllogger = Object.new
|
10
|
+
nulllogger.instance_eval {|obj|
|
11
|
+
def method_missing(method, *args)
|
12
|
+
# pass
|
13
|
+
end
|
14
|
+
}
|
15
|
+
$log = nulllogger
|
16
|
+
end
|
17
|
+
|
18
|
+
class Test::Unit::TestCase
|
19
|
+
end
|
metadata
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: fluent-plugin-filter_codec
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Neozaru
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-02-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
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: fluentd
|
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: Fluentd custom plugin to encode/decode fields
|
56
|
+
email:
|
57
|
+
- neozaru@mailoo.org
|
58
|
+
executables: []
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- ".gitignore"
|
63
|
+
- Gemfile
|
64
|
+
- README.md
|
65
|
+
- Rakefile
|
66
|
+
- fluent-plugin-filter_codec.gemspec
|
67
|
+
- lib/fluent/plugin/out_filter_codec.rb
|
68
|
+
- test/plugin/test_out_filter_codec.rb
|
69
|
+
- test/test_helper.rb
|
70
|
+
homepage: https://github.com/Neozaru/fluent-plugin-filter_codec.git
|
71
|
+
licenses:
|
72
|
+
- NONE
|
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.4.5
|
91
|
+
signing_key:
|
92
|
+
specification_version: 4
|
93
|
+
summary: Fluentd custom plugin to encode/decode fields
|
94
|
+
test_files:
|
95
|
+
- test/plugin/test_out_filter_codec.rb
|
96
|
+
- test/test_helper.rb
|