[유치수] [NOBTS] refactoring

git-svn-id: http://svn.bds.nhncorp.com/pe/hippo-tomcat-profiler/trunk@453 84d0f5b1-2673-498c-a247-62c4ff18d310
This commit is contained in:
Chisu Yu
2012-07-04 10:05:51 +00:00
parent 34cb3fbd1e
commit 08c6f0bd3c
37 changed files with 2257 additions and 1895 deletions
+78
View File
@@ -0,0 +1,78 @@
package com.profiler;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.profiler.config.TomcatProfilerConfig;
public abstract class Logger {
protected final String name;
protected final DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
public Logger(String name) {
this.name = name;
}
public enum LogLevel {
INFO(0), DEBUG(1), WARN(2), ERROR(3), FATAL(4);
private int priority;
LogLevel(int priority) {
this.priority = priority;
}
}
public static Logger getLogger(Class<?> clazz) {
return new Logger(clazz.getName()) {
@Override
public void info(String message, Object... args) {
if (TomcatProfilerConfig.LOG_LEVEL.priority >= LogLevel.INFO.priority) {
System.out.printf("[HIPPO] %s [INFO] [%s] %s \n", df.format(new Date()), name, String.format(message, args));
}
}
@Override
public void debug(String message, Object... args) {
if (TomcatProfilerConfig.LOG_LEVEL.priority >= LogLevel.DEBUG.priority) {
System.out.printf("[HIPPO] %s [DEBUG] [%s] %s \n", df.format(new Date()), name, String.format(message, args));
}
}
@Override
public void warn(String message, Object... args) {
if (TomcatProfilerConfig.LOG_LEVEL.priority >= LogLevel.WARN.priority) {
System.out.printf("[HIPPO] %s [WARN] [%s] %s \n", df.format(new Date()), name, String.format(message, args));
}
}
@Override
public void error(String message, Object... args) {
if (TomcatProfilerConfig.LOG_LEVEL.priority >= LogLevel.ERROR.priority) {
System.out.printf("[HIPPO] %s [ERROR] [%s] %s \n", df.format(new Date()), name, String.format(message, args));
}
}
@Override
public void fatal(String message, Object... args) {
if (TomcatProfilerConfig.LOG_LEVEL.priority >= LogLevel.FATAL.priority) {
System.out.printf("[HIPPO] %s [FATAL] [%s] %s \n", df.format(new Date()), name, String.format(message, args));
}
}
};
}
public abstract void info(String message, Object... args);
public abstract void debug(String message, Object... args);
public abstract void warn(String message, Object... args);
public abstract void error(String message, Object... args);
public abstract void fatal(String message, Object... args);
}
+183 -165
View File
@@ -1,7 +1,5 @@
package com.profiler;
import static com.profiler.config.TomcatProfilerConfig.TOMCAT_LIB_PATH;
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.lang.instrument.Instrumentation;
@@ -33,10 +31,15 @@ import com.profiler.modifier.db.oracle.OracleStatementModifier;
import com.profiler.modifier.tomcat.EntryPointStandardHostValveModifier;
import com.profiler.modifier.tomcat.TomcatConnectorModifier;
import com.profiler.modifier.tomcat.TomcatStandardServiceModifier;
public class TomcatProfiler implements ClassFileTransformer {
private static final Logger logger = Logger.getLogger(TomcatProfiler.class);
protected String agentArgString = "";
protected Instrumentation instrumentation;
ClassPool classPool ;
ClassPool classPool;
public static void premain(String agentArgs, Instrumentation inst) {
new TomcatProfiler(agentArgs, inst);
}
@@ -45,179 +48,194 @@ public class TomcatProfiler implements ClassFileTransformer {
agentArgString = agentArgs;
instrumentation = inst;
instrumentation.addTransformer(this);
classPool= ClassPool.getDefault();
classPool = ClassPool.getDefault();
try {
classPool.appendClassPath(TOMCAT_LIB_PATH+"/lib/servlet-api.jar");
classPool.appendClassPath(TOMCAT_LIB_PATH+"/lib/catalina.jar");
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());
}
}
@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);
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);
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);
if (result != null)
return result;
}
}
// #### If JDBC_PROFILE is true, SQL data will be collected
if (TomcatProfilerConfig.JDBC_PROFILE) {
if (className.startsWith("com/mysql/jdbc")) {
// MySQL !!!!!!!!!!
String javassistClassName = className.replace('/', '.');
if (javassistClassName.equals("com.mysql.jdbc.ConnectionImpl")) {
checkLibrary(javassistClassName, classLoader);
byte[] result = MySQLConnectionImplModifier.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);
if (result != null)
return result;
} else if (javassistClassName.equals("com.mysql.jdbc.PreparedStatement")) {
checkLibrary(javassistClassName, classLoader);
byte[] result = MySQLPreparedStatementModifier.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);
if (result != null)
return result;
}
} else if (className.startsWith("net/sourceforge/jtds/jdbc")) {
// MSSQL !!!!!!!!!!
String javassistClassName = className.replace('/', '.');
if (javassistClassName.equals("net.sourceforge.jtds.jdbc.ConnectionJDBC2")) {
checkLibrary(javassistClassName, classLoader);
byte[] result = MSSQLConnectionModifier.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);
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);
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);
if (result != null)
return result;
}
} else if (className.startsWith("org/apache/commons/dbcp")) {
// DBCP !!!!!!!!!!
String javassistClassName = className.replace('/', '.');
if (javassistClassName.equals("org.apache.commons.dbcp.BasicDataSource")) {
checkLibrary(javassistClassName, classLoader);
byte[] result = DBCPBasicDataSourceModifier.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);
if (result != null)
return result;
}
} else if (className.startsWith("cubrid/jdbc")) {
// CUBRID !!!!!!!!!!
String javassistClassName = className.replace('/', '.');
/*
* if(!javassistClassName.equals(
* "cubrid.jdbc.driver.CUBRIDResultSet") &&
* !javassistClassName.startsWith
* ("cubrid.jdbc.driver.ConnectionProperties")) { byte[]
* result=AbstractModifier.addBeforeAfterLogics(classPool,
* javassistClassName); if(result!=null) return result; }
*/
if (javassistClassName.equals("cubrid.jdbc.driver.CUBRIDStatement")) {
checkLibrary(javassistClassName, classLoader);
byte[] result = CubridStatementModifier.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);
if (result != null)
return result;
} else if (javassistClassName.equals("cubrid.jdbc.driver.CUBRIDResultSet")) {
checkLibrary(javassistClassName, classLoader);
byte[] result = CubridResultSetModifier.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);
if (result != null)
return result;
}
} else if (className.startsWith("oracle/jdbc")) {
String javassistClassName = className.replace('/', '.');
if (javassistClassName.equals("oracle.jdbc.driver.OraclePreparedStatement")) {
checkLibrary(javassistClassName, classLoader);
byte[] result = OraclePreparedStatementModifier.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);
if (result != null)
return result;
} else if (javassistClassName.equals("oracle.jdbc.driver.OracleResultSetImpl")) {
checkLibrary(javassistClassName, classLoader);
byte[] result = OracleResultSetModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
if (result != null)
return result;
}
}
}
// else if(className.startsWith("java/sql")) {
// String javassistClassName = className.replace('/', '.');
// System.out.println("***** Changing "+javassistClassName);
// byte[] result=AbstractModifier.addBeforeAfterLogics(classPool,
// javassistClassName);
// if(result!=null) return result;
// }
return null;
}
private void checkLibrary(String javassistClassName, ClassLoader classLoader) {
try {
classPool.get(javassistClassName);
} catch (NotFoundException nfe) {
// cnfe.printStackTrace();
loadClassLoaderLibraries(classLoader);
} catch (Exception e) {
e.printStackTrace();
}
}
private void debug(String className) {
// System.out.println(className);
// if(className.startsWith("java/sql")) {
// System.out.println(className);
// }
// System.out.print(".");
}
@Override
public byte[] transform(ClassLoader classLoader, String className,
Class<?> classBeingRedefined, ProtectionDomain protectionDomain,
byte[] classFileBuffer) throws IllegalClassFormatException {
debug(className);
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);
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);
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);
if(result!=null) return result;
}
}
//#### If JDBC_PROFILE is true, SQL data will be collected
if(TomcatProfilerConfig.JDBC_PROFILE) {
if(className.startsWith("com/mysql/jdbc")) {
// MySQL !!!!!!!!!!
String javassistClassName = className.replace('/', '.');
if(javassistClassName.equals("com.mysql.jdbc.ConnectionImpl")) {
checkLibrary(javassistClassName,classLoader);
byte[] result=MySQLConnectionImplModifier.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);
if(result!=null) return result;
} else if(javassistClassName.equals("com.mysql.jdbc.PreparedStatement")) {
checkLibrary(javassistClassName,classLoader);
byte[] result=MySQLPreparedStatementModifier.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);
if(result!=null) return result;
}
} else if(className.startsWith("net/sourceforge/jtds/jdbc")) {
// MSSQL !!!!!!!!!!
String javassistClassName = className.replace('/', '.');
if(javassistClassName.equals("net.sourceforge.jtds.jdbc.ConnectionJDBC2")) {
checkLibrary(javassistClassName,classLoader);
byte[] result=MSSQLConnectionModifier.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);
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);
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);
if(result!=null) return result;
}
} else if(className.startsWith("org/apache/commons/dbcp")) {
// DBCP !!!!!!!!!!
String javassistClassName = className.replace('/', '.');
if(javassistClassName.equals("org.apache.commons.dbcp.BasicDataSource")) {
checkLibrary(javassistClassName,classLoader);
byte[] result=DBCPBasicDataSourceModifier.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);
if(result!=null) return result;
}
} else if(className.startsWith("cubrid/jdbc")) {
// CUBRID !!!!!!!!!!
String javassistClassName = className.replace('/', '.');
/*if(!javassistClassName.equals("cubrid.jdbc.driver.CUBRIDResultSet") &&
!javassistClassName.startsWith("cubrid.jdbc.driver.ConnectionProperties")) {
byte[] result=AbstractModifier.addBeforeAfterLogics(classPool, javassistClassName);
if(result!=null) return result;
}*/
if(javassistClassName.equals("cubrid.jdbc.driver.CUBRIDStatement")) {
checkLibrary(javassistClassName,classLoader);
byte[] result=CubridStatementModifier.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);
if(result!=null) return result;
} else if(javassistClassName.equals("cubrid.jdbc.driver.CUBRIDResultSet")) {
checkLibrary(javassistClassName,classLoader);
byte[] result=CubridResultSetModifier.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);
if(result!=null) return result;
}
} else if(className.startsWith("oracle/jdbc")) {
String javassistClassName = className.replace('/', '.');
if(javassistClassName.equals("oracle.jdbc.driver.OraclePreparedStatement")) {
checkLibrary(javassistClassName,classLoader);
byte[] result=OraclePreparedStatementModifier.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);
if(result!=null) return result;
} else if(javassistClassName.equals("oracle.jdbc.driver.OracleResultSetImpl")) {
checkLibrary(javassistClassName,classLoader);
byte[] result=OracleResultSetModifier.modify(classPool, classLoader, javassistClassName, classFileBuffer);
if(result!=null) return result;
}
}
}
// else if(className.startsWith("java/sql")) {
// String javassistClassName = className.replace('/', '.');
// System.out.println("***** Changing "+javassistClassName);
// byte[] result=AbstractModifier.addBeforeAfterLogics(classPool, javassistClassName);
// if(result!=null) return result;
// }
return null;
}
private void checkLibrary(String javassistClassName,ClassLoader classLoader) {
try {
classPool.get(javassistClassName);
} catch(NotFoundException nfe) {
// cnfe.printStackTrace();
loadClassLoaderLibraries(classLoader);
} catch(Exception e) {
e.printStackTrace();
}
}
private void loadClassLoaderLibraries(ClassLoader classLoader) {
if(classLoader instanceof URLClassLoader) {
URLClassLoader urlClassLoader = (URLClassLoader)classLoader;
URL[] urlList=urlClassLoader.getURLs();
for(URL tempURL:urlList) {
String filePath=tempURL.getFile();
if (classLoader instanceof URLClassLoader) {
URLClassLoader urlClassLoader = (URLClassLoader) classLoader;
URL[] urlList = urlClassLoader.getURLs();
for (URL tempURL : urlList) {
String filePath = tempURL.getFile();
try {
classPool.appendClassPath(filePath);
// log("Loaded "+filePath+" library.");
} catch(Exception e) {
// log("Loaded "+filePath+" library.");
} catch (Exception e) {
}
}
}
}
@SuppressWarnings("unused")
private static void log(String message) {
System.out.println("%%%%% "+message);
}
}
+32 -36
View File
@@ -1,6 +1,7 @@
package com.profiler;
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.lang.instrument.Instrumentation;
import java.security.ProtectionDomain;
@@ -14,8 +15,8 @@ public class TomcatTracer implements ClassFileTransformer {
protected String agentArgString = "";
protected Instrumentation instrumentation;
ClassPool classPool;
public static void premain(String agentArgs, Instrumentation inst) {
// TomcatProfiler profiler = new TomcatProfiler(agentArgs, inst);
new TomcatTracer(agentArgs, inst);
}
@@ -27,57 +28,52 @@ public class TomcatTracer implements ClassFileTransformer {
}
@Override
public byte[] transform(ClassLoader loader, String className,
Class<?> classBeingRedefined, ProtectionDomain protectionDomain,
byte[] classfileBuffer) throws IllegalClassFormatException {
// System.out.println(className);
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
String javassistClassName = className.replace('/', '.');
if(javassistClassName.startsWith("javax.servlet.") ||
javassistClassName.startsWith("org.apache.tomcat") ) {
if(!javassistClassName.startsWith("org.apache.tomcat.util")) {
byte []result=changeCode(javassistClassName,classfileBuffer);
if(result!=null) return result;
if (javassistClassName.startsWith("javax.servlet.") || javassistClassName.startsWith("org.apache.tomcat")) {
if (!javassistClassName.startsWith("org.apache.tomcat.util")) {
byte[] result = changeCode(javassistClassName, classfileBuffer);
if (result != null)
return result;
}
} else {
// System.out.println("*** "+javassistClassName);
}
return null;
}
private byte[] changeCode(String javassistClassName,byte[] classfileBuffer) {
boolean insertFlag=false;
// System.out.println("*** "+javassistClassName);
// System.out.println("*** ClassPool OK");
private byte[] changeCode(String javassistClassName, byte[] classfileBuffer) {
boolean insertFlag = false;
classPool.insertClassPath(new ByteArrayClassPath(javassistClassName, classfileBuffer));
// System.out.println("*** insertClassPath OK");
try {
if(classPool==null) {
if (classPool == null) {
System.out.println("NULL");
classPool = ClassPool.getDefault();
}
CtClass cc = classPool.get(javassistClassName);
// System.out.println("%%% ClassLoader="+cc.getClass().getClassLoader());
CtMethod[] methodList=cc.getDeclaredMethods();
for(CtMethod method:methodList) {
// System.out.println(method.getLongName());
String methodName=method.getLongName();
if(!method.isEmpty()) {
System.out.println("***inserted instrument code at "+methodName);
// method.insertBefore("{ System.out.println(\"### "+method.getName()+" is called. URL=\"+$1+\" \");}");
method.insertBefore("{ System.out.println(\"--- "+methodName+" is called. \");}");
insertFlag=true;
CtMethod[] methodList = cc.getDeclaredMethods();
for (CtMethod method : methodList) {
String methodName = method.getLongName();
if (!method.isEmpty()) {
System.out.println("***inserted instrument code at " + methodName);
method.insertBefore("{ System.out.println(\"--- " + methodName + " is called. \");}");
insertFlag = true;
}
}
if(insertFlag) {
if (insertFlag) {
byte[] newClassfileBuffer = cc.toBytecode();
System.out.println("@@@"+javassistClassName+"class's new Buffer generated !!!");
System.out.println("@@@" + javassistClassName + "class's new Buffer generated !!!");
return newClassfileBuffer;
}
} catch(Exception e) {
// e.printStackTrace();
System.err.println("!!!!! "+e.getMessage());
} catch (Exception e) {
System.err.println("!!!!! " + e.getMessage());
}
return null;
}
@@ -4,93 +4,108 @@ import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Properties;
import com.profiler.Logger;
import com.profiler.Logger.LogLevel;
public class TomcatProfilerConfig {
public static String SERVER_IP="127.0.0.1";
// public static String SERVER_IP="10.25.131.94";
public static String TOMCAT_LIB_PATH="/home1/irteam/apps/tomcat";
static {
String catalinaHome=System.getProperty("catalina.home");
if(catalinaHome!=null) {
TOMCAT_LIB_PATH=catalinaHome;
}
}
private static final Logger logger = Logger.getLogger(TomcatProfilerConfig.class);
public static String SERVER_IP = "127.0.0.1";
public static int AGENT_TCP_LISTEN_PORT = 9990;
public static int SERVER_TCP_LISTEN_PORT = 9991;
public static int REQUEST_TRANSACTION_DATA_LISTEN_PORT = 9995;
public static int REQUEST_DATA_LISTEN_PORT = 9996;
public static int JVM_DATA_LISTEN_PORT = 9997;
public static long JVM_STAT_GAP = 5000L;
public static long SERVER_CONNECT_RETRY_GAP = 1000L;
public static LogLevel LOG_LEVEL = LogLevel.INFO;
public static int AGENT_TCP_LISTEN_PORT=9990;
public static int SERVER_TCP_LISTEN_PORT=9991;
public static int REQUEST_TRANSACTION_DATA_LISTEN_PORT=9995;
public static int REQUEST_DATA_LISTEN_PORT=9996;
public static int JVM_DATA_LISTEN_PORT=9997;
public static long JVM_STAT_GAP=5000;
public static long SERVER_CONNECT_RETRY_GAP=1000;
/**
* If sql query count is over 10000 it consumes Memory.
* So sqlHashSet uses CopyOnWriteArraySet.
* It is slow, but it is stable.
* Default set is false and it uses HashSet.
* If sql query count is over 10000 it consumes Memory. So sqlHashSet uses
* CopyOnWriteArraySet. It is slow, but it is stable. Default set is false
* and it uses HashSet.
*/
public static boolean QUERY_COUNT_OVER_10000=false;
public static boolean JDBC_PROFILE=true;
// public static boolean URL_COUNT_OVER_10000=false;
// public static String MSSQL_ENCODING="MS949";
public static boolean QUERY_COUNT_OVER_10000 = false;
public static boolean JDBC_PROFILE = true;
static {
readConfigFile();
}
public static void readConfigFile() {
String hippoConfigFileName=System.getProperty("hippo.config");
if(hippoConfigFileName!=null) {
// System.out.println("%%%%%%%%%%%%%%%%%%%%% hippo.config File="+hippoConfigFileName);
Properties prop=new Properties();
String hippoConfigFileName = System.getProperty("hippo.config");
if (hippoConfigFileName != null) {
Properties prop = new Properties();
try {
FileReader reader=new FileReader(hippoConfigFileName);
FileReader reader = new FileReader(hippoConfigFileName);
prop.load(reader);
reader.close();
setPropertyValues(prop);
} catch(FileNotFoundException fnfe) {
System.out.println("##### "+hippoConfigFileName+" file is not exists. Please check configuration.");
} catch(Exception e) {
e.printStackTrace();
} catch (FileNotFoundException fnfe) {
logger.error("%s file is not exists. Please check configuration.", hippoConfigFileName);
} catch (Exception e) {
logger.fatal(e.getMessage());
}
} else {
System.out.println("##### hippo.config property is not set. Using default values #####");
logger.warn("hippo.config property is not set. Using default values");
}
}
private static void setPropertyValues(Properties prop) {
Object temp=null;
//##### set String values #####
if((temp=prop.get("SERVER_IP"))!=null)
SERVER_IP=temp.toString();
if((temp=prop.get("TOMCAT_LIB_PATH"))!=null)
TOMCAT_LIB_PATH=temp.toString();
//##### set int values #####
if((temp=prop.get("AGENT_TCP_LISTEN_PORT"))!=null)
AGENT_TCP_LISTEN_PORT=Integer.parseInt(temp.toString());
if((temp=prop.get("SERVER_TCP_LISTEN_PORT"))!=null)
SERVER_TCP_LISTEN_PORT=Integer.parseInt(temp.toString());
if((temp=prop.get("REQUEST_TRANSACTION_DATA_LISTEN_PORT"))!=null)
REQUEST_TRANSACTION_DATA_LISTEN_PORT=Integer.parseInt(temp.toString());
if((temp=prop.get("REQUEST_DATA_LISTEN_PORT"))!=null)
REQUEST_DATA_LISTEN_PORT=Integer.parseInt(temp.toString());
if((temp=prop.get("JVM_DATA_LISTEN_PORT"))!=null)
JVM_DATA_LISTEN_PORT=Integer.parseInt(temp.toString());
//##### set long values #####
if((temp=prop.get("JVM_STAT_GAP"))!=null)
JVM_STAT_GAP=Long.parseLong(temp.toString());
if((temp=prop.get("SERVER_CONNECT_RETRY_GAP"))!=null)
SERVER_CONNECT_RETRY_GAP=Long.parseLong(temp.toString());
//##### set boolean values #####
if((temp=prop.get("QUERY_COUNT_OVER_10000"))!=null)
QUERY_COUNT_OVER_10000=Boolean.parseBoolean(temp.toString());
if((temp=prop.get("JDBC_PROFILE"))!=null)
JDBC_PROFILE=Boolean.parseBoolean(temp.toString());
System.out.println("##### Hippo Config Loaded successfully. #####");
private static void setPropertyValues(Properties prop) {
// TODO : use Properties defaultvalue instead of using temp variable.
Object temp = null;
if ((temp = prop.get("SERVER_IP")) != null) {
SERVER_IP = temp.toString();
logger.info("SERVER_IP=%s", SERVER_IP);
}
if ((temp = prop.get("AGENT_TCP_LISTEN_PORT")) != null) {
AGENT_TCP_LISTEN_PORT = Integer.parseInt(temp.toString());
logger.info("AGENT_TCP_LISTEN_PORT=%d", AGENT_TCP_LISTEN_PORT);
}
if ((temp = prop.get("SERVER_TCP_LISTEN_PORT")) != null) {
SERVER_TCP_LISTEN_PORT = Integer.parseInt(temp.toString());
logger.info("SERVER_TCP_LISTEN_PORT=%d", SERVER_TCP_LISTEN_PORT);
}
if ((temp = prop.get("REQUEST_TRANSACTION_DATA_LISTEN_PORT")) != null) {
REQUEST_TRANSACTION_DATA_LISTEN_PORT = Integer.parseInt(temp.toString());
logger.info("REQUEST_TRANSACTION_DATA_LISTEN_PORT=%d", REQUEST_TRANSACTION_DATA_LISTEN_PORT);
}
if ((temp = prop.get("REQUEST_DATA_LISTEN_PORT")) != null) {
REQUEST_DATA_LISTEN_PORT = Integer.parseInt(temp.toString());
logger.info("REQUEST_DATA_LISTEN_PORT=%d", REQUEST_DATA_LISTEN_PORT);
}
if ((temp = prop.get("JVM_DATA_LISTEN_PORT")) != null) {
JVM_DATA_LISTEN_PORT = Integer.parseInt(temp.toString());
logger.info("JVM_DATA_LISTEN_PORT=%d", JVM_DATA_LISTEN_PORT);
}
if ((temp = prop.get("JVM_STAT_GAP")) != null) {
JVM_STAT_GAP = Long.parseLong(temp.toString());
logger.info("JVM_STAT_GAP=%d", JVM_STAT_GAP);
}
if ((temp = prop.get("SERVER_CONNECT_RETRY_GAP")) != null) {
SERVER_CONNECT_RETRY_GAP = Long.parseLong(temp.toString());
logger.info("SERVER_CONNECT_RETRY_GAP=%d", SERVER_CONNECT_RETRY_GAP);
}
if ((temp = prop.get("QUERY_COUNT_OVER_10000")) != null) {
QUERY_COUNT_OVER_10000 = Boolean.parseBoolean(temp.toString());
logger.info("QUERY_COUNT_OVER_10000=%s", QUERY_COUNT_OVER_10000);
}
if ((temp = prop.get("JDBC_PROFILE")) != null) {
JDBC_PROFILE = Boolean.parseBoolean(temp.toString());
logger.info("JDBC_PROFILE=%s", JDBC_PROFILE);
}
if ((temp = prop.get("LOG_LEVEL")) != null) {
LOG_LEVEL = LogLevel.valueOf(temp.toString());
logger.info("LOG_LEVEL=%s", LOG_LEVEL);
}
logger.info("configuration loaded successfully.");
}
}
@@ -6,60 +6,75 @@ import com.profiler.config.TomcatProfilerConfig;
public class AgentInfoDTO implements Serializable {
private static final long serialVersionUID = 1465266151876398515L;
public AgentInfoDTO() {
hostHashCode=staticHostHashCode;
hostIP=staticHostIP;
portNumbers=staticPortNumber;
agentTCPPortNumber=TomcatProfilerConfig.AGENT_TCP_LISTEN_PORT;
timestamp=System.currentTimeMillis();
hostHashCode = staticHostHashCode;
hostIP = staticHostIP;
portNumbers = staticPortNumber;
agentTCPPortNumber = TomcatProfilerConfig.AGENT_TCP_LISTEN_PORT;
timestamp = System.currentTimeMillis();
}
public transient static final StringBuffer portNumberBuffer=new StringBuffer();
public transient static final StringBuffer portNumberBuffer = new StringBuffer();
// static variable is only used in the agent.
public static int staticHostHashCode;
public static String staticHostIP,staticPortNumber;
public static String staticHostIP, staticPortNumber;
// instance variable is commonly used.
private String hostIP,portNumbers;
private int hostHashCode,agentTCPPortNumber;
private boolean isAlive=true;
private String hostIP, portNumbers;
private int hostHashCode, agentTCPPortNumber;
private boolean isAlive = true;
private long timestamp;
public void setIsDead() {
isAlive=false;
isAlive = false;
}
public static String getPortNumberString() {
staticPortNumber=portNumberBuffer.toString();
staticPortNumber = portNumberBuffer.toString();
staticPortNumber.trim();
return staticPortNumber;
}
public String toString() {
return hostHashCode+" "+hostIP+" "+portNumbers+" "+agentTCPPortNumber+" isAlive="+isAlive;
return hostHashCode + " " + hostIP + " " + portNumbers + " " + agentTCPPortNumber + " isAlive=" + isAlive;
}
public String getHostIP() {
return hostIP;
}
public void setHostIP(String hostIP) {
this.hostIP = hostIP;
}
public int getHostHashCode() {
return hostHashCode;
}
public void setHostHashCode(int hostHashCode) {
this.hostHashCode = hostHashCode;
}
public String getPortNumbers() {
return portNumbers;
}
public void setPortNumbers(String portNumber) {
this.portNumbers = portNumber;
}
public int getAgentTCPPortNumber() {
return agentTCPPortNumber;
}
public void setAgentTCPPortNumber(int agentTCPPortNumber) {
this.agentTCPPortNumber = agentTCPPortNumber;
}
public long getTimestamp() {
return timestamp;
}
public boolean isAlive() {
return isAlive;
}
File diff suppressed because it is too large Load Diff
@@ -7,100 +7,109 @@ import javassist.CtMethod;
public abstract class AbstractModifier {
public static void printClassInfo(String className) {
log("Printing Class Info of ["+className+"]");
log("Printing Class Info of [" + className + "]");
try {
ClassPool pool=ClassPool.getDefault();
// pool.insertClassPath(new ClassClassPath(currentClass));
ClassPool pool = ClassPool.getDefault();
log("try");
String javaassistClassName = className.replace('/', '.');
log("replace");
CtClass cc=pool.get(javaassistClassName);
log("ClassName:"+javaassistClassName);
CtConstructor[] constructorList=cc.getConstructors();
for(CtConstructor cons:constructorList) {
CtClass cc = pool.get(javaassistClassName);
log("ClassName:" + javaassistClassName);
CtConstructor[] constructorList = cc.getConstructors();
for (CtConstructor cons : constructorList) {
try {
String signature=cons.getSignature();
System.out.println("Constructor signature:"+signature);
} catch(Exception e) {
String signature = cons.getSignature();
System.out.println("Constructor signature:" + signature);
} catch (Exception e) {
e.printStackTrace();
}
}
CtMethod[] methodList=cc.getDeclaredMethods();
for(CtMethod tempMethod:methodList) {
CtMethod[] methodList = cc.getDeclaredMethods();
for (CtMethod tempMethod : methodList) {
try {
String methodName=tempMethod.getLongName();
log("MethodName:"+methodName);
CtClass[] params=tempMethod.getParameterTypes();
if(params.length!=0) {
int paramsLength=params.length;
for(int loop=paramsLength-1;loop>0;loop--) {
log("Param"+loop+":"+params[loop].getName());
String methodName = tempMethod.getLongName();
log("MethodName:" + methodName);
CtClass[] params = tempMethod.getParameterTypes();
if (params.length != 0) {
int paramsLength = params.length;
for (int loop = paramsLength - 1; loop > 0; loop--) {
log("Param" + loop + ":" + params[loop].getName());
}
} else {
log(" No params");
}
log("ReturnType="+tempMethod.getReturnType().getName());
} catch(Exception methodException) {
log("Exception : "+methodException.getMessage());
log("ReturnType=" + tempMethod.getReturnType().getName());
} catch (Exception methodException) {
log("Exception : " + methodException.getMessage());
}
}
} catch(Exception e) {
} catch (Exception e) {
log(e.getMessage());
e.printStackTrace();
}
}
}
public static byte[] addBeforeAfterLogics(ClassPool classPool,String javassistClassName) {
public static byte[] addBeforeAfterLogics(ClassPool classPool,
String javassistClassName) {
try {
CtClass cc = classPool.get(javassistClassName);
CtMethod[] methods=cc.getDeclaredMethods();
for(CtMethod method:methods) {
if(!method.isEmpty() ) {
String methodName=method.getName();
CtClass[] params=method.getParameterTypes();
StringBuilder sb=new StringBuilder();
if(params.length!=0) {
int paramsLength=params.length;
for(int loop=paramsLength-1;loop>0;loop--) {
CtMethod[] methods = cc.getDeclaredMethods();
for (CtMethod method : methods) {
if (!method.isEmpty()) {
String methodName = method.getName();
CtClass[] params = method.getParameterTypes();
StringBuilder sb = new StringBuilder();
if (params.length != 0) {
int paramsLength = params.length;
for (int loop = paramsLength - 1; loop > 0; loop--) {
sb.append(params[loop].getName()).append(",");
}
// sb.substring(0, sb.length()-2);
// sb.substring(0, sb.length()-2);
}
method.insertBefore("{System.out.println(\"*****"+javassistClassName+"."+methodName+"("+sb+") is started.\");}");
method.insertAfter("{System.out.println(\"*****"+javassistClassName+"."+methodName+"("+sb+") is finished.\");}");
method.insertBefore("{System.out.println(\"*****"
+ javassistClassName + "." + methodName + "(" + sb
+ ") is started.\");}");
method.insertAfter("{System.out.println(\"*****"
+ javassistClassName + "." + methodName + "(" + sb
+ ") is finished.\");}");
} else {
log(method.getLongName()+" is empty !!!!!");
log(method.getLongName() + " is empty !!!!!");
}
}
CtConstructor[] constructors=cc.getConstructors();
for(CtConstructor constructor:constructors) {
if(!constructor.isEmpty()) {
CtClass[] params=constructor.getParameterTypes();
StringBuilder sb=new StringBuilder();
if(params.length!=0) {
int paramsLength=params.length;
for(int loop=paramsLength-1;loop>0;loop--) {
CtConstructor[] constructors = cc.getConstructors();
for (CtConstructor constructor : constructors) {
if (!constructor.isEmpty()) {
CtClass[] params = constructor.getParameterTypes();
StringBuilder sb = new StringBuilder();
if (params.length != 0) {
int paramsLength = params.length;
for (int loop = paramsLength - 1; loop > 0; loop--) {
sb.append(params[loop].getName()).append(",");
}
// sb.substring(0, sb.length()-2);
// sb.substring(0, sb.length()-2);
}
constructor.insertBefore("{System.out.println(\"*****"+javassistClassName+" Constructor:Param=("+sb+") is started.\");}");
constructor.insertAfter("{System.out.println(\"*****"+javassistClassName+" Constructor:Param=("+sb+") is finished.\");}");
constructor.insertBefore("{System.out.println(\"*****"
+ javassistClassName + " Constructor:Param=(" + sb
+ ") is started.\");}");
constructor.insertAfter("{System.out.println(\"*****"
+ javassistClassName + " Constructor:Param=(" + sb
+ ") is finished.\");}");
} else {
log(constructor.getLongName()+" is empty !!!!!");
log(constructor.getLongName() + " is empty !!!!!");
}
}
return cc.toBytecode();
} catch(Exception e) {
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static void log(String message) {
System.out.println("[AbstractModifier] "+message);
System.out.println("[AbstractModifier] " + message);
}
public static void printClassConvertComplete(String javassistClassName) {
log("@@@ "+javassistClassName+" class is converted !!!");
log("@@@ " + javassistClassName + " class is converted !!!");
}
}
@@ -8,106 +8,128 @@ import javassist.CtClass;
import javassist.CtMethod;
import com.profiler.modifier.AbstractModifier;
/**
/**
* Modify org.apache.catalina.core.StandardHostValve class
*
* @author cowboy93
*
*
*/
public class EntryPointStandardHostValveModifier extends AbstractModifier {
public static byte[] modify(ClassPool classPool,ClassLoader classLoader,String javassistClassName,byte[] classFileBuffer) {
public static byte[] modify(ClassPool classPool, ClassLoader classLoader,
String javassistClassName, byte[] classFileBuffer) {
log("EntryPointModifier.modifyStandardHostValve()");
// printClassInfo(javassistClassName);
return changeServiceMethod(classPool,classLoader,javassistClassName,classFileBuffer);
// printClassInfo(javassistClassName);
return changeServiceMethod(classPool, classLoader, javassistClassName,
classFileBuffer);
}
private static byte[] changeServiceMethod(ClassPool classPool,ClassLoader classLoader,String javassistClassName,byte[] classfileBuffer) {
classPool.insertClassPath(new ByteArrayClassPath(javassistClassName, classfileBuffer));
private static byte[] changeServiceMethod(ClassPool classPool,
ClassLoader classLoader, String javassistClassName,
byte[] classfileBuffer) {
classPool.insertClassPath(new ByteArrayClassPath(javassistClassName,
classfileBuffer));
try {
addRequestTracerToCurrentClassLoader(classLoader);
// log("Class loader="+classPool.getClassLoader().toString());
// log("Class loader="+classPool.getClassLoader().toString());
CtClass cc = classPool.get(javassistClassName);
CtClass[] params=new CtClass[2];
params[0]=classPool.getCtClass("org.apache.catalina.connector.Request");
params[1]=classPool.getCtClass("org.apache.catalina.connector.Response");
CtMethod serviceMethod=cc.getDeclaredMethod("invoke", params);
CtClass[] params = new CtClass[2];
params[0] = classPool
.getCtClass("org.apache.catalina.connector.Request");
params[1] = classPool
.getCtClass("org.apache.catalina.connector.Response");
CtMethod serviceMethod = cc.getDeclaredMethod("invoke", params);
log("*** Changing invoke method ");
serviceMethod.insertBefore(getInvokeMethodBeforeInsertCode());
serviceMethod.insertAfter(getInvokeMethodAfterInsertCode());
CtClass exceptionType = classPool.get("java.lang.Throwable");
//CtClass exceptionType = classPool.get("java.lang.Exception");
serviceMethod.addCatch(getInvokeMethodCatchInsertCode(), exceptionType);
// cc.stopPruning(true);
// cc.toClass(classLoader,classLoader.getClass().getProtectionDomain());
// cc.stopPruning(false);
// CtClass exceptionType = classPool.get("java.lang.Exception");
serviceMethod.addCatch(getInvokeMethodCatchInsertCode(),
exceptionType);
// cc.stopPruning(true);
// cc.toClass(classLoader,classLoader.getClass().getProtectionDomain());
// cc.stopPruning(false);
byte[] newClassfileBuffer = cc.toBytecode();
// cc.writeFile();
// cc.writeFile();
printClassConvertComplete(javassistClassName);
return newClassfileBuffer;
} catch(Exception e) {
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private static String getInvokeMethodBeforeInsertCode() {
StringBuilder insertCode=new StringBuilder();
StringBuilder insertCode = new StringBuilder();
insertCode.append("{");
insertCode.append("long requestTime=System.currentTimeMillis();");
insertCode.append("javax.servlet.http.HttpServletRequest tempRequest=(javax.servlet.http.HttpServletRequest)$1;");
insertCode
.append("javax.servlet.http.HttpServletRequest tempRequest=(javax.servlet.http.HttpServletRequest)$1;");
insertCode.append("String requestURL=tempRequest.getRequestURI();");
insertCode.append("String clientIP=tempRequest.getRemoteAddr();");
insertCode.append(getParameterValues());
insertCode.append(CLASS_NAME_REQUEST_TRACER).append(".startTransaction(requestURL,clientIP,requestTime,params);");
// insertCode.append("System.out.println(\"--- ApplicationFilterChain.doFilter() is started.\");");
insertCode.append(CLASS_NAME_REQUEST_TRACER).append(
".startTransaction(requestURL,clientIP,requestTime,params);");
// insertCode.append("System.out.println(\"--- ApplicationFilterChain.doFilter() is started.\");");
insertCode.append("}");
return insertCode.toString();
}
private static StringBuilder getParameterValues() {
StringBuilder insertCode=new StringBuilder();
insertCode.append("java.util.Enumeration attrs=tempRequest.getParameterNames();");
StringBuilder insertCode = new StringBuilder();
insertCode
.append("java.util.Enumeration attrs=tempRequest.getParameterNames();");
insertCode.append("StringBuilder params=new StringBuilder();");
insertCode.append("while(attrs.hasMoreElements()) {");
insertCode.append("String keyString=attrs.nextElement().toString();");
// insertCode.append("System.out.println(key+\"=\"+tempRequest.getParameter(key.toString()));");
// insertCode.append("System.out.println(key+\"=\"+tempRequest.getParameter(key.toString()));");
insertCode.append("Object value=tempRequest.getParameter(keyString);");
insertCode.append("if(value!=null) {");
insertCode.append("String valueString=value.toString();");
insertCode.append("int valueStringLength=valueString.length();");
insertCode.append("if(valueStringLength>0 && valueStringLength<100) params.append(keyString).append(\"=\").append(valueString).append(\",\");");
insertCode
.append("if(valueStringLength>0 && valueStringLength<100) params.append(keyString).append(\"=\").append(valueString).append(\",\");");
insertCode.append("}}");
// insertCode.append("System.out.println(params);");
// insertCode.append("System.out.println(params);");
return insertCode;
}
private static String getInvokeMethodAfterInsertCode() {
StringBuilder insertCode=new StringBuilder();
StringBuilder insertCode = new StringBuilder();
insertCode.append("{");
insertCode.append(CLASS_NAME_REQUEST_TRACER).append(".endTransaction();");
// insertCode.append("System.out.println(\"--- ApplicationFilterChain.doFilter() is ended.\");");
insertCode.append(CLASS_NAME_REQUEST_TRACER).append(
".endTransaction();");
// insertCode.append("System.out.println(\"--- ApplicationFilterChain.doFilter() is ended.\");");
insertCode.append("}");
return insertCode.toString();
}
private static String getInvokeMethodCatchInsertCode() {
StringBuilder insertCode=new StringBuilder();
// insertCode.append("{");
// insertCode.append("System.out.println(\"------------------------------------------------\");");
// insertCode.append("System.out.println(\"--- \"+$e.getMessage()+\" is occured !!!\");");
insertCode.append(CLASS_NAME_REQUEST_TRACER).append(".exceptionTransaction($e);");
// insertCode.append("System.out.println(\"------------------------------------------------\");");
StringBuilder insertCode = new StringBuilder();
// insertCode.append("{");
// insertCode.append("System.out.println(\"------------------------------------------------\");");
// insertCode.append("System.out.println(\"--- \"+$e.getMessage()+\" is occured !!!\");");
insertCode.append(CLASS_NAME_REQUEST_TRACER).append(
".exceptionTransaction($e);");
// insertCode.append("System.out.println(\"------------------------------------------------\");");
insertCode.append("throw $e;");
// insertCode.append("}");
// insertCode.append("}");
return insertCode.toString();
}
private static void addRequestTracerToCurrentClassLoader(ClassLoader classLoader) {
private static void addRequestTracerToCurrentClassLoader(
ClassLoader classLoader) {
try {
classLoader.loadClass(CLASS_NAME_REQUEST_TRACER);
classLoader.loadClass(CLASS_NAME_REQUEST_THRIFT_DTO);
classLoader.loadClass("org.apache.thrift.TBase");
} catch(Exception e) {
} catch (Exception e) {
e.printStackTrace();
}
}
@@ -5,31 +5,40 @@ import com.profiler.modifier.AbstractModifier;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
/**
* When org.apache.catalina.core.StandardService class is loaded in ClassLoader,
* this class modifies methods.
*
* @author cowboy93
*
*
*/
public class TomcatConnectorModifier extends AbstractModifier{
public static byte[] modify(ClassPool classPool,ClassLoader classLoader,String javassistClassName,byte[] classFileBuffer) {
// printClassInfo(javassistClassName);
return changeMethod(classPool,classLoader,javassistClassName,classFileBuffer);
public class TomcatConnectorModifier extends AbstractModifier {
public static byte[] modify(ClassPool classPool, ClassLoader classLoader,
String javassistClassName, byte[] classFileBuffer) {
// printClassInfo(javassistClassName);
return changeMethod(classPool, classLoader, javassistClassName,
classFileBuffer);
}
public static byte[] changeMethod(ClassPool classPool,ClassLoader classLoader,String javassistClassName,byte[] classfileBuffer) {
public static 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);
setPortMethod.insertBefore("{" +
// "System.out.println(\"*** setPort() method *** Port number=\"+$1);" +
"com.profiler.dto.AgentInfoDTO.portNumberBuffer.append($1).append(\" \");"+
"}");
CtClass param[] = new CtClass[1];
param[0] = classPool.getCtClass("int");
CtMethod setPortMethod = cc.getDeclaredMethod("setPort", param);
setPortMethod.insertBefore("{"
+
// "System.out.println(\"*** setPort() method *** Port number=\"+$1);"
// +
"com.profiler.dto.AgentInfoDTO.portNumberBuffer.append($1).append(\" \");"
+ "}");
printClassConvertComplete(javassistClassName);
return cc.toBytecode();
} catch(Exception e) {
} catch (Exception e) {
e.printStackTrace();
}
return null;
@@ -7,34 +7,43 @@ import com.profiler.modifier.AbstractModifier;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
/**
* When org.apache.catalina.core.StandardService class is loaded in ClassLoader,
* this class modifies methods.
*
* @author cowboy93
*
*
*/
public class TomcatStandardServiceModifier extends AbstractModifier{
public static byte[] modify(ClassPool classPool,ClassLoader classLoader,String javassistClassName,byte[] classFileBuffer) {
// printClassInfo(javassistClassName);
return changeMethod(classPool,classLoader,javassistClassName,classFileBuffer);
public class TomcatStandardServiceModifier extends AbstractModifier {
public static byte[] modify(ClassPool classPool, ClassLoader classLoader,
String javassistClassName, byte[] classFileBuffer) {
// printClassInfo(javassistClassName);
return changeMethod(classPool, classLoader, javassistClassName,
classFileBuffer);
}
public static byte[] changeMethod(ClassPool classPool,ClassLoader classLoader,String javassistClassName,byte[] classfileBuffer) {
public static byte[] changeMethod(ClassPool classPool,
ClassLoader classLoader, String javassistClassName,
byte[] classfileBuffer) {
try {
CtClass cc = classPool.get(javassistClassName);
CtMethod startMethod=cc.getDeclaredMethod("start", null);
startMethod.insertBefore("{" +
"System.out.println(\"*** Start TomcatProfiler JVMStat Thread ***\");" +
CLASS_NAME_AGENT_STATE_MANAGER+".startJVMTraceThread();" +
"}");
CtMethod stopMethod=cc.getDeclaredMethod("stop", null);
stopMethod.insertBefore("{" +
"System.out.println(\"*** TomcatProfiler send JVM is stopped info ***\");" +
CLASS_NAME_AGENT_STATE_MANAGER+".sendJVMStoppedInfo();" +
"}");
CtMethod startMethod = cc.getDeclaredMethod("start", null);
startMethod
.insertBefore("{"
+ "System.out.println(\"*** Start TomcatProfiler JVMStat Thread ***\");"
+ CLASS_NAME_AGENT_STATE_MANAGER
+ ".startJVMTraceThread();" + "}");
CtMethod stopMethod = cc.getDeclaredMethod("stop", null);
stopMethod
.insertBefore("{"
+ "System.out.println(\"*** TomcatProfiler send JVM is stopped info ***\");"
+ CLASS_NAME_AGENT_STATE_MANAGER
+ ".sendJVMStoppedInfo();" + "}");
printClassConvertComplete(javassistClassName);
return cc.toBytecode();
} catch(Exception e) {
} catch (Exception e) {
e.printStackTrace();
}
return null;
@@ -6,24 +6,28 @@ import java.net.Socket;
import com.profiler.config.TomcatProfilerConfig;
public class TCPSocketManager extends Thread{
ServerSocket serverSocket=null;
public class TCPSocketManager extends Thread {
ServerSocket serverSocket = null;
public TCPSocketManager() {
}
public void run() {
try {
serverSocket=new ServerSocket(TomcatProfilerConfig.AGENT_TCP_LISTEN_PORT, 100);
System.out.println("*** Start TomcatProfiler TCP Listen Thread ***");
while(true) {
Socket socket=serverSocket.accept();
InputStream stream=socket.getInputStream();
byte[] readData=new byte[1024];
serverSocket = new ServerSocket(
TomcatProfilerConfig.AGENT_TCP_LISTEN_PORT, 100);
System.out
.println("*** Start TomcatProfiler TCP Listen Thread ***");
while (true) {
Socket socket = serverSocket.accept();
InputStream stream = socket.getInputStream();
byte[] readData = new byte[1024];
stream.read(readData);
System.out.println(new String(readData));
}
// } catch(InterruptedException ie) {
} catch(Exception e) {
// } catch(InterruptedException ie) {
} catch (Exception e) {
e.printStackTrace();
}
}
@@ -7,28 +7,33 @@ import java.net.InetSocketAddress;
public abstract class AbstractDataSender {
public void send() {
try {
byte [] sendData=getSendData();
int sendDataLength=sendData.length;
// System.out.println("sendDataLength="+sendDataLength);
InetSocketAddress address=getAddress();
DatagramPacket packet=new DatagramPacket(sendData,sendDataLength,address);
DatagramSocket udpSocket=new DatagramSocket();
// System.out.println("sendBufferSize="+udpSocket.getSendBufferSize());
byte[] sendData = getSendData();
int sendDataLength = sendData.length;
// System.out.println("sendDataLength="+sendDataLength);
InetSocketAddress address = getAddress();
DatagramPacket packet = new DatagramPacket(sendData,
sendDataLength, address);
DatagramSocket udpSocket = new DatagramSocket();
// System.out.println("sendBufferSize="+udpSocket.getSendBufferSize());
udpSocket.send(packet);
// if(this instanceof RequestDataSender || this instanceof RequestTransactionDataSender ) {
// System.out.println(this.getClass().getName()+" Send bufferSize="+udpSocket.getSendBufferSize()+" dataLength="+sendDataLength);
// }
// if(this instanceof RequestDataSender || this instanceof
// RequestTransactionDataSender ) {
// System.out.println(this.getClass().getName()+" Send bufferSize="+udpSocket.getSendBufferSize()+" dataLength="+sendDataLength);
// }
udpSocket.close();
} catch(Exception e) {
} catch (Exception e) {
e.printStackTrace();
}
}
protected abstract byte[] getSendData() throws Exception;
protected abstract InetSocketAddress getAddress() throws Exception;
public void log(String message) {
// System.out.println("[AbstractDataSenderThread] "+message);
// System.out.println("[AbstractDataSenderThread] "+message);
}
}
@@ -3,85 +3,104 @@ package com.profiler.sender;
import java.io.ObjectOutputStream;
import java.net.Socket;
import com.profiler.Logger;
import com.profiler.config.TomcatProfilerConfig;
import com.profiler.dto.AgentInfoDTO;
public class AgentInfoSender extends Thread{
public class AgentInfoSender extends Thread {
private static final Logger logger = Logger.getLogger(AgentInfoSender.class);
boolean isAgentStart;
public AgentInfoSender(boolean isAgentStart) {
this.isAgentStart=isAgentStart;
this.isAgentStart = isAgentStart;
}
Socket requestSocket=null;
Socket requestSocket = null;
public void run() {
if(isAgentStart) {
if (isAgentStart) {
sendAgentStartInfo();
} else {
sendAgentStopInfo();
}
}
private void sendAgentStopInfo() {
try {
connectToServer();
ObjectOutputStream stream=new ObjectOutputStream(requestSocket.getOutputStream());
AgentInfoDTO dto=new AgentInfoDTO();
ObjectOutputStream stream = new ObjectOutputStream(requestSocket.getOutputStream());
AgentInfoDTO dto = new AgentInfoDTO();
dto.setIsDead();
log(dto.toString());
logger.info("send agent stop info. %s", dto.toString());
stream.writeObject(dto);
stream.close();
log("Agent Stopped message is sent");
} catch(Exception e) {
log("AgentInfoSender Exception occured:"+e.getMessage());
logger.info("Agent Stopped message is sent. %s", dto.toString());
} catch (Exception e) {
logger.error("AgentInfoSender Exception occured : %s", e.getMessage());
} finally {
closeSocket();
}
}
private void sendAgentStartInfo() {
while(connectToServer()) {
while (connectToServer()) {
try {
Thread.sleep(TomcatProfilerConfig.SERVER_CONNECT_RETRY_GAP);
} catch(Exception e) {
Thread.sleep(TomcatProfilerConfig.SERVER_CONNECT_RETRY_GAP);
} catch (Exception e) {
e.printStackTrace();
}
}
try {
ObjectOutputStream stream=new ObjectOutputStream(requestSocket.getOutputStream());
// stream.write(("AGENT_HASH="+JVMInfoDTO.hostHashCode).getBytes());
// stream.write(("AGENT_IP="+JVMInfoDTO.hostIP).getBytes());
// stream.write(("AGENT_PORT="+JVMInfoDTO.portNumber).getBytes());
AgentInfoDTO dto=new AgentInfoDTO();
log(dto.toString());
ObjectOutputStream stream = new ObjectOutputStream(requestSocket.getOutputStream());
// stream.write(("AGENT_HASH="+JVMInfoDTO.hostHashCode).getBytes());
// stream.write(("AGENT_IP="+JVMInfoDTO.hostIP).getBytes());
// stream.write(("AGENT_PORT="+JVMInfoDTO.portNumber).getBytes());
AgentInfoDTO dto = new AgentInfoDTO();
logger.info("send agent startup info. %s", dto.toString());
stream.writeObject(dto);
stream.close();
} catch(Exception e) {
} catch (Exception e) {
e.printStackTrace();
}
if(requestSocket!=null) {
if (requestSocket != null) {
closeSocket();
}
}
private void log(String message) {
System.out.println("*** "+message);
}
private boolean connectToServer() {
try {
requestSocket=new Socket(TomcatProfilerConfig.SERVER_IP,TomcatProfilerConfig.SERVER_TCP_LISTEN_PORT);
log("Connected to server ");
logger.info("Trying to connect server. %s:%s", TomcatProfilerConfig.SERVER_IP, TomcatProfilerConfig.SERVER_TCP_LISTEN_PORT);
requestSocket = new Socket(TomcatProfilerConfig.SERVER_IP, TomcatProfilerConfig.SERVER_TCP_LISTEN_PORT);
logger.info("Connected to server. %s:%s", TomcatProfilerConfig.SERVER_IP, TomcatProfilerConfig.SERVER_TCP_LISTEN_PORT);
return false;
} catch(java.net.ConnectException ce) {
log("Connect to TomcatProfiler server is failed ***");
} catch (java.net.ConnectException ce) {
logger.fatal("Connect to TomcatProfiler server is failed. %s:%s", TomcatProfilerConfig.SERVER_IP, TomcatProfilerConfig.SERVER_TCP_LISTEN_PORT);
return true;
} catch(Exception e) {
} catch (Exception e) {
e.printStackTrace();
return true;
}
}
private void closeSocket() {
try {
requestSocket.close();
log("TCP RequestSocket is closed");
logger.info("TCP RequestSocket is closed");
} catch (Exception e) {
// e.printStackTrace();
logger.error("closeSocket(). %s", e.getMessage());
}
}
}