fluent-plugin-rename-key 0.3.4 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|