From 7b64ee5ccba1cdb40a436fa24e916d9886677176 Mon Sep 17 00:00:00 2001 From: Eduardo Silva Date: Wed, 20 Aug 2025 18:27:43 -0600 Subject: [PATCH 1/2] opentelemetry: logs: fix trace_id and span_id length packaging Signed-off-by: Eduardo Silva --- src/opentelemetry/flb_opentelemetry_logs.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/opentelemetry/flb_opentelemetry_logs.c b/src/opentelemetry/flb_opentelemetry_logs.c index 8e7fde45aff..2c009f0c8ad 100644 --- a/src/opentelemetry/flb_opentelemetry_logs.c +++ b/src/opentelemetry/flb_opentelemetry_logs.c @@ -293,18 +293,18 @@ static int process_json_payload_log_records_entry( result = flb_otel_utils_json_payload_append_converted_kvlist(encoder, FLB_LOG_EVENT_METADATA, metadata_object); } - if (trace_id != NULL) { - flb_otel_utils_hex_to_id(trace_id->via.str.ptr, trace_id->via.str.size, tmp_id, 32); + if (trace_id != NULL && trace_id->type == MSGPACK_OBJECT_STR && trace_id->via.str.size == 32) { + flb_otel_utils_hex_to_id(trace_id->via.str.ptr, trace_id->via.str.size, tmp_id, 16); flb_log_event_encoder_append_metadata_values(encoder, FLB_LOG_EVENT_STRING_VALUE("trace_id", 8), - FLB_LOG_EVENT_BINARY_VALUE(tmp_id, 32)); + FLB_LOG_EVENT_BINARY_VALUE(tmp_id, 16)); } - if (span_id != NULL) { - flb_otel_utils_hex_to_id(span_id->via.str.ptr, span_id->via.str.size, tmp_id, 16); + if (span_id != NULL && span_id->type == MSGPACK_OBJECT_STR && span_id->via.str.size == 16) { + flb_otel_utils_hex_to_id(span_id->via.str.ptr, span_id->via.str.size, tmp_id, 8); flb_log_event_encoder_append_metadata_values(encoder, FLB_LOG_EVENT_STRING_VALUE("span_id", 7), - FLB_LOG_EVENT_BINARY_VALUE(tmp_id, 16)); + FLB_LOG_EVENT_BINARY_VALUE(tmp_id, 8)); } result = flb_log_event_encoder_commit_map(encoder, FLB_LOG_EVENT_METADATA); From 665a6e935a08bcb5ad5b4c5511c192c9ea8ec447 Mon Sep 17 00:00:00 2001 From: Eduardo Silva Date: Wed, 20 Aug 2025 18:28:16 -0600 Subject: [PATCH 2/2] tests: internal: opentelemetry: add unit test for msgpack logs ids Signed-off-by: Eduardo Silva --- tests/internal/opentelemetry.c | 92 ++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/tests/internal/opentelemetry.c b/tests/internal/opentelemetry.c index 5464d3ce1f5..28a70f90b43 100644 --- a/tests/internal/opentelemetry.c +++ b/tests/internal/opentelemetry.c @@ -22,6 +22,8 @@ #include #include #include +#include +#include // #include "../../plugins/in_opentelemetry/opentelemetry.h" #include @@ -735,6 +737,95 @@ void test_opentelemetry_cases() flb_free(cases_json); } +void test_trace_span_binary_sizes() +{ + int ret; + struct flb_log_event_encoder enc; + struct flb_log_event_decoder dec; + struct flb_log_event event; + int32_t record_type; + char *input_json; + int error_status = 0; + int found_trace_id = 0; + int found_span_id = 0; + size_t trace_id_size = 0; + size_t span_id_size = 0; + struct flb_record_accessor *ra_trace_id; + struct flb_record_accessor *ra_span_id; + struct flb_ra_value *val_trace_id; + struct flb_ra_value *val_span_id; + size_t len; + + /* Test input with trace_id and span_id */ + input_json = "{\"resourceLogs\":[{\"scopeLogs\":[{\"logRecords\":[{\"timeUnixNano\":\"1640995200000000000\",\"traceId\":\"5B8EFFF798038103D269B633813FC60C\",\"spanId\":\"EEE19B7EC3C1B174\",\"body\":{\"stringValue\":\"test\"}}]}]}]}"; + + ret = flb_log_event_encoder_init(&enc, FLB_LOG_EVENT_FORMAT_FLUENT_BIT_V2); + TEST_CHECK(ret == FLB_EVENT_ENCODER_SUCCESS); + + ret = flb_opentelemetry_logs_json_to_msgpack(&enc, input_json, strlen(input_json), NULL, &error_status); + TEST_CHECK(ret == 0); + + /* Create record accessors for trace_id and span_id */ + ra_trace_id = flb_ra_create("$otlp['trace_id']", FLB_FALSE); + TEST_CHECK(ra_trace_id != NULL); + + ra_span_id = flb_ra_create("$otlp['span_id']", FLB_FALSE); + TEST_CHECK(ra_span_id != NULL); + + /* Decode the output to check binary sizes */ + ret = flb_log_event_decoder_init(&dec, enc.output_buffer, enc.output_length); + TEST_CHECK(ret == FLB_EVENT_DECODER_SUCCESS); + + flb_log_event_decoder_read_groups(&dec, FLB_TRUE); + + while ((ret = flb_log_event_decoder_next(&dec, &event)) == FLB_EVENT_DECODER_SUCCESS) { + ret = flb_log_event_decoder_get_record_type(&event, &record_type); + TEST_CHECK(ret == 0); + + if (record_type == FLB_LOG_EVENT_NORMAL) { + /* Use record accessor to get trace_id */ + val_trace_id = flb_ra_get_value_object(ra_trace_id, *event.metadata); + if (val_trace_id != NULL) { + found_trace_id = 1; + if (val_trace_id->type == FLB_RA_BINARY) { + trace_id_size = flb_sds_len(val_trace_id->val.binary); + printf("Found trace_id with binary size: %zu\n", trace_id_size); + /* trace_id should be 16 bytes (32 hex chars = 16 bytes) */ + TEST_CHECK_(trace_id_size == 16, "trace_id binary size should be 16, got %zu", trace_id_size); + } + else if (val_trace_id->type == FLB_RA_STRING) { + printf("Found trace_id as string: %s\n", val_trace_id->val.string); + } + flb_ra_key_value_destroy(val_trace_id); + } + + /* Use record accessor to get span_id */ + val_span_id = flb_ra_get_value_object(ra_span_id, *event.metadata); + if (val_span_id != NULL) { + found_span_id = 1; + if (val_span_id->type == FLB_RA_BINARY) { + span_id_size = flb_sds_len(val_span_id->val.binary); + printf("Found span_id with binary size: %zu\n", span_id_size); + /* span_id should be 8 bytes (16 hex chars = 8 bytes) */ + TEST_CHECK_(span_id_size == 8, "span_id binary size should be 8, got %zu", span_id_size); + } + else if (val_span_id->type == FLB_RA_STRING) { + printf("Found span_id as string: %s\n", val_span_id->val.string); + } + flb_ra_key_value_destroy(val_span_id); + } + } + } + + flb_log_event_decoder_destroy(&dec); + flb_log_event_encoder_destroy(&enc); + flb_ra_destroy(ra_trace_id); + flb_ra_destroy(ra_span_id); + + TEST_CHECK(found_trace_id == 1); + TEST_CHECK(found_span_id == 1); +} + /* Test list */ TEST_LIST = { { "hex_to_id", test_hex_to_id }, @@ -742,6 +833,7 @@ TEST_LIST = { { "find_map_entry_by_key", test_find_map_entry_by_key }, { "json_payload_get_wrapped_value", test_json_payload_get_wrapped_value }, { "opentelemetry_cases", test_opentelemetry_cases }, + { "trace_span_binary_sizes", test_trace_span_binary_sizes }, { 0 } };