skywalking agent插件开发过程中各种拦截点的写法

skywalking 插件源码分析 skywalking 插件源码分析一、总览1.1 启动1.2 写一个插件1.2.1 定义拦截规则1.2.2 配置插件定义1.2.3 实现一个拦截器1.2.4 一个现成的插件二. 源码分析2.1 源码位置2.2 启动流程2.1.1 启动&处理启动参数2.1.2 加载插件1. 获取 SystemClassloader2. 设置路径集合:3. 搜索插件jar包中"skywalking-plugin.def"4. 加载skywalking-plugin.def内容5. * Instrumet类简介6.* 切 阅读详情

概述

自己在开发插件的过程中,因为书写拦截器遇到了不少问题,记录于此,以供参考。

拦截普通类

拦截普通类这个场景比较常见,可以net.bytebuddy.matcher.ElementMatchers#named(ClassName)来进行匹配,具体例子如下:

来自WebfluxWebClient插件org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassEnhancePluginDefine:

@Override
protected ClassMatch enhanceClass() {
    return NameMatch.byName(ENHANCE_CLASS);
}

拦截内部类

连接内部实际上和拦截不同类用的方法一样,唯一的不同点是类的写法不同,如果是普通类,直接写其路径名即可,比如

private static final String ENHANCE_CLASS = "com.package.ClassName"

而内部类则需要在内部类和外部类之间加一个#号来进行分割,而不能用.

具体写法如下:private static final String ENHANCE_CLASS = "com.package.ClassName"

拦截接口实现类

拦截接口实现类则不同,需要通过org.apache.skywalking.apm.agent.core.plugin.match.HierarchyMatch#byHierarchyMatch(String ..paraentType)传入的参数是可变参数,也就是说传入拦截的接口可以是多个。具体使用方式如下:

来自light4j-plugins插件的org.apache.skywalking.apm.plugin.light4j.define.LightInstrumentation:

@Override
protected ClassMatch enhanceClass() {
    return HierarchyMatch.byHierarchyMatch(new String[] {ENHANCE_CLASS});
}

拦截注解

拦截注解,则分成两种情况:

拦截注解修饰的类

拦截指定注解修饰的类要通过org.apache.skywalking.apm.agent.core.plugin.match.ClassAnnotationMatch#byClassAnnotationMatch(String .. annotation)来进行拦截,具体例子如下:

@Override
protected ClassMatch enhanceClass() {
    return byClassAnnotationMatch(new String[] {ANNOTATION_NAME});
}

拦截注解修饰的方法

拦截指定注解修饰的类要通过org.apache.skywalking.apm.agent.core.plugin.match.MethodInheritanceAnnotationMatcher#byMethodInheritanceAnnotationMatcher(),这个方法主要是重写的getInstanceMethodsInterceptPoints()里边的,具体用法和前边的不同:

@Override
public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() {
    return new InstanceMethodsInterceptPoint[] {
        new DeclaredInstanceMethodsInterceptPoint() {
            @Override
            public ElementMatcher<MethodDescription> getMethodsMatcher() {
                return byMethodInheritanceAnnotationMatcher(named(REQUEST_MAPPING_ENHANCE_ANNOTATION));
            }

            @Override
            public String getMethodsInterceptor() {
                return REQUEST_MAPPING_METHOD_INTERCEPTOR;
            }

            @Override
            public boolean isOverrideArgs() {
                return false;
            }
        }
    };
}

同时由于对匹配的类不作要求,因而可以统一写成如下样式:

@Override
protected ClassMatch enhanceClass() {
    return ClassAnnotationMatch.byClassAnnotationMatch(getEnhanceAnnotations());
}

总结

本文主要总结了自己写SkyWalking agent端插件的时候常用的匹配方法,并对每一个方法写了一个demo以供参考(所有demo均来自社区插件中的具体类),希望能给想开发SkyWalking插件的小伙伴以帮助。

Skywalking(9):过滤指定的端点 在开发过程中,有一些端点(接口)并不需要去进行监控,比如Swagger相关的端点。这个时候我们就可以使用Skywalking提供的过滤插件来进行过滤。在skywalking_plugins中编写两个接口进行测试: package com.itcast.skywalking_plugins.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.a 阅读详情

相关推荐

VMD-CNN-BiLSTM-Attention预测模型 —— 数学模型介绍&完整实例代码

想解决电力负荷预测中的非线性、非平稳难题?这篇博客介绍了一种创新混合模型,结合变分模态分解(VMD)和CNN-BiLSTM-Attention深度学习架构,实现超高精度预测! ✨ 核心亮点: ✅ VMD分解:有效分离复杂负荷信号,提取关键频率特征 ✅ 混合深度学习:CNN捕捉局部模式 + BiLSTM学习长时序依赖 + 注意力机制聚焦关键时段 ✅ 端到端优化:从数据预处理(滑动窗口、归一化)到模型训练(MSE损失+Adam优化),完整流程公开! ✅ 工业级评估:提供MSE、MAE、MAPE、R²多指标验证

