Rubyフィルターで指定したフィールドを特定フィールド配下に格納したい

下記の構成のドキュメントを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'"]}

@t-nakata

以下のように「'」で[xxxxxx]を括るといけるようですので、お試しください。
whitelist.each { |field| event.set([xxxxx] + field, event.get(field)) }

whitelist.each { |field| event.set('[xxxxx]' + field, event.get(field)) }

ありがとうございます。期待通りの動作になりました

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.