Search in sources :

Example 1 with Weave

use of com.newrelic.api.agent.weaver.Weave in project newrelic-java-agent by newrelic.

the class AgentPreprocessors method markUtilityClasses.

/**
 * Visit classes and add a "@UtilityClass" annotation on anything that doesn't have "@Weave" or "@SkipIfPresent"
 */
ClassVisitor markUtilityClasses(ClassVisitor cv) {
    return new ClassVisitor(WeaveUtils.ASM_API_LEVEL, cv) {

        private boolean isUtilityClass = true;

        @Override
        public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
            if (Type.getDescriptor(Weave.class).equals(desc) || Type.getDescriptor(SkipIfPresent.class).equals(desc) || Type.getDescriptor(WeaveWithAnnotation.class).equals(desc)) {
                this.isUtilityClass = false;
            }
            return super.visitAnnotation(desc, visible);
        }

        @Override
        public void visitEnd() {
            if (isUtilityClass) {
                addUtilityClassAnnotation(cv);
            }
            super.visitEnd();
        }

        private ClassVisitor addUtilityClassAnnotation(ClassVisitor cv) {
            AnnotationVisitor av = cv.visitAnnotation(Type.getDescriptor(UtilityClass.class), true);
            av.visit("weavePackageName", weavePackageName);
            av.visitEnd();
            return cv;
        }
    };
}
Also used : AnnotationVisitor(org.objectweb.asm.AnnotationVisitor) SkipIfPresent(com.newrelic.api.agent.weaver.SkipIfPresent) UtilityClass(com.newrelic.weave.UtilityClass) ClassVisitor(org.objectweb.asm.ClassVisitor) Weave(com.newrelic.api.agent.weaver.Weave)

Example 2 with Weave

use of com.newrelic.api.agent.weaver.Weave in project newrelic-java-agent by newrelic.

the class AgentPreprocessors method gatherTraceInfo.

/**
 * Visit the methods of weave classes which have {@link Trace} annotations. <br/>
 * Methods which have tracers will be stored in the tracedWeaveInstrumentationDetails map.
 */
ClassVisitor gatherTraceInfo(ClassVisitor cv) {
    // weave package name -> WeaverTraceDetails
    Set<TracedWeaveInstrumentationTracker> initial = Sets.newConcurrentHashSet();
    tracedWeaveInstrumentationDetails.putIfAbsent(weavePackageName, initial);
    return new ClassVisitor(WeaveUtils.ASM_API_LEVEL, cv) {

        private boolean isWeave = false;

        private boolean isWeaveWithAnnotation = false;

        private String originalName;

        @Override
        public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
            originalName = name;
            super.visit(version, access, name, signature, superName, interfaces);
        }

        /**
         * Get the name of the original class specified in @Weave(originalName="...")
         */
        @Override
        public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
            AnnotationVisitor av = super.visitAnnotation(desc, visible);
            if (Type.getDescriptor(Weave.class).equals(desc)) {
                isWeave = true;
                return new AnnotationVisitor(WeaveUtils.ASM_API_LEVEL, av) {

                    @Override
                    public void visit(String name, Object value) {
                        if (name.equals("originalName")) {
                            originalName = ((String) value).replace('.', '/');
                        }
                        super.visit(name, value);
                    }
                };
            }
            if (Type.getDescriptor(WeaveWithAnnotation.class).equals(desc)) {
                isWeaveWithAnnotation = true;
            }
            return av;
        }

        @Override
        public MethodVisitor visitMethod(final int access, final String methodName, final String methodDesc, String signature, String[] exceptions) {
            MethodVisitor mv = super.visitMethod(access, methodName, methodDesc, signature, exceptions);
            return new MethodVisitor(WeaveUtils.ASM_API_LEVEL, mv) {

                @Override
                public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
                    AnnotationVisitor av = super.visitAnnotation(desc, visible);
                    if (Type.getDescriptor(Trace.class).equals(desc)) {
                        Agent.LOG.log(Level.FINER, "Storing TracedWeaveInstrumentation: {0} - {1}.{2}({3})", weavePackageName, originalName, methodName, methodDesc);
                        TraceDetailsBuilder builder = TraceDetailsBuilder.newBuilder().setInstrumentationType(InstrumentationType.TracedWeaveInstrumentation).setInstrumentationSourceName(weavePackageName);
                        av = new Annotation(av, desc, builder) {

                            @Override
                            public void visitEnd() {
                                tracedWeaveInstrumentationDetails.get(weavePackageName).add(new TracedWeaveInstrumentationTracker(weavePackageName, originalName, new Method(methodName, methodDesc), isWeaveWithAnnotation, getTraceDetails(false)));
                                super.visitEnd();
                            }
                        };
                    }
                    return av;
                }
            };
        }
    };
}
Also used : TraceDetailsBuilder(com.newrelic.agent.instrumentation.tracing.TraceDetailsBuilder) ClassVisitor(org.objectweb.asm.ClassVisitor) Method(org.objectweb.asm.commons.Method) Annotation(com.newrelic.agent.instrumentation.tracing.Annotation) WeaveWithAnnotation(com.newrelic.api.agent.weaver.WeaveWithAnnotation) MethodVisitor(org.objectweb.asm.MethodVisitor) Trace(com.newrelic.api.agent.Trace) WeaveWithAnnotation(com.newrelic.api.agent.weaver.WeaveWithAnnotation) AnnotationVisitor(org.objectweb.asm.AnnotationVisitor) Weave(com.newrelic.api.agent.weaver.Weave)

Aggregations

Weave (com.newrelic.api.agent.weaver.Weave)2 AnnotationVisitor (org.objectweb.asm.AnnotationVisitor)2 ClassVisitor (org.objectweb.asm.ClassVisitor)2 Annotation (com.newrelic.agent.instrumentation.tracing.Annotation)1 TraceDetailsBuilder (com.newrelic.agent.instrumentation.tracing.TraceDetailsBuilder)1 Trace (com.newrelic.api.agent.Trace)1 SkipIfPresent (com.newrelic.api.agent.weaver.SkipIfPresent)1 WeaveWithAnnotation (com.newrelic.api.agent.weaver.WeaveWithAnnotation)1 UtilityClass (com.newrelic.weave.UtilityClass)1 MethodVisitor (org.objectweb.asm.MethodVisitor)1 Method (org.objectweb.asm.commons.Method)1