/** @author HyunGil Jeong */ public class IBatisPlugin implements ProfilerPlugin, TransformTemplateAware { public static final ServiceType IBATIS = ServiceTypeFactory.of(5500, "IBATIS"); public static final ServiceType IBATIS_SPRING = ServiceTypeFactory.of(5501, "IBATIS_SPRING", "IBATIS"); private static final String IBATIS_SCOPE = "IBATIS_SCOPE"; private TransformTemplate transformTemplate; @Override public void setup(ProfilerPluginSetupContext context) { ProfilerConfig profilerConfig = context.getConfig(); if (profilerConfig.isIBatisEnabled()) { addInterceptorsForSqlMapExecutors(); addInterceptorsForSqlMapClientTemplate(); } } // SqlMapClient / SqlMapSession private void addInterceptorsForSqlMapExecutors() { final ServiceType serviceType = IBATIS; final String[] sqlMapExecutorImplClasses = { "com.ibatis.sqlmap.engine.impl.SqlMapClientImpl", "com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl" }; addInterceptorsForClasses(serviceType, sqlMapExecutorImplClasses); } // SqlMapClientTemplate private void addInterceptorsForSqlMapClientTemplate() { final ServiceType serviceType = IBATIS_SPRING; final String[] sqlMapClientTemplateClasses = { "org.springframework.orm.ibatis.SqlMapClientTemplate" }; addInterceptorsForClasses(serviceType, sqlMapClientTemplateClasses); } private void addInterceptorsForClasses(ServiceType serviceType, String... targetClassNames) { final MethodFilter methodFilter = MethodFilters.name( "insert", "delete", "update", "queryForList", "queryForMap", "queryForObject", "queryForPaginatedList"); for (String targetClassName : targetClassNames) { addInterceptorsForClass(targetClassName, serviceType, methodFilter); } } private void addInterceptorsForClass( final String targetClassName, final ServiceType serviceType, final MethodFilter methodFilter) { transformTemplate.transform( targetClassName, new TransformCallback() { @Override public byte[] doInTransform( Instrumentor instrumentor, ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws InstrumentException { final InstrumentClass target = instrumentor.getInstrumentClass(loader, className, classfileBuffer); final List<InstrumentMethod> methodsToTrace = target.getDeclaredMethods(methodFilter); for (InstrumentMethod methodToTrace : methodsToTrace) { String sqlMapOperationInterceptor = "com.navercorp.pinpoint.plugin.ibatis.interceptor.SqlMapOperationInterceptor"; methodToTrace.addScopedInterceptor( sqlMapOperationInterceptor, va(serviceType), IBATIS_SCOPE, ExecutionPolicy.BOUNDARY); } return target.toBytecode(); } }); } @Override public void setTransformTemplate(TransformTemplate transformTemplate) { this.transformTemplate = transformTemplate; } }
/** @author Jongho Moon */ public interface MongodbPluginConstants { public static final ServiceType MY_SERVICE_TYPE = ServiceTypeFactory.of(2977, "Mongodb"); }