fluent-plugin-record-modifier 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/ChangeLog ADDED
@@ -0,0 +1,3 @@
1
+ Release 0.1.0 - 2013/04/7
2
+
3
+ * First release
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
data/README.md ADDED
@@ -0,0 +1,64 @@
1
+ # Output filter plugin for modifying each event record
2
+
3
+ Adding arbitary field to event record without custmizing existence plugin.
4
+
5
+ For example, generated event from *in_tail* doesn't contain "hostname" of running machine.
6
+ In this case, you can use *record_modifier* to add "hostname" field to event record.
7
+
8
+ ## Installation
9
+
10
+ Use RubyGems:
11
+
12
+ gem install fluent-plugin-record-modifier
13
+
14
+ ## Configuration
15
+
16
+ <match pattern>
17
+ type record_modifier
18
+ tag foo.filtered
19
+
20
+ gen_host ${hostname}
21
+ foo bar
22
+ </match>
23
+
24
+ If following record is passed:
25
+
26
+ ```js
27
+ {"message":"hello world!"}
28
+ ```
29
+
30
+ then you got new record like below:
31
+
32
+ ```js
33
+ {"message":"hello world!", "gen_host":"oreore-mac.local", "foo":"bar"}
34
+ ```
35
+
36
+ ### Mixins
37
+
38
+ * [SetTagKeyMixin](https://github.com/fluent/fluentd/blob/master/lib/fluent/mixin.rb#L181)
39
+ * [fluent-mixin-config-placeholders](https://github.com/tagomoris/fluent-mixin-config-placeholders)
40
+
41
+ ## TODO
42
+
43
+ * Adding following features if needed
44
+
45
+ * Use HandleTagNameMixin to keep original tag
46
+
47
+ * Remove record field
48
+
49
+ * Replace record value
50
+
51
+
52
+ ## Copyright
53
+
54
+ <table>
55
+ <tr>
56
+ <td>Author</td><td>Masahiro Nakagawa <repeatedly@gmail.com></td>
57
+ </tr>
58
+ <tr>
59
+ <td>Copyright</td><td>Copyright (c) 2013- Masahiro Nakagawa</td>
60
+ </tr>
61
+ <tr>
62
+ <td>License</td><td>MIT License</td>
63
+ </tr>
64
+ </table>
data/Rakefile ADDED
@@ -0,0 +1,14 @@
1
+
2
+ require 'bundler'
3
+ Bundler::GemHelper.install_tasks
4
+
5
+ require 'rake/testtask'
6
+
7
+ Rake::TestTask.new(:test) do |test|
8
+ test.libs << 'lib' << 'test'
9
+ test.test_files = FileList['test/*.rb']
10
+ test.verbose = true
11
+ end
12
+
13
+ task :default => [:build]
14
+
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,22 @@
1
+ # encoding: utf-8
2
+ $:.push File.expand_path('../lib', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.name = "fluent-plugin-record-modifier"
6
+ gem.description = "Output filter plugin for modifying each event record"
7
+ gem.homepage = "https://github.com/repeatedly/fluent-plugin-record-modifier"
8
+ gem.summary = gem.description
9
+ gem.version = File.read("VERSION").strip
10
+ gem.authors = ["Masahiro Nakagawa"]
11
+ gem.email = "repeatedly@gmail.com"
12
+ gem.has_rdoc = false
13
+ #gem.platform = Gem::Platform::RUBY
14
+ gem.files = `git ls-files`.split("\n")
15
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
+ gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
17
+ gem.require_paths = ['lib']
18
+
19
+ gem.add_dependency "fluentd", "~> 0.10.17"
20
+ gem.add_dependency "fluent-mixin-config-placeholders", "~> 0.2.0"
21
+ gem.add_development_dependency "rake", ">= 0.9.2"
22
+ end
@@ -0,0 +1,44 @@
1
+ require 'fluent/mixin/config_placeholders'
2
+
3
+ module Fluent
4
+ class RecordModifierOutput < Output
5
+ Fluent::Plugin.register_output('record_modifier', self)
6
+
7
+ config_param :tag, :string
8
+
9
+ include SetTagKeyMixin
10
+ include Fluent::Mixin::ConfigPlaceholders
11
+
12
+ BUILTIN_CONFIGURATIONS = %W(type tag include_tag_key tag_key)
13
+
14
+ def configure(conf)
15
+ super
16
+
17
+ @map = {}
18
+ conf.each_pair { |k, v|
19
+ unless BUILTIN_CONFIGURATIONS.include?(k)
20
+ conf.has_key?(k)
21
+ @map[k] = v
22
+ end
23
+ }
24
+ end
25
+
26
+ def emit(tag, es, chain)
27
+ es.each { |time, record|
28
+ Engine.emit(@tag, time, modify_record(record))
29
+ }
30
+
31
+ chain.next
32
+ end
33
+
34
+ private
35
+
36
+ def modify_record(record)
37
+ @map.each_pair { |k, v|
38
+ record[k] = v
39
+ }
40
+
41
+ record
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,49 @@
1
+ require 'fluent/test'
2
+ require 'fluent/plugin/out_record_modifier'
3
+
4
+
5
+ class RecordModifierOutputTest < Test::Unit::TestCase
6
+ def setup
7
+ Fluent::Test.setup
8
+ end
9
+
10
+ CONFIG = %[
11
+ type record_modifier
12
+ tag foo.filtered
13
+
14
+ gen_host ${hostname}
15
+ foo bar
16
+ ]
17
+
18
+ def create_driver(conf = CONFIG)
19
+ Fluent::Test::OutputTestDriver.new(Fluent::RecordModifierOutput).configure(conf)
20
+ end
21
+
22
+ def get_hostname
23
+ require 'socket'
24
+ Socket.gethostname.chomp
25
+ end
26
+
27
+ def test_configure
28
+ d = create_driver
29
+ map = d.instance.instance_variable_get(:@map)
30
+
31
+ assert_equal get_hostname, map['gen_host']
32
+ assert_equal 'bar', map['foo']
33
+ end
34
+
35
+ def test_format
36
+ d = create_driver
37
+
38
+ d.run do
39
+ d.emit("a" => 1)
40
+ d.emit("a" => 2)
41
+ end
42
+
43
+ mapped = {'gen_host' => get_hostname, 'foo' => 'bar'}
44
+ assert_equal [
45
+ {"a" => 1}.merge(mapped),
46
+ {"a" => 2}.merge(mapped),
47
+ ], d.records
48
+ end
49
+ end
metadata ADDED
@@ -0,0 +1,107 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fluent-plugin-record-modifier
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Masahiro Nakagawa
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-04-07 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: fluentd
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 0.10.17
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 0.10.17
30
+ - !ruby/object:Gem::Dependency
31
+ name: fluent-mixin-config-placeholders
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 0.2.0
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 0.2.0
46
+ - !ruby/object:Gem::Dependency
47
+ name: rake
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: 0.9.2
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: 0.9.2
62
+ description: Output filter plugin for modifying each event record
63
+ email: repeatedly@gmail.com
64
+ executables: []
65
+ extensions: []
66
+ extra_rdoc_files: []
67
+ files:
68
+ - ChangeLog
69
+ - Gemfile
70
+ - README.md
71
+ - Rakefile
72
+ - VERSION
73
+ - fluent-plugin-record-modifier.gemspec
74
+ - lib/fluent/plugin/out_record_modifier.rb
75
+ - test/out_record_modifier.rb
76
+ homepage: https://github.com/repeatedly/fluent-plugin-record-modifier
77
+ licenses: []
78
+ post_install_message:
79
+ rdoc_options: []
80
+ require_paths:
81
+ - lib
82
+ required_ruby_version: !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ segments:
89
+ - 0
90
+ hash: -302354387031894905
91
+ required_rubygems_version: !ruby/object:Gem::Requirement
92
+ none: false
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ segments:
98
+ - 0
99
+ hash: -302354387031894905
100
+ requirements: []
101
+ rubyforge_project:
102
+ rubygems_version: 1.8.23
103
+ signing_key:
104
+ specification_version: 3
105
+ summary: Output filter plugin for modifying each event record
106
+ test_files:
107
+ - test/out_record_modifier.rb