Skip to content

Commit 7a0993d

Browse files
committed
wip but still broken
1 parent 59f857e commit 7a0993d

File tree

8 files changed

+66
-22
lines changed

8 files changed

+66
-22
lines changed

instrumentation/spring/spring-security-config-6.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/security/config/v6_0/servlet/SpringSecurityConfigServletInstrumentationModule.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,15 @@
1212
import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig;
1313
import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule;
1414
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
15+
import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule;
1516
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
1617
import java.util.List;
1718
import net.bytebuddy.matcher.ElementMatcher;
1819

1920
/** Instrumentation module for servlet-based applications that use spring-security-config. */
2021
@AutoService(InstrumentationModule.class)
21-
public class SpringSecurityConfigServletInstrumentationModule extends InstrumentationModule {
22+
public class SpringSecurityConfigServletInstrumentationModule extends InstrumentationModule
23+
implements ExperimentalInstrumentationModule {
2224
public SpringSecurityConfigServletInstrumentationModule() {
2325
super("spring-security-config-servlet", "spring-security-config-servlet-6.0");
2426
}
@@ -47,6 +49,11 @@ public ElementMatcher.Junction<ClassLoader> classLoaderMatcher() {
4749
"org.springframework.security.authentication.ObservationAuthenticationManager");
4850
}
4951

52+
@Override
53+
public String getModuleGroup() {
54+
return "servlet";
55+
}
56+
5057
@Override
5158
public List<TypeInstrumentation> typeInstrumentations() {
5259
return singletonList(new HttpSecurityInstrumentation());

instrumentation/spring/spring-web/spring-web-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/springweb/v3_1/SpringWebInstrumentationModule.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,17 @@
1010
import static net.bytebuddy.matcher.ElementMatchers.not;
1111

1212
import com.google.auto.service.AutoService;
13-
import io.opentelemetry.javaagent.extension.instrumentation.HelperResourceBuilder;
1413
import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule;
1514
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
15+
import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule;
16+
import io.opentelemetry.javaagent.extension.instrumentation.internal.injection.ClassInjector;
17+
import io.opentelemetry.javaagent.extension.instrumentation.internal.injection.InjectionMode;
1618
import java.util.List;
1719
import net.bytebuddy.matcher.ElementMatcher;
1820

1921
@AutoService(InstrumentationModule.class)
20-
public class SpringWebInstrumentationModule extends InstrumentationModule {
22+
public class SpringWebInstrumentationModule extends InstrumentationModule
23+
implements ExperimentalInstrumentationModule {
2124
public SpringWebInstrumentationModule() {
2225
super("spring-web", "spring-web-3.1");
2326
}
@@ -31,13 +34,19 @@ public ElementMatcher.Junction<ClassLoader> classLoaderMatcher() {
3134
}
3235

3336
@Override
34-
public void registerHelperResources(HelperResourceBuilder helperResourceBuilder) {
37+
public void injectClasses(ClassInjector injector) {
3538
// make the filter class file loadable by ClassPathResource - in some cases (e.g. spring-guice,
3639
// see https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/7428) Spring
3740
// might want to read the class file metadata; this line will make the filter class file visible
3841
// to the bean class loader
39-
helperResourceBuilder.register(
40-
"org/springframework/web/servlet/v3_1/OpenTelemetryHandlerMappingFilter.class");
42+
injector
43+
.proxyBuilder("org.springframework.web.servlet.v3_1.OpenTelemetryHandlerMappingFilter")
44+
.inject(InjectionMode.CLASS_AND_RESOURCE);
45+
}
46+
47+
@Override
48+
public String getModuleGroup() {
49+
return "servlet";
4150
}
4251

4352
@Override

instrumentation/spring/spring-web/spring-web-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/springweb/v3_1/WebApplicationContextInstrumentation.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,8 @@ public static void onEnter(@Advice.Argument(0) ConfigurableListableBeanFactory b
8484
((BeanDefinitionRegistry) beanFactory)
8585
.registerBeanDefinition("otelAutoDispatcherFilter", beanDefinition);
8686
} catch (ClassNotFoundException ignored) {
87-
// Ignore
87+
ignored.printStackTrace(System.out);
88+
throw new IllegalStateException(ignored); // TODO: for debugging
8889
}
8990
}
9091
}

instrumentation/spring/spring-web/spring-web-6.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/web/v6_0/SpringWebInstrumentationModule.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,17 @@
99
import static java.util.Collections.singletonList;
1010

1111
import com.google.auto.service.AutoService;
12-
import io.opentelemetry.javaagent.extension.instrumentation.HelperResourceBuilder;
1312
import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule;
1413
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
14+
import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule;
15+
import io.opentelemetry.javaagent.extension.instrumentation.internal.injection.ClassInjector;
16+
import io.opentelemetry.javaagent.extension.instrumentation.internal.injection.InjectionMode;
1517
import java.util.List;
1618
import net.bytebuddy.matcher.ElementMatcher;
1719

1820
@AutoService(InstrumentationModule.class)
19-
public class SpringWebInstrumentationModule extends InstrumentationModule {
21+
public class SpringWebInstrumentationModule extends InstrumentationModule
22+
implements ExperimentalInstrumentationModule {
2023

2124
public SpringWebInstrumentationModule() {
2225
super("spring-web", "spring-web-6.0");
@@ -29,13 +32,19 @@ public ElementMatcher.Junction<ClassLoader> classLoaderMatcher() {
2932
}
3033

3134
@Override
32-
public void registerHelperResources(HelperResourceBuilder helperResourceBuilder) {
35+
public void injectClasses(ClassInjector injector) {
3336
// make the filter class file loadable by ClassPathResource - in some cases (e.g. spring-guice,
3437
// see https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/7428) Spring
3538
// might want to read the class file metadata; this line will make the filter class file visible
3639
// to the bean class loader
37-
helperResourceBuilder.register(
38-
"org/springframework/web/servlet/v6_0/OpenTelemetryHandlerMappingFilter.class");
40+
injector
41+
.proxyBuilder("org.springframework.web.servlet.v6_0.OpenTelemetryHandlerMappingFilter")
42+
.inject(InjectionMode.CLASS_AND_RESOURCE);
43+
}
44+
45+
@Override
46+
public String getModuleGroup() {
47+
return "servlet";
3948
}
4049

4150
@Override

instrumentation/spring/spring-web/spring-web-6.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/web/v6_0/WebApplicationContextInstrumentation.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public static void onEnter(@Advice.Argument(0) ConfigurableListableBeanFactory b
8484
((BeanDefinitionRegistry) beanFactory)
8585
.registerBeanDefinition("otelAutoDispatcherFilter", beanDefinition);
8686
} catch (ClassNotFoundException ignored) {
87-
// Ignore
87+
throw new IllegalStateException(ignored); // TODO : for debugging
8888
}
8989
}
9090
}

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

Lines changed: 13 additions & 4 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;
@@ -61,11 +62,19 @@ public static class HandlerMappingAdvice {
6162
public static void afterRefresh(
6263
@Advice.Argument(0) ApplicationContext springCtx,
6364
@Advice.FieldValue("handlerMappings") List<HandlerMapping> handlerMappings) {
65+
6466
if (springCtx.containsBean("otelAutoDispatcherFilter")) {
65-
OpenTelemetryHandlerMappingFilter filter =
66-
(OpenTelemetryHandlerMappingFilter) springCtx.getBean("otelAutoDispatcherFilter");
67-
if (handlerMappings != null && filter != null) {
68-
filter.setHandlerMappings(handlerMappings);
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);
6978
}
7079
}
7180
}

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

Lines changed: 13 additions & 4 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;
@@ -61,11 +62,19 @@ public static class HandlerMappingAdvice {
6162
public static void afterRefresh(
6263
@Advice.Argument(0) ApplicationContext springCtx,
6364
@Advice.FieldValue("handlerMappings") List<HandlerMapping> handlerMappings) {
65+
6466
if (springCtx.containsBean("otelAutoDispatcherFilter")) {
65-
OpenTelemetryHandlerMappingFilter filter =
66-
(OpenTelemetryHandlerMappingFilter) springCtx.getBean("otelAutoDispatcherFilter");
67-
if (handlerMappings != null) {
68-
filter.setHandlerMappings(handlerMappings);
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);
6978
}
7079
}
7180
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ 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+
.defineField(DELEGATE_FIELD_NAME, Object.class, Modifier.PUBLIC | Modifier.FINAL);
9797

9898
for (MethodDescription.InDefinedShape method : classToProxy.getDeclaredMethods()) {
9999
if (method.isPublic()) {

0 commit comments

Comments
 (0)