fluent-plugin-nested-hash-filter 0.0.3 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 60b5bb888522f56625b754d9caeadcb87d7bc44d
4
- data.tar.gz: 4f44bc0f23f2c6625397886f58b7e375b4d12e41
3
+ metadata.gz: 8086358c385e65ba72177e5d387af2dbc59d9327
4
+ data.tar.gz: 00dd2d49d61abda94163664ebcc5147dc4a8439c
5
5
  SHA512:
6
- metadata.gz: b58d7cfb0da91c08bbf5a60f52bcf31de08b569b5938d19bb957282cc98b8fbf5c11e8833e6ef2386284c9478057bb0efc14477f992a198a8156ec0e2fcc4524
7
- data.tar.gz: 211f1c9ed5430cc2328672ca9525479607049cfcae7c86e268378e4360301b139332fdeb0589ac4d7153e01e117e658951917836a50fb8ba98922c19ff561327
6
+ metadata.gz: 9bf597fb8200cb91327b6e061b9749ad88f17a8af45037ff7360eef64d80acbcf3c7fd7dd65c1f5f2f8814d269e37eeb3e83f5ef5f27e9b633b4a88bd412d676
7
+ data.tar.gz: 9e850518c9d05ea283c89d473269301b0923dc275dc60a74f671841aa1c859f545509bbe9a42c059a16628e8a68e991359869edadec2f5dcb81bafd055a65ff4
data/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # fluent-plugin-nested-hash-filter
2
2
 
