Skip to content

Commit 36af042

Browse files
authored
Fix AbstractMethodError in logback instrumentation (#7967)
Resolves #7949 Replace wrapper class with JDK proxy to ensure that all methods are implemented and delegated to the underlying event.
1 parent dbb1b7f commit 36af042

File tree

2 files changed

+21
-120
lines changed

2 files changed

+21
-120
lines changed

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

-118
This file was deleted.

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

+21-2
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@
1010
import static io.opentelemetry.instrumentation.api.log.LoggingContextConstants.TRACE_ID;
1111

1212
import ch.qos.logback.classic.spi.ILoggingEvent;
13+
import ch.qos.logback.classic.spi.LoggerContextVO;
1314
import ch.qos.logback.core.Appender;
1415
import ch.qos.logback.core.UnsynchronizedAppenderBase;
1516
import ch.qos.logback.core.spi.AppenderAttachable;
1617
import ch.qos.logback.core.spi.AppenderAttachableImpl;
1718
import io.opentelemetry.api.trace.Span;
1819
import io.opentelemetry.api.trace.SpanContext;
1920
import io.opentelemetry.instrumentation.logback.mdc.v1_0.internal.UnionMap;
21+
import java.lang.reflect.Proxy;
2022
import java.util.HashMap;
2123
import java.util.Iterator;
2224
import java.util.Map;
@@ -49,8 +51,25 @@ public static ILoggingEvent wrapEvent(ILoggingEvent event) {
4951
} else {
5052
eventContext = new UnionMap<>(eventContext, contextData);
5153
}
52-
53-
return new LoggingEventWrapper(event, eventContext);
54+
Map<String, String> eventContextMap = eventContext;
55+
LoggerContextVO oldVo = event.getLoggerContextVO();
56+
LoggerContextVO vo =
57+
oldVo != null
58+
? new LoggerContextVO(oldVo.getName(), eventContextMap, oldVo.getBirthTime())
59+
: null;
60+
61+
return (ILoggingEvent)
62+
Proxy.newProxyInstance(
63+
ILoggingEvent.class.getClassLoader(),
64+
new Class<?>[] {ILoggingEvent.class},
65+
(proxy, method, args) -> {
66+
if ("getMDCPropertyMap".equals(method.getName())) {
67+
return eventContextMap;
68+
} else if ("getLoggerContextVO".equals(method.getName())) {
69+
return vo;
70+
}
71+
return method.invoke(event, args);
72+
});
5473
}
5574

5675
@Override

0 commit comments

Comments
 (0)