字节码编程之bytebuddy结合javaagent支持多种监控方式

写在前面

打印方法执行耗时是监控,获取程序运行的JVM信息是监控,链路追踪也是监控。

本文看下如何实现一个通用的监控解决方案。

1:程序

定义premain:

package com.dahuyou.multi.monitor;import com.dahuyou.multi.monitor.factory.PluginFactory;
import com.dahuyou.multi.monitor.linktrace.LinkTraceAdvice;
import com.dahuyou.multi.monitor.plugin.IPlugin;
import com.dahuyou.multi.monitor.plugin.InterceptPoint;
import net.bytebuddy.agent.builder.AgentBuilder;
import net.bytebuddy.asm.Advice;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.dynamic.DynamicType;
import net.bytebuddy.matcher.ElementMatchers;
import net.bytebuddy.utility.JavaModule;import java.lang.instrument.Instrumentation;
import java.util.List;public class MyPreMain {public static void premain(String agentArgs, Instrumentation inst) {System.out.println("Java agent配置参数:" + agentArgs);System.out.println("============================");System.out.println("大忽悠🐂B监控系统开始工作了!");System.out.println("============================");AgentBuilder agentBuilder = new AgentBuilder.Default();// 获取所有可用的监控插件(jvm,链路追踪,执行耗时等)List<IPlugin> pluginGroup = PluginFactory.pluginGroup;for (IPlugin plugin : pluginGroup) {InterceptPoint[] interceptPoints = plugin.buildInterceptPoint();for (InterceptPoint point : interceptPoints) {AgentBuilder.Transformer transformer= (builder, typeDescription, classLoader, javaModule) -> {builder = builder.visit(Advice.to(plugin.adviceClass()).on(point.buildMethodsMatcher()));return builder;};agentBuilder = agentBuilder.type(point.buildTypesMatcher()).transform(transformer).asDecorator();}}// 将bytebuddy的插桩逻辑安装到instrumentagentBuilder.with(new AgentBuilder.Listener() {@Overridepublic void onDiscovery(String s, ClassLoader classLoader, JavaModule javaModule, boolean b) {}@Overridepublic void onTransformation(TypeDescription typeDescription, ClassLoader classLoader, JavaModule javaModule, boolean b, DynamicType dynamicType) {
//                System.out.println("onTransformation:" + typeDescription);}@Overridepublic void onIgnored(TypeDescription typeDescription, ClassLoader classLoader, JavaModule javaModule, boolean b) {}@Overridepublic void onError(String s, ClassLoader classLoader, JavaModule javaModule, boolean b, Throwable throwable) {}@Overridepublic void onComplete(String s, ClassLoader classLoader, JavaModule javaModule, boolean b) {}}).installOn(inst);}
}

这里将不同的监控类型抽象为插件,定义了监控插件接口类:

package com.dahuyou.multi.monitor.plugin;/*** 监控插件接口*/
public interface IPlugin {/*插件名称*/String pluginName();/*插件的监控点(即监控哪些类的哪些方法)*/InterceptPoint[] buildInterceptPoint();/*执行具体监控的切面类*/Class adviceClass();}

本文实现,打印JVM,和链路追踪两种监控方式,实现类如下:

package com.dahuyou.multi.monitor.plugin.concrete;import com.dahuyou.multi.monitor.jvmusage.JVMUsageAdvice;
import com.dahuyou.multi.monitor.plugin.IPlugin;
import com.dahuyou.multi.monitor.plugin.InterceptPoint;
import net.bytebuddy.description.method.MethodDescription;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.matcher.ElementMatcher;
import net.bytebuddy.matcher.ElementMatchers;/*** jvm使用情况插件*/
public class JvmPlugin implements IPlugin {@Overridepublic String pluginName() {return "jvmusage";}@Overridepublic InterceptPoint[] buildInterceptPoint() {return new InterceptPoint[]{new InterceptPoint() {@Overridepublic ElementMatcher<TypeDescription> buildTypesMatcher() {return ElementMatchers.nameStartsWith("com.dahuyou.multi.monitor");}@Overridepublic ElementMatcher<MethodDescription> buildMethodsMatcher() {return ElementMatchers.named("method1").or(ElementMatchers.named("method2")).or(ElementMatchers.named("method3"));}}};}@Overridepublic Class adviceClass() {return JVMUsageAdvice.class;}}
package com.dahuyou.multi.monitor.plugin.concrete;import com.dahuyou.multi.monitor.jvmusage.JVMUsageAdvice;
import com.dahuyou.multi.monitor.linktrace.LinkTraceAdvice;
import com.dahuyou.multi.monitor.plugin.IPlugin;
import com.dahuyou.multi.monitor.plugin.InterceptPoint;
import net.bytebuddy.description.method.MethodDescription;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.matcher.ElementMatcher;
import net.bytebuddy.matcher.ElementMatchers;/*** 链路追踪插件*/
public class LinkTracePlugin implements IPlugin {@Overridepublic String pluginName() {return "linktrace";}@Overridepublic InterceptPoint[] buildInterceptPoint() {return new InterceptPoint[]{new InterceptPoint() {@Overridepublic ElementMatcher<TypeDescription> buildTypesMatcher() {return ElementMatchers.nameStartsWith("com.dahuyou.multi.monitor");}@Overridepublic ElementMatcher<MethodDescription> buildMethodsMatcher() {return ElementMatchers.named("method1").or(ElementMatchers.named("method2")).or(ElementMatchers.named("method3"));}}};}@Overridepublic Class adviceClass() {return LinkTraceAdvice.class;}}

通过插件工厂PluginFactory来维护所有可用的监控插件:

package com.dahuyou.multi.monitor.factory;import com.dahuyou.multi.monitor.plugin.IPlugin;
import com.dahuyou.multi.monitor.plugin.concrete.JvmPlugin;
import com.dahuyou.multi.monitor.plugin.concrete.LinkTracePlugin;
import java.util.ArrayList;
import java.util.List;/*** 可用监控插件工厂类*/
public class PluginFactory {public static List<IPlugin> pluginGroup = new ArrayList<>();static {//链路追踪监控pluginGroup.add(new LinkTracePlugin());//Jvm监控插件pluginGroup.add(new JvmPlugin());}}

接口InterceptPoint,用来抽象监控点,接口定义如下:

package com.dahuyou.multi.monitor.plugin;import net.bytebuddy.description.method.MethodDescription;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.matcher.ElementMatcher;/*** 插件监控点接口,设置插件要监控的类和要监控的方法*/
public interface InterceptPoint {/*设置插件要监控的类*/ElementMatcher<TypeDescription> buildTypesMatcher();/*设置插件要监控的方法*/ElementMatcher<MethodDescription> buildMethodsMatcher();}

核心逻辑就是这些了,详细的大家感兴趣的话还是看源码。

接着来打包:
在这里插入图片描述
测试类:

package com.dahuyou.multi.monitor.test;public class ApiTest {public static void main(String[] args) {//线程一new Thread(() -> new ApiTest().method1(), "线程思密达").start();
//        new Thread(() -> new ApiTest().method1(), "线程萨瓦迪卡").start();//        new ApiTest().method1();}public void method1() {System.out.println("测试结果:hi1");method2();}public void method2() {System.out.println("测试结果:hi2");method3();}public void method3() {System.out.println("测试结果:hi3");}}

配置javaagent:
在这里插入图片描述
运行测试:
在这里插入图片描述

写在后面

参考文章列表

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/48293.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安卓逆向入门(3)------Frida基础

安装frida pip install frida pip install frida-tools //验证安装成功 frida --versionfrida连接手机 1、Android&#xff08;已ROOT&#xff09; frida-server 参考&#xff1a;https://www.jianshu.com/p/c349471bdef7 2、Android&#xff08;非ROOT&#xff09; pip3 in…

智能门锁的工作原理

智能门锁的工作原理是一个复杂而精密的过程&#xff0c;它结合了物联网、密码学、身份认证和通信技术等多个领域的先进技术。以下是智能门锁工作原理的详细解析&#xff1a; 一、身份认证 智能门锁通过身份认证机制来确保只有授权的用户才能开启门锁。常见的身份认证方式包括…

数据库内核研发学习之路(五)创建postgres系统表

写在前面 在使用postgres的时候&#xff0c;有很多表是我们一开始安装好数据库就存在的&#xff0c;这些表称为系统表&#xff0c;他们记载一些数据库信息&#xff0c;比如我们做运维工作常用的pg_stat_activity;我们在数据库中查询这张表可以发现他存储了一些数据库连接信息。…

多租户架构的艺术:在SQL Server中实现数据库的多租户

多租户架构的艺术&#xff1a;在SQL Server中实现数据库的多租户 在云计算和SaaS&#xff08;软件即服务&#xff09;时代&#xff0c;多租户架构&#xff08;Multi-Tenancy&#xff09;成为了数据库设计中的一个关键概念。它允许多个租户&#xff08;客户&#xff09;共享相同…

初等数论精解【2】

文章目录 素数基础素数理论互素定义性质应用示例最大公约数方法一&#xff1a;欧几里得算法方法二&#xff1a;列举法&#xff08;适用于较小的数&#xff09;欧几里得算法编程实现扩展欧几里得算法概述算法背景算法原理算法步骤应用场景示例代码 结论素数分布素数概述一、定义…

GO:Socket编程

目录 一、TCP/IP协议族和四层模型概述 1.1 互联网协议族&#xff08;TCP/IP&#xff09; 1.2 TCP/IP四层模型 1. 网络访问层&#xff08;Network Access Layer&#xff09; 2. 网络层&#xff08;Internet Layer&#xff09; 3. 传输层&#xff08;Transport Layer&#…

WPF+Mvvm 项目入门完整教程(一)

WPF+Mvvm 入门完整教程一 创建项目MvvmLight框架安装完善整个项目的目录结构创建自定义的字体资源下载更新和使用字体资源创建项目 打开VS2022,点击创建新项目,选择**WPF应用(.NET Framework)** 创建一个名称为 CommonProject_DeskTop 的项目,如下图所示:MvvmLight框架安装…

机器学习-19-基于交互式web应用框架streamlit和gradio转化数据和机器学习模型

参考Streamlit:简单快速的Python Web应用开发工具 参考Python(Web时代)—— 超简单:一行代码就能搭建网站 参考对比Streamlit和Gradio:选择最适合你的Python交互式应用框架 参考Gradio:构建交互式界面的简单而强大的Python库 参考【吴恩达 X HuggingFace】使用Gradio快速…

【JavaScript 算法】双指针法:高效处理数组问题

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、算法原理二、算法实现示例问题1&#xff1a;两数之和 II - 输入有序数组示例问题2&#xff1a;反转字符串中的元音字母注释说明&#xff1a; 三、应用场景四、总结 双指针法&#xff08;Two Pointer Technique&#xff…

sqlalchemy_dm

1、参考文档&#xff1a; https://blog.csdn.net/njcwwddcz/article/details/126554118 https://eco.dameng.com/document/dm/zh-cn/pm/dmpython-dialect-package.html 2、生成工具 sqlalchemy2.0.0.zip 3、安装步骤 conda create --name kes --clone kes1 rz unzip sql…

高等数学用到的初等数学

指数 同指不同底乘法 (ab)xaxbx

如何做到高级Kotlin强化实战?(三)

高级Kotlin强化实战&#xff08;二&#xff09; 2.13 constructor 构造器2.14 Get Set 构造器2.15 操作符2.16 换行 2.13 constructor 构造器 //Java public class Utils { private Utils() {} public static int getScore(int value) { return 2 * value;} }//Kotlin class U…

深入理解Java并发线程阻塞唤醒类LockSupport

LockSupprot 用来阻塞和唤醒线程&#xff0c;底层实现依赖于Unsafe类 该类包含一组用于阻塞和唤醒线程的静态方法&#xff0c;这些方法主要是围绕 park 和 unpark 展开 public class LockSupportDemo1 {public static void main(String[] args) {Thread mainThread Thread.cu…

实时吸烟检测系统:基于深度学习与YOLO模型的完整实现

引言 在公共场所吸烟不仅有害吸烟者的健康&#xff0c;也会影响到周围的人。为了更好地管理和监控公共场所的吸烟行为&#xff0c;本文介绍了一种基于深度学习的吸烟检测系统。该系统包含一个用户界面&#xff0c;利用YOLO&#xff08;You Only Look Once&#xff09;v8/v7/v6…

微信小程序(百战商城)的实战项目的首页的制作及讲解

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

【人工智能】基于香橙派AIpro和昇腾AI计算芯片的面部口罩检测(详细教程)

目录 前言 1.介绍开发板 2.应用场景 3.安装操作系统 3.1 下载工具 3.2 烧录系统 3.3 系统装载 4.配置操作系统 4.1 登录系统账户 4.2 配置网络连接 4.3 查看设备网络 4.4 配置远程连接 5.部署目标检测应用 5.1 准备运行环境 5.2 模型二次训练 ​5.3 热成像温度…

JavaScript 异步编程:提升现代Web应用的性能与体验

异步概念解析 在编程领域&#xff0c;异步&#xff08;Asynchronous&#xff09;是一种允许程序继续执行而不等待某个操作完成的机制&#xff0c;与之相反的是同步&#xff08;Synchronous&#xff09;&#xff0c;其中程序会暂停并等待每个操作完成才继续下一步。异步编程的核…

数据结构 day4

目录 思维导图&#xff1a; 学习内容&#xff1a; 1. 链表的引入 1.1 顺序表的优缺点 1.1.1 优点 1.1.2 不足 1.1.3 缺点 1.2 链表的概念 1.2.1 链式存储的线性表叫做链表 1.2.2 链表的基础概念 1.3 链表的分类 2. 单向链表 2.1 节点结构体类型 2.2 创建链表 2.…

pikachu之暴力破解

1基于表单的暴力破解 随便输入然后抓包 选中添加账号密码 添加分别添加payload1&#xff0c;2&#xff0c;的字典 开始攻击 2验证码绕过on server 和基于表单的暴力破解相比&#xff0c;多了一个验证码功能 这个验证码是前端的验证码&#xff08;和前面那个一样选中添加账号密码…

Java小技能:多级组织机构排序并返回树结构(包含每个层级的子节点和业务数据集合)

文章目录 引言I 实体定义1.1 部门1.2 用户组织机构中间表1.3 树状DTOII 抽取组织机构排序方法2.1 树状排序方法2.2 案例III 查询条件构建3.1 根据部门进行权限控制3.2 注入风险引言 需求: 根据组织机构进行数据授权控制,例如控制船舶、船舶设备、摄像头、港区查看权限。 一…