Avoid overriding user's MDC in Log4j (#13479)

This commit is contained in:
Liu Ziming 2025-03-13 22:15:59 +08:00 committed by GitHub
parent 35a3dc6e7c
commit 43cc57cae9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 32 additions and 0 deletions

View File

@ -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<String, String> contextData = new HashMap<>(staticContextData);
SpanContext spanContext = currentSpan.getSpanContext();
contextData.put(ContextDataKeys.TRACE_ID_KEY, spanContext.getTraceId());

View File

@ -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<ListAppender.LoggedEvent> 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");
}
}