下記の構成のドキュメントをlogstashからElasticsearchに連携しております
~省略~
"timestamp_log": "2022-06-03T09:01:28.000+09:00",
"awsRegion": "us-east-1",
"requestParameters": {
"template": false,
"resourceId": "5tfEXAMPLE",
"restApiId": "3rbEXAMPLE"
~省略~
}
logstashのrubyフィルターにて、指定したフィールドを[xxxxx]フィールド配下にネストした構成としたく、下記のようなrubyを実装しました
ruby {
code => "
def set_fields(whitelist, event)
whitelist.each { |field| event.set([xxxxx] + field, event.get(field)) }
end
whitelist = [
'[requestParameters][resourceId]'
]
set_fields(whitelist, event)
"
}
[requestParameters][resourceId]フィールドの値が、[xxxxx][requestParameters][resourceId]フィールドに格納されることを期待したのですが、rubyのエラーメッセージが出力されて期待通りになりませんでした。
whitelist 内は今後も増える可能性があり、[xxxxx]配下に格納するフィールド名は外出ししてset_fieldsに渡す構成としたいです。どのように実装すればよいかご教示頂けないでしょうか。
下記、取り込み時の異常メッセージです
[2022-06-07T11:14:23,345][ERROR][logstash.filters.ruby ][XXXXXXXXXX][42b787348fcfa6e707285a36bb916d6b8a9242a44134beda222a85c1192fdb75] Ruby exception occurred: undefined local variable or method `xxxxx' for #<LogStash::Filters::Ruby:0x735b0767> {:class=>"NameError", :backtrace=>["(ruby filter code):5:in `block in set_fields'", "org/jruby/RubyArray.java:1809:in `each'", "(ruby filter code):5:in `set_fields'", "(ruby filter code):13:in `block in filter_method'", "/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-filter-ruby-3.1.7/lib/logstash/filters/ruby.rb:93:in `inline_script'", "/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-filter-ruby-3.1.7/lib/logstash/filters/ruby.rb:86:in `filter'", "/usr/share/logstash/logstash-core/lib/logstash/filters/base.rb:159:in `do_filter'", "/usr/share/logstash/logstash-core/lib/logstash/filters/base.rb:178:in `block in multi_filter'", "org/jruby/RubyArray.java:1809:in `each'", "/usr/share/logstash/logstash-core/lib/logstash/filters/base.rb:175:in `multi_filter'", "org/logstash/config/ir/compiler/AbstractFilterDelegatorExt.java:134:in `multi_filter'", "/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:295:in `block in start_workers'"]}