Skip to content

Commit 8e901db

Browse files
authored
Merge pull request #30 from repeatedly/support-prepare-values
Support prepare_value
2 parents 8353e2d + 2610b09 commit 8e901db

File tree

3 files changed

+43
-3
lines changed

3 files changed

+43
-3
lines changed

README.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,20 @@ But unlike `record_transformer`, `record_modifier` doesn't support following fea
6262
- tag_suffix and tag_prefix
6363
- dynamic key placeholder
6464

65+
### prepare_value
66+
67+
Prepare values for filtering. This ruby code is evaluated in `configure` phase and prepared values can be used in `<record>`. Here is an example:
68+
69+
<filter pattern>
70+
@type record_modifier
71+
prepare_value require 'foo'; @foo = Foo.new
72+
<record>
73+
key ${@foo.method1}
74+
</record>
75+
</filter>
76+
77+
This feature is useful for using external library.
78+
6579
### char_encoding
6680

6781
Fluentd including some plugins treats logs as a BINARY by default to forward.

lib/fluent/plugin/filter_record_modifier.rb

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@ module Fluent
44
class Plugin::RecordModifierFilter < Plugin::Filter
55
Fluent::Plugin.register_filter('record_modifier', self)
66

7+
config_param :prepare_value, :string, default: nil,
8+
desc: <<-DESC
9+
Prepare values for filtering in configure phase. Prepared values can be used in <record>.
10+
You can write any ruby code.
11+
DESC
712
config_param :char_encoding, :string, default: nil,
813
desc: <<-DESC
914
Fluentd including some plugins treats the logs as a BINARY by default to forward.
@@ -26,7 +31,7 @@ class Plugin::RecordModifierFilter < Plugin::Filter
2631
This option is exclusive with `remove_keys`.
2732
DESC
2833

29-
BUILTIN_CONFIGURATIONS = %W(type @type log_level @log_level id @id char_encoding remove_keys whitelist_keys)
34+
BUILTIN_CONFIGURATIONS = %W(type @type log_level @log_level id @id char_encoding remove_keys whitelist_keys prepare_value)
3035

3136
def configure(conf)
3237
super
@@ -68,7 +73,7 @@ def configure(conf)
6873
check_config_placeholders(k, v)
6974
element.has_key?(k) # to suppress unread configuration warning
7075
@has_tag_parts = true if v.include?('tag_parts')
71-
@map[k] = DynamicExpander.new(k, v)
76+
@map[k] = DynamicExpander.new(k, v, @prepare_value)
7277
end
7378
end
7479

@@ -157,7 +162,7 @@ def check_config_placeholders(k, v)
157162
end
158163

159164
class DynamicExpander
160-
def initialize(param_key, param_value)
165+
def initialize(param_key, param_value, prepare_value)
161166
if param_value.include?('${')
162167
__str_eval_code__ = parse_parameter(param_value)
163168

@@ -173,6 +178,12 @@ def expand(tag, time, record, tag_parts)
173178
@param_value = param_value
174179
end
175180

181+
begin
182+
eval prepare_value if prepare_value
183+
rescue SyntaxError
184+
raise ConfigError, "Pass invalid syntax parameter : key = prepare_value, value = #{prepare_value}"
185+
end
186+
176187
begin
177188
# check eval genarates wrong code or not
178189
expand(nil, nil, nil, nil)

test/test_filter_record_modifier.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,21 @@ def test_remove_non_whitelist_keys
126126
assert_equal [{"k1" => 'v', "k2" => 'v'}], d.filtered.map(&:last)
127127
end
128128

129+
def test_prepare_values
130+
d = create_driver %[
131+
prepare_value @foo = 'foo'
132+
<record>
133+
test_key ${@foo}
134+
</record>
135+
]
136+
137+
d.run(default_tag: @tag) do
138+
d.feed("k1" => 'v')
139+
end
140+
141+
assert_equal [{"k1" => 'v', "test_key" => 'foo'}], d.filtered.map(&:last)
142+
end
143+
129144
sub_test_case 'frozen check' do
130145
def test_set_char_encoding
131146
d = create_driver %[

0 commit comments

Comments
 (0)