qq_42924330的博客 1653

Skywalking插件开发Java agent

Java agent是java命令的一个参数。参数javaagent可以用于指定一个jar包

weixin_42467874的博客 1378

ECC椭圆曲线加解密原理详解(配图)

椭圆曲线加解密原理详解 本文主要参照:ECC椭圆曲线详解(有具体实例)[1] 前言: 椭圆曲线(ECC)加密原理跟RSA加解密原理比起来,可真是晦涩难懂。拜读了大神Kalafinaian文章“ECC椭圆曲线详解(有具体实例)”,终于看到了参透的曙光。 由于原文中有微小的瑕疵,也为了便于阅读起来更加流畅,我重新整理了一下这篇文章。 为什么使用椭圆曲线加密算法? RSA的解决分解整数问题需要亚指数...

Mark的博客 7万+

Skywalking的增强与拦截机制

字节增强条件匹配 在 skywalking 中实现很多基于 byte-buddy 的关于链式匹配查询的实现, 代码如下所示: public abstract class AbstractJunction<V> implements ElementMatcher.Junction<V> 其对应的类的类图关系如下所示: 除此之外, 为了便于更好的执...

bajiaoyan5785的博客 2740

ModusToolbox 实战避坑指南|从环境配置到项目构建

本文是一份详尽的ModusToolbox实战避坑指南,手把手教你从环境配置到项目构建。重点解决了Windows系统下的安装、关键环境变量CY_TOOLS_PATHS的设置、PowerShell执行策略调整以及利用URL Modifier工具优化GitHub资源下载等核心难题,旨在帮助开发者,特别是英飞凌(Infineon)芯片用户,顺利搭建开发环境并成功运行第一个Hello World程序。

t1u2v的博客 592

本地部署大模型框架 LMStudio和Ollama+WebUI对比

之前我们的辣妈系列文章介绍了很多如何使用Ollama框架+OpenWebUI做很多大模型框架下相关的事情。之后我们也尝试了LMStudio这样一体化的工具。本文介绍下LMStudio 和 Ollama+Web UI 各有优劣,具体选择取决于你的需求。

ms44的专栏 4028

Skywalking流程分析_8(拦截器插件的加载)

Skywalking流程分析_8(拦截器插件的加载)

guntun8987的博客 743

基于Qt的工业组态软件开发:图形绘制与TCP通讯实现

在数据接收时,通过 readyRead 信号触发解析函数,校验数据包完整性后提取有效数据,并更新对应图形元素的状态,例如根据温度值改变矩形的填充色,实现设备状态可视化。测试阶段,我们将软件部署到Windows工控机,连接PLC设备进行通讯测试,结果表明图形元素响应及时,TCP数据传输稳定,满足工业现场的基本需求。综上所述,基于Qt的组态软件开发,核心在于利用 QGraphicsView 框架实现图形元素的灵活绘制与管理,结合 QTcpSocket 完成工业数据的可靠交互。

谢谢大家的关注和点赞!这里只有纯纯的知识干货,没有一句废话。希望能实实在在帮到大家~要是觉得有用,别忘了给我点支持哟,你 273

skywalking本地调试报错NoClassDefFoundError: org/apache/skywalking/apm/agent/core/plugin/interceptor/enhanc

skywalking本地调试报错NoClassDefFoundError: org/apache/skywalking/apm/agent/core/plugin/interceptor/enhanc

chengqwertyuiop的博客 3220

基于Simulink的加速度计振动分析:单自由度质量-弹簧-阻尼系统

摘要:基于Simulink的加速度计单自由度振动分析 本文研究了加速度计的单自由度(SDOF)质量-弹簧-阻尼系统模型,通过MATLAB/Simulink平台建立了完整的振动分析仿真系统。文章详细阐述了理论建模过程,推导了系统运动微分方程和传递函数,并提供了Simulink模型搭建的具体步骤和MATLAB实现代码。研究通过正弦扫频、随机振动和冲击响应三种典型输入信号,分析了系统的幅频特性、相频特性及时域响应,验证了加速度计的工作机理。仿真结果表明,该方法能有效模拟加速度计在不同激励条件下的动态特性,为传感器

AI的内部世界的博客 163

【unity实战】Unity手搓脚本工具实现合并网格功能

