From b4664c990ab03d545f0f0f1095f6babc87213227 Mon Sep 17 00:00:00 2001 From: Eunbin Son Date: Tue, 13 Oct 2026 12:38:44 +0900 Subject: [PATCH] Fall back to observed timestamp in SystemOutLogRecordExporter --- .../logging/SystemOutLogRecordExporter.java | 6 ++++- .../SystemOutLogRecordExporterTest.java | 27 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/SystemOutLogRecordExporter.java b/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/SystemOutLogRecordExporter.java index 34cbbc91f2c..5effcb65e2b 100644 --- a/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/SystemOutLogRecordExporter.java +++ b/exporters/logging/src/main/java/io/opentelemetry/exporter/logging/SystemOutLogRecordExporter.java @@ -66,10 +66,14 @@ static void formatLog(StringBuilder stringBuilder, LogRecordData log) { InstrumentationScopeInfo instrumentationScopeInfo = log.getInstrumentationScopeInfo(); Value body = log.getBodyValue(); String eventName = log.getEventName(); + long timestampEpochNanos = log.getTimestampEpochNanos(); + if (timestampEpochNanos == 0) { + timestampEpochNanos = log.getObservedTimestampEpochNanos(); + } stringBuilder .append( ISO_FORMAT.format( - Instant.ofEpochMilli(NANOSECONDS.toMillis(log.getTimestampEpochNanos())) + Instant.ofEpochMilli(NANOSECONDS.toMillis(timestampEpochNanos)) .atZone(ZoneOffset.UTC))) .append(" ") .append(log.getSeverity()); diff --git a/exporters/logging/src/test/java/io/opentelemetry/exporter/logging/SystemOutLogRecordExporterTest.java b/exporters/logging/src/test/java/io/opentelemetry/exporter/logging/SystemOutLogRecordExporterTest.java index 44f24dee00c..0a6ffe9b080 100644 --- a/exporters/logging/src/test/java/io/opentelemetry/exporter/logging/SystemOutLogRecordExporterTest.java +++ b/exporters/logging/src/test/java/io/opentelemetry/exporter/logging/SystemOutLogRecordExporterTest.java @@ -81,6 +81,33 @@ void formatWithEventName() { + "00000000000000010000000000000002 0000000000000003 [scopeInfo: logTest:1.0] {}"); } + @Test + void formatWithoutTimestampUsesObservedTimestamp() { + long observedTimestamp = + LocalDateTime.of(1970, Month.AUGUST, 7, 10, 0).toInstant(ZoneOffset.UTC).toEpochMilli(); + LogRecordData log = + TestLogRecordData.builder() + .setResource(Resource.empty()) + .setInstrumentationScopeInfo( + InstrumentationScopeInfo.builder("logTest").setVersion("1.0").build()) + .setBody("message") + .setSeverity(Severity.ERROR3) + .setObservedTimestamp(observedTimestamp, TimeUnit.MILLISECONDS) + .setSpanContext( + SpanContext.create( + "00000000000000010000000000000002", + "0000000000000003", + TraceFlags.getDefault(), + TraceState.getDefault())) + .build(); + StringBuilder output = new StringBuilder(); + SystemOutLogRecordExporter.formatLog(output, log); + assertThat(output.toString()) + .isEqualTo( + "1970-08-07T10:00:00Z ERROR3 'message' : 00000000000000010000000000000002 " + + "0000000000000003 [scopeInfo: logTest:1.0] {}"); + } + @Test void shutdown() { SystemOutLogRecordExporter exporter = SystemOutLogRecordExporter.create();