From e3052bcb356b4e03611eaa87262f3b9f8a7b7b09 Mon Sep 17 00:00:00 2001 From: Woonduk Kang Date: Thu, 27 Sep 2012 07:40:01 +0000 Subject: [PATCH] =?UTF-8?q?[=EA=B0=95=EC=9A=B4=EB=8D=95]=20[LUCYSUS-1744]?= =?UTF-8?q?=20agent=EC=9D=98=20config=20=ED=8C=8C=EC=9D=BC=20=EC=88=98?= =?UTF-8?q?=EC=A0=95.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://svn.bds.nhncorp.com/pe/hippo-tomcat-profiler/trunk@718 84d0f5b1-2673-498c-a247-62c4ff18d310 --- manifest.txt | 2 - src/main/java/com/profiler/SystemMonitor.java | 10 +- .../java/com/profiler/TomcatProfiler.java | 50 +++-- .../com/profiler/config/ProfilerConfig.java | 175 +++++++++++++++ ...lerConstant.java => ProfilerConstant.java} | 2 +- .../profiler/config/TomcatProfilerConfig.java | 153 -------------- .../modifier/DefaultModifierRegistry.java | 200 ++++++++++-------- .../CubridPreparedStatementModifier.java | 11 +- .../db/cubrid/CubridStatementModifier.java | 15 +- .../db/dbcp/DBCPBasicDataSourceModifier.java | 9 +- .../modifier/db/dbcp/DBCPPoolModifier.java | 9 +- .../db/mssql/MSSQLConnectionModifier.java | 11 +- .../mssql/MSSQLPreparedStatementModifier.java | 11 +- .../db/mssql/MSSQLStatementModifier.java | 11 +- .../mysql/MySQLPreparedStatementModifier.java | 27 ++- .../OraclePreparedStatementModifier.java | 12 +- .../db/oracle/OracleStatementModifier.java | 11 +- .../StandardHostValveInvokeInterceptor.java | 20 +- .../profiler/receiver/TCPSocketManager.java | 6 +- .../com/profiler/sender/AgentInfoSender.java | 20 +- .../java/com/profiler/sender/DataSender.java | 19 +- .../profiler/trace/DatabaseRequestTracer.java | 29 ++- .../com/profiler/trace/RequestTracer.java | 16 +- src/test/resources/hippo.config | 24 +++ 24 files changed, 450 insertions(+), 403 deletions(-) delete mode 100644 manifest.txt create mode 100644 src/main/java/com/profiler/config/ProfilerConfig.java rename src/main/java/com/profiler/config/{TomcatProfilerConstant.java => ProfilerConstant.java} (98%) delete mode 100644 src/main/java/com/profiler/config/TomcatProfilerConfig.java create mode 100644 src/test/resources/hippo.config diff --git a/manifest.txt b/manifest.txt deleted file mode 100644 index c54710588..000000000 --- a/manifest.txt +++ /dev/null @@ -1,2 +0,0 @@ -Premain-Class: com.profiler.TomcatProfiler -Premain-Class: com.profiler.TomcatTracer \ No newline at end of file diff --git a/src/main/java/com/profiler/SystemMonitor.java b/src/main/java/com/profiler/SystemMonitor.java index 195a85d7b..414f94511 100644 --- a/src/main/java/com/profiler/SystemMonitor.java +++ b/src/main/java/com/profiler/SystemMonitor.java @@ -1,6 +1,9 @@ package com.profiler; -import static com.profiler.config.TomcatProfilerConfig.JVM_STAT_GAP; +import com.profiler.common.dto.thrift.JVMInfoThriftDTO; +import com.profiler.context.TraceContext; +import com.profiler.sender.DataSender; +import com.sun.management.OperatingSystemMXBean; import java.io.IOException; import java.lang.management.GarbageCollectorMXBean; @@ -15,10 +18,7 @@ import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; -import com.profiler.common.dto.thrift.JVMInfoThriftDTO; -import com.profiler.context.TraceContext; -import com.profiler.sender.DataSender; -import com.sun.management.OperatingSystemMXBean; +import static com.profiler.config.ProfilerConfig.JVM_STAT_GAP; /** * System monitor diff --git a/src/main/java/com/profiler/TomcatProfiler.java b/src/main/java/com/profiler/TomcatProfiler.java index 1691e37bd..7e2b6fdab 100644 --- a/src/main/java/com/profiler/TomcatProfiler.java +++ b/src/main/java/com/profiler/TomcatProfiler.java @@ -1,5 +1,12 @@ package com.profiler; +import com.profiler.config.ProfilerConfig; +import com.profiler.interceptor.bci.ByteCodeInstrumentor; +import com.profiler.interceptor.bci.JavaAssistByteCodeInstrumentor; +import com.profiler.modifier.DefaultModifierRegistry; +import com.profiler.modifier.Modifier; +import com.profiler.modifier.ModifierRegistry; + import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.IllegalClassFormatException; import java.lang.instrument.Instrumentation; @@ -7,14 +14,6 @@ import java.security.ProtectionDomain; import java.util.logging.Level; import java.util.logging.Logger; -import com.profiler.interceptor.bci.ByteCodeInstrumentor; -import com.profiler.interceptor.bci.JavaAssistByteCodeInstrumentor; -import com.profiler.modifier.DefaultModifierRegistry; -import com.profiler.modifier.Modifier; -import com.profiler.modifier.ModifierRegistry; - -import com.profiler.config.TomcatProfilerConfig; - public class TomcatProfiler implements ClassFileTransformer { private static final Logger logger = Logger.getLogger(TomcatProfiler.class.getName()); @@ -24,21 +23,26 @@ public class TomcatProfiler implements ClassFileTransformer { private ByteCodeInstrumentor byteCodeInstrumentor; private final ModifierRegistry modifierRepository; - private TomcatProfilerConfig tomcatProfilerConfig; + private ProfilerConfig profilerConfig; public static void premain(String agentArgs, Instrumentation inst) { - TomcatProfilerConfig tomcatProfilerConfig = TomcatProfilerConfig.readConfigFile(); - new TomcatProfiler(agentArgs, inst, tomcatProfilerConfig); + try { + ProfilerConfig profilerConfig = new ProfilerConfig(); + profilerConfig.readConfigFile(); + new TomcatProfiler(agentArgs, inst, profilerConfig); + } catch (Exception e) { + logger.log(Level.SEVERE, "Profiler Agent start fail. Cause:" + e.getMessage(), e); + } } - public TomcatProfiler(String agentArgs, Instrumentation inst, TomcatProfilerConfig tomcatProfilerConfig) { + public TomcatProfiler(String agentArgs, Instrumentation inst, ProfilerConfig profilerConfig) { this.agentArgString = agentArgs; - this.instrumentation = inst; - this.instrumentation.addTransformer(this); + this.profilerConfig = profilerConfig; + this.instrumentation = inst; + this.instrumentation.addTransformer(this); String[] paths = getTomcatlibPath(); - this.byteCodeInstrumentor = new JavaAssistByteCodeInstrumentor(paths); - this.modifierRepository = createModifierRegistry(byteCodeInstrumentor, tomcatProfilerConfig); - this.tomcatProfilerConfig = tomcatProfilerConfig; + this.byteCodeInstrumentor = new JavaAssistByteCodeInstrumentor(paths); + this.modifierRepository = createModifierRegistry(byteCodeInstrumentor); } @@ -53,12 +57,14 @@ public class TomcatProfiler implements ClassFileTransformer { return new String[] {catalinaHome + "/lib/servlet-api.jar", catalinaHome + "/lib/catalina.jar"}; } - private ModifierRegistry createModifierRegistry(ByteCodeInstrumentor byteCodeInstrumentor, TomcatProfilerConfig tomcatProfilerConfig) { - DefaultModifierRegistry modifierRepository = new DefaultModifierRegistry(byteCodeInstrumentor); + private ModifierRegistry createModifierRegistry(ByteCodeInstrumentor byteCodeInstrumentor) { + DefaultModifierRegistry modifierRepository = new DefaultModifierRegistry(byteCodeInstrumentor, profilerConfig); + modifierRepository.addTomcatModifier(); - if (tomcatProfilerConfig.enableJdbcProfile()) { - modifierRepository.addJdbcModifier(); - } + + // jdbc + modifierRepository.addJdbcModifier(); + // rpc modifierRepository.addConnectorModifier(); return modifierRepository; } diff --git a/src/main/java/com/profiler/config/ProfilerConfig.java b/src/main/java/com/profiler/config/ProfilerConfig.java new file mode 100644 index 000000000..26b013d4d --- /dev/null +++ b/src/main/java/com/profiler/config/ProfilerConfig.java @@ -0,0 +1,175 @@ +package com.profiler.config; + +import com.profiler.common.util.PropertyUtils; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Properties; +import java.util.logging.Level; +import java.util.logging.Logger; + + +public class ProfilerConfig { + + + private static final Logger logger = Logger.getLogger(ProfilerConfig.class.getName()); + + public static String SERVER_IP = "127.0.0.1"; + public static int SERVER_UDP_PORT = 9995; + + @Deprecated + public static int AGENT_TCP_LISTEN_PORT = 9990; + @Deprecated + public static int SERVER_TCP_LISTEN_PORT = 9991; + + + public static long JVM_STAT_GAP = 5000L; + public static long SERVER_CONNECT_RETRY_GAP = 1000L; + + /** + * 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. + */ + @Deprecated + public static boolean QUERY_COUNT_OVER_10000 = false; + + private boolean jdbcProfile = false; + private boolean jdbcProfileMySql = false; + private boolean jdbcProfileMsSql = false; + private boolean jdbcProfileOracle = false; + private boolean jdbcProfileCubrid = false; + private boolean jdbcProfileDbcp = false; + + + public ProfilerConfig() { + } + + public void readConfigFile() throws IOException{ + String hippoConfigFileName = System.getProperty("hippo.config"); + if (hippoConfigFileName == null) { + logger.info("hippo.config property is not set. Using default property file(\"hippo.config\")"); + hippoConfigFileName = "hippo.config"; + } + + try { + Properties properties = PropertyUtils.readProperties(hippoConfigFileName); + readPropertyValues(properties); + } catch (FileNotFoundException fe) { + if (logger.isLoggable(Level.WARNING)) { + logger.log(Level.WARNING, hippoConfigFileName + " file is not exists. Please check configuration. Cause:" + fe.getMessage(), fe); + } + throw fe; + } catch (IOException e) { + if (logger.isLoggable(Level.WARNING)) { + logger.log(Level.WARNING, hippoConfigFileName + " file read error. Cause:" + e.getMessage(), e); + } + throw e; + } + } + + public boolean isJdbcProfile() { + return jdbcProfile; + } + + public boolean isJdbcProfileMySql() { + return jdbcProfileMySql; + } + + public boolean isJdbcProfileMsSql() { + return jdbcProfileMsSql; + } + + public boolean isJdbcProfileOracle() { + return jdbcProfileOracle; + } + + public boolean isJdbcProfileCubrid() { + return jdbcProfileCubrid; + } + + private void readPropertyValues(Properties prop) { + // TODO : use Properties defaultvalue instead of using temp variable. + + + this.SERVER_IP = readString(prop, "SERVER_IP", "127.0.0.1"); + this.SERVER_UDP_PORT = readInt(prop, "SERVER_UDP_PORT", 9995); + + Object temp = null; + if ((temp = prop.get("AGENT_TCP_LISTEN_PORT")) != null) { + this.AGENT_TCP_LISTEN_PORT = Integer.parseInt(temp.toString()); + if (logger.isLoggable(Level.INFO)) { + logger.info("AGENT_TCP_LISTEN_PORT=" + AGENT_TCP_LISTEN_PORT); + } + } + if ((temp = prop.get("SERVER_TCP_LISTEN_PORT")) != null) { + this.SERVER_TCP_LISTEN_PORT = Integer.parseInt(temp.toString()); + if (logger.isLoggable(Level.INFO)) { + logger.info("SERVER_TCP_LISTEN_PORT=" + SERVER_TCP_LISTEN_PORT); + } + } + if ((temp = prop.get("JVM_STAT_GAP")) != null) { + this.JVM_STAT_GAP = Long.parseLong(temp.toString()); + if (logger.isLoggable(Level.INFO)) { + logger.info("JVM_STAT_GAP=" + JVM_STAT_GAP); + } + } + if ((temp = prop.get("SERVER_CONNECT_RETRY_GAP")) != null) { + this.SERVER_CONNECT_RETRY_GAP = Long.parseLong(temp.toString()); + if (logger.isLoggable(Level.INFO)) { + logger.info("SERVER_CONNECT_RETRY_GAP=" + SERVER_CONNECT_RETRY_GAP); + } + } +// if ((temp = prop.get("QUERY_COUNT_OVER_10000")) != null) { +// this.QUERY_COUNT_OVER_10000 = Boolean.parseBoolean(temp.toString()); +// if (logger.isLoggable(Level.INFO)) { +// logger.info("QUERY_COUNT_OVER_10000=" + QUERY_COUNT_OVER_10000); +// } +// } + + this.jdbcProfile = readBoolean(prop, "JDBC_PROFILE", true); + this.jdbcProfileMySql = readBoolean(prop, "JDBC_PROFILE_MYSQL", true); + this.jdbcProfileMsSql = readBoolean(prop, "JDBC_PROFILE_MSSQL", true); + this.jdbcProfileOracle = readBoolean(prop, "JDBC_PROFILE_ORACLE", true); + this.jdbcProfileCubrid = readBoolean(prop, "JDBC_PROFILE_CUBRID", true); + this.jdbcProfileCubrid = readBoolean(prop, "JDBC_PROFILE_DBCP", true); + + + logger.info("configuration loaded successfully."); + } + + private String readString(Properties prop, String propertyName, String defaultValue) { + String value = prop.getProperty(propertyName, defaultValue); + if (logger.isLoggable(Level.INFO)) { + logger.info(propertyName + "=" + value); + } + return value; + } + + private int readInt(Properties prop, String propertyName, int defaultValue) { + String value = prop.getProperty(propertyName); + int result; + try { + result = Integer.parseInt(value); + } catch (NumberFormatException e) { + result = defaultValue; + } + if (logger.isLoggable(Level.INFO)) { + logger.info(propertyName + "=" + result); + } + return result; + } + + private boolean readBoolean(Properties prop, String propertyName, boolean defaultValue) { + String value = prop.getProperty(propertyName, Boolean.toString(defaultValue)); + boolean result = Boolean.parseBoolean(value); + if (logger.isLoggable(Level.INFO)) { + logger.info(propertyName + "=" + result); + } + return result; + } + + public boolean isJdbcProfileDbcp() { + return jdbcProfileDbcp; + } +} diff --git a/src/main/java/com/profiler/config/TomcatProfilerConstant.java b/src/main/java/com/profiler/config/ProfilerConstant.java similarity index 98% rename from src/main/java/com/profiler/config/TomcatProfilerConstant.java rename to src/main/java/com/profiler/config/ProfilerConstant.java index 7d5c83c17..1f2f4c495 100644 --- a/src/main/java/com/profiler/config/TomcatProfilerConstant.java +++ b/src/main/java/com/profiler/config/ProfilerConstant.java @@ -3,7 +3,7 @@ package com.profiler.config; import java.text.DateFormat; import java.text.SimpleDateFormat; -public class TomcatProfilerConstant { +public class ProfilerConstant { public final static DateFormat DATE_FORMAT_YMD_HMS = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss"); public final static DateFormat DATE_FORMAT_HMS_MS = new SimpleDateFormat("HH:mm:ss,SSS"); public static final long DATA_FETCH_INTERVAL = 2000; diff --git a/src/main/java/com/profiler/config/TomcatProfilerConfig.java b/src/main/java/com/profiler/config/TomcatProfilerConfig.java deleted file mode 100644 index ec286ce85..000000000 --- a/src/main/java/com/profiler/config/TomcatProfilerConfig.java +++ /dev/null @@ -1,153 +0,0 @@ -package com.profiler.config; - -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.util.Properties; -import java.util.logging.Level; -import java.util.logging.Logger; - - -public class TomcatProfilerConfig { - - - private static final Logger logger = Logger.getLogger(TomcatProfilerConfig.class.getName()); - - public static String SERVER_IP = "127.0.0.1"; - - // TODO 앞으로 공통으로 사용할 port가 필요함. 근데 tcp, udp 혼용사용하면 따로 port를 열어야 되는거 아닌지. - // 일단 9995로 하자. - public static int DEFUALT_PORT = 9995; - 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; - - /** - * 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; - - private boolean JDBC_PROFILE = true; - - public static TomcatProfilerConfig readConfigFile() { - TomcatProfilerConfig config = new TomcatProfilerConfig(); - - String hippoConfigFileName = System.getProperty("hippo.config"); - if (hippoConfigFileName == null) { - logger.info("hippo.config property is not set. Using default values"); - return config; - } - - try { - Properties properties = readProperties(hippoConfigFileName); - setPropertyValues(config, properties); - return config; - } catch (FileNotFoundException fnfe) { - if (logger.isLoggable(Level.WARNING)) { - logger.warning(hippoConfigFileName + " file is not exists. Please check configuration."); - } - } catch (IOException e) { - if (logger.isLoggable(Level.WARNING)) { - logger.warning(e.getMessage()); - } - } - return config; - } - - private static Properties readProperties(String propertyName) throws FileNotFoundException, IOException { - FileReader reader = null; - try { - Properties prop = new Properties(); - reader = new FileReader(propertyName); - prop.load(reader); - return prop; - } finally { - if (reader != null) { - try { - reader.close(); - } catch (IOException e) { - } - } - } - } - - public boolean enableJdbcProfile() { - return JDBC_PROFILE; - } - - private static void setPropertyValues(TomcatProfilerConfig config, Properties prop) { - // TODO : use Properties defaultvalue instead of using temp variable. - - Object temp = null; - - if ((temp = prop.get("SERVER_IP")) != null) { - config.SERVER_IP = temp.toString(); - if (logger.isLoggable(Level.INFO)) { - logger.info("SERVER_IP=" + SERVER_IP); - } - } - if ((temp = prop.get("AGENT_TCP_LISTEN_PORT")) != null) { - config.AGENT_TCP_LISTEN_PORT = Integer.parseInt(temp.toString()); - if (logger.isLoggable(Level.INFO)) { - logger.info("AGENT_TCP_LISTEN_PORT=" + AGENT_TCP_LISTEN_PORT); - } - } - if ((temp = prop.get("SERVER_TCP_LISTEN_PORT")) != null) { - config.SERVER_TCP_LISTEN_PORT = Integer.parseInt(temp.toString()); - if (logger.isLoggable(Level.INFO)) { - logger.info("SERVER_TCP_LISTEN_PORT=" + SERVER_TCP_LISTEN_PORT); - } - } - if ((temp = prop.get("REQUEST_TRANSACTION_DATA_LISTEN_PORT")) != null) { - config.REQUEST_TRANSACTION_DATA_LISTEN_PORT = Integer.parseInt(temp.toString()); - if (logger.isLoggable(Level.INFO)) { - logger.info("REQUEST_TRANSACTION_DATA_LISTEN_PORT=" + REQUEST_TRANSACTION_DATA_LISTEN_PORT); - } - } - if ((temp = prop.get("REQUEST_DATA_LISTEN_PORT")) != null) { - config.REQUEST_DATA_LISTEN_PORT = Integer.parseInt(temp.toString()); - if (logger.isLoggable(Level.INFO)) { - logger.info("REQUEST_DATA_LISTEN_PORT=" + REQUEST_DATA_LISTEN_PORT); - } - } - if ((temp = prop.get("JVM_DATA_LISTEN_PORT")) != null) { - config.JVM_DATA_LISTEN_PORT = Integer.parseInt(temp.toString()); - if (logger.isLoggable(Level.INFO)) { - logger.info("JVM_DATA_LISTEN_PORT=" + JVM_DATA_LISTEN_PORT); - } - } - if ((temp = prop.get("JVM_STAT_GAP")) != null) { - config.JVM_STAT_GAP = Long.parseLong(temp.toString()); - if (logger.isLoggable(Level.INFO)) { - logger.info("JVM_STAT_GAP=" + JVM_STAT_GAP); - } - } - if ((temp = prop.get("SERVER_CONNECT_RETRY_GAP")) != null) { - config.SERVER_CONNECT_RETRY_GAP = Long.parseLong(temp.toString()); - if (logger.isLoggable(Level.INFO)) { - logger.info("SERVER_CONNECT_RETRY_GAP=" + SERVER_CONNECT_RETRY_GAP); - } - } - if ((temp = prop.get("QUERY_COUNT_OVER_10000")) != null) { - config.QUERY_COUNT_OVER_10000 = Boolean.parseBoolean(temp.toString()); - if (logger.isLoggable(Level.INFO)) { - logger.info("QUERY_COUNT_OVER_10000=" + QUERY_COUNT_OVER_10000); - } - } - if ((temp = prop.get("JDBC_PROFILE")) != null) { - config.JDBC_PROFILE = Boolean.parseBoolean(temp.toString()); - if (logger.isLoggable(Level.INFO)) { - logger.info("JDBC_PROFILE=" + config.JDBC_PROFILE); - } - } - - logger.info("configuration loaded successfully."); - } -} diff --git a/src/main/java/com/profiler/modifier/DefaultModifierRegistry.java b/src/main/java/com/profiler/modifier/DefaultModifierRegistry.java index 8b177cd2a..7930ad27e 100644 --- a/src/main/java/com/profiler/modifier/DefaultModifierRegistry.java +++ b/src/main/java/com/profiler/modifier/DefaultModifierRegistry.java @@ -1,8 +1,6 @@ package com.profiler.modifier; -import java.util.HashMap; -import java.util.Map; - +import com.profiler.config.ProfilerConfig; import com.profiler.interceptor.bci.ByteCodeInstrumentor; import com.profiler.modifier.arcus.ArcusClientModifier; import com.profiler.modifier.connector.HTTPClientModifier; @@ -25,135 +23,153 @@ import com.profiler.modifier.tomcat.StandardHostValveInvokeInterceptor; import com.profiler.modifier.tomcat.TomcatConnectorModifier; import com.profiler.modifier.tomcat.TomcatStandardServiceModifier; +import java.util.HashMap; +import java.util.Map; + public class DefaultModifierRegistry implements ModifierRegistry { - // TODO 혹시 동시성을 고려 해야 되는지 검토. + // TODO 혹시 동시성을 고려 해야 되는지 검토. // 왠간해서는 동시성 상황이 안나올것으로 보임. - private Map registry = new HashMap(); + private Map registry = new HashMap(); - private final ByteCodeInstrumentor byteCodeInstrumentor; + private final ByteCodeInstrumentor byteCodeInstrumentor; + private final ProfilerConfig profilerConfig; - public DefaultModifierRegistry(ByteCodeInstrumentor byteCodeInstrumentor) { - this.byteCodeInstrumentor = byteCodeInstrumentor; - } + public DefaultModifierRegistry(ByteCodeInstrumentor byteCodeInstrumentor, ProfilerConfig profilerConfig) { + this.byteCodeInstrumentor = byteCodeInstrumentor; + this.profilerConfig = profilerConfig; + } - @Override - public Modifier findModifier(String className) { - return registry.get(className); - } + @Override + public Modifier findModifier(String className) { + return registry.get(className); + } - private void addModifier(Modifier modifier) { - Modifier old = registry.put(modifier.getTargetClass(), modifier); - if (old != null) { - throw new IllegalStateException("Modifier already exist new:" + modifier.getClass() + " old:" + old.getTargetClass()); - } - } + private void addModifier(Modifier modifier) { + Modifier old = registry.put(modifier.getTargetClass(), modifier); + if (old != null) { + throw new IllegalStateException("Modifier already exist new:" + modifier.getClass() + " old:" + old.getTargetClass()); + } + } - public void addConnectorModifier() { - HTTPClientModifier httpClientModifier = new HTTPClientModifier(byteCodeInstrumentor); - addModifier(httpClientModifier); + public void addConnectorModifier() { + HTTPClientModifier httpClientModifier = new HTTPClientModifier(byteCodeInstrumentor); + addModifier(httpClientModifier); - ArcusClientModifier arcusClientModifier = new ArcusClientModifier(byteCodeInstrumentor); - addModifier(arcusClientModifier); - } + ArcusClientModifier arcusClientModifier = new ArcusClientModifier(byteCodeInstrumentor); + addModifier(arcusClientModifier); + } - public void addTomcatModifier() { + public void addTomcatModifier() { StandardHostValveInvokeInterceptor standardHostValveInvokeInterceptor = new StandardHostValveInvokeInterceptor(byteCodeInstrumentor); - addModifier(standardHostValveInvokeInterceptor); + addModifier(standardHostValveInvokeInterceptor); - Modifier tomcatStandardServiceModifier = new TomcatStandardServiceModifier(byteCodeInstrumentor); - addModifier(tomcatStandardServiceModifier); + Modifier tomcatStandardServiceModifier = new TomcatStandardServiceModifier(byteCodeInstrumentor); + addModifier(tomcatStandardServiceModifier); - Modifier tomcatConnectorModifier = new TomcatConnectorModifier(byteCodeInstrumentor); - addModifier(tomcatConnectorModifier); + Modifier tomcatConnectorModifier = new TomcatConnectorModifier(byteCodeInstrumentor); + addModifier(tomcatConnectorModifier); - Modifier tomcatCatalinaModifier = new CatalinaModifier(byteCodeInstrumentor); - addModifier(tomcatCatalinaModifier); - } + Modifier tomcatCatalinaModifier = new CatalinaModifier(byteCodeInstrumentor); + addModifier(tomcatCatalinaModifier); + } - public void addJdbcModifier() { - // TODO 드라이버 존재 체크 로직을 앞단으로 이동 시킬수 없는지 검토 - addMySqlDriver(); + public void addJdbcModifier() { + // TODO 드라이버 존재 체크 로직을 앞단으로 이동 시킬수 없는지 검토 + if (!profilerConfig.isJdbcProfile()) { + return; + } - addMsSqlDriver(); + if (profilerConfig.isJdbcProfileMySql()) { + addMySqlDriver(); + } - addOracleDriver(); + if (profilerConfig.isJdbcProfileMsSql()) { + addMsSqlDriver(); + } - addCubridDriver(); + if (profilerConfig.isJdbcProfileOracle()) { + addOracleDriver(); + } + if(profilerConfig.isJdbcProfileCubrid()) { + addCubridDriver(); + } - addDbcpDriver(); - } + if(profilerConfig.isJdbcProfileDbcp()) { + addDbcpDriver(); + } + } - private void addMySqlDriver() { - // TODO MySqlDriver는 버전별로 Connection이 interface인지 class인지가 다름. 문제 없는지 - // 확인필요. - Modifier mysqlConnectionImplModifier = new MySQLConnectionImplModifier(byteCodeInstrumentor); - addModifier(mysqlConnectionImplModifier); + private void addMySqlDriver() { + // TODO MySqlDriver는 버전별로 Connection이 interface인지 class인지가 다름. 문제 없는지 + // 확인필요. + Modifier mysqlConnectionImplModifier = new MySQLConnectionImplModifier(byteCodeInstrumentor); + addModifier(mysqlConnectionImplModifier); - Modifier mysqlStatementModifier = new MySQLStatementModifier(byteCodeInstrumentor); - addModifier(mysqlStatementModifier); + Modifier mysqlStatementModifier = new MySQLStatementModifier(byteCodeInstrumentor); + addModifier(mysqlStatementModifier); - Modifier mysqlPreparedStatementModifier = new MySQLPreparedStatementModifier(byteCodeInstrumentor); - addModifier(mysqlPreparedStatementModifier); + Modifier mysqlPreparedStatementModifier = new MySQLPreparedStatementModifier(byteCodeInstrumentor); + addModifier(mysqlPreparedStatementModifier); MySQLPreparedStatementJDBC4Modifier myqlPreparedStatementJDBC4Modifier = new MySQLPreparedStatementJDBC4Modifier(byteCodeInstrumentor); - addModifier(myqlPreparedStatementJDBC4Modifier); + addModifier(myqlPreparedStatementJDBC4Modifier); - Modifier mysqlResultSetModifier = new MySQLResultSetModifier(byteCodeInstrumentor); - addModifier(mysqlResultSetModifier); - } + Modifier mysqlResultSetModifier = new MySQLResultSetModifier(byteCodeInstrumentor); + addModifier(mysqlResultSetModifier); + } - private void addMsSqlDriver() { + private void addMsSqlDriver() { - Modifier mssqlConnectionModifier = new MSSQLConnectionModifier(byteCodeInstrumentor); - addModifier(mssqlConnectionModifier); + Modifier mssqlConnectionModifier = new MSSQLConnectionModifier(byteCodeInstrumentor); + addModifier(mssqlConnectionModifier); - Modifier mssqlStatementModifier = new MSSQLStatementModifier(byteCodeInstrumentor); - addModifier(mssqlStatementModifier); + Modifier mssqlStatementModifier = new MSSQLStatementModifier(byteCodeInstrumentor); + addModifier(mssqlStatementModifier); - Modifier mssqlPreparedStatementModifier = new MSSQLPreparedStatementModifier(byteCodeInstrumentor); - addModifier(mssqlPreparedStatementModifier); + Modifier mssqlPreparedStatementModifier = new MSSQLPreparedStatementModifier(byteCodeInstrumentor); + addModifier(mssqlPreparedStatementModifier); - Modifier mssqlResultSetModifier = new MSSQLResultSetModifier(byteCodeInstrumentor); - addModifier(mssqlResultSetModifier); + Modifier mssqlResultSetModifier = new MSSQLResultSetModifier(byteCodeInstrumentor); + addModifier(mssqlResultSetModifier); - } + } - private void addOracleDriver() { + private void addOracleDriver() { - // TODO oracle의 경우 connection에 대한 impl이 없음. 확인필요. - Modifier oraclePreparedStatementModifier = new OraclePreparedStatementModifier(byteCodeInstrumentor); - addModifier(oraclePreparedStatementModifier); + // TODO oracle의 경우 connection에 대한 impl이 없음. 확인필요. + Modifier oraclePreparedStatementModifier = new OraclePreparedStatementModifier(byteCodeInstrumentor); + addModifier(oraclePreparedStatementModifier); - Modifier oracleStatement = new OracleStatementModifier(byteCodeInstrumentor); - addModifier(oracleStatement); + Modifier oracleStatement = new OracleStatementModifier(byteCodeInstrumentor); + addModifier(oracleStatement); - Modifier oracleResultSetModifier = new OracleResultSetModifier(byteCodeInstrumentor); - addModifier(oracleResultSetModifier); - } + Modifier oracleResultSetModifier = new OracleResultSetModifier(byteCodeInstrumentor); + addModifier(oracleResultSetModifier); + } - private void addCubridDriver() { + private void addCubridDriver() { - // TODO cubrid의 경우도 connection에 대한 impl이 없음. 확인필요. - Modifier cubridStatementModifier = new CubridStatementModifier(byteCodeInstrumentor); - addModifier(cubridStatementModifier); + // TODO cubrid의 경우도 connection에 대한 impl이 없음. 확인필요. + Modifier cubridStatementModifier = new CubridStatementModifier(byteCodeInstrumentor); + addModifier(cubridStatementModifier); - Modifier cubridPreparedStatementModifier = new CubridPreparedStatementModifier(byteCodeInstrumentor); - addModifier(cubridPreparedStatementModifier); + Modifier cubridPreparedStatementModifier = new CubridPreparedStatementModifier(byteCodeInstrumentor); + addModifier(cubridPreparedStatementModifier); - Modifier cubridResultSetModifier = new CubridResultSetModifier(byteCodeInstrumentor); - addModifier(cubridResultSetModifier); + Modifier cubridResultSetModifier = new CubridResultSetModifier(byteCodeInstrumentor); + addModifier(cubridResultSetModifier); - Modifier cubridUStatementModifier = new CubridUStatementModifier(byteCodeInstrumentor); - addModifier(cubridUStatementModifier); - } + Modifier cubridUStatementModifier = new CubridUStatementModifier(byteCodeInstrumentor); + addModifier(cubridUStatementModifier); + } - private void addDbcpDriver() { + private void addDbcpDriver() { - // TODO cubrid의 경우도 connection에 대한 impl이 없음. 확인필요. - Modifier dbcpBasicDataSourceModifier = new DBCPBasicDataSourceModifier(byteCodeInstrumentor); - addModifier(dbcpBasicDataSourceModifier); + // TODO cubrid의 경우도 connection에 대한 impl이 없음. 확인필요. + Modifier dbcpBasicDataSourceModifier = new DBCPBasicDataSourceModifier(byteCodeInstrumentor); + addModifier(dbcpBasicDataSourceModifier); - Modifier dbcpPoolModifier = new DBCPPoolModifier(byteCodeInstrumentor); - addModifier(dbcpPoolModifier); - } + Modifier dbcpPoolModifier = new DBCPPoolModifier(byteCodeInstrumentor); + addModifier(dbcpPoolModifier); + } } 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 f7018d46a..443bab466 100644 --- a/src/main/java/com/profiler/modifier/db/cubrid/CubridPreparedStatementModifier.java +++ b/src/main/java/com/profiler/modifier/db/cubrid/CubridPreparedStatementModifier.java @@ -1,14 +1,13 @@ package com.profiler.modifier.db.cubrid; +import com.profiler.config.ProfilerConstant; import com.profiler.interceptor.bci.ByteCodeInstrumentor; +import com.profiler.modifier.AbstractModifier; +import com.profiler.trace.DatabaseRequestTracer; import javassist.CtClass; import javassist.CtConstructor; import javassist.CtMethod; -import com.profiler.config.TomcatProfilerConstant; -import com.profiler.modifier.AbstractModifier; -import com.profiler.trace.DatabaseRequestTracer; - import java.security.ProtectionDomain; import java.util.logging.Level; import java.util.logging.Logger; @@ -61,7 +60,7 @@ public class CubridPreparedStatementModifier extends AbstractModifier { StringBuilder sb = new StringBuilder(); sb.append("{"); sb.append("if($2 instanceof cubrid.jdbc.jci.UStatement) { "); - sb.append(DatabaseRequestTracer.FQCN + ".putSqlQuery(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_QUERY + ",$2.getQuery());"); + sb.append(DatabaseRequestTracer.FQCN + ".putSqlQuery(" + ProfilerConstant.REQ_DATA_TYPE_DB_QUERY + ",$2.getQuery());"); sb.append("}}"); constructor.insertBefore(sb.toString()); @@ -71,6 +70,6 @@ public class CubridPreparedStatementModifier extends AbstractModifier { private void updateExecuteQueryMethod(CtClass cc) throws Exception { CtMethod serviceMethod = cc.getDeclaredMethod("execute", null); - serviceMethod.insertAfter("{" + DatabaseRequestTracer.FQCN + ".put(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_EXECUTE_QUERY + "); }"); + serviceMethod.insertAfter("{" + DatabaseRequestTracer.FQCN + ".put(" + ProfilerConstant.REQ_DATA_TYPE_DB_EXECUTE_QUERY + "); }"); } } 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 b3e83f1aa..390b80f52 100644 --- a/src/main/java/com/profiler/modifier/db/cubrid/CubridStatementModifier.java +++ b/src/main/java/com/profiler/modifier/db/cubrid/CubridStatementModifier.java @@ -1,14 +1,13 @@ package com.profiler.modifier.db.cubrid; +import com.profiler.config.ProfilerConstant; import com.profiler.interceptor.StaticAroundInterceptor; import com.profiler.interceptor.bci.ByteCodeInstrumentor; import com.profiler.interceptor.bci.InstrumentClass; -import javassist.CtClass; -import javassist.CtMethod; - -import com.profiler.config.TomcatProfilerConstant; import com.profiler.modifier.AbstractModifier; import com.profiler.trace.DatabaseRequestTracer; +import javassist.CtClass; +import javassist.CtMethod; import java.security.ProtectionDomain; import java.util.logging.Level; @@ -39,12 +38,12 @@ public class CubridStatementModifier extends AbstractModifier { StaticAroundInterceptor interceptor = new StaticAroundInterceptor() { @Override public void after(Object target, String className, String methodName, String parameterDescription, Object[] args, Object result) { - DatabaseRequestTracer.putSqlQuery(TomcatProfilerConstant.REQ_DATA_TYPE_DB_QUERY, (String) args[0]); + DatabaseRequestTracer.putSqlQuery(ProfilerConstant.REQ_DATA_TYPE_DB_QUERY, (String) args[0]); } @Override public void before(Object target, String className, String methodName, String parameterDescription, Object[] args) { - DatabaseRequestTracer.put(TomcatProfilerConstant.REQ_DATA_TYPE_DB_EXECUTE_QUERY);; + DatabaseRequestTracer.put(ProfilerConstant.REQ_DATA_TYPE_DB_EXECUTE_QUERY);; } }; @@ -75,8 +74,8 @@ public class CubridStatementModifier extends AbstractModifier { StringBuilder sb = new StringBuilder(); sb.append("{"); - 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(DatabaseRequestTracer.FQCN + ".putSqlQuery(" + ProfilerConstant.REQ_DATA_TYPE_DB_QUERY + ",$1);"); + sb.append(DatabaseRequestTracer.FQCN + ".put(" + ProfilerConstant.REQ_DATA_TYPE_DB_EXECUTE_QUERY + ");"); sb.append("}"); method.insertAfter(sb.toString()); 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 84c67ad8a..867df4905 100644 --- a/src/main/java/com/profiler/modifier/db/dbcp/DBCPBasicDataSourceModifier.java +++ b/src/main/java/com/profiler/modifier/db/dbcp/DBCPBasicDataSourceModifier.java @@ -1,12 +1,11 @@ package com.profiler.modifier.db.dbcp; +import com.profiler.config.ProfilerConstant; import com.profiler.interceptor.bci.ByteCodeInstrumentor; -import javassist.CtClass; -import javassist.CtMethod; - -import com.profiler.config.TomcatProfilerConstant; import com.profiler.modifier.AbstractModifier; import com.profiler.trace.DatabaseRequestTracer; +import javassist.CtClass; +import javassist.CtMethod; import java.security.ProtectionDomain; import java.util.logging.Level; @@ -51,6 +50,6 @@ public class DBCPBasicDataSourceModifier extends AbstractModifier { private void updateGetConnectionMethod(CtClass cc) throws Exception { CtMethod method = cc.getDeclaredMethod("getConnection", null); - method.insertAfter("{" + DatabaseRequestTracer.FQCN + ".putConnection(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_GET_CONNECTION + ",$0.getUrl()); }"); + method.insertAfter("{" + DatabaseRequestTracer.FQCN + ".putConnection(" + ProfilerConstant.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 2a8c272e9..f8dcb378a 100644 --- a/src/main/java/com/profiler/modifier/db/dbcp/DBCPPoolModifier.java +++ b/src/main/java/com/profiler/modifier/db/dbcp/DBCPPoolModifier.java @@ -1,12 +1,11 @@ package com.profiler.modifier.db.dbcp; +import com.profiler.config.ProfilerConstant; import com.profiler.interceptor.bci.ByteCodeInstrumentor; -import javassist.CtClass; -import javassist.CtMethod; - -import com.profiler.config.TomcatProfilerConstant; import com.profiler.modifier.AbstractModifier; import com.profiler.trace.DatabaseRequestTracer; +import javassist.CtClass; +import javassist.CtMethod; import java.security.ProtectionDomain; import java.util.logging.Level; @@ -51,6 +50,6 @@ public class DBCPPoolModifier extends AbstractModifier { private void updateCloseMethod(CtClass cc) throws Exception { CtMethod method = cc.getDeclaredMethod("close", null); - method.insertAfter("{" + DatabaseRequestTracer.FQCN + ".put(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_CLOSE_CONNECTION + "); }"); + method.insertAfter("{" + DatabaseRequestTracer.FQCN + ".put(" + ProfilerConstant.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 0c86b888d..5bd84f36e 100644 --- a/src/main/java/com/profiler/modifier/db/mssql/MSSQLConnectionModifier.java +++ b/src/main/java/com/profiler/modifier/db/mssql/MSSQLConnectionModifier.java @@ -1,12 +1,11 @@ package com.profiler.modifier.db.mssql; +import com.profiler.config.ProfilerConstant; import com.profiler.interceptor.bci.ByteCodeInstrumentor; -import javassist.CtClass; -import javassist.CtMethod; - -import com.profiler.config.TomcatProfilerConstant; import com.profiler.modifier.AbstractModifier; import com.profiler.trace.DatabaseRequestTracer; +import javassist.CtClass; +import javassist.CtMethod; import java.security.ProtectionDomain; import java.util.logging.Level; @@ -56,11 +55,11 @@ public class MSSQLConnectionModifier extends AbstractModifier { params[1] = classPool.getCtClass("int"); CtMethod method = cc.getDeclaredMethod("createStatement", params); - method.insertAfter("{" + DatabaseRequestTracer.FQCN + ".put(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_CREATE_STATEMENT + "); }"); + method.insertAfter("{" + DatabaseRequestTracer.FQCN + ".put(" + ProfilerConstant.REQ_DATA_TYPE_DB_CREATE_STATEMENT + "); }"); } private void updateCloseMethod(CtClass cc) throws Exception { CtMethod method = cc.getDeclaredMethod("close", null); - method.insertAfter("{" + DatabaseRequestTracer.FQCN + ".put(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_CLOSE_CONNECTION + "); }"); + method.insertAfter("{" + DatabaseRequestTracer.FQCN + ".put(" + ProfilerConstant.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 d6f95c68e..5e79835dc 100644 --- a/src/main/java/com/profiler/modifier/db/mssql/MSSQLPreparedStatementModifier.java +++ b/src/main/java/com/profiler/modifier/db/mssql/MSSQLPreparedStatementModifier.java @@ -1,14 +1,13 @@ package com.profiler.modifier.db.mssql; +import com.profiler.config.ProfilerConstant; import com.profiler.interceptor.bci.ByteCodeInstrumentor; +import com.profiler.modifier.AbstractModifier; +import com.profiler.trace.DatabaseRequestTracer; import javassist.CtClass; import javassist.CtConstructor; import javassist.CtMethod; -import com.profiler.config.TomcatProfilerConstant; -import com.profiler.modifier.AbstractModifier; -import com.profiler.trace.DatabaseRequestTracer; - import java.security.ProtectionDomain; import java.util.logging.Level; import java.util.logging.Logger; @@ -69,12 +68,12 @@ public class MSSQLPreparedStatementModifier extends AbstractModifier { if (constructorList.length == 1) { CtConstructor constructor = constructorList[0]; - constructor.insertAfter("{" + DatabaseRequestTracer.FQCN + ".putSqlQuery(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_QUERY + ",$2); }"); + constructor.insertAfter("{" + DatabaseRequestTracer.FQCN + ".putSqlQuery(" + ProfilerConstant.REQ_DATA_TYPE_DB_QUERY + ",$2); }"); } } private void updateExecuteQueryMethod(CtClass cc) throws Exception { CtMethod serviceMethod = cc.getDeclaredMethod("execute", null); - serviceMethod.insertAfter("{" + DatabaseRequestTracer.FQCN + ".put(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_EXECUTE_QUERY + "); }"); + serviceMethod.insertAfter("{" + DatabaseRequestTracer.FQCN + ".put(" + ProfilerConstant.REQ_DATA_TYPE_DB_EXECUTE_QUERY + "); }"); } } 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 6675347a0..f179ccb1b 100644 --- a/src/main/java/com/profiler/modifier/db/mssql/MSSQLStatementModifier.java +++ b/src/main/java/com/profiler/modifier/db/mssql/MSSQLStatementModifier.java @@ -1,12 +1,11 @@ package com.profiler.modifier.db.mssql; +import com.profiler.config.ProfilerConstant; import com.profiler.interceptor.bci.ByteCodeInstrumentor; -import javassist.CtClass; -import javassist.CtMethod; - -import com.profiler.config.TomcatProfilerConstant; import com.profiler.modifier.AbstractModifier; import com.profiler.trace.DatabaseRequestTracer; +import javassist.CtClass; +import javassist.CtMethod; import java.security.ProtectionDomain; import java.util.logging.Level; @@ -55,8 +54,8 @@ public class MSSQLStatementModifier extends AbstractModifier { StringBuilder sb = new StringBuilder(); sb.append("{"); - 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(DatabaseRequestTracer.FQCN + ".putSqlQuery(" + ProfilerConstant.REQ_DATA_TYPE_DB_QUERY + ",$1);"); + sb.append(DatabaseRequestTracer.FQCN + ".put(" + ProfilerConstant.REQ_DATA_TYPE_DB_EXECUTE_QUERY + ");"); sb.append("}"); serviceMethod.insertAfter(sb.toString()); 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 25b1f4e4d..3bfc0d482 100644 --- a/src/main/java/com/profiler/modifier/db/mysql/MySQLPreparedStatementModifier.java +++ b/src/main/java/com/profiler/modifier/db/mysql/MySQLPreparedStatementModifier.java @@ -1,27 +1,26 @@ package com.profiler.modifier.db.mysql; -import java.lang.reflect.Method; -import java.security.ProtectionDomain; -import java.util.*; -import java.util.logging.Level; -import java.util.logging.Logger; - +import com.profiler.config.ProfilerConstant; +import com.profiler.interceptor.Interceptor; +import com.profiler.interceptor.bci.ByteCodeInstrumentor; +import com.profiler.interceptor.bci.InstrumentClass; import com.profiler.interceptor.bci.InstrumentException; import com.profiler.interceptor.bci.NotFoundInstrumentException; -import com.profiler.modifier.db.interceptor.PreparedStatementExecuteQueryInterceptor; +import com.profiler.modifier.AbstractModifier; import com.profiler.modifier.db.interceptor.PreparedStatementBindVariableInterceptor; +import com.profiler.modifier.db.interceptor.PreparedStatementExecuteQueryInterceptor; +import com.profiler.trace.DatabaseRequestTracer; import com.profiler.util.ExcludeBindVariableFilter; import com.profiler.util.JavaAssistUtils; import com.profiler.util.PreparedStatementUtils; import javassist.CtClass; import javassist.CtConstructor; -import com.profiler.config.TomcatProfilerConstant; -import com.profiler.interceptor.Interceptor; -import com.profiler.interceptor.bci.ByteCodeInstrumentor; -import com.profiler.interceptor.bci.InstrumentClass; -import com.profiler.modifier.AbstractModifier; -import com.profiler.trace.DatabaseRequestTracer; +import java.lang.reflect.Method; +import java.security.ProtectionDomain; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; public class MySQLPreparedStatementModifier extends AbstractModifier { private final Logger logger = Logger.getLogger(MySQLPreparedStatementModifier.class.getName()); @@ -109,7 +108,7 @@ public class MySQLPreparedStatementModifier extends AbstractModifier { for (CtConstructor constructor : constructorList) { CtClass params[] = constructor.getParameterTypes(); if (params.length == 3) { - constructor.insertBefore("{" + DatabaseRequestTracer.FQCN + ".putSqlQuery(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_QUERY + ",$2); }"); + constructor.insertBefore("{" + DatabaseRequestTracer.FQCN + ".putSqlQuery(" + ProfilerConstant.REQ_DATA_TYPE_DB_QUERY + ",$2); }"); } } } 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 2ed24b79c..b31407b42 100644 --- a/src/main/java/com/profiler/modifier/db/oracle/OraclePreparedStatementModifier.java +++ b/src/main/java/com/profiler/modifier/db/oracle/OraclePreparedStatementModifier.java @@ -1,15 +1,13 @@ package com.profiler.modifier.db.oracle; +import com.profiler.config.ProfilerConstant; import com.profiler.interceptor.bci.ByteCodeInstrumentor; +import com.profiler.modifier.AbstractModifier; +import com.profiler.trace.DatabaseRequestTracer; import javassist.CtClass; import javassist.CtConstructor; import javassist.CtMethod; -import com.profiler.config.TomcatProfilerConstant; - -import com.profiler.modifier.AbstractModifier; -import com.profiler.trace.DatabaseRequestTracer; - import java.security.ProtectionDomain; import java.util.logging.Level; import java.util.logging.Logger; @@ -78,13 +76,13 @@ public class OraclePreparedStatementModifier extends AbstractModifier { for (CtConstructor constructor : constructorList) { CtClass params[] = constructor.getParameterTypes(); if (params.length == 6) { - constructor.insertBefore("{" + DatabaseRequestTracer.FQCN + ".putSqlQuery(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_QUERY + ",$2); }"); + constructor.insertBefore("{" + DatabaseRequestTracer.FQCN + ".putSqlQuery(" + ProfilerConstant.REQ_DATA_TYPE_DB_QUERY + ",$2); }"); } } } private void updateExecuteMethod(CtClass cc) throws Exception { CtMethod method = cc.getDeclaredMethod("execute", null); - method.insertAfter("{" + DatabaseRequestTracer.FQCN + ".put(" + TomcatProfilerConstant.REQ_DATA_TYPE_DB_EXECUTE_QUERY + "); }"); + method.insertAfter("{" + DatabaseRequestTracer.FQCN + ".put(" + ProfilerConstant.REQ_DATA_TYPE_DB_EXECUTE_QUERY + "); }"); } } 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 83acad43f..aa18794f0 100644 --- a/src/main/java/com/profiler/modifier/db/oracle/OracleStatementModifier.java +++ b/src/main/java/com/profiler/modifier/db/oracle/OracleStatementModifier.java @@ -1,12 +1,11 @@ package com.profiler.modifier.db.oracle; +import com.profiler.config.ProfilerConstant; import com.profiler.interceptor.bci.ByteCodeInstrumentor; -import javassist.CtClass; -import javassist.CtMethod; - -import com.profiler.config.TomcatProfilerConstant; import com.profiler.modifier.AbstractModifier; import com.profiler.trace.DatabaseRequestTracer; +import javassist.CtClass; +import javassist.CtMethod; import java.security.ProtectionDomain; import java.util.logging.Level; @@ -56,8 +55,8 @@ public class OracleStatementModifier extends AbstractModifier { StringBuilder sb = new StringBuilder(); sb.append("{"); - 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(DatabaseRequestTracer.FQCN + ".putSqlQuery(" + ProfilerConstant.REQ_DATA_TYPE_DB_QUERY + ",$1);"); + sb.append(DatabaseRequestTracer.FQCN + ".put(" + ProfilerConstant.REQ_DATA_TYPE_DB_EXECUTE_QUERY + ");"); sb.append("}"); serviceMethod.insertAfter(sb.toString()); diff --git a/src/main/java/com/profiler/modifier/tomcat/StandardHostValveInvokeInterceptor.java b/src/main/java/com/profiler/modifier/tomcat/StandardHostValveInvokeInterceptor.java index 61a1b0c3f..85561b873 100644 --- a/src/main/java/com/profiler/modifier/tomcat/StandardHostValveInvokeInterceptor.java +++ b/src/main/java/com/profiler/modifier/tomcat/StandardHostValveInvokeInterceptor.java @@ -1,20 +1,18 @@ package com.profiler.modifier.tomcat; -import static com.profiler.config.TomcatProfilerConstant.CLASS_NAME_REQUEST_THRIFT_DTO; +import com.profiler.config.ProfilerConstant; +import com.profiler.interceptor.Interceptor; +import com.profiler.interceptor.bci.ByteCodeInstrumentor; +import com.profiler.interceptor.bci.InstrumentClass; +import com.profiler.interceptor.bci.InstrumentException; +import com.profiler.modifier.AbstractModifier; +import com.profiler.trace.RequestTracer; +import javassist.ByteArrayClassPath; import java.security.ProtectionDomain; import java.util.logging.Level; import java.util.logging.Logger; -import com.profiler.interceptor.bci.InstrumentException; -import javassist.*; - -import com.profiler.interceptor.Interceptor; -import com.profiler.interceptor.bci.ByteCodeInstrumentor; -import com.profiler.interceptor.bci.InstrumentClass; -import com.profiler.modifier.AbstractModifier; -import com.profiler.trace.RequestTracer; - /** * Modify org.apache.catalina.core.StandardHostValve class * @@ -57,7 +55,7 @@ public class StandardHostValveInvokeInterceptor extends AbstractModifier { try { // TODO 이제 인터셉터에서 아래 클래스를 직접적으로 접근하는 일이 없으므로 없어도 될것 같음. classLoader.loadClass(RequestTracer.FQCN); - classLoader.loadClass(CLASS_NAME_REQUEST_THRIFT_DTO); + classLoader.loadClass(ProfilerConstant.CLASS_NAME_REQUEST_THRIFT_DTO); // thrift에 대한 lib를 별도 가지고 있을려면 system및의 별도 classloader를 가지고 있어야 되는게 아닌지? 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 b6615aab3..7aa10d2fe 100644 --- a/src/main/java/com/profiler/receiver/TCPSocketManager.java +++ b/src/main/java/com/profiler/receiver/TCPSocketManager.java @@ -1,11 +1,11 @@ package com.profiler.receiver; +import com.profiler.config.ProfilerConfig; + import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; -import com.profiler.config.TomcatProfilerConfig; - public class TCPSocketManager extends Thread { ServerSocket serverSocket = null; @@ -14,7 +14,7 @@ public class TCPSocketManager extends Thread { public void run() { try { - serverSocket = new ServerSocket(TomcatProfilerConfig.AGENT_TCP_LISTEN_PORT, 100); + serverSocket = new ServerSocket(ProfilerConfig.AGENT_TCP_LISTEN_PORT, 100); System.out.println("*** Start TomcatProfiler TCP Listen Thread ***"); while (true) { Socket socket = serverSocket.accept(); diff --git a/src/main/java/com/profiler/sender/AgentInfoSender.java b/src/main/java/com/profiler/sender/AgentInfoSender.java index 7c77e35d8..3259f4b8e 100644 --- a/src/main/java/com/profiler/sender/AgentInfoSender.java +++ b/src/main/java/com/profiler/sender/AgentInfoSender.java @@ -1,15 +1,15 @@ package com.profiler.sender; +import com.profiler.Agent; +import com.profiler.common.dto.AgentInfoDTO; +import com.profiler.config.ProfilerConfig; + import java.io.ObjectOutputStream; import java.net.Socket; import java.util.Map.Entry; import java.util.logging.Level; import java.util.logging.Logger; -import com.profiler.Agent; -import com.profiler.common.dto.AgentInfoDTO; -import com.profiler.config.TomcatProfilerConfig; - @Deprecated public class AgentInfoSender extends Thread { @@ -66,7 +66,7 @@ public class AgentInfoSender extends Thread { private void sendAgentStartInfo() { while (connectToServer()) { try { - Thread.sleep(TomcatProfilerConfig.SERVER_CONNECT_RETRY_GAP); + Thread.sleep(ProfilerConfig.SERVER_CONNECT_RETRY_GAP); } catch (Exception e) { e.printStackTrace(); } @@ -101,25 +101,25 @@ public class AgentInfoSender extends Thread { private boolean connectToServer() { try { if (logger.isLoggable(Level.INFO)) { - logger.info("Trying to connect server. " + TomcatProfilerConfig.SERVER_IP + ":" + TomcatProfilerConfig.SERVER_TCP_LISTEN_PORT); + logger.info("Trying to connect server. " + ProfilerConfig.SERVER_IP + ":" + ProfilerConfig.SERVER_TCP_LISTEN_PORT); } - requestSocket = new Socket(TomcatProfilerConfig.SERVER_IP, TomcatProfilerConfig.SERVER_TCP_LISTEN_PORT); + requestSocket = new Socket(ProfilerConfig.SERVER_IP, ProfilerConfig.SERVER_TCP_LISTEN_PORT); // TODO timeout 처리가 없음. api를 변경해야 될듯. if (logger.isLoggable(Level.INFO)) { - logger.info("Connected to server. " + TomcatProfilerConfig.SERVER_IP + ":" + TomcatProfilerConfig.SERVER_TCP_LISTEN_PORT); + logger.info("Connected to server. " + ProfilerConfig.SERVER_IP + ":" + ProfilerConfig.SERVER_TCP_LISTEN_PORT); } return false; } catch (java.net.ConnectException ce) { if (logger.isLoggable(Level.SEVERE)) { - logger.log(Level.SEVERE, "Connect to TomcatProfiler server is failed. " + TomcatProfilerConfig.SERVER_IP + ":" + TomcatProfilerConfig.SERVER_TCP_LISTEN_PORT, ce); + logger.log(Level.SEVERE, "Connect to TomcatProfiler server is failed. " + ProfilerConfig.SERVER_IP + ":" + ProfilerConfig.SERVER_TCP_LISTEN_PORT, ce); } return true; } catch (Exception e) { if (logger.isLoggable(Level.SEVERE)) { - logger.log(Level.SEVERE, "Connect to TomcatProfiler server is failed. " + TomcatProfilerConfig.SERVER_IP + ":" + TomcatProfilerConfig.SERVER_TCP_LISTEN_PORT, e); + logger.log(Level.SEVERE, "Connect to TomcatProfiler server is failed. " + ProfilerConfig.SERVER_IP + ":" + ProfilerConfig.SERVER_TCP_LISTEN_PORT, e); } return true; } diff --git a/src/main/java/com/profiler/sender/DataSender.java b/src/main/java/com/profiler/sender/DataSender.java index 0b0c6d53f..7971a4f0e 100644 --- a/src/main/java/com/profiler/sender/DataSender.java +++ b/src/main/java/com/profiler/sender/DataSender.java @@ -1,5 +1,13 @@ package com.profiler.sender; +import com.profiler.common.dto.Header; +import com.profiler.common.util.DefaultTBaseLocator; +import com.profiler.common.util.HeaderTBaseSerializer; +import com.profiler.common.util.TBaseLocator; +import com.profiler.config.ProfilerConfig; +import org.apache.thrift.TBase; +import org.apache.thrift.TException; + import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; @@ -10,15 +18,6 @@ import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; -import org.apache.thrift.TBase; -import org.apache.thrift.TException; - -import com.profiler.common.dto.Header; -import com.profiler.common.util.DefaultTBaseLocator; -import com.profiler.common.util.HeaderTBaseSerializer; -import com.profiler.common.util.TBaseLocator; -import com.profiler.config.TomcatProfilerConfig; - /** * @author netspider */ @@ -28,7 +27,7 @@ public class DataSender extends Thread { private final LinkedBlockingQueue> addedQueue = new LinkedBlockingQueue>(4096); - private final InetSocketAddress serverAddress = new InetSocketAddress(TomcatProfilerConfig.SERVER_IP, TomcatProfilerConfig.DEFUALT_PORT); + private final InetSocketAddress serverAddress = new InetSocketAddress(ProfilerConfig.SERVER_IP, ProfilerConfig.SERVER_UDP_PORT); private DatagramSocket udpSocket = null; private TBaseLocator locator = new DefaultTBaseLocator(); diff --git a/src/main/java/com/profiler/trace/DatabaseRequestTracer.java b/src/main/java/com/profiler/trace/DatabaseRequestTracer.java index d4f5b1141..9a225bae1 100644 --- a/src/main/java/com/profiler/trace/DatabaseRequestTracer.java +++ b/src/main/java/com/profiler/trace/DatabaseRequestTracer.java @@ -1,23 +1,18 @@ package com.profiler.trace; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.CopyOnWriteArraySet; - import com.profiler.Agent; import com.profiler.common.dto.thrift.RequestDataListThriftDTO; import com.profiler.common.dto.thrift.RequestDataThriftDTO; -import com.profiler.config.TomcatProfilerConfig; -import com.profiler.config.TomcatProfilerConstant; +import com.profiler.config.ProfilerConfig; +import com.profiler.config.ProfilerConstant; import com.profiler.util.NamedThreadLocal; import com.profiler.util.QueryStringUtil; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.CopyOnWriteArraySet; + public class DatabaseRequestTracer { public static final String FQCN = DatabaseRequestTracer.class.getName(); @@ -26,7 +21,7 @@ public class DatabaseRequestTracer { private static Set sqlSet = null; static { - if (TomcatProfilerConfig.QUERY_COUNT_OVER_10000) { + if (ProfilerConfig.QUERY_COUNT_OVER_10000) { sqlSet = new CopyOnWriteArraySet(); } else { sqlSet = new HashSet(1024); @@ -148,7 +143,7 @@ public class DatabaseRequestTracer { * @return */ private static boolean checkHashCode(int dataHashCode) { - if (TomcatProfilerConfig.QUERY_COUNT_OVER_10000) { + if (ProfilerConfig.QUERY_COUNT_OVER_10000) { // If sqlSet is CopyOnWriteArraySet, it removes data. if (sqlSet.size() > 10000) { Iterator iterator = sqlSet.iterator(); @@ -180,7 +175,7 @@ public class DatabaseRequestTracer { params.append(map.get(loop)).append(","); } - RequestDataThriftDTO dataDto = new RequestDataThriftDTO(TomcatProfilerConstant.REQ_DATA_TYPE_DB_PREPARED_STATEMENT_PARAM, System.currentTimeMillis()); + RequestDataThriftDTO dataDto = new RequestDataThriftDTO(ProfilerConstant.REQ_DATA_TYPE_DB_PREPARED_STATEMENT_PARAM, System.currentTimeMillis()); dataDto.setDataString(params.toString()); list.add(dataDto); } @@ -304,8 +299,8 @@ public class DatabaseRequestTracer { 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()); + if (previousDTO.getDataType() != ProfilerConstant.REQ_DATA_TYPE_DB_FETCH) { + RequestDataThriftDTO dataDto = new RequestDataThriftDTO(ProfilerConstant.REQ_DATA_TYPE_DB_FETCH, System.currentTimeMillis()); dataDto.setExtraInt1(fetchCount); dataDto.setExtraInt2(totalFetchCount); list.add(dataDto); diff --git a/src/main/java/com/profiler/trace/RequestTracer.java b/src/main/java/com/profiler/trace/RequestTracer.java index 77ab199aa..44452662e 100644 --- a/src/main/java/com/profiler/trace/RequestTracer.java +++ b/src/main/java/com/profiler/trace/RequestTracer.java @@ -1,16 +1,16 @@ package com.profiler.trace; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; - import com.profiler.Agent; import com.profiler.common.dto.thrift.RequestDataListThriftDTO; import com.profiler.common.dto.thrift.RequestThriftDTO; -import com.profiler.config.TomcatProfilerConstant; +import com.profiler.config.ProfilerConstant; import com.profiler.sender.DataSender; import com.profiler.util.SystemUtils; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + public class RequestTracer { public static final String FQCN = RequestTracer.class.getName(); @@ -29,7 +29,7 @@ public class RequestTracer { currentRequestHash.set(tempRequestHashCode); requestSet.add(tempRequestID); - RequestThriftDTO dto = new RequestThriftDTO(Agent.getInstance().getAgentId(), tempRequestHashCode, TomcatProfilerConstant.DATA_TYPE_REQUEST, requestTime, cpuUserTime[0], cpuUserTime[1]); + RequestThriftDTO dto = new RequestThriftDTO(Agent.getInstance().getAgentId(), tempRequestHashCode, ProfilerConstant.DATA_TYPE_REQUEST, requestTime, cpuUserTime[0], cpuUserTime[1]); dto.setClientIP(clientIP); dto.setRequestURL(requestURL); @@ -47,7 +47,7 @@ public class RequestTracer { */ public static void endTransaction() { long cpuUserTime[] = SystemUtils.getThreadTime(); - RequestThriftDTO dto = new RequestThriftDTO(Agent.getInstance().getAgentId(), currentRequestHash.get(), TomcatProfilerConstant.DATA_TYPE_RESPONSE, System.currentTimeMillis(), cpuUserTime[0], cpuUserTime[1]); + RequestThriftDTO dto = new RequestThriftDTO(Agent.getInstance().getAgentId(), currentRequestHash.get(), ProfilerConstant.DATA_TYPE_RESPONSE, System.currentTimeMillis(), cpuUserTime[0], cpuUserTime[1]); finishTransaction(dto); } @@ -60,7 +60,7 @@ public class RequestTracer { public static void exceptionTransaction(Throwable throwable) { long cpuUserTime[] = SystemUtils.getThreadTime(); - RequestThriftDTO dto = new RequestThriftDTO(Agent.getInstance().getAgentId(), currentRequestHash.get(), TomcatProfilerConstant.DATA_TYPE_UNCAUGHT_EXCEPTION, System.currentTimeMillis(), cpuUserTime[0], cpuUserTime[1]); + RequestThriftDTO dto = new RequestThriftDTO(Agent.getInstance().getAgentId(), currentRequestHash.get(), ProfilerConstant.DATA_TYPE_UNCAUGHT_EXCEPTION, System.currentTimeMillis(), cpuUserTime[0], cpuUserTime[1]); dto.setExtraData1(throwable.getMessage()); diff --git a/src/test/resources/hippo.config b/src/test/resources/hippo.config new file mode 100644 index 000000000..6200c0414 --- /dev/null +++ b/src/test/resources/hippo.config @@ -0,0 +1,24 @@ +SERVER_IP= 10.64.84.188 +#SERVER_IP= 10.66.18.78 +#SERVER_IP= 127.0.0.1 +SERVER_UDP_PORT=9995 + +# JDBC_PROFILE 여부 +JDBC_PROFILE=true +JDBC_PROFILE_MYSQL=true; +JDBC_PROFILE_MSSQL=true; +JDBC_PROFILE_ORACLE=true; +JDBC_PROFILE_CUBRID=true; +JDBC_PROFILE_DBCP=true; + + +AGENT_TCP_LISTEN_PORT= 9990 +SERVER_TCP_LISTEN_PORT= 9991 +REQUEST_TRANSACTION_DATA_LISTEN_PORT= 9995 +REQUEST_DATA_LISTEN_PORT= 9996 +JVM_DATA_LISTEN_PORT= 9997 +JVM_STAT_GAP=5000 +SERVER_CONNECT_RETRY_GAP=1000 +QUERY_COUNT_OVER_10000=false +JDBC_PROFILE=true +LOG_LEVEL=DEBUG