2323#include <fluent-bit/flb_mp.h>
2424#include <fluent-bit/flb_log_event_decoder.h>
2525#include <fluent-bit/flb_log_event_encoder.h>
26+ #include <string.h>
2627
2728#include "vivo.h"
2829#include "vivo_http.h"
2930#include "vivo_stream.h"
3031
32+ static msgpack_object * find_map_value (msgpack_object * map ,
33+ const char * key , size_t key_len )
34+ {
35+ size_t i ;
36+
37+ if (!map || map -> type != MSGPACK_OBJECT_MAP ) {
38+ return NULL ;
39+ }
40+
41+ for (i = 0 ; i < map -> via .map .size ; i ++ ) {
42+ if (map -> via .map .ptr [i ].key .type != MSGPACK_OBJECT_STR ) {
43+ continue ;
44+ }
45+
46+ if (map -> via .map .ptr [i ].key .via .str .size == key_len &&
47+ strncmp (map -> via .map .ptr [i ].key .via .str .ptr , key , key_len ) == 0 ) {
48+ return & map -> via .map .ptr [i ].val ;
49+ }
50+ }
51+
52+ return NULL ;
53+ }
54+
3155static flb_sds_t format_logs (struct flb_input_instance * src_ins ,
3256 struct flb_event_chunk * event_chunk , struct flb_config * config )
3357{
@@ -38,9 +62,19 @@ static flb_sds_t format_logs(struct flb_input_instance *src_ins,
3862 flb_sds_t out_buf = NULL ;
3963 msgpack_sbuffer tmp_sbuf ;
4064 msgpack_packer tmp_pck ;
65+ int group_mismatch = FLB_FALSE ;
66+ int is_otlp = FLB_FALSE ;
4167 struct flb_log_event log_event ;
4268 struct flb_log_event_decoder log_decoder ;
4369 struct flb_mp_map_header mh ;
70+ struct flb_mp_map_header root_map ;
71+ struct flb_mp_map_header otlp_map ;
72+ struct flb_mp_map_header group_map ;
73+ msgpack_object * group_metadata = NULL ;
74+ msgpack_object * group_attributes = NULL ;
75+ msgpack_object * schema_value = NULL ;
76+ msgpack_object * resource_value = NULL ;
77+ msgpack_object * scope_value = NULL ;
4478
4579 result = flb_log_event_decoder_init (& log_decoder ,
4680 (char * ) event_chunk -> data ,
@@ -87,9 +121,10 @@ static flb_sds_t format_logs(struct flb_input_instance *src_ins,
87121 * }
88122 */
89123
90- msgpack_pack_map ( & tmp_pck , 4 );
124+ flb_mp_map_header_init ( & root_map , & tmp_pck );
91125
92126 /* source_type: internal type of the plugin */
127+ flb_mp_map_header_append (& root_map );
93128 name = src_ins -> p -> name ;
94129 len = strlen (name );
95130
@@ -99,6 +134,7 @@ static flb_sds_t format_logs(struct flb_input_instance *src_ins,
99134 msgpack_pack_str_body (& tmp_pck , name , len );
100135
101136 /* source_name: internal name or alias set by the user */
137+ flb_mp_map_header_append (& root_map );
102138 name = (char * ) flb_input_name (src_ins );
103139 len = strlen (name );
104140 msgpack_pack_str (& tmp_pck , 11 );
@@ -107,12 +143,14 @@ static flb_sds_t format_logs(struct flb_input_instance *src_ins,
107143 msgpack_pack_str_body (& tmp_pck , name , len );
108144
109145 /* tag */
146+ flb_mp_map_header_append (& root_map );
110147 msgpack_pack_str (& tmp_pck , 3 );
111148 msgpack_pack_str_body (& tmp_pck , "tag" , 3 );
112149 msgpack_pack_str (& tmp_pck , flb_sds_len (event_chunk -> tag ));
113150 msgpack_pack_str_body (& tmp_pck , event_chunk -> tag , flb_sds_len (event_chunk -> tag ));
114151
115152 /* records */
153+ flb_mp_map_header_append (& root_map );
116154 msgpack_pack_str (& tmp_pck , 7 );
117155 msgpack_pack_str_body (& tmp_pck , "records" , 7 );
118156
@@ -122,6 +160,24 @@ static flb_sds_t format_logs(struct flb_input_instance *src_ins,
122160 & log_decoder ,
123161 & log_event )) == FLB_EVENT_DECODER_SUCCESS ) {
124162
163+ if (log_event .group_metadata != NULL ) {
164+ if (group_metadata == NULL ) {
165+ group_metadata = log_event .group_metadata ;
166+ }
167+ else if (group_metadata != log_event .group_metadata ) {
168+ group_mismatch = FLB_TRUE ;
169+ }
170+ }
171+
172+ if (log_event .group_attributes != NULL ) {
173+ if (group_attributes == NULL ) {
174+ group_attributes = log_event .group_attributes ;
175+ }
176+ else if (group_attributes != log_event .group_attributes ) {
177+ group_mismatch = FLB_TRUE ;
178+ }
179+ }
180+
125181 flb_mp_array_header_append (& mh );
126182
127183 /*
@@ -140,6 +196,78 @@ static flb_sds_t format_logs(struct flb_input_instance *src_ins,
140196
141197 flb_mp_array_header_end (& mh );
142198
199+ if (group_mismatch == FLB_FALSE &&
200+ (group_metadata != NULL || group_attributes != NULL )) {
201+ if (group_metadata != NULL ) {
202+ schema_value = find_map_value (group_metadata , "schema" , 6 );
203+ }
204+
205+ if (schema_value &&
206+ schema_value -> type == MSGPACK_OBJECT_STR &&
207+ schema_value -> via .str .size == 4 &&
208+ strncmp (schema_value -> via .str .ptr , "otlp" , 4 ) == 0 ) {
209+ is_otlp = FLB_TRUE ;
210+ }
211+
212+ if (is_otlp == FLB_TRUE ) {
213+ resource_value = NULL ;
214+ scope_value = NULL ;
215+
216+ if (group_attributes != NULL &&
217+ group_attributes -> type == MSGPACK_OBJECT_MAP ) {
218+ resource_value = find_map_value (group_attributes , "resource" , 8 );
219+ scope_value = find_map_value (group_attributes , "scope" , 5 );
220+ }
221+
222+ flb_mp_map_header_append (& root_map );
223+ msgpack_pack_str (& tmp_pck , 4 );
224+ msgpack_pack_str_body (& tmp_pck , "otlp" , 4 );
225+
226+ flb_mp_map_header_init (& otlp_map , & tmp_pck );
227+
228+ if (resource_value != NULL ) {
229+ flb_mp_map_header_append (& otlp_map );
230+ msgpack_pack_str (& tmp_pck , 8 );
231+ msgpack_pack_str_body (& tmp_pck , "resource" , 8 );
232+ msgpack_pack_object (& tmp_pck , * resource_value );
233+ }
234+
235+ if (scope_value != NULL ) {
236+ flb_mp_map_header_append (& otlp_map );
237+ msgpack_pack_str (& tmp_pck , 5 );
238+ msgpack_pack_str_body (& tmp_pck , "scope" , 5 );
239+ msgpack_pack_object (& tmp_pck , * scope_value );
240+ }
241+
242+ flb_mp_map_header_end (& otlp_map );
243+ }
244+ else {
245+ flb_mp_map_header_append (& root_map );
246+ msgpack_pack_str (& tmp_pck , 9 );
247+ msgpack_pack_str_body (& tmp_pck , "flb_group" , 9 );
248+
249+ flb_mp_map_header_init (& group_map , & tmp_pck );
250+
251+ if (group_metadata != NULL ) {
252+ flb_mp_map_header_append (& group_map );
253+ msgpack_pack_str (& tmp_pck , 8 );
254+ msgpack_pack_str_body (& tmp_pck , "metadata" , 8 );
255+ msgpack_pack_object (& tmp_pck , * group_metadata );
256+ }
257+
258+ if (group_attributes != NULL ) {
259+ flb_mp_map_header_append (& group_map );
260+ msgpack_pack_str (& tmp_pck , 4 );
261+ msgpack_pack_str_body (& tmp_pck , "body" , 4 );
262+ msgpack_pack_object (& tmp_pck , * group_attributes );
263+ }
264+
265+ flb_mp_map_header_end (& group_map );
266+ }
267+ }
268+
269+ flb_mp_map_header_end (& root_map );
270+
143271 /* Release the unpacker */
144272 flb_log_event_decoder_destroy (& log_decoder );
145273
0 commit comments