Skip to content

Commit d2714ad

Browse files
committed
public delegate needed with indy
1 parent 5b3b408 commit d2714ad

File tree

3 files changed

+32
-5
lines changed

3 files changed

+32
-5
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: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
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;
2021
import java.util.List;
2122
import net.bytebuddy.asm.Advice;
2223
import net.bytebuddy.description.type.TypeDescription;
@@ -65,8 +66,20 @@ public static void afterRefresh(
6566
if (handlerMappings == null || !springCtx.containsBean("otelAutoDispatcherFilter")) {
6667
return;
6768
}
68-
OpenTelemetryHandlerMappingFilter filter =
69-
springCtx.getBean("otelAutoDispatcherFilter", OpenTelemetryHandlerMappingFilter.class);
69+
Object bean = springCtx.getBean("otelAutoDispatcherFilter");
70+
OpenTelemetryHandlerMappingFilter filter;
71+
if (bean instanceof OpenTelemetryHandlerMappingFilter) {
72+
// inline advice: no proxy class is used
73+
filter = (OpenTelemetryHandlerMappingFilter) bean;
74+
} else {
75+
// non-inlined advice: proxy class is used
76+
try {
77+
Field delegate = bean.getClass().getField("delegate");
78+
filter = (OpenTelemetryHandlerMappingFilter) delegate.get(bean);
79+
} catch (NoSuchFieldException | IllegalAccessException e) {
80+
throw new IllegalStateException(e);
81+
}
82+
}
7083
filter.setHandlerMappings(handlerMappings);
7184
}
7285
}

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

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
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;
2021
import java.util.List;
2122
import net.bytebuddy.asm.Advice;
2223
import net.bytebuddy.description.type.TypeDescription;
@@ -66,8 +67,20 @@ public static void afterRefresh(
6667
return;
6768
}
6869

69-
OpenTelemetryHandlerMappingFilter filter =
70-
springCtx.getBean("otelAutoDispatcherFilter", OpenTelemetryHandlerMappingFilter.class);
70+
Object bean = springCtx.getBean("otelAutoDispatcherFilter");
71+
OpenTelemetryHandlerMappingFilter filter;
72+
if (bean instanceof OpenTelemetryHandlerMappingFilter) {
73+
// inline advice: no proxy class is used
74+
filter = (OpenTelemetryHandlerMappingFilter) bean;
75+
} else {
76+
// non-inlined advice: proxy class is used
77+
try {
78+
Field delegate = bean.getClass().getField("delegate");
79+
filter = (OpenTelemetryHandlerMappingFilter) delegate.get(bean);
80+
} catch (NoSuchFieldException | IllegalAccessException e) {
81+
throw new IllegalStateException(e);
82+
}
83+
}
7184
filter.setHandlerMappings(handlerMappings);
7285
}
7386
}

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

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

9899
for (MethodDescription.InDefinedShape method : classToProxy.getDeclaredMethods()) {
99100
if (method.isPublic()) {

0 commit comments

Comments
 (0)