Skip to content

Commit dd7fb83

Browse files
committed
Delete ClassInjector api
1 parent 64d55bf commit dd7fb83

27 files changed

Lines changed: 61 additions & 1135 deletions

File tree

instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestHelperClass.java

Lines changed: 0 additions & 15 deletions
This file was deleted.

instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestInstrumentationModule.java

Lines changed: 2 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,16 @@
55

66
package instrumentation;
77

8-
import static java.util.Arrays.asList;
98
import static java.util.Collections.singletonList;
109

1110
import com.google.auto.service.AutoService;
1211
import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule;
1312
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;
1713
import java.util.List;
1814

1915
@AutoService(InstrumentationModule.class)
20-
public class TestInstrumentationModule extends InstrumentationModule
21-
implements ExperimentalInstrumentationModule {
16+
public class TestInstrumentationModule extends InstrumentationModule {
17+
2218
public TestInstrumentationModule() {
2319
super("test-instrumentation");
2420
}
@@ -27,22 +23,4 @@ public TestInstrumentationModule() {
2723
public List<TypeInstrumentation> typeInstrumentations() {
2824
return singletonList(new TestTypeInstrumentation());
2925
}
30-
31-
@Override
32-
public List<String> getAdditionalHelperClassNames() {
33-
// makes the class from instrumentation from the instrumented class with inlined advice
34-
return asList("instrumentation.TestHelperClass");
35-
}
36-
37-
@Override
38-
public boolean isHelperClass(String className) {
39-
return "instrumentation.TestSingletons".equals(className);
40-
}
41-
42-
@Override
43-
public void injectClasses(ClassInjector injector) {
44-
injector
45-
.proxyBuilder("instrumentation.TestHelperClass")
46-
.inject(InjectionMode.CLASS_AND_RESOURCE);
47-
}
4826
}

instrumentation/internal/internal-reflection/javaagent-integration-tests/src/test/java/io/opentelemetry/javaagent/instrumentation/internal/reflection/ReflectionTest.java

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77

88
import static org.assertj.core.api.Assertions.assertThat;
99

10-
import instrumentation.TestHelperClass;
11-
import io.opentelemetry.javaagent.bootstrap.InstrumentationProxy;
1210
import io.opentelemetry.javaagent.bootstrap.field.VirtualFieldAccessorMarker;
1311
import io.opentelemetry.javaagent.bootstrap.field.VirtualFieldInstalledMarker;
1412
import java.io.ObjectStreamClass;
@@ -49,36 +47,4 @@ void testGeneratedSerialVersionUid() {
4947
.isEqualTo(1115158932483123524L);
5048
assertThat(TestClass.class.getDeclaredFields()).isEmpty();
5149
}
52-
53-
@Test
54-
void testInjectedClassProxyUnwrap() throws Exception {
55-
TestClass testClass = new TestClass();
56-
Class<?> helperType = testClass.testHelperClass();
57-
assertThat(helperType).isNotNull();
58-
59-
Object instance = helperType.getConstructor().newInstance();
60-
if (InstrumentationProxy.class.isAssignableFrom(helperType)) {
61-
// indy advice: must be an indy proxy
62-
63-
for (Method method : helperType.getMethods()) {
64-
assertThat(method.getName()).isNotEqualTo("__getIndyProxyDelegate");
65-
}
66-
67-
for (Class<?> interfaceType : helperType.getInterfaces()) {
68-
assertThat(interfaceType).isNotEqualTo(InstrumentationProxy.class);
69-
}
70-
71-
assertThat(instance).isInstanceOf(InstrumentationProxy.class);
72-
73-
Object proxyDelegate = ((InstrumentationProxy) instance).__getIndyProxyDelegate();
74-
assertThat(proxyDelegate).isNotInstanceOf(InstrumentationProxy.class);
75-
76-
} else {
77-
// inline advice: must be of the expected type
78-
assertThat(helperType).isEqualTo(TestHelperClass.class);
79-
assertThat(instance)
80-
.isInstanceOf(TestHelperClass.class)
81-
.isNotInstanceOf(InstrumentationProxy.class);
82-
}
83-
}
8450
}

instrumentation/internal/internal-reflection/javaagent-integration-tests/src/test/java/io/opentelemetry/javaagent/instrumentation/internal/reflection/TestClass.java

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,4 @@ public String testMethod() {
1919
public String testMethod2() {
2020
return "not instrumented";
2121
}
22-
23-
public Class<?> testHelperClass() {
24-
try {
25-
return Class.forName(
26-
"instrumentation.TestHelperClass", false, TestClass.class.getClassLoader());
27-
} catch (ClassNotFoundException e) {
28-
return null;
29-
}
30-
}
3122
}

instrumentation/internal/internal-reflection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/reflection/ClassInstrumentation.java

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
1212
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
1313
import io.opentelemetry.javaagent.extension.instrumentation.internal.AsmApi;
14+
import io.opentelemetry.javaagent.tooling.instrumentation.indy.IndyBootstrap;
15+
import io.opentelemetry.javaagent.tooling.instrumentation.indy.IndyTypeTransformerImpl;
1416
import net.bytebuddy.asm.AsmVisitorWrapper;
1517
import net.bytebuddy.description.field.FieldDescription;
1618
import net.bytebuddy.description.field.FieldList;
@@ -58,15 +60,18 @@ public ClassVisitor wrap(
5860
MethodList<?> methods,
5961
int writerFlags,
6062
int readerFlags) {
61-
return new ClassClassVisitor(classVisitor);
63+
return new ClassClassVisitor(
64+
classVisitor, transformer instanceof IndyTypeTransformerImpl);
6265
}
6366
}));
6467
}
6568

