From 43cc57cae9daf88908999fe619114aaff6731fa3 Mon Sep 17 00:00:00 2001 From: Liu Ziming Date: Thu, 13 Mar 2025 22:15:59 +0800 Subject: [PATCH] Avoid overriding user's MDC in Log4j (#13479) --- .../OpenTelemetryContextDataProvider.java | 6 +++++ .../log4j/contextdata/Log4j2Test.java | 26 +++++++++++++++++++ 2 files changed, 32 insertions(+) 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 970d890866..57024ded7c 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 io.opentelemetry.javaagent.bootstrap.internal.ConfiguredResourceAttribute 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 class OpenTelemetryContextDataProvider implements ContextDataProvider { 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 5f24d0892d..e0dfc3c7cc 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.List; 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 @@ public abstract class Log4j2Test { 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"); + } }