2828#include <fluent-bit/flb_kv.h>
2929#include <fluent-bit/flb_log_event_decoder.h>
3030#include <fluent-bit/flb_log_event_encoder.h>
31+ #include <fluent-bit/flb_msgpack_append_message.h>
3132#include <msgpack.h>
3233
3334#include <string.h>
3435#include <fluent-bit.h>
35- #include <time.h>
3636
3737#include "filter_parser.h"
3838
@@ -189,6 +189,8 @@ static int cb_parser_filter(const void *data, size_t bytes,
189189 int key_len ;
190190 const char * val_str ;
191191 int val_len ;
192+ char * parsed_buf ;
193+ size_t parsed_size ;
192194 char * out_buf ;
193195 size_t out_size ;
194196 struct flb_time parsed_time ;
@@ -232,6 +234,7 @@ static int cb_parser_filter(const void *data, size_t bytes,
232234 & log_decoder ,
233235 & log_event )) == FLB_EVENT_DECODER_SUCCESS ) {
234236 out_buf = NULL ;
237+ parsed_buf = NULL ;
235238 append_arr_i = 0 ;
236239
237240 flb_time_copy (& tm , & log_event .timestamp );
@@ -279,7 +282,7 @@ static int cb_parser_filter(const void *data, size_t bytes,
279282 flb_time_zero (& parsed_time );
280283
281284 parse_ret = flb_parser_do (fp -> parser , val_str , val_len ,
282- (void * * ) & out_buf , & out_size ,
285+ (void * * ) & parsed_buf , & parsed_size ,
283286 & parsed_time );
284287 if (parse_ret >= 0 ) {
285288 /*
@@ -323,12 +326,13 @@ static int cb_parser_filter(const void *data, size_t bytes,
323326 & log_encoder , log_event .metadata );
324327 }
325328
326- if (out_buf != NULL ) {
329+ if (parsed_buf != NULL ) {
330+
327331 if (ctx -> reserve_data ) {
328332 char * new_buf = NULL ;
329333 int new_size ;
330334 int ret ;
331- ret = flb_msgpack_expand_map (out_buf , out_size ,
335+ ret = flb_msgpack_expand_map (parsed_buf , parsed_size ,
332336 append_arr , append_arr_len ,
333337 & new_buf , & new_size );
334338 if (ret == -1 ) {
@@ -341,6 +345,32 @@ static int cb_parser_filter(const void *data, size_t bytes,
341345 return FLB_FILTER_NOTOUCH ;
342346 }
343347
348+ out_buf = new_buf ;
349+ out_size = new_size ;
350+ }
351+ else {
352+ out_buf = strdup (parsed_buf );
353+ out_size = parsed_size ;
354+ }
355+ if (ctx -> hash_value_field ) {
356+ char * new_buf = NULL ;
357+ size_t new_size ;
358+ int ret ;
359+ flb_sds_t hash_key = flb_sds_create ("parsed" );
360+ ret = flb_msgpack_append_map_to_record (& new_buf , & new_size ,
361+ hash_key ,
362+ out_buf , out_size ,
363+ parsed_buf ,parsed_size );
364+ flb_sds_destroy (hash_key );
365+ if ( ret != FLB_MAP_EXPAND_SUCCESS ){
366+ flb_plg_error (ctx -> ins , "cannot append parsed entry to record" );
367+
368+ flb_log_event_decoder_destroy (& log_decoder );
369+ flb_log_event_encoder_destroy (& log_encoder );
370+ flb_free (append_arr );
371+
372+ return FLB_FILTER_NOTOUCH ;
373+ }
344374 flb_free (out_buf );
345375 out_buf = new_buf ;
346376 out_size = new_size ;
@@ -353,6 +383,7 @@ static int cb_parser_filter(const void *data, size_t bytes,
353383 }
354384
355385 flb_free (out_buf );
386+ flb_free (parsed_buf );
356387 ret = FLB_FILTER_MODIFIED ;
357388 }
358389 else {
0 commit comments