From a1ab73c998bd2674e85972bd32d4129ceb95faf5 Mon Sep 17 00:00:00 2001 From: Woonduk Kang Date: Fri, 8 Feb 2013 05:57:31 +0000 Subject: [PATCH] =?UTF-8?q?[=EA=B0=95=EC=9A=B4=EB=8D=95]=20[LUCYSUS-1744]?= =?UTF-8?q?=20api=20metadata=EB=A5=BC=20=EB=B3=84=EB=8F=84=20=EC=A0=84?= =?UTF-8?q?=EC=86=A1=ED=95=98=EA=B3=A0=20metadata=EC=9D=98=20=EC=83=81?= =?UTF-8?q?=EC=88=98=EA=B0=92=EC=9D=84=20=EC=A0=84=EB=8B=AC=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=A1=9C=EC=A7=81=20=EA=B0=9C=EB=B0=9C.?= 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@1163 84d0f5b1-2673-498c-a247-62c4ff18d310 --- src/main/java/com/profiler/Agent.java | 16 +++++++++- src/main/java/com/profiler/context/Span.java | 2 ++ .../java/com/profiler/context/SubSpan.java | 4 ++- .../com/profiler/context/SubSpanList.java | 3 ++ src/main/java/com/profiler/context/Trace.java | 6 ++-- .../com/profiler/context/TraceContext.java | 4 +++ .../java/com/profiler/context/TraceID.java | 14 ++++---- .../com/profiler/metadata/StringCache.java | 6 ++-- .../ExecuteMethodInterceptor.java | 2 +- .../StandardHostValveInvokeInterceptor.java | 2 +- .../com/profiler/sender/UdpDataSender.java | 6 ++-- .../com/profiler/trace/RequestTracer.java | 11 ++++--- .../java/com/profiler/util/NumberUtils.java | 32 +++++++++---------- src/main/java/com/profiler/util/Scope.java | 6 ++-- .../java/com/profiler/util/StringUtils.java | 10 +++--- .../java/com/profiler/util/SystemUtils.java | 17 ++++------ .../util/HeaderTBaseSerializerTest.java | 8 ++--- 17 files changed, 88 insertions(+), 61 deletions(-) diff --git a/src/main/java/com/profiler/Agent.java b/src/main/java/com/profiler/Agent.java index 3e7091437..734c8faac 100644 --- a/src/main/java/com/profiler/Agent.java +++ b/src/main/java/com/profiler/Agent.java @@ -2,6 +2,7 @@ package com.profiler; import java.io.UnsupportedEncodingException; import java.util.Map.Entry; +import java.util.Random; import java.util.logging.Level; import java.util.logging.Logger; @@ -20,6 +21,7 @@ import com.profiler.util.NetworkUtils; public class Agent { private static final Logger logger = Logger.getLogger(Agent.class.getName()); + private static final Random IDENTIFIER_KEY = new Random(); private volatile boolean alive = false; @@ -34,6 +36,9 @@ public class Agent { private final String nodeName; private final String applicationName; private final long startTime; + private final short identifier; + + public Agent(ProfilerConfig profilerConfig) { Assert.notNull(profilerConfig, "profilerConfig must not be null"); @@ -51,6 +56,7 @@ public class Agent { this.dataSender = createDataSender(); this.startTime = System.currentTimeMillis(); + this.identifier = (short) IDENTIFIER_KEY.nextInt(16); initializeTraceContext(); @@ -115,7 +121,7 @@ public class Agent { return alive; } - public void setIsAlive(boolean alive) { + public void setAlive(boolean alive) { this.alive = alive; } @@ -127,6 +133,10 @@ public class Agent { return agentId; } + public short getIdentifier() { + return identifier; + } + public long getStartTime() { return startTime; } @@ -157,7 +167,9 @@ public class Agent { agentInfo.setHostname(ip); agentInfo.setPorts(ports); + agentInfo.setAgentId(getAgentId()); + agentInfo.setIdentifier(this.identifier); agentInfo.setApplicationName(getApplicationName()); agentInfo.setIsAlive(true); @@ -191,7 +203,9 @@ public class Agent { agentInfo.setHostname(ip); agentInfo.setPorts(ports); + agentInfo.setAgentId(getAgentId()); + agentInfo.setIdentifier(this.identifier); agentInfo.setApplicationName(getApplicationName()); agentInfo.setIsAlive(false); diff --git a/src/main/java/com/profiler/context/Span.java b/src/main/java/com/profiler/context/Span.java index bf93c65ce..e4ecc3c3d 100644 --- a/src/main/java/com/profiler/context/Span.java +++ b/src/main/java/com/profiler/context/Span.java @@ -133,6 +133,8 @@ public class Span implements Thriftable { com.profiler.common.dto.thrift.Span span = new com.profiler.common.dto.thrift.Span(); span.setAgentId(Agent.getInstance().getAgentId()); + span.setAgentIdentifier(Agent.getInstance().getIdentifier()); + span.setStartTime(startTime); span.setElapsed((int) (endTime - startTime)); span.setMostTraceId(traceID.getId().getMostSignificantBits()); diff --git a/src/main/java/com/profiler/context/SubSpan.java b/src/main/java/com/profiler/context/SubSpan.java index 87a087e6b..38a7211cd 100644 --- a/src/main/java/com/profiler/context/SubSpan.java +++ b/src/main/java/com/profiler/context/SubSpan.java @@ -131,7 +131,7 @@ public class SubSpan implements Thriftable { } public String toString() { - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(256); sb.append("{"); sb.append("\n\t Depth = ").append(depth); @@ -172,6 +172,8 @@ public class SubSpan implements Thriftable { // 다른 span의 sub로 들어가지 않을 경우 if (!child) { subSpan.setAgentId(Agent.getInstance().getAgentId()); + subSpan.setAgentIdentifier(Agent.getInstance().getIdentifier()); + TraceID parentSpanTraceID = parentSpan.getTraceID(); subSpan.setMostTraceId(parentSpanTraceID.getId().getMostSignificantBits()); subSpan.setLeastTraceId(parentSpanTraceID.getId().getLeastSignificantBits()); diff --git a/src/main/java/com/profiler/context/SubSpanList.java b/src/main/java/com/profiler/context/SubSpanList.java index 28cae295c..22ba356e4 100644 --- a/src/main/java/com/profiler/context/SubSpanList.java +++ b/src/main/java/com/profiler/context/SubSpanList.java @@ -25,6 +25,8 @@ public class SubSpanList implements Thriftable { SubSpan first = subSpanList.get(0); Span parentSpan = first.getParentSpan(); tSubSpanList.setAgentId(Agent.getInstance().getAgentId()); + tSubSpanList.setAgentIdentifier(Agent.getInstance().getIdentifier()); + UUID id = parentSpan.getTraceID().getId(); tSubSpanList.setMostTraceId(id.getMostSignificantBits()); tSubSpanList.setLeastTraceId(id.getLeastSignificantBits()); @@ -43,6 +45,7 @@ public class SubSpanList implements Thriftable { com.profiler.common.dto.thrift.SubSpan tSubSpan = new com.profiler.common.dto.thrift.SubSpan(); tSubSpan.setAgentId(Agent.getInstance().getAgentId()); + tSubSpan.setAgentIdentifier(Agent.getInstance().getIdentifier()); long parentSpanStartTime = subSpan.getParentSpan().getStartTime(); tSubSpan.setStartElapsed((int) (subSpan.getStartTime() - parentSpanStartTime)); diff --git a/src/main/java/com/profiler/context/Trace.java b/src/main/java/com/profiler/context/Trace.java index 7d8543fd4..cb176016a 100644 --- a/src/main/java/com/profiler/context/Trace.java +++ b/src/main/java/com/profiler/context/Trace.java @@ -34,7 +34,6 @@ public final class Trace { private int latestStackIndex = -1; public Trace() { - // traceObject에서 spanid의 유효성을 히스토리를 관리한다면 같은 thread에서는 span랜덤생성아이디의 충돌을 방지할수 있기는 함. TraceID traceId = TraceID.newTraceId(); this.callStack = new CallStack(traceId); latestStackIndex = this.callStack.push(); @@ -46,7 +45,6 @@ public final class Trace { // this.root = continueRoot; this.callStack = new CallStack(continueRoot); latestStackIndex = this.callStack.push(); - // StackFrame stackFrame = createStackFrame(ROOT_STACKID); StackFrame stackFrame = createRootStackFrame(ROOT_STACKID, callStack.getSpan()); this.callStack.setStackFrame(stackFrame); } @@ -136,6 +134,10 @@ public final class Trace { callStack.setStackFrame(stackFrame); } + public void traceRootBlockEnd() { + traceBlockEnd(ROOT_STACKID); + } + public void traceBlockEnd() { traceBlockEnd(NOCHECK_STACKID); } diff --git a/src/main/java/com/profiler/context/TraceContext.java b/src/main/java/com/profiler/context/TraceContext.java index b5bdc02dd..554a921d3 100644 --- a/src/main/java/com/profiler/context/TraceContext.java +++ b/src/main/java/com/profiler/context/TraceContext.java @@ -118,6 +118,8 @@ public class TraceContext { if (result.isNewValue()) { ApiMetaData apiMetadata = new ApiMetaData(); apiMetadata.setAgentId(Agent.getInstance().getAgentId()); + apiMetadata.setAgentIdentifier(Agent.getInstance().getIdentifier()); + apiMetadata.setStartTime(Agent.getInstance().getStartTime()); apiMetadata.setApiId(result.getId()); apiMetadata.setApiInfo(methodDescriptor.getApiDescriptor()); @@ -149,6 +151,8 @@ public class TraceContext { // 좀더 급한 메시지만 별도 처리할수 있는 상대적으로 더 한가한 queue와 datasender를 별도로 가지고 있는게 좋을듯 하다. SqlMetaData sqlMetaData = new SqlMetaData(); sqlMetaData.setAgentId(Agent.getInstance().getAgentId()); + sqlMetaData.setAgentIdentifier(Agent.getInstance().getIdentifier()); + sqlMetaData.setStartTime(Agent.getInstance().getStartTime()); sqlMetaData.setHashCode(normalizedSql.hashCode()); sqlMetaData.setSql(normalizedSql); diff --git a/src/main/java/com/profiler/context/TraceID.java b/src/main/java/com/profiler/context/TraceID.java index fd57f990b..70a986e62 100644 --- a/src/main/java/com/profiler/context/TraceID.java +++ b/src/main/java/com/profiler/context/TraceID.java @@ -36,12 +36,12 @@ public class TraceID { return new TraceKey(most, least, spanId); } - public static class TraceKey { - private long most; - private long least; - private long span; + public static final class TraceKey { + private final long most; + private final long least; + private final int span; - public TraceKey(long most, long least, long span) { + public TraceKey(long most, long least, int span) { this.most = most; this.least = least; this.span = span; @@ -65,7 +65,7 @@ public class TraceID { public int hashCode() { int result = (int) (most ^ (most >>> 32)); result = 31 * result + (int) (least ^ (least >>> 32)); - result = 31 * result + (int) (span ^ (span >>> 32)); + result = 31 * result + span; return result; } } @@ -108,7 +108,7 @@ public class TraceID { @Override public String toString() { - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(128); sb.append("{"); sb.append("id=").append(id); diff --git a/src/main/java/com/profiler/metadata/StringCache.java b/src/main/java/com/profiler/metadata/StringCache.java index dfae3f715..14de8e82f 100644 --- a/src/main/java/com/profiler/metadata/StringCache.java +++ b/src/main/java/com/profiler/metadata/StringCache.java @@ -1,5 +1,7 @@ package com.profiler.metadata; +import com.profiler.common.util.BytesUtils; + import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicInteger; @@ -17,8 +19,8 @@ public class StringCache { if(find != null) { return new Result(false, find); } - - int newId = idGen.getAndIncrement(); + //음수까지 활용하여 가능한 데이터 인코딩을 작게 유지되게 함. + int newId = BytesUtils.decodeZigZagInt(idGen.getAndIncrement()); Integer before = this.cache.putIfAbsent(string, newId); if (before != null) { return new Result(false, before); 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 1d8560cd1..f37e2a78b 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 @@ -103,7 +103,7 @@ public class ExecuteMethodInterceptor implements StaticAroundInterceptor, ByteCo trace.recordException(result); trace.markAfterTime(); - trace.traceBlockEnd(); + trace.traceRootBlockEnd(); } /** 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 435d9f18c..bd9209f50 100644 --- a/src/main/java/com/profiler/modifier/tomcat/interceptors/StandardHostValveInvokeInterceptor.java +++ b/src/main/java/com/profiler/modifier/tomcat/interceptors/StandardHostValveInvokeInterceptor.java @@ -108,7 +108,7 @@ public class StandardHostValveInvokeInterceptor implements StaticAroundIntercept trace.recordException(result); trace.markAfterTime(); - trace.traceBlockEnd(); + trace.traceRootBlockEnd(); } /** diff --git a/src/main/java/com/profiler/sender/UdpDataSender.java b/src/main/java/com/profiler/sender/UdpDataSender.java index 5c0b0a675..412ad802a 100644 --- a/src/main/java/com/profiler/sender/UdpDataSender.java +++ b/src/main/java/com/profiler/sender/UdpDataSender.java @@ -1,9 +1,9 @@ package com.profiler.sender; import com.profiler.common.dto.Header; -import com.profiler.common.util.DefaultTBaseLocator; -import com.profiler.common.util.HeaderTBaseSerializer; -import com.profiler.common.util.TBaseLocator; +import com.profiler.common.io.DefaultTBaseLocator; +import com.profiler.common.io.HeaderTBaseSerializer; +import com.profiler.common.io.TBaseLocator; import com.profiler.context.Thriftable; import com.profiler.util.Assert; import org.apache.thrift.TBase; diff --git a/src/main/java/com/profiler/trace/RequestTracer.java b/src/main/java/com/profiler/trace/RequestTracer.java index 704083fb7..f7e5106e5 100644 --- a/src/main/java/com/profiler/trace/RequestTracer.java +++ b/src/main/java/com/profiler/trace/RequestTracer.java @@ -20,8 +20,8 @@ public class RequestTracer { private static final Set requestSet = Collections.synchronizedSet(new HashSet()); public static void startTransaction(String requestURL, String clientIP, long requestTime, String parameters) { - long cpuUserTime[] = SystemUtils.getThreadTime(); - +// long cpuUserTime[] = SystemUtils.getThreadTime(); + long cpuUserTime[] = null; String tempRequestID = Thread.currentThread().getName() + "_" + System.nanoTime(); int tempRequestHashCode = tempRequestID.hashCode(); @@ -46,7 +46,8 @@ public class RequestTracer { * Transaction is successfully ended. */ public static void endTransaction() { - long cpuUserTime[] = SystemUtils.getThreadTime(); + 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]); finishTransaction(dto); @@ -58,8 +59,8 @@ public class RequestTracer { * @param throwable */ public static void exceptionTransaction(Throwable throwable) { - long cpuUserTime[] = SystemUtils.getThreadTime(); - +// 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]); dto.setExtraData1(throwable.getMessage()); diff --git a/src/main/java/com/profiler/util/NumberUtils.java b/src/main/java/com/profiler/util/NumberUtils.java index 4493adf09..2758357c1 100644 --- a/src/main/java/com/profiler/util/NumberUtils.java +++ b/src/main/java/com/profiler/util/NumberUtils.java @@ -2,7 +2,7 @@ package com.profiler.util; public class NumberUtils { public static long parseLong(String str, long defaultLong) { - if(str== null) { + if (str == null) { return defaultLong; } try { @@ -13,7 +13,7 @@ public class NumberUtils { } public static int parseInteger(String str, int defaultInt) { - if(str == null) { + if (str == null) { return defaultInt; } try { @@ -21,25 +21,25 @@ public class NumberUtils { } catch (NumberFormatException e) { return defaultInt; } - } + } - public static short parseShort(String str, short defaultInt) { - if (str == null) { - return defaultInt; - } - try { - return Short.parseShort(str); - } catch (NumberFormatException e) { - return defaultInt; - } - } + public static short parseShort(String str, short defaultInt) { + if (str == null) { + return defaultInt; + } + try { + return Short.parseShort(str); + } catch (NumberFormatException e) { + return defaultInt; + } + } - public static Integer toInteger(Object integer) { - if(integer == null) { + public static Integer toInteger(Object integer) { + if (integer == null) { return null; } if (integer instanceof Integer) { - return (Integer)integer; + return (Integer) integer; } else { return null; } diff --git a/src/main/java/com/profiler/util/Scope.java b/src/main/java/com/profiler/util/Scope.java index 9e9649ff0..6876167f2 100644 --- a/src/main/java/com/profiler/util/Scope.java +++ b/src/main/java/com/profiler/util/Scope.java @@ -5,10 +5,10 @@ package com.profiler.util; */ public class Scope { - private NamedThreadLocal scope = new NamedThreadLocal("JDBCScope"); + private final NamedThreadLocal scope; - public Scope(String threadLocalName) { - this.scope = new NamedThreadLocal(threadLocalName); + public Scope(final String scopeName) { + this.scope = new NamedThreadLocal(scopeName); } public void pushScope() { diff --git a/src/main/java/com/profiler/util/StringUtils.java b/src/main/java/com/profiler/util/StringUtils.java index 9c0198a54..34ecc4323 100644 --- a/src/main/java/com/profiler/util/StringUtils.java +++ b/src/main/java/com/profiler/util/StringUtils.java @@ -2,26 +2,26 @@ package com.profiler.util; public class StringUtils { - public static String defaultString(String str, String defaultStr) { + public static String defaultString(final String str, final String defaultStr) { return str == null ? defaultStr : str; } - public static String toString(Object object) { + public static String toString(final Object object) { if (object == null) { return "null"; } return object.toString(); } - public static String drop(String str) { + public static String drop(final String str) { return drop(str, 30); } - public static String getDropString(String str) { + public static String getDropString(final String str) { return "...(" + str.length() + ")"; } - public static String drop(String str, int length) { + public static String drop(final String str, final int length) { if (str == null) { return "null"; } diff --git a/src/main/java/com/profiler/util/SystemUtils.java b/src/main/java/com/profiler/util/SystemUtils.java index ccab02ec5..70b179814 100644 --- a/src/main/java/com/profiler/util/SystemUtils.java +++ b/src/main/java/com/profiler/util/SystemUtils.java @@ -4,17 +4,14 @@ import java.lang.management.ManagementFactory; import java.lang.management.ThreadMXBean; public class SystemUtils { + private static final ThreadMXBean THREAD_MX_BEAN = ManagementFactory.getThreadMXBean(); - public static long[] getThreadTime() { - long result[] = new long[2]; - ThreadMXBean bean = ManagementFactory.getThreadMXBean(); - - System.out.println(Thread.currentThread().getName() + " CPU:" + bean.getCurrentThreadCpuTime() + " User:" + bean.getCurrentThreadUserTime()); - - result[0] = bean.getCurrentThreadCpuTime(); - result[1] = bean.getCurrentThreadUserTime(); - - return result; + public static long getCurrentThreadCpuTime() { + return THREAD_MX_BEAN.getCurrentThreadCpuTime(); } + + public static long getCurrentThreadUserTime() { + return THREAD_MX_BEAN.getCurrentThreadUserTime(); + } } diff --git a/src/test/java/com/profiler/util/HeaderTBaseSerializerTest.java b/src/test/java/com/profiler/util/HeaderTBaseSerializerTest.java index d2cfd9241..89bf661f1 100644 --- a/src/test/java/com/profiler/util/HeaderTBaseSerializerTest.java +++ b/src/test/java/com/profiler/util/HeaderTBaseSerializerTest.java @@ -2,10 +2,10 @@ package com.profiler.util; import com.profiler.common.dto.Header; import com.profiler.common.dto.thrift.JVMInfoThriftDTO; -import com.profiler.common.util.DefaultTBaseLocator; -import com.profiler.common.util.HeaderTBaseDeserializer; -import com.profiler.common.util.HeaderTBaseSerializer; -import com.profiler.common.util.TBaseLocator; +import com.profiler.common.io.DefaultTBaseLocator; +import com.profiler.common.io.HeaderTBaseDeserializer; +import com.profiler.common.io.HeaderTBaseSerializer; +import com.profiler.common.io.TBaseLocator; import org.junit.Assert; import org.junit.Test; import org.slf4j.Logger;