diff --git a/.classpath b/.classpath
index 20303e52c..291ee5d8d 100644
--- a/.classpath
+++ b/.classpath
@@ -11,8 +11,9 @@
-
+
+
diff --git a/src/main/java/com/profiler/config/TomcatProfilerConstant.java b/src/main/java/com/profiler/config/TomcatProfilerConstant.java
index c47bd35c3..22ef348f8 100644
--- a/src/main/java/com/profiler/config/TomcatProfilerConstant.java
+++ b/src/main/java/com/profiler/config/TomcatProfilerConstant.java
@@ -23,9 +23,9 @@ public class TomcatProfilerConstant {
// public static final int DATA_TYPE_HEAP_MEMORY_STAT=1510;
// public static final int DATA_TYPE_NON_HEAP_MEMORY_STAT=1520;
- public static final String CLASS_NAME_REQUEST_TRACER = "com.profiler.trace.RequestTransactionTracer";
+// public static final String CLASS_NAME_REQUEST_TRACER = "com.profiler.trace.RequestTransactionTracer";
public static final String CLASS_NAME_REQUEST_THRIFT_DTO = "com.profiler.dto.RequestThriftDTO";
- public static final String CLASS_NAME_REQUEST_DATA_TRACER = "com.profiler.trace.RequestDataTracer";
+// public static final String CLASS_NAME_REQUEST_DATA_TRACER = "com.profiler.trace.RequestDataTracer";
public static final String CLASS_NAME_AGENT_STATE_MANAGER = "com.profiler.thread.AgentStateManager";
public static final int REQ_DATA_TYPE_DB_GET_CONNECTION = 1;
diff --git a/src/main/java/com/profiler/modifier/db/cubrid/CubridPreparedStatementModifier.java b/src/main/java/com/profiler/modifier/db/cubrid/CubridPreparedStatementModifier.java
index bfc157ca2..294136666 100644
--- a/src/main/java/com/profiler/modifier/db/cubrid/CubridPreparedStatementModifier.java
+++ b/src/main/java/com/profiler/modifier/db/cubrid/CubridPreparedStatementModifier.java
@@ -7,6 +7,7 @@ import javassist.CtMethod;
import com.profiler.config.TomcatProfilerConstant;
import com.profiler.modifier.AbstractModifier;
+import com.profiler.trace.DatabaseRequestTracer;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -55,7 +56,7 @@ public class CubridPreparedStatementModifier extends AbstractModifier {
StringBuilder sb = new StringBuilder();
sb.append("{");
sb.append("if($2 instanceof cubrid.jdbc.jci.UStatement) { ");
- sb.append(TomcatProfilerConstant.CLASS_NAME_REQUEST_DATA_TRACER + ".putSqlQuery(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_QUERY + ",$2.getQuery());");
+ sb.append(DatabaseRequestTracer.FQCN + ".putSqlQuery(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_QUERY + ",$2.getQuery());");
sb.append("}}");
constructor.insertBefore(sb.toString());
@@ -65,6 +66,6 @@ public class CubridPreparedStatementModifier extends AbstractModifier {
private void updateExecuteQueryMethod(CtClass cc) throws Exception {
CtMethod serviceMethod = cc.getDeclaredMethod("execute", null);
- serviceMethod.insertAfter("{" + TomcatProfilerConstant.CLASS_NAME_REQUEST_DATA_TRACER + ".put(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_EXECUTE_QUERY + "); }");
+ serviceMethod.insertAfter("{" + DatabaseRequestTracer.FQCN + ".put(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_EXECUTE_QUERY + "); }");
}
}
diff --git a/src/main/java/com/profiler/modifier/db/cubrid/CubridResultSetModifier.java b/src/main/java/com/profiler/modifier/db/cubrid/CubridResultSetModifier.java
index 652503532..515d899fd 100644
--- a/src/main/java/com/profiler/modifier/db/cubrid/CubridResultSetModifier.java
+++ b/src/main/java/com/profiler/modifier/db/cubrid/CubridResultSetModifier.java
@@ -4,8 +4,8 @@ import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
-import com.profiler.config.TomcatProfilerConstant;
import com.profiler.modifier.AbstractModifier;
+import com.profiler.trace.DatabaseRequestTracer;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -46,11 +46,11 @@ public class CubridResultSetModifier extends AbstractModifier {
private void updateNextMethod(CtClass cc) throws Exception {
CtMethod method = cc.getDeclaredMethod("next", null);
- method.insertBefore("{" + TomcatProfilerConstant.CLASS_NAME_REQUEST_DATA_TRACER + ".updateFetchCount(); }");
+ method.insertBefore("{" + DatabaseRequestTracer.FQCN + ".updateFetchCount(); }");
}
private void updateCloseMethod(CtClass cc) throws Exception {
CtMethod method = cc.getDeclaredMethod("close", null);
- method.insertBefore("{" + TomcatProfilerConstant.CLASS_NAME_REQUEST_DATA_TRACER + ".addResultSetData(); } ");
+ method.insertBefore("{" + DatabaseRequestTracer.FQCN + ".addResultSetData(); } ");
}
}
diff --git a/src/main/java/com/profiler/modifier/db/cubrid/CubridStatementModifier.java b/src/main/java/com/profiler/modifier/db/cubrid/CubridStatementModifier.java
index c8f697853..5def04aed 100644
--- a/src/main/java/com/profiler/modifier/db/cubrid/CubridStatementModifier.java
+++ b/src/main/java/com/profiler/modifier/db/cubrid/CubridStatementModifier.java
@@ -6,6 +6,7 @@ import javassist.CtMethod;
import com.profiler.config.TomcatProfilerConstant;
import com.profiler.modifier.AbstractModifier;
+import com.profiler.trace.DatabaseRequestTracer;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -50,8 +51,8 @@ public class CubridStatementModifier extends AbstractModifier {
StringBuilder sb = new StringBuilder();
sb.append("{");
- sb.append(TomcatProfilerConstant.CLASS_NAME_REQUEST_DATA_TRACER + ".putSqlQuery(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_QUERY + ",$1);");
- sb.append(TomcatProfilerConstant.CLASS_NAME_REQUEST_DATA_TRACER + ".put(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_EXECUTE_QUERY + ");");
+ sb.append(DatabaseRequestTracer.FQCN + ".putSqlQuery(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_QUERY + ",$1);");
+ sb.append(DatabaseRequestTracer.FQCN + ".put(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_EXECUTE_QUERY + ");");
sb.append("}");
method.insertAfter(sb.toString());
diff --git a/src/main/java/com/profiler/modifier/db/cubrid/CubridUStatementModifier.java b/src/main/java/com/profiler/modifier/db/cubrid/CubridUStatementModifier.java
index 60cc12b10..5d14183ef 100644
--- a/src/main/java/com/profiler/modifier/db/cubrid/CubridUStatementModifier.java
+++ b/src/main/java/com/profiler/modifier/db/cubrid/CubridUStatementModifier.java
@@ -4,8 +4,8 @@ import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
-import com.profiler.config.TomcatProfilerConstant;
import com.profiler.modifier.AbstractModifier;
+import com.profiler.trace.DatabaseRequestTracer;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -50,6 +50,6 @@ public class CubridUStatementModifier extends AbstractModifier {
params1[2] = classPool.getCtClass("java.lang.Object");
CtMethod method = cc.getDeclaredMethod("bindValue", params1);
- method.insertBefore("{" + TomcatProfilerConstant.CLASS_NAME_REQUEST_DATA_TRACER + ".putSqlParam($1,$3); }");
+ method.insertBefore("{" + DatabaseRequestTracer.FQCN + ".putSqlParam($1,$3); }");
}
}
diff --git a/src/main/java/com/profiler/modifier/db/dbcp/DBCPBasicDataSourceModifier.java b/src/main/java/com/profiler/modifier/db/dbcp/DBCPBasicDataSourceModifier.java
index 3fd5dee13..590623610 100644
--- a/src/main/java/com/profiler/modifier/db/dbcp/DBCPBasicDataSourceModifier.java
+++ b/src/main/java/com/profiler/modifier/db/dbcp/DBCPBasicDataSourceModifier.java
@@ -6,6 +6,7 @@ import javassist.CtMethod;
import com.profiler.config.TomcatProfilerConstant;
import com.profiler.modifier.AbstractModifier;
+import com.profiler.trace.DatabaseRequestTracer;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -45,6 +46,6 @@ public class DBCPBasicDataSourceModifier extends AbstractModifier {
private void updateGetConnectionMethod(CtClass cc) throws Exception {
CtMethod method = cc.getDeclaredMethod("getConnection", null);
- method.insertAfter("{" + TomcatProfilerConstant.CLASS_NAME_REQUEST_DATA_TRACER + ".putConnection(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_GET_CONNECTION + ",$0.getUrl()); }");
+ method.insertAfter("{" + DatabaseRequestTracer.FQCN + ".putConnection(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_GET_CONNECTION + ",$0.getUrl()); }");
}
}
diff --git a/src/main/java/com/profiler/modifier/db/dbcp/DBCPPoolModifier.java b/src/main/java/com/profiler/modifier/db/dbcp/DBCPPoolModifier.java
index 6aa2db16a..c60fd076a 100644
--- a/src/main/java/com/profiler/modifier/db/dbcp/DBCPPoolModifier.java
+++ b/src/main/java/com/profiler/modifier/db/dbcp/DBCPPoolModifier.java
@@ -6,6 +6,7 @@ import javassist.CtMethod;
import com.profiler.config.TomcatProfilerConstant;
import com.profiler.modifier.AbstractModifier;
+import com.profiler.trace.DatabaseRequestTracer;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -45,6 +46,6 @@ public class DBCPPoolModifier extends AbstractModifier {
private void updateCloseMethod(CtClass cc) throws Exception {
CtMethod method = cc.getDeclaredMethod("close", null);
- method.insertAfter("{" + TomcatProfilerConstant.CLASS_NAME_REQUEST_DATA_TRACER + ".put(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_CLOSE_CONNECTION + "); }");
+ method.insertAfter("{" + DatabaseRequestTracer.FQCN + ".put(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_CLOSE_CONNECTION + "); }");
}
}
diff --git a/src/main/java/com/profiler/modifier/db/mssql/MSSQLConnectionModifier.java b/src/main/java/com/profiler/modifier/db/mssql/MSSQLConnectionModifier.java
index 997897d10..2545a0cb2 100644
--- a/src/main/java/com/profiler/modifier/db/mssql/MSSQLConnectionModifier.java
+++ b/src/main/java/com/profiler/modifier/db/mssql/MSSQLConnectionModifier.java
@@ -6,6 +6,7 @@ import javassist.CtMethod;
import com.profiler.config.TomcatProfilerConstant;
import com.profiler.modifier.AbstractModifier;
+import com.profiler.trace.DatabaseRequestTracer;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -50,11 +51,11 @@ public class MSSQLConnectionModifier extends AbstractModifier {
params[1] = classPool.getCtClass("int");
CtMethod method = cc.getDeclaredMethod("createStatement", params);
- method.insertAfter("{" + TomcatProfilerConstant.CLASS_NAME_REQUEST_DATA_TRACER + ".put(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_CREATE_STATEMENT + "); }");
+ method.insertAfter("{" + DatabaseRequestTracer.FQCN + ".put(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_CREATE_STATEMENT + "); }");
}
private void updateCloseMethod(CtClass cc) throws Exception {
CtMethod method = cc.getDeclaredMethod("close", null);
- method.insertAfter("{" + TomcatProfilerConstant.CLASS_NAME_REQUEST_DATA_TRACER + ".put(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_CLOSE_CONNECTION + "); }");
+ method.insertAfter("{" + DatabaseRequestTracer.FQCN + ".put(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_CLOSE_CONNECTION + "); }");
}
}
diff --git a/src/main/java/com/profiler/modifier/db/mssql/MSSQLPreparedStatementModifier.java b/src/main/java/com/profiler/modifier/db/mssql/MSSQLPreparedStatementModifier.java
index 043cf6245..3ccc9cd0e 100644
--- a/src/main/java/com/profiler/modifier/db/mssql/MSSQLPreparedStatementModifier.java
+++ b/src/main/java/com/profiler/modifier/db/mssql/MSSQLPreparedStatementModifier.java
@@ -7,6 +7,7 @@ import javassist.CtMethod;
import com.profiler.config.TomcatProfilerConstant;
import com.profiler.modifier.AbstractModifier;
+import com.profiler.trace.DatabaseRequestTracer;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -55,7 +56,7 @@ public class MSSQLPreparedStatementModifier extends AbstractModifier {
params1[4] = classPool.getCtClass("int");
CtMethod method = cc.getDeclaredMethod("setParameter", params1);
- method.insertBefore("{" + TomcatProfilerConstant.CLASS_NAME_REQUEST_DATA_TRACER + ".putSqlParam($1,$2);} ");
+ method.insertBefore("{" + DatabaseRequestTracer.FQCN + ".putSqlParam($1,$2);} ");
}
private void updateConstructor(CtClass cc) throws Exception {
@@ -63,12 +64,12 @@ public class MSSQLPreparedStatementModifier extends AbstractModifier {
if (constructorList.length == 1) {
CtConstructor constructor = constructorList[0];
- constructor.insertAfter("{" + TomcatProfilerConstant.CLASS_NAME_REQUEST_DATA_TRACER + ".putSqlQuery(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_QUERY + ",$2); }");
+ constructor.insertAfter("{" + DatabaseRequestTracer.FQCN + ".putSqlQuery(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_QUERY + ",$2); }");
}
}
private void updateExecuteQueryMethod(CtClass cc) throws Exception {
CtMethod serviceMethod = cc.getDeclaredMethod("execute", null);
- serviceMethod.insertAfter("{" + TomcatProfilerConstant.CLASS_NAME_REQUEST_DATA_TRACER + ".put(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_EXECUTE_QUERY + "); }");
+ serviceMethod.insertAfter("{" + DatabaseRequestTracer.FQCN + ".put(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_EXECUTE_QUERY + "); }");
}
}
diff --git a/src/main/java/com/profiler/modifier/db/mssql/MSSQLResultSetModifier.java b/src/main/java/com/profiler/modifier/db/mssql/MSSQLResultSetModifier.java
index 6853921f4..b1f29394a 100644
--- a/src/main/java/com/profiler/modifier/db/mssql/MSSQLResultSetModifier.java
+++ b/src/main/java/com/profiler/modifier/db/mssql/MSSQLResultSetModifier.java
@@ -4,9 +4,9 @@ import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
-import com.profiler.config.TomcatProfilerConstant;
import com.profiler.modifier.AbstractModifier;
+import com.profiler.trace.DatabaseRequestTracer;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -47,11 +47,11 @@ public class MSSQLResultSetModifier extends AbstractModifier {
private void updateNextMethod(CtClass cc) throws Exception {
CtMethod serviceMethod1 = cc.getDeclaredMethod("next", null);
- serviceMethod1.insertBefore("{" + TomcatProfilerConstant.CLASS_NAME_REQUEST_DATA_TRACER + ".updateFetchCount(); }");
+ serviceMethod1.insertBefore("{" + DatabaseRequestTracer.FQCN + ".updateFetchCount(); }");
}
private void updateCloseMethod(CtClass cc) throws Exception {
CtMethod serviceMethod1 = cc.getDeclaredMethod("close", null);
- serviceMethod1.insertBefore("{" + TomcatProfilerConstant.CLASS_NAME_REQUEST_DATA_TRACER + ".addResultSetData(); }");
+ serviceMethod1.insertBefore("{" + DatabaseRequestTracer.FQCN + ".addResultSetData(); }");
}
}
\ No newline at end of file
diff --git a/src/main/java/com/profiler/modifier/db/mssql/MSSQLStatementModifier.java b/src/main/java/com/profiler/modifier/db/mssql/MSSQLStatementModifier.java
index fdc9cd5de..0c802e17b 100644
--- a/src/main/java/com/profiler/modifier/db/mssql/MSSQLStatementModifier.java
+++ b/src/main/java/com/profiler/modifier/db/mssql/MSSQLStatementModifier.java
@@ -6,6 +6,7 @@ import javassist.CtMethod;
import com.profiler.config.TomcatProfilerConstant;
import com.profiler.modifier.AbstractModifier;
+import com.profiler.trace.DatabaseRequestTracer;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -49,8 +50,8 @@ public class MSSQLStatementModifier extends AbstractModifier {
StringBuilder sb = new StringBuilder();
sb.append("{");
- sb.append(TomcatProfilerConstant.CLASS_NAME_REQUEST_DATA_TRACER + ".putSqlQuery(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_QUERY + ",$1);");
- sb.append(TomcatProfilerConstant.CLASS_NAME_REQUEST_DATA_TRACER + ".put(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_EXECUTE_QUERY + ");");
+ sb.append(DatabaseRequestTracer.FQCN + ".putSqlQuery(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_QUERY + ",$1);");
+ sb.append(DatabaseRequestTracer.FQCN + ".put(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_EXECUTE_QUERY + ");");
sb.append("}");
serviceMethod.insertAfter(sb.toString());
diff --git a/src/main/java/com/profiler/modifier/db/mysql/MySQLConnectionImplModifier.java b/src/main/java/com/profiler/modifier/db/mysql/MySQLConnectionImplModifier.java
index efd35205c..0202d5b59 100644
--- a/src/main/java/com/profiler/modifier/db/mysql/MySQLConnectionImplModifier.java
+++ b/src/main/java/com/profiler/modifier/db/mysql/MySQLConnectionImplModifier.java
@@ -6,6 +6,7 @@ import javassist.CtMethod;
import com.profiler.config.TomcatProfilerConstant;
import com.profiler.modifier.AbstractModifier;
+import com.profiler.trace.DatabaseRequestTracer;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -47,7 +48,7 @@ public class MySQLConnectionImplModifier extends AbstractModifier {
private void updateCreateStatementMethod(CtClass cc) throws Exception {
CtMethod method = cc.getDeclaredMethod("createStatement", null);
- method.insertAfter("{" + TomcatProfilerConstant.CLASS_NAME_REQUEST_DATA_TRACER + ".put(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_CREATE_STATEMENT + "); }");
+ method.insertAfter("{" + DatabaseRequestTracer.FQCN + ".put(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_CREATE_STATEMENT + "); }");
}
private void updateGetInstanceMethod(CtClass cc) throws Exception {
@@ -59,11 +60,11 @@ public class MySQLConnectionImplModifier extends AbstractModifier {
params[4] = classPool.getCtClass("java.lang.String");
CtMethod method = cc.getDeclaredMethod("getInstance", params);
- method.insertAfter("{" + TomcatProfilerConstant.CLASS_NAME_REQUEST_DATA_TRACER + ".putConnection(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_GET_CONNECTION + ",$5); }");
+ method.insertAfter("{" + DatabaseRequestTracer.FQCN + ".putConnection(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_GET_CONNECTION + ",$5); }");
}
private void updateCloseMethod(CtClass cc) throws Exception {
CtMethod method = cc.getDeclaredMethod("close", null);
- method.insertAfter("{" + TomcatProfilerConstant.CLASS_NAME_REQUEST_DATA_TRACER + ".put(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_CLOSE_CONNECTION + "); }");
+ method.insertAfter("{" + DatabaseRequestTracer.FQCN + ".put(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_CLOSE_CONNECTION + "); }");
}
}
diff --git a/src/main/java/com/profiler/modifier/db/mysql/MySQLPreparedStatementModifier.java b/src/main/java/com/profiler/modifier/db/mysql/MySQLPreparedStatementModifier.java
index f2cccadc3..6d3df9272 100644
--- a/src/main/java/com/profiler/modifier/db/mysql/MySQLPreparedStatementModifier.java
+++ b/src/main/java/com/profiler/modifier/db/mysql/MySQLPreparedStatementModifier.java
@@ -7,6 +7,7 @@ import javassist.CtMethod;
import com.profiler.config.TomcatProfilerConstant;
import com.profiler.modifier.AbstractModifier;
+import com.profiler.trace.DatabaseRequestTracer;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -51,14 +52,14 @@ public class MySQLPreparedStatementModifier extends AbstractModifier {
params1[1] = classPool.getCtClass("java.lang.String");
CtMethod method1 = cc.getDeclaredMethod("setInternal", params1);
- method1.insertBefore("{" + TomcatProfilerConstant.CLASS_NAME_REQUEST_DATA_TRACER + ".putSqlParam($1,$2); }");
+ method1.insertBefore("{" + DatabaseRequestTracer.FQCN + ".putSqlParam($1,$2); }");
CtClass[] params2 = new CtClass[2];
params2[0] = classPool.getCtClass("int");
params2[1] = classPool.getCtClass("byte[]");
CtMethod method2 = cc.getDeclaredMethod("setInternal", params2);
- method2.insertBefore("{" + TomcatProfilerConstant.CLASS_NAME_REQUEST_DATA_TRACER + ".putSqlParam($1,$2); }");
+ method2.insertBefore("{" + DatabaseRequestTracer.FQCN + ".putSqlParam($1,$2); }");
}
private void updateConstructor(CtClass cc) throws Exception {
@@ -67,7 +68,7 @@ public class MySQLPreparedStatementModifier extends AbstractModifier {
for (CtConstructor constructor : constructorList) {
CtClass params[] = constructor.getParameterTypes();
if (params.length == 3) {
- constructor.insertBefore("{" + TomcatProfilerConstant.CLASS_NAME_REQUEST_DATA_TRACER + ".putSqlQuery(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_QUERY + ",$2); }");
+ constructor.insertBefore("{" + DatabaseRequestTracer.FQCN + ".putSqlQuery(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_QUERY + ",$2); }");
}
}
}
@@ -75,6 +76,6 @@ public class MySQLPreparedStatementModifier extends AbstractModifier {
private void updateExecuteQueryMethod(CtClass cc) throws Exception {
CtMethod method = cc.getDeclaredMethod("executeQuery", null);
- method.insertAfter("{" + TomcatProfilerConstant.CLASS_NAME_REQUEST_DATA_TRACER + ".put(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_EXECUTE_QUERY + "); }");
+ method.insertAfter("{" + DatabaseRequestTracer.FQCN + ".put(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_EXECUTE_QUERY + "); }");
}
}
diff --git a/src/main/java/com/profiler/modifier/db/mysql/MySQLResultSetModifier.java b/src/main/java/com/profiler/modifier/db/mysql/MySQLResultSetModifier.java
index d7e4f7090..a4ebb40af 100644
--- a/src/main/java/com/profiler/modifier/db/mysql/MySQLResultSetModifier.java
+++ b/src/main/java/com/profiler/modifier/db/mysql/MySQLResultSetModifier.java
@@ -4,8 +4,8 @@ import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
-import com.profiler.config.TomcatProfilerConstant;
import com.profiler.modifier.AbstractModifier;
+import com.profiler.trace.DatabaseRequestTracer;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -46,11 +46,11 @@ public class MySQLResultSetModifier extends AbstractModifier {
private void updateNextMethod(CtClass cc) throws Exception {
CtMethod method = cc.getDeclaredMethod("next", null);
- method.insertBefore("{" + TomcatProfilerConstant.CLASS_NAME_REQUEST_DATA_TRACER + ".updateFetchCount(); }");
+ method.insertBefore("{" + DatabaseRequestTracer.FQCN + ".updateFetchCount(); }");
}
private void updateCloseMethod(CtClass cc) throws Exception {
CtMethod method = cc.getDeclaredMethod("close", null);
- method.insertBefore("{" + TomcatProfilerConstant.CLASS_NAME_REQUEST_DATA_TRACER + ".addResultSetData(); }");
+ method.insertBefore("{" + DatabaseRequestTracer.FQCN + ".addResultSetData(); }");
}
}
diff --git a/src/main/java/com/profiler/modifier/db/mysql/MySQLStatementModifier.java b/src/main/java/com/profiler/modifier/db/mysql/MySQLStatementModifier.java
index 8d2e71418..a38dcec86 100644
--- a/src/main/java/com/profiler/modifier/db/mysql/MySQLStatementModifier.java
+++ b/src/main/java/com/profiler/modifier/db/mysql/MySQLStatementModifier.java
@@ -6,6 +6,7 @@ import javassist.CtMethod;
import com.profiler.config.TomcatProfilerConstant;
import com.profiler.modifier.AbstractModifier;
+import com.profiler.trace.DatabaseRequestTracer;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -50,8 +51,8 @@ public class MySQLStatementModifier extends AbstractModifier {
StringBuilder sb = new StringBuilder();
sb.append("{");
- sb.append(TomcatProfilerConstant.CLASS_NAME_REQUEST_DATA_TRACER + ".putSqlQuery(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_QUERY + ",$1);");
- sb.append(TomcatProfilerConstant.CLASS_NAME_REQUEST_DATA_TRACER + ".put(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_EXECUTE_QUERY + ");");
+ sb.append(DatabaseRequestTracer.FQCN + ".putSqlQuery(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_QUERY + ",$1);");
+ sb.append(DatabaseRequestTracer.FQCN + ".put(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_EXECUTE_QUERY + ");");
sb.append("}");
method.insertAfter(sb.toString());
diff --git a/src/main/java/com/profiler/modifier/db/oracle/OraclePreparedStatementModifier.java b/src/main/java/com/profiler/modifier/db/oracle/OraclePreparedStatementModifier.java
index 2f4e32584..fb388d926 100644
--- a/src/main/java/com/profiler/modifier/db/oracle/OraclePreparedStatementModifier.java
+++ b/src/main/java/com/profiler/modifier/db/oracle/OraclePreparedStatementModifier.java
@@ -8,6 +8,7 @@ import javassist.CtMethod;
import com.profiler.config.TomcatProfilerConstant;
import com.profiler.modifier.AbstractModifier;
+import com.profiler.trace.DatabaseRequestTracer;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -53,7 +54,7 @@ public class OraclePreparedStatementModifier extends AbstractModifier {
params1[1] = classPool.getCtClass("java.lang.String");
CtMethod serviceMethod1 = cc.getDeclaredMethod("setStringInternal", params1);
- serviceMethod1.insertBefore("{" + TomcatProfilerConstant.CLASS_NAME_REQUEST_DATA_TRACER + ".putSqlParam($1,$2); }");
+ serviceMethod1.insertBefore("{" + DatabaseRequestTracer.FQCN + ".putSqlParam($1,$2); }");
// CtClass[] params2 = new CtClass[2];
// params2[0] = classPool.getCtClass("int");
@@ -62,7 +63,7 @@ public class OraclePreparedStatementModifier extends AbstractModifier {
// params2);
//
// serviceMethod2.insertBefore("{" +
- // TomcatProfilerConstant.CLASS_NAME_REQUEST_DATA_TRACER +
+ // RequestDataTracer.FQCN +
// ".putSqlParam($1,$2); {");
}
@@ -72,13 +73,13 @@ public class OraclePreparedStatementModifier extends AbstractModifier {
for (CtConstructor constructor : constructorList) {
CtClass params[] = constructor.getParameterTypes();
if (params.length == 6) {
- constructor.insertBefore("{" + TomcatProfilerConstant.CLASS_NAME_REQUEST_DATA_TRACER + ".putSqlQuery(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_QUERY + ",$2); }");
+ constructor.insertBefore("{" + DatabaseRequestTracer.FQCN + ".putSqlQuery(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_QUERY + ",$2); }");
}
}
}
private void updateExecuteMethod(CtClass cc) throws Exception {
CtMethod method = cc.getDeclaredMethod("execute", null);
- method.insertAfter("{" + TomcatProfilerConstant.CLASS_NAME_REQUEST_DATA_TRACER + ".put(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_EXECUTE_QUERY + "); }");
+ method.insertAfter("{" + DatabaseRequestTracer.FQCN + ".put(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_EXECUTE_QUERY + "); }");
}
}
diff --git a/src/main/java/com/profiler/modifier/db/oracle/OracleResultSetModifier.java b/src/main/java/com/profiler/modifier/db/oracle/OracleResultSetModifier.java
index e43fe2cb1..425f21345 100644
--- a/src/main/java/com/profiler/modifier/db/oracle/OracleResultSetModifier.java
+++ b/src/main/java/com/profiler/modifier/db/oracle/OracleResultSetModifier.java
@@ -4,8 +4,8 @@ import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
-import com.profiler.config.TomcatProfilerConstant;
import com.profiler.modifier.AbstractModifier;
+import com.profiler.trace.DatabaseRequestTracer;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -46,11 +46,11 @@ public class OracleResultSetModifier extends AbstractModifier {
private void updateNextMethod(CtClass cc) throws Exception {
CtMethod method = cc.getDeclaredMethod("next", null);
- method.insertBefore("{" + TomcatProfilerConstant.CLASS_NAME_REQUEST_DATA_TRACER + ".updateFetchCount(); }");
+ method.insertBefore("{" + DatabaseRequestTracer.FQCN + ".updateFetchCount(); }");
}
private void updateCloseMethod(CtClass cc) throws Exception {
CtMethod method = cc.getDeclaredMethod("close", null);
- method.insertBefore("{" + TomcatProfilerConstant.CLASS_NAME_REQUEST_DATA_TRACER + ".addResultSetData(); }");
+ method.insertBefore("{" + DatabaseRequestTracer.FQCN + ".addResultSetData(); }");
}
}
diff --git a/src/main/java/com/profiler/modifier/db/oracle/OracleStatementModifier.java b/src/main/java/com/profiler/modifier/db/oracle/OracleStatementModifier.java
index 7951809ec..ad6bef9e7 100644
--- a/src/main/java/com/profiler/modifier/db/oracle/OracleStatementModifier.java
+++ b/src/main/java/com/profiler/modifier/db/oracle/OracleStatementModifier.java
@@ -6,6 +6,7 @@ import javassist.CtMethod;
import com.profiler.config.TomcatProfilerConstant;
import com.profiler.modifier.AbstractModifier;
+import com.profiler.trace.DatabaseRequestTracer;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -50,8 +51,8 @@ public class OracleStatementModifier extends AbstractModifier {
StringBuilder sb = new StringBuilder();
sb.append("{");
- sb.append(TomcatProfilerConstant.CLASS_NAME_REQUEST_DATA_TRACER + ".putSqlQuery(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_QUERY + ",$1);");
- sb.append(TomcatProfilerConstant.CLASS_NAME_REQUEST_DATA_TRACER + ".put(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_EXECUTE_QUERY + ");");
+ sb.append(DatabaseRequestTracer.FQCN + ".putSqlQuery(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_QUERY + ",$1);");
+ sb.append(DatabaseRequestTracer.FQCN + ".put(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_EXECUTE_QUERY + ");");
sb.append("}");
serviceMethod.insertAfter(sb.toString());
diff --git a/src/main/java/com/profiler/modifier/tomcat/EntryPointStandardHostValveModifier.java b/src/main/java/com/profiler/modifier/tomcat/EntryPointStandardHostValveModifier.java
index da5a0ccc0..1b48075c4 100644
--- a/src/main/java/com/profiler/modifier/tomcat/EntryPointStandardHostValveModifier.java
+++ b/src/main/java/com/profiler/modifier/tomcat/EntryPointStandardHostValveModifier.java
@@ -1,13 +1,13 @@
package com.profiler.modifier.tomcat;
import static com.profiler.config.TomcatProfilerConstant.CLASS_NAME_REQUEST_THRIFT_DTO;
-import static com.profiler.config.TomcatProfilerConstant.CLASS_NAME_REQUEST_TRACER;
import javassist.ByteArrayClassPath;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import com.profiler.modifier.AbstractModifier;
+import com.profiler.trace.RequestTracer;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -71,7 +71,7 @@ public class EntryPointStandardHostValveModifier extends AbstractModifier {
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(RequestTracer.FQCN).append(".startTransaction(requestURL,clientIP,requestTime,params);");
if (logger.isLoggable(Level.FINE)) {
insertCode.append("System.out.println(\"--- ApplicationFilterChain.doFilter() is started.\");");
@@ -109,7 +109,7 @@ public class EntryPointStandardHostValveModifier extends AbstractModifier {
private String getInvokeMethodAfterInsertCode() {
StringBuilder insertCode = new StringBuilder();
insertCode.append("{");
- insertCode.append(CLASS_NAME_REQUEST_TRACER).append(".endTransaction();");
+ insertCode.append(RequestTracer.FQCN).append(".endTransaction();");
if (logger.isLoggable(Level.FINE)) {
insertCode.append("System.out.println(\"--- ApplicationFilterChain.doFilter() is ended.\");");
@@ -129,7 +129,7 @@ public class EntryPointStandardHostValveModifier extends AbstractModifier {
insertCode.append("System.out.println(\"--- \"+$e.getMessage()+\" is occured !!!\");");
}
- insertCode.append(CLASS_NAME_REQUEST_TRACER).append(".exceptionTransaction($e);");
+ insertCode.append(RequestTracer.FQCN).append(".exceptionTransaction($e);");
if (logger.isLoggable(Level.FINE)) {
insertCode.append("System.out.println(\"------------------------------------------------\");");
@@ -146,7 +146,7 @@ public class EntryPointStandardHostValveModifier extends AbstractModifier {
private void addRequestTracerToCurrentClassLoader(ClassLoader classLoader) {
try {
- classLoader.loadClass(CLASS_NAME_REQUEST_TRACER);
+ classLoader.loadClass(RequestTracer.FQCN);
classLoader.loadClass(CLASS_NAME_REQUEST_THRIFT_DTO);
classLoader.loadClass("org.apache.thrift.TBase");
} catch (Exception e) {
diff --git a/src/main/java/com/profiler/receiver/TCPSocketManager.java b/src/main/java/com/profiler/receiver/TCPSocketManager.java
index f4e9d9bcc..b6615aab3 100644
--- a/src/main/java/com/profiler/receiver/TCPSocketManager.java
+++ b/src/main/java/com/profiler/receiver/TCPSocketManager.java
@@ -14,10 +14,8 @@ public class TCPSocketManager extends Thread {
public void run() {
try {
- serverSocket = new ServerSocket(
- TomcatProfilerConfig.AGENT_TCP_LISTEN_PORT, 100);
- System.out
- .println("*** Start TomcatProfiler TCP Listen Thread ***");
+ 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();
diff --git a/src/main/java/com/profiler/sender/AbstractDataSender.java b/src/main/java/com/profiler/sender/AbstractDataSender.java
deleted file mode 100644
index 683ca9724..000000000
--- a/src/main/java/com/profiler/sender/AbstractDataSender.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package com.profiler.sender;
-
-import java.net.DatagramPacket;
-import java.net.DatagramSocket;
-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());
- udpSocket.send(packet);
- // if(this instanceof RequestDataSender || this instanceof
- // RequestTransactionDataSender ) {
- // System.out.println(this.getClass().getName()+" Send bufferSize="+udpSocket.getSendBufferSize()+" dataLength="+sendDataLength);
- // }
- udpSocket.close();
- } 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);
- }
-}
diff --git a/src/main/java/com/profiler/sender/AgentInfoSender.java b/src/main/java/com/profiler/sender/AgentInfoSender.java
index 20d0b58fc..a52b700f5 100644
--- a/src/main/java/com/profiler/sender/AgentInfoSender.java
+++ b/src/main/java/com/profiler/sender/AgentInfoSender.java
@@ -12,15 +12,18 @@ public class AgentInfoSender extends Thread {
private final Logger logger = Logger.getLogger(AgentInfoSender.class.getName());
- boolean isAgentStart;
+ private boolean isAgentStart;
+ private Socket requestSocket = null;
public AgentInfoSender(boolean isAgentStart) {
this.isAgentStart = isAgentStart;
}
- Socket requestSocket = null;
-
public void run() {
+ System.out.println("\n\n\n\n\n");
+ System.out.println("send agent info");
+ System.out.println("\n\n\n\n\n");
+
if (isAgentStart) {
sendAgentStartInfo();
} else {
@@ -56,7 +59,6 @@ public class AgentInfoSender extends Thread {
}
private void sendAgentStartInfo() {
-
while (connectToServer()) {
try {
Thread.sleep(TomcatProfilerConfig.SERVER_CONNECT_RETRY_GAP);
@@ -64,13 +66,9 @@ public class AgentInfoSender extends Thread {
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();
if (logger.isLoggable(Level.INFO)) {
@@ -83,6 +81,7 @@ public class AgentInfoSender extends Thread {
} catch (Exception e) {
e.printStackTrace();
}
+
if (requestSocket != null) {
closeSocket();
}
diff --git a/src/main/java/com/profiler/sender/DataSender.java b/src/main/java/com/profiler/sender/DataSender.java
new file mode 100644
index 000000000..09cb11e25
--- /dev/null
+++ b/src/main/java/com/profiler/sender/DataSender.java
@@ -0,0 +1,95 @@
+package com.profiler.sender;
+
+import java.io.IOException;
+import java.net.DatagramPacket;
+import java.net.DatagramSocket;
+import java.net.InetSocketAddress;
+import java.net.SocketException;
+import java.util.concurrent.LinkedBlockingQueue;
+
+import org.apache.thrift.TBase;
+import org.apache.thrift.TException;
+import org.apache.thrift.TSerializer;
+import org.apache.thrift.protocol.TBinaryProtocol;
+
+import com.profiler.config.TomcatProfilerConfig;
+import com.profiler.dto.JVMInfoThriftDTO;
+import com.profiler.dto.RequestDataListThriftDTO;
+import com.profiler.dto.RequestThriftDTO;
+
+/**
+ *
+ * @author netspider
+ *
+ */
+public class DataSender extends Thread {
+
+ private final LinkedBlockingQueue> addedQueue = new LinkedBlockingQueue>();
+
+ private final InetSocketAddress requestDataAddr = new InetSocketAddress(TomcatProfilerConfig.SERVER_IP, TomcatProfilerConfig.REQUEST_DATA_LISTEN_PORT);
+ private final InetSocketAddress requestTransactionDataAddr = new InetSocketAddress(TomcatProfilerConfig.SERVER_IP, TomcatProfilerConfig.REQUEST_TRANSACTION_DATA_LISTEN_PORT);
+ private final InetSocketAddress jvmDataAddr = new InetSocketAddress(TomcatProfilerConfig.SERVER_IP, TomcatProfilerConfig.JVM_DATA_LISTEN_PORT);
+
+ private static class SingletonHolder {
+ public static final DataSender INSTANCE = new DataSender();
+ }
+
+ public static DataSender getInstance() {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private DataSender() {
+ setName("Data Sender");
+ setDaemon(true);
+ start();
+ }
+
+ public boolean addDataToSend(TBase, ?> data) {
+ return addedQueue.add(data);
+ }
+
+ public void run() {
+ while (true) {
+ DatagramSocket udpSocket = null;
+ try {
+ TBase, ?> dto = addedQueue.take();
+
+ TSerializer serializer = new TSerializer(new TBinaryProtocol.Factory());
+ byte[] sendData = serializer.serialize(dto);
+
+ // TODO: 포트 하나로 통일 시켜야 함. 일단 임시로 이렇게..
+ InetSocketAddress address = null;
+ if (dto instanceof RequestDataListThriftDTO) {
+ address = requestDataAddr;
+ } else if (dto instanceof RequestThriftDTO) {
+ address = requestTransactionDataAddr;
+ } else if (dto instanceof JVMInfoThriftDTO) {
+ address = jvmDataAddr;
+ }
+
+ if (address == null) {
+ throw new IllegalArgumentException("Can't resolve receiver address.");
+ }
+
+ DatagramPacket packet = new DatagramPacket(sendData, sendData.length, address);
+
+ udpSocket = new DatagramSocket();
+ udpSocket.send(packet);
+
+ System.out.println("data sent.");
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ } catch (TException e) {
+ e.printStackTrace();
+ } catch (SocketException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ if (udpSocket != null) {
+ udpSocket.close();
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/com/profiler/sender/JVMDataSender.java b/src/main/java/com/profiler/sender/JVMDataSender.java
deleted file mode 100644
index 738ece85e..000000000
--- a/src/main/java/com/profiler/sender/JVMDataSender.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.profiler.sender;
-
-import java.net.InetSocketAddress;
-
-import org.apache.thrift.TSerializer;
-import org.apache.thrift.protocol.TBinaryProtocol;
-
-import com.profiler.config.TomcatProfilerConfig;
-import com.profiler.dto.JVMInfoThriftDTO;
-
-public class JVMDataSender extends AbstractDataSender{
- JVMInfoThriftDTO dto;
- public JVMDataSender(JVMInfoThriftDTO dto) {
- this.dto=dto;
- log(dto.toString());
- }
- protected byte[] getSendData() throws Exception {
- TSerializer serializer = new TSerializer(new TBinaryProtocol.Factory());
- return serializer.serialize(dto);
- }
- protected InetSocketAddress getAddress() throws Exception {
- return new InetSocketAddress(TomcatProfilerConfig.SERVER_IP, TomcatProfilerConfig.JVM_DATA_LISTEN_PORT);
- }
-}
diff --git a/src/main/java/com/profiler/sender/RequestDataSender.java b/src/main/java/com/profiler/sender/RequestDataSender.java
deleted file mode 100644
index 83cd5c078..000000000
--- a/src/main/java/com/profiler/sender/RequestDataSender.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.profiler.sender;
-
-import java.net.InetSocketAddress;
-
-import org.apache.thrift.TSerializer;
-import org.apache.thrift.protocol.TBinaryProtocol;
-
-import com.profiler.config.TomcatProfilerConfig;
-import com.profiler.dto.RequestDataListThriftDTO;
-
-public class RequestDataSender extends AbstractDataSender{
- RequestDataListThriftDTO dto;
- public RequestDataSender(RequestDataListThriftDTO dto) {
- this.dto=dto;
-// log(dto.toString());
- }
- @Override
- protected byte[] getSendData() throws Exception {
- TSerializer serializer = new TSerializer(new TBinaryProtocol.Factory());
-// byte[] serializedBytes=serializer.serialize(dto);
-// System.out.println("-----Request Data size="+serializedBytes.length);
-// return serializedBytes;
- return serializer.serialize(dto);
- }
-
- @Override
- protected InetSocketAddress getAddress() throws Exception {
- return new InetSocketAddress(TomcatProfilerConfig.SERVER_IP, TomcatProfilerConfig.REQUEST_DATA_LISTEN_PORT);
- }
-
-
-}
diff --git a/src/main/java/com/profiler/sender/RequestTransactionDataSender.java b/src/main/java/com/profiler/sender/RequestTransactionDataSender.java
deleted file mode 100644
index 12d091e67..000000000
--- a/src/main/java/com/profiler/sender/RequestTransactionDataSender.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.profiler.sender;
-
-import java.net.InetSocketAddress;
-
-import org.apache.thrift.TSerializer;
-import org.apache.thrift.protocol.TBinaryProtocol;
-
-import com.profiler.config.TomcatProfilerConfig;
-import com.profiler.dto.RequestThriftDTO;
-
-public class RequestTransactionDataSender extends AbstractDataSender{
- RequestThriftDTO dto;
- public RequestTransactionDataSender(RequestThriftDTO dto) {
- this.dto=dto;
-// log(dto.toString());
- }
- @Override
- protected byte[] getSendData() throws Exception {
- TSerializer serializer = new TSerializer(new TBinaryProtocol.Factory());
-// byte[] serializedBytes=serializer.serialize(dto);
-// System.out.println("-----Request Transaction Data size="+serializedBytes.length);
-// return serializedBytes;
- return serializer.serialize(dto);
- }
-
- @Override
- protected InetSocketAddress getAddress() throws Exception {
- return new InetSocketAddress(TomcatProfilerConfig.SERVER_IP, TomcatProfilerConfig.REQUEST_TRANSACTION_DATA_LISTEN_PORT);
- }
-}
diff --git a/src/main/java/com/profiler/thread/AgentStateManager.java b/src/main/java/com/profiler/thread/AgentStateManager.java
index b5cca3279..ab0c78cc1 100644
--- a/src/main/java/com/profiler/thread/AgentStateManager.java
+++ b/src/main/java/com/profiler/thread/AgentStateManager.java
@@ -3,13 +3,15 @@ package com.profiler.thread;
import com.profiler.sender.AgentInfoSender;
public class AgentStateManager {
- public static void startJVMTraceThread() {
- CurrentJVMStateCheckThread tracer = new CurrentJVMStateCheckThread();
- tracer.setDaemon(true);
- tracer.start();
- }
- public static void sendJVMStoppedInfo() throws Exception {
- AgentInfoSender sender = new AgentInfoSender(false);
- sender.start();
- }
+
+ public static void startJVMTraceThread() {
+ CurrentJVMStateCheckThread tracer = new CurrentJVMStateCheckThread();
+ tracer.setDaemon(true);
+ tracer.start();
+ }
+
+ public static void sendJVMStoppedInfo() throws Exception {
+ AgentInfoSender sender = new AgentInfoSender(false);
+ sender.start();
+ }
}
diff --git a/src/main/java/com/profiler/thread/CurrentJVMStateCheckThread.java b/src/main/java/com/profiler/thread/CurrentJVMStateCheckThread.java
index c523ac98a..36e20170e 100644
--- a/src/main/java/com/profiler/thread/CurrentJVMStateCheckThread.java
+++ b/src/main/java/com/profiler/thread/CurrentJVMStateCheckThread.java
@@ -1,4 +1,5 @@
package com.profiler.thread;
+
import static com.profiler.config.TomcatProfilerConfig.JVM_STAT_GAP;
import java.lang.management.GarbageCollectorMXBean;
@@ -11,137 +12,144 @@ import java.util.List;
import com.profiler.dto.AgentInfoDTO;
import com.profiler.dto.JVMInfoThriftDTO;
import com.profiler.sender.AgentInfoSender;
-import com.profiler.sender.JVMDataSender;
-import com.profiler.trace.RequestTransactionTracer;
+import com.profiler.sender.DataSender;
+import com.profiler.trace.RequestTracer;
import com.sun.management.OperatingSystemMXBean;
+
@SuppressWarnings("restriction")
public class CurrentJVMStateCheckThread extends Thread {
- JVMInfoThriftDTO currentDto=new JVMInfoThriftDTO();
+
+ private JVMInfoThriftDTO currentDto = new JVMInfoThriftDTO();
+
public void run() {
setHostIPandPort();
-
- long gap=0;
- while(true) {
+
+ long gap = 0;
+ while (true) {
try {
- if(JVM_STAT_GAP>=gap) {
- long currentMod=System.currentTimeMillis()%1000;
- Thread.sleep(JVM_STAT_GAP-gap-currentMod+1);
- }
- long startTime=System.currentTimeMillis();
-
+ if (JVM_STAT_GAP >= gap) {
+ long currentMod = System.currentTimeMillis() % 1000;
+ Thread.sleep(JVM_STAT_GAP - gap - currentMod + 1);
+ }
+ long startTime = System.currentTimeMillis();
+
sendJVMState();
-
- long endTime=System.currentTimeMillis();
- gap=endTime-startTime;
-// System.out.println(gap);
- } catch(java.util.concurrent.RejectedExecutionException ree) {
-// System.out.println(ree.getMessage());
-// ree.printStackTrace();
+
+ long endTime = System.currentTimeMillis();
+ gap = endTime - startTime;
+ } catch (java.util.concurrent.RejectedExecutionException ree) {
System.out.println("RejectedExecutionException when sending JVM State info ");
- } catch(Exception e) {
+ } catch (Exception e) {
e.printStackTrace();
}
}
}
+
/**
* This method run only one time and send current agent's information.
*
- * It check's host IP and port.
- * After then make hashCode of IP+Port string.
- * This hashCode is always different with others.
+ * It check's host IP and port. After then make hashCode of IP+Port string.
+ * This hashCode is always different with others.
*/
private void setHostIPandPort() {
- AgentInfoDTO.staticPortNumber=AgentInfoDTO.getPortNumberString();
- String hostIP=null;
- try {
- InetAddress thisIp =InetAddress.getLocalHost();
- hostIP=thisIp.getHostAddress();
- } catch(Exception e) {
- e.printStackTrace();
- hostIP="127.0.0.1";
- }
- AgentInfoDTO.staticHostIP=hostIP;
- System.out.println("*** TomcatProfiler : HostIP="+hostIP+" PortNumbers="+AgentInfoDTO.staticPortNumber);
- AgentInfoDTO.staticHostHashCode=(hostIP+AgentInfoDTO.staticPortNumber).hashCode();
+ AgentInfoDTO.staticPortNumber = AgentInfoDTO.getPortNumberString();
- AgentInfoSender sender=new AgentInfoSender(true);
+ String hostIP = null;
+
+ try {
+ InetAddress thisIp = InetAddress.getLocalHost();
+ hostIP = thisIp.getHostAddress();
+ } catch (Exception e) {
+ e.printStackTrace();
+ hostIP = "127.0.0.1";
+ }
+
+ AgentInfoDTO.staticHostIP = hostIP;
+
+ System.out.println("*** TomcatProfiler : HostIP=" + hostIP + " PortNumbers=" + AgentInfoDTO.staticPortNumber);
+
+ AgentInfoDTO.staticHostHashCode = (hostIP + AgentInfoDTO.staticPortNumber).hashCode();
+
+ AgentInfoSender sender = new AgentInfoSender(true);
sender.start();
}
+
/**
* Every JVM_STAT_GAP time, this method is called
+ *
* @throws Exception
*/
private void sendJVMState() throws Exception {
- currentDto=new JVMInfoThriftDTO();
+ currentDto = new JVMInfoThriftDTO();
currentDto.setAgentHashCode(AgentInfoDTO.staticHostHashCode);
currentDto.setDataTime(System.currentTimeMillis());
+
getActiveThreadCount();
getGCState();
getMemoryState();
getProcessCPUUsage();
- JVMDataSender sender=new JVMDataSender(currentDto);
- sender.send();
+
+ DataSender.getInstance().addDataToSend(currentDto);
}
+
private void getActiveThreadCount() throws Exception {
- int currentSize=RequestTransactionTracer.getActiveThreadCount();
+ int currentSize = RequestTracer.getActiveThreadCount();
currentDto.setActiveThreadCount(currentSize);
-// JVMDataSender sender=new JVMDataSender(dto);
-// sender.send();
+ // JVMDataSender sender=new JVMDataSender(dto);
+ // sender.send();
}
-
-
+
private void getGCState() throws Exception {
- List list=ManagementFactory.getGarbageCollectorMXBeans();
- if(list.size()==2) {
- GarbageCollectorMXBean bean1=list.get(0);
+ List list = ManagementFactory.getGarbageCollectorMXBeans();
+ if (list.size() == 2) {
+ GarbageCollectorMXBean bean1 = list.get(0);
currentDto.setGc1Count(bean1.getCollectionCount());
currentDto.setGc1Time(bean1.getCollectionTime());
- GarbageCollectorMXBean bean2=list.get(1);
+ GarbageCollectorMXBean bean2 = list.get(1);
currentDto.setGc2Count(bean2.getCollectionCount());
currentDto.setGc2Time(bean2.getCollectionTime());
}
}
-
+
public void getMemoryState() throws Exception {
- MemoryMXBean bean=ManagementFactory.getMemoryMXBean();
- MemoryUsage heap=bean.getHeapMemoryUsage();
- MemoryUsage nonHeap=bean.getNonHeapMemoryUsage();
-
+ MemoryMXBean bean = ManagementFactory.getMemoryMXBean();
+ MemoryUsage heap = bean.getHeapMemoryUsage();
+ MemoryUsage nonHeap = bean.getNonHeapMemoryUsage();
+
currentDto.setHeapUsed(heap.getUsed());
currentDto.setHeapCommitted(heap.getCommitted());
currentDto.setNonHeapUsed(nonHeap.getUsed());
currentDto.setNonHeapCommitted(nonHeap.getCommitted());
}
- long previousCpuTime=0;
- int processorCount=-1;
- boolean processCPUAvailable=true;
+
+ long previousCpuTime = 0;
+ int processorCount = -1;
+ boolean processCPUAvailable = true;
+
/**
- * I don't know why should I divide by 10 in this result.
- * But it works. - -;
+ * I don't know why should I divide by 10 in this result. But it works. - -;
+ *
* @throws Exception
*/
private void getProcessCPUUsage() throws Exception {
try {
- if(processCPUAvailable) {
- OperatingSystemMXBean sunOSMBean = ManagementFactory.newPlatformMXBeanProxy(
- ManagementFactory.getPlatformMBeanServer(),
- ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME,
- OperatingSystemMXBean.class);
- long cpuTime=sunOSMBean.getProcessCpuTime();
- if(processorCount==-1) {
- processorCount=sunOSMBean.getAvailableProcessors();
+ if (processCPUAvailable) {
+ OperatingSystemMXBean sunOSMBean = ManagementFactory.newPlatformMXBeanProxy(ManagementFactory.getPlatformMBeanServer(), ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME, OperatingSystemMXBean.class);
+ long cpuTime = sunOSMBean.getProcessCpuTime();
+ if (processorCount == -1) {
+ processorCount = sunOSMBean.getAvailableProcessors();
}
-// System.out.println(cpuTime);
- if(previousCpuTime!=0) {
- long usedCPUTotal=(cpuTime-previousCpuTime)/1000000;
- double usedCPU=(0.1D*usedCPUTotal)/(processorCount*JVM_STAT_GAP/1000.0);
+ // System.out.println(cpuTime);
+ if (previousCpuTime != 0) {
+ long usedCPUTotal = (cpuTime - previousCpuTime) / 1000000;
+ double usedCPU = (0.1D * usedCPUTotal) / (processorCount * JVM_STAT_GAP / 1000.0);
currentDto.setProcessCPUTime(usedCPU);
}
- previousCpuTime=cpuTime;
+ previousCpuTime = cpuTime;
}
- } catch(Exception e) {
-// e.printStackTrace();
- processCPUAvailable=false;
+ } catch (Exception e) {
+ // e.printStackTrace();
+ processCPUAvailable = false;
}
}
}
diff --git a/src/main/java/com/profiler/trace/AbstractTracer.java b/src/main/java/com/profiler/trace/AbstractTracer.java
index 999be913a..51fa2d1a2 100644
--- a/src/main/java/com/profiler/trace/AbstractTracer.java
+++ b/src/main/java/com/profiler/trace/AbstractTracer.java
@@ -1,15 +1,18 @@
package com.profiler.trace;
+import java.util.logging.Logger;
+
public abstract class AbstractTracer {
+
+ private static final Logger logger = Logger.getLogger(AbstractTracer.class.getName());
+
public static void printStackTrace() {
- log("#################################################");
- StackTraceElement[] stackList=Thread.currentThread().getStackTrace();
- int length=stackList.length;
- for(int loop=2;loop dbConnectionURL = new Hashtable();
+
+ private static Set sqlSet = null;
+ static {
+ if (TomcatProfilerConfig.QUERY_COUNT_OVER_10000) {
+ sqlSet = new CopyOnWriteArraySet();
+ } else {
+ sqlSet = new HashSet(1024);
+ }
+ }
+
+ private static final ThreadLocal requestDataThreadLocal = new ThreadLocal();
+ private static final ThreadLocal> sqlParamMapThreadLocal = new ThreadLocal>();
+
+ /**
+ * These two variables are used counting "ResultSet.next()" times.
+ */
+ private static final ThreadLocal fetchCountThreadLocal = new ThreadLocal();
+ private static final ThreadLocal totalFetchCountThreadLocal = new ThreadLocal();
+
+ public static RequestDataListThriftDTO getRequestDataList() {
+ return requestDataThreadLocal.get();
+ }
+
+ public static void removeRequestDataList() {
+ requestDataThreadLocal.remove();
+ }
+
+ private static boolean isRequestData() {
+ Integer reqHashCode = RequestTracer.getCurrentRequestHash();
+ if (reqHashCode == null) {
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+ /**
+ * Put data to requestDataThreadLocal.
+ *
+ * @param dataType
+ */
+ public static void put(int dataType) {
+ // System.out.println(dataType+"-----RequestHashCode="+RequestTransactionTracer.getRequestHashCode());
+ if (isRequestData()) {
+ RequestDataListThriftDTO dto = requestDataThreadLocal.get();
+ dto = checkDTO(dto);
+ List list = dto.getRequestDataList();
+ // System.out.println("-----RequestDataListThriftDTO list size="+list.size());
+
+ checkSqlParamMap(list);
+
+ RequestDataThriftDTO dataDto = new RequestDataThriftDTO(dataType, System.currentTimeMillis());
+ list.add(dataDto);
+ requestDataThreadLocal.set(dto);
+ }
+ }
+
+ /**
+ * Put Connection data to requestDataThreadLocal.
+ *
+ * @param dataType
+ */
+ public static void putConnection(int dataType, String url) {
+ // System.out.println(dataType+"-----RequestHashCode="+RequestTransactionTracer.getRequestHashCode());
+ if (isRequestData()) {
+ RequestDataListThriftDTO dto = requestDataThreadLocal.get();
+ dto = checkDTO(dto);
+ List list = dto.getRequestDataList();
+ // System.out.println("-----RequestDataListThriftDTO list size="+list.size());
+
+ checkSqlParamMap(list);
+
+ RequestDataThriftDTO dataDto = new RequestDataThriftDTO(dataType, System.currentTimeMillis());
+ if (url != null) {
+ int hashCode = url.hashCode();
+ if (!dbConnectionURL.containsKey(hashCode)) {
+ dbConnectionURL.put(hashCode, url);
+ dataDto.setDataString(url);
+ // System.out.println(url);
+ }
+ dataDto.setDataHashCode(hashCode);
+ }
+ list.add(dataDto);
+ requestDataThreadLocal.set(dto);
+ }
+ }
+
+ /**
+ * Put SQL Query data into requestDataThreadLocal.
+ *
+ * @param dataType
+ */
+ public static void putSqlQuery(int dataType, String data) {
+ if (isRequestData()) {
+ RequestDataListThriftDTO dto = requestDataThreadLocal.get();
+ dto = checkDTO(dto);
+ List list = dto.getRequestDataList();
+ // System.out.println("-----RequestDataListThriftDTO list size="+list.size());
+
+ checkSqlParamMap(list);
+
+ RequestDataThriftDTO dataDto = new RequestDataThriftDTO(dataType, System.currentTimeMillis());
+ int dataHashCode = data.hashCode();
+ dataDto.setDataHashCode(dataHashCode);
+ boolean isAlreadySent = checkHashCode(dataHashCode);
+ if (!isAlreadySent) {
+ if (data != null) {
+ dataDto.setDataString(QueryStringUtil.removeAllMultiSpace(data));
+ }
+ }
+ list.add(dataDto);
+ requestDataThreadLocal.set(dto);
+ }
+ }
+
+ /**
+ * Check SQL Query HashCode set. If Query count is over 10000, it can make
+ * memory problem. So this method removes 100 hashCode.
+ *
+ * If you use HashSet this remove code will not run.
+ *
+ * @param dataHashCode
+ * @return
+ */
+ private static boolean checkHashCode(int dataHashCode) {
+ if (TomcatProfilerConfig.QUERY_COUNT_OVER_10000) {
+ // If sqlSet is CopyOnWriteArraySet, it removes data.
+ if (sqlSet.size() > 10000) {
+ Iterator iterator = sqlSet.iterator();
+ for (int loop = 0; loop < 100; loop++) {
+ sqlSet.remove(iterator.next());
+ }
+ }
+ }
+ if (sqlSet.contains(dataHashCode)) {
+ return true;
+ } else {
+ sqlSet.add(dataHashCode);
+ return false;
+ }
+ }
+
+ /**
+ * Manage sql param list
+ *
+ * @param list
+ */
+ private static void checkSqlParamMap(List list) {
+ if (isRequestData()) {
+ HashMap map = sqlParamMapThreadLocal.get();
+ if (map != null) {
+ int mapSize = map.size();
+ StringBuilder params = new StringBuilder();
+ for (int loop = 1; loop <= mapSize; loop++) {
+ params.append(map.get(loop)).append(",");
+ }
+
+ RequestDataThriftDTO dataDto = new RequestDataThriftDTO(TomcatProfilerConstant.REQ_DATA_TYPE_DB_PREPARED_STATEMENT_PARAM, System.currentTimeMillis());
+ dataDto.setDataString(params.toString());
+ list.add(dataDto);
+ }
+ sqlParamMapThreadLocal.remove();
+ }
+ }
+
+ /**
+ * Add sql parameter
+ *
+ * @param sequence
+ * @param data
+ */
+ public static void putSqlParam(int sequence, String data) {
+ if (isRequestData()) {
+ HashMap map = sqlParamMapThreadLocal.get();
+ if (map == null) {
+ map = new HashMap();
+ }
+ // if(data!=null) {
+ // try {
+ // System.out.print("Before="+data);
+ // String afterData1=new String(data.getBytes("MS949"),
+ // "ISO-8859-1");;
+ // System.out.print(" After1="+afterData1);
+ // String afterData1_1=new String(afterData1.getBytes("ISO-8859-1"),
+ // "EUC-KR");;
+ // System.out.print(" After1_1="+afterData1_1);
+ //
+ //
+ // String afterData3=new
+ // String(data.getBytes("ISO-8859-1"),"MS949");
+ // System.out.print(" After3="+afterData3);
+ // String afterData3_1=new
+ // String(afterData3.getBytes("MS949"),"EUC-KR");
+ // System.out.print(" After3_1="+afterData3_1);
+ //
+ // String afterData5=new
+ // String(data.getBytes("ISO-8859-1"),"EUC-KR");
+ // System.out.print(" After5="+afterData5);
+ // String afterData6=new String(data.getBytes("MS949"),"EUC-KR");
+ // System.out.print(" After6="+afterData6);
+ //
+ // String afterData7=new String(data.getBytes(),"ISO-8859-1");
+ // System.out.print(" After7="+afterData7);
+ //
+ // System.out.println();
+ // } catch(Exception e) {
+ // e.printStackTrace();
+ // }
+ // }
+ map.put(sequence, data);
+ sqlParamMapThreadLocal.set(map);
+ }
+ }
+
+ public static void putSqlParam(int sequence, byte[] data) {
+ putSqlParam(sequence, new String(data));
+ }
+
+ public static void putSqlParam(int sequence, Object data) {
+ if (data != null) {
+ putSqlParam(sequence, data.toString());
+ } else {
+ putSqlParam(sequence, "null");
+ }
+ }
+
+ /**
+ * Check RequestDataListThriftDTO is null. If this object is null, current
+ * request called this Class first time. So it make RequestDataListThriftDTO
+ * object.
+ *
+ * @param dto
+ * @return
+ */
+ private static RequestDataListThriftDTO checkDTO(RequestDataListThriftDTO dto) {
+ if (dto == null) {
+ // System.out.println("dto=null");
+ dto = new RequestDataListThriftDTO(AgentInfoDTO.staticHostHashCode, RequestTracer.getCurrentRequestHash(), new ArrayList());
+ }
+ return dto;
+ }
+
+ /**
+ * add ResultSet.next() method call count.
+ */
+ public static void updateFetchCount() {
+ Integer totalFetchCount = totalFetchCountThreadLocal.get();
+ Integer fetchCount = fetchCountThreadLocal.get();
+ if (totalFetchCount == null) {
+ totalFetchCountThreadLocal.set(0);
+ }
+ if (fetchCount == null) {
+ fetchCountThreadLocal.set(0);
+ }
+ totalFetchCountThreadLocal.set(totalFetchCountThreadLocal.get() + 1);
+ fetchCountThreadLocal.set(fetchCountThreadLocal.get() + 1);
+ }
+
+ /**
+ * Before transaction end, removes current thread's fetch count data.
+ */
+ public static void removeFetchCount() {
+ totalFetchCountThreadLocal.remove();
+ fetchCountThreadLocal.remove();
+ }
+
+ /**
+ * If ResultSet.close() method is called, this method is called.
+ */
+ public static void addResultSetData() {
+ if (isRequestData()) {
+ // set data fetch count
+ Integer fetchCount = fetchCountThreadLocal.get();
+ if (fetchCount != null) {
+ Integer totalFetchCount = totalFetchCountThreadLocal.get();
+ fetchCountThreadLocal.remove();
+
+ RequestDataListThriftDTO dto = requestDataThreadLocal.get();
+ dto = checkDTO(dto);
+ List list = dto.getRequestDataList();
+ int listSize = list.size();
+ RequestDataThriftDTO previousDTO = list.get(listSize - 1);
+ if (previousDTO.getDataType() != TomcatProfilerConstant.REQ_DATA_TYPE_DB_FETCH) {
+ RequestDataThriftDTO dataDto = new RequestDataThriftDTO(TomcatProfilerConstant.REQ_DATA_TYPE_DB_FETCH, System.currentTimeMillis());
+ dataDto.setExtraInt1(fetchCount);
+ dataDto.setExtraInt2(totalFetchCount);
+ list.add(dataDto);
+ } else {
+ // Because of MS SQL.
+ int previousTotalFetchCount = previousDTO.getExtraInt2();
+ totalFetchCountThreadLocal.set(previousTotalFetchCount);
+ }
+ requestDataThreadLocal.set(dto);
+ }
+ }
+ }
+}
diff --git a/src/main/java/com/profiler/trace/RequestDataTracer.java b/src/main/java/com/profiler/trace/RequestDataTracer.java
deleted file mode 100644
index 7805568f6..000000000
--- a/src/main/java/com/profiler/trace/RequestDataTracer.java
+++ /dev/null
@@ -1,314 +0,0 @@
-package com.profiler.trace;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.CopyOnWriteArraySet;
-
-import com.profiler.config.TomcatProfilerConfig;
-import com.profiler.config.TomcatProfilerConstant;
-import com.profiler.dto.AgentInfoDTO;
-import com.profiler.dto.RequestDataListThriftDTO;
-import com.profiler.dto.RequestDataThriftDTO;
-import com.profiler.util.QueryStringUtil;
-
-public class RequestDataTracer {
- private static Set sqlSet = null;
- private static Hashtable dbConnectionURL = new Hashtable();
-
- static {
- if (TomcatProfilerConfig.QUERY_COUNT_OVER_10000) {
- sqlSet = new CopyOnWriteArraySet();
- } else {
- sqlSet = new HashSet(1024);
- }
- }
-
- private static final ThreadLocal requestDataThreadLocal = new ThreadLocal();
- private static final ThreadLocal> sqlParamMapThreadLocal = new ThreadLocal>();
-
- /**
- * These two variables are used counting "ResultSet.next()" times.
- */
- private static final ThreadLocal fetchCountThreadLocal = new ThreadLocal();
- private static final ThreadLocal totalFetchCountThreadLocal = new ThreadLocal();
-
- public static RequestDataListThriftDTO getRequestDataList() {
- return requestDataThreadLocal.get();
- }
-
- public static void removeRequestDataList() {
- requestDataThreadLocal.remove();
- }
-
- private static boolean isRequestData() {
- Integer reqHashCode = RequestTransactionTracer.getRequestHashCode();
- if (reqHashCode == null) {
- return false;
- } else {
- return true;
- }
- }
-
- /**
- * Put data to requestDataThreadLocal.
- *
- * @param dataType
- */
- public static void put(int dataType) {
-// System.out.println(dataType+"-----RequestHashCode="+RequestTransactionTracer.getRequestHashCode());
- if (isRequestData()) {
- RequestDataListThriftDTO dto = requestDataThreadLocal.get();
- dto = checkDTO(dto);
- List list = dto.getRequestDataList();
- // System.out.println("-----RequestDataListThriftDTO list size="+list.size());
-
- checkSqlParamMap(list);
-
- RequestDataThriftDTO dataDto = new RequestDataThriftDTO(dataType, System.currentTimeMillis());
- list.add(dataDto);
- requestDataThreadLocal.set(dto);
- }
- }
-
- /**
- * Put Connection data to requestDataThreadLocal.
- *
- * @param dataType
- */
- public static void putConnection(int dataType, String url) {
-// System.out.println(dataType+"-----RequestHashCode="+RequestTransactionTracer.getRequestHashCode());
- if (isRequestData()) {
- RequestDataListThriftDTO dto = requestDataThreadLocal.get();
- dto = checkDTO(dto);
- List list = dto.getRequestDataList();
- // System.out.println("-----RequestDataListThriftDTO list size="+list.size());
-
- checkSqlParamMap(list);
-
- RequestDataThriftDTO dataDto = new RequestDataThriftDTO(dataType, System.currentTimeMillis());
- if (url != null) {
- int hashCode = url.hashCode();
- if (!dbConnectionURL.containsKey(hashCode)) {
- dbConnectionURL.put(hashCode, url);
- dataDto.setDataString(url);
-// System.out.println(url);
- }
- dataDto.setDataHashCode(hashCode);
- }
- list.add(dataDto);
- requestDataThreadLocal.set(dto);
- }
- }
-
- /**
- * Put SQL Query data into requestDataThreadLocal.
- *
- * @param dataType
- */
- public static void putSqlQuery(int dataType, String data) {
- if (isRequestData()) {
- RequestDataListThriftDTO dto = requestDataThreadLocal.get();
- dto = checkDTO(dto);
- List list = dto.getRequestDataList();
- // System.out.println("-----RequestDataListThriftDTO list size="+list.size());
-
- checkSqlParamMap(list);
-
- RequestDataThriftDTO dataDto = new RequestDataThriftDTO(dataType, System.currentTimeMillis());
- int dataHashCode = data.hashCode();
- dataDto.setDataHashCode(dataHashCode);
- boolean isAlreadySent = checkHashCode(dataHashCode);
- if (!isAlreadySent) {
- if (data != null) {
- dataDto.setDataString(QueryStringUtil.removeAllMultiSpace(data));
- }
- }
- list.add(dataDto);
- requestDataThreadLocal.set(dto);
- }
- }
-
- /**
- * Check SQL Query HashCode set.
- * If Query count is over 10000, it can make memory problem.
- * So this method removes 100 hashCode.
- *
- * If you use HashSet this remove code will not run.
- *
- * @param dataHashCode
- * @return
- */
- private static boolean checkHashCode(int dataHashCode) {
- if (TomcatProfilerConfig.QUERY_COUNT_OVER_10000) {
- //If sqlSet is CopyOnWriteArraySet, it removes data.
- if (sqlSet.size() > 10000) {
- Iterator iterator = sqlSet.iterator();
- for (int loop = 0; loop < 100; loop++) {
- sqlSet.remove(iterator.next());
- }
- }
- }
- if (sqlSet.contains(dataHashCode)) {
- return true;
- } else {
- sqlSet.add(dataHashCode);
- return false;
- }
- }
-
- /**
- * Manage sql param list
- *
- * @param list
- */
- private static void checkSqlParamMap(List list) {
- if (isRequestData()) {
- HashMap map = sqlParamMapThreadLocal.get();
- if (map != null) {
- int mapSize = map.size();
- StringBuilder params = new StringBuilder();
- for (int loop = 1; loop <= mapSize; loop++) {
- params.append(map.get(loop)).append(",");
- }
-
- RequestDataThriftDTO dataDto = new RequestDataThriftDTO(TomcatProfilerConstant.REQ_DATA_TYPE_DB_PREPARED_STATEMENT_PARAM, System.currentTimeMillis());
- dataDto.setDataString(params.toString());
- list.add(dataDto);
- }
- sqlParamMapThreadLocal.remove();
- }
- }
-
- /**
- * Add sql parameter
- *
- * @param sequence
- * @param data
- */
- public static void putSqlParam(int sequence, String data) {
- if (isRequestData()) {
- HashMap map = sqlParamMapThreadLocal.get();
- if (map == null) {
- map = new HashMap();
- }
-// if(data!=null) {
-// try {
-// System.out.print("Before="+data);
-// String afterData1=new String(data.getBytes("MS949"), "ISO-8859-1");;
-// System.out.print(" After1="+afterData1);
-// String afterData1_1=new String(afterData1.getBytes("ISO-8859-1"), "EUC-KR");;
-// System.out.print(" After1_1="+afterData1_1);
-//
-//
-// String afterData3=new String(data.getBytes("ISO-8859-1"),"MS949");
-// System.out.print(" After3="+afterData3);
-// String afterData3_1=new String(afterData3.getBytes("MS949"),"EUC-KR");
-// System.out.print(" After3_1="+afterData3_1);
-//
-// String afterData5=new String(data.getBytes("ISO-8859-1"),"EUC-KR");
-// System.out.print(" After5="+afterData5);
-// String afterData6=new String(data.getBytes("MS949"),"EUC-KR");
-// System.out.print(" After6="+afterData6);
-//
-// String afterData7=new String(data.getBytes(),"ISO-8859-1");
-// System.out.print(" After7="+afterData7);
-//
-// System.out.println();
-// } catch(Exception e) {
-// e.printStackTrace();
-// }
-// }
- map.put(sequence, data);
- sqlParamMapThreadLocal.set(map);
- }
- }
-
- public static void putSqlParam(int sequence, byte[] data) {
- putSqlParam(sequence, new String(data));
- }
-
- public static void putSqlParam(int sequence, Object data) {
- if (data != null) {
- putSqlParam(sequence, data.toString());
- } else {
- putSqlParam(sequence, "null");
- }
- }
-
- /**
- * Check RequestDataListThriftDTO is null.
- * If this object is null, current request called this Class first time.
- * So it make RequestDataListThriftDTO object.
- *
- * @param dto
- * @return
- */
- private static RequestDataListThriftDTO checkDTO(RequestDataListThriftDTO dto) {
- if (dto == null) {
-// System.out.println("dto=null");
- dto = new RequestDataListThriftDTO(AgentInfoDTO.staticHostHashCode, RequestTransactionTracer.getRequestHashCode(), new ArrayList());
- }
- return dto;
- }
-
- /**
- * add ResultSet.next() method call count.
- */
- public static void updateFetchCount() {
- Integer totalFetchCount = totalFetchCountThreadLocal.get();
- Integer fetchCount = fetchCountThreadLocal.get();
- if (totalFetchCount == null) {
- totalFetchCountThreadLocal.set(0);
- }
- if (fetchCount == null) {
- fetchCountThreadLocal.set(0);
- }
- totalFetchCountThreadLocal.set(totalFetchCountThreadLocal.get() + 1);
- fetchCountThreadLocal.set(fetchCountThreadLocal.get() + 1);
- }
-
- /**
- * Before transaction end, removes current thread's fetch count data.
- */
- public static void removeFetchCount() {
- totalFetchCountThreadLocal.remove();
- fetchCountThreadLocal.remove();
- }
-
- /**
- * If ResultSet.close() method is called,
- * this method is called.
- */
- public static void addResultSetData() {
- if (isRequestData()) {
- //set data fetch count
- Integer fetchCount = fetchCountThreadLocal.get();
- if (fetchCount != null) {
- Integer totalFetchCount = totalFetchCountThreadLocal.get();
- fetchCountThreadLocal.remove();
-
- RequestDataListThriftDTO dto = requestDataThreadLocal.get();
- dto = checkDTO(dto);
- List list = dto.getRequestDataList();
- int listSize = list.size();
- RequestDataThriftDTO previousDTO = list.get(listSize - 1);
- if (previousDTO.getDataType() != TomcatProfilerConstant.REQ_DATA_TYPE_DB_FETCH) {
- RequestDataThriftDTO dataDto = new RequestDataThriftDTO(TomcatProfilerConstant.REQ_DATA_TYPE_DB_FETCH, System.currentTimeMillis());
- dataDto.setExtraInt1(fetchCount);
- dataDto.setExtraInt2(totalFetchCount);
- list.add(dataDto);
- } else {
- //Because of MS SQL.
- int previousTotalFetchCount = previousDTO.getExtraInt2();
- totalFetchCountThreadLocal.set(previousTotalFetchCount);
- }
- requestDataThreadLocal.set(dto);
- }
- }
- }
-}
diff --git a/src/main/java/com/profiler/trace/RequestTracer.java b/src/main/java/com/profiler/trace/RequestTracer.java
new file mode 100644
index 000000000..203fb0f04
--- /dev/null
+++ b/src/main/java/com/profiler/trace/RequestTracer.java
@@ -0,0 +1,119 @@
+package com.profiler.trace;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import com.profiler.config.TomcatProfilerConstant;
+import com.profiler.dto.AgentInfoDTO;
+import com.profiler.dto.RequestDataListThriftDTO;
+import com.profiler.dto.RequestThriftDTO;
+import com.profiler.sender.DataSender;
+
+public class RequestTracer extends AbstractTracer {
+
+ public static final String FQCN = RequestTracer.class.getName();
+
+ private static final ThreadLocal currentRequestID = new ThreadLocal();
+ private static final ThreadLocal currentRequestHash = new ThreadLocal();
+ private static final Set requestSet = Collections.synchronizedSet(new HashSet());
+
+ public static void startTransaction(String requestURL, String clientIP, long requestTime, StringBuilder params) {
+ long cpuUserTime[] = getThreadTime();
+
+ String tempRequestID = Thread.currentThread().getName() + "_" + System.nanoTime();
+ int tempRequestHashCode = tempRequestID.hashCode();
+
+ currentRequestID.set(tempRequestID);
+ currentRequestHash.set(tempRequestHashCode);
+ requestSet.add(tempRequestID);
+
+ RequestThriftDTO dto = new RequestThriftDTO(AgentInfoDTO.staticHostHashCode, tempRequestHashCode, TomcatProfilerConstant.DATA_TYPE_REQUEST, requestTime, cpuUserTime[0], cpuUserTime[1]);
+ dto.setClientIP(clientIP);
+ dto.setRequestURL(requestURL);
+
+ int paramsLength = params.length();
+ if (paramsLength > 0) {
+ params.deleteCharAt(paramsLength - 1);
+ dto.setExtraData1(params.toString());
+ }
+
+ DataSender.getInstance().addDataToSend(dto);
+ }
+
+ /**
+ * Transaction is successfully ended.
+ */
+ public static void endTransaction() {
+ long cpuUserTime[] = getThreadTime();
+ RequestThriftDTO dto = new RequestThriftDTO(AgentInfoDTO.staticHostHashCode, currentRequestHash.get(), TomcatProfilerConstant.DATA_TYPE_RESPONSE, System.currentTimeMillis(), cpuUserTime[0], cpuUserTime[1]);
+
+ finishTransaction(dto);
+ }
+
+ /**
+ * There was an Exception processing transaction.
+ *
+ * @param throwable
+ */
+ public static void exceptionTransaction(Throwable throwable) {
+ long cpuUserTime[] = getThreadTime();
+
+ RequestThriftDTO dto = new RequestThriftDTO(AgentInfoDTO.staticHostHashCode, currentRequestHash.get(), TomcatProfilerConstant.DATA_TYPE_UNCAUGHT_EXCEPTION, System.currentTimeMillis(), cpuUserTime[0], cpuUserTime[1]);
+
+ dto.setExtraData1(throwable.getMessage());
+
+ StackTraceElement[] tempElement = throwable.getStackTrace();
+ dto.setExtraData2(tempElement[0].toString());
+
+ finishTransaction(dto);
+ }
+
+ /**
+ * Transaction is ended and send request end data
+ *
+ * @param dto
+ */
+ private static void finishTransaction(RequestThriftDTO dto) {
+ RequestDataListThriftDTO dataListDto = DatabaseRequestTracer.getRequestDataList();
+
+ if (dataListDto != null) {
+ DataSender.getInstance().addDataToSend(dataListDto);
+ }
+
+ DataSender.getInstance().addDataToSend(dto);
+
+ requestSet.remove(currentRequestID.get());
+ DatabaseRequestTracer.removeRequestDataList();
+ DatabaseRequestTracer.removeFetchCount();
+ }
+
+ public static int getActiveThreadCount() {
+ return requestSet.size();
+ }
+
+ public static Integer getCurrentRequestHash() {
+ return currentRequestHash.get();
+ }
+
+ /**
+ * If every time call Thread's CPU time it affect to TPS and CPU usage. It
+ * is one of bottle neck.
+ *
+ * @return
+ */
+ public static long[] getThreadTime() {
+ long result[] = new long[2];
+
+ // ThreadMXBean bean = ManagementFactory.getThreadMXBean();
+ //
+ // System.out.println(Thread.currentThread().getName() + " CPU:" +
+ // bean.getCurrentThreadCpuTime() + " User:" +
+ // bean.getCurrentThreadUserTime());
+ //
+ // result[0] = bean.getCurrentThreadCpuTime();
+ // result[1] = bean.getCurrentThreadUserTime();
+
+ return result;
+ }
+}
diff --git a/src/main/java/com/profiler/trace/RequestTransactionTracer.java b/src/main/java/com/profiler/trace/RequestTransactionTracer.java
deleted file mode 100644
index cc6e7510d..000000000
--- a/src/main/java/com/profiler/trace/RequestTransactionTracer.java
+++ /dev/null
@@ -1,120 +0,0 @@
-package com.profiler.trace;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-import com.profiler.config.TomcatProfilerConstant;
-import com.profiler.dto.AgentInfoDTO;
-import com.profiler.dto.RequestDataListThriftDTO;
-import com.profiler.dto.RequestThriftDTO;
-import com.profiler.sender.RequestDataSender;
-import com.profiler.sender.RequestTransactionDataSender;
-
-public class RequestTransactionTracer extends AbstractTracer {
- // private static Hashtable requestTable=new Hashtable();
- private static Set requestSet = null;
-
- static {
-
- requestSet = Collections.synchronizedSet(new HashSet());
- }
-
- public RequestTransactionTracer() {
- }
-
- private static final ThreadLocal requestID = new ThreadLocal();
- private static final ThreadLocal requestHashCode = new ThreadLocal();
-
- public static Integer getRequestHashCode() {
- return requestHashCode.get();
- }
-
- public static void startTransaction(String requestURL, String clientIP, long requestTime, StringBuilder params) {
-// printStackTrace();
-// long cpuUserTime[]=getThreadTime();
- long cpuUserTime[] = new long[2];
-
- String currentThreadName = Thread.currentThread().getName();
- //### set Thread id with thread local
- String tempRequestID = currentThreadName + "_" + System.nanoTime();
- requestID.set(tempRequestID);
- int tempRequestHashCode = tempRequestID.hashCode();
- requestHashCode.set(tempRequestHashCode);
- RequestThriftDTO dto = new RequestThriftDTO(AgentInfoDTO.staticHostHashCode, tempRequestHashCode, TomcatProfilerConstant.DATA_TYPE_REQUEST, requestTime, cpuUserTime[0], cpuUserTime[1]);
- dto.setClientIP(clientIP);
- dto.setRequestURL(requestURL);
- int paramsLength = params.length();
- if (paramsLength > 0) {
- params.deleteCharAt(paramsLength - 1);
- dto.setExtraData1(params.toString());
- }
- requestSet.add(requestID.get());
- RequestTransactionDataSender sender = new RequestTransactionDataSender(dto);
- sender.send();
- }
-
- /**
- * Transaction is successfully ended.
- */
- public static void endTransaction() {
-// long cpuUserTime[]=getThreadTime();
- long cpuUserTime[] = new long[2];
- RequestThriftDTO dto = new RequestThriftDTO(AgentInfoDTO.staticHostHashCode, requestHashCode.get(), TomcatProfilerConstant.DATA_TYPE_RESPONSE, System.currentTimeMillis(), cpuUserTime[0], cpuUserTime[1]);
-
- finishTransaction(dto);
- }
-
- /**
- * There was an Exception processing transaction.
- *
- * @param throwable
- */
- public static void exceptionTransaction(Throwable throwable) {
-// long cpuUserTime[]=getThreadTime();
- long cpuUserTime[] = new long[2];
- RequestThriftDTO dto = new RequestThriftDTO(AgentInfoDTO.staticHostHashCode, requestHashCode.get(), TomcatProfilerConstant.DATA_TYPE_UNCAUGHT_EXCEPTION, System.currentTimeMillis(), cpuUserTime[0], cpuUserTime[1]);
- dto.setExtraData1(throwable.getMessage());
- StackTraceElement[] tempElement = throwable.getStackTrace();
- dto.setExtraData2(tempElement[0].toString());
-
- finishTransaction(dto);
- }
-
- /**
- * Transaction is ended and send request end data
- *
- * @param dto
- */
- public static void finishTransaction(RequestThriftDTO dto) {
- RequestDataListThriftDTO dataListDto = RequestDataTracer.getRequestDataList();
- if (dataListDto != null) {
- RequestDataSender dSender = new RequestDataSender(dataListDto);
- dSender.send();
- }
- RequestTransactionDataSender tSender = new RequestTransactionDataSender(dto);
- tSender.send();
-
- requestSet.remove(requestID.get());
- RequestDataTracer.removeRequestDataList();
-
- RequestDataTracer.removeFetchCount();
- }
-
- public static int getActiveThreadCount() {
- return requestSet.size();
- }
- /* If every time call Thread's CPU time
- * it affect to TPS and CPU usage.
- * It is one of bottle neck.
- public static long[] getThreadTime() {
- long result[]=new long[2];
-
- ThreadMXBean bean=ManagementFactory.getThreadMXBean();
- // System.out.println(Thread.currentThread().getName()+" CPU:"+bean.getCurrentThreadCpuTime()+" User:"+bean.getCurrentThreadUserTime());
- result[0]=bean.getCurrentThreadCpuTime();
- result[1]=bean.getCurrentThreadUserTime();
- return result;
- }
- */
-}