SkyWalking 拦截器开发
介绍
SkyWalking拦截器(Interceptor)是插件开发中的核心组件,用于在目标方法执行前后插入自定义逻辑,实现监控数据的采集、修改或过滤。拦截器通常用于跟踪方法调用、记录参数或耗时,是扩展SkyWalking功能的关键手段。
拦截器基础
拦截器工作原理
SkyWalking通过字节码增强技术(如Java Agent)在运行时动态修改目标类,插入拦截器代码。拦截器遵循以下流程:
核心接口
Java插件中最常用的拦截器接口是 InstanceMethodsAroundInterceptor
和 StaticMethodsAroundInterceptor
:
beforeMethod
: 方法执行前调用afterMethod
: 方法执行后调用handleMethodException
: 异常处理
开发步骤
1. 创建拦截器类
public class MyInterceptor implements InstanceMethodsAroundInterceptor {
@Override
public void beforeMethod(EnhancedInstance objInst, Method method,
Object[] allArguments, Class<?>[] argumentsTypes,
MethodInterceptResult result) {
// 前置处理逻辑
ContextManager.createLocalSpan("my_operation");
}
@Override
public Object afterMethod(EnhancedInstance objInst, Method method,
Object[] allArguments, Class<?>[] argumentsTypes,
Object ret) {
// 后置处理逻辑
AbstractSpan span = ContextManager.activeSpan();
span.tag("result", ret.toString());
ContextManager.stopSpan();
return ret;
}
@Override
public void handleMethodException(EnhancedInstance objInst, Method method,
Object[] allArguments, Class<?>[] argumentsTypes,
Throwable t) {
// 异常处理
AbstractSpan span = ContextManager.activeSpan();
span.log(t);
span.errorOccurred();
}
}
2. 注册拦截器
在插件定义类中关联目标方法与拦截器:
public class MyPlugin extends AbstractClassEnhancePluginDefine {
@Override
protected ClassMatch enhanceClass() {
return byName("com.example.TargetClass");
}
@Override
public ConstructorInterceptPoint[] getConstructorsInterceptPoints() {
return null;
}
@Override
public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() {
return new InstanceMethodsInterceptPoint[]{
new InstanceMethodsInterceptPoint() {
@Override
public ElementMatcher<MethodDescription> getMethodsMatcher() {
return named("targetMethod");
}
@Override
public String getMethodsInterceptor() {
return "org.example.MyInterceptor";
}
}
};
}
}
实际案例:数据库调用监控
场景需求
监控JDBC PreparedStatement.execute()
方法的执行耗时和SQL语句。