6669
private static class ClassClassVisitor extends ClassVisitor {
70+
private final boolean isIndy;
6771

68-
ClassClassVisitor(ClassVisitor cv) {
72+
ClassClassVisitor(ClassVisitor cv, boolean isIndy) {
6973
super(AsmApi.VERSION, cv);
74+
this.isIndy = isIndy;
7075
}
7176

7277
@Override
@@ -92,12 +97,21 @@ public void visitMethodInsn(
9297
&& "java/lang/J9VMInternals".equals(owner)
9398
&& "(Ljava/lang/Class;)[Ljava/lang/Class;".equals(descriptor))) {
9499
super.visitVarInsn(Opcodes.ALOAD, 0);
95-
super.visitMethodInsn(
96-
Opcodes.INVOKESTATIC,
97-
Type.getInternalName(ReflectionHelper.class),
98-
"filterInterfaces",
99-
"([Ljava/lang/Class;Ljava/lang/Class;)[Ljava/lang/Class;",
100-
false);
100+
if (isIndy) {
101+
IndyBootstrap.invokeStatic(
102+
mv,
103+
"filterInterfaces",
104+
"([Ljava/lang/Class;Ljava/lang/Class;)[Ljava/lang/Class;",
105+
ReflectionInstrumentationModule.class,
106+
ReflectionHelper.class.getName());
107+
} else {
108+
super.visitMethodInsn(
109+
Opcodes.INVOKESTATIC,
110+
Type.getInternalName(ReflectionHelper.class),
111+
"filterInterfaces",
112+
"([Ljava/lang/Class;Ljava/lang/Class;)[Ljava/lang/Class;",
113+
false);
114+
}
101115
}
102116
}
103117
};

instrumentation/internal/internal-reflection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/reflection/ReflectionHelper.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
package io.opentelemetry.javaagent.instrumentation.internal.reflection;
77

8-
import io.opentelemetry.javaagent.bootstrap.InstrumentationProxy;
98
import io.opentelemetry.javaagent.bootstrap.field.VirtualFieldAccessorMarker;
109
import io.opentelemetry.javaagent.bootstrap.field.VirtualFieldDetector;
1110
import io.opentelemetry.javaagent.bootstrap.field.VirtualFieldInstalledMarker;
@@ -70,8 +69,6 @@ public static Class<?>[] filterInterfaces(Class<?>[] interfaces, Class<?> contai
7069
// filter out virtual field marker and accessor interfaces
7170
if (interfaceClass == VirtualFieldInstalledMarker.class) {
7271
continue;
73-
} else if (interfaceClass == InstrumentationProxy.class) {
74-
continue;
7572
} else if (VirtualFieldAccessorMarker.class.isAssignableFrom(interfaceClass)
7673
&& interfaceClass.isSynthetic()
7774
&& interfaceClass.getName().contains("VirtualFieldAccessor$")) {
@@ -87,7 +84,6 @@ public static Class<?>[] filterInterfaces(Class<?>[] interfaces, Class<?> contai
8784
}
8885

8986
private static boolean noInterfaceToHide(Class<?> containingClass) {
90-
return !VirtualFieldInstalledMarker.class.isAssignableFrom(containingClass)
91-
&& !InstrumentationProxy.class.isAssignableFrom(containingClass);
87+
return !VirtualFieldInstalledMarker.class.isAssignableFrom(containingClass);
9288
}
9389
}

instrumentation/internal/internal-reflection/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/reflection/ReflectionInstrumentationModule.java

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,10 @@
1010
import com.google.auto.service.AutoService;
1111
import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule;
1212
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
13-
import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule;
14-
import io.opentelemetry.javaagent.extension.instrumentation.internal.injection.ClassInjector;
15-
import io.opentelemetry.javaagent.extension.instrumentation.internal.injection.InjectionMode;
1613
import java.util.List;
1714

1815
@AutoService(InstrumentationModule.class)
19-
public class ReflectionInstrumentationModule extends InstrumentationModule
20-
implements ExperimentalInstrumentationModule {
16+
public class ReflectionInstrumentationModule extends InstrumentationModule {
2117
public ReflectionInstrumentationModule() {
2218
super("internal-reflection");
2319
}
@@ -32,15 +28,4 @@ public boolean defaultEnabled() {
3228
public List<TypeInstrumentation> typeInstrumentations() {
3329
return asList(new ClassInstrumentation(), new ReflectionInstrumentation());
3430
}
35-
36-
@Override
37-
public void injectClasses(ClassInjector injector) {
38-
// we do not use ByteBuddy Advice dispatching in this instrumentation
39-
// Instead, we manually call ReflectionHelper via ASM
40-
// Easiest solution to work with indy is to inject an indy-proxy to be invoked
41-
injector
42-
.proxyBuilder(
43-
"io.opentelemetry.javaagent.instrumentation.internal.reflection.ReflectionHelper")
44-
.inject(InjectionMode.CLASS_ONLY);
45-
}
4631
}

javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/InstrumentationProxy.java

Lines changed: 0 additions & 20 deletions
This file was deleted.

javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/InstrumentationProxyHelper.java

Lines changed: 0 additions & 36 deletions
This file was deleted.

javaagent-bootstrap/src/test/java/io/opentelemetry/javaagent/bootstrap/InstrumentationProxyHelperTest.java

Lines changed: 0 additions & 38 deletions
This file was deleted.

0 commit comments

Comments
 (0)