Esempio n. 1
0
/** @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");
}