diff --git a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/OpenTelemetryContextDataProvider.java b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/OpenTelemetryContextDataProvider.java index 970d89086627..57024ded7c3c 100644 --- a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/OpenTelemetryContextDataProvider.java +++ b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/OpenTelemetryContextDataProvider.java @@ -16,6 +16,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; +import org.apache.logging.log4j.ThreadContext; import org.apache.logging.log4j.core.util.ContextDataProvider; /** @@ -67,6 +68,11 @@ public Map supplyContextData() { return staticContextData; } + if (ThreadContext.containsKey(ContextDataKeys.TRACE_ID_KEY)) { + // Assume already instrumented event if traceId is present. + return staticContextData; + } + Map contextData = new HashMap<>(staticContextData); SpanContext spanContext = currentSpan.getSpanContext(); contextData.put(ContextDataKeys.TRACE_ID_KEY, spanContext.getTraceId()); diff --git a/instrumentation/log4j/log4j-context-data/log4j-context-data-common/testing/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/Log4j2Test.java b/instrumentation/log4j/log4j-context-data/log4j-context-data-common/testing/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/Log4j2Test.java index 5f24d0892d53..e0dfc3c7cc99 100644 --- a/instrumentation/log4j/log4j-context-data/log4j-context-data-common/testing/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/Log4j2Test.java +++ b/instrumentation/log4j/log4j-context-data/log4j-context-data-common/testing/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/Log4j2Test.java @@ -15,6 +15,7 @@ import java.util.concurrent.atomic.AtomicReference; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.ThreadContext; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -132,4 +133,29 @@ void testIdsWhenSpan() { assertThat(events.get(3).getContextData().get(getLoggingKey("trace_flags"))).isEqualTo("01"); assertThat(events.get(3).getContextData().get("baggage.baggage_key")).isNull(); } + + @Test + void testNoOverrideTraceId() { + Logger logger = LogManager.getLogger("TestLogger"); + + ThreadContext.put(getLoggingKey("trace_id"), "test_traceId"); + ThreadContext.put(getLoggingKey("span_id"), "test_spanId"); + ThreadContext.put(getLoggingKey("trace_flags"), "test_traceFlag"); + getInstrumentationExtension() + .runWithSpan( + "test", + () -> { + logger.info("log span parent"); + }); + List events = ListAppender.get().getEvents(); + ThreadContext.clearAll(); + assertThat(events.size()).isEqualTo(1); + assertThat(events.get(0).getMessage()).isEqualTo("log span parent"); + assertThat(events.get(0).getContextData().get(getLoggingKey("trace_id"))) + .isEqualTo("test_traceId"); + assertThat(events.get(0).getContextData().get(getLoggingKey("span_id"))) + .isEqualTo("test_spanId"); + assertThat(events.get(0).getContextData().get(getLoggingKey("trace_flags"))) + .isEqualTo("test_traceFlag"); + } }