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
@@ -186,6 +186,8 @@ static int cb_parser_filter(const void *data, size_t bytes,
186186 int key_len ;
187187 const char * val_str ;
188188 int val_len ;
189+ char * parsed_buf ;
190+ size_t parsed_size ;
189191 char * out_buf ;
190192 size_t out_size ;
191193 struct flb_time parsed_time ;
@@ -229,6 +231,7 @@ static int cb_parser_filter(const void *data, size_t bytes,
229231 & log_decoder ,
230232 & log_event )) == FLB_EVENT_DECODER_SUCCESS ) {
231233 out_buf = NULL ;
234+ parsed_buf = NULL ;
232235 append_arr_i = 0 ;
233236
234237 flb_time_copy (& tm , & log_event .timestamp );
@@ -276,7 +279,7 @@ static int cb_parser_filter(const void *data, size_t bytes,
276279 flb_time_zero (& parsed_time );
277280
278281 parse_ret = flb_parser_do (fp -> parser , val_str , val_len ,
279- (void * * ) & out_buf , & out_size ,
282+ (void * * ) & parsed_buf , & parsed_size ,
280283 & parsed_time );
281284 if (parse_ret >= 0 ) {
282285 /*
@@ -320,13 +323,13 @@ static int cb_parser_filter(const void *data, size_t bytes,
320323 & log_encoder , log_event .metadata );
321324 }
322325
323- if (out_buf != NULL ) {
326+ if (parsed_buf != NULL ) {
327+
324328 if (ctx -> reserve_data ) {
325329 char * new_buf = NULL ;
326330 int new_size ;
327331 int ret ;
328-
329- ret = flb_msgpack_expand_map (out_buf , out_size ,
332+ ret = flb_msgpack_expand_map (parsed_buf , parsed_size ,
330333 append_arr , append_arr_len ,
331334 & new_buf , & new_size );
332335 if (ret == -1 ) {
@@ -339,6 +342,32 @@ static int cb_parser_filter(const void *data, size_t bytes,
339342 return FLB_FILTER_NOTOUCH ;
340343 }
341344
345+ out_buf = new_buf ;
346+ out_size = new_size ;
347+ }
348+ else {
349+ out_buf = strdup (parsed_buf );
350+ out_size = parsed_size ;
351+ }
352+ if (ctx -> hash_value_field ) {
353+ char * new_buf = NULL ;
354+ size_t new_size ;
355+ int ret ;
356+ flb_sds_t hash_key = flb_sds_create ("parsed" );
357+ ret = flb_msgpack_append_map_to_record (& new_buf , & new_size ,
358+ hash_key ,
359+ out_buf , out_size ,
360+ parsed_buf ,parsed_size );
361+ flb_sds_destroy (hash_key );
362+ if ( ret != FLB_MAP_EXPAND_SUCCESS ){
363+ flb_plg_error (ctx -> ins , "cannot append parsed entry to record" );
364+
365+ flb_log_event_decoder_destroy (& log_decoder );
366+ flb_log_event_encoder_destroy (& log_encoder );
367+ flb_free (append_arr );
368+
369+ return FLB_FILTER_NOTOUCH ;
370+ }
342371 flb_free (out_buf );
343372 out_buf = new_buf ;
344373 out_size = new_size ;
@@ -351,6 +380,7 @@ static int cb_parser_filter(const void *data, size_t bytes,
351380 }
352381
353382 flb_free (out_buf );
383+ flb_free (parsed_buf );
354384 ret = FLB_FILTER_MODIFIED ;
355385 }
356386 else {
0 commit comments