Search in sources :

Example 1 with InterceptorDefinitionFactory

use of com.navercorp.pinpoint.profiler.instrument.interceptor.InterceptorDefinitionFactory in project pinpoint by naver.

the class InstrumentEngineProvider method get.

public InstrumentEngine get() {
    final String instrumentEngine = instrumentConfig.getProfileInstrumentEngine().toUpperCase();
    if (InstrumentConfig.INSTRUMENT_ENGINE_ASM.equals(instrumentEngine)) {
        logger.info("ASM InstrumentEngine");
        // WARNING must be singleton
        final InterceptorDefinitionFactory interceptorDefinitionFactory = new InterceptorDefinitionFactory();
        // WARNING must be singleton
        final ScopeFactory scopeFactory = new ScopeFactory();
        EngineComponent engineComponent = new DefaultEngineComponent(objectBinderFactory, interceptorRegistryBinder, interceptorDefinitionFactory, apiMetaDataServiceProvider, scopeFactory);
        return new ASMEngine(instrumentation, engineComponent);
    } else {
        logger.warn("Unknown InstrumentEngine:{}", instrumentEngine);
        throw new IllegalArgumentException("Unknown InstrumentEngine:" + instrumentEngine);
    }
}
Also used : DefaultEngineComponent(com.navercorp.pinpoint.profiler.instrument.DefaultEngineComponent) ASMEngine(com.navercorp.pinpoint.profiler.instrument.ASMEngine) ScopeFactory(com.navercorp.pinpoint.profiler.instrument.ScopeFactory) InterceptorDefinitionFactory(com.navercorp.pinpoint.profiler.instrument.interceptor.InterceptorDefinitionFactory) EngineComponent(com.navercorp.pinpoint.profiler.instrument.EngineComponent) DefaultEngineComponent(com.navercorp.pinpoint.profiler.instrument.DefaultEngineComponent)

Example 2 with InterceptorDefinitionFactory

use of com.navercorp.pinpoint.profiler.instrument.interceptor.InterceptorDefinitionFactory in project pinpoint by naver.

the class MethodInterfaceTest method addInterceptor.

@Test
public void addInterceptor() throws Exception {
    final String targetInterfaceName = "com.navercorp.test.pinpoint.jdk8.interfaces.MethodInterface";
    final String targetClassName = "com.navercorp.test.pinpoint.jdk8.interfaces.MethodInterfaceClass";
    logger.debug("Add interceptor interface={}, class={}", targetInterfaceName, targetClassName);
    final int interceptorId = interceptorRegistryBinder.getInterceptorRegistryAdaptor().addInterceptor(new SimpleInterceptor());
    final InterceptorDefinition interceptorDefinition = new InterceptorDefinitionFactory().createInterceptorDefinition(SimpleInterceptor.class);
    final List<String> methodNameList = Arrays.asList("currentTimeMillis", "foo");
    TestClassLoader classLoader = new TestClassLoader();
    classLoader.addTargetClassName(targetClassName);
    classLoader.addTargetClassName(targetInterfaceName);
    classLoader.setCallbackHandler(new CallbackHandler() {

        @Override
        public void handle(ClassNode classNode) {
            List<MethodNode> methodNodes = classNode.methods;
            for (MethodNode methodNode : methodNodes) {
                logger.debug("Handle class={}, method={}", classNode.name, methodNode.name);
                if (methodNode.name.equals("<clinit>")) {
                    continue;
                }
                ASMMethodNodeAdapter methodNodeAdapter = new ASMMethodNodeAdapter(classNode.name, methodNode);
                if (methodNodeAdapter.isAbstract() || methodNodeAdapter.isNative()) {
                    continue;
                }
                if (!methodNameList.contains(methodNode.name)) {
                    continue;
                }
                methodNodeAdapter.addBeforeInterceptor(interceptorId, interceptorDefinition, 99);
                logger.debug("Add before interceptor in method={}", methodNode.name);
                methodNodeAdapter.addAfterInterceptor(interceptorId, interceptorDefinition, 99);
                logger.debug("Add after interceptor in method={}", methodNode.name);
            }
        }
    });
    // static method
    Assert.assertFalse(SimpleInterceptor.before);
    logger.debug("Interface static method");
    Class<?> clazz = classLoader.loadClass(targetInterfaceName);
    Method method = clazz.getDeclaredMethod("currentTimeMillis");
    method.invoke(null);
    assertTrue(SimpleInterceptor.before);
    // reset
    SimpleInterceptor.before = false;
    // default method
    Assert.assertFalse(SimpleInterceptor.before);
    logger.debug("Interface default method");
    clazz = classLoader.loadClass(targetClassName);
    method = clazz.getDeclaredMethod("bar");
    method.invoke(clazz.newInstance());
    assertTrue(SimpleInterceptor.before);
}
Also used : ClassNode(org.objectweb.asm.tree.ClassNode) ASMMethodNodeAdapter(com.navercorp.pinpoint.profiler.instrument.ASMMethodNodeAdapter) Method(java.lang.reflect.Method) InterceptorDefinitionFactory(com.navercorp.pinpoint.profiler.instrument.interceptor.InterceptorDefinitionFactory) InterceptorDefinition(com.navercorp.pinpoint.profiler.instrument.interceptor.InterceptorDefinition) MethodNode(org.objectweb.asm.tree.MethodNode) ArrayList(java.util.ArrayList) List(java.util.List) Test(org.junit.Test)

