From 44a06bcdf6f072b19bfbd4202cd0c3a8e0f510a7 Mon Sep 17 00:00:00 2001 From: Woonduk Kang Date: Thu, 11 Apr 2013 06:27:36 +0000 Subject: [PATCH] =?UTF-8?q?[=EA=B0=95=EC=9A=B4=EB=8D=95]=20[LUCYSUS-1744]?= =?UTF-8?q?=20classLoader=EB=B3=84=EB=A1=9C=20=EB=B6=84=EB=A6=AC=EB=90=9C?= =?UTF-8?q?=20=EC=BD=94=EB=93=9C=20=EC=BB=A4=EB=B0=8B.?= 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@1427 84d0f5b1-2673-498c-a247-62c4ff18d310 --- pom.xml | 91 +++++- .../java/com/profiler/AgentBootStrap.java | 11 - .../ClassFileTransformerDispatcher.java | 92 ++++++ src/main/java/com/profiler/DefaultAgent.java | 293 ++++++++++++++++++ .../java/com/profiler/TomcatProfiler.java | 122 +------- .../com/profiler/context/DeadlineSpanMap.java | 8 +- .../profiler/context/DefaultAsyncTrace.java | 199 ++++++++++++ .../com/profiler/context/DefaultTrace.java | 11 +- .../com/profiler/context/DefaultTraceID.java | 127 ++++++++ .../com/profiler/context/GlobalCallTrace.java | 6 +- src/main/java/com/profiler/context/Span.java | 11 +- .../java/com/profiler/context/SpanEvent.java | 11 +- .../interceptor/bci/ByteCodeInstrumentor.java | 5 +- .../profiler/logger/Slf4jLoggerAdapter.java | 289 +++++++++++++++++ .../profiler/logger/Slf4jLoggerBinder.java | 40 +++ .../profiler/modifier/AbstractModifier.java | 21 +- .../modifier/DefaultModifierRegistry.java | 13 +- .../profiler/modifier/ModifierRegistry.java | 1 + .../BaseOperationCancelInterceptor.java | 15 +- ...seOperationTransitionStateInterceptor.java | 32 +- .../ExecuteMethodInterceptor.java | 56 ++-- .../Execute2MethodInterceptor.java | 21 +- .../interceptor/ExecuteMethodInterceptor.java | 22 +- .../interceptor/ConnectMethodInterceptor.java | 22 +- .../ConnectionCloseInterceptor.java | 10 +- .../DataSourceGetConnectionInterceptor.java | 9 +- .../interceptors/DoXXXInterceptor.java | 42 ++- .../StandardHostValveInvokeInterceptor.java | 44 ++- .../com/profiler/trace/RequestTracer.java | 9 +- .../com/profiler/util/ReflectionUtils.java | 15 - .../com/profiler/AgentClassLoaderTest.java | 6 +- .../profiler/config/ProfilerConfigTest.java | 44 --- .../com/profiler/context/CallStackTest.java | 2 +- .../java/com/profiler/context/TraceTest.java | 4 +- .../MySQLConnectionImplModifierTest.java | 14 +- 35 files changed, 1344 insertions(+), 374 deletions(-) delete mode 100644 src/main/java/com/profiler/AgentBootStrap.java create mode 100644 src/main/java/com/profiler/ClassFileTransformerDispatcher.java create mode 100644 src/main/java/com/profiler/DefaultAgent.java create mode 100644 src/main/java/com/profiler/context/DefaultAsyncTrace.java create mode 100644 src/main/java/com/profiler/context/DefaultTraceID.java create mode 100644 src/main/java/com/profiler/logger/Slf4jLoggerAdapter.java create mode 100644 src/main/java/com/profiler/logger/Slf4jLoggerBinder.java delete mode 100644 src/main/java/com/profiler/util/ReflectionUtils.java delete mode 100644 src/test/java/com/profiler/config/ProfilerConfigTest.java diff --git a/pom.xml b/pom.xml index e0995b590..fea69f4a8 100644 --- a/pom.xml +++ b/pom.xml @@ -7,6 +7,11 @@ hippo tomcat profiler jar + + ${thrift.executable.property} + 3.1.2.RELEASE + + nhn.release.repository @@ -71,6 +76,13 @@ + + com.nhn.hippo + hippo-profiler-bootstrap + 0.0.2 + compile + + com.nhncorp.lucy @@ -194,7 +206,7 @@ org.slf4j slf4j-api 1.6.6 - test + compile @@ -207,13 +219,13 @@ org.slf4j slf4j-log4j12 1.6.6 - test + compile log4j log4j 1.2.16 - test + compile @@ -263,7 +275,7 @@ true true UTF-8 - true + @@ -282,7 +294,7 @@ org.apache.maven.plugins maven-surefire-plugin - 2.12.4 + 2.14 **/Mock* @@ -292,6 +304,75 @@ + + + org.codehaus.mojo + properties-maven-plugin + + + initialize + + read-project-properties + + + + thrift.properties + + + + + + + + + + + withThrift + + + + maven-antrun-plugin + + + generate-sources + generate-sources + + + + + + + + + + + + + + + + + + + + + + + + + + + + + run + + + + + + + + diff --git a/src/main/java/com/profiler/AgentBootStrap.java b/src/main/java/com/profiler/AgentBootStrap.java deleted file mode 100644 index 96fb4382c..000000000 --- a/src/main/java/com/profiler/AgentBootStrap.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.profiler; - -/** - * - */ -public class AgentBootStrap { - void boot() { - System.out.println(this.getClass().getClassLoader()); - - } -} diff --git a/src/main/java/com/profiler/ClassFileTransformerDispatcher.java b/src/main/java/com/profiler/ClassFileTransformerDispatcher.java new file mode 100644 index 000000000..977214cf8 --- /dev/null +++ b/src/main/java/com/profiler/ClassFileTransformerDispatcher.java @@ -0,0 +1,92 @@ +package com.profiler; + +import com.profiler.config.ProfilerConfig; +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.security.ProtectionDomain; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * + */ +public class ClassFileTransformerDispatcher implements ClassFileTransformer { + + private Logger logger = Logger.getLogger(this.getClass().getName()); + private boolean isFine = logger.isLoggable(Level.FINE); + + private ModifierRegistry modifierRegistry; + + private Agent agent; + + private ProfilerConfig profilerConfig; + + + public ClassFileTransformerDispatcher(Agent agent) { + if(agent == null) { + throw new NullPointerException("agent must not be null"); + } + this.agent = agent; + this.profilerConfig = agent.getProfilerConfig(); + this.modifierRegistry = createModifierRegistry(); + } + + @Override + public byte[] transform(ClassLoader classLoader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classFileBuffer) throws IllegalClassFormatException { + // fast java class skip + if (className.startsWith("java")) { + if (className.startsWith("/", 4) || className.startsWith("x/", 4)) { + return classFileBuffer; + } + } + Modifier findModifier = this.modifierRegistry.findModifier(className); + if (findModifier == null) { + // TODO : 디버그 용도로 추가함 + // TODO : modifier가 중복 적용되면 어떻게 되지??? + if (this.profilerConfig.isProfilableClass(className)) { + // 테스트 장비에서 callstack view가 잘 보이는지 확인하려고 추가함. + findModifier = this.modifierRegistry.findModifier("*"); + } else { + return null; + } + } + + if (isFine) { + logger.fine("[transform] cl" + classLoader + " className:" + className + " Modifier:" + findModifier.getClass().getName()); + } + String javassistClassName = className.replace('/', '.'); + + try { + return findModifier.modify(classLoader, javassistClassName, protectionDomain, classFileBuffer); + + } catch (Throwable e) { + logger.log(Level.SEVERE, "Modifier:" + findModifier.getTargetClass() + " modify fail. Cause:" + e.getMessage(), e); + return null; + } + } + + + private ModifierRegistry createModifierRegistry() { + DefaultModifierRegistry modifierRepository = new DefaultModifierRegistry(agent); + + modifierRepository.addMethodModifier(); + + modifierRepository.addTomcatModifier(); + + // jdbc + modifierRepository.addJdbcModifier(); + + // rpc + modifierRepository.addConnectorModifier(); + + // bloc + modifierRepository.addBLOCModifier(); + + return modifierRepository; + } + +} diff --git a/src/main/java/com/profiler/DefaultAgent.java b/src/main/java/com/profiler/DefaultAgent.java new file mode 100644 index 000000000..e17a3dfdb --- /dev/null +++ b/src/main/java/com/profiler/DefaultAgent.java @@ -0,0 +1,293 @@ +package com.profiler; + +import com.profiler.common.ServiceType; +import com.profiler.common.dto.thrift.AgentInfo; +import com.profiler.common.hbase.HBaseTables; +import com.profiler.common.mapping.ApiMappingTable; +import com.profiler.config.ProfilerConfig; +import com.profiler.context.BypassStorageFactory; +import com.profiler.context.DefaultTraceContext; +import com.profiler.context.TimeBaseStorageFactory; +import com.profiler.context.TraceContext; +import com.profiler.interceptor.bci.ByteCodeInstrumentor; +import com.profiler.interceptor.bci.JavaAssistByteCodeInstrumentor; +import com.profiler.logger.Slf4jLoggerBinder; +import com.profiler.logging.LoggerBinder; +import com.profiler.logging.LoggerFactory; +import com.profiler.sender.DataSender; +import com.profiler.sender.UdpDataSender; +import com.profiler.util.Assert; +import com.profiler.util.NetworkUtils; + +import java.io.UnsupportedEncodingException; +import java.lang.instrument.Instrumentation; +import java.util.Map.Entry; +import java.util.Random; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class DefaultAgent implements Agent { + + private static final Logger logger = Logger.getLogger(DefaultAgent.class.getName()); + private static final Random IDENTIFIER_KEY = new Random(); + + + private final ByteCodeInstrumentor byteCodeInstrumentor; + + private final ProfilerConfig profilerConfig; + + private final ServerInfo serverInfo; + private final SystemMonitor systemMonitor; + + private DefaultTraceContext traceContext; + + private DataSender priorityDataSender; + private DataSender dataSender; + + private final String machineName; + private final String agentId; + private final String applicationName; + private final long startTime; + private final short identifier; + + // agent info는 heartbeat에서 매번 사용한다. + private AgentInfo agentInfo; + + // agent의 상태, + private volatile AgentStatus agentStatus; + private HeartBitChecker heartBitChecker; + + + public DefaultAgent(String agentArgs, Instrumentation instrumentation, ProfilerConfig profilerConfig) { + if (profilerConfig == null) { + throw new NullPointerException("profilerConfig must not be null"); + } + initializeLogger(); + changeStatus(AgentStatus.INITIALIZING); + + this.profilerConfig = profilerConfig; + this.serverInfo = new ServerInfo(); + + String[] paths = getTomcatlibPath(); + this.byteCodeInstrumentor = new JavaAssistByteCodeInstrumentor(paths, this); + + ClassFileTransformerDispatcher classFileTransformerDispatcher = new ClassFileTransformerDispatcher(this); + instrumentation.addTransformer(classFileTransformerDispatcher); + + // TODO 일단 임시로 호환성을 위해 agentid에 machinename을 넣도록 하자 + // TODO 박스 하나에 서버 인스턴스를 여러개 실행할 때에 문제가 될 수 있음. + this.machineName = NetworkUtils.getMachineName(); + this.agentId = getId("hippo.agentId", machineName, HBaseTables.AGENT_NAME_MAX_LEN); + this.applicationName = getId("hippo.applicationName", "UnknownApplicationName", HBaseTables.APPLICATION_NAME_MAX_LEN); + + this.priorityDataSender = createDataSender(); + this.dataSender = createDataSender(); + this.startTime = System.currentTimeMillis(); + + this.identifier = getShortIdentifier(); + + initializeTraceContext(); + + this.systemMonitor = new SystemMonitor(this.traceContext, this.profilerConfig); + this.systemMonitor.setDataSender(dataSender); + + // 매핑 테이블 초기화를 위해 엑세스 + ApiMappingTable.findApiId("test", null, null); + + this.agentInfo = createAgentInfo(); + this.heartBitChecker = new HeartBitChecker(priorityDataSender, profilerConfig.getHeartbeatInterval(), agentInfo); + + + SingletonHolder.INSTANCE = this; + } + + public ProfilerConfig getProfilerConfig() { + return profilerConfig; + } + + public ByteCodeInstrumentor getByteCodeInstrumentor() { + return byteCodeInstrumentor; + } + + private String[] getTomcatlibPath() { + String catalinaHome = System.getProperty("catalina.home"); + + if (catalinaHome == null) { + logger.info("CATALINA_HOME is null"); + return new String[0]; + } + + if (logger.isLoggable(Level.INFO)) { + logger.info("CATALINA_HOME=" + catalinaHome); + } + + if (profilerConfig.getServiceType() == ServiceType.BLOC) { + return new String[] { catalinaHome + "/server/lib/catalina.jar", catalinaHome + "/common/lib/servlet-api.jar" }; + } else { + return new String[] { catalinaHome + "/lib/servlet-api.jar", catalinaHome + "/lib/catalina.jar" }; + } + } + + + private AgentInfo createAgentInfo() { + String ip = getServerInfo().getHostip(); + String ports = ""; + for (Entry entry : getServerInfo().getConnectors().entrySet()) { + ports += " " + entry.getKey(); + } + + AgentInfo agentInfo = new AgentInfo(); + + agentInfo.setIp(ip); + agentInfo.setHostname(this.machineName); + agentInfo.setPorts(ports); + + agentInfo.setAgentId(getAgentId()); + agentInfo.setIdentifier(this.identifier); + agentInfo.setApplicationName(getApplicationName()); + agentInfo.setServiceType(profilerConfig.getServiceType().getCode()); + + agentInfo.setIsAlive(true); + agentInfo.setTimestamp(this.startTime); + + return agentInfo; + } + + private void changeStatus(AgentStatus status) { + this.agentStatus = status; + if (logger.isLoggable(Level.FINE)) { + logger.fine("Agent status is changed. " + status); + } + } + + public LoggerBinder initializeLogger() { + Slf4jLoggerBinder binder = new Slf4jLoggerBinder(); + com.profiler.logging.Logger logger = binder.getLogger(Slf4jLoggerBinder.class.getName()); + logger.info("slf4jLoggerBinder initialized"); + LoggerFactory.initialize(binder); + return binder; + } + + private short getShortIdentifier() { + return (short) (IDENTIFIER_KEY.nextInt(65536) - 32768); + } + + private void initializeTraceContext() { + this.traceContext = DefaultTraceContext.getTraceContext(); + + this.traceContext.setAgentId(this.agentId); + this.traceContext.setApplicationId(this.applicationName); + this.traceContext.setPriorityDataSender(this.priorityDataSender); + + if (profilerConfig.isSamplingElapsedTimeBaseEnable()) { + TimeBaseStorageFactory timeBaseStorageFactory = new TimeBaseStorageFactory(this.dataSender, this.profilerConfig); + this.traceContext.setStorageFactory(timeBaseStorageFactory); + } else { + this.traceContext.setStorageFactory(new BypassStorageFactory(dataSender)); + } + } + + private UdpDataSender createDataSender() { + return new UdpDataSender(this.profilerConfig.getCollectorServerIp(), this.profilerConfig.getCollectorServerPort()); + } + + private String getId(String key, String defaultValue, int maxlen) { + String value = System.getProperty(key, defaultValue); + validateId(value, key, maxlen); + return value; + } + + private void validateId(String id, String idName, int maxlen) { + try { + byte[] bytes = id.getBytes("UTF-8"); + if (bytes.length > maxlen) { + logger.warning(idName + " is too long(1~24). value=" + id); + } + // validate = false; + // TODO 이제 그냥 exception을 던지면 됨 agent 생성 타이밍이 최초 vm스타트와 동일하다. + } catch (UnsupportedEncodingException e) { + logger.log(Level.WARNING, "invalid agentId. Cause:" + e.getMessage(), e); + } + } + + private static class SingletonHolder { + public static DefaultAgent INSTANCE; + } + + public static DefaultAgent getInstance() { + return SingletonHolder.INSTANCE; + } + + public void addConnector(String protocol, int port){ + this.getServerInfo().addConnector(protocol, port); + } + + + public ServerInfo getServerInfo() { + return this.serverInfo; + } + + public String getAgentId() { + return agentId; + } + + public short getIdentifier() { + return identifier; + } + + public long getStartTime() { + return startTime; + } + + public String getApplicationName() { + return applicationName; + } + + public TraceContext getTraceContext() { + return traceContext; + } + + + public boolean isRunning() { + return agentStatus == AgentStatus.RUNNING; + } + + // TODO 필요없을것 같음 started를 start로 바꿔도 될 듯... + @Override + public void start() { + logger.info("Starting HIPPO Agent."); + } + + /** + * org/apache/catalina/startup/Catalina/await함수가 호출되기 전에 실행된다. + * Tomcat이 구동되고 context가 모두 로드 된 다음 사용자의 요청을 처리할 수 있게 되었을 때 실행됨. + */ + public void started() { + changeStatus(AgentStatus.RUNNING); + this.heartBitChecker.start(); + } + + @Override + public void stop() { + logger.info("Stopping HIPPO Agent."); + + changeStatus(AgentStatus.STOPPING); + this.heartBitChecker.close(); + + + systemMonitor.stop(); + + agentInfo.setIsAlive(false); + + // TODO 개선필요. 특정 collector가 죽더라도 나머지 collector가 받을수 있도록 일부러 중복해서 3번 보낸다. + this.priorityDataSender.send(agentInfo); + this.priorityDataSender.send(agentInfo); + this.priorityDataSender.send(agentInfo); + + // 종료 처리 필요. + this.dataSender.stop(); + this.priorityDataSender.stop(); + + changeStatus(AgentStatus.STOPPED); + } +} diff --git a/src/main/java/com/profiler/TomcatProfiler.java b/src/main/java/com/profiler/TomcatProfiler.java index cccaec3b2..f97f7f35a 100644 --- a/src/main/java/com/profiler/TomcatProfiler.java +++ b/src/main/java/com/profiler/TomcatProfiler.java @@ -1,12 +1,7 @@ package com.profiler; -import java.io.IOException; import java.lang.instrument.ClassFileTransformer; -import java.lang.instrument.IllegalClassFormatException; import java.lang.instrument.Instrumentation; -import java.net.URL; -import java.security.ProtectionDomain; -import java.util.List; import java.util.Properties; import java.util.Set; import java.util.logging.Level; @@ -18,11 +13,9 @@ import com.profiler.logging.LoggerBinder; import com.profiler.logging.LoggerFactory; 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; -public class TomcatProfiler implements ClassFileTransformer { +public class TomcatProfiler { private static final Logger logger = Logger.getLogger(TomcatProfiler.class.getName()); private boolean isFine = logger.isLoggable(Level.FINE); @@ -37,28 +30,16 @@ public class TomcatProfiler implements ClassFileTransformer { private final ProfilerConfig profilerConfig; private final Agent agent; - private AgentClassLoader agentClassLoader; - public static void premain(String agentArgs, Instrumentation instrumentation) { + public void boot(Instrumentation instrumentation, String agentArgs) { + if (agentArgs != null) { logger.info("HIPPO agentArgs:" + agentArgs); } -// dumpSystemProperties(); - ClassPathResolver classPathResolver = new ClassPathResolver(); - boolean agentJarNotFound = classPathResolver.findAgentJar(); - if (!agentJarNotFound) { - logger.severe("hippo-tomcat-profiler-x.x.x.jar not found."); - return; - } - // 이게 로드할 lib List임. - List libUrlList = resolveLib(classPathResolver); - AgentClassLoader agentClassLoader = new AgentClassLoader(libUrlList.toArray(new URL[libUrlList.size()])); - agentClassLoader.setBootClass("com.profiler.boot.BootClassTest"); -// agentClassLoader.test(); try { - agentClassLoader.boot(); - LoggerBinder loggerBinder = agentClassLoader.initializeLoggerBinder(); + + LoggerBinder loggerBinder = null; loggerBinder.getLogger("LoggerFactory initialize start"); LoggerFactory.initialize(loggerBinder); com.profiler.logging.Logger tomcatLogger = LoggerFactory.getLogger(TomcatProfiler.class); @@ -68,46 +49,19 @@ public class TomcatProfiler implements ClassFileTransformer { } try { - ProfilerConfig profilerConfig = readConfig(classPathResolver); + ProfilerConfig profilerConfig = null; if (!profilerConfig.isProfileEnable()) { logger.warning("Profiler Agent not started. profile.enable=" + profilerConfig.isProfileEnable()); return; } - Agent agent = new Agent(profilerConfig); - new TomcatProfiler(agentArgs, instrumentation, agent, profilerConfig); + Agent agent = new DefaultAgent(agentArgs, instrumentation, profilerConfig); +// new TomcatProfiler(agentArgs, instrumentation, agent, profilerConfig); } catch (Exception e) { logger.log(Level.SEVERE, "Profiler Agent start fail. Cause:" + e.getMessage(), e); } } - private static ProfilerConfig readConfig(ClassPathResolver classPathResolver) throws IOException { - ProfilerConfig profilerConfig = new ProfilerConfig(); - String hippoConfigFormSystemProperty = findHippoConfigFormSystemProeprty(); - if (hippoConfigFormSystemProperty != null) { - profilerConfig.readConfigFile(hippoConfigFormSystemProperty); - } else { - String agentConfigPath = classPathResolver.getAgentConfigPath(); - profilerConfig.readConfigFile(agentConfigPath); - } - return profilerConfig; - } - - private static List resolveLib(ClassPathResolver classPathResolver) { - String agentJarFullPath = classPathResolver.getAgentJarFullPath(); - logger.info("agentJarPath:" + agentJarFullPath); - - String agentLibPath = classPathResolver.getAgentLibPath(); - logger.info("agentLibPath:" + agentLibPath); - - List urlList = classPathResolver.resolveLib(); - logger.info("agent lib list:" + urlList); - - String agentConfigPath = classPathResolver.getAgentConfigPath(); - logger.info("agent config:" + agentConfigPath); - - return urlList; - } private static void dumpSystemProperties() { if (logger.isLoggable(Level.FINE)) { @@ -119,18 +73,18 @@ public class TomcatProfiler implements ClassFileTransformer { } } - public TomcatProfiler(String agentArgs, Instrumentation instrumentation, Agent agent, ProfilerConfig profilerConfig) { + public TomcatProfiler(String agentArgs, Instrumentation instrumentation, DefaultAgent agent, ProfilerConfig profilerConfig) { this.agentArgString = agentArgs; this.profilerConfig = profilerConfig; this.agent = agent; - this.instrumentation = instrumentation; - this.instrumentation.addTransformer(this); String[] paths = getTomcatlibPath(); - this.byteCodeInstrumentor = new JavaAssistByteCodeInstrumentor(paths); + this.byteCodeInstrumentor = new JavaAssistByteCodeInstrumentor(paths, agent); - this.modifierRepository = createModifierRegistry(); + this.modifierRepository = null; + ClassFileTransformer classFileTransformerDispatcher = new ClassFileTransformerDispatcher(agent); + this.instrumentation.addTransformer(classFileTransformerDispatcher); } public static String findHippoConfigFormSystemProeprty() { @@ -161,56 +115,6 @@ public class TomcatProfiler implements ClassFileTransformer { } } - private ModifierRegistry createModifierRegistry() { - DefaultModifierRegistry modifierRepository = new DefaultModifierRegistry(byteCodeInstrumentor, agent, profilerConfig); - modifierRepository.addMethodModifier(); - modifierRepository.addTomcatModifier(); - - // jdbc - modifierRepository.addJdbcModifier(); - - // rpc - modifierRepository.addConnectorModifier(); - - // bloc - modifierRepository.addBLOCModifier(); - - return modifierRepository; - } - - @Override - public byte[] transform(ClassLoader classLoader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classFileBuffer) throws IllegalClassFormatException { - // fast java class skip - if (className.startsWith("java")) { - if (className.startsWith("/", 4) || className.startsWith("x/", 4)) { - return classFileBuffer; - } - } - Modifier findModifier = this.modifierRepository.findModifier(className); - - if (findModifier == null) { - // TODO : 디버그 용도로 추가함 - // TODO : modifier가 중복 적용되면 어떻게 되지??? - if (profilerConfig.isProfilableClass(className)) { - // 테스트 장비에서 callstack view가 잘 보이는지 확인하려고 추가함. - findModifier = this.modifierRepository.findModifier("*"); - } else { - return null; - } - } - - if (isFine) { - logger.fine("[transform] cl" + classLoader + " className:" + className + " Modifier:" + findModifier.getClass().getName()); - } - String javassistClassName = className.replace('/', '.'); - - try { - return findModifier.modify(classLoader, javassistClassName, protectionDomain, classFileBuffer); - } catch (Exception e) { - logger.log(Level.SEVERE, "Modifier:" + findModifier.getTargetClass() + " modify fail. Cause:" + e.getMessage(), e); - return null; - } - } } diff --git a/src/main/java/com/profiler/context/DeadlineSpanMap.java b/src/main/java/com/profiler/context/DeadlineSpanMap.java index cb5cfabbc..a291b5b28 100644 --- a/src/main/java/com/profiler/context/DeadlineSpanMap.java +++ b/src/main/java/com/profiler/context/DeadlineSpanMap.java @@ -10,12 +10,12 @@ public class DeadlineSpanMap { private static final long FLUSH_TIMEOUT = 120000L; // 2 minutes - private final ConcurrentMap map = new ConcurrentHashMap(256); + private final ConcurrentMap map = new ConcurrentHashMap(256); private final Timer timer = new Timer(true); - public Span update(TraceID traceId, SpanUpdater spanUpdater) { - TraceID.TraceKey traceIdKey = traceId.getTraceKey(); + public Span update(DefaultTraceID traceId, SpanUpdater spanUpdater) { + DefaultTraceID.TraceKey traceIdKey = traceId.getTraceKey(); Span span = map.get(traceIdKey); if (span == null) { @@ -31,7 +31,7 @@ public class DeadlineSpanMap { return spanUpdater.updateSpan(span); } - public Span remove(TraceID traceId) { + public Span remove(DefaultTraceID traceId) { return map.remove(traceId.getTraceKey()); } diff --git a/src/main/java/com/profiler/context/DefaultAsyncTrace.java b/src/main/java/com/profiler/context/DefaultAsyncTrace.java new file mode 100644 index 000000000..b6769eed1 --- /dev/null +++ b/src/main/java/com/profiler/context/DefaultAsyncTrace.java @@ -0,0 +1,199 @@ +package com.profiler.context; + +import java.util.TimerTask; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import java.util.logging.Logger; + +import com.profiler.common.AnnotationKey; +import com.profiler.common.ServiceType; +import com.profiler.interceptor.MethodDescriptor; +import com.profiler.logging.LoggingUtils; +import com.profiler.util.StringUtils; + +/** + * + */ +public class DefaultAsyncTrace implements AsyncTrace { + private static final Logger logger = Logger.getLogger(DefaultAsyncTrace.class.getName()); + private static final boolean isDebug = logger.isLoggable(Level.FINE); + + public static final int NON_REGIST = -1; + // private int id; + // 비동기일 경우 traceenable의 경우 애매함. span을 보내는것으로 데이터를 생성하므로 약간 이상. + // private boolean tracingEnabled; + + + + private final AtomicInteger state = new AtomicInteger(STATE_INIT); + + private int asyncId = NON_REGIST; + private SpanEvent spanEvent; + + private Storage storage; + private TimerTask timeoutTask; + + public DefaultAsyncTrace(SpanEvent spanEvent) { + this.spanEvent = spanEvent; + } + + public void setStorage(Storage storage) { + this.storage = storage; + } + + @Override + public void setTimeoutTask(TimerTask timeoutTask) { + this.timeoutTask = timeoutTask; + } + + @Override + public void setAsyncId(int asyncId) { + this.asyncId = asyncId; + } + + @Override + public int getAsyncId() { + return asyncId; + } + + + private Object attachObject; + + @Override + public Object getAttachObject() { + return attachObject; + } + + @Override + public void setAttachObject(Object attachObject) { + this.attachObject = attachObject; + } + + @Override + public void traceBlockBegin() { + } + + @Override + public void markBeforeTime() { + spanEvent.setStartTime(System.currentTimeMillis()); + } + + @Override + public long getBeforeTime() { + return spanEvent.getStartTime(); + } + + @Override + public void traceBlockEnd() { + logSpan(this.spanEvent); + } + + @Override + public void markAfterTime() { + spanEvent.setEndTime(System.currentTimeMillis()); + } + + + @Override + public void recordApi(MethodDescriptor methodDescriptor) { + if (methodDescriptor == null) { + return; + } + if (methodDescriptor.getApiId() == 0) { + recordAttribute(AnnotationKey.API, methodDescriptor.getFullName()); + } else { + recordAttribute(AnnotationKey.API_DID, methodDescriptor.getApiId()); + } + } + + @Override + public void recordAttribute(final AnnotationKey key, final String value) { + recordAttribute(key, (Object) value); + } + + @Override + public void recordException(Object result) { + if (result instanceof Throwable) { + Throwable th = (Throwable) result; + String drop = StringUtils.drop(th.getMessage()); + recordAttribute(AnnotationKey.EXCEPTION, drop); + +// TODO 비동기 api일 경우, span에 exception을 마크하기가 까다로움 +// AnnotationKey span = getCallStack().getSpan(); +// if (span.getException() == 0) { +// span.setException(1); +// } + } + } + + + + @Override + public void recordAttribute(final AnnotationKey key, final Object value) { + spanEvent.addAnnotation(new TraceAnnotation(key, value)); + } + + @Override + public void recordServiceType(final ServiceType serviceType) { + this.spanEvent.setServiceType(serviceType); + } + + @Override + public void recordRpcName(final String rpcName) { + this.spanEvent.setRpc(rpcName); + + } + + + @Override + public void recordDestinationId(String destinationId) { + this.spanEvent.setDestionationId(destinationId); + } + + // TODO: final String... endPoint로 받으면 합치는데 비용이 들어가 그냥 한번에 받는게 나을것 같음. + @Override + public void recordEndPoint(final String endPoint) { + this.spanEvent.setEndPoint(endPoint); + } + + private void annotate(final AnnotationKey key) { + this.spanEvent.addAnnotation(new TraceAnnotation(key)); + + } + + void logSpan(SpanEvent spanEvent) { + try { + if (isDebug) { + Thread thread = Thread.currentThread(); + logger.info("[WRITE SpanEvent]" + spanEvent + " CurrentThreadID=" + thread.getId() + ",\n\t CurrentThreadName=" + thread.getName()); + } + this.storage.store(spanEvent); + } catch (Exception e) { + logger.log(Level.SEVERE, e.getMessage(), e); + } + } + + public int getState() { + return state.get(); + } + + public void timeout() { + if (state.compareAndSet(STATE_INIT, STATE_TIMEOUT)) { + // TODO timeout spanEvent log 던지기. + // 뭘 어떤 내용을 던져야 되는지 아직 모르겠음???? + } + } + + public boolean fire() { + if (state.compareAndSet(STATE_INIT, STATE_FIRE)) { + if (timeoutTask != null) { + // timeout이 걸려 있는 asynctrace일 경우 호출해 준다. + this.timeoutTask.cancel(); + } + return true; + } + return false; + } + + +} diff --git a/src/main/java/com/profiler/context/DefaultTrace.java b/src/main/java/com/profiler/context/DefaultTrace.java index deb4f383f..e05109389 100644 --- a/src/main/java/com/profiler/context/DefaultTrace.java +++ b/src/main/java/com/profiler/context/DefaultTrace.java @@ -4,7 +4,6 @@ import com.profiler.common.AnnotationKey; import com.profiler.common.ServiceType; import com.profiler.common.util.ParsingResult; import com.profiler.interceptor.MethodDescriptor; -import com.profiler.logging.LoggingUtils; import com.profiler.util.StringUtils; import java.util.List; @@ -17,7 +16,7 @@ import java.util.logging.Logger; public final class DefaultTrace implements Trace { private static final Logger logger = Logger.getLogger(DefaultTrace.class.getName()); - private static final boolean isDebug = LoggingUtils.isDebug(logger); + private static final boolean isDebug = logger.isLoggable(Level.FINE); public static final int NOCHECK_STACKID = -1; public static final int ROOT_STACKID = 0; @@ -36,16 +35,16 @@ public final class DefaultTrace implements Trace { private int latestStackIndex = -1; public DefaultTrace() { - TraceID traceId = TraceID.newTraceId(); + DefaultTraceID traceId = DefaultTraceID.newTraceId(); this.callStack = new CallStack(traceId); latestStackIndex = this.callStack.push(); StackFrame stackFrame = createRootStackFrame(ROOT_STACKID, callStack.getSpan()); this.callStack.setStackFrame(stackFrame); } - public DefaultTrace(TraceID continueRoot) { + public DefaultTrace(TraceID continueTraceID) { // this.root = continueRoot; - this.callStack = new CallStack(continueRoot); + this.callStack = new CallStack(continueTraceID); latestStackIndex = this.callStack.push(); StackFrame stackFrame = createRootStackFrame(ROOT_STACKID, callStack.getSpan()); this.callStack.setStackFrame(stackFrame); @@ -69,7 +68,7 @@ public final class DefaultTrace implements Trace { // 경우에 따라 별도 timeout 처리가 있어야 될수도 있음. SpanEvent spanEvent = new SpanEvent(callStack.getSpan()); spanEvent.setSequence(getSequence()); - AsyncTrace asyncTrace = new AsyncTrace(spanEvent); + DefaultAsyncTrace asyncTrace = new DefaultAsyncTrace(spanEvent); // asyncTrace.setDataSender(this.getDataSender()); asyncTrace.setStorage(this.storage); return asyncTrace; diff --git a/src/main/java/com/profiler/context/DefaultTraceID.java b/src/main/java/com/profiler/context/DefaultTraceID.java new file mode 100644 index 000000000..e5081f375 --- /dev/null +++ b/src/main/java/com/profiler/context/DefaultTraceID.java @@ -0,0 +1,127 @@ +package com.profiler.context; + +import java.util.UUID; + +public class DefaultTraceID implements TraceID { + private UUID id; + private int parentSpanId; + private int spanId; + private boolean sampled; + private short flags; + + public static DefaultTraceID newTraceId() { + UUID uuid = UUID.randomUUID(); + return new DefaultTraceID(uuid, SpanID.NULL, SpanID.newSpanID(), false, (short) 0); + } + + public TraceID getNextTraceId() { + return new DefaultTraceID(id, spanId, SpanID.nextSpanID(spanId, parentSpanId), sampled, flags); + } + + public DefaultTraceID(UUID id, int parentSpanId, int spanId, boolean sampled, short flags) { + this.id = id; + this.parentSpanId = parentSpanId; + this.spanId = spanId; + this.sampled = sampled; + this.flags = flags; + } + + public UUID getId() { + return id; + } + + public TraceKey getTraceKey() { + long most = id.getMostSignificantBits(); + long least = id.getLeastSignificantBits(); + return new TraceKey(most, least, spanId); + } + + public static final class TraceKey { + private final long most; + private final long least; + private final int span; + + public TraceKey(long most, long least, int span) { + this.most = most; + this.least = least; + this.span = span; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + TraceKey traceKey = (TraceKey) o; + + if (least != traceKey.least) return false; + if (most != traceKey.most) return false; + if (span != traceKey.span) return false; + + return true; + } + + @Override + public int hashCode() { + int result = (int) (most ^ (most >>> 32)); + result = 31 * result + (int) (least ^ (least >>> 32)); + result = 31 * result + span; + return result; + } + } + + public int getParentSpanId() { + return parentSpanId; + } + + public int getSpanId() { + return spanId; + } + + public boolean isSampled() { + return sampled; + } + + public short getFlags() { + return flags; + } + + public void setTraceId(UUID traceId) { + this.id = traceId; + } + + public void setParentSpanId(int parentSpanId) { + this.parentSpanId = parentSpanId; + } + + public void setSpanId(int spanId) { + this.spanId = spanId; + } + + public void setSampled(boolean sampled) { + this.sampled = sampled; + } + + public void setFlags(short flags) { + this.flags = flags; + } + + public boolean isRoot() { + return this.parentSpanId == SpanID.NULL; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(128); + + sb.append("{"); + sb.append("id=").append(id); + sb.append(", parentSpanId=").append(parentSpanId); + sb.append(", spanId=").append(spanId); + sb.append(", sampled=").append(sampled); + sb.append(", flags=").append(flags); + sb.append("}"); + + return sb.toString(); + } +} diff --git a/src/main/java/com/profiler/context/GlobalCallTrace.java b/src/main/java/com/profiler/context/GlobalCallTrace.java index aecbff21f..ae4c326cb 100644 --- a/src/main/java/com/profiler/context/GlobalCallTrace.java +++ b/src/main/java/com/profiler/context/GlobalCallTrace.java @@ -35,7 +35,7 @@ public class GlobalCallTrace { private int put(AsyncTrace asyncTrace) { int id = idGenerator.getAndIncrement(); - trace.put(id, asyncTrace); + trace.put(id, (DefaultAsyncTrace)asyncTrace); return id; } @@ -46,7 +46,7 @@ public class GlobalCallTrace { public AsyncTrace removeTraceObject(int asyncId) { AsyncTrace asyncTrace = trace.remove(asyncId); if (asyncTrace != null) { - boolean result = asyncTrace.fire(); + boolean result = ((DefaultAsyncTrace)asyncTrace).fire(); if (!result) { // 이미 timeout된 asyncTrace임. return null; @@ -68,7 +68,7 @@ public class GlobalCallTrace { @Override public void run() { - AsyncTrace asyncTrace = trace.remove(id); + DefaultAsyncTrace asyncTrace = (DefaultAsyncTrace) trace.remove(id); if (asyncTrace != null) { asyncTrace.timeout(); } diff --git a/src/main/java/com/profiler/context/Span.java b/src/main/java/com/profiler/context/Span.java index 9859d349f..8ebd98c1c 100644 --- a/src/main/java/com/profiler/context/Span.java +++ b/src/main/java/com/profiler/context/Span.java @@ -1,7 +1,8 @@ package com.profiler.context; -import com.profiler.Agent; +import com.profiler.DefaultAgent; import com.profiler.common.ServiceType; +import com.profiler.common.dto.thrift.Annotation; import java.util.ArrayList; import java.util.List; @@ -166,9 +167,9 @@ public class Span implements Thriftable { public com.profiler.common.dto.thrift.Span toThrift() { com.profiler.common.dto.thrift.Span span = new com.profiler.common.dto.thrift.Span(); - span.setAgentId(Agent.getInstance().getAgentId()); - span.setApplicationId(Agent.getInstance().getApplicationName()); - span.setAgentIdentifier(Agent.getInstance().getIdentifier()); + span.setAgentId(DefaultAgent.getInstance().getAgentId()); + span.setApplicationId(DefaultAgent.getInstance().getApplicationName()); + span.setAgentIdentifier(DefaultAgent.getInstance().getIdentifier()); span.setStartTime(startTime); span.setElapsed((int) (endTime - startTime)); @@ -197,7 +198,7 @@ public class Span implements Thriftable { } // 여기서 데이터 인코딩을 하자. - List annotationList = new ArrayList(traceAnnotationList.size()); + List annotationList = new ArrayList(traceAnnotationList.size()); for (TraceAnnotation traceAnnotation : traceAnnotationList) { annotationList.add(traceAnnotation.toThrift()); } diff --git a/src/main/java/com/profiler/context/SpanEvent.java b/src/main/java/com/profiler/context/SpanEvent.java index 8038f10ec..9f098c09e 100644 --- a/src/main/java/com/profiler/context/SpanEvent.java +++ b/src/main/java/com/profiler/context/SpanEvent.java @@ -3,8 +3,9 @@ package com.profiler.context; import java.util.ArrayList; import java.util.List; -import com.profiler.Agent; +import com.profiler.DefaultAgent; import com.profiler.common.ServiceType; +import com.profiler.common.dto.thrift.Annotation; /** * Span represent RPC @@ -174,9 +175,9 @@ public class SpanEvent implements Thriftable { spanEvent.setSequence(sequence); // Span내부의 SpanEvent로 들어가지 않을 경우 if (!child) { - spanEvent.setAgentId(Agent.getInstance().getAgentId()); - spanEvent.setApplicationId(Agent.getInstance().getApplicationName()); - spanEvent.setAgentIdentifier(Agent.getInstance().getIdentifier()); + spanEvent.setAgentId(DefaultAgent.getInstance().getAgentId()); + spanEvent.setApplicationId(DefaultAgent.getInstance().getApplicationName()); + spanEvent.setAgentIdentifier(DefaultAgent.getInstance().getIdentifier()); TraceID parentSpanTraceID = parentSpan.getTraceID(); spanEvent.setMostTraceId(parentSpanTraceID.getId().getMostSignificantBits()); @@ -191,7 +192,7 @@ public class SpanEvent implements Thriftable { spanEvent.setDestinationId(this.destionationId); // 여기서 데이터 인코딩을 하자. - List annotationList = new ArrayList(traceAnnotationList.size()); + List annotationList = new ArrayList(traceAnnotationList.size()); for (TraceAnnotation traceAnnotation : traceAnnotationList) { annotationList.add(traceAnnotation.toThrift()); } diff --git a/src/main/java/com/profiler/interceptor/bci/ByteCodeInstrumentor.java b/src/main/java/com/profiler/interceptor/bci/ByteCodeInstrumentor.java index 95f6052ce..b8557aebd 100644 --- a/src/main/java/com/profiler/interceptor/bci/ByteCodeInstrumentor.java +++ b/src/main/java/com/profiler/interceptor/bci/ByteCodeInstrumentor.java @@ -3,7 +3,6 @@ package com.profiler.interceptor.bci; import java.security.ProtectionDomain; import com.profiler.interceptor.Interceptor; -import javassist.ClassPool; public interface ByteCodeInstrumentor { @@ -16,5 +15,7 @@ public interface ByteCodeInstrumentor { Interceptor newInterceptor(ClassLoader classLoader, ProtectionDomain protectedDomain, String interceptorFQCN) throws InstrumentException; - Interceptor newInterceptor(ClassLoader classLoader, ProtectionDomain protectedDomain, String interceptorFQCN, Object[] params) throws InstrumentException; +// Interceptor newInterceptor(ClassLoader classLoader, ProtectionDomain protectedDomain, String interceptorFQCN, Object[] params) throws InstrumentException; + + Interceptor newInterceptor(ClassLoader classLoader, ProtectionDomain protectedDomain, String interceptorFQCN, Object[] params, Class[] paramClazz) throws InstrumentException; } diff --git a/src/main/java/com/profiler/logger/Slf4jLoggerAdapter.java b/src/main/java/com/profiler/logger/Slf4jLoggerAdapter.java new file mode 100644 index 000000000..daa893305 --- /dev/null +++ b/src/main/java/com/profiler/logger/Slf4jLoggerAdapter.java @@ -0,0 +1,289 @@ +package com.profiler.logger; + +import com.profiler.logging.Logger; +import org.slf4j.Marker; + +/** + * + */ +public class Slf4jLoggerAdapter implements Logger { + private final org.slf4j.Logger logger; + + public Slf4jLoggerAdapter(org.slf4j.Logger logger) { + this.logger = logger; + } + + public String getName() { + return logger.getName(); + } + + @Override + public boolean isTraceEnabled() { + return logger.isTraceEnabled(); + } + + @Override + public void trace(String msg) { + logger.trace(msg); + } + + @Override + public void trace(String format, Object arg) { + logger.trace(format, arg); + } + + @Override + public void trace(String format, Object arg1, Object arg2) { + logger.trace(format, arg1, arg2); + } + + @Override + public void trace(String format, Object[] argArray) { + logger.trace(format, argArray); + } + + @Override + public void trace(String msg, Throwable t) { + logger.trace(msg, t); + } + + public boolean isTraceEnabled(Marker marker) { + return logger.isTraceEnabled(marker); + } + + public void trace(Marker marker, String msg) { + logger.trace(marker, msg); + } + + public void trace(Marker marker, String format, Object arg) { + logger.trace(marker, format, arg); + } + + public void trace(Marker marker, String format, Object arg1, Object arg2) { + logger.trace(marker, format, arg1, arg2); + } + + public void trace(Marker marker, String format, Object[] argArray) { + logger.trace(marker, format, argArray); + } + + public void trace(Marker marker, String msg, Throwable t) { + logger.trace(marker, msg, t); + } + + @Override + public boolean isDebugEnabled() { + return logger.isDebugEnabled(); + } + + @Override + public void debug(String msg) { + logger.debug(msg); + } + + @Override + public void debug(String format, Object arg) { + logger.debug(format, arg); + } + + @Override + public void debug(String format, Object arg1, Object arg2) { + logger.debug(format, arg1, arg2); + } + + @Override + public void debug(String format, Object[] argArray) { + logger.debug(format, argArray); + } + + @Override + public void debug(String msg, Throwable t) { + logger.debug(msg, t); + } + + public boolean isDebugEnabled(Marker marker) { + return logger.isDebugEnabled(marker); + } + + public void debug(Marker marker, String msg) { + logger.debug(marker, msg); + } + + public void debug(Marker marker, String format, Object arg) { + logger.debug(marker, format, arg); + } + + public void debug(Marker marker, String format, Object arg1, Object arg2) { + logger.debug(marker, format, arg1, arg2); + } + + public void debug(Marker marker, String format, Object[] argArray) { + logger.debug(marker, format, argArray); + } + + public void debug(Marker marker, String msg, Throwable t) { + logger.debug(marker, msg, t); + } + + @Override + public boolean isInfoEnabled() { + return logger.isInfoEnabled(); + } + + @Override + public void info(String msg) { + logger.info(msg); + } + + @Override + public void info(String format, Object arg) { + logger.info(format, arg); + } + + @Override + public void info(String format, Object arg1, Object arg2) { + logger.info(format, arg1, arg2); + } + + @Override + public void info(String format, Object[] argArray) { + logger.info(format, argArray); + } + + @Override + public void info(String msg, Throwable t) { + logger.info(msg, t); + } + + public boolean isInfoEnabled(Marker marker) { + return logger.isInfoEnabled(marker); + } + + public void info(Marker marker, String msg) { + logger.info(marker, msg); + } + + public void info(Marker marker, String format, Object arg) { + logger.info(marker, format, arg); + } + + public void info(Marker marker, String format, Object arg1, Object arg2) { + logger.info(marker, format, arg1, arg2); + } + + public void info(Marker marker, String format, Object[] argArray) { + logger.info(marker, format, argArray); + } + + public void info(Marker marker, String msg, Throwable t) { + logger.info(marker, msg, t); + } + + @Override + public boolean isWarnEnabled() { + return logger.isWarnEnabled(); + } + + @Override + public void warn(String msg) { + logger.warn(msg); + } + + @Override + public void warn(String format, Object arg) { + logger.warn(format, arg); + } + + @Override + public void warn(String format, Object[] argArray) { + logger.warn(format, argArray); + } + + @Override + public void warn(String format, Object arg1, Object arg2) { + logger.warn(format, arg1, arg2); + } + + @Override + public void warn(String msg, Throwable t) { + logger.warn(msg, t); + } + + public boolean isWarnEnabled(Marker marker) { + return logger.isWarnEnabled(marker); + } + + public void warn(Marker marker, String msg) { + logger.warn(marker, msg); + } + + public void warn(Marker marker, String format, Object arg) { + logger.warn(marker, format, arg); + } + + public void warn(Marker marker, String format, Object arg1, Object arg2) { + logger.warn(marker, format, arg1, arg2); + } + + public void warn(Marker marker, String format, Object[] argArray) { + logger.warn(marker, format, argArray); + } + + public void warn(Marker marker, String msg, Throwable t) { + logger.warn(marker, msg, t); + } + + @Override + public boolean isErrorEnabled() { + return logger.isErrorEnabled(); + } + + @Override + public void error(String msg) { + logger.error(msg); + } + + @Override + public void error(String format, Object arg) { + logger.error(format, arg); + } + + @Override + public void error(String format, Object arg1, Object arg2) { + logger.error(format, arg1, arg2); + } + + @Override + public void error(String format, Object[] argArray) { + logger.error(format, argArray); + } + + @Override + public void error(String msg, Throwable t) { + logger.error(msg, t); + } + + public boolean isErrorEnabled(Marker marker) { + return logger.isErrorEnabled(marker); + } + + public void error(Marker marker, String msg) { + logger.error(marker, msg); + } + + public void error(Marker marker, String format, Object arg) { + logger.error(marker, format, arg); + } + + public void error(Marker marker, String format, Object arg1, Object arg2) { + logger.error(marker, format, arg1, arg2); + } + + public void error(Marker marker, String format, Object[] argArray) { + logger.error(marker, format, argArray); + } + + public void error(Marker marker, String msg, Throwable t) { + logger.error(marker, msg, t); + } +} diff --git a/src/main/java/com/profiler/logger/Slf4jLoggerBinder.java b/src/main/java/com/profiler/logger/Slf4jLoggerBinder.java new file mode 100644 index 000000000..dc30afdf3 --- /dev/null +++ b/src/main/java/com/profiler/logger/Slf4jLoggerBinder.java @@ -0,0 +1,40 @@ +package com.profiler.logger; + +import com.profiler.logging.Logger; +import com.profiler.logging.LoggerBinder; +import org.slf4j.LoggerFactory; + +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * + */ +public class Slf4jLoggerBinder implements LoggerBinder { + + private ConcurrentMap loggerCache = new ConcurrentHashMap(); + + @Override + public Logger getLogger(String name) { + + Logger hitLogger = loggerCache.get(name); + if (hitLogger != null) { + return hitLogger; + } + + org.slf4j.Logger slf4jLogger = LoggerFactory.getLogger(name); + + Slf4jLoggerAdapter slf4jLoggerAdapter = new Slf4jLoggerAdapter(slf4jLogger); + Logger before = loggerCache.putIfAbsent(name, slf4jLoggerAdapter); + if (before != null) { + return before; + } + return slf4jLoggerAdapter; + } + + @Override + public void shutdown() { + // 안해도 될것도 같고. LoggerFactory의unregister만 해도 될려나? + loggerCache = null; + } +} diff --git a/src/main/java/com/profiler/modifier/AbstractModifier.java b/src/main/java/com/profiler/modifier/AbstractModifier.java index 2c47ea08c..5d95441c9 100644 --- a/src/main/java/com/profiler/modifier/AbstractModifier.java +++ b/src/main/java/com/profiler/modifier/AbstractModifier.java @@ -1,20 +1,21 @@ package com.profiler.modifier; import java.util.logging.Level; -import java.util.logging.Logger; +import com.profiler.logging.Logger; +import com.profiler.DefaultAgent; import com.profiler.common.ServiceType; import com.profiler.interceptor.ServiceTypeSupport; -import javassist.ClassPool; import com.profiler.Agent; import com.profiler.interceptor.Interceptor; import com.profiler.interceptor.TraceContextSupport; import com.profiler.interceptor.bci.ByteCodeInstrumentor; +import com.profiler.logging.LoggerFactory; public abstract class AbstractModifier implements Modifier { - private final Logger logger = Logger.getLogger(AbstractModifier.class.getName()); + private final Logger logger = LoggerFactory.getLogger(AbstractModifier.class.getName()); protected final ByteCodeInstrumentor byteCodeInstrumentor; protected final Agent agent; @@ -29,17 +30,17 @@ public abstract class AbstractModifier implements Modifier { } public void printClassConvertComplete(String javassistClassName) { - if (logger.isLoggable(Level.INFO)) { + if (logger.isInfoEnabled()) { logger.info(javassistClassName + " class is converted."); } } - public void setTraceContext(Interceptor interceptor) { - // TODO TraceContext를 인터셉터에 바인하는 방안의 추가 개선 필요. - if (interceptor instanceof TraceContextSupport) { - ((TraceContextSupport) interceptor).setTraceContext(agent.getTraceContext()); - } - } +// public void setTraceContext(Interceptor interceptor) { +// // TODO TraceContext를 인터셉터에 바인하는 방안의 추가 개선 필요. +// if (interceptor instanceof TraceContextSupport) { +// ((TraceContextSupport) interceptor).setTraceContext(agent.getTraceContext()); +// } +// } public void setServiceType(Interceptor interceptor, ServiceType serviceType) { if (interceptor instanceof ServiceTypeSupport) { diff --git a/src/main/java/com/profiler/modifier/DefaultModifierRegistry.java b/src/main/java/com/profiler/modifier/DefaultModifierRegistry.java index cbb6c405c..652fbd725 100644 --- a/src/main/java/com/profiler/modifier/DefaultModifierRegistry.java +++ b/src/main/java/com/profiler/modifier/DefaultModifierRegistry.java @@ -4,6 +4,7 @@ import java.util.HashMap; import java.util.Map; import com.profiler.Agent; +import com.profiler.DefaultAgent; import com.profiler.config.ProfilerConfig; import com.profiler.interceptor.bci.ByteCodeInstrumentor; import com.profiler.modifier.arcus.ArcusClientModifier; @@ -27,7 +28,6 @@ import com.profiler.modifier.db.mysql.MySQLConnectionImplModifier; import com.profiler.modifier.db.mysql.MySQLNonRegisteringDriverModifier; import com.profiler.modifier.db.mysql.MySQLPreparedStatementJDBC4Modifier; import com.profiler.modifier.db.mysql.MySQLPreparedStatementModifier; -import com.profiler.modifier.db.mysql.MySQLResultSetModifier; import com.profiler.modifier.db.mysql.MySQLStatementModifier; import com.profiler.modifier.db.oracle.OraclePreparedStatementModifier; import com.profiler.modifier.db.oracle.OracleResultSetModifier; @@ -50,10 +50,11 @@ public class DefaultModifierRegistry implements ModifierRegistry { private final ProfilerConfig profilerConfig; private final Agent agent; - public DefaultModifierRegistry(ByteCodeInstrumentor byteCodeInstrumentor, Agent agent, ProfilerConfig profilerConfig) { - this.byteCodeInstrumentor = byteCodeInstrumentor; + public DefaultModifierRegistry(Agent agent) { this.agent = agent; - this.profilerConfig = profilerConfig; + // classLoader계층 구조 때문에 직접 type을 넣기가 애매하여 그냥 casting + this.byteCodeInstrumentor = (ByteCodeInstrumentor) agent.getByteCodeInstrumentor(); + this.profilerConfig = agent.getProfilerConfig(); } @Override @@ -167,8 +168,8 @@ public class DefaultModifierRegistry implements ModifierRegistry { MySQLPreparedStatementJDBC4Modifier myqlPreparedStatementJDBC4Modifier = new MySQLPreparedStatementJDBC4Modifier(byteCodeInstrumentor, agent); addModifier(myqlPreparedStatementJDBC4Modifier); - Modifier mysqlResultSetModifier = new MySQLResultSetModifier(byteCodeInstrumentor, agent); - addModifier(mysqlResultSetModifier); +// Modifier mysqlResultSetModifier = new MySQLResultSetModifier(byteCodeInstrumentor, agent); +// addModifier(mysqlResultSetModifier); } private void addMsSqlDriver() { diff --git a/src/main/java/com/profiler/modifier/ModifierRegistry.java b/src/main/java/com/profiler/modifier/ModifierRegistry.java index 36333586f..7294aac32 100644 --- a/src/main/java/com/profiler/modifier/ModifierRegistry.java +++ b/src/main/java/com/profiler/modifier/ModifierRegistry.java @@ -3,4 +3,5 @@ package com.profiler.modifier; public interface ModifierRegistry { Modifier findModifier(String className); + } diff --git a/src/main/java/com/profiler/modifier/arcus/interceptors/BaseOperationCancelInterceptor.java b/src/main/java/com/profiler/modifier/arcus/interceptors/BaseOperationCancelInterceptor.java index 177374ee6..8279c9603 100644 --- a/src/main/java/com/profiler/modifier/arcus/interceptors/BaseOperationCancelInterceptor.java +++ b/src/main/java/com/profiler/modifier/arcus/interceptors/BaseOperationCancelInterceptor.java @@ -1,10 +1,11 @@ package com.profiler.modifier.arcus.interceptors; -import java.util.logging.Logger; +import com.profiler.logging.Logger; +import com.profiler.context.DefaultAsyncTrace; +import com.profiler.logging.LoggerFactory; import net.spy.memcached.protocol.BaseOperationImpl; -import com.profiler.context.AsyncTrace; import com.profiler.interceptor.StaticBeforeInterceptor; import com.profiler.logging.LoggingUtils; import com.profiler.util.MetaObject; @@ -14,8 +15,8 @@ import com.profiler.util.MetaObject; */ public class BaseOperationCancelInterceptor implements StaticBeforeInterceptor { - private final Logger logger = Logger.getLogger(BaseOperationCancelInterceptor.class.getName()); - private final boolean isDebug = LoggingUtils.isDebug(logger); + private final Logger logger = LoggerFactory.getLogger(BaseOperationCancelInterceptor.class.getName()); + private final boolean isDebug = logger.isDebugEnabled(); private MetaObject getAsyncTrace = new MetaObject("__getAsyncTrace"); @@ -25,13 +26,13 @@ public class BaseOperationCancelInterceptor implements StaticBeforeInterceptor { LoggingUtils.logBefore(logger, target, className, methodName, parameterDescription, args); } - AsyncTrace asyncTrace = (AsyncTrace) getAsyncTrace.invoke(target); + DefaultAsyncTrace asyncTrace = (DefaultAsyncTrace) getAsyncTrace.invoke(target); if (asyncTrace == null) { - logger.fine("asyncTrace not found "); + logger.debug("asyncTrace not found "); return; } - if (asyncTrace.getState() != AsyncTrace.STATE_INIT) { + if (asyncTrace.getState() != DefaultAsyncTrace.STATE_INIT) { // 이미 동작 완료된 상태임. return; } diff --git a/src/main/java/com/profiler/modifier/arcus/interceptors/BaseOperationTransitionStateInterceptor.java b/src/main/java/com/profiler/modifier/arcus/interceptors/BaseOperationTransitionStateInterceptor.java index df5bca745..f5a0ac817 100644 --- a/src/main/java/com/profiler/modifier/arcus/interceptors/BaseOperationTransitionStateInterceptor.java +++ b/src/main/java/com/profiler/modifier/arcus/interceptors/BaseOperationTransitionStateInterceptor.java @@ -5,30 +5,31 @@ import java.net.SocketAddress; import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.util.logging.Level; -import java.util.logging.Logger; +import com.profiler.logging.Logger; import com.profiler.common.AnnotationKey; -import com.profiler.context.DefaultTraceContext; +import com.profiler.context.AsyncTrace; import com.profiler.context.TraceContext; import com.profiler.interceptor.ByteCodeMethodDescriptorSupport; import com.profiler.interceptor.MethodDescriptor; +import com.profiler.interceptor.TraceContextSupport; +import com.profiler.logging.LoggerFactory; import com.profiler.logging.LoggingUtils; import net.spy.memcached.MemcachedNode; import net.spy.memcached.ops.OperationState; import net.spy.memcached.protocol.BaseOperationImpl; import com.profiler.common.ServiceType; -import com.profiler.context.AsyncTrace; import com.profiler.interceptor.StaticBeforeInterceptor; import com.profiler.util.MetaObject; /** * */ -public class BaseOperationTransitionStateInterceptor implements StaticBeforeInterceptor, ByteCodeMethodDescriptorSupport { +public class BaseOperationTransitionStateInterceptor implements StaticBeforeInterceptor, ByteCodeMethodDescriptorSupport, TraceContextSupport { - private final Logger logger = Logger.getLogger(BaseOperationTransitionStateInterceptor.class.getName()); - private final boolean isDebug = LoggingUtils.isDebug(logger); + private final Logger logger = LoggerFactory.getLogger(BaseOperationTransitionStateInterceptor.class.getName()); + private final boolean isDebug = logger.isDebugEnabled(); private static final Charset UTF8 = Charset.forName("UTF-8"); @@ -36,6 +37,7 @@ public class BaseOperationTransitionStateInterceptor implements StaticBeforeInte private MetaObject getServiceCode = new MetaObject("__getServiceCode"); private MethodDescriptor methodDescriptor; + private TraceContext traceContext; @Override public void before(Object target, String className, String methodName, String parameterDescription, Object[] args) { @@ -45,7 +47,7 @@ public class BaseOperationTransitionStateInterceptor implements StaticBeforeInte AsyncTrace asyncTrace = (AsyncTrace) getAsyncTrace.invoke(target); if (asyncTrace == null) { - logger.fine("asyncTrace not found"); + logger.debug("asyncTrace not found"); return; } @@ -53,8 +55,8 @@ public class BaseOperationTransitionStateInterceptor implements StaticBeforeInte BaseOperationImpl baseOperation = (BaseOperationImpl) target; if (newState == OperationState.READING) { - if (logger.isLoggable(Level.FINE)) { - logger.fine("event:" + newState + " asyncTrace:" + asyncTrace); + if (logger.isDebugEnabled()) { + logger.debug("event:" + newState + " asyncTrace:" + asyncTrace); } if (asyncTrace.getState() != AsyncTrace.STATE_INIT) { return; @@ -97,8 +99,8 @@ public class BaseOperationTransitionStateInterceptor implements StaticBeforeInte asyncTrace.markAfterTime(); // asyncTrace.traceBlockEnd(); } else if (newState == OperationState.COMPLETE || newState == OperationState.TIMEDOUT) { - if (logger.isLoggable(Level.FINE)) { - logger.fine("event:" + newState + " asyncTrace:" + asyncTrace); + if (logger.isDebugEnabled()) { + logger.debug("event:" + newState + " asyncTrace:" + asyncTrace); } boolean fire = asyncTrace.fire(); if (!fire) { @@ -136,7 +138,11 @@ public class BaseOperationTransitionStateInterceptor implements StaticBeforeInte @Override public void setMethodDescriptor(MethodDescriptor descriptor) { this.methodDescriptor = descriptor; - TraceContext traceContext = DefaultTraceContext.getTraceContext(); - traceContext.cacheApi(descriptor); + this.traceContext.cacheApi(descriptor); + } + + @Override + public void setTraceContext(TraceContext traceContext) { + this.traceContext = traceContext; } } diff --git a/src/main/java/com/profiler/modifier/bloc/handler/interceptors/ExecuteMethodInterceptor.java b/src/main/java/com/profiler/modifier/bloc/handler/interceptors/ExecuteMethodInterceptor.java index 8b6f0288b..2be3839ed 100644 --- a/src/main/java/com/profiler/modifier/bloc/handler/interceptors/ExecuteMethodInterceptor.java +++ b/src/main/java/com/profiler/modifier/bloc/handler/interceptors/ExecuteMethodInterceptor.java @@ -3,7 +3,7 @@ package com.profiler.modifier.bloc.handler.interceptors; import java.util.Enumeration; import java.util.UUID; import java.util.logging.Level; -import java.util.logging.Logger; +import com.profiler.logging.Logger; import com.profiler.common.AnnotationKey; import com.profiler.common.ServiceType; @@ -11,19 +11,21 @@ import com.profiler.context.*; import com.profiler.interceptor.ByteCodeMethodDescriptorSupport; import com.profiler.interceptor.MethodDescriptor; import com.profiler.interceptor.StaticAroundInterceptor; +import com.profiler.interceptor.TraceContextSupport; +import com.profiler.logging.LoggerFactory; import com.profiler.logging.LoggingUtils; import com.profiler.util.NumberUtils; /** * @author netspider */ -public class ExecuteMethodInterceptor implements StaticAroundInterceptor, ByteCodeMethodDescriptorSupport { +public class ExecuteMethodInterceptor implements StaticAroundInterceptor, ByteCodeMethodDescriptorSupport, TraceContextSupport { - private final Logger logger = Logger.getLogger(ExecuteMethodInterceptor.class.getName()); - private final boolean isDebug = LoggingUtils.isDebug(logger); + private final Logger logger = LoggerFactory.getLogger(ExecuteMethodInterceptor.class.getName()); + private final boolean isDebug = logger.isDebugEnabled(); private MethodDescriptor descriptor; -// private int apiId; + private TraceContext traceContext; @Override public void before(Object target, String className, String methodName, String parameterDescription, Object[] args) { @@ -32,33 +34,27 @@ public class ExecuteMethodInterceptor implements StaticAroundInterceptor, ByteCo } try { - TraceContext traceContext = DefaultTraceContext.getTraceContext(); - traceContext.getActiveThreadCounter().start(); - external.org.apache.coyote.Request request = (external.org.apache.coyote.Request) args[0]; String requestURL = request.requestURI().toString(); String clientIP = request.remoteAddr().toString(); String parameters = getRequestParameter(request); - TraceID traceId = populateTraceIdFromRequest(request); - DefaultTrace trace; + DefaultTraceID traceId = populateTraceIdFromRequest(request); + Trace trace; if (traceId != null) { - // TraceID nextTraceId = traceId.getNextTraceId(); - if (logger.isLoggable(Level.INFO)) { - // logger.info("TraceID exist. continue trace. " + nextTraceId); + if (logger.isInfoEnabled()) { logger.info("TraceID exist. continue trace. " + traceId); - logger.log(Level.FINE, "requestUrl:" + requestURL + " clientIp" + clientIP + " parameter:" + parameters); + logger.debug("requestUrl:" + requestURL + " clientIp" + clientIP + " parameter:" + parameters); } - // trace = new Trace(nextTraceId); - trace = new DefaultTrace(traceId); - traceContext.attachTraceObject(trace); + + trace = traceContext.continueTraceObject(traceId); } else { trace = new DefaultTrace(); - if (logger.isLoggable(Level.INFO)) { + if (logger.isInfoEnabled()) { logger.info("TraceID not exist. start new trace. " + trace.getTraceId()); - logger.log(Level.FINE, "requestUrl:" + requestURL + " clientIp" + clientIP + " parameter:" + parameters); + logger.debug("requestUrl:" + requestURL + " clientIp" + clientIP + " parameter:" + parameters); } - traceContext.attachTraceObject(trace); + trace = traceContext.newTraceObject(); } trace.markBeforeTime(); @@ -75,8 +71,8 @@ public class ExecuteMethodInterceptor implements StaticAroundInterceptor, ByteCo } } catch (Exception e) { - if (logger.isLoggable(Level.WARNING)) { - logger.log(Level.WARNING, "Tomcat StandardHostValve trace start fail. Caused:" + e.getMessage(), e); + if (logger.isWarnEnabled()) { + logger.warn( "Tomcat StandardHostValve trace start fail. Caused:" + e.getMessage(), e); } } } @@ -87,15 +83,14 @@ public class ExecuteMethodInterceptor implements StaticAroundInterceptor, ByteCo LoggingUtils.logAfter(logger, target, className, methodName, parameterDescription, args, result); } - DefaultTraceContext traceContext = DefaultTraceContext.getTraceContext(); - traceContext.getActiveThreadCounter().end(); +// traceContext.getActiveThreadCounter().end(); Trace trace = traceContext.currentTraceObject(); if (trace == null) { return; } traceContext.detachTraceObject(); if (trace.getStackFrameId() != 0) { - logger.warning("Corrupted CallStack found. StackId not Root(0)"); + logger.warn("Corrupted CallStack found. StackId not Root(0)"); // 문제 있는 callstack을 dump하면 도움이 될듯. } @@ -113,7 +108,7 @@ public class ExecuteMethodInterceptor implements StaticAroundInterceptor, ByteCo * @param request * @return */ - private TraceID populateTraceIdFromRequest(external.org.apache.coyote.Request request) { + private DefaultTraceID populateTraceIdFromRequest(external.org.apache.coyote.Request request) { String strUUID = request.getHeader(Header.HTTP_TRACE_ID.toString()); if (strUUID != null) { UUID uuid = UUID.fromString(strUUID); @@ -122,8 +117,8 @@ public class ExecuteMethodInterceptor implements StaticAroundInterceptor, ByteCo boolean sampled = Boolean.parseBoolean(request.getHeader(Header.HTTP_SAMPLED.toString())); short flags = NumberUtils.parseShort(request.getHeader(Header.HTTP_FLAGS.toString()), (short) 0); - TraceID id = new TraceID(uuid, parentSpanID, spanID, sampled, flags); - if (logger.isLoggable(Level.INFO)) { + DefaultTraceID id = new DefaultTraceID(uuid, parentSpanID, spanID, sampled, flags); + if (logger.isInfoEnabled()) { logger.info("TraceID exist. continue trace. " + id); } return id; @@ -156,9 +151,12 @@ public class ExecuteMethodInterceptor implements StaticAroundInterceptor, ByteCo @Override public void setMethodDescriptor(MethodDescriptor descriptor) { this.descriptor = descriptor; - TraceContext traceContext = DefaultTraceContext.getTraceContext(); traceContext.cacheApi(descriptor); } + @Override + public void setTraceContext(TraceContext traceContext) { + this.traceContext = traceContext; + } } \ No newline at end of file diff --git a/src/main/java/com/profiler/modifier/connector/httpclient4/interceptor/Execute2MethodInterceptor.java b/src/main/java/com/profiler/modifier/connector/httpclient4/interceptor/Execute2MethodInterceptor.java index 9186f7a80..0c1c107ae 100644 --- a/src/main/java/com/profiler/modifier/connector/httpclient4/interceptor/Execute2MethodInterceptor.java +++ b/src/main/java/com/profiler/modifier/connector/httpclient4/interceptor/Execute2MethodInterceptor.java @@ -1,9 +1,11 @@ package com.profiler.modifier.connector.httpclient4.interceptor; import java.net.URI; -import java.util.logging.Logger; +import com.profiler.logging.Logger; import com.profiler.context.*; +import com.profiler.interceptor.TraceContextSupport; +import com.profiler.logging.LoggerFactory; import org.apache.http.HttpHost; import org.apache.http.client.methods.HttpUriRequest; @@ -24,19 +26,19 @@ import com.profiler.logging.LoggingUtils; * public final HttpResponse execute(HttpUriRequest request) throws IOException, ClientProtocolException * */ -public class Execute2MethodInterceptor implements StaticAroundInterceptor, ByteCodeMethodDescriptorSupport { +public class Execute2MethodInterceptor implements StaticAroundInterceptor, ByteCodeMethodDescriptorSupport, TraceContextSupport { - private final Logger logger = Logger.getLogger(Execute2MethodInterceptor.class.getName()); - private final boolean isDebug = LoggingUtils.isDebug(logger); + private final Logger logger = LoggerFactory.getLogger(Execute2MethodInterceptor.class.getName()); + private final boolean isDebug = logger.isDebugEnabled(); private MethodDescriptor descriptor; + private TraceContext traceContext; - @Override + @Override public void before(Object target, String className, String methodName, String parameterDescription, Object[] args) { if (isDebug) { LoggingUtils.logBefore(logger, target, className, methodName, parameterDescription, args); } - TraceContext traceContext = DefaultTraceContext.getTraceContext(); Trace trace = traceContext.currentTraceObject(); if (trace == null) { return; @@ -75,7 +77,6 @@ public class Execute2MethodInterceptor implements StaticAroundInterceptor, ByteC LoggingUtils.logAfter(logger, target, className, methodName, parameterDescription, args); } - TraceContext traceContext = DefaultTraceContext.getTraceContext(); Trace trace = traceContext.currentTraceObject(); if (trace == null) { return; @@ -90,7 +91,6 @@ public class Execute2MethodInterceptor implements StaticAroundInterceptor, ByteC @Override public void setMethodDescriptor(MethodDescriptor descriptor) { this.descriptor = descriptor; - TraceContext traceContext = DefaultTraceContext.getTraceContext(); traceContext.cacheApi(descriptor); } @@ -147,4 +147,9 @@ public class Execute2MethodInterceptor implements StaticAroundInterceptor, ByteC } return target; } + + @Override + public void setTraceContext(TraceContext traceContext) { + this.traceContext = traceContext; + } } \ No newline at end of file diff --git a/src/main/java/com/profiler/modifier/connector/httpclient4/interceptor/ExecuteMethodInterceptor.java b/src/main/java/com/profiler/modifier/connector/httpclient4/interceptor/ExecuteMethodInterceptor.java index db070f34d..1e6674ed4 100644 --- a/src/main/java/com/profiler/modifier/connector/httpclient4/interceptor/ExecuteMethodInterceptor.java +++ b/src/main/java/com/profiler/modifier/connector/httpclient4/interceptor/ExecuteMethodInterceptor.java @@ -1,9 +1,11 @@ package com.profiler.modifier.connector.httpclient4.interceptor; -import java.util.logging.Logger; +import com.profiler.logging.Logger; import com.profiler.common.AnnotationKey; import com.profiler.context.*; +import com.profiler.interceptor.TraceContextSupport; +import com.profiler.logging.LoggerFactory; import org.apache.http.HttpHost; import org.apache.http.HttpRequest; @@ -26,20 +28,21 @@ import com.profiler.logging.LoggingUtils; * throws IOException, ClientProtocolException { * */ -public class ExecuteMethodInterceptor implements StaticAroundInterceptor, ByteCodeMethodDescriptorSupport { +public class ExecuteMethodInterceptor implements StaticAroundInterceptor, ByteCodeMethodDescriptorSupport, TraceContextSupport { - private final Logger logger = Logger.getLogger(ExecuteMethodInterceptor.class.getName()); - private final boolean isDebug = LoggingUtils.isDebug(logger); + private final Logger logger = LoggerFactory.getLogger(ExecuteMethodInterceptor.class.getName()); + private final boolean isDebug = logger.isDebugEnabled(); private MethodDescriptor descriptor; -// private int apiId; + private TraceContext traceContext; + // private int apiId; @Override public void before(Object target, String className, String methodName, String parameterDescription, Object[] args) { if (isDebug) { LoggingUtils.logBefore(logger, target, className, methodName, parameterDescription, args); } - TraceContext traceContext = DefaultTraceContext.getTraceContext(); + System.out.println("-------------------------"); Trace trace = traceContext.currentTraceObject(); if (trace == null) { return; @@ -64,7 +67,6 @@ public class ExecuteMethodInterceptor implements StaticAroundInterceptor, ByteCo trace.recordServiceType(ServiceType.HTTP_CLIENT); int port = host.getPort(); -// trace.recordEndPoint(host.getHostName() + ((port > 0) ? ":" + port : "")); trace.recordDestinationId(host.getHostName() + ((port > 0) ? ":" + port : "")); trace.recordAttribute(AnnotationKey.HTTP_URL, request.getRequestLine().getUri()); @@ -77,7 +79,6 @@ public class ExecuteMethodInterceptor implements StaticAroundInterceptor, ByteCo LoggingUtils.logAfter(logger, target, className, methodName, parameterDescription, args); } - TraceContext traceContext = DefaultTraceContext.getTraceContext(); Trace trace = traceContext.currentTraceObject(); if (trace == null) { return; @@ -93,8 +94,11 @@ public class ExecuteMethodInterceptor implements StaticAroundInterceptor, ByteCo @Override public void setMethodDescriptor(MethodDescriptor descriptor) { this.descriptor = descriptor; - TraceContext traceContext = DefaultTraceContext.getTraceContext(); traceContext.cacheApi(descriptor); } + @Override + public void setTraceContext(TraceContext traceContext) { + this.traceContext = traceContext; + } } \ No newline at end of file diff --git a/src/main/java/com/profiler/modifier/connector/jdkhttpconnector/interceptor/ConnectMethodInterceptor.java b/src/main/java/com/profiler/modifier/connector/jdkhttpconnector/interceptor/ConnectMethodInterceptor.java index 0c9921ef7..d70ee7885 100644 --- a/src/main/java/com/profiler/modifier/connector/jdkhttpconnector/interceptor/ConnectMethodInterceptor.java +++ b/src/main/java/com/profiler/modifier/connector/jdkhttpconnector/interceptor/ConnectMethodInterceptor.java @@ -1,7 +1,7 @@ package com.profiler.modifier.connector.jdkhttpconnector.interceptor; import java.net.HttpURLConnection; -import java.util.logging.Logger; +import com.profiler.logging.Logger; import com.profiler.common.AnnotationKey; import com.profiler.common.ServiceType; @@ -9,25 +9,27 @@ import com.profiler.context.*; import com.profiler.interceptor.ByteCodeMethodDescriptorSupport; import com.profiler.interceptor.MethodDescriptor; import com.profiler.interceptor.StaticAroundInterceptor; +import com.profiler.interceptor.TraceContextSupport; +import com.profiler.logging.LoggerFactory; import com.profiler.logging.LoggingUtils; /** * @author netspider * */ -public class ConnectMethodInterceptor implements StaticAroundInterceptor, ByteCodeMethodDescriptorSupport { +public class ConnectMethodInterceptor implements StaticAroundInterceptor, ByteCodeMethodDescriptorSupport, TraceContextSupport { - private final Logger logger = Logger.getLogger(ConnectMethodInterceptor.class.getName()); - private final boolean isDebug = LoggingUtils.isDebug(logger); + private final Logger logger = LoggerFactory.getLogger(ConnectMethodInterceptor.class.getName()); + private final boolean isDebug = logger.isDebugEnabled(); private MethodDescriptor descriptor; + private TraceContext traceContext; - @Override + @Override public void before(Object target, String className, String methodName, String parameterDescription, Object[] args) { if (isDebug) { LoggingUtils.logBefore(logger, target, className, methodName, parameterDescription, args); } - TraceContext traceContext = DefaultTraceContext.getTraceContext(); Trace trace = traceContext.currentTraceObject(); if (trace == null) { return; @@ -55,7 +57,6 @@ public class ConnectMethodInterceptor implements StaticAroundInterceptor, ByteCo int port = request.getURL().getPort(); // TODO protocol은 어떻게 표기하지??? -// trace.recordEndPoint(host + ((port > 0) ? ":" + port : "")); trace.recordDestinationId(host + ((port > 0) ? ":" + port : "")); trace.recordAttribute(AnnotationKey.HTTP_URL, request.getURL().toString()); @@ -68,7 +69,6 @@ public class ConnectMethodInterceptor implements StaticAroundInterceptor, ByteCo LoggingUtils.logAfter(logger, target, className, methodName, parameterDescription, args); } - TraceContext traceContext = DefaultTraceContext.getTraceContext(); Trace trace = traceContext.currentTraceObject(); if (trace == null) { return; @@ -83,7 +83,11 @@ public class ConnectMethodInterceptor implements StaticAroundInterceptor, ByteCo @Override public void setMethodDescriptor(MethodDescriptor descriptor) { this.descriptor = descriptor; - TraceContext traceContext = DefaultTraceContext.getTraceContext(); traceContext.cacheApi(descriptor); } + + @Override + public void setTraceContext(TraceContext traceContext) { + this.traceContext = traceContext; + } } \ No newline at end of file diff --git a/src/main/java/com/profiler/modifier/db/interceptor/ConnectionCloseInterceptor.java b/src/main/java/com/profiler/modifier/db/interceptor/ConnectionCloseInterceptor.java index 7cb35bd09..994bb0dc6 100644 --- a/src/main/java/com/profiler/modifier/db/interceptor/ConnectionCloseInterceptor.java +++ b/src/main/java/com/profiler/modifier/db/interceptor/ConnectionCloseInterceptor.java @@ -1,18 +1,18 @@ package com.profiler.modifier.db.interceptor; import com.profiler.interceptor.StaticBeforeInterceptor; +import com.profiler.interceptor.util.JDBCScope; +import com.profiler.logging.LoggerFactory; import com.profiler.logging.LoggingUtils; import com.profiler.util.MetaObject; -import com.profiler.util.StringUtils; import java.sql.Connection; -import java.util.Arrays; -import java.util.logging.Logger; +import com.profiler.logging.Logger; public class ConnectionCloseInterceptor implements StaticBeforeInterceptor { - private final Logger logger = Logger.getLogger(ConnectionCloseInterceptor.class.getName()); - private final boolean isDebug = LoggingUtils.isDebug(logger); + private final Logger logger = LoggerFactory.getLogger(ConnectionCloseInterceptor.class.getName()); + private final boolean isDebug = logger.isDebugEnabled(); private static final Object[] EMPTY = new Object[]{null}; diff --git a/src/main/java/com/profiler/modifier/db/interceptor/DataSourceGetConnectionInterceptor.java b/src/main/java/com/profiler/modifier/db/interceptor/DataSourceGetConnectionInterceptor.java index aa114d89e..f1cccab02 100644 --- a/src/main/java/com/profiler/modifier/db/interceptor/DataSourceGetConnectionInterceptor.java +++ b/src/main/java/com/profiler/modifier/db/interceptor/DataSourceGetConnectionInterceptor.java @@ -1,21 +1,20 @@ package com.profiler.modifier.db.interceptor; import com.profiler.interceptor.StaticAroundInterceptor; +import com.profiler.logging.LoggerFactory; import com.profiler.logging.LoggingUtils; import com.profiler.util.InterceptorUtils; -import com.profiler.util.StringUtils; import java.sql.Connection; -import java.util.Arrays; -import java.util.logging.Logger; +import com.profiler.logging.Logger; /** * Datasource의 get을 추적해야 될것으로 예상됨. */ public class DataSourceGetConnectionInterceptor implements StaticAroundInterceptor { - private final Logger logger = Logger.getLogger(DataSourceGetConnectionInterceptor.class.getName()); - private final boolean isDebug = LoggingUtils.isDebug(logger); + private final Logger logger = LoggerFactory.getLogger(DataSourceGetConnectionInterceptor.class.getName()); + private final boolean isDebug = logger.isDebugEnabled(); @Override public void before(Object target, String className, String methodName, String parameterDescription, Object[] args) { diff --git a/src/main/java/com/profiler/modifier/servlet/interceptors/DoXXXInterceptor.java b/src/main/java/com/profiler/modifier/servlet/interceptors/DoXXXInterceptor.java index 28a234dd1..62da24bbd 100644 --- a/src/main/java/com/profiler/modifier/servlet/interceptors/DoXXXInterceptor.java +++ b/src/main/java/com/profiler/modifier/servlet/interceptors/DoXXXInterceptor.java @@ -3,7 +3,8 @@ package com.profiler.modifier.servlet.interceptors; import java.util.Enumeration; import java.util.UUID; import java.util.logging.Level; -import java.util.logging.Logger; +import com.profiler.logging.Logger; +import com.profiler.logging.LoggerFactory; import javax.servlet.http.HttpServletRequest; @@ -19,8 +20,8 @@ import com.profiler.util.NumberUtils; public class DoXXXInterceptor implements StaticAroundInterceptor, ByteCodeMethodDescriptorSupport, TraceContextSupport { - private final Logger logger = Logger.getLogger(DoXXXInterceptor.class.getName()); - private final boolean isDebug = LoggingUtils.isDebug(logger); + private final Logger logger = LoggerFactory.getLogger(DoXXXInterceptor.class.getName()); + private final boolean isDebug = logger.isDebugEnabled(); private MethodDescriptor descriptor; private TraceContext traceContext; @@ -56,31 +57,26 @@ public class DoXXXInterceptor implements StaticAroundInterceptor, ByteCodeMethod } try { - traceContext.getActiveThreadCounter().start(); +// traceContext.getActiveThreadCounter().start(); HttpServletRequest request = (HttpServletRequest) args[0]; String requestURL = request.getRequestURI(); String clientIP = request.getRemoteAddr(); TraceID traceId = populateTraceIdFromRequest(request); - DefaultTrace trace; + Trace trace; if (traceId != null) { - // TraceID nextTraceId = traceId.getNextTraceId(); - if (logger.isLoggable(Level.INFO)) { - // logger.info("TraceID exist. continue trace. " + nextTraceId); + if (logger.isInfoEnabled()) { logger.info("TraceID exist. continue trace. " + traceId); - logger.log(Level.FINE, "requestUrl:" + requestURL + " clientIp" + clientIP); + logger.debug("requestUrl:" + requestURL + " clientIp" + clientIP); } - // trace = new Trace(nextTraceId); - trace = new DefaultTrace(traceId); - traceContext.attachTraceObject(trace); + trace = traceContext.continueTraceObject(traceId); } else { - trace = new DefaultTrace(); - if (logger.isLoggable(Level.INFO)) { + trace = traceContext.newTraceObject(); + if (logger.isInfoEnabled()) { logger.info("TraceID not exist. start new trace. " + trace.getTraceId()); - logger.log(Level.FINE, "requestUrl:" + requestURL + " clientIp" + clientIP); + logger.debug("requestUrl:" + requestURL + " clientIp" + clientIP); } - traceContext.attachTraceObject(trace); } trace.markBeforeTime(); @@ -92,8 +88,8 @@ public class DoXXXInterceptor implements StaticAroundInterceptor, ByteCodeMethod trace.recordDestinationId(request.getServerName() + ((port > 0) ? ":" + port : "")); trace.recordAttribute(AnnotationKey.HTTP_URL, request.getRequestURI()); } catch (Exception e) { - if (logger.isLoggable(Level.WARNING)) { - logger.log(Level.WARNING, "Tomcat StandardHostValve trace start fail. Caused:" + e.getMessage(), e); + if (logger.isWarnEnabled()) { + logger.warn("Tomcat StandardHostValve trace start fail. Caused:" + e.getMessage(), e); } } } @@ -104,7 +100,6 @@ public class DoXXXInterceptor implements StaticAroundInterceptor, ByteCodeMethod LoggingUtils.logAfter(logger, target, className, methodName, parameterDescription, args, result); } - traceContext.getActiveThreadCounter().end(); Trace trace = traceContext.currentTraceObject(); if (trace == null) { return; @@ -119,7 +114,7 @@ public class DoXXXInterceptor implements StaticAroundInterceptor, ByteCodeMethod if (trace.getStackFrameId() != 0) { - logger.warning("Corrupted CallStack found. StackId not Root(0)"); + logger.warn("Corrupted CallStack found. StackId not Root(0)"); // 문제 있는 callstack을 dump하면 도움이 될듯. } @@ -147,8 +142,8 @@ public class DoXXXInterceptor implements StaticAroundInterceptor, ByteCodeMethod boolean sampled = Boolean.parseBoolean(request.getHeader(Header.HTTP_SAMPLED.toString())); short flags = NumberUtils.parseShort(request.getHeader(Header.HTTP_FLAGS.toString()), (short) 0); - TraceID id = new TraceID(uuid, parentSpanID, spanID, sampled, flags); - if (logger.isLoggable(Level.INFO)) { + TraceID id = new DefaultTraceID(uuid, parentSpanID, spanID, sampled, flags); + if (logger.isInfoEnabled()) { logger.info("TraceID exist. continue trace. " + id); } return id; @@ -184,8 +179,7 @@ public class DoXXXInterceptor implements StaticAroundInterceptor, ByteCodeMethod @Override public void setMethodDescriptor(MethodDescriptor descriptor) { this.descriptor = descriptor; - TraceContext traceContext = DefaultTraceContext.getTraceContext(); - traceContext.cacheApi(descriptor); + this.traceContext.cacheApi(descriptor); } diff --git a/src/main/java/com/profiler/modifier/tomcat/interceptors/StandardHostValveInvokeInterceptor.java b/src/main/java/com/profiler/modifier/tomcat/interceptors/StandardHostValveInvokeInterceptor.java index 75817957e..4809a43f1 100644 --- a/src/main/java/com/profiler/modifier/tomcat/interceptors/StandardHostValveInvokeInterceptor.java +++ b/src/main/java/com/profiler/modifier/tomcat/interceptors/StandardHostValveInvokeInterceptor.java @@ -3,7 +3,8 @@ package com.profiler.modifier.tomcat.interceptors; import java.util.Enumeration; import java.util.UUID; import java.util.logging.Level; -import java.util.logging.Logger; +import com.profiler.logging.Logger; +import com.profiler.logging.LoggerFactory; import javax.servlet.http.HttpServletRequest; @@ -20,8 +21,8 @@ import com.profiler.util.NumberUtils; public class StandardHostValveInvokeInterceptor implements StaticAroundInterceptor, ByteCodeMethodDescriptorSupport, TraceContextSupport { - private final Logger logger = Logger.getLogger(StandardHostValveInvokeInterceptor.class.getName()); - private final boolean isDebug = LoggingUtils.isDebug(logger); + private final Logger logger = LoggerFactory.getLogger(StandardHostValveInvokeInterceptor.class.getName()); + private final boolean isDebug = logger.isInfoEnabled(); private MethodDescriptor descriptor; // private int apiId; @@ -34,29 +35,27 @@ public class StandardHostValveInvokeInterceptor implements StaticAroundIntercept } try { - traceContext.getActiveThreadCounter().start(); +// traceContext.getActiveThreadCounter().start(); HttpServletRequest request = (HttpServletRequest) args[0]; String requestURL = request.getRequestURI(); String remoteAddr = request.getRemoteAddr(); TraceID traceId = populateTraceIdFromRequest(request); - DefaultTrace trace; + Trace trace; if (traceId != null) { - if (logger.isLoggable(Level.INFO)) { + if (logger.isInfoEnabled()) { logger.info("TraceID exist. continue trace. " + traceId); - logger.log(Level.FINE, "requestUrl:" + requestURL + ", remoteAddr:" + remoteAddr); + logger.debug("requestUrl:" + requestURL + ", remoteAddr:" + remoteAddr); } - // trace = new Trace(nextTraceId); - trace = new DefaultTrace(traceId); - traceContext.attachTraceObject(trace); + + trace = traceContext.continueTraceObject(traceId); } else { - trace = new DefaultTrace(); - if (logger.isLoggable(Level.INFO)) { + trace = traceContext.newTraceObject(); + if (logger.isInfoEnabled()) { logger.info("TraceID not exist. start new trace. " + trace.getTraceId()); - logger.log(Level.FINE, "requestUrl:" + requestURL + ", remoteAddr:" + remoteAddr); + logger.debug("requestUrl:" + requestURL + ", remoteAddr:" + remoteAddr); } - traceContext.attachTraceObject(trace); } trace.markBeforeTime(); @@ -80,8 +79,8 @@ public class StandardHostValveInvokeInterceptor implements StaticAroundIntercept // TODO 여기에서 client 정보를 수집할 수 있다. } } catch (Exception e) { - if (logger.isLoggable(Level.WARNING)) { - logger.log(Level.WARNING, "Tomcat StandardHostValve trace start fail. Caused:" + e.getMessage(), e); + if (logger.isWarnEnabled()) { + logger.warn("Tomcat StandardHostValve trace start fail. Caused:" + e.getMessage(), e); } } } @@ -92,7 +91,7 @@ public class StandardHostValveInvokeInterceptor implements StaticAroundIntercept LoggingUtils.logAfter(logger, target, className, methodName, parameterDescription, args, result); } - traceContext.getActiveThreadCounter().end(); +// traceContext.getActiveThreadCounter().end(); Trace trace = traceContext.currentTraceObject(); if (trace == null) { return; @@ -107,7 +106,7 @@ public class StandardHostValveInvokeInterceptor implements StaticAroundIntercept if (trace.getStackFrameId() != 0) { - logger.warning("Corrupted CallStack found. StackId not Root(0)"); + logger.warn("Corrupted CallStack found. StackId not Root(0)"); // 문제 있는 callstack을 dump하면 도움이 될듯. } @@ -126,7 +125,7 @@ public class StandardHostValveInvokeInterceptor implements StaticAroundIntercept * @param request * @return */ - private TraceID populateTraceIdFromRequest(HttpServletRequest request) { + private DefaultTraceID populateTraceIdFromRequest(HttpServletRequest request) { String strUUID = request.getHeader(Header.HTTP_TRACE_ID.toString()); if (strUUID != null) { UUID uuid = UUID.fromString(strUUID); @@ -135,8 +134,8 @@ public class StandardHostValveInvokeInterceptor implements StaticAroundIntercept boolean sampled = Boolean.parseBoolean(request.getHeader(Header.HTTP_SAMPLED.toString())); short flags = NumberUtils.parseShort(request.getHeader(Header.HTTP_FLAGS.toString()), (short) 0); - TraceID id = new TraceID(uuid, parentSpanID, spanID, sampled, flags); - if (logger.isLoggable(Level.INFO)) { + DefaultTraceID id = new DefaultTraceID(uuid, parentSpanID, spanID, sampled, flags); + if (logger.isInfoEnabled()) { logger.info("TraceID exist. continue trace. " + id); } return id; @@ -184,8 +183,7 @@ public class StandardHostValveInvokeInterceptor implements StaticAroundIntercept @Override public void setMethodDescriptor(MethodDescriptor descriptor) { this.descriptor = descriptor; - TraceContext traceContext = DefaultTraceContext.getTraceContext(); - traceContext.cacheApi(descriptor); + this.traceContext.cacheApi(descriptor); } @Override diff --git a/src/main/java/com/profiler/trace/RequestTracer.java b/src/main/java/com/profiler/trace/RequestTracer.java index f7e5106e5..a1901f024 100644 --- a/src/main/java/com/profiler/trace/RequestTracer.java +++ b/src/main/java/com/profiler/trace/RequestTracer.java @@ -4,11 +4,10 @@ import java.util.Collections; import java.util.HashSet; import java.util.Set; -import com.profiler.Agent; +import com.profiler.DefaultAgent; import com.profiler.common.dto.thrift.RequestDataListThriftDTO; import com.profiler.common.dto.thrift.RequestThriftDTO; import com.profiler.config.ProfilerConstant; -import com.profiler.util.SystemUtils; @Deprecated public class RequestTracer { @@ -29,7 +28,7 @@ public class RequestTracer { currentRequestHash.set(tempRequestHashCode); requestSet.add(tempRequestID); - RequestThriftDTO dto = new RequestThriftDTO(Agent.getInstance().getAgentId(), tempRequestHashCode, ProfilerConstant.DATA_TYPE_REQUEST, requestTime, cpuUserTime[0], cpuUserTime[1]); + RequestThriftDTO dto = new RequestThriftDTO(DefaultAgent.getInstance().getAgentId(), tempRequestHashCode, ProfilerConstant.DATA_TYPE_REQUEST, requestTime, cpuUserTime[0], cpuUserTime[1]); dto.setClientIP(clientIP); dto.setRequestURL(requestURL); @@ -48,7 +47,7 @@ public class RequestTracer { public static void endTransaction() { long cpuUserTime[] = null; // long cpuUserTime[] = SystemUtils.getThreadTime(); - RequestThriftDTO dto = new RequestThriftDTO(Agent.getInstance().getAgentId(), currentRequestHash.get(), ProfilerConstant.DATA_TYPE_RESPONSE, System.currentTimeMillis(), cpuUserTime[0], cpuUserTime[1]); + RequestThriftDTO dto = new RequestThriftDTO(DefaultAgent.getInstance().getAgentId(), currentRequestHash.get(), ProfilerConstant.DATA_TYPE_RESPONSE, System.currentTimeMillis(), cpuUserTime[0], cpuUserTime[1]); finishTransaction(dto); } @@ -61,7 +60,7 @@ public class RequestTracer { public static void exceptionTransaction(Throwable throwable) { // long cpuUserTime[] = SystemUtils.getThreadTime(); long cpuUserTime[] = null; - RequestThriftDTO dto = new RequestThriftDTO(Agent.getInstance().getAgentId(), currentRequestHash.get(), ProfilerConstant.DATA_TYPE_UNCAUGHT_EXCEPTION, System.currentTimeMillis(), cpuUserTime[0], cpuUserTime[1]); + RequestThriftDTO dto = new RequestThriftDTO(DefaultAgent.getInstance().getAgentId(), currentRequestHash.get(), ProfilerConstant.DATA_TYPE_UNCAUGHT_EXCEPTION, System.currentTimeMillis(), cpuUserTime[0], cpuUserTime[1]); dto.setExtraData1(throwable.getMessage()); diff --git a/src/main/java/com/profiler/util/ReflectionUtils.java b/src/main/java/com/profiler/util/ReflectionUtils.java deleted file mode 100644 index f36e6dda6..000000000 --- a/src/main/java/com/profiler/util/ReflectionUtils.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.profiler.util; - -import java.lang.reflect.Field; - -public class ReflectionUtils { - public static Field findField(Class targetClass, String fieldName) { - Field[] declaredFields = targetClass.getDeclaredFields(); - for (Field f : declaredFields) { - if (f.getName().equals(fieldName)) { - return f; - } - } - return null; - } -} diff --git a/src/test/java/com/profiler/AgentClassLoaderTest.java b/src/test/java/com/profiler/AgentClassLoaderTest.java index 973d7dc7f..f5297f488 100644 --- a/src/test/java/com/profiler/AgentClassLoaderTest.java +++ b/src/test/java/com/profiler/AgentClassLoaderTest.java @@ -1,6 +1,8 @@ package com.profiler; +import com.profiler.bootstrap.AgentClassLoader; +import com.profiler.config.ProfilerConfig; import com.profiler.logging.LoggerBinder; import org.junit.Test; import org.slf4j.Logger; @@ -41,10 +43,10 @@ public class AgentClassLoaderTest { AgentClassLoader agentClassLoader = new AgentClassLoader(lib); agentClassLoader.setBootClass("com.profiler.boot.BootClassTest"); - agentClassLoader.boot(); + agentClassLoader.boot("test", new DummyInstrumentation(), new ProfilerConfig()); - LoggerBinder loggerBinder = agentClassLoader.initializeLoggerBinder(); + LoggerBinder loggerBinder = (LoggerBinder) agentClassLoader.initializeLoggerBinder(); com.profiler.logging.Logger test = loggerBinder.getLogger("test"); test.info("slf4j logger test"); diff --git a/src/test/java/com/profiler/config/ProfilerConfigTest.java b/src/test/java/com/profiler/config/ProfilerConfigTest.java deleted file mode 100644 index 8d932d2d9..000000000 --- a/src/test/java/com/profiler/config/ProfilerConfigTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.profiler.config; - -import java.io.IOException; - -import junit.framework.Assert; - -import org.junit.Test; - -public class ProfilerConfigTest { - - @Test - public void testIsProfilableClassWithNoConfiguration() throws IOException { - ProfilerConfig profilerConfig = new ProfilerConfig(); -// profilerConfig.readConfigFile(); - - Assert.assertFalse(profilerConfig.isProfilableClass("com/nhn/hippo/testweb/controllers/MyController")); - Assert.assertFalse(profilerConfig.isProfilableClass("net/spider/king/wang/Jjang")); - Assert.assertFalse(profilerConfig.isProfilableClass("com/nhn/hippo/testweb2/controller/MyController")); - Assert.assertFalse(profilerConfig.isProfilableClass("com/nhn/hippo/testweb2/MyClass")); - } - - /** - *
-	 * configuration is 
-	 * profile.package.include=com.nhn.hippo.testweb.controller.*,com.nhn.hippo.testweb.MyClass
-	 * 
- * - * @throws IOException - */ - @Test - public void testIsProfilableClass() throws IOException { - System.setProperty("hippo.config", "src/test/resources/hippo.config"); - ProfilerConfig profilerConfig = new ProfilerConfig(); -// profilerConfig.readConfigFile(); - - Assert.assertTrue(profilerConfig.isProfilableClass("com/nhn/hippo/testweb/MyClass")); - Assert.assertTrue(profilerConfig.isProfilableClass("com/nhn/hippo/testweb/controller/MyController")); - Assert.assertTrue(profilerConfig.isProfilableClass("com/nhn/hippo/testweb/controller/customcontroller/MyCustomController")); - - Assert.assertFalse(profilerConfig.isProfilableClass("com/nhn/hippo/testweb/MyUnknownClass")); - Assert.assertFalse(profilerConfig.isProfilableClass("com/nhn/hippo/testweb/controller2/MyController")); - } - -} diff --git a/src/test/java/com/profiler/context/CallStackTest.java b/src/test/java/com/profiler/context/CallStackTest.java index c08328464..0e4f93e52 100644 --- a/src/test/java/com/profiler/context/CallStackTest.java +++ b/src/test/java/com/profiler/context/CallStackTest.java @@ -13,7 +13,7 @@ public class CallStackTest { @Test public void testPush() throws Exception { - TraceID traceID = TraceID.newTraceId(); + DefaultTraceID traceID = DefaultTraceID.newTraceId(); CallStack callStack = new CallStack(traceID); int stackIndex = callStack.getStackFrameIndex(); logger.info(String.valueOf(stackIndex)); diff --git a/src/test/java/com/profiler/context/TraceTest.java b/src/test/java/com/profiler/context/TraceTest.java index 574dcb459..fa56d0a19 100644 --- a/src/test/java/com/profiler/context/TraceTest.java +++ b/src/test/java/com/profiler/context/TraceTest.java @@ -15,7 +15,7 @@ public class TraceTest { @Test public void trace() { - TraceID traceID = TraceID.newTraceId(); + DefaultTraceID traceID = DefaultTraceID.newTraceId(); DefaultTrace trace = new DefaultTrace(traceID); trace.setStorage(new BypassStorage(LoggingDataSender.DEFAULT_LOGGING_DATA_SENDER)); trace.traceBlockBegin(); @@ -38,7 +38,7 @@ public class TraceTest { @Test public void popEventTest() { - TraceID traceID = TraceID.newTraceId(); + DefaultTraceID traceID = DefaultTraceID.newTraceId(); DefaultTrace trace = new DefaultTrace(traceID); TestDataSender dataSender = new TestDataSender(); BypassStorage bypassStorage = new BypassStorage(); diff --git a/src/test/java/com/profiler/modifier/db/mysql/MySQLConnectionImplModifierTest.java b/src/test/java/com/profiler/modifier/db/mysql/MySQLConnectionImplModifierTest.java index d5c036c4f..7a15575fd 100644 --- a/src/test/java/com/profiler/modifier/db/mysql/MySQLConnectionImplModifierTest.java +++ b/src/test/java/com/profiler/modifier/db/mysql/MySQLConnectionImplModifierTest.java @@ -1,13 +1,13 @@ package com.profiler.modifier.db.mysql; import com.mysql.jdbc.JDBC4PreparedStatement; -import com.profiler.Agent; +import com.profiler.DefaultAgent; +import com.profiler.DummyInstrumentation; import com.profiler.config.ProfilerConfig; import com.profiler.context.BypassStorageFactory; -import com.profiler.context.DefaultTrace; import com.profiler.context.DefaultTraceContext; -import com.profiler.context.TraceContext; -import com.profiler.modifier.db.util.DatabaseInfo; +import com.profiler.context.Trace; +import com.profiler.modifier.db.DatabaseInfo; import com.profiler.sender.LoggingDataSender; import com.profiler.util.MetaObject; import com.profiler.util.TestClassLoader; @@ -31,7 +31,7 @@ public class MySQLConnectionImplModifierTest { loader = new TestClassLoader(); ProfilerConfig profilerConfig = new ProfilerConfig(); - Agent agent = new Agent(profilerConfig); + DefaultAgent agent = new DefaultAgent("", new DummyInstrumentation(), profilerConfig); MySQLNonRegisteringDriverModifier driverModifier = new MySQLNonRegisteringDriverModifier(loader.getInstrumentor(), agent); loader.addModifier(driverModifier); @@ -68,8 +68,8 @@ public class MySQLConnectionImplModifierTest { DefaultTraceContext traceContext = DefaultTraceContext.getTraceContext(); traceContext.setStorageFactory(new BypassStorageFactory(LoggingDataSender.DEFAULT_LOGGING_DATA_SENDER)); - DefaultTrace trace = new DefaultTrace(); - traceContext.attachTraceObject(trace); + + Trace trace = traceContext.newTraceObject(); Connection connection = driver.connect("jdbc:mysql://10.98.133.22:3306/hippo", properties);