From 5eedd95712aeeb603cf38e0341c60265d4fea5b8 Mon Sep 17 00:00:00 2001 From: Chisu Yu Date: Mon, 14 Jan 2013 06:54:15 +0000 Subject: [PATCH] =?UTF-8?q?[=EC=9C=A0=EC=B9=98=EC=88=98]=20[NOBTS]=20confi?= =?UTF-8?q?guration=20refactoring?= 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@1097 84d0f5b1-2673-498c-a247-62c4ff18d310 --- runscript/hippo.config | 25 +- src/main/java/com/profiler/Agent.java | 2 +- src/main/java/com/profiler/SystemMonitor.java | 236 ++++++------- .../com/profiler/config/ProfilerConfig.java | 321 ++++++++---------- .../modifier/tomcat/CatalinaModifier.java | 15 +- .../StandardHostValveInvokeModifier.java | 9 +- .../tomcat/TomcatConnectorModifier.java | 20 +- .../tomcat/TomcatStandardServiceModifier.java | 1 - .../CatalinaAwaitInterceptor.java | 9 +- .../ConnectorInitializeInterceptor.java | 11 +- .../StandardServiceStartInterceptor.java | 15 +- .../StandardServiceStopInterceptor.java | 17 +- .../profiler/receiver/TCPSocketManager.java | 32 -- .../com/profiler/sender/AgentInfoSender.java | 142 -------- .../java/com/profiler/SystemMonitorTest.java | 5 +- src/test/resources/hippo.config | 35 +- 16 files changed, 333 insertions(+), 562 deletions(-) delete mode 100644 src/main/java/com/profiler/receiver/TCPSocketManager.java delete mode 100644 src/main/java/com/profiler/sender/AgentInfoSender.java diff --git a/runscript/hippo.config b/runscript/hippo.config index 60590e1fc..83592cf1f 100644 --- a/runscript/hippo.config +++ b/runscript/hippo.config @@ -1,22 +1,25 @@ -SERVER_IP= 127.0.0.1 -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 +server.collector.ip=127.0.0.1 +server.collector.udp.port=9995 +profile.enable=true +profile.jdbc=true +profile.jdbc.mysql=true +profile.jdbc.mssql=true +profile.jdbc.oracle=true +profile.jdbc.cubrid=true +profile.jdbc.dbcp=true +profile.jvm.collect.interval=1000 #timebase 샘플링을 할지 말지 여부 결정. -sampling.elapsedtimebase.enable= true +sampling.elapsedtimebase.enable=true + #timebase 샘플링 시의 1개 thread에 축정할 트레이스 데이터의 갯수. sampling.elapsedtimebase.buffersize=20 + #timebase 샘플링시 discard.timelimit 의 시간보다 작을 경우 트레이스 데이터를 버릴지 말지 여부 sampling.elapsedtimebase.discard=false + #timebase 샘플링시 discard.timelimit 해당 시간보다 빨리 끝났을 경우 트레이스 데이터를 버려 버린다. sampling.elapsedtimebase.discard.timelimit=1000 \ No newline at end of file diff --git a/src/main/java/com/profiler/Agent.java b/src/main/java/com/profiler/Agent.java index 23fc3140a..2f8da3a4e 100644 --- a/src/main/java/com/profiler/Agent.java +++ b/src/main/java/com/profiler/Agent.java @@ -54,7 +54,7 @@ public class Agent { initializeTraceContext(); - this.systemMonitor = new SystemMonitor(this.traceContext); + this.systemMonitor = new SystemMonitor(this.traceContext, this.profilerConfig); this.systemMonitor.setDataSender(dataSender); // 매핑 테이블 초기화를 위해 엑세스 diff --git a/src/main/java/com/profiler/SystemMonitor.java b/src/main/java/com/profiler/SystemMonitor.java index 55be0f504..a901c5555 100644 --- a/src/main/java/com/profiler/SystemMonitor.java +++ b/src/main/java/com/profiler/SystemMonitor.java @@ -1,11 +1,5 @@ package com.profiler; -import com.profiler.common.dto.thrift.JVMInfoThriftDTO; -import com.profiler.context.TraceContext; -import com.profiler.sender.DataSender; -import com.profiler.util.Assert; -import com.sun.management.OperatingSystemMXBean; - import java.io.IOException; import java.lang.management.GarbageCollectorMXBean; import java.lang.management.ManagementFactory; @@ -19,146 +13,154 @@ import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; -import static com.profiler.config.ProfilerConfig.JVM_STAT_GAP; +import com.profiler.common.dto.thrift.JVMInfoThriftDTO; +import com.profiler.config.ProfilerConfig; +import com.profiler.context.TraceContext; +import com.profiler.sender.DataSender; +import com.profiler.util.Assert; +import com.sun.management.OperatingSystemMXBean; /** * System monitor - * + * * @author netspider */ @SuppressWarnings("restriction") public class SystemMonitor { - private static final Logger logger = Logger.getLogger(SystemMonitor.class.getName()); + private static final Logger logger = Logger.getLogger(SystemMonitor.class.getName()); - private final ScheduledExecutorService executor = new ScheduledThreadPoolExecutor(1, new ThreadFactory() { - @Override - public Thread newThread(Runnable runnable) { - Thread t = new Thread(runnable); - t.setName("HIPPO-SystemMonitor"); - t.setDaemon(true); - return t; - } - }); + private final ScheduledExecutorService executor = new ScheduledThreadPoolExecutor(1, new ThreadFactory() { + @Override + public Thread newThread(Runnable runnable) { + Thread t = new Thread(runnable); + t.setName("HIPPO-SystemMonitor"); + t.setDaemon(true); + return t; + } + }); - private DataSender dataSender; - private TraceContext traceContext; + private DataSender dataSender; + private TraceContext traceContext; + private final ProfilerConfig profilerConfig; - public SystemMonitor(TraceContext traceContext) { - Assert.notNull(traceContext, "traceContext must not be null"); - this.traceContext = traceContext; - } + public SystemMonitor(TraceContext traceContext, ProfilerConfig profilerConfig) { + Assert.notNull(traceContext, "traceContext must not be null"); + this.traceContext = traceContext; + this.profilerConfig = profilerConfig; + } - public void setDataSender(DataSender dataSender) { - this.dataSender = dataSender; - } + public void setDataSender(DataSender dataSender) { + this.dataSender = dataSender; + } - public void start() { - logger.info("Starting system monitor."); - executor.scheduleAtFixedRate(new Worker(dataSender, traceContext), 5, 5, TimeUnit.SECONDS); - } + public void start() { + logger.info("Starting system monitor."); + executor.scheduleAtFixedRate(new Worker(dataSender, traceContext, profilerConfig), 5, 5, TimeUnit.SECONDS); + } - public void stop() { - logger.info("Stopping system monitor"); - executor.shutdown(); - } + public void stop() { + logger.info("Stopping system monitor"); + executor.shutdown(); + } - private static class Worker implements Runnable { + private static class Worker implements Runnable { - private DataSender dataSender; - private TraceContext traceContext; + private DataSender dataSender; + private TraceContext traceContext; + private ProfilerConfig profilerConfig; - public Worker(DataSender dataSender, TraceContext traceContext) { - this.dataSender = dataSender; - this.traceContext = traceContext; - } + public Worker(DataSender dataSender, TraceContext traceContext, ProfilerConfig profilerConfig) { + this.dataSender = dataSender; + this.traceContext = traceContext; + this.profilerConfig = profilerConfig; + } - public void run() { - try { - JVMInfoThriftDTO jvmInfo = new JVMInfoThriftDTO(); - jvmInfo.setAgentId(traceContext.getAgentId()); - jvmInfo.setDataTime(System.currentTimeMillis()); + public void run() { + try { + JVMInfoThriftDTO jvmInfo = new JVMInfoThriftDTO(); + jvmInfo.setAgentId(traceContext.getAgentId()); + jvmInfo.setDataTime(System.currentTimeMillis()); - activeThread(traceContext, jvmInfo); + activeThread(traceContext, jvmInfo); - setGCState(jvmInfo); - setMemoryState(jvmInfo); - setProcessCPUUsage(jvmInfo); + setGCState(jvmInfo); + setMemoryState(jvmInfo); + setProcessCPUUsage(jvmInfo); - dataSender.send(jvmInfo); - } catch (Exception e) { - logger.log(Level.INFO, "JvmInfo collect error Cause:" + e.getMessage(), e); - } - } + dataSender.send(jvmInfo); + } catch (Exception e) { + logger.log(Level.INFO, "JvmInfo collect error Cause:" + e.getMessage(), e); + } + } - private void activeThread(TraceContext traceContext, JVMInfoThriftDTO jvmInfo) { - int activeThread = traceContext.getActiveThreadCounter().getActiveThread(); - jvmInfo.setActiveThreadCount(activeThread); - } + private void activeThread(TraceContext traceContext, JVMInfoThriftDTO jvmInfo) { + int activeThread = traceContext.getActiveThreadCounter().getActiveThread(); + jvmInfo.setActiveThreadCount(activeThread); + } + private void setGCState(JVMInfoThriftDTO jvmInfo) throws Exception { + List list = ManagementFactory.getGarbageCollectorMXBeans(); + if (list.size() == 2) { + // 제네레이션 기반일 경우 young, old 2개. + // young.getName() // young gc type + GarbageCollectorMXBean young = list.get(0); + jvmInfo.setGc1Count(young.getCollectionCount()); + jvmInfo.setGc1Time(young.getCollectionTime()); - private void setGCState(JVMInfoThriftDTO jvmInfo) throws Exception { - List list = ManagementFactory.getGarbageCollectorMXBeans(); - if (list.size() == 2) { - // 제네레이션 기반일 경우 young, old 2개. -// young.getName() // young gc type - GarbageCollectorMXBean young = list.get(0); - jvmInfo.setGc1Count(young.getCollectionCount()); - jvmInfo.setGc1Time(young.getCollectionTime()); + GarbageCollectorMXBean old = list.get(1); + // old.getName() // old gc type + jvmInfo.setGc2Count(old.getCollectionCount()); + jvmInfo.setGc2Time(old.getCollectionTime()); + } else { + // g1 ? + if (logger.isLoggable(Level.FINE)) { + logger.fine("unknown gc type. gc collector size:" + list.size()); + } + } + } - GarbageCollectorMXBean old = list.get(1); -// old.getName() // old gc type - jvmInfo.setGc2Count(old.getCollectionCount()); - jvmInfo.setGc2Time(old.getCollectionTime()); - } else { - // g1 ? - if (logger.isLoggable(Level.FINE)) { - logger.fine("unknown gc type. gc collector size:" + list.size()); - } - } - } + public void setMemoryState(JVMInfoThriftDTO jvmInfo) throws Exception { + MemoryMXBean bean = ManagementFactory.getMemoryMXBean(); + MemoryUsage heap = bean.getHeapMemoryUsage(); + MemoryUsage nonHeap = bean.getNonHeapMemoryUsage(); - public void setMemoryState(JVMInfoThriftDTO jvmInfo) throws Exception { - MemoryMXBean bean = ManagementFactory.getMemoryMXBean(); - MemoryUsage heap = bean.getHeapMemoryUsage(); - MemoryUsage nonHeap = bean.getNonHeapMemoryUsage(); + jvmInfo.setHeapUsed(heap.getUsed()); + jvmInfo.setHeapCommitted(heap.getCommitted()); + jvmInfo.setNonHeapUsed(nonHeap.getUsed()); + jvmInfo.setNonHeapCommitted(nonHeap.getCommitted()); + } - jvmInfo.setHeapUsed(heap.getUsed()); - jvmInfo.setHeapCommitted(heap.getCommitted()); - jvmInfo.setNonHeapUsed(nonHeap.getUsed()); - jvmInfo.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. + * + * @throws Exception + */ + private void setProcessCPUUsage(JVMInfoThriftDTO jvmInfo) throws Exception { + try { + if (processCPUAvailable) { + OperatingSystemMXBean sunOSMBean = ManagementFactory.newPlatformMXBeanProxy(ManagementFactory.getPlatformMBeanServer(), ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME, OperatingSystemMXBean.class); + long cpuTime = sunOSMBean.getProcessCpuTime(); - /** - * I don't know why should I divide by 10 in this result. But it works. - * - * @throws Exception - */ - private void setProcessCPUUsage(JVMInfoThriftDTO jvmInfo) 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 (processorCount == -1) { - processorCount = sunOSMBean.getAvailableProcessors(); - } + if (previousCpuTime != 0) { + long usedCPUTotal = (cpuTime - previousCpuTime) / 1000000; + double usedCPU = (0.1D * usedCPUTotal) / (processorCount * profilerConfig.getProfileJvmCollectInterval() / 1000.0); + jvmInfo.setProcessCPUTime(usedCPU); + } + previousCpuTime = cpuTime; - if (previousCpuTime != 0) { - long usedCPUTotal = (cpuTime - previousCpuTime) / 1000000; - double usedCPU = (0.1D * usedCPUTotal) / (processorCount * JVM_STAT_GAP / 1000.0); - jvmInfo.setProcessCPUTime(usedCPU); - } - previousCpuTime = cpuTime; - - } - } catch (IOException e) { - processCPUAvailable = false; - } - } - } + } + } catch (IOException e) { + processCPUAvailable = false; + } + } + } } diff --git a/src/main/java/com/profiler/config/ProfilerConfig.java b/src/main/java/com/profiler/config/ProfilerConfig.java index f94654225..2fb42ccad 100644 --- a/src/main/java/com/profiler/config/ProfilerConfig.java +++ b/src/main/java/com/profiler/config/ProfilerConfig.java @@ -1,228 +1,185 @@ package com.profiler.config; -import com.profiler.common.util.PropertyUtils; -import com.profiler.util.NumberUtils; - import java.io.FileNotFoundException; import java.io.IOException; import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; +import com.profiler.common.util.PropertyUtils; +import com.profiler.util.NumberUtils; public class ProfilerConfig { + private static final Logger logger = Logger.getLogger(ProfilerConfig.class.getName()); - private static final Logger logger = Logger.getLogger(ProfilerConfig.class.getName()); + private boolean profileEnable = true; - private boolean profileEnable = true; + public String collectorServerIp = "127.0.0.1"; + public int collectorServerPort = 9995; - @Deprecated - public static String SERVER_IP = "127.0.0.1"; - @Deprecated - public static int SERVER_UDP_PORT = 9995; + private boolean jdbcProfile = true; + private boolean jdbcProfileMySql = true; + private boolean jdbcProfileMsSql = true; + private boolean jdbcProfileOracle = true; + private boolean jdbcProfileCubrid = true; + private boolean jdbcProfileDbcp = true; - public String collectorServerIp = "127.0.0.1"; - public int collectorServerPort = 9995; + private boolean samplingElapsedTimeBaseEnable; + private int samplingElapsedTimeBaseBufferSize; + private boolean samplingElapsedTimeBaseDiscard; + private long samplingElapsedTimeBaseDiscardTimeLimit; - @Deprecated - public static int AGENT_TCP_LISTEN_PORT = 9990; - @Deprecated - public static int SERVER_TCP_LISTEN_PORT = 9991; + private int profileJvmCollectInterval; + public ProfilerConfig() { + } - public static long JVM_STAT_GAP = 5000L; - public static long SERVER_CONNECT_RETRY_GAP = 1000L; + public void readConfigFile() throws IOException { + String hippoConfigFileName = System.getProperty("hippo.config"); + if (hippoConfigFileName == null) { + logger.info("hippo.config property is not set. Using default value:" + this); + return; + } - private boolean jdbcProfile = true; - private boolean jdbcProfileMySql = true; - private boolean jdbcProfileMsSql = true; - private boolean jdbcProfileOracle = true; - private boolean jdbcProfileCubrid = true; - private boolean jdbcProfileDbcp = true; + try { + // TODO file path를 찾는 부분을 수정해야됨 현재 제대로 안찾아짐. 설정파일이 classpath 에 걸려 있지않으므로 파일위치를 못찾음. + 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."); + } + throw fe; + } catch (IOException e) { + if (logger.isLoggable(Level.WARNING)) { + logger.log(Level.WARNING, hippoConfigFileName + " file read error. Cause:" + e.getMessage(), e); + } + throw e; + } + } - private boolean samplingElapsedTimeBaseEnable; - private int samplingElapsedTimeBaseBufferSize; - private boolean samplingElapsedTimeBaseDiscard; - private long samplingElapsedTimeBaseDiscardTimeLimit; + public String getCollectorServerIp() { + return collectorServerIp; + } + public int getCollectorServerPort() { + return collectorServerPort; + } - public ProfilerConfig() { - } + public boolean isProfileEnable() { + return profileEnable; + } - public void readConfigFile() throws IOException { - String hippoConfigFileName = System.getProperty("hippo.config"); - if (hippoConfigFileName == null) { - logger.info("hippo.config property is not set. Using default value:" + this); - return; - } + public boolean isJdbcProfile() { + return jdbcProfile; + } - try { - // TODO file path를 찾는 부분을 수정해야됨 현재 제대로 안찾아짐. 설정파일이 classpath 에 걸려 있지않으므로 파일위치를 못찾음. - 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."); - } - 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 isJdbcProfileMySql() { + return jdbcProfileMySql; + } - public String getCollectorServerIp() { - return collectorServerIp; - } + public boolean isJdbcProfileMsSql() { + return jdbcProfileMsSql; + } - public int getCollectorServerPort() { - return collectorServerPort; - } + public boolean isJdbcProfileOracle() { + return jdbcProfileOracle; + } - public boolean isProfileEnable() { - return profileEnable; - } + public boolean isJdbcProfileCubrid() { + return jdbcProfileCubrid; + } - public boolean isJdbcProfile() { - return jdbcProfile; - } + public boolean isSamplingElapsedTimeBaseEnable() { + return samplingElapsedTimeBaseEnable; + } - public boolean isJdbcProfileMySql() { - return jdbcProfileMySql; - } + public int getSamplingElapsedTimeBaseBufferSize() { + return samplingElapsedTimeBaseBufferSize; + } - public boolean isJdbcProfileMsSql() { - return jdbcProfileMsSql; - } + public boolean isSamplingElapsedTimeBaseDiscard() { + return samplingElapsedTimeBaseDiscard; + } - public boolean isJdbcProfileOracle() { - return jdbcProfileOracle; - } + public long getSamplingElapsedTimeBaseDiscardTimeLimit() { + return samplingElapsedTimeBaseDiscardTimeLimit; + } - public boolean isJdbcProfileCubrid() { - return jdbcProfileCubrid; - } + public int getProfileJvmCollectInterval() { + return profileJvmCollectInterval; + } - public boolean isSamplingElapsedTimeBaseEnable() { - return samplingElapsedTimeBaseEnable; - } + private void readPropertyValues(Properties prop) { + // TODO : use Properties defaultvalue instead of using temp variable. - public int getSamplingElapsedTimeBaseBufferSize() { - return samplingElapsedTimeBaseBufferSize; - } + this.profileEnable = readBoolean(prop, "PROFILE_ENABLE", true); - public boolean isSamplingElapsedTimeBaseDiscard() { - return samplingElapsedTimeBaseDiscard; - } + this.collectorServerIp = readString(prop, "server.collector.ip", "127.0.0.1"); + this.collectorServerPort = readInt(prop, "server.collector.udp.port", 9995); - public long getSamplingElapsedTimeBaseDiscardTimeLimit() { - return samplingElapsedTimeBaseDiscardTimeLimit; - } + // JDBC + this.jdbcProfile = readBoolean(prop, "profile.jdbc", true); + this.jdbcProfileMySql = readBoolean(prop, "profile.jdbc.mysql", true); + this.jdbcProfileMsSql = readBoolean(prop, "profile.jdbc.mssql", true); + this.jdbcProfileOracle = readBoolean(prop, "profile.jdbc.oracle", true); + this.jdbcProfileCubrid = readBoolean(prop, "profile.jdbc.cubrid", true); + this.jdbcProfileDbcp = readBoolean(prop, "profile.jdbc.dbcp", true); - private void readPropertyValues(Properties prop) { - // TODO : use Properties defaultvalue instead of using temp variable. + // 샘플링 + io 조절 bufferSize 결정 + this.samplingElapsedTimeBaseEnable = readBoolean(prop, "sampling.elapsedtimebase.enable", true); + this.samplingElapsedTimeBaseBufferSize = readInt(prop, "sampling.elapsedtimebase.buffersize", 20); + this.samplingElapsedTimeBaseDiscard = readBoolean(prop, "sampling.elapsedtimebase.discard", true); + this.samplingElapsedTimeBaseDiscardTimeLimit = readLong(prop, "sampling.elapsedtimebase.discard.timelimit", 1000); - this.profileEnable = readBoolean(prop, "PROFILE_ENABLE", true); + // JVM + this.profileJvmCollectInterval = readInt(prop, "profile.jvm.collect.interval", 1000); - this.collectorServerIp = readString(prop, "SERVER_IP", "127.0.0.1"); - this.collectorServerPort = readInt(prop, "SERVER_UDP_PORT", 9995); + logger.info("configuration loaded successfully."); + } - String temp = null; - if ((temp = prop.getProperty("AGENT_TCP_LISTEN_PORT")) != null) { - this.AGENT_TCP_LISTEN_PORT = Integer.parseInt(temp); - if (logger.isLoggable(Level.INFO)) { - logger.info("AGENT_TCP_LISTEN_PORT=" + AGENT_TCP_LISTEN_PORT); - } - } - if ((temp = prop.getProperty("SERVER_TCP_LISTEN_PORT")) != null) { - this.SERVER_TCP_LISTEN_PORT = Integer.parseInt(temp); - if (logger.isLoggable(Level.INFO)) { - logger.info("SERVER_TCP_LISTEN_PORT=" + SERVER_TCP_LISTEN_PORT); - } - } - if ((temp = prop.getProperty("JVM_STAT_GAP")) != null) { - this.JVM_STAT_GAP = Long.parseLong(temp); - if (logger.isLoggable(Level.INFO)) { - logger.info("JVM_STAT_GAP=" + JVM_STAT_GAP); - } - } - if ((temp = prop.getProperty("SERVER_CONNECT_RETRY_GAP")) != null) { - this.SERVER_CONNECT_RETRY_GAP = Long.parseLong(temp); - if (logger.isLoggable(Level.INFO)) { - logger.info("SERVER_CONNECT_RETRY_GAP=" + SERVER_CONNECT_RETRY_GAP); - } - } + 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; + } - // JDBC - 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.jdbcProfileDbcp = readBoolean(prop, "JDBC_PROFILE_DBCP", true); + private int readInt(Properties prop, String propertyName, int defaultValue) { + String value = prop.getProperty(propertyName); + int result = NumberUtils.parseInteger(value, defaultValue); + if (logger.isLoggable(Level.INFO)) { + logger.info(propertyName + "=" + result); + } + return result; + } - // 샘플링 + io 조절 bufferSize 결정 - this.samplingElapsedTimeBaseEnable = readBoolean(prop, "sampling.elapsedtimebase.enable", true); - this.samplingElapsedTimeBaseBufferSize = readInt(prop, "sampling.elapsedtimebase.buffersize", 20); - this.samplingElapsedTimeBaseDiscard = readBoolean(prop, "sampling.elapsedtimebase.discard", true); - this.samplingElapsedTimeBaseDiscardTimeLimit = readLong(prop, "sampling.elapsedtimebase.discard.timelimit", 1000); + private long readLong(Properties prop, String propertyName, int defaultValue) { + String value = prop.getProperty(propertyName); + long result = NumberUtils.parseLong(value, defaultValue); + if (logger.isLoggable(Level.INFO)) { + logger.info(propertyName + "=" + result); + } + return result; + } - logger.info("configuration loaded successfully."); - } + 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; + } - 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; - } + public boolean isJdbcProfileDbcp() { + return jdbcProfileDbcp; + } - private int readInt(Properties prop, String propertyName, int defaultValue) { - String value = prop.getProperty(propertyName); - int result = NumberUtils.parseInteger(value, defaultValue); - if (logger.isLoggable(Level.INFO)) { - logger.info(propertyName + "=" + result); - } - return result; - } - - private long readLong(Properties prop, String propertyName, int defaultValue) { - String value = prop.getProperty(propertyName); - long result = NumberUtils.parseLong(value, 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; - } - - @Override - public String toString() { - return "ProfilerConfig{" + - "profileEnable=" + profileEnable + - ", jdbcProfile=" + jdbcProfile + - ", jdbcProfileMySql=" + jdbcProfileMySql + - ", jdbcProfileMsSql=" + jdbcProfileMsSql + - ", jdbcProfileOracle=" + jdbcProfileOracle + - ", jdbcProfileCubrid=" + jdbcProfileCubrid + - ", jdbcProfileDbcp=" + jdbcProfileDbcp + - '}'; - } + @Override + public String toString() { + return "ProfilerConfig{" + "profileEnable=" + profileEnable + ", jdbcProfile=" + jdbcProfile + ", jdbcProfileMySql=" + jdbcProfileMySql + ", jdbcProfileMsSql=" + jdbcProfileMsSql + ", jdbcProfileOracle=" + jdbcProfileOracle + ", jdbcProfileCubrid=" + jdbcProfileCubrid + ", jdbcProfileDbcp=" + jdbcProfileDbcp + '}'; + } } diff --git a/src/main/java/com/profiler/modifier/tomcat/CatalinaModifier.java b/src/main/java/com/profiler/modifier/tomcat/CatalinaModifier.java index 08571f6ca..b4f3a7cdb 100644 --- a/src/main/java/com/profiler/modifier/tomcat/CatalinaModifier.java +++ b/src/main/java/com/profiler/modifier/tomcat/CatalinaModifier.java @@ -1,18 +1,15 @@ package com.profiler.modifier.tomcat; -import com.profiler.interceptor.bci.ByteCodeInstrumentor; -import com.profiler.interceptor.bci.InstrumentClass; -import com.profiler.modifier.tomcat.interceptors.CatalinaAwaitInterceptor; -import javassist.CtClass; -import javassist.CtMethod; - -import com.profiler.Agent; -import com.profiler.modifier.AbstractModifier; - import java.security.ProtectionDomain; import java.util.logging.Level; import java.util.logging.Logger; +import com.profiler.Agent; +import com.profiler.interceptor.bci.ByteCodeInstrumentor; +import com.profiler.interceptor.bci.InstrumentClass; +import com.profiler.modifier.AbstractModifier; +import com.profiler.modifier.tomcat.interceptors.CatalinaAwaitInterceptor; + /** * Tomcat startup정보를 HIPPO서버로 전송하는 코드를 호출하기위한 modifier * diff --git a/src/main/java/com/profiler/modifier/tomcat/StandardHostValveInvokeModifier.java b/src/main/java/com/profiler/modifier/tomcat/StandardHostValveInvokeModifier.java index 760d344a9..ff48d6968 100644 --- a/src/main/java/com/profiler/modifier/tomcat/StandardHostValveInvokeModifier.java +++ b/src/main/java/com/profiler/modifier/tomcat/StandardHostValveInvokeModifier.java @@ -1,17 +1,16 @@ package com.profiler.modifier.tomcat; +import java.security.ProtectionDomain; +import java.util.logging.Level; +import java.util.logging.Logger; + import com.profiler.Agent; -import com.profiler.context.TraceContext; 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 java.security.ProtectionDomain; -import java.util.logging.Level; -import java.util.logging.Logger; - /** * Modify org.apache.catalina.core.StandardHostValve class * diff --git a/src/main/java/com/profiler/modifier/tomcat/TomcatConnectorModifier.java b/src/main/java/com/profiler/modifier/tomcat/TomcatConnectorModifier.java index 0ade45c61..aa8c4df15 100644 --- a/src/main/java/com/profiler/modifier/tomcat/TomcatConnectorModifier.java +++ b/src/main/java/com/profiler/modifier/tomcat/TomcatConnectorModifier.java @@ -1,19 +1,15 @@ package com.profiler.modifier.tomcat; -import com.profiler.interceptor.Interceptor; -import com.profiler.interceptor.bci.ByteCodeInstrumentor; -import com.profiler.interceptor.bci.InstrumentClass; -import com.profiler.modifier.tomcat.interceptors.ConnectorInitializeInterceptor; -import javassist.CtClass; -import javassist.CtMethod; - -import com.profiler.Agent; -import com.profiler.modifier.AbstractModifier; - import java.security.ProtectionDomain; import java.util.logging.Level; import java.util.logging.Logger; +import com.profiler.Agent; +import com.profiler.interceptor.Interceptor; +import com.profiler.interceptor.bci.ByteCodeInstrumentor; +import com.profiler.interceptor.bci.InstrumentClass; +import com.profiler.modifier.AbstractModifier; + /** * Tomcat connector 정보를 수집하기 위한 modifier * @@ -36,7 +32,7 @@ public class TomcatConnectorModifier extends AbstractModifier { logger.info("Modifing. " + javassistClassName); } try { -// // initialize()할 때 protocol과 port번호를 저장해둔다. + // initialize()할 때 protocol과 port번호를 저장해둔다. Interceptor interceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.profiler.modifier.tomcat.interceptors.ConnectorInitializeInterceptor", new Object[]{agent}); InstrumentClass aClass = this.byteCodeInstrumentor.getClass(javassistClassName); aClass.addInterceptor("initialize", null, interceptor); @@ -51,6 +47,4 @@ public class TomcatConnectorModifier extends AbstractModifier { return null; } } - - } \ No newline at end of file diff --git a/src/main/java/com/profiler/modifier/tomcat/TomcatStandardServiceModifier.java b/src/main/java/com/profiler/modifier/tomcat/TomcatStandardServiceModifier.java index 364aa3e28..dc3c33848 100644 --- a/src/main/java/com/profiler/modifier/tomcat/TomcatStandardServiceModifier.java +++ b/src/main/java/com/profiler/modifier/tomcat/TomcatStandardServiceModifier.java @@ -40,7 +40,6 @@ public class TomcatStandardServiceModifier extends AbstractModifier { byteCodeInstrumentor.checkLibrary(classLoader, javassistClassName); try { - InstrumentClass standardService = byteCodeInstrumentor.getClass(javassistClassName); LifeCycleEventListener lifeCycleEventListener = new LifeCycleEventListener(agent); diff --git a/src/main/java/com/profiler/modifier/tomcat/interceptors/CatalinaAwaitInterceptor.java b/src/main/java/com/profiler/modifier/tomcat/interceptors/CatalinaAwaitInterceptor.java index 5632ae5cc..19d779b46 100644 --- a/src/main/java/com/profiler/modifier/tomcat/interceptors/CatalinaAwaitInterceptor.java +++ b/src/main/java/com/profiler/modifier/tomcat/interceptors/CatalinaAwaitInterceptor.java @@ -1,14 +1,13 @@ package com.profiler.modifier.tomcat.interceptors; +import java.util.Arrays; +import java.util.logging.Level; +import java.util.logging.Logger; + import com.profiler.Agent; import com.profiler.interceptor.StaticBeforeInterceptor; import com.profiler.util.Assert; import com.profiler.util.StringUtils; -import net.spy.memcached.compat.log.LoggerFactory; - -import java.util.Arrays; -import java.util.logging.Level; -import java.util.logging.Logger; /** * diff --git a/src/main/java/com/profiler/modifier/tomcat/interceptors/ConnectorInitializeInterceptor.java b/src/main/java/com/profiler/modifier/tomcat/interceptors/ConnectorInitializeInterceptor.java index e7bafa6c5..fd29ab040 100644 --- a/src/main/java/com/profiler/modifier/tomcat/interceptors/ConnectorInitializeInterceptor.java +++ b/src/main/java/com/profiler/modifier/tomcat/interceptors/ConnectorInitializeInterceptor.java @@ -1,14 +1,15 @@ package com.profiler.modifier.tomcat.interceptors; +import java.util.Arrays; +import java.util.logging.Level; +import java.util.logging.Logger; + +import org.apache.catalina.connector.Connector; + import com.profiler.Agent; import com.profiler.interceptor.StaticAfterInterceptor; import com.profiler.util.Assert; import com.profiler.util.StringUtils; -import org.apache.catalina.connector.Connector; - -import java.util.Arrays; -import java.util.logging.Level; -import java.util.logging.Logger; /** * diff --git a/src/main/java/com/profiler/modifier/tomcat/interceptors/StandardServiceStartInterceptor.java b/src/main/java/com/profiler/modifier/tomcat/interceptors/StandardServiceStartInterceptor.java index fa4d9fcf1..2c26b469d 100644 --- a/src/main/java/com/profiler/modifier/tomcat/interceptors/StandardServiceStartInterceptor.java +++ b/src/main/java/com/profiler/modifier/tomcat/interceptors/StandardServiceStartInterceptor.java @@ -1,14 +1,13 @@ package com.profiler.modifier.tomcat.interceptors; -import com.profiler.LifeCycleEventListener; -import com.profiler.interceptor.StaticAfterInterceptor; -import com.profiler.util.InterceptorUtils; -import com.profiler.util.StringUtils; - import java.util.Arrays; import java.util.logging.Level; import java.util.logging.Logger; +import com.profiler.LifeCycleEventListener; +import com.profiler.interceptor.StaticAfterInterceptor; +import com.profiler.util.StringUtils; + /** * */ @@ -26,9 +25,9 @@ public class StandardServiceStartInterceptor implements StaticAfterInterceptor { if (logger.isLoggable(Level.INFO)) { logger.info("after " + StringUtils.toString(target) + " " + className + "." + methodName + parameterDescription + " args:" + Arrays.toString(args) + " result:" + result); } -// if (!InterceptorUtils.isSuccess(result)) { -// return; -// } + // if (!InterceptorUtils.isSuccess(result)) { + // return; + // } lifeCycleEventListener.start(); } } diff --git a/src/main/java/com/profiler/modifier/tomcat/interceptors/StandardServiceStopInterceptor.java b/src/main/java/com/profiler/modifier/tomcat/interceptors/StandardServiceStopInterceptor.java index 86f81db5f..878e76e4b 100644 --- a/src/main/java/com/profiler/modifier/tomcat/interceptors/StandardServiceStopInterceptor.java +++ b/src/main/java/com/profiler/modifier/tomcat/interceptors/StandardServiceStopInterceptor.java @@ -1,14 +1,13 @@ package com.profiler.modifier.tomcat.interceptors; -import com.profiler.LifeCycleEventListener; -import com.profiler.interceptor.StaticAfterInterceptor; -import com.profiler.util.InterceptorUtils; -import com.profiler.util.StringUtils; - import java.util.Arrays; import java.util.logging.Level; import java.util.logging.Logger; +import com.profiler.LifeCycleEventListener; +import com.profiler.interceptor.StaticAfterInterceptor; +import com.profiler.util.StringUtils; + /** * */ @@ -27,10 +26,10 @@ public class StandardServiceStopInterceptor implements StaticAfterInterceptor { if (logger.isLoggable(Level.INFO)) { logger.info("after " + StringUtils.toString(target) + " " + className + "." + methodName + parameterDescription + " args:" + Arrays.toString(args) + " result:" + result); } - // TODO 시작이 실패했을때 stop이 불러 지는가? -// if (!InterceptorUtils.isSuccess(result)) { -// return; -// } + // TODO 시작이 실패했을때 stop이 불러 지는가? + // if (!InterceptorUtils.isSuccess(result)) { + // return; + // } lifeCycleEventListener.stop(); } } diff --git a/src/main/java/com/profiler/receiver/TCPSocketManager.java b/src/main/java/com/profiler/receiver/TCPSocketManager.java deleted file mode 100644 index 7aa10d2fe..000000000 --- a/src/main/java/com/profiler/receiver/TCPSocketManager.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.profiler.receiver; - -import com.profiler.config.ProfilerConfig; - -import java.io.InputStream; -import java.net.ServerSocket; -import java.net.Socket; - -public class TCPSocketManager extends Thread { - ServerSocket serverSocket = null; - - public TCPSocketManager() { - } - - public void run() { - try { - serverSocket = new ServerSocket(ProfilerConfig.AGENT_TCP_LISTEN_PORT, 100); - System.out.println("*** Start TomcatProfiler TCP Listen Thread ***"); - while (true) { - Socket socket = serverSocket.accept(); - InputStream stream = socket.getInputStream(); - byte[] readData = new byte[1024]; - stream.read(readData); - System.out.println(new String(readData)); - } - // } catch(InterruptedException ie) { - - } catch (Exception e) { - e.printStackTrace(); - } - } -} diff --git a/src/main/java/com/profiler/sender/AgentInfoSender.java b/src/main/java/com/profiler/sender/AgentInfoSender.java deleted file mode 100644 index 3259f4b8e..000000000 --- a/src/main/java/com/profiler/sender/AgentInfoSender.java +++ /dev/null @@ -1,142 +0,0 @@ -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; - -@Deprecated -public class AgentInfoSender extends Thread { - - private final Logger logger = Logger.getLogger(AgentInfoSender.class.getName()); - - private boolean isAgentStart; - private Socket requestSocket = null; - - public AgentInfoSender(boolean isAgentStart) { - this.isAgentStart = isAgentStart; - } - - public void run() { - logger.info("send agent info"); - - if (isAgentStart) { - sendAgentStartInfo(); - } else { - sendAgentStopInfo(); - } - } - - private void sendAgentStopInfo() { - try { - connectToServer(); - - Agent agent = Agent.getInstance(); - String ip = agent.getServerInfo().getHostip(); - String portNumbers = ""; - for (Entry entry : agent.getServerInfo().getConnectors().entrySet()) { - portNumbers += " " + entry.getKey(); - } - - AgentInfoDTO dto = new AgentInfoDTO(ip, portNumbers); - - dto.setIsDead(); - - if (logger.isLoggable(Level.INFO)) { - logger.info("send agent stop info. " + dto.toString()); - } - - ObjectOutputStream stream = new ObjectOutputStream(requestSocket.getOutputStream()); - stream.writeObject(dto); - stream.close(); - } catch (Exception e) { - if (logger.isLoggable(Level.WARNING)) { - logger.log(Level.WARNING, "AgentInfoSender Exception occured:" + e.getMessage(), e); - } - } finally { - closeSocket(); - } - } - - private void sendAgentStartInfo() { - while (connectToServer()) { - try { - Thread.sleep(ProfilerConfig.SERVER_CONNECT_RETRY_GAP); - } catch (Exception e) { - e.printStackTrace(); - } - } - - try { - Agent agent = Agent.getInstance(); - String ip = agent.getServerInfo().getHostip(); - String portNumbers = ""; - for (Entry entry : agent.getServerInfo().getConnectors().entrySet()) { - portNumbers += " " + entry.getKey(); - } - - AgentInfoDTO dto = new AgentInfoDTO(ip, portNumbers); - - if (logger.isLoggable(Level.INFO)) { - logger.info("send agent startup info. " + dto.toString()); - } - - ObjectOutputStream stream = new ObjectOutputStream(requestSocket.getOutputStream()); - stream.writeObject(dto); - stream.close(); - } catch (Exception e) { - e.printStackTrace(); - } - - if (requestSocket != null) { - closeSocket(); - } - } - - private boolean connectToServer() { - try { - if (logger.isLoggable(Level.INFO)) { - logger.info("Trying to connect server. " + ProfilerConfig.SERVER_IP + ":" + ProfilerConfig.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. " + 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. " + 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. " + ProfilerConfig.SERVER_IP + ":" + ProfilerConfig.SERVER_TCP_LISTEN_PORT, e); - } - return true; - } - } - - private void closeSocket() { - try { - if (requestSocket != null) { - requestSocket.close(); - logger.info("TCP RequestSocket is closed"); - } else { - logger.info("TCP RequestSocket is already closed"); - } - } catch (Exception e) { - if (logger.isLoggable(Level.WARNING)) { - logger.log(Level.WARNING, "closeSocket(). " + e.getMessage(), e); - } - } - } -} diff --git a/src/test/java/com/profiler/SystemMonitorTest.java b/src/test/java/com/profiler/SystemMonitorTest.java index 70dcbcafb..52a04c991 100644 --- a/src/test/java/com/profiler/SystemMonitorTest.java +++ b/src/test/java/com/profiler/SystemMonitorTest.java @@ -1,5 +1,6 @@ package com.profiler; +import com.profiler.config.ProfilerConfig; import com.profiler.context.TraceContext; import com.profiler.sender.DataSender; import com.profiler.sender.LoggingDataSender; @@ -17,7 +18,9 @@ public class SystemMonitorTest { public void testStart() throws Exception { DataSender loggingDataSender = new LoggingDataSender(); TraceContext traceContext = new TraceContext(); - SystemMonitor systemMonitor = new SystemMonitor(traceContext); + ProfilerConfig profilerConfig = new ProfilerConfig(); + + SystemMonitor systemMonitor = new SystemMonitor(traceContext, profilerConfig); systemMonitor.setDataSender(loggingDataSender); systemMonitor.start(); diff --git a/src/test/resources/hippo.config b/src/test/resources/hippo.config index 69022a613..7e81a6102 100644 --- a/src/test/resources/hippo.config +++ b/src/test/resources/hippo.config @@ -1,33 +1,26 @@ -SERVER_IP= 10.64.84.188 -#SERVER_IP= 10.66.18.78 -#SERVER_IP= 127.0.0.1 -SERVER_UDP_PORT=9995 +server.collector.ip=10.64.84.188 +#server.collector.ip=127.0.0.1 +server.collector.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; +profile.enable=true +profile.jdbc=true +profile.jdbc.mysql=true +profile.jdbc.mssql=true +profile.jdbc.oracle=true +profile.jdbc.cubrid=true +profile.jdbc.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 +profile.jvm.collect.interval=1000 #timebase 샘플링을 할지 말지 여부 결정. sampling.elapsedtimebase.enable= true + #timebase 샘플링 시의 1개 thread에 축정할 트레이스 데이터의 갯수. sampling.elapsedtimebase.buffersize=20 + #timebase 샘플링시 discard.timelimit 의 시간보다 작을 경우 트레이스 데이터를 버릴지 말지 여부 sampling.elapsedtimebase.discard=true + #timebase 샘플링시 discard.timelimit 해당 시간보다 빨리 끝났을 경우 트레이스 데이터를 버려 버린다. sampling.elapsedtimebase.discard.timelimit=1000 \ No newline at end of file