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