diff --git a/src/main/java/com/profiler/Agent.java b/src/main/java/com/profiler/Agent.java index 0fca83682..d9296279c 100644 --- a/src/main/java/com/profiler/Agent.java +++ b/src/main/java/com/profiler/Agent.java @@ -23,23 +23,33 @@ public class Agent { private final SystemMonitor systemMonitor; private final String agentId; + private final String nodeName; private final String applicationName; // private boolean validate = true; private Agent() { this.serverInfo = new ServerInfo(); this.systemMonitor = new SystemMonitor(); + +// this.agentId = getId("hippo.agentId", "UnkonwnAgentId"); +// 일단 임시로 호환성을 위해 agentid에 머신name을넣도록 하자 String machineName = NetworkUtils.getMachineName(); - this.agentId = System.getProperty("hippo.agentId", machineName); - validateAgentId(); - this.applicationName = System.getProperty("hippo.applicationName", "TOMCAT"); + this.agentId = getId("hippo.agentId", machineName); + this.nodeName = getId("hippo.nodeName", machineName); + this.applicationName = getId("hippo.applicationName", "UnknownApplicationName"); } - private void validateAgentId() { + private String getId(String key, String defaultValue) { + String value = System.getProperty(key, defaultValue); + validateId(value, key); + return value; + } + + private void validateId(String id, String idName) { try { - byte[] bytes = agentId.getBytes("UTF-8"); + byte[] bytes = id.getBytes("UTF-8"); if (bytes.length > SpanUtils.AGENT_NAME_LIMIT) { - logger.warning("AgentId is too long(1~24) " + agentId); + logger.warning(idName + " is too long(1~24) " + agentId); } // validate = false; // TODO 이거 후처리를 어떻게 해야 될지. agent를 시작 시키지 않아야 될거 같은데. lifecycle이 이쪽저쪽에 퍼져 있어서 일관된 stop에 문제가 있음.. diff --git a/src/main/java/com/profiler/modifier/DefaultModifierRegistry.java b/src/main/java/com/profiler/modifier/DefaultModifierRegistry.java index 7930ad27e..43b19d270 100644 --- a/src/main/java/com/profiler/modifier/DefaultModifierRegistry.java +++ b/src/main/java/com/profiler/modifier/DefaultModifierRegistry.java @@ -90,11 +90,11 @@ public class DefaultModifierRegistry implements ModifierRegistry { if (profilerConfig.isJdbcProfileOracle()) { addOracleDriver(); } - if(profilerConfig.isJdbcProfileCubrid()) { + if (profilerConfig.isJdbcProfileCubrid()) { addCubridDriver(); } - if(profilerConfig.isJdbcProfileDbcp()) { + if (profilerConfig.isJdbcProfileDbcp()) { addDbcpDriver(); } } @@ -102,6 +102,10 @@ public class DefaultModifierRegistry implements ModifierRegistry { private void addMySqlDriver() { // TODO MySqlDriver는 버전별로 Connection이 interface인지 class인지가 다름. 문제 없는지 // 확인필요. + + Modifier mysqlNonRegisteringDriverModifier = new MySQLNonRegisteringDriverModifier(byteCodeInstrumentor); + addModifier(mysqlNonRegisteringDriverModifier); + Modifier mysqlConnectionImplModifier = new MySQLConnectionImplModifier(byteCodeInstrumentor); addModifier(mysqlConnectionImplModifier); diff --git a/src/main/java/com/profiler/modifier/db/interceptor/DriverInterceptor.java b/src/main/java/com/profiler/modifier/db/interceptor/DriverInterceptor.java new file mode 100644 index 000000000..6bf816ab6 --- /dev/null +++ b/src/main/java/com/profiler/modifier/db/interceptor/DriverInterceptor.java @@ -0,0 +1,51 @@ +package com.profiler.modifier.db.interceptor; + +import com.profiler.interceptor.StaticAfterInterceptor; +import com.profiler.interceptor.StaticAroundInterceptor; +import com.profiler.util.InterceptorUtils; +import com.profiler.util.MetaObject; +import com.profiler.util.StringUtils; + +import java.sql.Connection; +import java.util.Arrays; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * + */ +public class DriverInterceptor implements StaticAroundInterceptor { + + private final Logger logger = Logger.getLogger(ConnectionCreateInterceptor.class.getName()); + private final MetaObject setUrl = new MetaObject("__setUrl", String.class); + + @Override + public void before(Object target, String className, String methodName, String parameterDescription, Object[] args) { + if (logger.isLoggable(Level.INFO)) { + logger.info("before " + StringUtils.toString(target) + " " + className + "." + methodName + parameterDescription + " args:" + Arrays.toString(args)); + } + JDBCScope.pushScope(); + } + + @Override + public void after(Object target, String className, String methodName, String parameterDescription, Object[] args, Object result) { + if (logger.isLoggable(Level.INFO)) { + logger.info("after " + StringUtils.toString(target) + " " + className + "." + methodName + parameterDescription + " args:" + Arrays.toString(args) + " result:" + result); + } + JDBCScope.popScope(); + // TODO 생성 시간 측정시 아래 코드를 다시 생각해야 됨. + if (!InterceptorUtils.isSuccess(result)) { + return; + } + // TODO before도 같이 후킹하여 Connection 생성시간도 측정해야 됨. + // datasource의 pool을 고려할것. + if (result instanceof Connection) { + Object url = args[0]; + if (url instanceof String) { + this.setUrl.invoke(result, url); + } + } + } + + +} diff --git a/src/main/java/com/profiler/modifier/db/interceptor/JDBCScope.java b/src/main/java/com/profiler/modifier/db/interceptor/JDBCScope.java new file mode 100644 index 000000000..c791d7074 --- /dev/null +++ b/src/main/java/com/profiler/modifier/db/interceptor/JDBCScope.java @@ -0,0 +1,28 @@ +package com.profiler.modifier.db.interceptor; + +import com.profiler.util.NamedThreadLocal; + +/** + * + */ +public class JDBCScope { + private static NamedThreadLocal scope = new NamedThreadLocal("JDBCScope") { + @Override + protected Boolean initialValue() { + return false; + } + }; + + public static void pushScope() { + scope.set(true); + } + + public static boolean isInternal() { + return scope.get(); + } + + public static void popScope() { + scope.set(false); + } + +} diff --git a/src/main/java/com/profiler/modifier/db/interceptor/PreparedStatementExecuteQueryInterceptor.java b/src/main/java/com/profiler/modifier/db/interceptor/PreparedStatementExecuteQueryInterceptor.java index 715efe31d..95abb7fde 100644 --- a/src/main/java/com/profiler/modifier/db/interceptor/PreparedStatementExecuteQueryInterceptor.java +++ b/src/main/java/com/profiler/modifier/db/interceptor/PreparedStatementExecuteQueryInterceptor.java @@ -29,6 +29,9 @@ public class PreparedStatementExecuteQueryInterceptor implements StaticAroundInt if (logger.isLoggable(Level.INFO)) { logger.info("before " + StringUtils.toString(target) + " " + className + "." + methodName + parameterDescription + " args:" + Arrays.toString(args)); } + if (JDBCScope.isInternal()) { + return; + } if (Trace.getCurrentTraceId() == null) { return; } @@ -79,6 +82,9 @@ public class PreparedStatementExecuteQueryInterceptor implements StaticAroundInt if (logger.isLoggable(Level.INFO)) { logger.info("after " + StringUtils.toString(target) + " " + className + "." + methodName + parameterDescription + " args:" + Arrays.toString(args) + " result:" + result); } + if (JDBCScope.isInternal()) { + return; + } if (Trace.getCurrentTraceId() == null) { return; } diff --git a/src/main/java/com/profiler/modifier/db/interceptor/StatementExecuteQueryInterceptor.java b/src/main/java/com/profiler/modifier/db/interceptor/StatementExecuteQueryInterceptor.java index d1365a99d..25f5d366e 100644 --- a/src/main/java/com/profiler/modifier/db/interceptor/StatementExecuteQueryInterceptor.java +++ b/src/main/java/com/profiler/modifier/db/interceptor/StatementExecuteQueryInterceptor.java @@ -26,11 +26,15 @@ public class StatementExecuteQueryInterceptor implements StaticAroundInterceptor if (logger.isLoggable(Level.INFO)) { logger.info("before " + StringUtils.toString(target) + " " + className + "." + methodName + parameterDescription + " args:" + Arrays.toString(args)); } - + new Exception("executeQuery").printStackTrace(); + ; + if (JDBCScope.isInternal()) { + return; + } if (Trace.getCurrentTraceId() == null) { return; } - + Trace.traceBlockBegin(); try { @@ -63,7 +67,9 @@ public class StatementExecuteQueryInterceptor implements StaticAroundInterceptor if (logger.isLoggable(Level.INFO)) { logger.info("after " + StringUtils.toString(target) + " " + className + "." + methodName + parameterDescription + " args:" + Arrays.toString(args) + " result:" + result); } - + if (JDBCScope.isInternal()) { + return; + } if (Trace.getCurrentTraceId() == null) { return; } diff --git a/src/main/java/com/profiler/modifier/db/interceptor/StatementExecuteUpdateInterceptor.java b/src/main/java/com/profiler/modifier/db/interceptor/StatementExecuteUpdateInterceptor.java index 98daecb34..d00a97bda 100644 --- a/src/main/java/com/profiler/modifier/db/interceptor/StatementExecuteUpdateInterceptor.java +++ b/src/main/java/com/profiler/modifier/db/interceptor/StatementExecuteUpdateInterceptor.java @@ -27,7 +27,9 @@ public class StatementExecuteUpdateInterceptor implements StaticAroundIntercepto if (logger.isLoggable(Level.INFO)) { logger.info("before " + StringUtils.toString(target) + " " + className + "." + methodName + parameterDescription + " args:" + Arrays.toString(args)); } - + if (JDBCScope.isInternal()) { + return; + } if (Trace.getCurrentTraceId() == null) { return; } @@ -40,8 +42,8 @@ public class StatementExecuteUpdateInterceptor implements StaticAroundIntercepto Trace.recordAttibute("Query", url); Trace.recordTerminalEndPoint(url); } else { - Trace.recordRpcName("MYSQL", "UNKNOWN"); - Trace.recordTerminalEndPoint("UNKNOWN"); + Trace.recordRpcName("MYSQL", "UNKNOWN"); + Trace.recordTerminalEndPoint("UNKNOWN"); } Trace.record(Annotation.ClientSend); @@ -61,6 +63,9 @@ public class StatementExecuteUpdateInterceptor implements StaticAroundIntercepto if (logger.isLoggable(Level.INFO)) { logger.info("after " + StringUtils.toString(target) + " " + className + "." + methodName + parameterDescription + " args:" + Arrays.toString(args) + " result:" + result); } + if (JDBCScope.isInternal()) { + return; + } if (Trace.getCurrentTraceId() == null) { return; } diff --git a/src/main/java/com/profiler/modifier/db/interceptor/TransactionInterceptor.java b/src/main/java/com/profiler/modifier/db/interceptor/TransactionInterceptor.java index 189f14790..e8468ad4d 100644 --- a/src/main/java/com/profiler/modifier/db/interceptor/TransactionInterceptor.java +++ b/src/main/java/com/profiler/modifier/db/interceptor/TransactionInterceptor.java @@ -23,6 +23,9 @@ public class TransactionInterceptor implements StaticAroundInterceptor { if (logger.isLoggable(Level.INFO)) { logger.info("before " + StringUtils.toString(target) + " " + className + "." + methodName + parameterDescription + " args:" + Arrays.toString(args)); } + if (JDBCScope.isInternal()) { + return; + } if (Trace.getCurrentTraceId() == null) { return; } @@ -43,6 +46,9 @@ public class TransactionInterceptor implements StaticAroundInterceptor { if (logger.isLoggable(Level.INFO)) { logger.info("after " + StringUtils.toString(target) + " " + className + "." + methodName + parameterDescription + " args:" + Arrays.toString(args) + " result:" + result); } + if (JDBCScope.isInternal()) { + return; + } if (Trace.getCurrentTraceId() == null) { return; } @@ -88,9 +94,9 @@ public class TransactionInterceptor implements StaticAroundInterceptor { Trace.record(Annotation.ClientRecv); } else { if (success) { - Trace.recordAttibute("Transaction", "state restore"); + Trace.recordAttibute("Transaction", "autoCommit:false"); } else { - Trace.recordAttibute("Transaction", "state restore fail"); + Trace.recordAttibute("Transaction", "autoCommit:false fail"); Throwable th = (Throwable) result; Trace.recordAttibute("Exception", th.getMessage()); } diff --git a/src/main/java/com/profiler/modifier/db/mysql/MySQLConnectionImplModifier.java b/src/main/java/com/profiler/modifier/db/mysql/MySQLConnectionImplModifier.java index bbb9906e7..efecb8c8f 100644 --- a/src/main/java/com/profiler/modifier/db/mysql/MySQLConnectionImplModifier.java +++ b/src/main/java/com/profiler/modifier/db/mysql/MySQLConnectionImplModifier.java @@ -14,33 +14,33 @@ import java.util.logging.Logger; public class MySQLConnectionImplModifier extends AbstractModifier { - private final Logger logger = Logger.getLogger(MySQLConnectionImplModifier.class.getName()); + private final Logger logger = Logger.getLogger(MySQLConnectionImplModifier.class.getName()); - public MySQLConnectionImplModifier(ByteCodeInstrumentor byteCodeInstrumentor) { - super(byteCodeInstrumentor); - } + public MySQLConnectionImplModifier(ByteCodeInstrumentor byteCodeInstrumentor) { + super(byteCodeInstrumentor); + } - public String getTargetClass() { - return "com/mysql/jdbc/ConnectionImpl"; - } - - public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { - if (logger.isLoggable(Level.INFO)){ - logger.info("Modifing. " + javassistClassName); + public String getTargetClass() { + return "com/mysql/jdbc/ConnectionImpl"; + } + + public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { + if (logger.isLoggable(Level.INFO)) { + logger.info("Modifing. " + javassistClassName); } - checkLibrary(classLoader, javassistClassName); - try { + checkLibrary(classLoader, javassistClassName); + try { InstrumentClass mysqlConnection = byteCodeInstrumentor.getClass(javassistClassName); mysqlConnection.addTraceVariable("__url", "__setUrl", "__getUrl", "java.lang.String"); // 해당 Interceptor를 공통클래스 만들경우 system에 로드해야 된다. - Interceptor createConnection = new ConnectionCreateInterceptor(); - String[] params = new String[] { - "java.lang.String", "int", "java.util.Properties", "java.lang.String", "java.lang.String" - }; - mysqlConnection.addInterceptor("getInstance", params, createConnection); +// Interceptor createConnection = new ConnectionCreateInterceptor(); +// String[] params = new String[] { +// "java.lang.String", "int", "java.util.Properties", "java.lang.String", "java.lang.String" +// }; +// mysqlConnection.addInterceptor("getInstance", params, createConnection); Interceptor closeConnection = new ConnectionCloseInterceptor(); @@ -59,16 +59,16 @@ public class MySQLConnectionImplModifier extends AbstractModifier { mysqlConnection.reuseInterceptor("commit", null, interceptorId); mysqlConnection.reuseInterceptor("rollback", null, interceptorId); - printClassConvertComplete(javassistClassName); + printClassConvertComplete(javassistClassName); - return mysqlConnection.toBytecode(); - } catch (InstrumentException e) { + return mysqlConnection.toBytecode(); + } catch (InstrumentException e) { if (logger.isLoggable(Level.WARNING)) { - logger.log(Level.WARNING, this.getClass().getSimpleName() + " modify fail. Cause:" + e.getMessage(), e); + logger.log(Level.WARNING, this.getClass().getSimpleName() + " modify fail. Cause:" + e.getMessage(), e); } return null; - } - } + } + } } diff --git a/src/main/java/com/profiler/modifier/db/mysql/MySQLNonRegisteringDriverModifier.java b/src/main/java/com/profiler/modifier/db/mysql/MySQLNonRegisteringDriverModifier.java new file mode 100644 index 000000000..acd5cd984 --- /dev/null +++ b/src/main/java/com/profiler/modifier/db/mysql/MySQLNonRegisteringDriverModifier.java @@ -0,0 +1,55 @@ +package com.profiler.modifier.db.mysql; + +import com.mysql.jdbc.NonRegisteringDriver; +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.modifier.db.interceptor.*; + +import java.security.ProtectionDomain; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * + */ +public class MySQLNonRegisteringDriverModifier extends AbstractModifier { + + private final Logger logger = Logger.getLogger(MySQLConnectionImplModifier.class.getName()); + + public MySQLNonRegisteringDriverModifier(ByteCodeInstrumentor byteCodeInstrumentor) { + super(byteCodeInstrumentor); + } + + public String getTargetClass() { + return "com/mysql/jdbc/NonRegisteringDriver"; + } + + public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { + if (logger.isLoggable(Level.INFO)) { + logger.info("Modifing. " + javassistClassName); + } + checkLibrary(classLoader, javassistClassName); + try { + InstrumentClass mysqlConnection = byteCodeInstrumentor.getClass(javassistClassName); + + + Interceptor createConnection = new DriverInterceptor(); + String[] params = new String[]{ + "java.lang.String", "java.util.Properties" + }; + mysqlConnection.addInterceptor("connect", params, createConnection); + + printClassConvertComplete(javassistClassName); + + return mysqlConnection.toBytecode(); + } catch (InstrumentException e) { + if (logger.isLoggable(Level.WARNING)) { + logger.log(Level.WARNING, this.getClass().getSimpleName() + " modify fail. Cause:" + e.getMessage(), e); + } + return null; + } + } +} 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 3bfc0d482..f31f65777 100644 --- a/src/main/java/com/profiler/modifier/db/mysql/MySQLPreparedStatementModifier.java +++ b/src/main/java/com/profiler/modifier/db/mysql/MySQLPreparedStatementModifier.java @@ -23,30 +23,31 @@ import java.util.logging.Level; import java.util.logging.Logger; public class MySQLPreparedStatementModifier extends AbstractModifier { - private final Logger logger = Logger.getLogger(MySQLPreparedStatementModifier.class.getName()); - private final String[] excludes = new String[] { "setRowId", "setNClob", "setSQLXML" }; + private final Logger logger = Logger.getLogger(MySQLPreparedStatementModifier.class.getName()); + private final String[] excludes = new String[]{"setRowId", "setNClob", "setSQLXML"}; - public MySQLPreparedStatementModifier(ByteCodeInstrumentor byteCodeInstrumentor) { - super(byteCodeInstrumentor); - } + public MySQLPreparedStatementModifier(ByteCodeInstrumentor byteCodeInstrumentor) { + super(byteCodeInstrumentor); + } - public String getTargetClass() { - return "com/mysql/jdbc/PreparedStatement"; + public String getTargetClass() { + return "com/mysql/jdbc/PreparedStatement"; // 상속관계일 경우 byte코드를 수정할 객체를 타겟으로해야 됨. // return "com/mysql/jdbc/JDBC4PreparedStatement"; - } + } - public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { - if (logger.isLoggable(Level.INFO)) { - logger.info("Modifing. " + javassistClassName); - } + public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { + if (logger.isLoggable(Level.INFO)) { + logger.info("Modifing. " + javassistClassName); + } - checkLibrary(classLoader, javassistClassName); + checkLibrary(classLoader, javassistClassName); try { InstrumentClass preparedStatement = byteCodeInstrumentor.getClass(javassistClassName); Interceptor interceptor = new PreparedStatementExecuteQueryInterceptor(); - preparedStatement.addInterceptor("executeQuery", null, interceptor); + int id = preparedStatement.addInterceptor("executeQuery", null, interceptor); + preparedStatement.reuseInterceptor("executeUpdate", null, id); preparedStatement.addTraceVariable("__url", "__setUrl", "__getUrl", "java.lang.String"); preparedStatement.addTraceVariable("__sql", "__setSql", "__getSql", "java.lang.String"); @@ -57,7 +58,7 @@ public class MySQLPreparedStatementModifier extends AbstractModifier { return preparedStatement.toBytecode(); } catch (InstrumentException e) { if (logger.isLoggable(Level.WARNING)) { - logger.log(Level.WARNING, this.getClass().getSimpleName() + " modify fail. Cause:" + e.getMessage(), e); + logger.log(Level.WARNING, this.getClass().getSimpleName() + " modify fail. Cause:" + e.getMessage(), e); } return null; } @@ -74,7 +75,7 @@ public class MySQLPreparedStatementModifier extends AbstractModifier { // aClass.addInterceptor("executeQuery", null, interceptor); // return changeMethod(javassistClassName, classFileBuffer); - } + } private void bindVariableIntercept(InstrumentClass preparedStatement, ClassLoader classLoader, ProtectionDomain protectedDomain) throws InstrumentException { ExcludeBindVariableFilter exclude = new ExcludeBindVariableFilter(excludes); @@ -102,17 +103,17 @@ public class MySQLPreparedStatementModifier extends AbstractModifier { } - private void updateConstructor(CtClass cc) throws Exception { - CtConstructor[] constructorList = cc.getConstructors(); - if (constructorList.length == 3) { - for (CtConstructor constructor : constructorList) { - CtClass params[] = constructor.getParameterTypes(); - if (params.length == 3) { - constructor.insertBefore("{" + DatabaseRequestTracer.FQCN + ".putSqlQuery(" + ProfilerConstant.REQ_DATA_TYPE_DB_QUERY + ",$2); }"); - } - } - } - } + private void updateConstructor(CtClass cc) throws Exception { + CtConstructor[] constructorList = cc.getConstructors(); + if (constructorList.length == 3) { + for (CtConstructor constructor : constructorList) { + CtClass params[] = constructor.getParameterTypes(); + if (params.length == 3) { + constructor.insertBefore("{" + DatabaseRequestTracer.FQCN + ".putSqlQuery(" + ProfilerConstant.REQ_DATA_TYPE_DB_QUERY + ",$2); }"); + } + } + } + } } diff --git a/src/main/java/com/profiler/modifier/tomcat/TomcatConnectorModifier.java b/src/main/java/com/profiler/modifier/tomcat/TomcatConnectorModifier.java index fc6af7742..2b669c4fb 100644 --- a/src/main/java/com/profiler/modifier/tomcat/TomcatConnectorModifier.java +++ b/src/main/java/com/profiler/modifier/tomcat/TomcatConnectorModifier.java @@ -13,46 +13,45 @@ import java.util.logging.Logger; /** * Tomcat connector 정보를 수집하기 위한 modifier - * - * @author netspider * + * @author netspider */ public class TomcatConnectorModifier extends AbstractModifier { - private final Logger logger = Logger.getLogger(TomcatConnectorModifier.class.getName()); + private final Logger logger = Logger.getLogger(TomcatConnectorModifier.class.getName()); - public TomcatConnectorModifier(ByteCodeInstrumentor byteCodeInstrumentor) { - super(byteCodeInstrumentor); - } + public TomcatConnectorModifier(ByteCodeInstrumentor byteCodeInstrumentor) { + super(byteCodeInstrumentor); + } - public String getTargetClass() { - return "org/apache/catalina/connector/Connector"; - } + public String getTargetClass() { + return "org/apache/catalina/connector/Connector"; + } - public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { - if (logger.isLoggable(Level.INFO)) { - logger.info("Modifing. " + javassistClassName); - } - return changeMethod(javassistClassName, classFileBuffer); - } + public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { + if (logger.isLoggable(Level.INFO)) { + logger.info("Modifing. " + javassistClassName); + } + return changeMethod(javassistClassName, classFileBuffer); + } - public byte[] changeMethod(String javassistClassName, byte[] classfileBuffer) { - try { - CtClass cc = classPool.get(javassistClassName); + public byte[] changeMethod(String javassistClassName, byte[] classfileBuffer) { + try { + CtClass cc = classPool.get(javassistClassName); - // initialize()할 때 protocol과 port번호를 저장해둔다. - CtMethod initializeMethod = cc.getDeclaredMethod("initialize", null); - initializeMethod.insertAfter("{" + Agent.FQCN + ".getInstance().getServerInfo().addConnector(getProtocol(), getPort()); }"); + // initialize()할 때 protocol과 port번호를 저장해둔다. + CtMethod initializeMethod = cc.getDeclaredMethod("initialize", null); + initializeMethod.insertAfter("{" + Agent.FQCN + ".getInstance().getServerInfo().addConnector(getProtocol(), getPort()); }"); - printClassConvertComplete(javassistClassName); + printClassConvertComplete(javassistClassName); - return cc.toBytecode(); - } catch (Exception e) { - if (logger.isLoggable(Level.WARNING)) { - logger.log(Level.WARNING, e.getMessage(), e); - } - } - // TODO 변환 실패에 의한 예가 아니면 원본을 반환 해줘야 할까? - return null; - } + return cc.toBytecode(); + } catch (Exception e) { + if (logger.isLoggable(Level.WARNING)) { + logger.log(Level.WARNING, e.getMessage(), e); + } + } + + return null; + } } \ No newline at end of file