fluent-plugin-filter_codec 0.0.1

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: 21d07fea055581657501e1d4518e7c5e6ddd198d
4
+ data.tar.gz: 7a7a7f9ca7b26f018f138567c00b8200444300ed
5
+ SHA512:
6
+ metadata.gz: 80aff95f6a2800a906fd2cb3ab8ce5a3130374ce8bd9cdf68f8d41aebe9f024ad0e37d11ad911c303839057db63413672b539eba803edd566c131a5ca5d8b15e
7
+ data.tar.gz: 44da4eb7e6356e0fafcd67b6ff41349ef8de0f713f6b170a4c27fbe17230aed630dd23401fdf9ca1e6e0c1c93c9f5fbb51c3a53e9110f6abb1dd2289240864be
@@ -0,0 +1,17 @@
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
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in fluent-plugin-filter_custom_cart.gemspec
4
+ gemspec
@@ -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.
@@ -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
@@ -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