本文介绍了在Unity中优化网格性能的方法,通过合并重复网格减少绘制调用。主要使用Mesh.CombineMeshes方法实现网格合并,支持统一材质和多材质处理。核心内容包括:1)基础合并脚本实现,将子网格合并到父对象并禁用原网格;2)统一材质设置,支持自定义或默认材质;3)多材质合并方案,通过设置mergeSubMeshes=false保留子网格材质索引。文章还提供了完整代码示例和操作演示,适用于实际项目中的网格优化需求。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 560

源码解析 --skywalking agent 插件加载流程

1. 插件 目前很多框架,都采用框架+插件的模式开发。 如DataX、FlinkX通过插件支持众多异构数据源, Skywalking通过插件实现针对很多软件如redis、mysql、dubbo等方法执行信息采集。 本文针对 skywalking agent 插件加载流程进行源码解析,理解插件的接口定义、加载机制 针对skywalking agent的插件开发指导,请参考:https://github.com/apache/skywalking/blob/master/docs/en/guides..

penriver的博客 840

把 ST03 的历史数据留得更久:ABAP Workload 统计保留期设置、原理与落地避坑指南

SAP ST03性能数据保留期配置指南 ST03/ST03N是SAP系统性能分析的核心工具,但默认数据保留期通常较短(3个月左右),难以满足跨季度对比、年度规划等需求。本文详细解析了ST03数据保留期的配置方法及注意事项: 数据存储机制:性能数据存储在监控库中,通过定期重组作业清理过期数据 配置路径:7.0+系统在"Workload Collector Database→Reorganization→Control"中按Profile分别设置 关键限制:保留期最大值建议不超过99,否则可

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 219

SkyWalking自定义插件开发实战指南

分布式链路追踪是现代微服务架构的核心组件,通过记录请求在系统中的流转路径帮助开发者快速定位问题。作为基于Java Agent技术的实现,SkyWalking通过字节码增强实现无侵入式监控。其插件机制允许开发者扩展对自定义框架和业务逻辑的追踪能力,特别适用于企业内部RPC框架、遗留系统改造等场景。本文以金融行业真实案例为例,详细介绍如何开发SkyWalking自定义插件,包括Java Agent原理、字节码增强技术、上下文传递机制等关键技术点,并分享生产环境中的性能优化和调试技巧。

weixin_30764883的博客 465

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

SkyWalking 源码分析 —— Agent 插件(二)之 Dubbo

SkyWalking的Dubbo插件实现分布式链路追踪,通过在消费端和提供端分别拦截Dubbo调用。核心功能包括:跨进程链路传播、性能指标收集、拓扑关系构建和异常追踪。插件支持Dubbo 2.7.x+和3.x版本,采用双重拦截机制,通过MonitorFilter实现埋点。消费端拦截器负责创建出口Span并注入上下文,提供端拦截器则提取上下文创建入口Span。上下文传播利用Dubbo的Attachment机制,并支持异步调用和采样策略优化性能。插件提供细粒度异常处理,区分业务异常和系统异常,并通过单元测试验证

油墨香^-^的博客 1080

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

SkyWalking 源码分析 —— Agent 插件(四)之 MongoDB

本文详细介绍了SkyWalking MongoDB插件的设计与实现。该插件通过字节码增强技术,支持MongoDB 3.x和4.x驱动版本,实现了对数据库操作的全链路追踪。核心架构分为Instrumentation、Interceptor和Connection三层,通过拦截关键方法实现操作监控。插件能够解析查询、插入、更新等操作类型,记录执行语句和性能指标,并提供慢查询检测、连接池监控等功能。配置管理支持采样率调整和缓冲区优化,实际应用可帮助分析慢查询和连接泄露问题。该插件为MongoDB性能监控和问题诊断提

油墨香^-^的博客 972

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

如何编写一个 SkyWalking 插件

点击上方“开源社”关注我们| 作者:vcjmhg|编辑:李明康|责编:袁睿斌| 设计:叶修缘丶1概述 之前几篇文章,我们着重介绍了在对 SkyWalking 进行二次开发之前的环境...

开源社KAIYUANSHE的博客 1308

手写SkyWalking-Agent模块(抽象可拔插Agent模块、组件及插件的抽象)

目录※ 抽象Agent模块 (一条指令挂载所有plugins 和 通用的类与方法的字节码增强框架)※ 可插拔式插件加载实现要点分析实现只指定一个-javaagent参数,实现挂载所有jar怎么加载多个plugin?怎么把typeDescription和要拦截的method对应起来怎么把typeDescripti...

weixin_40988460的博客 275

Skywalking源码分析【agent探针篇】

Skywalking agent源码分析字节码技术入口方法1、核心配置加载方式:2、插件初始化:3、插件(中间件or框架)的增强增强点的寻找:4、服务启动5、插件体系5.1、拦截实例方法:5.2、拦截构造方法:5.3、拦截静态方法5.4、对于实例方法和静态方法拦截点接口里的三个方法:6、witnessClass机制7、BootService 之 GRPCChanelManager9、ServiceAndEndPointRegisterClient10、trace数据采集AbstractMethodInter

