From 75480a22ac1b866fe3ea0d2be4474c99f25b5d44 Mon Sep 17 00:00:00 2001 From: Woonduk Kang Date: Tue, 18 Dec 2012 05:58:37 +0000 Subject: [PATCH] =?UTF-8?q?[=EA=B0=95=EC=9A=B4=EB=8D=95]=20[LUCYSUS-1744]?= =?UTF-8?q?=20profiler=EC=97=90=EC=84=9C=20=EC=88=98=EC=A7=91=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=EB=A5=BC=20=EC=9D=BC=EC=A0=95=EB=9F=89=20?= =?UTF-8?q?=EB=AA=A8=EC=95=84=EC=84=9C=20=ED=95=9C=EB=B2=88=EC=97=90=20flu?= =?UTF-8?q?sh=ED=95=98=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@1035 84d0f5b1-2673-498c-a247-62c4ff18d310 --- .../java/com/profiler/TomcatProfiler.java | 103 ++++---- .../com/profiler/context/BypassStorage.java | 30 +++ src/main/java/com/profiler/context/Span.java | 226 ++++++++++-------- .../java/com/profiler/context/Storage.java | 17 ++ .../java/com/profiler/context/SubSpan.java | 28 ++- .../com/profiler/context/SubSpanList.java | 68 ++++++ .../profiler/context/TimeLimitStorage.java | 99 ++++++++ src/main/java/com/profiler/context/Trace.java | 54 ++--- .../com/profiler/context/TraceContext.java | 5 +- .../java/com/profiler/context/TraceTest.java | 5 +- 10 files changed, 450 insertions(+), 185 deletions(-) create mode 100644 src/main/java/com/profiler/context/BypassStorage.java create mode 100644 src/main/java/com/profiler/context/Storage.java create mode 100644 src/main/java/com/profiler/context/SubSpanList.java create mode 100644 src/main/java/com/profiler/context/TimeLimitStorage.java diff --git a/src/main/java/com/profiler/TomcatProfiler.java b/src/main/java/com/profiler/TomcatProfiler.java index 585e3898d..eaba27e3c 100644 --- a/src/main/java/com/profiler/TomcatProfiler.java +++ b/src/main/java/com/profiler/TomcatProfiler.java @@ -16,16 +16,16 @@ import java.util.logging.Logger; public class TomcatProfiler implements ClassFileTransformer { - private static final Logger logger = Logger.getLogger(TomcatProfiler.class.getName()); + private static final Logger logger = Logger.getLogger(TomcatProfiler.class.getName()); - private String agentArgString = ""; - private Instrumentation instrumentation; - private ByteCodeInstrumentor byteCodeInstrumentor; + private String agentArgString = ""; + private Instrumentation instrumentation; + private ByteCodeInstrumentor byteCodeInstrumentor; - private final ModifierRegistry modifierRepository; - private ProfilerConfig profilerConfig; + private final ModifierRegistry modifierRepository; + private ProfilerConfig profilerConfig; - public static void premain(String agentArgs, Instrumentation inst) { + public static void premain(String agentArgs, Instrumentation inst) { try { ProfilerConfig profilerConfig = new ProfilerConfig(); profilerConfig.readConfigFile(); @@ -33,72 +33,77 @@ public class TomcatProfiler implements ClassFileTransformer { logger.warning("Profiler Agent not started. PROFILE_ENABLE=" + profilerConfig.isProfileEnable()); return; } - new TomcatProfiler(agentArgs, inst, profilerConfig); + new TomcatProfiler(agentArgs, inst, profilerConfig); } catch (Exception e) { logger.log(Level.SEVERE, "Profiler Agent start fail. Cause:" + e.getMessage(), e); } - } + } - public TomcatProfiler(String agentArgs, Instrumentation inst, ProfilerConfig profilerConfig) { - this.agentArgString = agentArgs; + public TomcatProfiler(String agentArgs, Instrumentation inst, ProfilerConfig profilerConfig) { + this.agentArgString = agentArgs; this.profilerConfig = profilerConfig; this.instrumentation = inst; this.instrumentation.addTransformer(this); String[] paths = getTomcatlibPath(); this.byteCodeInstrumentor = new JavaAssistByteCodeInstrumentor(paths); this.modifierRepository = createModifierRegistry(byteCodeInstrumentor); - } + } - private String[] getTomcatlibPath() { - String catalinaHome = System.getProperty("catalina.home"); + private String[] getTomcatlibPath() { + String catalinaHome = System.getProperty("catalina.home"); - if (catalinaHome == null) { - return null; - } + if (catalinaHome == null) { + return null; + } - if (logger.isLoggable(Level.INFO)) { - logger.info("CATALINA_HOME=" + catalinaHome); - } + if (logger.isLoggable(Level.INFO)) { + logger.info("CATALINA_HOME=" + catalinaHome); + } - // TODO This is draft. How can we support both Tomcat and BLOC without this configuration? - String type = System.getProperty("hippo.servertype", "tomcat"); + // TODO This is draft. How can we support both Tomcat and BLOC without this configuration? + String type = System.getProperty("hippo.servertype", "tomcat"); - if (type.equals("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" }; - } - } + if (type.equals("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 ModifierRegistry createModifierRegistry(ByteCodeInstrumentor byteCodeInstrumentor) { - DefaultModifierRegistry modifierRepository = new DefaultModifierRegistry(byteCodeInstrumentor, profilerConfig); + DefaultModifierRegistry modifierRepository = new DefaultModifierRegistry(byteCodeInstrumentor, profilerConfig); - modifierRepository.addTomcatModifier(); + modifierRepository.addTomcatModifier(); // jdbc - modifierRepository.addJdbcModifier(); - - // rpc - modifierRepository.addConnectorModifier(); - - // bloc - modifierRepository.addBLOCModifier(); - - return modifierRepository; - } + modifierRepository.addJdbcModifier(); - @Override - public byte[] transform(ClassLoader classLoader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classFileBuffer) throws IllegalClassFormatException { + // rpc + modifierRepository.addConnectorModifier(); + + // bloc + modifierRepository.addBLOCModifier(); + + return modifierRepository; + } + + @Override + public byte[] transform(ClassLoader classLoader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classFileBuffer) throws IllegalClassFormatException { + if (className.startsWith("java")) { + if (className.startsWith("/", 4) || className.startsWith("x/", 4)) { + return classFileBuffer; + } + } if (logger.isLoggable(Level.FINE)) { logger.fine("[transform] cl" + classLoader + " className:" + className); } - Modifier findModifier = this.modifierRepository.findModifier(className); - if (findModifier == null) { - return null; - } + Modifier findModifier = this.modifierRepository.findModifier(className); + if (findModifier == null) { + return null; + } - String javassistClassName = className.replace('/', '.'); + String javassistClassName = className.replace('/', '.'); - return findModifier.modify(classLoader, javassistClassName, protectionDomain, classFileBuffer); - } + return findModifier.modify(classLoader, javassistClassName, protectionDomain, classFileBuffer); + } } diff --git a/src/main/java/com/profiler/context/BypassStorage.java b/src/main/java/com/profiler/context/BypassStorage.java new file mode 100644 index 000000000..28950262b --- /dev/null +++ b/src/main/java/com/profiler/context/BypassStorage.java @@ -0,0 +1,30 @@ +package com.profiler.context; + +import com.profiler.sender.DataSender; + +/** + * + */ +public class BypassStorage implements Storage { + private DataSender dataSender; + + @Override + public void setDataSender(DataSender dataSender) { + this.dataSender = dataSender; + } + + @Override + public DataSender getDataSender() { + return dataSender; + } + + @Override + public void store(SubSpan subSpan) { + dataSender.send(subSpan); + } + + @Override + public void store(Span span) { + dataSender.send(span); + } +} diff --git a/src/main/java/com/profiler/context/Span.java b/src/main/java/com/profiler/context/Span.java index 717288414..bac2129fe 100644 --- a/src/main/java/com/profiler/context/Span.java +++ b/src/main/java/com/profiler/context/Span.java @@ -1,139 +1,165 @@ package com.profiler.context; -import java.util.ArrayList; -import java.util.List; - import com.profiler.Agent; import com.profiler.common.ServiceType; +import java.util.ArrayList; +import java.util.List; + /** * Span represent RPC - * + * * @author netspider */ public class Span implements Thriftable { - private final TraceID traceID; - private long startTime; - private long endTime; - private String serviceName; - private String rpc; - private ServiceType serviceType; - private String endPoint; + private final TraceID traceID; + private long startTime; + private long endTime; + private String serviceName; + private String rpc; + private ServiceType serviceType; + private String endPoint; - private final List annotations = new ArrayList(5); + private final List annotations = new ArrayList(5); - public Span(TraceID traceId) { - this.traceID = traceId; - } + private List subSpanList; - public TraceID getTraceID() { - return traceID; - } + public Span(TraceID traceId) { + this.traceID = traceId; + } - public boolean addAnnotation(HippoAnnotation annotation) { - return annotations.add(annotation); - } + public TraceID getTraceID() { + return traceID; + } - public int getAnnotationSize() { - return annotations.size(); - } + public boolean addAnnotation(HippoAnnotation annotation) { + return annotations.add(annotation); + } - public String getEndPoint() { - return this.endPoint; - } + public int getAnnotationSize() { + return annotations.size(); + } - public String getServiceName() { - return serviceName; - } + public String getEndPoint() { + return this.endPoint; + } - public void setServiceName(String serviceName) { - this.serviceName = serviceName; - } + public String getServiceName() { + return serviceName; + } - public String getRpc() { - return rpc; - } + public void setServiceName(String serviceName) { + this.serviceName = serviceName; + } - public void setRpc(String rpc) { - this.rpc = rpc; - } + public String getRpc() { + return rpc; + } - public void setEndPoint(String endPoint) { - this.endPoint = endPoint; - } + public void setRpc(String rpc) { + this.rpc = rpc; + } - public void setStartTime(long startTime) { - this.startTime = startTime; - } + public void setEndPoint(String endPoint) { + this.endPoint = endPoint; + } - public long getStartTime() { - return startTime; - } + public void setStartTime(long startTime) { + this.startTime = startTime; + } - public void setEndTime(long endTime) { - this.endTime = endTime; - } + public long getStartTime() { + return startTime; + } - public long getEndTime() { - return endTime; - } + public void setEndTime(long endTime) { + this.endTime = endTime; + } - public ServiceType getServiceType() { - return serviceType; - } + public long getEndTime() { + return endTime; + } - public void setServiceType(ServiceType serviceType) { - this.serviceType = serviceType; - } + public ServiceType getServiceType() { + return serviceType; + } - public String toString() { - StringBuilder sb = new StringBuilder(); + public void setServiceType(ServiceType serviceType) { + this.serviceType = serviceType; + } - sb.append("{"); - sb.append("\n\t TraceID = ").append(traceID); - sb.append(",\n\t StartTime = ").append(startTime); - sb.append(", EndTime = ").append(endTime); - sb.append(",\n\t Name = ").append(rpc); - sb.append(", ServiceName = ").append(serviceName); - sb.append(", ServiceType = ").append(serviceType); - sb.append(", EndPoint = ").append(endPoint); + public List getSubSpanList() { + return subSpanList; + } - sb.append(",\n\t Annotations = {"); - for (HippoAnnotation a : annotations) { - sb.append("\n\t\t").append(a); - } - sb.append("\n\t}"); + public void setSubSpanList(List subSpanList) { + this.subSpanList = subSpanList; + } - sb.append("}"); + public String toString() { + StringBuilder sb = new StringBuilder(); - return sb.toString(); - } + sb.append("{"); + sb.append("\n\t TraceID = ").append(traceID); + sb.append(",\n\t StartTime = ").append(startTime); + sb.append(", EndTime = ").append(endTime); + sb.append(",\n\t Name = ").append(rpc); + sb.append(", ServiceName = ").append(serviceName); + sb.append(", ServiceType = ").append(serviceType); + sb.append(", EndPoint = ").append(endPoint); - public com.profiler.common.dto.thrift.Span toThrift() { - com.profiler.common.dto.thrift.Span span = new com.profiler.common.dto.thrift.Span(); + sb.append(",\n\t Annotations = {"); + for (HippoAnnotation a : annotations) { + sb.append("\n\t\t").append(a); + } + sb.append("\n\t}"); - span.setAgentId(Agent.getInstance().getAgentId()); - span.setStartTime(startTime); - span.setElapsed((int) (endTime - startTime)); - span.setMostTraceId(traceID.getId().getMostSignificantBits()); - span.setLeastTraceId(traceID.getId().getLeastSignificantBits()); - span.setRpc(rpc); - span.setServiceName(serviceName); - span.setServiceType(serviceType.getCode()); - span.setSpanId(traceID.getSpanId()); - span.setParentSpanId(traceID.getParentSpanId()); - span.setEndPoint(endPoint); + sb.append("}"); - // 여기서 데이터 인코딩을 하자. - List annotationList = new ArrayList(annotations.size()); - for (HippoAnnotation a : annotations) { - annotationList.add(a.toThrift()); - } - span.setAnnotations(annotationList); + return sb.toString(); + } - span.setFlag(traceID.getFlags()); + public com.profiler.common.dto.thrift.Span toThrift() { + com.profiler.common.dto.thrift.Span span = new com.profiler.common.dto.thrift.Span(); - return span; - } + span.setAgentId(Agent.getInstance().getAgentId()); + span.setStartTime(startTime); + span.setElapsed((int) (endTime - startTime)); + span.setMostTraceId(traceID.getId().getMostSignificantBits()); + span.setLeastTraceId(traceID.getId().getLeastSignificantBits()); + span.setRpc(rpc); + span.setServiceName(serviceName); + span.setServiceType(serviceType.getCode()); + span.setSpanId(traceID.getSpanId()); + span.setParentSpanId(traceID.getParentSpanId()); + span.setEndPoint(endPoint); + + // 여기서 데이터 인코딩을 하자. + List annotationList = new ArrayList(annotations.size()); + for (HippoAnnotation a : annotations) { + annotationList.add(a.toThrift()); + } + span.setAnnotations(annotationList); + + span.setFlag(traceID.getFlags()); + + List subSpanList = this.getSubSpanList(); + if (subSpanList != null && subSpanList.size() != 0) { + SubSpan first = null; + List tSubSpanList = new ArrayList(subSpanList.size()); + for (SubSpan subSpan : subSpanList) { + com.profiler.common.dto.thrift.SubSpan tSubSpan = subSpan.toThrift(true); + if (first == null) { + // 첫번째 subSpan에는 sequence를 마크한다. + tSubSpan.setSequence(subSpan.getSequence()); + first = subSpan; + } + tSubSpanList.add(tSubSpan); + } + span.setSubSpanList(tSubSpanList); + } + + return span; + } } diff --git a/src/main/java/com/profiler/context/Storage.java b/src/main/java/com/profiler/context/Storage.java new file mode 100644 index 000000000..ffb13df9a --- /dev/null +++ b/src/main/java/com/profiler/context/Storage.java @@ -0,0 +1,17 @@ +package com.profiler.context; + +import com.profiler.sender.DataSender; + +/** + * + */ +public interface Storage { + + void setDataSender(DataSender dataSender); + + DataSender getDataSender(); + + void store(SubSpan subSpan); + + void store(Span span); +} diff --git a/src/main/java/com/profiler/context/SubSpan.java b/src/main/java/com/profiler/context/SubSpan.java index aea4ea958..386773359 100644 --- a/src/main/java/com/profiler/context/SubSpan.java +++ b/src/main/java/com/profiler/context/SubSpan.java @@ -34,7 +34,7 @@ public class SubSpan implements Thriftable { return parentSpan; } - public int getSequence() { + public short getSequence() { return sequence; } @@ -46,6 +46,10 @@ public class SubSpan implements Thriftable { return annotations.add(annotation); } + public List getAnnotations() { + return annotations; + } + public int getAnnotationSize() { return annotations.size(); } @@ -123,21 +127,31 @@ public class SubSpan implements Thriftable { } public com.profiler.common.dto.thrift.SubSpan toThrift() { + return toThrift(false); + } + + public com.profiler.common.dto.thrift.SubSpan toThrift(boolean child) { com.profiler.common.dto.thrift.SubSpan span = new com.profiler.common.dto.thrift.SubSpan(); - span.setAgentId(Agent.getInstance().getAgentId()); + long parentSpanStartTime = parentSpan.getStartTime(); span.setStartElapsed((int) (startTime - parentSpanStartTime)); span.setEndElapsed((int) (endTime - startTime)); - TraceID parentSpanTraceID = parentSpan.getTraceID(); - span.setMostTraceId(parentSpanTraceID.getId().getMostSignificantBits()); - span.setLeastTraceId(parentSpanTraceID.getId().getLeastSignificantBits()); + + // 다른 span의 sub로 들어가지 않을 경우 + if (!child) { + span.setAgentId(Agent.getInstance().getAgentId()); + TraceID parentSpanTraceID = parentSpan.getTraceID(); + span.setMostTraceId(parentSpanTraceID.getId().getMostSignificantBits()); + span.setLeastTraceId(parentSpanTraceID.getId().getLeastSignificantBits()); + span.setSpanId(parentSpanTraceID.getSpanId()); + span.setSequence(sequence); + } + span.setRpc(rpc); span.setServiceName(serviceName); span.setServiceType(serviceType.getCode()); - span.setSpanId(parentSpanTraceID.getSpanId()); - span.setSequence(sequence); span.setEndPoint(endPoint); diff --git a/src/main/java/com/profiler/context/SubSpanList.java b/src/main/java/com/profiler/context/SubSpanList.java new file mode 100644 index 000000000..512622668 --- /dev/null +++ b/src/main/java/com/profiler/context/SubSpanList.java @@ -0,0 +1,68 @@ +package com.profiler.context; + +import com.profiler.Agent; +import org.apache.thrift.TBase; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +/** + * + */ +public class SubSpanList implements Thriftable { + + private List subSpanList = new ArrayList(); + + public SubSpanList(List subSpanList) { + this.subSpanList = subSpanList; + } + + @Override + public TBase toThrift() { + com.profiler.common.dto.thrift.SubSpanList tSubSpanList = new com.profiler.common.dto.thrift.SubSpanList(); + // TODO 반드시 1개 이상이라는 조건을 충족해야 된다. + SubSpan first = subSpanList.get(0); + Span parentSpan = first.getParentSpan(); + tSubSpanList.setAgentId(Agent.getInstance().getAgentId()); + UUID id = parentSpan.getTraceID().getId(); + tSubSpanList.setMostTraceId(id.getMostSignificantBits()); + tSubSpanList.setMostTraceId(id.getLeastSignificantBits()); + tSubSpanList.setSpanId(parentSpan.getTraceID().getSpanId()); + tSubSpanList.setStartSequence(first.getSequence()); + + List tSubSpan = createSubSpan(subSpanList); + + tSubSpanList.setSubSpanList(tSubSpan); + + return tSubSpanList; + } + + private List createSubSpan(List subSpanList) { + List result = new ArrayList(subSpanList.size()); + for (SubSpan subSpan : subSpanList) { + com.profiler.common.dto.thrift.SubSpan tSubSpan = new com.profiler.common.dto.thrift.SubSpan(); + + tSubSpan.setAgentId(Agent.getInstance().getAgentId()); + + long parentSpanStartTime = subSpan.getStartTime(); + tSubSpan.setStartElapsed((int) (subSpan.getStartTime() - parentSpanStartTime)); + tSubSpan.setEndElapsed((int) (subSpan.getEndTime() - subSpan.getStartTime())); + + tSubSpan.setRpc(subSpan.getRpc()); + tSubSpan.setServiceName(subSpan.getServiceName()); + tSubSpan.setServiceType(subSpan.getServiceType().getCode()); + + tSubSpan.setEndPoint(subSpan.getEndPoint()); + + // 여기서 데이터 인코딩을 하자. + List annotationList = new ArrayList(subSpan.getAnnotationSize()); + for (HippoAnnotation a : subSpan.getAnnotations()) { + annotationList.add(a.toThrift()); + } + tSubSpan.setAnnotations(annotationList); + result.add(tSubSpan); + } + return result; + } +} diff --git a/src/main/java/com/profiler/context/TimeLimitStorage.java b/src/main/java/com/profiler/context/TimeLimitStorage.java new file mode 100644 index 000000000..8c846758f --- /dev/null +++ b/src/main/java/com/profiler/context/TimeLimitStorage.java @@ -0,0 +1,99 @@ +package com.profiler.context; + +import com.profiler.sender.DataSender; + +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Logger; + +/** + * + */ +public class TimeLimitStorage implements Storage { + private int flushCount = 10; + + private List storage = new ArrayList(flushCount); + + private boolean limit; + private boolean dropSubSpan = true; + private int limitTime = 1000; + private DataSender dataSender; + + @Override + public void setDataSender(DataSender dataSender) { + this.dataSender = dataSender; + } + + @Override + public DataSender getDataSender() { + return this.dataSender; + } + + @Override + public void store(SubSpan subSpan) { + addSubSpan(subSpan); + // flush유무 확인 + if (!limit) { + // 절대 시간만 체크한다. 1초 이내 라서 절대 데이터를 flush하지 않는다. + limit = checkLimit(subSpan); + } else { + // 1초가 지났다면. + // 데이터가 flushCount이상일 경우 먼저 flush한다. + if (storage.size() >= flushCount) { + SubSpanList subSpanList = new SubSpanList(storage); + storage = new ArrayList(flushCount); + dataSender.send(subSpanList); + } + } + } + + private void addSubSpan(SubSpan subSpan) { + if (storage == null) { + Logger logger = Logger.getLogger(this.getClass().getName()); + logger.warning("storage is null."); + return; + } + storage.add(subSpan); + } + + private boolean checkLimit(SubSpan subSpan) { + return checkLimit(subSpan.getParentSpan()); + } + + private boolean checkLimit(Span span) { + long startTime = span.getStartTime(); + long current = System.currentTimeMillis(); + return (current > (startTime + limitTime)); + } + + @Override + public void store(Span span) { + // Span이 들어오는것은 마지막 flush타이밍이다. + // 비동기일 경우는 애매함. 비동기는 개별 flush해야 되나? + if (dropSubSpan) { + + limit = checkLimit(span); + if (!limit) { + // 제한시간내 빨리 끝난 경우는 subspan을 버린다. + this.storage = null; + dataSender.send(span); + + } else { + // 제한 시간이 지났을 경우 모두 flush + flushAll(span); + } + } else { + flushAll(span); + } + } + + private void flushAll(Span span) { + List subSpanList = storage; + if (subSpanList != null && subSpanList.size() != 0) { + span.setSubSpanList(subSpanList); + } + this.storage = null; + dataSender.send(span); + } + +} diff --git a/src/main/java/com/profiler/context/Trace.java b/src/main/java/com/profiler/context/Trace.java index e3a592ad2..3ac4b5651 100644 --- a/src/main/java/com/profiler/context/Trace.java +++ b/src/main/java/com/profiler/context/Trace.java @@ -28,7 +28,9 @@ public final class Trace { // private TraceID root; private CallStack callStack; - private DataSender dataSender = DEFULT_DATA_SENDER; +// private DataSender dataSender = DEFULT_DATA_SENDER; + + private Storage storage; public Trace() { // traceObject에서 spanid의 유효성을 히스토리를 관리한다면 같은 thread에서는 span랜덤생성아이디의 충돌을 방지할수 있기는 함. @@ -52,27 +54,24 @@ public final class Trace { return callStack; } + + public Storage getStorage() { + return storage; + } + + public void setStorage(Storage storage) { + this.storage = storage; + } + public DataSender getDataSender() { - return dataSender; + return storage.getDataSender(); } - public void setDataSender(DataSender dataSender) { - this.dataSender = dataSender; - } - -// public void handle(TraceHandler handler) { -// try { -//// TraceID nextId = getNextTraceId(); -// callStack.push(); -// StackFrame stackFrame = createStackFrame(nextId, HANDLER_STACKID); -// callStack.setStackFrame(stackFrame); -// handler.handle(nextId); -// } finally { -// // stackID check하면 좋을듯. -// callStack.pop(); -// } +// public void setDataSender(DataSender dataSender) { +// this.dataSender = dataSender; // } + public AsyncTrace createAsyncTrace() { // 경우에 따라 별도 timeout 처리가 있어야 될수도 있음. SubSpan subSpan = new SubSpan(callStack.getSpan()); @@ -185,14 +184,17 @@ public final class Trace { tracingEnabled = false; } - void logSpan(SubSpan span) { + void logSpan(SubSpan subSpan) { try { if (logger.isLoggable(Level.INFO)) { - logger.info("[WRITE SubSPAN]" + span + " CurrentThreadID=" + Thread.currentThread().getId() + ",\n\t CurrentThreadName=" + Thread.currentThread().getName() + "\n\n"); + logger.info("[WRITE SubSPAN]" + subSpan + " CurrentThreadID=" + Thread.currentThread().getId() + ",\n\t CurrentThreadName=" + Thread.currentThread().getName() + "\n\n"); } - - dataSender.send(span); -// span.cancelTimer(); +// if (flushType == 0) { +// storage.store(subSpan); +// } else if(flushType == 1) { +// dataSender.send(subSpan); + this.storage.store(subSpan); +// } } catch (Exception e) { logger.log(Level.SEVERE, e.getMessage(), e); } @@ -204,8 +206,9 @@ public final class Trace { logger.info("[WRITE SPAN]" + span + " CurrentThreadID=" + Thread.currentThread().getId() + ",\n\t CurrentThreadName=" + Thread.currentThread().getName() + "\n\n"); } - dataSender.send(span); -// span.cancelTimer(); +// dataSender.send(span); + this.storage.store(span); +// subSpan.cancelTimer(); } catch (Exception e) { logger.log(Level.SEVERE, e.getMessage(), e); } @@ -350,7 +353,4 @@ public final class Trace { } - public void setTransactionId(int transactionId) { - - } } \ No newline at end of file diff --git a/src/main/java/com/profiler/context/TraceContext.java b/src/main/java/com/profiler/context/TraceContext.java index 1e37c4ef4..e9357b6e8 100644 --- a/src/main/java/com/profiler/context/TraceContext.java +++ b/src/main/java/com/profiler/context/TraceContext.java @@ -48,7 +48,10 @@ public class TraceContext { throw new IllegalStateException("already Trace Object exist."); } // datasender연결 부분 수정 필요. - trace.setDataSender(this.dataSender); +// trace.setDataSender(this.dataSender); + TimeLimitStorage storage = new TimeLimitStorage(); + storage.setDataSender(this.dataSender); + trace.setStorage(storage); // // trace.setTransactionId(transactionId.getAndIncrement()); threadLocal.set(trace); diff --git a/src/test/java/com/profiler/context/TraceTest.java b/src/test/java/com/profiler/context/TraceTest.java index c8fa6fda4..c17ddc0af 100644 --- a/src/test/java/com/profiler/context/TraceTest.java +++ b/src/test/java/com/profiler/context/TraceTest.java @@ -3,6 +3,7 @@ package com.profiler.context; import com.profiler.common.ServiceType; import com.profiler.sender.DataSender; +import com.profiler.sender.LoggingDataSender; import org.apache.thrift.TBase; import org.junit.Test; import org.slf4j.Logger; @@ -36,7 +37,9 @@ public class TraceTest { TraceID traceID = TraceID.newTraceId(); Trace trace = new Trace(traceID); TestDataSender dataSender = new TestDataSender(); - trace.setDataSender(dataSender); + BypassStorage bypassStorage = new BypassStorage(); + bypassStorage.setDataSender(new LoggingDataSender()); + trace.setStorage(bypassStorage); // trace.traceBlockBegin(); // response to client