Skip to content

Commit 0c91cbc

Browse files
committed
turns out proxy delegate access is not needed
1 parent 99d8bff commit 0c91cbc

File tree

3 files changed

+14
-30
lines changed

3 files changed

+14
-30
lines changed

instrumentation/spring/spring-webmvc/spring-webmvc-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webmvc/v3_1/DispatcherServletInstrumentation.java

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
import io.opentelemetry.context.Scope;
1818
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
1919
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
20-
import java.lang.reflect.Field;
2120
import java.util.List;
2221
import net.bytebuddy.asm.Advice;
2322
import net.bytebuddy.description.type.TypeDescription;
@@ -62,20 +61,13 @@ public static class HandlerMappingAdvice {
6261
public static void afterRefresh(
6362
@Advice.Argument(0) ApplicationContext springCtx,
6463
@Advice.FieldValue("handlerMappings") List<HandlerMapping> handlerMappings) {
65-
if (springCtx.containsBean("otelAutoDispatcherFilter")) {
66-
Object bean = springCtx.getBean("otelAutoDispatcherFilter");
67-
try {
68-
// the bean is a proxy of OpenTelemetryHandlerMappingFilter, so we need to access the
69-
// proxied object, trying to use reflection to invoke methods triggers stack overflows
70-
Field delegate = bean.getClass().getField("delegate");
71-
Object delegateObject = delegate.get(bean);
72-
OpenTelemetryHandlerMappingFilter mappingFilter =
73-
(OpenTelemetryHandlerMappingFilter) delegateObject;
74-
mappingFilter.setHandlerMappings(handlerMappings);
75-
} catch (IllegalAccessException | NoSuchFieldException e) {
76-
throw new IllegalStateException(e);
77-
}
64+
65+
if (handlerMappings == null || !springCtx.containsBean("otelAutoDispatcherFilter")) {
66+
return;
7867
}
68+
OpenTelemetryHandlerMappingFilter filter =
69+
springCtx.getBean("otelAutoDispatcherFilter", OpenTelemetryHandlerMappingFilter.class);
70+
filter.setHandlerMappings(handlerMappings);
7971
}
8072
}
8173

instrumentation/spring/spring-webmvc/spring-webmvc-6.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webmvc/v6_0/DispatcherServletInstrumentation.java

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
import io.opentelemetry.context.Scope;
1818
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
1919
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
20-
import java.lang.reflect.Field;
2120
import java.util.List;
2221
import net.bytebuddy.asm.Advice;
2322
import net.bytebuddy.description.type.TypeDescription;
@@ -63,21 +62,15 @@ public static void afterRefresh(
6362
@Advice.Argument(0) ApplicationContext springCtx,
6463
@Advice.FieldValue("handlerMappings") List<HandlerMapping> handlerMappings) {
6564

66-
if (springCtx.containsBean("otelAutoDispatcherFilter")) {
67-
Object bean = springCtx.getBean("otelAutoDispatcherFilter");
68-
try {
69-
// the bean is a proxy of OpenTelemetryHandlerMappingFilter, so we need to access the
70-
// proxied object, trying to use reflection to invoke methods triggers stack overflows
71-
Field delegate = bean.getClass().getField("delegate");
72-
Object delegateObject = delegate.get(bean);
73-
OpenTelemetryHandlerMappingFilter mappingFilter =
74-
(OpenTelemetryHandlerMappingFilter) delegateObject;
75-
mappingFilter.setHandlerMappings(handlerMappings);
76-
} catch (IllegalAccessException | NoSuchFieldException e) {
77-
throw new IllegalStateException(e);
78-
}
65+
if (handlerMappings == null || !springCtx.containsBean("otelAutoDispatcherFilter")) {
66+
return;
7967
}
68+
69+
OpenTelemetryHandlerMappingFilter filter = springCtx.getBean("otelAutoDispatcherFilter",
70+
OpenTelemetryHandlerMappingFilter.class);
71+
filter.setHandlerMappings(handlerMappings);
8072
}
73+
8174
}
8275

8376
@SuppressWarnings("unused")

javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/indy/IndyProxyFactory.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,7 @@ public DynamicType.Unloaded<?> generateProxy(
9393
.implement(classToProxy.getInterfaces())
9494
.name(proxyClassName)
9595
.annotateType(classToProxy.getDeclaredAnnotations())
96-
// field must be public to enable resolving the proxy target using introspection
97-
.defineField(DELEGATE_FIELD_NAME, Object.class, Modifier.PUBLIC | Modifier.FINAL);
96+
.defineField(DELEGATE_FIELD_NAME, Object.class, Modifier.PRIVATE | Modifier.FINAL);
9897

9998
for (MethodDescription.InDefinedShape method : classToProxy.getDeclaredMethods()) {
10099
if (method.isPublic()) {

0 commit comments

Comments
 (0)