Jvmti Agent插件开发Femas的Java Agent已经过高度的易用性封装,开发插件只需要简单的两步。
cd femas-agent/femas-agent-plugin
定位到femas-agent-plugin
目录下
<aside> 💡 改写实例方法:
- 继承
InstanceMethodsAroundInterceptor
接口- 实现
beforeMethod
方法,插入在调用原始方式之前要执行的代码逻辑- 实现
afterMethod
方式,插入在调用原始方法之后要执行的代码逻辑- 实现
handleMethodException
方法,插入在执行方法过程中发生异常需要执行的代码逻辑 </aside>
<aside> 💡 改写静态方法:
- 继承
StaticMethodsAroundInterceptor
接口- 实现
beforeMethod
方法,插入在调用原始方式之前要执行的代码逻辑- 实现
afterMethod
方式,插入在调用原始方法之后要执行的代码逻辑- 实现
handleMethodException
方法,插入在执行方法过程中发生异常需要执行的代码逻辑 </aside>
<aside> 💡 改写构造方法:
- 继承
ConstructorInterceptor
接口- 实现
afterConstructorInvocation
,因为java
的编译规范,插装字节码逻辑只能放在构造方法后面 </aside>
<aside> 💡 用InterceptWrapper方式改写实例方法:
- 继承
Interceptor
接口- 实现
intercept
方法,参加com.tencent.tsf.femas.agent.feign.instrument.LoadBalancerFeignClientInterceptor
实现,插装要执行的字节码逻辑 </aside>
cd femas-agent/femas-agent-starter/src/main/resources/plugin.yaml
定位到插件配置目录下,添加需要加载的插件配置,具体配置如下:
#配置参数含义具体参见类:@com.tencent.tsf.femas.agent.config.InterceptPlugin
femas:
agent:
interceptors:
- plugin:
# 必填,字节码插装目标的类名
className: org.springframework.cloud.openfeign.ribbon.LoadBalancerFeignClient
# 必填,字节码插装目标的方法名,如果是构造方法的话,请填写any
methodName: execute
# 必填,字节码插装的interceptor类名
interceptorClass: com.tencent.tsf.femas.agent.feign.instrument.LoadBalancerFeignClientInterceptor
# 非必填,方法匹配类型:exactMatch表示精准匹配;prefix表示前缀匹配;contain表示包含字符匹配;suffix表示后缀匹配,默认是exactMatch
matcherType: exactMatch
# 非必填,拦截的方法类型:constructor构造方法;instance实例方法;static静态方法,默认是instance
methodType: instance
# 非必填,Integer类型,表示拦截方法的参数长度,无默认值
takesArguments: 2
# 非必填,Boolean类型,表示before插装方法重写之后,是否需要用修改之后的参数调用原始方法,默认是false
overrideArgs: false
# 非必填,Boolean类型,表示是否是使用com.tencent.tsf.femas.agent.interceptor.Interceptor方式拦截,默认false
originAround: false
# 多个插件,依次叠加
- plugin:
className: com.netflix.loadbalancer.ZoneAwareLoadBalancer
methodName: chooseServer
interceptorClass: com.tencent.tsf.femas.agent.nacos.instrument.ZoneAwareLoadBalancerInterceptor
打包部署包:
使用以下脚本,自动打包成部署需要的femas-agent
文件夹
mvn -Dmaven.test.skip=true clean install -U