3
- [![Build Status](https://travis-ci.org/sugilog/fluent-plugin-nested-hash-filter.png?branch=master)](https://travis-ci.org/sugilog/fluent-plugin-nested-hash-filter.svg)
3
+ [![Build Status](https://travis-ci.org/sugilog/fluent-plugin-nested-hash-filter.svg?branch=master)](https://travis-ci.org/sugilog/fluent-plugin-nested-hash-filter)
4
+ [![Gem Version](https://badge.fury.io/rb/fluent-plugin-nested-hash-filter.svg)](http://badge.fury.io/rb/fluent-plugin-nested-hash-filter)
4
5
 
5
6
 
6
7
  Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/fluent/plugin/filter_nested_hash`.
@@ -9,23 +10,40 @@ TODO: Delete this and the text above, and describe your gem
9
10
 
10
11
  ## Installation
11
12
 
12
- Add this line to your application's Gemfile:
13
+ install to your td-agent env
13
14
 
14
15
  ```ruby
15
- gem 'fluent-plugin-nested-hash-filter'
16
+ td-agent-gem install fluent-plugin-nested-hash-filter
16
17
  ```
17
18
 
18
- And then execute:
19
+ ## Usage
19
20
 
20
- $ bundle
21
+ Add config to your `td-agent.conf`
21
22
 
22
- Or install it yourself as:
23
+ **Filter**: just only convert passed hash into flatten key-value pair.
23
24
 
24
- $ gem install fluent-plugin-nested-hash-filter
25
+ ```
26
+ <filter {MATCH_PATTERN}>
27
+ type nested_hash
28
+ connector .
29
+ </filter>
30
+ ```
25
31
 
26
- ## Usage
32
+ **Output**: convert passed hash into flatten key-value pair, and rename tag.
33
+
34
+ ```
35
+ <match {MATCH_PATTERN}>
36
+ type nested_hash
37
+ tag_prefix {PREFIX}
38
+ connector .
39
+ </match>
40
+ ```
41
+
42
+ `tag_prefix` is required parameter to add prefix to matched tag name.
43
+
44
+ `connector` is optional parameter to connect nested-keys. (default: `.`) not for tag prefix connection.
27
45
 
28
- TODO: Write usage instructions here
46
+ - ex: matched tag is `access.log` and `tag_prefix` is `converted.`, then log will be passed with tag name `converted.access.log`.
29
47
 
30
48
  ## Development
31
49
 
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "fluent-plugin-nested-hash-filter"
7
- spec.version = "0.0.3"
7
+ spec.version = "0.1.0"
8
8
  spec.authors = ["sugilog"]
9
9
  spec.email = ["sugilog@gmail.com"]
10
10
 
@@ -4,6 +4,8 @@ module Fluent
4
4
  class FilterNestedHash < Filter
5
5
  Plugin.register_filter("nested_hash", self)
6
6
 
7
+ config_param :connector, :string, :default => nil
8
+
7
9
  def configure conf
8
10
  super
9
11
  end
@@ -17,7 +19,7 @@ module Fluent
17
19
  end
18
20
 
19
21
  def filter tag, time, record
20
- Fluent::NestedHashFilter::NestedObject.convert record
22
+ Fluent::NestedHashFilter::NestedObject.convert record, connector: @connector
21
23
  end
22
24
  end
23
25
  end
@@ -1,21 +1,24 @@
1
1
  module Fluent
2
2
  module NestedHashFilter
3
- module NestedObject
4
- CONNECTOR = "."
3
+ class NestedObject
4
+ DEFAULT_CONNECTOR = "."
5
5
 
6
- def self.init
7
- @output = {}
8
- @output_keys = []
6
+ def self.convert object, options = {}
7
+ converter = new options
8
+ converter.select object
9
+ converter.output
9
10
  end
10
11
 
11
- def self.convert object
12
- init
13
- select object
12
+ attr_accessor :output, :output_keys
13
+ attr_reader :connector
14
14
 
15
- @output
15
+ def initialize options = {}
16
+ @output = {}
17
+ @output_keys = []
18
+ @connector = options[:connector] || DEFAULT_CONNECTOR
16
19
  end
17
20
 
18
- def self.select object
21
+ def select object
19
22
  case object
20
23
  when Hash
21
24
  convert_hash object
@@ -26,25 +29,25 @@ module Fluent
26
29
  end
27
30
  end
28
31
 
29
- def self.add_key key
32
+ def add_key key
30
33
  @output_keys.push key
31
34
  end
32
35
 
33
- def self.pop_key
36
+ def pop_key
34
37
  @output_keys.pop
35
38
  end
36
39
 
37
- def self.current_key
38
- @output_keys.join CONNECTOR
40
+ def current_key
41
+ @output_keys.join connector
39
42
  end
40
43
 
41
- def self.update value
44
+ def update value
42
45
  unless current_key.empty?
43
46
  @output.update current_key => value
44
47
  end
45
48
  end
46
49
 
47
- def self.convert_hash hash
50
+ def convert_hash hash
48
51
  if hash.keys.empty?
49
52
  update nil
50
53
  end
@@ -56,7 +59,7 @@ module Fluent
56
59
  end
57
60
  end
58
61
 
59
- def self.convert_array array
62
+ def convert_array array
60
63
  if array.empty?
61
64
  update nil
62
65
  end
@@ -5,6 +5,7 @@ module Fluent
5
5
  Plugin.register_output("nested_hash", self)
6
6
 
7
7
  config_param :tag_prefix, :string
8
+ config_param :connector, :string, :default => nil
8
9
 
9
10
  def configure conf
10
11
  super
@@ -20,7 +21,7 @@ module Fluent
20
21
 
21
22
  def emit tag, es, chain
22
23
  es.each do |time, record|
23
- record = Fluent::NestedHashFilter::NestedObject.convert record
24
+ record = Fluent::NestedHashFilter::NestedObject.convert record, connector: @connector
24
25
  Fluent::Engine.emit @tag_prefix + tag, time, record
25
26
  end
26
27
 
@@ -33,9 +33,13 @@ class FilterNestedHashTest < Test::Unit::TestCase
33
33
 
34
34
  sub_test_case "configure" do
35
35
  test "check default" do
36
- assert_nothing_raised do
37
- create_driver "default"
38
- end
36
+ driver = create_driver "default"
37
+ assert_equal nil, driver.instance.connector
38
+ end
39
+
40
+ test "with connector" do
41
+ driver = create_driver "connector -"
42
+ assert_equal "-", driver.instance.connector
39
43
  end
40
44
  end
41
45
 
@@ -55,6 +59,21 @@ class FilterNestedHashTest < Test::Unit::TestCase
55
59
  assert_equal expect_message, result[:message]
56
60
  end
57
61
 
62
+ test "with connector" do
63
+ driver = emit "connector -", [
64
+ {a: 1, b: {c: 2, d: {e: 3, f:4}, g: [10, 20, 30]}, h: [], i: {}},
65
+ {a: {b: {c: 1, d: {e: 2, f:3}, g: [10, 20, 30]}, h: [], i: {}}}
66
+ ]
67
+
68
+ expect_message = {"a" => 1, "b-c" => 2, "b-d-e" => 3, "b-d-f" => 4, "b-g-0" => 10, "b-g-1" => 20, "b-g-2" => 30, "h" => nil, "i" => nil}
69
+ result = filtered driver, 0
70
+ assert_equal expect_message, result[:message]
71
+
72
+ expect_message = {"a-b-c" => 1, "a-b-d-e" => 2, "a-b-d-f" => 3, "a-b-g-0" => 10, "a-b-g-1" => 20, "a-b-g-2" => 30, "a-h" => nil, "a-i" => nil}
73
+ result = filtered driver, 1
74
+ assert_equal expect_message, result[:message]
75
+ end
76
+
58
77
  test "with invalid record" do
59
78
  driver = emit "", ["message", {hoge: 1, fuga: {"test0" => 2, "test1" => 3}}]
60
79
 
@@ -3,12 +3,12 @@ require "fluent/plugin/nested_hash_filter/nested_object"
3
3
 
4
4
  class NestedObjectTest < Test::Unit::TestCase
5
5
  setup do
6
- klass.init
6
+ @instance = klass.new
7
7
  end
8
8
 
9
9
  sub_test_case "constants" do
10
- test "::CONNECTOR" do
11
- assert_equal ".", klass::CONNECTOR
10
+ test "::DEFAULT_CONNECTOR" do
11
+ assert_equal ".", klass::DEFAULT_CONNECTOR
12
12
  end
13
13
  end
14
14
 
@@ -35,11 +35,26 @@ class NestedObjectTest < Test::Unit::TestCase
35
35
  end
36
36
  end
37
37
 
38
+ sub_test_case "initialize" do
39
+ test "without options" do
40
+ assert_equal Hash.new, @instance.output
41
+ assert_equal Array.new, @instance.output_keys
42
+ assert_equal ".", @instance.connector
43
+ end
44
+
45
+ test "with options" do
46
+ @instance = klass.new connector: "-"
47
+ assert_equal Hash.new, @instance.output
48
+ assert_equal Array.new, @instance.output_keys
49
+ assert_equal "-", @instance.connector
50
+ end
51
+ end
52
+
38
53
  sub_test_case "select" do
39
54
  test "object is hash" do
40
- klass.add_key "test"
55
+ @instance.add_key "test"
41
56
  object = {hoge: 1, fuga: "2"}
42
- klass.select object
57
+ @instance.select object
43
58
 
44
59
  assert_equal Set["test.hoge", "test.fuga"], output.keys.to_set
45
60
  assert_equal 1, output["test.hoge"]
@@ -47,9 +62,9 @@ class NestedObjectTest < Test::Unit::TestCase
47
62
  end
48
63
 
49
64
  test "object is array" do
50
- klass.add_key "test"
65
+ @instance.add_key "test"
51
66
  object = [:hoge, "fuga"]
52
- klass.select object
67
+ @instance.select object
53
68
 
54
69
  assert_equal Set["test.0", "test.1"], output.keys.to_set
55
70
  assert_equal :hoge, output["test.0"]
@@ -57,27 +72,27 @@ class NestedObjectTest < Test::Unit::TestCase
57
72
  end
58
73
 
59
74
  test "object is string" do
60
- klass.add_key "test"
75
+ @instance.add_key "test"
61
76
  object = "hoge"
62
- klass.select object
77
+ @instance.select object
63
78
 
64
79
  assert_equal Set["test"], output.keys.to_set
65
80
  assert_equal "hoge", output["test"]
66
81
  end
67
82
 
68
83
  test "object is number" do
69
- klass.add_key "test"
84
+ @instance.add_key "test"
70
85
  object = 12345
71
- klass.select object
86
+ @instance.select object
72
87
 
73
88
  assert_equal Set["test"], output.keys.to_set
74
89
  assert_equal 12345, output["test"]
75
90
  end
76
91
 
77
92
  test "object is nil" do
78
- klass.add_key "test"
93
+ @instance.add_key "test"
79
94
  object = nil
80
- klass.select object
95
+ @instance.select object
81
96
 
82
97
  assert_equal Set["test"], output.keys.to_set
83
98
  assert_equal nil, output["test"]
@@ -86,64 +101,71 @@ class NestedObjectTest < Test::Unit::TestCase
86
101
 
87
102
  sub_test_case "add_key" do
88
103
  test "add" do
89
- klass.add_key "test"
104
+ @instance.add_key "test"
90
105
  assert_equal ["test"], output_keys
91
- klass.add_key 1
106
+ @instance.add_key 1
92
107
  assert_equal ["test", 1], output_keys
93
- klass.add_key "hoge"
108
+ @instance.add_key "hoge"
94
109
  assert_equal ["test", 1, "hoge"], output_keys
95
110
  end
96
111
  end
97
112
 
98
113
  sub_test_case "pop_key" do
99
114
  test "remove key by pop" do
100
- klass.add_key "test"
101
- klass.add_key 1
102
- klass.add_key "hoge"
115
+ @instance.add_key "test"
116
+ @instance.add_key 1
117
+ @instance.add_key "hoge"
103
118
  assert_equal ["test", 1, "hoge"], output_keys
104
119
 
105
- klass.pop_key
120
+ @instance.pop_key
106
121
  assert_equal ["test", 1], output_keys
107
122
 
108
- klass.pop_key
123
+ @instance.pop_key
109
124
  assert_equal ["test"], output_keys
110
125
 
111
- klass.pop_key
126
+ @instance.pop_key
112
127
  assert_equal [], output_keys
113
128
  end
114
129
 
115
130
  test "without output_keys" do
116
131
  assert_nothing_raised do
117
- klass.pop_key
132
+ @instance.pop_key
118
133
  end
119
134
  end
120
135
  end
121
136
 
122
137
  sub_test_case "current_key" do
123
138
  test "with output_keys" do
124
- klass.add_key "test"
125
- klass.add_key 1
126
- assert_equal "test.1", klass.current_key
139
+ @instance.add_key "test"
140
+ @instance.add_key 1
141
+ assert_equal "test.1", @instance.current_key
127
142
  end
128
143
 
129
144
  test "without output_keys" do
130
- assert_equal "", klass.current_key
145
+ assert_equal "", @instance.current_key
146
+ end
147
+
148
+ test "for not default connector" do
149
+ @instance = klass.new connector: "-"
150
+ @instance.add_key "test"
151
+ @instance.add_key 1
152
+ assert_equal "test-1", @instance.current_key
131
153
  end
132
154
  end
133
155
 
134
156
  sub_test_case "update" do
135
157
  test "with current_key" do
136
- klass.add_key "test"
137
- klass.add_key 1
138
- klass.update 12345
158
+ @instance.add_key "test"
159
+ @instance.add_key 1
160
+ @instance.update 12345
139
161
 
140
162
  assert_equal ["test.1"], output.keys
141
163
  assert_equal 12345, output["test.1"]
142
164
  end
143
165
 
144
166
  test "without current_key" do
145
- assert klass.current_key.empty?
146
- klass.update 12345
167
+ assert @instance.current_key.empty?
168
+ @instance.update 12345
147
169
 
148
170
  assert_equal [], output.keys
149
171
  end
@@ -151,17 +173,17 @@ class NestedObjectTest < Test::Unit::TestCase
151
173
 
152
174
  sub_test_case "convert_hash" do
153
175
  test "hash is blank" do
154
- klass.add_key "test"
176
+ @instance.add_key "test"
155
177
  object = {}
156
- klass.convert_hash object
178
+ @instance.convert_hash object
157
179
  assert_equal ["test"], output.keys
158
180
  assert_equal nil, output["test"]
159
181
  end
160
182
 
161
183
  test "convert" do
162
- klass.add_key "test"
184
+ @instance.add_key "test"
163
185
  object = {"a" => "hoge", "b" => 1, "c" => {"hoge" => "fuga"}, "d" => [10, 20], "e" => nil}
164
- klass.convert_hash object
186
+ @instance.convert_hash object
165
187
  assert_equal ["test.a", "test.b", "test.c.hoge", "test.d.0", "test.d.1", "test.e"], output.keys
166
188
  assert_equal "hoge", output["test.a"]
167
189
  assert_equal 1, output["test.b"]
@@ -174,17 +196,17 @@ class NestedObjectTest < Test::Unit::TestCase
174
196
 
175
197
  sub_test_case "convert_array" do
176
198
  test "array is empty" do
177
- klass.add_key "test"
199
+ @instance.add_key "test"
178
200
  object = []
179
- klass.convert_array object
201
+ @instance.convert_array object
180
202
  assert_equal ["test"], output.keys
181
203
  assert_equal nil, output["test"]
182
204
  end
183
205
 
184
206
  test "convert" do
185
- klass.add_key "test"
207
+ @instance.add_key "test"
186
208
  object = ["hoge", 1, {"hoge" => "fuga"}, [10, 20], nil]
187
- klass.convert_array object
209
+ @instance.convert_array object
188
210
  assert_equal ["test.0", "test.1", "test.2.hoge", "test.3.0", "test.3.1", "test.4"], output.keys
189
211
  assert_equal "hoge", output["test.0"]
190
212
  assert_equal 1, output["test.1"]
@@ -196,11 +218,11 @@ class NestedObjectTest < Test::Unit::TestCase
196
218
  end
197
219
 
198
220
  def output
199
- klass.instance_variable_get :@output
221
+ @instance.output
200
222
  end
201
223
 
202
224
  def output_keys
203
- klass.instance_variable_get :@output_keys
225
+ @instance.output_keys
204
226
  end
205
227
 
206
228
  def klass
@@ -33,13 +33,20 @@ class OutNestedHashTest < Test::Unit::TestCase
33
33
 
34
34
  sub_test_case "configure" do
35
35
  test "check_default" do
36
- create_driver "tag_prefix default"
36
+ driver = create_driver "tag_prefix default"
37
+ assert_equal "default", driver.instance.tag_prefix
38
+ assert_equal nil, driver.instance.connector
37
39
  end
38
40
 
39
- test "tag_prefix" do
41
+ test "with tag_prefix" do
40
42
  driver = create_driver "tag_prefix filtered."
41
43
  assert_equal "filtered.", driver.instance.tag_prefix
42
44
  end
45
+
46
+ test "with connector" do
47
+ driver = create_driver "tag_prefix default\nconnector -"
48
+ assert_equal "-", driver.instance.connector
49
+ end
43
50
  end
44
51
 
45
52
  sub_test_case "emit" do
@@ -60,6 +67,23 @@ class OutNestedHashTest < Test::Unit::TestCase
60
67
  assert_equal expect_message, result[:message]
61
68
  end
62
69
 
70
+ test "with connector" do
71
+ driver = emit "tag_prefix filtered.\nconnector -", "test", [
72
+ {a: 1, b: {c: 2, d: {e: 3, f:4}, g: [10, 20, 30]}, h: [], i: {}},
73
+ {a: {b: {c: 1, d: {e: 2, f:3}, g: [10, 20, 30]}, h: [], i: {}}}
74
+ ]
75
+
76
+ expect_message = {"a" => 1, "b-c" => 2, "b-d-e" => 3, "b-d-f" => 4, "b-g-0" => 10, "b-g-1" => 20, "b-g-2" => 30, "h" => nil, "i" => nil}
77
+ result = emitted driver, 0
78
+ assert_equal "filtered.test", result[:tag]
79
+ assert_equal expect_message, result[:message]
80
+
81
+ expect_message = {"a-b-c" => 1, "a-b-d-e" => 2, "a-b-d-f" => 3, "a-b-g-0" => 10, "a-b-g-1" => 20, "a-b-g-2" => 30, "a-h" => nil, "a-i" => nil}
82
+ result = emitted driver, 1
83
+ assert_equal "filtered.test", result[:tag]
84
+ assert_equal expect_message, result[:message]
85
+ end
86
+
63
87
  test "with invalid record" do
64
88
  driver = emit "tag_prefix filtered.", "test", ["message", {hoge: 1, fuga: {"test0" => 2, "test1" => 3}}]
65
89
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-nested-hash-filter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - sugilog
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-28 00:00:00.000000000 Z
11
+ date: 2015-07-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler