最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

instrumentation - Agentmain not works but premain works - Stack Overflow

programmeradmin1浏览0评论

A simple Java instrumenation simpleApplication.jar contains ApplicationBeingTransformed.class, application.mf.

ApplicationBeingTransformed:

public class ApplicationBeingTransformed {
    public static void main(String[] args) {
        add();
        System.out.println("Time while executing main method of ApplicationBeingTransformed class is " + System.currentTimeMillis());
    }

    private static void add() {
        // TODO Auto-generated method stub
        System.out.println("This is add block");
    }
}

application.mf:

Main-Class: ApplicationBeingTransformed

Instrumentation jar contains SimpleInstru.class, instru.mf

SimpleInstru.java:

public class SimpleInstru {
    
public static void agentmain(String argument,Instrumentation instrumentation) {

    System.out.println("Agent started at " + System.currentTimeMillis());
    System.out.println("argument: "+argument) ;
    System.out.println("Instrumentation: "+instrumentation);                            
    System.out.println(SimpleInstru.class.getClassLoader().toString());
    System.out.println("Elementmatcher: "+ElementMatchers.nameContains("ApplicationBeingTransformed"));
        Advice advice = Advice.to(TimeFooter.class);
        System.out.println("**************************start******************************");
        new AgentBuilder.Default()
                .type(ElementMatchers.nameContains("ApplicationBeingTransformed"))
                .transform((DynamicType.Builder<?> builder,
                            TypeDescription type,
                            ClassLoader loader,
                            JavaModule module) -> {
                            System.out.println("type:" +type +"   builder.visit(advice.on(ElementMatchers.isMethod())):"+builder.visit(advice.on(ElementMatchers.isMethod())));
                    return builder.visit(advice.on(ElementMatchers.isMethod()));
                }).installOn(instrumentation);
                System.out.println("**************************END********************************");
    }

    public static class TimeFooter {
        @Advice.OnMethodExit(onThrowable = Throwable.class)
        public static void exit(@Advice.Origin String methodName) {
            System.out.println("Now exiting: \n"+methodName);
        }
    }
}

instru.mf:

Agent-Class: SimpleInstru
Class-Path: byte-buddy-1.10.22.jar

agentAttacher class:

import com.sun.tools.attach.VirtualMachine;

public class DynamicAgentAttacher {
    public static void main(String[] args) {
        try {
            if (args.length < 2) {
                System.err.println("Usage: java DynamicAgentAttacher <PID> <Agent Jar Path>");
                System.exit(1);
            }

            String pid = args[0];  // Target JVM process PID
            String agentJar = args[1];  // Path to the OpenTelemetry agent jar
            String agentArgs = "-Dotel.exporter=console " +
                    "-Dotel.traces.exporter=logging-otlp " +
                    "-Dotel.metrics.exporter=console " +
                    "-Dotel.logs.exporter=console " +
                    "-Dotel.service.name=my-java-service " +
                    "-Dotel.javaagent.enabled=true " +
                    "-Dotel.traces.sampler=always_on";  // Add any additional agent arguments here

            // Attach to the target JVM process by PID
            VirtualMachine vm = VirtualMachine.attach(pid);

            // Load the OpenTelemetry agent with the specified arguments
            System.out.println("Attaching OpenTelemetry Java Agent to PID: " + pid);
            vm.loadAgent(agentJar, agentArgs);

            // Detach from the target JVM after agent is loaded
            vm.detach();
            System.out.println("OpenTelemetry Java Agent attached successfully.");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

I want to print a sysout "Now Existing" for every method in the ApplicationBeingTransformed class using dynamic loading. But the sysout never prints.

发布评论

评论列表(0)

  1. 暂无评论