mirror of
https://github.com/wahyd4/pinpoint.git
synced 2026-08-28 06:08:43 +10:00
[강운덕] [LUCYSUS-1744] modifier관련 static api를 instance api로 변경 1차 작업수행..
git-svn-id: http://svn.bds.nhncorp.com/pe/hippo-tomcat-profiler/trunk@465 84d0f5b1-2673-498c-a247-62c4ff18d310
This commit is contained in:
@@ -7,6 +7,7 @@ import java.net.URL;
|
||||
import java.net.URLClassLoader;
|
||||
import java.security.ProtectionDomain;
|
||||
|
||||
import com.profiler.modifier.Modifier;
|
||||
import javassist.ClassPool;
|
||||
import javassist.NotFoundException;
|
||||
|
||||
@@ -37,49 +38,62 @@ public class TomcatProfiler implements ClassFileTransformer {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(TomcatProfiler.class);
|
||||
|
||||
protected String agentArgString = "";
|
||||
protected Instrumentation instrumentation;
|
||||
ClassPool classPool;
|
||||
private String agentArgString = "";
|
||||
private Instrumentation instrumentation;
|
||||
private ClassPool classPool;
|
||||
|
||||
|
||||
|
||||
public static void premain(String agentArgs, Instrumentation inst) {
|
||||
new TomcatProfiler(agentArgs, inst);
|
||||
}
|
||||
|
||||
public TomcatProfiler(String agentArgs, Instrumentation inst) {
|
||||
agentArgString = agentArgs;
|
||||
instrumentation = inst;
|
||||
instrumentation.addTransformer(this);
|
||||
classPool = ClassPool.getDefault();
|
||||
try {
|
||||
String catalinaHome = System.getProperty("catalina.home");
|
||||
logger.info("CATALINA_HOME=%s", catalinaHome);
|
||||
|
||||
logger.info("TEST");
|
||||
|
||||
classPool.appendClassPath(catalinaHome + "/lib/servlet-api.jar");
|
||||
classPool.appendClassPath(catalinaHome + "/lib/catalina.jar");
|
||||
} catch (Exception e) {
|
||||
logger.error(e.getMessage());
|
||||
}
|
||||
this.agentArgString = agentArgs;
|
||||
this.instrumentation = inst;
|
||||
this.instrumentation.addTransformer(this);
|
||||
this.classPool = createClassPool();
|
||||
}
|
||||
|
||||
@Override
|
||||
private ClassPool createClassPool() {
|
||||
ClassPool classPool = new ClassPool(null);
|
||||
classPool.appendSystemPath();
|
||||
|
||||
String catalinaHome = System.getProperty("catalina.home");
|
||||
logger.info("CATALINA_HOME=%s", catalinaHome);
|
||||
appendClassPath(classPool, catalinaHome + "/lib/servlet-api.jar");
|
||||
appendClassPath(classPool, catalinaHome + "/lib/catalina.jar");
|
||||
return classPool;
|
||||
}
|
||||
|
||||
private void appendClassPath(ClassPool classPool, String pathName) {
|
||||
try {
|
||||
classPool.appendClassPath(pathName);
|
||||
} catch (NotFoundException e) {
|
||||
logger.error("lib not found. " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] transform(ClassLoader classLoader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classFileBuffer) throws IllegalClassFormatException {
|
||||
if (className.startsWith("org/apache/catalina")) {
|
||||
String javassistClassName = className.replace('/', '.');
|
||||
if (javassistClassName.equals("org.apache.catalina.core.StandardHostValve")) {
|
||||
// Add code to monitor Request and Response
|
||||
byte[] result = EntryPointStandardHostValveModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
Modifier modifier = new EntryPointStandardHostValveModifier();
|
||||
byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
if (result != null)
|
||||
return result;
|
||||
} else if (javassistClassName.equals("org.apache.catalina.core.StandardService")) {
|
||||
// Add code to monitor Tomcat start and stop
|
||||
byte[] result = TomcatStandardServiceModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
Modifier modifier = new TomcatStandardServiceModifier();
|
||||
byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
if (result != null)
|
||||
return result;
|
||||
} else if (javassistClassName.equals("org.apache.catalina.connector.Connector")) {
|
||||
// Add code to set Tomcat's port numbers
|
||||
byte[] result = TomcatConnectorModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
TomcatConnectorModifier modifier = new TomcatConnectorModifier();
|
||||
byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
if (result != null)
|
||||
return result;
|
||||
}
|
||||
@@ -91,22 +105,26 @@ public class TomcatProfiler implements ClassFileTransformer {
|
||||
String javassistClassName = className.replace('/', '.');
|
||||
if (javassistClassName.equals("com.mysql.jdbc.ConnectionImpl")) {
|
||||
checkLibrary(javassistClassName, classLoader);
|
||||
byte[] result = MySQLConnectionImplModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
Modifier modifier = new MySQLConnectionImplModifier();
|
||||
byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
if (result != null)
|
||||
return result;
|
||||
} else if (javassistClassName.equals("com.mysql.jdbc.StatementImpl")) {
|
||||
checkLibrary(javassistClassName, classLoader);
|
||||
byte[] result = MySQLStatementModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
Modifier modifier = new MySQLStatementModifier();
|
||||
byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
if (result != null)
|
||||
return result;
|
||||
} else if (javassistClassName.equals("com.mysql.jdbc.PreparedStatement")) {
|
||||
checkLibrary(javassistClassName, classLoader);
|
||||
byte[] result = MySQLPreparedStatementModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
Modifier modifier = new MySQLPreparedStatementModifier();
|
||||
byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
if (result != null)
|
||||
return result;
|
||||
} else if (javassistClassName.equals("com.mysql.jdbc.ResultSetImpl")) {
|
||||
checkLibrary(javassistClassName, classLoader);
|
||||
byte[] result = MySQLResultSetModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
Modifier modifier = new MySQLResultSetModifier();
|
||||
byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
if (result != null)
|
||||
return result;
|
||||
}
|
||||
@@ -115,22 +133,26 @@ public class TomcatProfiler implements ClassFileTransformer {
|
||||
String javassistClassName = className.replace('/', '.');
|
||||
if (javassistClassName.equals("net.sourceforge.jtds.jdbc.ConnectionJDBC2")) {
|
||||
checkLibrary(javassistClassName, classLoader);
|
||||
byte[] result = MSSQLConnectionModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
Modifier modifier = new MSSQLConnectionModifier();
|
||||
byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
if (result != null)
|
||||
return result;
|
||||
} else if (javassistClassName.equals("net.sourceforge.jtds.jdbc.JtdsStatement")) {
|
||||
checkLibrary(javassistClassName, classLoader);
|
||||
byte[] result = MSSQLStatementModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
Modifier modifier = new MSSQLStatementModifier();
|
||||
byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
if (result != null)
|
||||
return result;
|
||||
} else if (javassistClassName.equals("net.sourceforge.jtds.jdbc.JtdsPreparedStatement")) {
|
||||
checkLibrary(javassistClassName, classLoader);
|
||||
byte[] result = MSSQLPreparedStatementModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
Modifier modifier = new MSSQLPreparedStatementModifier();
|
||||
byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
if (result != null)
|
||||
return result;
|
||||
} else if (javassistClassName.equals("net.sourceforge.jtds.jdbc.JtdsResultSet")) {
|
||||
checkLibrary(javassistClassName, classLoader);
|
||||
byte[] result = MSSQLResultSetModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
Modifier modifier = new MSSQLResultSetModifier();
|
||||
byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
if (result != null)
|
||||
return result;
|
||||
}
|
||||
@@ -139,12 +161,14 @@ public class TomcatProfiler implements ClassFileTransformer {
|
||||
String javassistClassName = className.replace('/', '.');
|
||||
if (javassistClassName.equals("org.apache.commons.dbcp.BasicDataSource")) {
|
||||
checkLibrary(javassistClassName, classLoader);
|
||||
byte[] result = DBCPBasicDataSourceModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
Modifier modifier = new DBCPBasicDataSourceModifier();
|
||||
byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
if (result != null)
|
||||
return result;
|
||||
} else if (javassistClassName.equals("org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper")) {
|
||||
checkLibrary(javassistClassName, classLoader);
|
||||
byte[] result = DBCPPoolModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
Modifier modifier = new DBCPPoolModifier();
|
||||
byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
if (result != null)
|
||||
return result;
|
||||
}
|
||||
@@ -162,22 +186,26 @@ public class TomcatProfiler implements ClassFileTransformer {
|
||||
|
||||
if (javassistClassName.equals("cubrid.jdbc.driver.CUBRIDStatement")) {
|
||||
checkLibrary(javassistClassName, classLoader);
|
||||
byte[] result = CubridStatementModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
Modifier modifier = new CubridStatementModifier();
|
||||
byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
if (result != null)
|
||||
return result;
|
||||
} else if (javassistClassName.equals("cubrid.jdbc.driver.CUBRIDPreparedStatement")) {
|
||||
checkLibrary(javassistClassName, classLoader);
|
||||
byte[] result = CubridPreparedStatementModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
Modifier modifier = new CubridPreparedStatementModifier();
|
||||
byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
if (result != null)
|
||||
return result;
|
||||
} else if (javassistClassName.equals("cubrid.jdbc.driver.CUBRIDResultSet")) {
|
||||
checkLibrary(javassistClassName, classLoader);
|
||||
byte[] result = CubridResultSetModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
Modifier modifier = new CubridResultSetModifier();
|
||||
byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
if (result != null)
|
||||
return result;
|
||||
} else if (javassistClassName.equals("cubrid.jdbc.jci.UStatement")) {
|
||||
checkLibrary(javassistClassName, classLoader);
|
||||
byte[] result = CubridUStatementModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
Modifier modifier = new CubridUStatementModifier();
|
||||
byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
if (result != null)
|
||||
return result;
|
||||
}
|
||||
@@ -185,17 +213,20 @@ public class TomcatProfiler implements ClassFileTransformer {
|
||||
String javassistClassName = className.replace('/', '.');
|
||||
if (javassistClassName.equals("oracle.jdbc.driver.OraclePreparedStatement")) {
|
||||
checkLibrary(javassistClassName, classLoader);
|
||||
byte[] result = OraclePreparedStatementModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
Modifier modifier = new OraclePreparedStatementModifier();
|
||||
byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
if (result != null)
|
||||
return result;
|
||||
} else if (javassistClassName.equals("oracle.jdbc.driver.OracleStatement")) {
|
||||
checkLibrary(javassistClassName, classLoader);
|
||||
byte[] result = OracleStatementModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
Modifier modifier = new OracleStatementModifier();
|
||||
byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
if (result != null)
|
||||
return result;
|
||||
} else if (javassistClassName.equals("oracle.jdbc.driver.OracleResultSetImpl")) {
|
||||
checkLibrary(javassistClassName, classLoader);
|
||||
byte[] result = OracleResultSetModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
Modifier modifier = new OracleResultSetModifier();
|
||||
byte[] result = modifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
if (result != null)
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -7,62 +7,11 @@ import javassist.CtClass;
|
||||
import javassist.CtConstructor;
|
||||
import javassist.CtMethod;
|
||||
|
||||
public abstract class AbstractModifier {
|
||||
public abstract class AbstractModifier implements Modifier {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(AbstractModifier.class);
|
||||
|
||||
public static void printClassInfo(String className) {
|
||||
logger.debug("Printing Class Info of [" + className + "]");
|
||||
try {
|
||||
ClassPool pool = ClassPool.getDefault();
|
||||
logger.debug("try");
|
||||
String javaassistClassName = className.replace('/', '.');
|
||||
logger.debug("replace");
|
||||
CtClass cc = pool.get(javaassistClassName);
|
||||
logger.debug("ClassName:" + javaassistClassName);
|
||||
CtConstructor[] constructorList = cc.getConstructors();
|
||||
|
||||
for (CtConstructor cons : constructorList) {
|
||||
try {
|
||||
String signature = cons.getSignature();
|
||||
logger.info("Constructor signature:%s", signature);
|
||||
} catch (Exception e) {
|
||||
logger.error(e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
CtMethod[] methodList = cc.getDeclaredMethods();
|
||||
|
||||
for (CtMethod tempMethod : methodList) {
|
||||
try {
|
||||
String methodName = tempMethod.getLongName();
|
||||
|
||||
logger.debug("MethodName:" + methodName);
|
||||
|
||||
CtClass[] params = tempMethod.getParameterTypes();
|
||||
|
||||
if (params.length != 0) {
|
||||
int paramsLength = params.length;
|
||||
for (int loop = paramsLength - 1; loop > 0; loop--) {
|
||||
logger.debug("Param" + loop + ":" + params[loop].getName());
|
||||
}
|
||||
} else {
|
||||
logger.debug(" No params");
|
||||
}
|
||||
|
||||
logger.debug("ReturnType=" + tempMethod.getReturnType().getName());
|
||||
} catch (Exception methodException) {
|
||||
logger.error("Exception : " + methodException.getMessage());
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
logger.error(e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public static byte[] addBeforeAfterLogics(ClassPool classPool, String javassistClassName) {
|
||||
public byte[] addBeforeAfterLogics(ClassPool classPool, String javassistClassName) {
|
||||
try {
|
||||
CtClass cc = classPool.get(javassistClassName);
|
||||
CtMethod[] methods = cc.getDeclaredMethods();
|
||||
@@ -118,7 +67,7 @@ public abstract class AbstractModifier {
|
||||
}
|
||||
}
|
||||
|
||||
public static void printClassConvertComplete(String javassistClassName) {
|
||||
public void printClassConvertComplete(String javassistClassName) {
|
||||
logger.info("%s class is converted.", javassistClassName);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
package com.profiler.modifier;
|
||||
|
||||
|
||||
import javassist.ClassPool;
|
||||
|
||||
public interface Modifier {
|
||||
byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer);
|
||||
}
|
||||
@@ -13,12 +13,12 @@ public class CubridPreparedStatementModifier extends AbstractModifier {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(CubridPreparedStatementModifier.class);
|
||||
|
||||
public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
logger.info("CubridPreparedStatementModifier modifing");
|
||||
return changeMethod(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
}
|
||||
|
||||
private static byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
private byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
try {
|
||||
CtClass cc = classPool.get(javassistClassName);
|
||||
updateExecuteQueryMethod(classPool, cc);
|
||||
|
||||
@@ -12,12 +12,12 @@ public class CubridResultSetModifier extends AbstractModifier {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(CubridResultSetModifier.class);
|
||||
|
||||
public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
logger.info("CubridResultSetModifier modifing. %s", javassistClassName);
|
||||
return changeMethod(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
}
|
||||
|
||||
private static byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
private byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
try {
|
||||
CtClass cc = classPool.get(javassistClassName);
|
||||
updateNextMethod(classPool, cc);
|
||||
|
||||
@@ -12,12 +12,12 @@ public class CubridStatementModifier extends AbstractModifier {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(CubridStatementModifier.class);
|
||||
|
||||
public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
logger.info("CubridStatementModifier modifing. %s", javassistClassName);
|
||||
return changeMethod(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
}
|
||||
|
||||
private static byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
private byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
try {
|
||||
CtClass cc = classPool.get(javassistClassName);
|
||||
updateExecuteQueryMethod(classPool, cc);
|
||||
|
||||
@@ -12,12 +12,12 @@ public class CubridUStatementModifier extends AbstractModifier {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(CubridUStatementModifier.class);
|
||||
|
||||
public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
logger.info("CubridUStatementModifier modifing. %s", javassistClassName);
|
||||
return changeMethod(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
}
|
||||
|
||||
private static byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
private byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
try {
|
||||
CtClass cc = classPool.get(javassistClassName);
|
||||
updateBindValueMethod(classPool, cc);
|
||||
|
||||
@@ -12,12 +12,12 @@ public class DBCPBasicDataSourceModifier extends AbstractModifier {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(DBCPBasicDataSourceModifier.class);
|
||||
|
||||
public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
logger.info("DBCPBasicDataSourceModifier modifing. %s", javassistClassName);
|
||||
return changeMethod(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
}
|
||||
|
||||
private static byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
private byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
try {
|
||||
CtClass cc = classPool.get(javassistClassName);
|
||||
updateGetConnectionMethod(classPool, cc);
|
||||
|
||||
@@ -12,12 +12,12 @@ public class DBCPPoolModifier extends AbstractModifier {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(DBCPPoolModifier.class);
|
||||
|
||||
public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
logger.info("DBCPPoolModifier(PoolingDataSource$PoolGuardConnectionWrapper) modifing. %s", javassistClassName);
|
||||
return changeMethod(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
}
|
||||
|
||||
private static byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
private byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
try {
|
||||
CtClass cc = classPool.get(javassistClassName);
|
||||
updateCloseMethod(classPool, cc);
|
||||
|
||||
@@ -12,12 +12,12 @@ public class MSSQLConnectionModifier extends AbstractModifier {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(MSSQLConnectionModifier.class);
|
||||
|
||||
public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
logger.info("MSSQLConnectionModifier modifing. %s", javassistClassName);
|
||||
return changeMethods(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
}
|
||||
|
||||
private static byte[] changeMethods(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
private byte[] changeMethods(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
try {
|
||||
CtClass cc = classPool.get(javassistClassName);
|
||||
updateCreateStatementMethod(classPool, cc);
|
||||
|
||||
@@ -13,12 +13,12 @@ public class MSSQLPreparedStatementModifier extends AbstractModifier {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(MSSQLPreparedStatementModifier.class);
|
||||
|
||||
public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
logger.info("MSSQLPreparedStatementModifier modifing. %s", javassistClassName);
|
||||
return changeMethod(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
}
|
||||
|
||||
private static byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
private byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
try {
|
||||
CtClass cc = classPool.get(javassistClassName);
|
||||
|
||||
|
||||
@@ -12,12 +12,12 @@ public class MSSQLResultSetModifier extends AbstractModifier {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(MSSQLResultSetModifier.class);
|
||||
|
||||
public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
logger.info("MSSQLResultSetModifier modifing. %s", javassistClassName);
|
||||
return changeMethod(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
}
|
||||
|
||||
private static byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
private byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
try {
|
||||
CtClass cc = classPool.get(javassistClassName);
|
||||
updateNextMethod(classPool, cc);
|
||||
|
||||
@@ -11,12 +11,12 @@ import com.profiler.modifier.AbstractModifier;
|
||||
public class MSSQLStatementModifier extends AbstractModifier {
|
||||
private static final Logger logger = Logger.getLogger(MSSQLStatementModifier.class);
|
||||
|
||||
public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
logger.info("MSSQLStatementModifier modifing. %s", javassistClassName);
|
||||
return changeMethod(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
}
|
||||
|
||||
private static byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
private byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
try {
|
||||
CtClass cc = classPool.get(javassistClassName);
|
||||
updateExecuteQueryMethod(classPool, cc);
|
||||
|
||||
@@ -12,12 +12,12 @@ public class MySQLConnectionImplModifier extends AbstractModifier {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(MySQLConnectionImplModifier.class);
|
||||
|
||||
public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
logger.info("MySQLConnectionImplModifier modifing. %s", javassistClassName);
|
||||
return changeMethods(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
}
|
||||
|
||||
private static byte[] changeMethods(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
private byte[] changeMethods(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
try {
|
||||
CtClass cc = classPool.get(javassistClassName);
|
||||
updateGetInstanceMethod(classPool, cc);
|
||||
|
||||
@@ -12,12 +12,12 @@ import com.profiler.modifier.AbstractModifier;
|
||||
public class MySQLPreparedStatementModifier extends AbstractModifier {
|
||||
private static final Logger logger = Logger.getLogger(MySQLPreparedStatementModifier.class);
|
||||
|
||||
public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
logger.info("MySQLPreparedStatementModifier modifing. %s", javassistClassName);
|
||||
return changeMethod(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
}
|
||||
|
||||
private static byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
private byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
try {
|
||||
CtClass cc = classPool.get(javassistClassName);
|
||||
updateSetInternalMethod(classPool, cc);
|
||||
|
||||
@@ -12,12 +12,12 @@ public class MySQLResultSetModifier extends AbstractModifier {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(MySQLResultSetModifier.class);
|
||||
|
||||
public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
logger.info("ResultSetImpl modifing. %s", javassistClassName);
|
||||
return changeMethod(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
}
|
||||
|
||||
private static byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
private byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
try {
|
||||
CtClass cc = classPool.get(javassistClassName);
|
||||
updateNextMethod(classPool, cc);
|
||||
|
||||
@@ -12,12 +12,12 @@ public class MySQLStatementModifier extends AbstractModifier {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(MySQLStatementModifier.class);
|
||||
|
||||
public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
logger.info("MySQLStatementModifier modifing. %s", javassistClassName);
|
||||
return changeMethod(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
}
|
||||
|
||||
private static byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
private byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
try {
|
||||
CtClass cc = classPool.get(javassistClassName);
|
||||
updateExecuteQueryMethod(classPool, cc);
|
||||
|
||||
@@ -13,14 +13,14 @@ public class OraclePreparedStatementModifier extends AbstractModifier {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(OraclePreparedStatementModifier.class);
|
||||
|
||||
public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
logger.info("OraclePreparedStatementModifier modifing. %s", javassistClassName);
|
||||
// printClassInfo(javassistClassName);
|
||||
// return addBeforeAfterLogics(classPool,javassistClassName);
|
||||
return changeMethod(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
}
|
||||
|
||||
private static byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
private byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
try {
|
||||
CtClass cc = classPool.get(javassistClassName);
|
||||
updateSetInternalMethod(classPool, cc);
|
||||
|
||||
@@ -12,12 +12,12 @@ public class OracleResultSetModifier extends AbstractModifier {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(OracleResultSetModifier.class);
|
||||
|
||||
public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
logger.info("OracleResultSetImpl modifing. %s", javassistClassName);
|
||||
return changeMethod(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
}
|
||||
|
||||
private static byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
private byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
try {
|
||||
CtClass cc = classPool.get(javassistClassName);
|
||||
updateNextMethod(classPool, cc);
|
||||
|
||||
@@ -11,14 +11,14 @@ import com.profiler.modifier.AbstractModifier;
|
||||
public class OracleStatementModifier extends AbstractModifier {
|
||||
private static final Logger logger = Logger.getLogger(OracleStatementModifier.class);
|
||||
|
||||
public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
logger.info("OracleStatementModifier modifing. %s", javassistClassName);
|
||||
// printClassInfo(javassistClassName);
|
||||
// return addBeforeAfterLogics(classPool,javassistClassName);
|
||||
return changeMethod(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
}
|
||||
|
||||
private static byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
private byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
try {
|
||||
CtClass cc = classPool.get(javassistClassName);
|
||||
updateExecuteQueryMethod(classPool, cc);
|
||||
|
||||
@@ -20,12 +20,12 @@ public class EntryPointStandardHostValveModifier extends AbstractModifier {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(EntryPointStandardHostValveModifier.class);
|
||||
|
||||
public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
logger.info("EntryPointModifier.modifyStandardHostValve(). %s", javassistClassName);
|
||||
return changeServiceMethod(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
}
|
||||
|
||||
private static byte[] changeServiceMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
private byte[] changeServiceMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
classPool.insertClassPath(new ByteArrayClassPath(javassistClassName, classfileBuffer));
|
||||
try {
|
||||
addRequestTracerToCurrentClassLoader(classLoader);
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.profiler.modifier.tomcat;
|
||||
|
||||
import com.profiler.util.ByteCodeUtil;
|
||||
import javassist.ClassPool;
|
||||
import javassist.CtClass;
|
||||
import javassist.CtMethod;
|
||||
@@ -18,17 +19,16 @@ public class TomcatConnectorModifier extends AbstractModifier {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(TomcatConnectorModifier.class);
|
||||
|
||||
public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
if (logger.isDebugEnabled()) {
|
||||
printClassInfo(javassistClassName);
|
||||
ByteCodeUtil.printClassInfo(classPool, javassistClassName);
|
||||
}
|
||||
return changeMethod(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
}
|
||||
|
||||
public static byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
public byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
try {
|
||||
CtClass cc = classPool.get(javassistClassName);
|
||||
|
||||
CtClass param[] = new CtClass[1];
|
||||
param[0] = classPool.getCtClass("int");
|
||||
CtMethod setPortMethod = cc.getDeclaredMethod("setPort", param);
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
package com.profiler.modifier.tomcat;
|
||||
|
||||
import static com.profiler.config.TomcatProfilerConstant.CLASS_NAME_AGENT_STATE_MANAGER;
|
||||
|
||||
import com.profiler.util.ByteCodeUtil;
|
||||
import javassist.ClassPool;
|
||||
import javassist.CtClass;
|
||||
import javassist.CtMethod;
|
||||
@@ -19,14 +21,14 @@ public class TomcatStandardServiceModifier extends AbstractModifier {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(TomcatStandardServiceModifier.class);
|
||||
|
||||
public static byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
public byte[] modify(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classFileBuffer) {
|
||||
if (logger.isDebugEnabled()) {
|
||||
printClassInfo(javassistClassName);
|
||||
ByteCodeUtil.printClassInfo(classPool, javassistClassName);
|
||||
}
|
||||
return changeMethod(classPool, classLoader, javassistClassName, classFileBuffer);
|
||||
}
|
||||
|
||||
public static byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
public byte[] changeMethod(ClassPool classPool, ClassLoader classLoader, String javassistClassName, byte[] classfileBuffer) {
|
||||
try {
|
||||
CtClass cc = classPool.get(javassistClassName);
|
||||
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
package com.profiler.util;
|
||||
|
||||
import com.profiler.logging.Logger;
|
||||
import javassist.ClassPool;
|
||||
import javassist.CtClass;
|
||||
import javassist.CtConstructor;
|
||||
import javassist.CtMethod;
|
||||
|
||||
public class ByteCodeUtil {
|
||||
// TODO logger 를 별도로 써야 되는지 않는지 검토.
|
||||
private static final Logger logger = Logger.getLogger(ByteCodeUtil.class);
|
||||
|
||||
public static void printClassInfo(ClassPool classPool, String className) {
|
||||
logger.debug("Printing Class Info of [" + className + "]");
|
||||
try {
|
||||
logger.debug("try");
|
||||
String javaassistClassName = className.replace('/', '.');
|
||||
logger.debug("replace");
|
||||
CtClass cc = classPool.get(javaassistClassName);
|
||||
logger.debug("ClassName:" + javaassistClassName);
|
||||
CtConstructor[] constructorList = cc.getConstructors();
|
||||
|
||||
for (CtConstructor cons : constructorList) {
|
||||
try {
|
||||
String signature = cons.getSignature();
|
||||
logger.info("Constructor signature:%s", signature);
|
||||
} catch (Exception e) {
|
||||
logger.error(e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
CtMethod[] methodList = cc.getDeclaredMethods();
|
||||
|
||||
for (CtMethod tempMethod : methodList) {
|
||||
try {
|
||||
String methodName = tempMethod.getLongName();
|
||||
|
||||
logger.debug("MethodName:" + methodName);
|
||||
|
||||
CtClass[] params = tempMethod.getParameterTypes();
|
||||
|
||||
if (params.length != 0) {
|
||||
int paramsLength = params.length;
|
||||
for (int loop = paramsLength - 1; loop > 0; loop--) {
|
||||
logger.debug("Param" + loop + ":" + params[loop].getName());
|
||||
}
|
||||
} else {
|
||||
logger.debug(" No params");
|
||||
}
|
||||
|
||||
logger.debug("ReturnType=" + tempMethod.getReturnType().getName());
|
||||
} catch (Exception methodException) {
|
||||
logger.error("Exception : " + methodException.getMessage());
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
logger.error(e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user