Skip to content

Commit e0de01f

Browse files
lauritAlex Kats
authored and
Alex Kats
committed
Logback: don't make MDCPropertyMap of logging event immutable (open-telemetry#12718)
1 parent 6a7e04b commit e0de01f

File tree

7 files changed

+96
-333
lines changed

7 files changed

+96
-333
lines changed

instrumentation/logback/logback-mdc-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/mdc/v1_0/LoggingEventInstrumentation.java

+4-6
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import io.opentelemetry.api.trace.SpanContext;
2323
import io.opentelemetry.context.Context;
2424
import io.opentelemetry.instrumentation.api.util.VirtualField;
25-
import io.opentelemetry.instrumentation.logback.mdc.v1_0.internal.UnionMap;
2625
import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge;
2726
import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig;
2827
import io.opentelemetry.javaagent.bootstrap.internal.ConfiguredResourceAttributesHolder;
@@ -74,6 +73,9 @@ public static void onExit(
7473
}
7574

7675
Map<String, String> spanContextData = new HashMap<>();
76+
if (contextData != null) {
77+
spanContextData.putAll(contextData);
78+
}
7779

7880
SpanContext spanContext = Java8BytecodeBridge.spanFromContext(context).getSpanContext();
7981

@@ -96,11 +98,7 @@ public static void onExit(
9698
}
9799
}
98100

99-
if (contextData == null) {
100-
contextData = spanContextData;
101-
} else {
102-
contextData = new UnionMap<>(contextData, spanContextData);
103-
}
101+
contextData = spanContextData;
104102
}
105103
}
106104
}

instrumentation/logback/logback-mdc-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/mdc/v1_0/OpenTelemetryAppender.java

+5-9
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
import io.opentelemetry.api.trace.SpanContext;
1818
import io.opentelemetry.context.Context;
1919
import io.opentelemetry.instrumentation.api.incubator.log.LoggingContextConstants;
20-
import io.opentelemetry.instrumentation.logback.mdc.v1_0.internal.UnionMap;
2120
import java.lang.reflect.Field;
2221
import java.util.HashMap;
2322
import java.util.Iterator;
@@ -83,6 +82,9 @@ private void processEvent(ILoggingEvent event) {
8382
}
8483

8584
Map<String, String> contextData = new HashMap<>();
85+
if (eventContext != null) {
86+
contextData.putAll(eventContext);
87+
}
8688
Context context = Context.current();
8789
Span currentSpan = Span.fromContext(context);
8890

@@ -102,20 +104,14 @@ private void processEvent(ILoggingEvent event) {
102104
"baggage." + key, value.getValue()));
103105
}
104106

105-
if (eventContext == null) {
106-
eventContext = contextData;
107-
} else {
108-
eventContext = new UnionMap<>(eventContext, contextData);
109-
}
110-
Map<String, String> eventContextMap = eventContext;
111107
LoggerContextVO oldVo = event.getLoggerContextVO();
112108
LoggerContextVO vo =
113109
oldVo != null
114-
? new LoggerContextVO(oldVo.getName(), eventContextMap, oldVo.getBirthTime())
110+
? new LoggerContextVO(oldVo.getName(), contextData, oldVo.getBirthTime())
115111
: null;
116112

117113
try {
118-
MDC_MAP_FIELD.set(event, eventContextMap);
114+
MDC_MAP_FIELD.set(event, contextData);
119115
} catch (IllegalAccessException ignored) {
120116
// setAccessible(true) was called on the field
121117
}

instrumentation/logback/logback-mdc-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/mdc/v1_0/internal/UnionMap.java

-214
This file was deleted.

instrumentation/logback/logback-mdc-1.0/library/src/test/java/io/opentelemetry/instrumentation/logback/mdc/v1_0/LogbackTest.java

+15
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,12 @@
55

66
package io.opentelemetry.instrumentation.logback.mdc.v1_0;
77

8+
import static org.assertj.core.api.Assertions.assertThat;
9+
810
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
911
import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension;
12+
import java.util.Map;
13+
import org.junit.jupiter.api.Test;
1014
import org.junit.jupiter.api.extension.RegisterExtension;
1115

1216
class LogbackTest extends AbstractLogbackTest {
@@ -18,4 +22,15 @@ class LogbackTest extends AbstractLogbackTest {
1822
public InstrumentationExtension getInstrumentationExtension() {
1923
return testing;
2024
}
25+
26+
@Test
27+
void testMdcMutable() {
28+
TestAppender testAppender = TestAppender.instance;
29+
runWithSpanAndBaggage("test", baggage, () -> logger.info("log message"));
30+
31+
assertThat(testAppender.lastEvent.getMessage()).isEqualTo("log message");
32+
Map<String, String> map = testAppender.lastEvent.getMDCPropertyMap();
33+
// verify that mdc map associated with the event is mutable
34+
map.put("test", "test");
35+
}
2136
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.logback.mdc.v1_0;
7+
8+
import ch.qos.logback.classic.spi.ILoggingEvent;
9+
import ch.qos.logback.core.Appender;
10+
import ch.qos.logback.core.UnsynchronizedAppenderBase;
11+
import ch.qos.logback.core.spi.AppenderAttachable;
12+
import ch.qos.logback.core.spi.AppenderAttachableImpl;
13+
import java.util.Iterator;
14+
15+
public class TestAppender extends UnsynchronizedAppenderBase<ILoggingEvent>
16+
implements AppenderAttachable<ILoggingEvent> {
17+
18+
static TestAppender instance;
19+
private final AppenderAttachableImpl<ILoggingEvent> aai = new AppenderAttachableImpl<>();
20+
ILoggingEvent lastEvent;
21+
22+
public TestAppender() {
23+
instance = this;
24+
}
25+
26+
private void processEvent(ILoggingEvent event) {
27+
lastEvent = event;
28+
}
29+
30+
@Override
31+
protected void append(ILoggingEvent event) {
32+
processEvent(event);
33+
aai.appendLoopOnAppenders(event);
34+
}
35+
36+
@Override
37+
public void addAppender(Appender<ILoggingEvent> appender) {
38+
aai.addAppender(appender);
39+
}
40+
41+
@Override
42+
public Iterator<Appender<ILoggingEvent>> iteratorForAppenders() {
43+
return aai.iteratorForAppenders();
44+
}
45+
46+
@Override
47+
public Appender<ILoggingEvent> getAppender(String name) {
48+
return aai.getAppender(name);
49+
}
50+
51+
@Override
52+
public boolean isAttached(Appender<ILoggingEvent> appender) {
53+
return aai.isAttached(appender);
54+
}
55+
56+
@Override
57+
public void detachAndStopAllAppenders() {
58+
aai.detachAndStopAllAppenders();
59+
}
60+
61+
@Override
62+
public boolean detachAppender(Appender<ILoggingEvent> appender) {
63+
return aai.detachAppender(appender);
64+
}
65+
66+
@Override
67+
public boolean detachAppender(String name) {
68+
return aai.detachAppender(name);
69+
}
70+
}

0 commit comments

Comments
 (0)