1 Reply Latest reply: Sep 19, 2012 7:37 PM by Marco Battaglia RSS

How to manage instrumentation in application deployed on JBoss?

adesanctis Newbie

Hello everybody,

 

I'm trying to instrument classes in JBoss Enterprise application on JBoss EA5.0

 

Using this code:

 

public byte[] transform(ClassLoader loader,
        String className,
        Class classBeingRedefined,
        ProtectionDomain protectionDomain,
        byte[] classfileBuffer) throws IllegalClassFormatException {
    // The class name contains slashes instead of periods, so use transform those to
    // dots for readability within the trace
    String dotClassName = className.replace('/', '.');

 

 

    if (className.startsWith("$")) {
        return null;
    }

 

    // Only instrument a class once
    if (instrumentedClasses.contains(className)) {
        return null;
    }
    instrumentedClasses.add(className);

 

    // Skip in the list of class prefixes to skip
    for (MethodSelector classToSkip : classesToSkip) {
        if (dotClassName.startsWith(classToSkip.getPackageName())) {
            return null;
        }
    }

 

    if (logger.isInfoEnabled()) {
        logger.info("Checking class: " + className);
    }
   
    try {
        classPool.insertClassPath(new ByteArrayClassPath(className, classfileBuffer));
//        classPool.insertClassPath(new ClassClassPath(this.getClass()));
       
//        classPool.insertClassPath(new ClassClassPath(classBeingRedefined.getClass()));
        CtClass cc = classPool.get(dotClassName);
//        CtClass cc = classPool.makeClass(new ByteArrayInputStream(classfileBuffer));       

//

 

In bold line where exception is raised.

I suppose that arror is related to specific class loader used for load class.

The question is: how to manage classes independently from class loader used? Is there a way to manage all possible case when working on JBoss?

 

Thank you

 

Alessandro

 

09:37:59,040 ERROR [STDERR] javassist.NotFoundException: com.arjuna.ats.internal.jta.recovery.arjunacore.RecoveryXids

09:37:59,040 ERROR [STDERR]     at javassist.ClassPool.get(ClassPool.java:436)

09:37:59,040 ERROR [STDERR]     at by.concept.applicationtracer.AdvancedTransformer.transform(AdvancedTransformer.java:163)

09:37:59,040 ERROR [STDERR]     at sun.instrument.TransformerManager.transform(TransformerManager.java:169)

09:37:59,040 ERROR [STDERR]     at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:365)

09:37:59,040 ERROR [STDERR]     at java.lang.ClassLoader.defineClass1(Native Method)

09:37:59,040 ERROR [STDERR]     at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)

09:37:59,040 ERROR [STDERR]     at java.lang.ClassLoader.defineClass(ClassLoader.java:615)

09:37:59,040 ERROR [STDERR]     at org.jboss.classloader.spi.base.BaseClassLoader.access$200(BaseClassLoader.java:67)

09:37:59,040 ERROR [STDERR]     at org.jboss.classloader.spi.base.BaseClassLoader$2.run(BaseClassLoader.java:633)

09:37:59,040 ERROR [STDERR]     at org.jboss.classloader.spi.base.BaseClassLoader$2.run(BaseClassLoader.java:592)

09:37:59,040 ERROR [STDERR]     at java.security.AccessController.doPrivileged(Native Method)

09:37:59,040 ERROR [STDERR]     at org.jboss.classloader.spi.base.BaseClassLoader.loadClassLocally(BaseClassLoader.java:591)

09:37:59,040 ERROR [STDERR]     at org.jboss.classloader.spi.base.BaseClassLoader.loadClassLocally(BaseClassLoader.java:568)

09:37:59,040 ERROR [STDERR]     at org.jboss.classloader.spi.base.BaseDelegateLoader.loadClass(BaseDelegateLoader.java:135)

09:37:59,040 ERROR [STDERR]     at org.jboss.classloader.spi.filter.FilteredDelegateLoader.loadClass(FilteredDelegateLoader.java:131)

09:37:59,040 ERROR [STDERR]     at org.jboss.classloader.spi.base.ClassLoadingTask$ThreadTask.run(ClassLoadingTask.java:455)

09:37:59,040 ERROR [STDERR]     at org.jboss.classloader.spi.base.ClassLoaderManager.nextTask(ClassLoaderManager.java:267)

09:37:59,040 ERROR [STDERR]     at org.jboss.classloader.spi.base.ClassLoaderManager.process(ClassLoaderManager.java:166)

09:37:59,040 ERROR [STDERR]     at org.jboss.classloader.spi.base.BaseClassLoaderDomain.loadClass(BaseClassLoaderDomain.java:276)

09:37:59,040 ERROR [STDERR]     at org.jboss.classloader.spi.base.BaseClassLoaderDomain.loadClass(BaseClassLoaderDomain.java:1138)

09:37:59,040 ERROR [STDERR]     at org.jboss.classloader.spi.base.BaseClassLoader.loadClassFromDomain(BaseClassLoader.java:862)

09:37:59,040 ERROR [STDERR]     at org.jboss.classloader.spi.base.BaseClassLoader.doLoadClass(BaseClassLoader.java:502)

09:37:59,040 ERROR [STDERR]     at org.jboss.classloader.spi.base.BaseClassLoader.loadClass(BaseClassLoader.java:447)

  • 1. Re: How to manage instrumentation in application deployed on JBoss?
    Marco Battaglia Newbie

    Hi Alessandro,

    you have to use a classloader to instrument classes.

    If you use an agent on your jboss process you can control the main classloader and then every class loaded  by jboss.

    You can call transform method in preMain method of your agent.

     

    If you want to monitor classes and method and also add actions you can use byteman. It helps you to registering and unregistering rules (instrumentations) dynamically to your classes.

     

    Ciao