APM 插件开发示例

service声明

/META-INF/services/com.navercorp.apm.bootstrap.plugin.ProfilerPlugin
内容:com.navercorp.apm.plugin.sample.SamplePlugin // 插件的类名,实现ProfilerPlugin, TransformTemplateAware接口

/META-INF/services/com.navercorp.apm .common.trace.TraceMetadataProvider
内容:com.navercorp.apm.plugin.sample.SampleTraceMetadataProvider // 实现TraceMetadataProvider接口

插件实现

      以SamplePlugin为例:

      设置插件应用类型探测器
    这决定了该插件生效时,该应用是什么类型的,例如是tomcat、jboss等ProfilerPluginSetupContext.addApplicationTypeDetector(ApplicationTypeDetector);

       设置目标类和对应的拦截器

TransformTemplate.transform(“被拦截的类名”, new TransformCallback());

给目标类和目标方法添加拦截器,需要注意,如果1个目标类中有多个方法需要添加拦截器,需要在同一个InstrumentClass添加

public class MyInterceptor implements TransformCallback {
    @Override
    public byte[] doInTransform(Instrumentor instrumentor, ClassLoader classLoader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws InstrumentException {
        // 1. 获取目标类的InstrumentClass
        InstrumentClass target = instrumentor.getInstrumentClass(classLoader, className, classfileBuffer);
        // 2. 从目标类获取目标方法的InstrumentMethod
        InstrumentMethod targetMethod = target.getDeclaredMethod("targetMethod", "java.lang.String");
        // 3. 在目标方法上添加拦截器,第1个参数是拦截器类的全限定名,如果拦截器类构造方法需要参数,则参数紧随其后。
        targetMethod.addInterceptor("com.xxx.apm .bootstrap.interceptor.BasicMethodInterceptor",
            va(SamplePluginConstants.MY_SERVICE_TYPE));
        // 4. 返回目标类的字节码
        return target.toBytecode();
    }
}

标签