From c147237894ebf6b4f4ae4d51dd8b4748f9993daa Mon Sep 17 00:00:00 2001 From: Eduardo Silva Date: Mon, 1 Sep 2025 11:59:20 -0600 Subject: [PATCH 1/3] opentelemetry: logs: fix handling of missing timestamps Added logic to use the current host time when both timeUnixNano and observedTimeUnixNano are absent, removing the previous hard requirement for a timestamp in OTEL log records. Updated to prioritize observed_time_unix_nano when time_unix_nano is missing and to omit observed_timestamp metadata when no value is available. Signed-off-by: Eduardo Silva --- src/opentelemetry/flb_opentelemetry_logs.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/opentelemetry/flb_opentelemetry_logs.c b/src/opentelemetry/flb_opentelemetry_logs.c index 2c009f0c8ad..a20a9de68a2 100644 --- a/src/opentelemetry/flb_opentelemetry_logs.c +++ b/src/opentelemetry/flb_opentelemetry_logs.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -73,13 +74,9 @@ static int process_json_payload_log_records_entry( result = flb_otel_utils_find_map_entry_by_key(log_records_entry, "observedTimeUnixNano", 0, FLB_TRUE); } - /* we need a timestamp... */ + /* fallback to current time if both timestamp fields are missing */ if (result == -1) { - if (error_status) { - *error_status = FLB_OTEL_LOGS_ERR_MISSING_TIMESTAMP; - } - return -FLB_OTEL_LOGS_ERR_MISSING_TIMESTAMP; - + flb_time_get(×tamp); } else { timestamp_object = &log_records_entry->ptr[result].val; From 4142c20d523be61dad319c782362a1b0daed9dc7 Mon Sep 17 00:00:00 2001 From: Eduardo Silva Date: Mon, 1 Sep 2025 12:00:28 -0600 Subject: [PATCH 2/3] in_opentelemetry: pack timestamp as metadata only if present Signed-off-by: Eduardo Silva --- plugins/in_opentelemetry/opentelemetry_logs.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/plugins/in_opentelemetry/opentelemetry_logs.c b/plugins/in_opentelemetry/opentelemetry_logs.c index ce230b905cc..5a7156b8750 100644 --- a/plugins/in_opentelemetry/opentelemetry_logs.c +++ b/plugins/in_opentelemetry/opentelemetry_logs.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -217,10 +218,12 @@ static int otel_pack_v1_metadata(struct flb_opentelemetry *ctx, flb_mp_map_header_init(&mh, mp_pck); - flb_mp_map_header_append(&mh); - msgpack_pack_str(mp_pck, 18); - msgpack_pack_str_body(mp_pck, "observed_timestamp", 18); - msgpack_pack_uint64(mp_pck, log_record->observed_time_unix_nano); + if (log_record->observed_time_unix_nano != 0) { + flb_mp_map_header_append(&mh); + msgpack_pack_str(mp_pck, 18); + msgpack_pack_str_body(mp_pck, "observed_timestamp", 18); + msgpack_pack_uint64(mp_pck, log_record->observed_time_unix_nano); + } /* Value of 0 indicates unknown or missing timestamp. */ if (log_record->time_unix_nano != 0) { @@ -514,8 +517,13 @@ static int binary_payload_to_msgpack(struct flb_opentelemetry *ctx, flb_time_from_uint64(&tm, log_records[log_record_index]->time_unix_nano); ret = flb_log_event_encoder_set_timestamp(encoder, &tm); } + else if (log_records[log_record_index]->observed_time_unix_nano > 0) { + flb_time_from_uint64(&tm, log_records[log_record_index]->observed_time_unix_nano); + ret = flb_log_event_encoder_set_timestamp(encoder, &tm); + } else { - ret = flb_log_event_encoder_set_current_timestamp(encoder); + flb_time_get(&tm); + ret = flb_log_event_encoder_set_timestamp(encoder, &tm); } } From 09bc3d84381684dd1453a283dd9ec2bc9f56493b Mon Sep 17 00:00:00 2001 From: Eduardo Silva Date: Mon, 1 Sep 2025 12:22:26 -0600 Subject: [PATCH 3/3] tests: internal: opentelemetry: adjust test for flexible timestamp handling Signed-off-by: Eduardo Silva --- tests/internal/data/opentelemetry/README.md | 2 +- .../data/opentelemetry/test_cases.json | 52 +++---------------- 2 files changed, 7 insertions(+), 47 deletions(-) diff --git a/tests/internal/data/opentelemetry/README.md b/tests/internal/data/opentelemetry/README.md index 1bcbd71a6fb..656a34f073f 100644 --- a/tests/internal/data/opentelemetry/README.md +++ b/tests/internal/data/opentelemetry/README.md @@ -136,7 +136,7 @@ For error cases, use the `expected_error` field: "test_case_name": { "input": { ... }, "expected_error": { - "code": "FLB_OTEL_LOGS_ERR_MISSING_TIMESTAMP" + "code": "FLB_OTEL_LOGS_ERR_UNEXPECTED_LOGRECORDS_ENTRY_TYPE" } } } diff --git a/tests/internal/data/opentelemetry/test_cases.json b/tests/internal/data/opentelemetry/test_cases.json index 1ff9aa4383f..42983ae1955 100644 --- a/tests/internal/data/opentelemetry/test_cases.json +++ b/tests/internal/data/opentelemetry/test_cases.json @@ -37,9 +37,12 @@ }, "missing_timestamp": { - "input": {"resourceLogs": [{"scopeLogs": [{"logRecords": [{}]}]}]}, - "expected_error": { - "code": "FLB_OTEL_LOGS_ERR_MISSING_TIMESTAMP" + "input": {"resourceLogs": [{"scopeLogs": [{"logRecords": [{"body": {"stringValue": "test"}}]}]}]}, + "expected": { + "group_metadata": {"schema":"otlp","resource_id":0,"scope_id":0}, + "group_body": {"resource":{}}, + "log_metadata": {"otlp":{}}, + "log_body": {"log": "test"} } }, @@ -988,49 +991,6 @@ } }, - "multiple_records_no_timestamp_after_valid_ones": { - "input": { - "resourceLogs": [{ - "resource": { - "attributes": [ - {"key": "service.name", "value": {"stringValue": "test-service"}} - ] - }, - "scopeLogs": [{ - "scope": { - "name": "test-scope" - }, - "logRecords": [ - { - "timeUnixNano": "1640995200000000000", - "severityNumber": 9, - "severityText": "INFO", - "attributes": [ - {"key": "user.id", "value": {"stringValue": "user123"}}, - {"key": "action", "value": {"stringValue": "login"}} - ], - "body": {"stringValue": "User login successful"} - }, - { - "timeUnixNano": "1640995201000000000", - "severityNumber": 5, - "severityText": "DEBUG", - "body": {"stringValue": "Processing user session"} - }, - { - "severityNumber": 13, - "severityText": "ERROR", - "body": {"stringValue": "This log is missing timestamp"} - } - ] - }] - }] - }, - "expected_error": { - "code": "FLB_OTEL_LOGS_ERR_MISSING_TIMESTAMP" - } - }, - "large_structure_fails_at_resource_attributes": { "input": { "resourceLogs": [