fluent-plugin-rename-key 0.3.4 → 0.4.0
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 +4 -4
- data/.travis.yml +2 -1
- data/README.md +35 -41
- data/fluent-plugin-rename-key.gemspec +4 -4
- data/lib/fluent/plugin/filter_rename_key.rb +9 -8
- data/lib/fluent/plugin/out_rename_key.rb +6 -23
- data/lib/fluent/plugin/rename_key_util.rb +36 -33
- data/test/helper.rb +4 -28
- data/test/plugin/test_filter_rename_key.rb +62 -83
- data/test/plugin/test_out_rename_key.rb +81 -104
- data/test/plugin/test_rename_key_util.rb +32 -0
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 74812e01d25afb405399759e5a33239c1c276965
|
4
|
+
data.tar.gz: e50fd65298761ece7e1b1ec7986b98a859e2fcac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8dd4ac45f8169acb9a340cf7dd1677f7926b77e411404c8e19bef4d682a4936c65ca8c06470ff12c179d6e4dc87936d4dfced5cdb7a8eeac85369c344cb4270a
|
7
|
+
data.tar.gz: 0b566176c5d2c450e79a712087b16ed5bb9c1dbd9fb95a81f6cf3cb0954c9097bb57b521a005221f818bea5f4d819656d590d8f9c2c29e8fc7d2169c8446267d
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -7,89 +7,83 @@
|
|
7
7
|
|
8
8
|
## Overview
|
9
9
|
|
10
|
-
|
10
|
+
This manual is for `~> 0.4.0`, which uses fluentd v0.14 API. For earlier version please see [here](https://github.com/shunwen/fluent-plugin-rename-key/tree/fluentd-v0.12).
|
11
11
|
|
12
|
-
This plugin
|
12
|
+
This plugin renames or replace portion of keys by regular expressions, assign new tags, and re-emits.
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
Install with gem or fluent-gem command as:
|
14
|
+
It was created to work around the [field name restrictions](http://docs.mongodb.org/manual/reference/limits/#Restrictions on Field Names) of MongoDB BSON document. Also see [MongoDB Document Types](http://docs.mongodb.org/meta-driver/latest/legacy/bson/#mongodb-document-types) for more information.
|
17
15
|
|
18
|
-
|
19
|
-
# for fluentd
|
20
|
-
$ gem install fluent-plugin-rename-key
|
16
|
+
## Requirements
|
21
17
|
|
22
|
-
|
23
|
-
$ /usr/local/Cellar/td-agent/1.1.17/bin/fluent-gem install fluent-plugin-rename-key
|
18
|
+
For Fluentd earlier than v0.14.0, please use the earlier version 0.3.4.
|
24
19
|
|
25
|
-
|
26
|
-
|
27
|
-
|
20
|
+
| fluent-plugin-rename-key | Fluentd | ruby |
|
21
|
+
|---------------------------|------------|--------|
|
22
|
+
| ~> 0.3.4 | >= v0.12.0 | >= 1.9 |
|
23
|
+
| ~> 0.4.0 | >= v0.14.0 | >= 2.1 |
|
28
24
|
|
29
|
-
##
|
25
|
+
## Installation
|
30
26
|
|
31
|
-
|
27
|
+
See [Fluentd Installation Guide] (http://docs.fluentd.org/v0.12/categories/installation)
|
32
28
|
|
33
|
-
|
34
|
-
v0.14's filter API has `#filter_with_time` method.
|
29
|
+
## Configuration
|
35
30
|
|
36
31
|
### Syntax
|
37
32
|
|
38
33
|
```
|
39
|
-
# <num> is an integer,
|
40
|
-
# <key_regexp> is the regular expression
|
41
|
-
# <new_key> is the
|
34
|
+
# <num> is an integer for ordering rules, rules are checked in ascending order. Only the first match is applied.
|
35
|
+
# <key_regexp> is the regular expression to match keys, ' '(whitespace) is not allowed, use '\s' instead.
|
36
|
+
# <new_key> is the new key name pattern, MatchData placeholder '${md[1]}' and whitespace are allowed.
|
42
37
|
rename_rule<num> <key_regexp> <new_key>
|
43
38
|
|
44
|
-
# <num> is an integer,
|
45
|
-
# <key_regexp> is the regular expression
|
46
|
-
# <new_key> is the
|
39
|
+
# <num> is an integer for ordering rules, rules are checked in ascending order. Only the first match is applied.
|
40
|
+
# <key_regexp> is the regular expression to match keys, ' '(whitespace) is not allowed, use '\s' instead.
|
41
|
+
# <new_key> is the pattern to replace the matches with, MatchData placeholder '${md[1]}' and whitespace are allowed.
|
42
|
+
# This field is optional, if missing the matches will be replaced with ''(empty string).
|
47
43
|
replace_rule<num> <key_regexp> <new_key>
|
48
44
|
|
49
|
-
# Optional:
|
45
|
+
# Optional: dig into the hash structure and rename every matched key, or stop at the first level,
|
46
|
+
# default is "true"
|
47
|
+
deep_rename <bool>
|
48
|
+
|
49
|
+
# Optional: remove tag prefix. This is only for <match>
|
50
50
|
remove_tag_prefix <string>
|
51
51
|
|
52
|
-
# Optional: append additional name to the original tag, default is
|
52
|
+
# Optional: append additional name to the original tag, default is 'key_renamed'. This is only for <match>
|
53
53
|
append_tag <string>
|
54
|
-
|
55
|
-
# Optional: dig into the hash structure and rename every matched key, or rename only keys at the first level,
|
56
|
-
# default is "true"
|
57
|
-
deep_rename <bool>
|
58
54
|
```
|
59
55
|
|
60
56
|
### Example
|
61
57
|
|
62
58
|
Take this record as example: `'$url' => 'www.google.com', 'level2' => {'$1' => 'option1'}`.
|
63
|
-
To
|
59
|
+
To save it to MongoDB, we can use the following config to replace the keys starting with dollar sign.
|
60
|
+
|
61
|
+
For Fluentd v0.14 or later, use `rename_key` filter:
|
64
62
|
|
65
63
|
```
|
66
64
|
# At rename_rule1, it matches the key starting the '$', say '$url',
|
67
65
|
# and puts the following characters into match group 1.
|
68
66
|
# Then uses the content in match group 1, ${md[1]} = 'url', to generate the new key name 'x$url'.
|
69
67
|
|
70
|
-
<
|
71
|
-
type rename_key
|
72
|
-
remove_tag_prefix input.test
|
73
|
-
append_tag renamed
|
68
|
+
<filter input.test>
|
69
|
+
@type rename_key
|
74
70
|
rename_rule1 ^\$(.+) x$${md[1]}
|
75
71
|
rename_rule2 ^l(.{3})l(\d+) ${md[1]}_${md[2]}
|
76
72
|
</match>
|
77
73
|
```
|
78
74
|
|
79
|
-
The
|
75
|
+
The result is `'x$url' => 'www.google.com', 'eve_2' => {'x$1' => 'option1'}`.
|
80
76
|
|
81
77
|
### MatchData placeholder
|
82
78
|
|
83
|
-
This plugin uses
|
79
|
+
This plugin uses `String#match` to match keys to be replaced. It is possible to reference the resulting `MatchData` in new key names. For example, `${md[0]}` is the matched string, `${md[1]}` is match group 1, and so on.
|
84
80
|
|
85
|
-
**Note:**
|
81
|
+
**Note:** This is done by matching `${md[0]}` string pattern, so array operations such as range `${md[0..2]}` is not supported.
|
86
82
|
|
87
|
-
##
|
88
|
-
|
89
|
-
Pull requests are very welcome!!
|
83
|
+
## Inspired by
|
84
|
+
This plugin initially resembled the implementation of [fluent-plugin-rewrite-tag-filter](https://github.com/y-ken/fluent-plugin-rewrite-tag-filter).
|
90
85
|
|
91
86
|
## Copyright
|
92
87
|
|
93
88
|
Copyright : Copyright (c) 2013- Shunwen Hsiao (@hswtw)
|
94
89
|
License : Apache License, Version 2.0
|
95
|
-
|
@@ -3,20 +3,20 @@ $:.push File.expand_path('../lib', __FILE__)
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = 'fluent-plugin-rename-key'
|
6
|
-
s.version = '0.
|
7
|
-
s.date = '
|
6
|
+
s.version = '0.4.0'
|
7
|
+
s.date = '2017-02-27'
|
8
8
|
s.license = 'Apache-2.0'
|
9
9
|
s.authors = ['Shunwen Hsiao', 'Julian Grinblat', 'Hiroshi Hatake']
|
10
10
|
s.email = ['hsiaoshunwen@gmail.com']
|
11
11
|
s.homepage = 'https://github.com/shunwen/fluent-plugin-rename-key'
|
12
12
|
s.summary = %q[Fluentd output plugin. Rename keys which match given regular expressions, assign new tags and re-emit the records.]
|
13
13
|
|
14
|
-
s.required_ruby_version = '>= 1.
|
14
|
+
s.required_ruby_version = '>= 2.1.0'
|
15
15
|
s.files = `git ls-files`.split("\n")
|
16
16
|
s.test_files = `git ls-files -- {test}/*`.split("\n")
|
17
17
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
18
18
|
s.require_paths = ['lib']
|
19
|
-
s.add_runtime_dependency 'fluentd', ">= 0.
|
19
|
+
s.add_runtime_dependency 'fluentd', ">= 0.14.0", "< 2"
|
20
20
|
s.add_development_dependency 'test-unit', '~> 3.2'
|
21
21
|
s.add_development_dependency 'rake', '~> 11.3'
|
22
22
|
s.add_development_dependency 'coveralls', '~> 0.8'
|
@@ -1,9 +1,10 @@
|
|
1
|
+
require 'fluent/plugin/filter'
|
1
2
|
require 'fluent/plugin/rename_key_util'
|
2
3
|
|
3
|
-
class Fluent::RenameKeyFilter < Fluent::Filter
|
4
|
+
class Fluent::Plugin::RenameKeyFilter < Fluent::Plugin::Filter
|
4
5
|
Fluent::Plugin.register_filter 'rename_key', self
|
5
6
|
|
6
|
-
include Fluent::RenameKeyUtil
|
7
|
+
include Fluent::Plugin::RenameKeyUtil
|
7
8
|
|
8
9
|
desc 'Deep rename/replace operation.'
|
9
10
|
config_param :deep_rename, :bool, default: true
|
@@ -14,12 +15,12 @@ class Fluent::RenameKeyFilter < Fluent::Filter
|
|
14
15
|
create_rename_rules(conf)
|
15
16
|
create_replace_rules(conf)
|
16
17
|
|
17
|
-
|
18
|
+
if @rename_rules.empty? && @replace_rules.empty?
|
19
|
+
raise Fluent::ConfigError, 'No rename nor replace rule given'
|
20
|
+
end
|
18
21
|
end
|
19
22
|
|
20
|
-
def filter
|
21
|
-
|
22
|
-
new_record = replace_key new_record
|
23
|
-
new_record
|
23
|
+
def filter _tag, _time, record
|
24
|
+
replace_key(rename_key(record))
|
24
25
|
end
|
25
|
-
end
|
26
|
+
end
|
@@ -1,27 +1,12 @@
|
|
1
|
+
require 'fluent/plugin/output'
|
1
2
|
require 'fluent/plugin/rename_key_util'
|
2
3
|
|
3
|
-
class Fluent::RenameKeyOutput < Fluent::Output
|
4
|
+
class Fluent::Plugin::RenameKeyOutput < Fluent::Plugin::Output
|
4
5
|
Fluent::Plugin.register_output 'rename_key', self
|
5
6
|
|
6
|
-
|
7
|
+
helpers :event_emitter
|
7
8
|
|
8
|
-
|
9
|
-
unless method_defined?(:router)
|
10
|
-
define_method("router") { Fluent::Engine }
|
11
|
-
end
|
12
|
-
|
13
|
-
# Define `log` method for v0.10.42 or earlier
|
14
|
-
unless method_defined?(:log)
|
15
|
-
define_method("log") { $log }
|
16
|
-
end
|
17
|
-
|
18
|
-
# For fluentd v0.12.16 or earlier
|
19
|
-
class << self
|
20
|
-
unless method_defined?(:desc)
|
21
|
-
def desc(description)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
9
|
+
include Fluent::Plugin::RenameKeyUtil
|
25
10
|
|
26
11
|
DEFAULT_APPEND_TAG = 'key_renamed'
|
27
12
|
|
@@ -38,12 +23,12 @@ class Fluent::RenameKeyOutput < Fluent::Output
|
|
38
23
|
create_rename_rules(conf)
|
39
24
|
create_replace_rules(conf)
|
40
25
|
|
41
|
-
raise Fluent::ConfigError,
|
26
|
+
raise Fluent::ConfigError, 'No rename nor replace rules are given' if @rename_rules.empty? && @replace_rules.empty?
|
42
27
|
|
43
28
|
@remove_tag_prefix = /^#{Regexp.escape @remove_tag_prefix}\.?/ if @remove_tag_prefix
|
44
29
|
end
|
45
30
|
|
46
|
-
def
|
31
|
+
def process tag, es
|
47
32
|
es.each do |time, record|
|
48
33
|
new_tag = @remove_tag_prefix ? tag.sub(@remove_tag_prefix, '') : tag
|
49
34
|
new_tag = "#{new_tag}.#{@append_tag}".sub(/^\./, '')
|
@@ -51,7 +36,5 @@ class Fluent::RenameKeyOutput < Fluent::Output
|
|
51
36
|
new_record = replace_key new_record
|
52
37
|
router.emit new_tag, time, new_record
|
53
38
|
end
|
54
|
-
|
55
|
-
chain.next
|
56
39
|
end
|
57
40
|
end
|
@@ -1,55 +1,42 @@
|
|
1
|
-
module Fluent
|
1
|
+
module Fluent::Plugin
|
2
2
|
module RenameKeyUtil
|
3
|
+
CONF_RENAME = 'rename_rule'
|
4
|
+
CONF_REPLACE = 'replace_rule'
|
5
|
+
|
3
6
|
def create_rename_rules(conf)
|
4
7
|
@rename_rules = []
|
5
|
-
|
6
|
-
|
7
|
-
key_regexp, new_key = parse_rename_rule conf[r]
|
8
|
+
rule_keys = conf.keys.select { |k| k.strip.start_with? CONF_RENAME }.
|
9
|
+
sort_by { |k| k.sub(CONF_RENAME, '').to_i }
|
8
10
|
|
9
|
-
|
10
|
-
|
11
|
-
end
|
11
|
+
rule_keys.each do |rule_key|
|
12
|
+
rule = parse_rename_rule conf[rule_key]
|
12
13
|
|
13
|
-
if @rename_rules.
|
14
|
-
raise Fluent::ConfigError, "Duplicated rules for key #{key_regexp}: #{@rename_rules}"
|
14
|
+
if @rename_rules.any? { |existing_rule| existing_rule[:key_regexp] == rule[:key_regexp] }
|
15
|
+
raise Fluent::ConfigError, "Duplicated rules for key #{rule[:key_regexp].source}: #{@rename_rules}"
|
15
16
|
end
|
16
17
|
|
17
|
-
@rename_rules <<
|
18
|
-
log.info "Added rename key rule: #{
|
18
|
+
@rename_rules << rule
|
19
|
+
log.info "Added rename key rule: #{rule_key} #{@rename_rules.last}"
|
19
20
|
end
|
20
21
|
end
|
21
22
|
|
22
23
|
def create_replace_rules(conf)
|
23
24
|
@replace_rules = []
|
24
|
-
|
25
|
-
|
26
|
-
key_regexp, replacement = parse_replace_rule conf[r]
|
25
|
+
rule_keys = conf.keys.select { |k| k.strip.start_with? CONF_REPLACE }.
|
26
|
+
sort_by { |k| k.sub(CONF_REPLACE, '').to_i }
|
27
27
|
|
28
|
-
|
29
|
-
|
30
|
-
end
|
31
|
-
|
32
|
-
if replacement.nil?
|
33
|
-
replacement = ""
|
34
|
-
end
|
28
|
+
rule_keys.each do |rule_key|
|
29
|
+
rule = parse_replace_rule conf[rule_key]
|
35
30
|
|
36
|
-
if @replace_rules.
|
37
|
-
raise Fluent::ConfigError, "Duplicated rules for key #{key_regexp}: #{@replace_rules}"
|
31
|
+
if @replace_rules.any? { |existing_rule| existing_rule[:key_regexp] == rule[:key_regexp] }
|
32
|
+
raise Fluent::ConfigError, "Duplicated rules for key #{rule[:key_regexp].source}: #{@replace_rules}"
|
38
33
|
end
|
39
34
|
|
40
|
-
@replace_rules <<
|
41
|
-
log.info "Added replace key rule: #{
|
35
|
+
@replace_rules << rule
|
36
|
+
log.info "Added replace key rule: #{rule_key} #{@replace_rules.last}"
|
42
37
|
end
|
43
38
|
end
|
44
39
|
|
45
|
-
def parse_rename_rule rule
|
46
|
-
$~.captures if rule.match /^([^\s]+)\s+(.+)$/
|
47
|
-
end
|
48
|
-
|
49
|
-
def parse_replace_rule rule
|
50
|
-
$~.captures if rule.match /^([^\s]+)(?:\s+(.+))?$/
|
51
|
-
end
|
52
|
-
|
53
40
|
def rename_key record
|
54
41
|
new_record = {}
|
55
42
|
|
@@ -106,6 +93,22 @@ module Fluent
|
|
106
93
|
new_record
|
107
94
|
end
|
108
95
|
|
96
|
+
private
|
97
|
+
|
98
|
+
def parse_rename_rule rule
|
99
|
+
m = rule.match(/^([^\s]+)\s+(.+)$/).captures
|
100
|
+
{ key_regexp: /#{m[0]}/, new_key: m[1] }
|
101
|
+
rescue => e
|
102
|
+
raise Fluent::ConfigError, "Failed to parse rename rule #{rule} : #{e.message}"
|
103
|
+
end
|
104
|
+
|
105
|
+
def parse_replace_rule rule
|
106
|
+
m = rule.match(/^([^\s]+)(?:\s+(.+))?$/).captures
|
107
|
+
{ key_regexp: /#{m[0]}/, replacement: m[1] || '' }
|
108
|
+
rescue => e
|
109
|
+
raise Fluent::ConfigError, "Failed to parse replace rule #{rule} : #{e.message}"
|
110
|
+
end
|
111
|
+
|
109
112
|
def get_placeholder match_data
|
110
113
|
placeholder = {}
|
111
114
|
|
data/test/helper.rb
CHANGED
@@ -1,31 +1,7 @@
|
|
1
|
-
require '
|
2
|
-
require 'bundler'
|
3
|
-
begin
|
4
|
-
Bundler.setup(:default, :development)
|
5
|
-
rescue Bundler::BundlerError => e
|
6
|
-
$stderr.puts e.message
|
7
|
-
$stderr.puts "Run `bundle install` to install missing gems"
|
8
|
-
exit e.status_code
|
9
|
-
end
|
1
|
+
require 'bundler/setup'
|
10
2
|
require 'test/unit'
|
11
3
|
|
12
|
-
$LOAD_PATH.unshift(File.join(
|
13
|
-
$LOAD_PATH.unshift(
|
4
|
+
$LOAD_PATH.unshift(File.join(__dir__, '..', 'lib'))
|
5
|
+
$LOAD_PATH.unshift(__dir__)
|
14
6
|
require 'fluent/test'
|
15
|
-
|
16
|
-
nulllogger = Object.new
|
17
|
-
nulllogger.instance_eval {|obj|
|
18
|
-
def method_missing(method, *args)
|
19
|
-
# pass
|
20
|
-
end
|
21
|
-
}
|
22
|
-
$log = nulllogger
|
23
|
-
end
|
24
|
-
|
25
|
-
require 'fluent/plugin/out_rename_key'
|
26
|
-
if defined?(Fluent::Filter)
|
27
|
-
require 'fluent/plugin/filter_rename_key'
|
28
|
-
end
|
29
|
-
|
30
|
-
class Test::Unit::TestCase
|
31
|
-
end
|
7
|
+
require 'fluent/test/helpers'
|
@@ -1,4 +1,6 @@
|
|
1
1
|
require 'helper'
|
2
|
+
require 'fluent/test/driver/filter'
|
3
|
+
require 'fluent/plugin/filter_rename_key'
|
2
4
|
|
3
5
|
class RenameKeyFilterTest < Test::Unit::TestCase
|
4
6
|
MATCH_TAG = 'incoming_tag'
|
@@ -6,12 +8,11 @@ class RenameKeyFilterTest < Test::Unit::TestCase
|
|
6
8
|
REPLACE_RULE_CONFIG = 'replace_rule1 ^\$ x'
|
7
9
|
|
8
10
|
def setup
|
9
|
-
omit("Fluentd v0.12 or later is required.") unless defined?(Fluent::Filter)
|
10
11
|
Fluent::Test.setup
|
11
12
|
end
|
12
13
|
|
13
|
-
def create_driver(conf
|
14
|
-
Fluent::Test::
|
14
|
+
def create_driver(conf)
|
15
|
+
Fluent::Test::Driver::Filter.new(Fluent::Plugin::RenameKeyFilter).configure(conf)
|
15
16
|
end
|
16
17
|
|
17
18
|
def test_config_error
|
@@ -39,50 +40,28 @@ class RenameKeyFilterTest < Test::Unit::TestCase
|
|
39
40
|
assert_equal '^\$(.+)2(\d+) ${md[1]}_${md[2]}', d.instance.config['rename_rule2']
|
40
41
|
end
|
41
42
|
|
42
|
-
def test_parse_rename_rule
|
43
|
-
parsed = Fluent::RenameKeyOutput.new.parse_rename_rule '(reg)(exp) ${md[1]} ${md[2]}'
|
44
|
-
assert_equal 2, parsed.length
|
45
|
-
assert_equal '(reg)(exp)', parsed[0]
|
46
|
-
assert_equal '${md[1]} ${md[2]}', parsed[1]
|
47
|
-
end
|
48
|
-
|
49
|
-
def test_parse_replace_rule_with_replacement
|
50
|
-
# Replace hyphens with underscores
|
51
|
-
parsed = Fluent::RenameKeyOutput.new.parse_replace_rule '- _'
|
52
|
-
assert_equal 2, parsed.length
|
53
|
-
assert_equal '-', parsed[0]
|
54
|
-
assert_equal '_', parsed[1]
|
55
|
-
end
|
56
|
-
|
57
|
-
def test_parse_replace_rule_without_replacement
|
58
|
-
# Remove all parenthesis hyphens and spaces
|
59
|
-
parsed = Fluent::RenameKeyOutput.new.parse_replace_rule '[()-\s]'
|
60
|
-
assert_equal 2, parsed.length
|
61
|
-
assert_equal '[()-\s]', parsed[0]
|
62
|
-
assert parsed[1].nil?
|
63
|
-
end
|
64
43
|
|
65
44
|
def test_rename_rule_emit_deep_rename_hash
|
66
45
|
d = create_driver RENAME_RULE_CONFIG
|
67
|
-
d.run do
|
68
|
-
d.
|
46
|
+
d.run default_tag: MATCH_TAG do
|
47
|
+
d.feed '$key1' => 'value1', 'key2' => {'$key3' => 'value3', '$key4'=> {'$key5' => 'value5'} }
|
69
48
|
end
|
70
49
|
|
71
|
-
|
72
|
-
assert_equal %w[x$key1 key2],
|
73
|
-
assert_equal %w[x$key3 x$key4],
|
74
|
-
assert_equal ['x$key5'],
|
50
|
+
records = d.filtered_records
|
51
|
+
assert_equal %w[x$key1 key2], records[0].keys
|
52
|
+
assert_equal %w[x$key3 x$key4], records[0]['key2'].keys
|
53
|
+
assert_equal ['x$key5'], records[0]['key2']['x$key4'].keys
|
75
54
|
end
|
76
55
|
|
77
56
|
def test_rename_rule_emit_deep_rename_array
|
78
57
|
d = create_driver RENAME_RULE_CONFIG
|
79
|
-
d.run do
|
80
|
-
d.
|
58
|
+
d.run default_tag: MATCH_TAG do
|
59
|
+
d.feed '$key1' => 'value1', 'key2' => [{'$key3' => 'value3'}, {'$key4'=> {'$key5' => 'value5'}}]
|
81
60
|
end
|
82
61
|
|
83
|
-
|
84
|
-
assert_equal %w[x$key3 x$key4],
|
85
|
-
assert_equal ['x$key5'],
|
62
|
+
records = d.filtered_records
|
63
|
+
assert_equal %w[x$key3 x$key4], records[0]['key2'].flat_map(&:keys)
|
64
|
+
assert_equal ['x$key5'], records[0]['key2'][1]['x$key4'].keys
|
86
65
|
end
|
87
66
|
|
88
67
|
def test_rename_rule_emit_deep_rename_off
|
@@ -92,22 +71,22 @@ class RenameKeyFilterTest < Test::Unit::TestCase
|
|
92
71
|
]
|
93
72
|
|
94
73
|
d = create_driver config
|
95
|
-
d.run do
|
96
|
-
d.
|
74
|
+
d.run default_tag: MATCH_TAG do
|
75
|
+
d.feed '$key1' => 'value1', 'key2' => {'$key3'=>'value3', '$key4'=> 'value4'}
|
97
76
|
end
|
98
77
|
|
99
|
-
|
100
|
-
assert_equal %w[$key3 $key4],
|
78
|
+
records = d.filtered_records
|
79
|
+
assert_equal %w[$key3 $key4], records[0]['key2'].keys
|
101
80
|
end
|
102
81
|
|
103
82
|
def test_rename_rule_emit_with_match_data
|
104
83
|
d = create_driver 'rename_rule1 (\w+)\s(\w+)\s(\w+) ${md[3]} ${md[2]} ${md[1]}'
|
105
|
-
d.run do
|
106
|
-
d.
|
84
|
+
d.run default_tag: MATCH_TAG do
|
85
|
+
d.feed 'key1 key2 key3' => 'value'
|
107
86
|
end
|
108
|
-
|
109
|
-
assert_equal 1,
|
110
|
-
assert_equal ['key3 key2 key1'],
|
87
|
+
records = d.filtered_records
|
88
|
+
assert_equal 1, records.length
|
89
|
+
assert_equal ['key3 key2 key1'], records[0].keys
|
111
90
|
end
|
112
91
|
|
113
92
|
def test_multiple_rename_rules_emit
|
@@ -117,45 +96,45 @@ class RenameKeyFilterTest < Test::Unit::TestCase
|
|
117
96
|
]
|
118
97
|
|
119
98
|
d = create_driver config_multiple_rules
|
120
|
-
d.run do
|
121
|
-
d.
|
99
|
+
d.run default_tag: MATCH_TAG do
|
100
|
+
d.feed 'key 1' => 'value1', 'key 2' => 'value2'
|
122
101
|
end
|
123
102
|
|
124
|
-
|
125
|
-
assert_equal %w[key_1 key_2],
|
103
|
+
records = d.filtered_records
|
104
|
+
assert_equal %w[key_1 key_2], records[0].keys
|
126
105
|
end
|
127
106
|
|
128
107
|
def test_replace_rule_emit_deep_rename_hash
|
129
108
|
d = create_driver 'replace_rule1 ^(\$) x'
|
130
109
|
|
131
|
-
d.run do
|
132
|
-
d.
|
110
|
+
d.run default_tag: MATCH_TAG do
|
111
|
+
d.feed '$key1' => 'value1', 'key2' => { 'key3' => 'value3', '$key4' => 'value4' }
|
133
112
|
end
|
134
|
-
|
135
|
-
assert_equal %w[xkey1 key2],
|
136
|
-
assert_equal %w[key3 xkey4],
|
113
|
+
records = d.filtered_records
|
114
|
+
assert_equal %w[xkey1 key2], records[0].keys
|
115
|
+
assert_equal %w[key3 xkey4], records[0]['key2'].keys
|
137
116
|
end
|
138
117
|
|
139
118
|
def test_replace_rule_emit_with_match_data
|
140
119
|
d = create_driver 'rename_rule1 (\w+)\s(\w+)\s(\w+) ${md[3]} ${md[2]} ${md[1]}'
|
141
|
-
d.run do
|
142
|
-
d.
|
120
|
+
d.run default_tag: MATCH_TAG do
|
121
|
+
d.feed 'key1 key2 key3' => 'value'
|
143
122
|
end
|
144
|
-
|
145
|
-
assert_equal 1,
|
146
|
-
assert_equal ['key3 key2 key1'],
|
123
|
+
records = d.filtered_records
|
124
|
+
assert_equal 1, records.length
|
125
|
+
assert_equal ['key3 key2 key1'], records[0].keys
|
147
126
|
end
|
148
127
|
|
149
128
|
def test_replace_rule_emit_deep_rename_array
|
150
129
|
d = create_driver 'replace_rule1 ^(\$) x${md[1]}'
|
151
130
|
|
152
|
-
d.run do
|
153
|
-
d.
|
131
|
+
d.run default_tag: MATCH_TAG do
|
132
|
+
d.feed '$key1' => 'value1', 'key2' => [{'$key3' => 'value3'}, {'$key4' => {'$key5' => 'value5'}}]
|
154
133
|
end
|
155
134
|
|
156
|
-
|
157
|
-
assert_equal %w[x$key3 x$key4],
|
158
|
-
assert_equal %w[x$key5],
|
135
|
+
records = d.filtered_records
|
136
|
+
assert_equal %w[x$key3 x$key4], records[0]['key2'].flat_map(&:keys)
|
137
|
+
assert_equal %w[x$key5], records[0]['key2'][1]['x$key4'].keys
|
159
138
|
end
|
160
139
|
|
161
140
|
def test_replace_rule_emit_deep_rename_off
|
@@ -165,51 +144,51 @@ class RenameKeyFilterTest < Test::Unit::TestCase
|
|
165
144
|
]
|
166
145
|
|
167
146
|
d = create_driver config
|
168
|
-
d.run do
|
169
|
-
d.
|
147
|
+
d.run default_tag: MATCH_TAG do
|
148
|
+
d.feed '$key1' => 'value1', 'key2' => {'$key3'=>'value3', '$key4'=> 'value4'}
|
170
149
|
end
|
171
150
|
|
172
|
-
|
173
|
-
assert_equal %w[$key3 $key4],
|
151
|
+
records = d.filtered_records
|
152
|
+
assert_equal %w[$key3 $key4], records[0]['key2'].keys
|
174
153
|
end
|
175
154
|
|
176
155
|
def test_replace_rule_emit_remove_matched_when_no_replacement
|
177
|
-
d = create_driver 'replace_rule1 [
|
178
|
-
d.run do
|
179
|
-
d.
|
156
|
+
d = create_driver 'replace_rule1 "[\\\\s/()]"'
|
157
|
+
d.run default_tag: MATCH_TAG do
|
158
|
+
d.feed 'key (/1 )' => 'value1'
|
180
159
|
end
|
181
160
|
|
182
|
-
|
183
|
-
assert_equal %w[key1],
|
161
|
+
records = d.filtered_records
|
162
|
+
assert_equal %w[key1], records[0].keys
|
184
163
|
end
|
185
164
|
|
186
165
|
def test_multiple_replace_rules_emit
|
187
166
|
config_multiple_rules = %q[
|
188
167
|
replace_rule1 ^(\w+)\s(\d) ${md[1]}${md[2]}
|
189
|
-
replace_rule2 [
|
168
|
+
replace_rule2 "[\\\\s()]"
|
190
169
|
]
|
191
170
|
|
192
171
|
d = create_driver config_multiple_rules
|
193
|
-
d.run do
|
194
|
-
d.
|
172
|
+
d.run default_tag: MATCH_TAG do
|
173
|
+
d.feed 'key 1' => 'value1', 'key (2)' => 'value2'
|
195
174
|
end
|
196
175
|
|
197
|
-
|
198
|
-
assert_equal %w[key1 key2],
|
176
|
+
records = d.filtered_records
|
177
|
+
assert_equal %w[key1 key2], records[0].keys
|
199
178
|
end
|
200
179
|
|
201
180
|
def test_combined_rename_rule_and_replace_rule
|
202
181
|
config_combined_rules = %q[
|
203
182
|
rename_rule1 ^(.+)\s(one) ${md[1]}1
|
204
|
-
replace_rule2 [
|
183
|
+
replace_rule2 "[\\\\s()]"
|
205
184
|
]
|
206
185
|
|
207
186
|
d = create_driver config_combined_rules
|
208
|
-
d.run do
|
209
|
-
d.
|
187
|
+
d.run default_tag: MATCH_TAG do
|
188
|
+
d.feed '(key) one (x)' => 'value1', 'key (2)' => 'value2'
|
210
189
|
end
|
211
190
|
|
212
|
-
|
213
|
-
assert_equal %w[key1 key2],
|
191
|
+
records = d.filtered_records
|
192
|
+
assert_equal %w[key1 key2], records[0].keys
|
214
193
|
end
|
215
194
|
end
|
@@ -1,4 +1,6 @@
|
|
1
1
|
require 'helper'
|
2
|
+
require 'fluent/plugin/out_rename_key'
|
3
|
+
require 'fluent/test/driver/output'
|
2
4
|
|
3
5
|
class RenameKeyOutputTest < Test::Unit::TestCase
|
4
6
|
MATCH_TAG = 'incoming_tag'
|
@@ -9,15 +11,13 @@ class RenameKeyOutputTest < Test::Unit::TestCase
|
|
9
11
|
Fluent::Test.setup
|
10
12
|
end
|
11
13
|
|
12
|
-
def create_driver(conf
|
13
|
-
Fluent::Test::
|
14
|
+
def create_driver(conf)
|
15
|
+
Fluent::Test::Driver::Output.new(Fluent::Plugin::RenameKeyOutput).configure(conf)
|
14
16
|
end
|
15
17
|
|
16
18
|
def test_config_error
|
17
19
|
assert_raise(Fluent::ConfigError) { create_driver('') }
|
18
|
-
|
19
20
|
assert_raise(Fluent::ConfigError) { create_driver('rename_rule1 ^$(.+?) ') }
|
20
|
-
|
21
21
|
assert_raise(Fluent::ConfigError) {
|
22
22
|
config_dup_rules_for_a_key = %q[
|
23
23
|
rename_rule1 ^\$(.+) ${md[1]}
|
@@ -38,39 +38,16 @@ class RenameKeyOutputTest < Test::Unit::TestCase
|
|
38
38
|
assert_equal '^\$(.+)2(\d+) ${md[1]}_${md[2]}', d.instance.config['rename_rule2']
|
39
39
|
end
|
40
40
|
|
41
|
-
def test_parse_rename_rule
|
42
|
-
parsed = Fluent::RenameKeyOutput.new.parse_rename_rule '(reg)(exp) ${md[1]} ${md[2]}'
|
43
|
-
assert_equal 2, parsed.length
|
44
|
-
assert_equal '(reg)(exp)', parsed[0]
|
45
|
-
assert_equal '${md[1]} ${md[2]}', parsed[1]
|
46
|
-
end
|
47
|
-
|
48
|
-
def test_parse_replace_rule_with_replacement
|
49
|
-
# Replace hyphens with underscores
|
50
|
-
parsed = Fluent::RenameKeyOutput.new.parse_replace_rule '- _'
|
51
|
-
assert_equal 2, parsed.length
|
52
|
-
assert_equal '-', parsed[0]
|
53
|
-
assert_equal '_', parsed[1]
|
54
|
-
end
|
55
|
-
|
56
|
-
def test_parse_replace_rule_without_replacement
|
57
|
-
# Remove all parethesis hyphens and spaces
|
58
|
-
parsed = Fluent::RenameKeyOutput.new.parse_replace_rule '[()-\s]'
|
59
|
-
assert_equal 2, parsed.length
|
60
|
-
assert_equal '[()-\s]', parsed[0]
|
61
|
-
assert parsed[1].nil?
|
62
|
-
end
|
63
|
-
|
64
41
|
def test_emit_default_append_tag
|
65
|
-
append_tag = Fluent::RenameKeyOutput::DEFAULT_APPEND_TAG
|
42
|
+
append_tag = Fluent::Plugin::RenameKeyOutput::DEFAULT_APPEND_TAG
|
66
43
|
d = create_driver RENAME_RULE_CONFIG
|
67
|
-
d.run do
|
68
|
-
d.
|
44
|
+
d.run default_tag: MATCH_TAG do
|
45
|
+
d.feed '$key1' => 'value1', '%key2' => {'$key3'=>'123', '$key4'=> {'$key5' => 'value2'} }
|
69
46
|
end
|
70
47
|
|
71
|
-
|
72
|
-
assert_equal 1,
|
73
|
-
assert_equal "#{MATCH_TAG}.#{append_tag}",
|
48
|
+
events = d.events
|
49
|
+
assert_equal 1, events.length
|
50
|
+
assert_equal "#{MATCH_TAG}.#{append_tag}", events[0][0]
|
74
51
|
end
|
75
52
|
|
76
53
|
def test_emit_append_custom_tag
|
@@ -81,17 +58,17 @@ class RenameKeyOutputTest < Test::Unit::TestCase
|
|
81
58
|
]
|
82
59
|
d = create_driver config
|
83
60
|
|
84
|
-
d.run do
|
85
|
-
d.
|
61
|
+
d.run default_tag: MATCH_TAG do
|
62
|
+
d.feed '$key1' => 'value1', '%key2' => {'$key3'=>'123', '$key4'=> {'$key5' => 'value2'} }
|
86
63
|
end
|
87
64
|
|
88
|
-
|
89
|
-
assert_equal 1,
|
90
|
-
assert_equal "#{MATCH_TAG}.#{custom_tag}",
|
65
|
+
events = d.events
|
66
|
+
assert_equal 1, events.length
|
67
|
+
assert_equal "#{MATCH_TAG}.#{custom_tag}", events[0][0]
|
91
68
|
end
|
92
69
|
|
93
70
|
def test_remove_tag_prefix
|
94
|
-
append_tag = Fluent::RenameKeyOutput::DEFAULT_APPEND_TAG
|
71
|
+
append_tag = Fluent::Plugin::RenameKeyOutput::DEFAULT_APPEND_TAG
|
95
72
|
|
96
73
|
config = %Q[
|
97
74
|
#{RENAME_RULE_CONFIG}
|
@@ -99,38 +76,38 @@ class RenameKeyOutputTest < Test::Unit::TestCase
|
|
99
76
|
]
|
100
77
|
|
101
78
|
d = create_driver config
|
102
|
-
d.run do
|
103
|
-
d.
|
104
|
-
d.
|
79
|
+
d.run default_tag: MATCH_TAG do
|
80
|
+
d.feed 'key1' => 'value1'
|
81
|
+
d.feed '$key2' => 'value2'
|
105
82
|
end
|
106
83
|
|
107
|
-
|
108
|
-
assert_equal 2,
|
109
|
-
assert_equal append_tag,
|
110
|
-
assert_equal append_tag,
|
84
|
+
events = d.events
|
85
|
+
assert_equal 2, events.length
|
86
|
+
assert_equal append_tag, events[0][0]
|
87
|
+
assert_equal append_tag, events[1][0]
|
111
88
|
end
|
112
89
|
|
113
90
|
def test_rename_rule_emit_deep_rename_hash
|
114
91
|
d = create_driver RENAME_RULE_CONFIG
|
115
|
-
d.run do
|
116
|
-
d.
|
92
|
+
d.run default_tag: MATCH_TAG do
|
93
|
+
d.feed '$key1' => 'value1', 'key2' => {'$key3' => 'value3', '$key4'=> {'$key5' => 'value5'} }
|
117
94
|
end
|
118
95
|
|
119
|
-
|
120
|
-
assert_equal %w[x$key1 key2],
|
121
|
-
assert_equal %w[x$key3 x$key4],
|
122
|
-
assert_equal ['x$key5'],
|
96
|
+
events = d.events
|
97
|
+
assert_equal %w[x$key1 key2], events[0][2].keys
|
98
|
+
assert_equal %w[x$key3 x$key4], events[0][2]['key2'].keys
|
99
|
+
assert_equal ['x$key5'], events[0][2]['key2']['x$key4'].keys
|
123
100
|
end
|
124
101
|
|
125
102
|
def test_rename_rule_emit_deep_rename_array
|
126
103
|
d = create_driver RENAME_RULE_CONFIG
|
127
|
-
d.run do
|
128
|
-
d.
|
104
|
+
d.run default_tag: MATCH_TAG do
|
105
|
+
d.feed '$key1' => 'value1', 'key2' => [{'$key3' => 'value3'}, {'$key4'=> {'$key5' => 'value5'}}]
|
129
106
|
end
|
130
107
|
|
131
|
-
|
132
|
-
assert_equal %w[x$key3 x$key4],
|
133
|
-
assert_equal ['x$key5'],
|
108
|
+
events = d.events
|
109
|
+
assert_equal %w[x$key3 x$key4], events[0][2]['key2'].flat_map(&:keys)
|
110
|
+
assert_equal ['x$key5'], events[0][2]['key2'][1]['x$key4'].keys
|
134
111
|
end
|
135
112
|
|
136
113
|
def test_rename_rule_emit_deep_rename_off
|
@@ -140,22 +117,22 @@ class RenameKeyOutputTest < Test::Unit::TestCase
|
|
140
117
|
]
|
141
118
|
|
142
119
|
d = create_driver config
|
143
|
-
d.run do
|
144
|
-
d.
|
120
|
+
d.run default_tag: MATCH_TAG do
|
121
|
+
d.feed '$key1' => 'value1', 'key2' => {'$key3'=>'value3', '$key4'=> 'value4'}
|
145
122
|
end
|
146
123
|
|
147
|
-
|
148
|
-
assert_equal %w[$key3 $key4],
|
124
|
+
events = d.events
|
125
|
+
assert_equal %w[$key3 $key4], events[0][2]['key2'].keys
|
149
126
|
end
|
150
127
|
|
151
128
|
def test_rename_rule_emit_with_match_data
|
152
129
|
d = create_driver 'rename_rule1 (\w+)\s(\w+)\s(\w+) ${md[3]} ${md[2]} ${md[1]}'
|
153
|
-
d.run do
|
154
|
-
d.
|
130
|
+
d.run default_tag: MATCH_TAG do
|
131
|
+
d.feed 'key1 key2 key3' => 'value'
|
155
132
|
end
|
156
|
-
|
157
|
-
assert_equal 1,
|
158
|
-
assert_equal ['key3 key2 key1'],
|
133
|
+
events = d.events
|
134
|
+
assert_equal 1, events.length
|
135
|
+
assert_equal ['key3 key2 key1'], events[0][2].keys
|
159
136
|
end
|
160
137
|
|
161
138
|
def test_multiple_rename_rules_emit
|
@@ -165,45 +142,45 @@ class RenameKeyOutputTest < Test::Unit::TestCase
|
|
165
142
|
]
|
166
143
|
|
167
144
|
d = create_driver config_multiple_rules
|
168
|
-
d.run do
|
169
|
-
d.
|
145
|
+
d.run default_tag: MATCH_TAG do
|
146
|
+
d.feed 'key 1' => 'value1', 'key 2' => 'value2'
|
170
147
|
end
|
171
148
|
|
172
|
-
|
173
|
-
assert_equal %w[key_1 key_2],
|
149
|
+
events = d.events
|
150
|
+
assert_equal %w[key_1 key_2], events[0][2].keys
|
174
151
|
end
|
175
152
|
|
176
153
|
def test_replace_rule_emit_deep_rename_hash
|
177
154
|
d = create_driver 'replace_rule1 ^(\$) x'
|
178
155
|
|
179
|
-
d.run do
|
180
|
-
d.
|
156
|
+
d.run default_tag: MATCH_TAG do
|
157
|
+
d.feed '$key1' => 'value1', 'key2' => { 'key3' => 'value3', '$key4' => 'value4' }
|
181
158
|
end
|
182
|
-
|
183
|
-
assert_equal %w[xkey1 key2],
|
184
|
-
assert_equal %w[key3 xkey4],
|
159
|
+
events = d.events
|
160
|
+
assert_equal %w[xkey1 key2], events[0][2].keys
|
161
|
+
assert_equal %w[key3 xkey4], events[0][2]['key2'].keys
|
185
162
|
end
|
186
163
|
|
187
164
|
def test_replace_rule_emit_with_match_data
|
188
165
|
d = create_driver 'rename_rule1 (\w+)\s(\w+)\s(\w+) ${md[3]} ${md[2]} ${md[1]}'
|
189
|
-
d.run do
|
190
|
-
d.
|
166
|
+
d.run default_tag: MATCH_TAG do
|
167
|
+
d.feed 'key1 key2 key3' => 'value'
|
191
168
|
end
|
192
|
-
|
193
|
-
assert_equal 1,
|
194
|
-
assert_equal ['key3 key2 key1'],
|
169
|
+
events = d.events
|
170
|
+
assert_equal 1, events.length
|
171
|
+
assert_equal ['key3 key2 key1'], events[0][2].keys
|
195
172
|
end
|
196
173
|
|
197
174
|
def test_replace_rule_emit_deep_rename_array
|
198
175
|
d = create_driver 'replace_rule1 ^(\$) x${md[1]}'
|
199
176
|
|
200
|
-
d.run do
|
201
|
-
d.
|
177
|
+
d.run default_tag: MATCH_TAG do
|
178
|
+
d.feed '$key1' => 'value1', 'key2' => [{'$key3' => 'value3'}, {'$key4' => {'$key5' => 'value5'}}]
|
202
179
|
end
|
203
180
|
|
204
|
-
|
205
|
-
assert_equal %w[x$key3 x$key4],
|
206
|
-
assert_equal %w[x$key5],
|
181
|
+
events = d.events
|
182
|
+
assert_equal %w[x$key3 x$key4], events[0][2]['key2'].flat_map(&:keys)
|
183
|
+
assert_equal %w[x$key5], events[0][2]['key2'][1]['x$key4'].keys
|
207
184
|
end
|
208
185
|
|
209
186
|
def test_replace_rule_emit_deep_rename_off
|
@@ -213,51 +190,51 @@ class RenameKeyOutputTest < Test::Unit::TestCase
|
|
213
190
|
]
|
214
191
|
|
215
192
|
d = create_driver config
|
216
|
-
d.run do
|
217
|
-
d.
|
193
|
+
d.run default_tag: MATCH_TAG do
|
194
|
+
d.feed '$key1' => 'value1', 'key2' => {'$key3'=>'value3', '$key4'=> 'value4'}
|
218
195
|
end
|
219
196
|
|
220
|
-
|
221
|
-
assert_equal %w[$key3 $key4],
|
197
|
+
events = d.events
|
198
|
+
assert_equal %w[$key3 $key4], events[0][2]['key2'].keys
|
222
199
|
end
|
223
200
|
|
224
201
|
def test_replace_rule_emit_remove_matched_when_no_replacement
|
225
|
-
d = create_driver 'replace_rule1 [
|
226
|
-
d.run do
|
227
|
-
d.
|
202
|
+
d = create_driver 'replace_rule1 "[\\\\s/()]"'
|
203
|
+
d.run default_tag: MATCH_TAG do
|
204
|
+
d.feed 'key (/1 )' => 'value1'
|
228
205
|
end
|
229
206
|
|
230
|
-
|
231
|
-
assert_equal %w[key1],
|
207
|
+
events = d.events
|
208
|
+
assert_equal %w[key1], events[0][2].keys
|
232
209
|
end
|
233
210
|
|
234
211
|
def test_multiple_replace_rules_emit
|
235
212
|
config_multiple_rules = %q[
|
236
213
|
replace_rule1 ^(\w+)\s(\d) ${md[1]}${md[2]}
|
237
|
-
replace_rule2 [
|
214
|
+
replace_rule2 "[\\\\s()]"
|
238
215
|
]
|
239
216
|
|
240
217
|
d = create_driver config_multiple_rules
|
241
|
-
d.run do
|
242
|
-
d.
|
218
|
+
d.run default_tag: MATCH_TAG do
|
219
|
+
d.feed 'key 1' => 'value1', 'key (2)' => 'value2'
|
243
220
|
end
|
244
221
|
|
245
|
-
|
246
|
-
assert_equal %w[key1 key2],
|
222
|
+
events = d.events
|
223
|
+
assert_equal %w[key1 key2], events[0][2].keys
|
247
224
|
end
|
248
225
|
|
249
226
|
def test_combined_rename_rule_and_replace_rule
|
250
227
|
config_combined_rules = %q[
|
251
228
|
rename_rule1 ^(.+)\s(one) ${md[1]}1
|
252
|
-
replace_rule2 [
|
229
|
+
replace_rule2 "[\\\\s()]"
|
253
230
|
]
|
254
231
|
|
255
232
|
d = create_driver config_combined_rules
|
256
|
-
d.run do
|
257
|
-
d.
|
233
|
+
d.run default_tag: MATCH_TAG do
|
234
|
+
d.feed '(key) one (x)' => 'value1', 'key (2)' => 'value2'
|
258
235
|
end
|
259
236
|
|
260
|
-
|
261
|
-
assert_equal %w[key1 key2],
|
237
|
+
events = d.events
|
238
|
+
assert_equal %w[key1 key2], events[0][2].keys
|
262
239
|
end
|
263
240
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'fluent/plugin/filter_rename_key'
|
3
|
+
|
4
|
+
class TestClass
|
5
|
+
include Fluent::Plugin::RenameKeyUtil
|
6
|
+
end
|
7
|
+
|
8
|
+
class RenameKeyUtilTest < Test::Unit::TestCase
|
9
|
+
|
10
|
+
def test_parse_rename_rule
|
11
|
+
parsed = TestClass.new.send :parse_rename_rule, '(reg)(exp) ${md[1]} ${md[2]}'
|
12
|
+
assert_equal 2, parsed.length
|
13
|
+
assert_equal /(reg)(exp)/, parsed[:key_regexp]
|
14
|
+
assert_equal '${md[1]} ${md[2]}', parsed[:new_key]
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_parse_replace_rule_with_replacement
|
18
|
+
# Replace hyphens with underscores
|
19
|
+
parsed = TestClass.new.send :parse_replace_rule, '- _'
|
20
|
+
assert_equal 2, parsed.length
|
21
|
+
assert_equal /-/, parsed[:key_regexp]
|
22
|
+
assert_equal '_', parsed[:replacement]
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_parse_replace_rule_without_replacement
|
26
|
+
# Remove all parentheses, hyphens, and spaces
|
27
|
+
parsed = TestClass.new.send :parse_replace_rule, '[-\s()]'
|
28
|
+
assert_equal 2, parsed.length
|
29
|
+
assert_equal /[-\s()]/, parsed[:key_regexp]
|
30
|
+
assert_equal '', parsed[:replacement]
|
31
|
+
end
|
32
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-rename-key
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shunwen Hsiao
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2017-02-27 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: fluentd
|
@@ -18,7 +18,7 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - ">="
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 0.
|
21
|
+
version: 0.14.0
|
22
22
|
- - "<"
|
23
23
|
- !ruby/object:Gem::Version
|
24
24
|
version: '2'
|
@@ -28,7 +28,7 @@ dependencies:
|
|
28
28
|
requirements:
|
29
29
|
- - ">="
|
30
30
|
- !ruby/object:Gem::Version
|
31
|
-
version: 0.
|
31
|
+
version: 0.14.0
|
32
32
|
- - "<"
|
33
33
|
- !ruby/object:Gem::Version
|
34
34
|
version: '2'
|
@@ -94,6 +94,7 @@ files:
|
|
94
94
|
- test/helper.rb
|
95
95
|
- test/plugin/test_filter_rename_key.rb
|
96
96
|
- test/plugin/test_out_rename_key.rb
|
97
|
+
- test/plugin/test_rename_key_util.rb
|
97
98
|
homepage: https://github.com/shunwen/fluent-plugin-rename-key
|
98
99
|
licenses:
|
99
100
|
- Apache-2.0
|
@@ -106,7 +107,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
106
107
|
requirements:
|
107
108
|
- - ">="
|
108
109
|
- !ruby/object:Gem::Version
|
109
|
-
version: 1.
|
110
|
+
version: 2.1.0
|
110
111
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
111
112
|
requirements:
|
112
113
|
- - ">="
|
@@ -114,10 +115,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
114
115
|
version: '0'
|
115
116
|
requirements: []
|
116
117
|
rubyforge_project:
|
117
|
-
rubygems_version: 2.6.
|
118
|
+
rubygems_version: 2.6.10
|
118
119
|
signing_key:
|
119
120
|
specification_version: 4
|
120
121
|
summary: Fluentd output plugin. Rename keys which match given regular expressions,
|
121
122
|
assign new tags and re-emit the records.
|
122
123
|
test_files: []
|
123
|
-
has_rdoc:
|