From 0feb1646e78018eba72f05a942befd7126d3ca2a Mon Sep 17 00:00:00 2001
From: Masahiro Nakagawa <repeatedly@gmail.com>
Date: Thu, 7 Jun 2018 18:29:16 +0900
Subject: [PATCH] filter_parser: Add remove_key_name_field parameter

With reserve_data, key_name field is kept by default. But sometimes
users don't need key_name field when parsing is succeeded, e.g. docker log.
So removing key_name feature is useful for simple configuration.

Signed-off-by: Masahiro Nakagawa <repeatedly@gmail.com>
---
 lib/fluent/plugin/filter_parser.rb |  3 +++
 test/plugin/test_filter_parser.rb  | 12 ++++++++++--
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/lib/fluent/plugin/filter_parser.rb b/lib/fluent/plugin/filter_parser.rb
index f56fd15951..97c5f6a481 100644
--- a/lib/fluent/plugin/filter_parser.rb
+++ b/lib/fluent/plugin/filter_parser.rb
@@ -32,6 +32,8 @@ class ParserFilter < Filter
     config_param :reserve_data, :bool, default: false
     desc 'Keep original event time in parsed result.'
     config_param :reserve_time, :bool, default: false
+    desc 'Remove "key_name" field from the record when parsing is succeeded'
+    config_param :remove_key_name_field, :bool, default: false
     desc 'Store parsed values with specified key name prefix.'
     config_param :inject_key_prefix, :string, default: nil
     desc 'If true, invalid string is replaced with safe characters and re-parse it.'
@@ -75,6 +77,7 @@ def filter_with_time(tag, time, record)
                 else
                   t.nil? ? time : t
                 end
+            @accessor.delete(record) if @remove_key_name_field
             r = handle_parsed(tag, record, t, values)
             return t, r
           else
diff --git a/test/plugin/test_filter_parser.rb b/test/plugin/test_filter_parser.rb
index 046e02ab28..d4f52606ed 100644
--- a/test/plugin/test_filter_parser.rb
+++ b/test/plugin/test_filter_parser.rb
@@ -209,10 +209,13 @@ def test_filter
 
   end
 
-  def test_filter_with_reserved_data
+  data(:keep_key_name => false,
+       :remove_key_name => true)
+  def test_filter_with_reserved_data(remove_key_name)
     d1 = create_driver(%[
       key_name data
       reserve_data yes
+      remove_key_name_field #{remove_key_name}
       <parse>
         @type regexp
         expression /^(?<x>\\d)(?<y>\\d) (?<t>.+)$/
@@ -230,6 +233,7 @@ def test_filter_with_reserved_data
     d2 = create_driver(%[
       key_name data
       reserve_data yes
+      remove_key_name_field #{remove_key_name}
       <parse>
         @type json
       </parse>
@@ -244,7 +248,11 @@ def test_filter_with_reserved_data
 
     first = filtered[0]
     assert_equal_event_time time, first[0]
-    assert_equal '{"xxx":"first","yyy":"second"}', first[1]['data']
+    if remove_key_name
+      assert_not_include first[1], 'data'
+    else
+      assert_equal '{"xxx":"first","yyy":"second"}', first[1]['data']
+    end
     assert_equal 'first', first[1]['xxx']
     assert_equal 'second', first[1]['yyy']