基于javaagent-ByteBuddy监控方法执行耗时
基于javaagent-ByteBuddy监控方法执行耗时
- 前言
- 目录结构
- 环境准备
- 测试结果
前言
- 目的:不改造原有项目代码,通过字节码增强技术来实现方法调用耗时
- 学习:最近学习Skywalking时偶然接触到有关字节码方面的知识,特地记录一下(还可以通过javassist来实现)
- 参考资料:
【黑马Skywalking】: java基础教程深入学习Skywalking全套教程
目录结构
环境准备
1. java-agent-demo项目pom:
<properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><!--解决字节码操作和Instrumentation API的复杂性--><dependency><groupId>net.bytebuddy</groupId><artifactId>byte-buddy</artifactId><version>1.9.2</version></dependency><dependency><groupId>net.bytebuddy</groupId><artifactId>byte-buddy-agent</artifactId><version>1.9.2</version></dependency></dependencies><build><plugins><plugin><artifactId>maven-assembly-plugin</artifactId><configuration><appendAssemblyId>false</appendAssemblyId><descriptorRefs><!--打包时加入依赖--><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs><archive><!--自动生成/META-INF/MANIFEST.MF--><manifestEntries><Premain-Class>PreMainAgent</Premain-Class><Agent-Class>PreMainAgent</Agent-Class><Can-Redefine-Classes>true</Can-Redefine-Classes><Can-Retransform-Classes>true</Can-Retransform-Classes></manifestEntries></archive></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin></plugins></build>
2. PreMainAgentl类:
注意:测试项目要以com.agent前缀开头才能被统计
import net.bytebuddy.agent.builder.AgentBuilder;
import net.bytebuddy.description.method.MethodDescription;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.dynamic.DynamicType;
import net.bytebuddy.implementation.MethodDelegation;
import net.bytebuddy.matcher.ElementMatchers;
import net.bytebuddy.utility.JavaModule;
import java.lang.instrument.Instrumentation;public class PreMainAgent {public static void premain(String agentParam, Instrumentation inst) {System.out.println("premain已经执行1" + agentParam);// method指定哪些方法需要被拦截,ElementMathers.any指定了所有的方法,声明intercept拦截器AgentBuilder.Transformer transformer = new AgentBuilder.Transformer() {@Overridepublic DynamicType.Builder<?> transform(DynamicType.Builder<?> builder, TypeDescription typeDescription, ClassLoader classLoader, JavaModule javaModule) {return builder.method(ElementMatchers.<MethodDescription>any()).intercept(MethodDelegation.to(MyIntercept.class));}};/*** 1.type指定了agent拦截的包名,以[com.agent]作为前缀* 2.指定了转换器transformer* 3.将配置安装到Instrumentation*/new AgentBuilder.Default().type(ElementMatchers.<TypeDescription>nameStartsWith("com.agent")).transform(transformer).installOn(inst);}public static void premain(String agentParam) {System.out.println("premain已经执行2" + agentParam);}
}
3. MyIntercept类:
import net.bytebuddy.implementation.bind.annotation.Origin;
import net.bytebuddy.implementation.bind.annotation.RuntimeType;
import net.bytebuddy.implementation.bind.annotation.SuperCall;
import java.lang.reflect.Method;
import java.util.concurrent.Callable;public class MyIntercept {@RuntimeTypepublic static Object intercept(@Origin Method method,@SuperCall Callable<?> callable) throws Exception {long start = System.currentTimeMillis();try {return callable.call();} finally {System.out.println(method + ":" + (System.currentTimeMillis() - start) + "ms");}}
}
4. Main类:
注意:测试项目要以com.agent前缀开头才能被统计
public class Main {public static void main(String[] args) throws InterruptedException {System.out.println("main方法执行");Thread.sleep(1000);}
}
测试结果
1. java-agent-demo打jar包
注意:记住java-agent-demo的jar包路径
2. 测试项目启动参数
在测试项目中的启动VM options添加一下参数,我自己随便用的参数:guantest
-javaagent:D:\project4\java-agent-demo\target\java-agent-demo-1.0-SNAPSHOT.jar=guantest
3. 测试结果
基于javaagent-ByteBuddy监控方法执行耗时相关推荐
- Java Agent简介及使用Byte Buddy和AspectJ LTW监控方法执行耗时
1.什么是Java Agent Java Agent提供了一种在加载字节码时,对字节码进行修改的方法.一共有两种方式执行:一种是在main方法执行之前,通过premain来实现:另一种是在程序运行中, ...
- 字节码编程,Byte-buddy篇二《监控方法执行耗时动态获取出入参类型和值》
作者:小傅哥 博客:https://bugstack.cn - 汇总系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 案例是剥去外衣包装展示出核心功能的最佳学习方式! 就像是我们研 ...
- 千寻位置 开发demo_java程序开发,使用javaagent无侵入代码方式,监控方法执行耗时...
背景描述 javaagent是在JDK5之后提供的新特性,也可以叫java代理.开发者通过这种机制(Instrumentation)可以在加载class文件之前修改方法的字节码(此时字节码尚未加入JV ...
- 【AOP 面向切面编程】Android Studio 使用 AspectJ 监控方法运行 ( 定义连接点注解 | 定义 Aspect 切面 | 定义切入点 | 逐个处理切入点的各个连接点 )
文章目录 一.定义 Join Point 连接点注解 二.定义 Aspect 切面 1.定义 Aspect 切面 2.定义 Aspect 切面 3.逐个处理切入点的各个连接点 4.完整 Aspect ...
- iOS逆向之深入解析如何计算+load方法的耗时
一.类方法 +load 在 pre-main 时期,objc 会向 dyld 注册一个 init 回调: void _objc_init(void) {static bool initialized ...
- java agent_GitHub - dingjs/javaagent: 基于javaagent开发的APM工具,收集方法的执行次数和执行时间,定时输出成json格式的日志。...
Javaagent 概述 javaagent是一个简单优雅的java agent,利用java自带的instrument特性+javassist字节码编辑技术,实现了无侵入的方法级性能监控.相比于Ne ...
- linux进程看门狗使用方式,Linux系统中基于看门狗的精细化进程监控方法及系统的制作方法...
Linux系统中基于看门狗的精细化进程监控方法及系统的制作方法 [技术领域] [0001] 本发明涉及Linux系统的进程监控技术领域,特别是涉及一种Linux系统中基于看 门狗的精细化进程监控方法及 ...
- Python语言学习:基于python五种方法实现使用某函数名【func_01】的字符串格式('func_01')来调用该函数【func_01】执行功能
Python语言学习:基于python五种方法实现使用某函数名[func_01]的字符串格式('func_01')来调用该函数[func_01]执行功能 目录 问题提出 代码五种设计思路 T1方法:e ...
- linux 网络监控 邮件,一种基于Linux的邮件监控方法与流程
本发明涉及计算机安全技术领域,具体地说是一种实用性强.基于Linux的邮件监控方法. 背景技术: 随着计算机的普及以及人们对个人信息安全的重视,如何保障计算机乃至个人信息的安全成为了一个至关重要的问题 ...
最新文章
- Spring 自动化装配Bean
- 广东2021高考成绩查询6,2021全国高考6月10日全部结束 预计最快6月23日可查高考成绩...
- 关于libStagefright系列漏洞分析
- Centos Git1.7.1升级到Git2.2.1
- js常用阻止冒泡事件
- 机器学习算法源码全解析(三)-范数规则化之核范数与规则项参数选择
- linux命令速查手册_干货| 有了这个速查手册,还怕Linux命令记不住?
- 安卓逆向_10 --- Log 日志的插入和分析、toast方法、栈跟踪
- [转载] Python中的xrange和range的区别
- windows定时任务python shutil_python- shutil 高级文件操作
- gensim读取已训练模型LDA模型的模型与dictionary
- android的xml登录,Android----xml文件中的控件的id设置
- curl的php多线程类,php利用curl实现多线程类的示例
- 部分更新没有安装 KB4535102
- JSP完成添加商品时的图片上传
- 六面体单元的体积计算方法
- 用这个方法1分钟能批量下载上百张图片,亲测有效速度快
- 本学期3个sprint的团队贡献分
- 即构推出视频见证系统方案,全面支持泛金融实时双录
- 三国演义告诉我们的60条真理