-
-
Notifications
You must be signed in to change notification settings - Fork 844
Description
Hello.
I have two agents.
One will isolate log4j2 by custom classloader which load class from specific directory instead of appclassloader, and the other will check whether the class's parents is target type.
the parent classloader of custom classloader is appclassloader.
the second agent's code that check the type of class's parent is below:
@Override
public boolean isMatch(TypeDescription typeDescription) {
List<String> tmpList = new ArrayList<>(Arrays.asList(this.parentTypes));
TypeList.Generic implInterfaces = typeDescription.getInterfaces();
for (TypeDescription.Generic implInterface : implInterfaces) {
matchHierarchyClass(implInterface, tmpList);
}
if (typeDescription.getSuperClass() != null) {
matchHierarchyClass(typeDescription.getSuperClass(), tmpList);
}
return tmpList.isEmpty();
}
private void matchHierarchyClass(TypeDescription.Generic clazz, List<String> parentTypes) {
parentTypes.remove(clazz.asRawType().getTypeName());
if (parentTypes.isEmpty()) {
return;
}
for (TypeDescription.Generic generic : clazz.getInterfaces()) {
matchHierarchyClass(generic, parentTypes);
}
TypeDescription.Generic superClazz = clazz.getSuperClass();
if (superClazz != null && !clazz.getTypeName().equals("java.lang.Object")) {
matchHierarchyClass(superClazz, parentTypes);
}
}
when i run springboot with the two agents:
-javaagent:C:\workspace\project\incubating\port-trail\dist\porttrail-agent.jar
-javaagent:C:\workspace\learn\skywalking-agent-learn\dist\apm-agent-1.0-SNAPSHOT-jar-with-dependencies.jar
error will output:
2026-01-08 22:11:40.426 [main] WARN [cn.addenda.porttrail.agent.transform.match.ProtectiveShieldMatcher.matches.33] - Byte-buddy occurs exception when match type [class org.apache.logging.log4j.spi.AbstractLogger].
cn.addenda.porttrail.dependency.net.bytebuddy.pool.TypePool$Resolution$NoSuchTypeException: Cannot resolve type description for java.io.Serializable
at cn.addenda.porttrail.dependency.net.bytebuddy.pool.TypePool$Resolution$Illegal.resolve(TypePool.java:192) ~[porttrail-agent.jar:?]
at cn.addenda.porttrail.dependency.net.bytebuddy.pool.TypePool$Default$WithLazyResolution$LazyTypeDescription.delegate(TypePool.java:1170) ~[porttrail-agent.jar:?]
at cn.addenda.porttrail.dependency.net.bytebuddy.description.type.TypeDescription$AbstractBase$OfSimpleType$WithDelegation.getInterfaces(TypeDescription.java:8451) ~[porttrail-agent.jar:?]
at cn.addenda.porttrail.dependency.net.bytebuddy.description.type.TypeDescription$Generic$OfNonGenericType.getInterfaces(TypeDescription.java:3698) ~[porttrail-agent.jar:?]
at cn.addenda.porttrail.dependency.net.bytebuddy.matcher.HasSuperTypeMatcher.doMatch(HasSuperTypeMatcher.java:67) ~[porttrail-agent.jar:?]
at cn.addenda.porttrail.dependency.net.bytebuddy.matcher.HasSuperTypeMatcher.doMatch(HasSuperTypeMatcher.java:32) ~[porttrail-agent.jar:?]
at cn.addenda.porttrail.dependency.net.bytebuddy.matcher.ElementMatcher$Junction$ForNonNullValues.matches(ElementMatcher.java:249) ~[porttrail-agent.jar:?]
at cn.addenda.porttrail.dependency.net.bytebuddy.matcher.ElementMatcher$Junction$Conjunction.matches(ElementMatcher.java:146) ~[porttrail-agent.jar:?]
at cn.addenda.porttrail.dependency.net.bytebuddy.matcher.ElementMatcher$Junction$Disjunction.matches(ElementMatcher.java:214) ~[porttrail-agent.jar:?]
at cn.addenda.porttrail.agent.transform.match.ProtectiveShieldMatcher.matches(ProtectiveShieldMatcher.java:31) ~[porttrail-agent.jar:?]
at cn.addenda.porttrail.dependency.net.bytebuddy.agent.builder.AgentBuilder$RawMatcher$ForElementMatchers.matches(AgentBuilder.java:1968) ~[porttrail-agent.jar:?]
at cn.addenda.porttrail.dependency.net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer.doTransform(AgentBuilder.java:12703) ~[porttrail-agent.jar:?]
at cn.addenda.porttrail.dependency.net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer.transform(AgentBuilder.java:12661) ~[porttrail-agent.jar:?]
at cn.addenda.porttrail.dependency.net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer.access$1800(AgentBuilder.java:12370) ~[porttrail-agent.jar:?]
at cn.addenda.porttrail.dependency.net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer$LegacyVmDispatcher.run(AgentBuilder.java:13070) ~[porttrail-agent.jar:?]
at cn.addenda.porttrail.dependency.net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer$LegacyVmDispatcher.run(AgentBuilder.java:13008) ~[porttrail-agent.jar:?]
at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_221]
at cn.addenda.porttrail.dependency.net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer.doPrivileged(AgentBuilder.java) ~[porttrail-agent.jar:?]
at cn.addenda.porttrail.dependency.net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer.transform(AgentBuilder.java:12570) ~[porttrail-agent.jar:?]
at sun.instrument.TransformerManager.transform(TransformerManager.java:188) ~[?:1.8.0_221]
at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:428) ~[?:1.8.0_221]
at java.lang.ClassLoader.defineClass1(Native Method) ~[?:1.8.0_221]
at java.lang.ClassLoader.defineClass(ClassLoader.java:763) ~[?:1.8.0_221]
at java.lang.ClassLoader.defineClass(ClassLoader.java:642) ~[?:1.8.0_221]
at cn.addenda.sal.agent.core.log.LogClassLoader.doFindClass(LogClassLoader.java:99) ~[apm-agent-1.0-SNAPSHOT-jar-with-dependencies.jar:?]
at cn.addenda.sal.agent.core.log.LogClassLoader.loadClass(LogClassLoader.java:69) ~[apm-agent-1.0-SNAPSHOT-jar-with-dependencies.jar:?]
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[?:1.8.0_221]
at java.lang.ClassLoader.defineClass1(Native Method) ~[?:1.8.0_221]
at java.lang.ClassLoader.defineClass(ClassLoader.java:763) ~[?:1.8.0_221]
at java.lang.ClassLoader.defineClass(ClassLoader.java:642) ~[?:1.8.0_221]
at cn.addenda.sal.agent.core.log.LogClassLoader.doFindClass(LogClassLoader.java:99) ~[apm-agent-1.0-SNAPSHOT-jar-with-dependencies.jar:?]
at cn.addenda.sal.agent.core.log.LogClassLoader.loadClass(LogClassLoader.java:69) ~[apm-agent-1.0-SNAPSHOT-jar-with-dependencies.jar:?]
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[?:1.8.0_221]
at org.apache.logging.log4j.LogManager.<clinit>(LogManager.java:61) ~[log4j-api-2.17.2.jar:2.17.2]
at java.lang.Class.forName0(Native Method) ~[?:1.8.0_221]
at java.lang.Class.forName(Class.java:348) ~[?:1.8.0_221]
at cn.addenda.sal.agent.core.log.MyLoggerFactory.<clinit>(MyLoggerFactory.java:35) ~[apm-agent-1.0-SNAPSHOT-jar-with-dependencies.jar:?]
at cn.addenda.sal.agent.SkywalkingLearnAgent.<clinit>(SkywalkingLearnAgent.java:36) ~[apm-agent-1.0-SNAPSHOT-jar-with-dependencies.jar:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_221]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_221]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_221]
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_221]
at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:386) ~[?:1.8.0_221]
at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:401) ~[?:1.8.0_221]
I have searched the issue of bytebuddy and I know bytebuddy will analyze bytecode of class, so if there is not bytecode exists, bytebuddy can not get type.
but , my problem is : the type which can not be resolved is jdk's class.
All the class which match failed are class that loading from my custom classloader.
can somebody give me some advise. thanks!