战斗小火鸡 3207

Apache SkyWalking Java Agent 08-增强实例方法

通过上一篇文章Apache SkyWalking Java Agent 06-插件定义体系我们了解到插件定义顶层类 AbstractClassEnhancePluginDefine 是一个抽象类,它提供了如何对目标类增强的模版方法,define 方法是增强目标类的主要入口,define 方法内部调用了两个抽象方法 enhanceInstance 和 enhanceClass 方法,分别用于增强实例方法(包括构造方法)、静态方法,由具体子类实现。

Geek_ymv的专栏 997

如何用vbs编写一个游戏_如何编写一个 SkyWalking 插件

| 作者:vcjmhg| 编辑:黄欣宜| 设计:叶修缘丶1概述 之前几篇文章,我们着重介绍了在对 SkyWalking 进行二次开发之前的环境搭建问题,因此本篇文章将基于 SkyWalking-8.1.0 版本,以开发 webflux-webclent 插件为例,分享一下对 SkyWalking 插件开发以及贡献 PR 的过程(PR 地址),以期能为大家了解 SkyWalking java age...

weixin_39846378的博客 632

SkyWalking - Java Agent 自动注入:无侵入式监控原理揭秘

SkyWalking Java Agent 自动注入原理解析 本文深入剖析了Apache SkyWalking中Java Agent自动注入机制的核心原理。作为分布式系统监控的关键组件,SkyWalking通过Java Agent技术实现无侵入式监控,主要特性包括: 双模式注入:支持Premain模式(启动时加载)和Agentmain模式(运行时动态附加) 字节码增强:基于ByteBuddy库动态修改目标类,在方法前后植入监控逻辑 插件化架构:通过200+插件支持主流框架,采用类加载器隔离避免污染应用类路径

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

分布式追踪 SkyWalking 源码分析二 Agent 插件相关

AgentClassLoader 类加载器 Agent初始化时,会调用PluginBootstrap#loadPlugins,加载所有的插件,流程图如下: 看AgentClassLoader 代理类加载器 下面看findClass方法 1.首先根据入参name,解析出path 1.1 获取allJars 2.循环每个jar,然后根据path解析出jarEntry和...

郭传志的博客 474

SkyWalking - 核心架构解析:Agent、OAP、UI 三大组件作用详解

SkyWalking 核心架构解析:Agent、OAP、UI 三大组件详解 摘要:Apache SkyWalking 是一款开源的分布式系统APM工具,其核心架构包含三大组件:Agent负责无侵入式数据采集,通过字节码增强技术监控应用性能;OAP作为分析平台处理数据聚合与存储;UI提供可视化监控界面。本文深入解析了各组件的工作原理,包括Agent的配置方式、OAP的微内核架构以及UI的功能特点,并附有部署示例和架构图解,帮助开发者全面理解SkyWalking的监控机制。文章还对比了不同存储后端性能,为实际应

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

【SkyWalking从入门到精通】第55篇:探针插件工程结构——从Maven配置到核心类实现的完全指南

SkyWalking探针插件开发指南 本文详细介绍了SkyWalking探针插件的完整工程结构,重点包括: Maven配置要点:必须继承apm-sdk-plugin父POM,被监控的目标库需设置为provided作用域,确保插件运行时由应用提供依赖。 核心工程结构: 插件定义类需继承ClassEnhancePluginDefine 拦截器实现类负责具体逻辑 skywalking-plugin.def声明文件是必须的 可选的SPI配置目录 关键实现类:详细说明了插件定义类和拦截器的实现位置,以及资源文件的存放

xyghehehehe的专栏 149

SkyWalking - 自定义插件开发:为私有协议或 SDK 添加追踪

本文介绍了如何为私有协议或SDK开发SkyWalking自定义插件,主要包括以下内容: 背景与需求:说明为何需要为私有协议/SDK开发自定义插件,以补充SkyWalking官方插件的不足,实现完整的调用链追踪。 技术原理:概述SkyWalking基于字节码增强的插件机制,包括Agent启动、插件扫描、匹配规则和上下文传播等核心流程。 开发准备: 环境要求(JDK 8+、Maven 3.6+) 创建Maven项目,配置依赖(apm-agent-core和byte-buddy) 示例场景:模拟一个私有RPC客户

千淘万漉虽辛苦,吹尽狂沙始到金 2万+
上一篇: synchronized的原理及应用
下一篇: 零拷贝的原理
vcjmhg
博客等级 码龄11年 27粉丝 94原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值