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.