java agent方式实现方法参数收及处理,可以指定任意处理器

buried-agent是一个基于Java字节码技术的可配置agent,它能收集数据并执行指定处理器的方法。通过在目标方法上添加特定命名和注解,agent可在运行时捕获方法参数并进行处理。
摘要由CSDN通过智能技术生成

buried-agent

项目地址: https://github.com/zwk0508/buried-agent

基于Java字节码技术实现的可配置、收集数据并执行处理器方法的agent,可以指定任意的处理器

用法

项目启动时添加javaagent: -javaagent:agent.jar=<agent.conf的地址>读取配置文件的方式是 new File(“path”)

实现方式

把需要收集数据的方法重命名为:___auto_generate_method_ + 方法名 + 后缀,重新实现同名方法,并在新方法上生成@GeneratedMethod注解,
用于查找原来的方法,获取方法上的注解信息

 private void ___auto_generate_method_forTest_1(Object a, byte b, short s, int i, long j, float f, double d, char c, boolean z) {
   
        System.out.println(a);
    }

    @GeneratedMethod(
        value =
Java Agent 是一种 Java 应用程序的增强方式,可以在不修改应用程序源代码的情况下,对其进行一些特定的操作,例如监控、日志记录、性能调优等。 Micrometer 是一款度量指标库,它提供了一种统一的 API,用于在 Java 应用程序中收集和展示各种类型的度量指标,例如计数器、计时器、直方图等。 在利用 Java Agent 监控 HTTP 请求处理过程时,可以借助 Micrometer 来收集和展示各种类型的度量指标。以下是实现方法: 1. 在 Java Agent 中,使用 Instrumentation API 找到 HTTP 请求处理类的字节码,然后对其进行增强,添加 Micrometer 相关的代码。 2. 在 HTTP 请求处理类中,使用 Micrometer API 创建并初始化度量指标,例如计数器和计时器。 3. 在 HTTP 请求处理类的方法中,根据请求的不同情况,使用 Micrometer API 更新度量指标的值,例如增加计数器的值或记录计时器的耗时。 下面是一个简单的示例,演示如何利用 Java Agent 和 Micrometer 监控 HTTP 请求处理过程: 1. 创建一个 Java Agent,代码如下: ```java public class HttpAgent { public static void premain(String agentArgs, Instrumentation inst) { Class<?> httpClass = null; for (Class<?> clazz : inst.getAllLoadedClasses()) { if (clazz.getName().equals("com.example.HttpHandler")) { httpClass = clazz; break; } } if (httpClass != null) { inst.addTransformer(new HttpTransformer()); } } } ``` 2. 创建一个字节码转换器,代码如下: ```java public class HttpTransformer implements ClassFileTransformer { @Override public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { if (className.equals("com/example/HttpHandler")) { ClassReader cr = new ClassReader(classfileBuffer); ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS); ClassVisitor cv = new HttpClassVisitor(cw); cr.accept(cv, 0); return cw.toByteArray(); } return classfileBuffer; } } ``` 3. 创建一个类访问器,代码如下: ```java public class HttpClassVisitor extends ClassVisitor { public HttpClassVisitor(ClassWriter cw) { super(Opcodes.ASM5, cw); } @Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); if (name.equals("handle")) { mv = new HttpMethodVisitor(mv); } return mv; } } ``` 4. 创建一个方法访问器,代码如下: ```java public class HttpMethodVisitor extends MethodVisitor { public HttpMethodVisitor(MethodVisitor mv) { super(Opcodes.ASM5, mv); } @Override public void visitCode() { super.visitCode(); mv.visitFieldInsn(Opcodes.GETSTATIC, "io/micrometer/core/instrument/Metrics", "counter", "Lio/micrometer/core/instrument/Counter;"); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "io/micrometer/core/instrument/Counter", "increment", "()V", false); mv.visitLdcInsn("http.requests"); mv.visitFieldInsn(Opcodes.GETSTATIC, "io/micrometer/core/instrument/Metrics", "timer", "Lio/micrometer/core/instrument/Timer;"); mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/System", "nanoTime", "()J", false); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "io/micrometer/core/instrument/Timer", "record", "(Ljava/time/Duration;)V", false); } @Override public void visitInsn(int opcode) { if (opcode >= Opcodes.IRETURN && opcode <= Opcodes.RETURN) { mv.visitFieldInsn(Opcodes.GETSTATIC, "io/micrometer/core/instrument/Metrics", "timer", "Lio/micrometer/core/instrument/Timer;"); mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/System", "nanoTime", "()J", false); mv.visitInsn(Opcodes.DUP2); mv.visitInsn(Opcodes.LSUB); mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/time/Duration", "ofNanos", "(J)Ljava/time/Duration;", false); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "io/micrometer/core/instrument/Timer", "record", "(Ljava/time/Duration;)V", false); } super.visitInsn(opcode); } } ``` 5. 在 HTTP 请求处理类中,使用 Micrometer API 创建并初始化度量指标,例如计数器和计时器,代码如下: ```java public class HttpHandler { private final Counter requests = Metrics.counter("http.requests"); private final Timer requestTimer = Metrics.timer("http.requestTimer"); public void handle(HttpRequest request, HttpResponse response) { requests.increment(); Timer.Sample sample = Timer.start(); try { // 处理请求 } finally { sample.stop(requestTimer); } } } ``` 6. 在 HTTP 请求处理类的方法中,根据请求的不同情况,使用 Micrometer API 更新度量指标的值,例如增加计数器的值或记录计时器的耗时,代码如上所示。 通过以上步骤,就可以利用 Java Agent 和 Micrometer 监控 HTTP 请求处理过程,实时收集和展示各种类型的度量指标,例如请求总数、请求响应时间、请求处理时间等等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值