Example 3 with InterceptorDefinitionFactory

use of com.navercorp.pinpoint.profiler.instrument.interceptor.InterceptorDefinitionFactory in project pinpoint by naver.

the class ASMMethodNodeAdapterAddInterceptorTest method addInterceptor.

private Class<?> addInterceptor(final int interceptorId, final String targetClassName, final Class<?> interceptorClass) {
    final InterceptorDefinition interceptorDefinition = new InterceptorDefinitionFactory().createInterceptorDefinition(interceptorClass);
    try {
        classLoader.setTrace(false);
        classLoader.setVerify(false);
        classLoader.setTargetClassName(targetClassName);
        classLoader.setCallbackHandler(new ASMClassNodeLoader.CallbackHandler() {

            @Override
            public void handle(ClassNode classNode) {
                List<MethodNode> methodNodes = classNode.methods;
                for (MethodNode methodNode : methodNodes) {
                    if (methodNode.name.equals("<clinit>")) {
                        continue;
                    }
                    ASMMethodNodeAdapter methodNodeAdapter = new ASMMethodNodeAdapter(classNode.name, methodNode);
                    if (methodNodeAdapter.isAbstract() || methodNodeAdapter.isNative()) {
                        continue;
                    }
                    methodNodeAdapter.addBeforeInterceptor(interceptorId, interceptorDefinition, 99);
                    methodNodeAdapter.addAfterInterceptor(interceptorId, interceptorDefinition, 99);
                }
            }
        });
        return classLoader.loadClass(targetClassName);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}
Also used : InterceptorDefinition(com.navercorp.pinpoint.profiler.instrument.interceptor.InterceptorDefinition) ClassNode(org.objectweb.asm.tree.ClassNode) MethodNode(org.objectweb.asm.tree.MethodNode) List(java.util.List) InterceptorDefinitionFactory(com.navercorp.pinpoint.profiler.instrument.interceptor.InterceptorDefinitionFactory)

Example 4 with InterceptorDefinitionFactory

use of com.navercorp.pinpoint.profiler.instrument.interceptor.InterceptorDefinitionFactory in project pinpoint by naver.

the class ASMMethodVariablesTest method hasInterceptor.

@Test
public void hasInterceptor() throws Exception {
    InterceptorRegistryBinder interceptorRegistryBinder = new DefaultInterceptorRegistryBinder();
    int interceptorId = interceptorRegistryBinder.getInterceptorRegistryAdaptor().addInterceptor(new ArgsArrayInterceptor());
    final InterceptorDefinition interceptorDefinition = new InterceptorDefinitionFactory().createInterceptorDefinition(ArgsArrayInterceptor.class);
    final ClassNode classNode = ASMClassNodeLoader.get("com.navercorp.pinpoint.profiler.instrument.mock.ArgsClass");
    List<MethodNode> methodNodes = classNode.methods;
    for (MethodNode methodNode : methodNodes) {
        ASMMethodNodeAdapter methodNodeAdapter = new ASMMethodNodeAdapter(classNode.name, methodNode);
        assertEquals(false, methodNodeAdapter.hasInterceptor());
        methodNodeAdapter.addBeforeInterceptor(interceptorId, interceptorDefinition, -1);
        assertEquals(true, methodNodeAdapter.hasInterceptor());
    }
}
Also used : InterceptorDefinition(com.navercorp.pinpoint.profiler.instrument.interceptor.InterceptorDefinition) DefaultInterceptorRegistryBinder(com.navercorp.pinpoint.profiler.interceptor.registry.DefaultInterceptorRegistryBinder) InterceptorRegistryBinder(com.navercorp.pinpoint.profiler.interceptor.registry.InterceptorRegistryBinder) DefaultInterceptorRegistryBinder(com.navercorp.pinpoint.profiler.interceptor.registry.DefaultInterceptorRegistryBinder) ArgsArrayInterceptor(com.navercorp.pinpoint.profiler.instrument.mock.ArgsArrayInterceptor) InterceptorDefinitionFactory(com.navercorp.pinpoint.profiler.instrument.interceptor.InterceptorDefinitionFactory) Test(org.junit.Test)

Example 5 with InterceptorDefinitionFactory

use of com.navercorp.pinpoint.profiler.instrument.interceptor.InterceptorDefinitionFactory in project pinpoint by naver.

the class ASMMethodVariablesTest method initInterceptorLocalVariables.

@Test
public void initInterceptorLocalVariables() throws Exception {
    MethodNode methodNode = ASMClassNodeLoader.get("com.navercorp.pinpoint.profiler.instrument.mock.ConstructorChildClass", "<init>");
    ASMMethodVariables variables = new ASMMethodVariables("com/navercorp/pinpoint/profiler/instrument/mock/ConstructorChildClass", methodNode);
    assertNull(variables.getEnterInsnNode());
    assertNull(variables.getEnterInsnNode());
    InterceptorRegistryBinder interceptorRegistryBinder = new DefaultInterceptorRegistryBinder();
    int interceptorId = interceptorRegistryBinder.getInterceptorRegistryAdaptor().addInterceptor(new ArgsArrayInterceptor());
    final InterceptorDefinition interceptorDefinition = new InterceptorDefinitionFactory().createInterceptorDefinition(ArgsArrayInterceptor.class);
    InsnList instructions = new InsnList();
    boolean first = variables.initInterceptorLocalVariables(instructions, interceptorId, interceptorDefinition, -1);
    assertEquals(true, first);
    assertNotNull(variables.getEnterInsnNode());
    assertNotNull(variables.getEnterInsnNode());
}
Also used : InterceptorDefinition(com.navercorp.pinpoint.profiler.instrument.interceptor.InterceptorDefinition) DefaultInterceptorRegistryBinder(com.navercorp.pinpoint.profiler.interceptor.registry.DefaultInterceptorRegistryBinder) InterceptorRegistryBinder(com.navercorp.pinpoint.profiler.interceptor.registry.InterceptorRegistryBinder) DefaultInterceptorRegistryBinder(com.navercorp.pinpoint.profiler.interceptor.registry.DefaultInterceptorRegistryBinder) ArgsArrayInterceptor(com.navercorp.pinpoint.profiler.instrument.mock.ArgsArrayInterceptor) InterceptorDefinitionFactory(com.navercorp.pinpoint.profiler.instrument.interceptor.InterceptorDefinitionFactory) Test(org.junit.Test)

Aggregations

InterceptorDefinitionFactory (com.navercorp.pinpoint.profiler.instrument.interceptor.InterceptorDefinitionFactory)7 InterceptorDefinition (com.navercorp.pinpoint.profiler.instrument.interceptor.InterceptorDefinition)5 Test (org.junit.Test)5 ArgsArrayInterceptor (com.navercorp.pinpoint.profiler.instrument.mock.ArgsArrayInterceptor)3 MethodNode (org.objectweb.asm.tree.MethodNode)3 DefaultInterceptorRegistryBinder (com.navercorp.pinpoint.profiler.interceptor.registry.DefaultInterceptorRegistryBinder)2 InterceptorRegistryBinder (com.navercorp.pinpoint.profiler.interceptor.registry.InterceptorRegistryBinder)2 List (java.util.List)2 ClassNode (org.objectweb.asm.tree.ClassNode)2 JointPoint (com.navercorp.pinpoint.bootstrap.instrument.aspect.JointPoint)1 ASMEngine (com.navercorp.pinpoint.profiler.instrument.ASMEngine)1 ASMMethodNodeAdapter (com.navercorp.pinpoint.profiler.instrument.ASMMethodNodeAdapter)1 DefaultEngineComponent (com.navercorp.pinpoint.profiler.instrument.DefaultEngineComponent)1 EngineComponent (com.navercorp.pinpoint.profiler.instrument.EngineComponent)1 ScopeFactory (com.navercorp.pinpoint.profiler.instrument.ScopeFactory)1 Method (java.lang.reflect.Method)1 ArrayList (java.util.ArrayList)1