mirror of
https://github.com/wahyd4/pinpoint.git
synced 2026-08-19 09:47:27 +10:00
[유치수] [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:
@@ -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);
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 !!!");
|
||||
}
|
||||
}
|
||||
|
||||
+69
-47
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user