From 455f9c3bba230999ff391ef087f421d293eded05 Mon Sep 17 00:00:00 2001 From: Chisu Yu Date: Mon, 3 Sep 2012 10:05:59 +0000 Subject: [PATCH] =?UTF-8?q?[=EC=9C=A0=EC=B9=98=EC=88=98]=20[NOBTS]=20remov?= =?UTF-8?q?e=20Tracer.?= 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@566 84d0f5b1-2673-498c-a247-62c4ff18d310 --- .../java/com/profiler/context/Annotation.java | 132 ++---------------- .../context/{tracer => }/EndPoint.java | 2 +- .../context/{tracer => }/HippoAnnotation.java | 12 +- .../context/HippoBinaryAnnotation.java | 41 ++++++ src/main/java/com/profiler/context/Span.java | 16 ++- src/main/java/com/profiler/context/State.java | 54 ------- src/main/java/com/profiler/context/Trace.java | 111 ++++++++++----- .../java/com/profiler/context/TraceStack.java | 67 --------- .../context/tracer/DefaultTracer.java | 84 ----------- .../com/profiler/context/tracer/Tracer.java | 8 -- .../ExecuteMethodInterceptor.java | 10 +- .../ExecuteQueryMethodInterceptor.java | 9 +- .../ExecuteUpdateMethodInterceptor.java | 6 +- .../interceptors/InvokeMethodInterceptor.java | 116 +++++++-------- .../java/com/profiler/context/SpanTest.java | 21 ++- .../java/com/profiler/context/TraceTest.java | 14 +- 16 files changed, 227 insertions(+), 476 deletions(-) rename src/main/java/com/profiler/context/{tracer => }/EndPoint.java (86%) rename src/main/java/com/profiler/context/{tracer => }/HippoAnnotation.java (77%) create mode 100644 src/main/java/com/profiler/context/HippoBinaryAnnotation.java delete mode 100644 src/main/java/com/profiler/context/State.java delete mode 100644 src/main/java/com/profiler/context/TraceStack.java delete mode 100644 src/main/java/com/profiler/context/tracer/DefaultTracer.java delete mode 100644 src/main/java/com/profiler/context/tracer/Tracer.java diff --git a/src/main/java/com/profiler/context/Annotation.java b/src/main/java/com/profiler/context/Annotation.java index 3b13852b6..4f0e4a976 100644 --- a/src/main/java/com/profiler/context/Annotation.java +++ b/src/main/java/com/profiler/context/Annotation.java @@ -1,131 +1,15 @@ package com.profiler.context; -public interface Annotation { +public enum Annotation { + ClientSend("CS"), ClientRecv("CR"), ServerSend("SS"), ServerRecv("SR"); - public static class ClientSend implements Annotation { - @Override - public String toString() { - return "@CLIENT_SEND"; - } + private String code; + + Annotation(String code) { + this.code = code; } - public static class ClientRecv implements Annotation { - @Override - public String toString() { - return "@CLIENT_RECV"; - } - } - - public static class ServerSend implements Annotation { - @Override - public String toString() { - return "@SERVER_SEND"; - } - } - - public static class ServerRecv implements Annotation { - @Override - public String toString() { - return "@SERVER_RECV"; - } - } - - public static class Message implements Annotation { - private String message; - - public Message(String message) { - this.message = message; - } - - public String getMessage() { - return this.message; - } - - @Override - public String toString() { - return "@MSG=" + message; - } - } - - public static class RpcName implements Annotation { - private final String service; - private final String rpc; - - public RpcName(String service, String rpc) { - this.service = service; - this.rpc = rpc; - } - - public String getService() { - return service; - } - - public String getRpc() { - return rpc; - } - - @Override - public String toString() { - return "@RPCNAME={service=" + service + ", rpc=" + rpc + "}"; - } - } - - public static class ClientAddr implements Annotation { - private final String ip; - private final int port; - - public ClientAddr(String ip, int port) { - this.ip = ip; - this.port = port; - } - - public String getIp() { - return ip; - } - - public int getPort() { - return port; - } - - @Override - public String toString() { - return "@CLIENT_ADDR={" + ip + ":" + port + "}"; - } - } - - public static class ServerAddr implements Annotation { - private final String ip; - private final int port; - - public ServerAddr(String ip, int port) { - this.ip = ip; - this.port = port; - } - - public String getIp() { - return ip; - } - - public int getPort() { - return port; - } - - @Override - public String toString() { - return "@SERVER_ADDR={" + ip + ":" + port + "}"; - } - } - - public static class BinaryAnnotation implements Annotation { - private final String key; - private final String type; - private final byte[] value; - - public BinaryAnnotation(String key, Object value) { - this.key = key; - this.type = value.getClass().getName(); - // TODO: convert to byte - this.value = null; - } + public String getCode() { + return this.code; } } diff --git a/src/main/java/com/profiler/context/tracer/EndPoint.java b/src/main/java/com/profiler/context/EndPoint.java similarity index 86% rename from src/main/java/com/profiler/context/tracer/EndPoint.java rename to src/main/java/com/profiler/context/EndPoint.java index 73015826b..cf0b9ba72 100644 --- a/src/main/java/com/profiler/context/tracer/EndPoint.java +++ b/src/main/java/com/profiler/context/EndPoint.java @@ -1,4 +1,4 @@ -package com.profiler.context.tracer; +package com.profiler.context; public class EndPoint { diff --git a/src/main/java/com/profiler/context/tracer/HippoAnnotation.java b/src/main/java/com/profiler/context/HippoAnnotation.java similarity index 77% rename from src/main/java/com/profiler/context/tracer/HippoAnnotation.java rename to src/main/java/com/profiler/context/HippoAnnotation.java index 55d3b7829..293794a28 100644 --- a/src/main/java/com/profiler/context/tracer/HippoAnnotation.java +++ b/src/main/java/com/profiler/context/HippoAnnotation.java @@ -1,13 +1,13 @@ -package com.profiler.context.tracer; +package com.profiler.context; public class HippoAnnotation { - private final long time; - private final String value; - private final Long duration; - private final String threadname; // TODO: remove, just for debug. + protected final long time; + protected final String value; + protected final Long duration; + protected final String threadname; // TODO: remove, just for debug. - private EndPoint endPoint; + protected EndPoint endPoint; public HippoAnnotation(long time, String value, EndPoint endPoint, Long duration) { this.time = time; diff --git a/src/main/java/com/profiler/context/HippoBinaryAnnotation.java b/src/main/java/com/profiler/context/HippoBinaryAnnotation.java new file mode 100644 index 000000000..3872ab719 --- /dev/null +++ b/src/main/java/com/profiler/context/HippoBinaryAnnotation.java @@ -0,0 +1,41 @@ +package com.profiler.context; + +public class HippoBinaryAnnotation { + + private final long time; + private final String key; + private final Object value; + private final Long duration; + private final String threadname; // TODO: remove, just for debug. + + private EndPoint endPoint; + + public HippoBinaryAnnotation(long time, String key, Object value, EndPoint endPoint, Long duration) { + this.time = time; + this.key = key; + this.value = value; + this.endPoint = endPoint; + this.duration = duration; + this.threadname = Thread.currentThread().getName(); + } + + public void setEndPoint(EndPoint endPoint) { + this.endPoint = endPoint; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + + sb.append("@={"); + sb.append("time=").append(time); + sb.append(", value=").append(value); + sb.append(", duration=").append(duration); + sb.append(", endpoint=").append(endPoint); + sb.append(", threadname=").append(threadname); + sb.append("}"); + + return sb.toString(); + } + +} diff --git a/src/main/java/com/profiler/context/Span.java b/src/main/java/com/profiler/context/Span.java index 43b589ac0..40add6ab3 100644 --- a/src/main/java/com/profiler/context/Span.java +++ b/src/main/java/com/profiler/context/Span.java @@ -5,9 +5,6 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import com.profiler.context.tracer.EndPoint; -import com.profiler.context.tracer.HippoAnnotation; - /** * * @author netspider @@ -22,8 +19,9 @@ public class Span { private String name; private EndPoint endPoint; - private final List annotations = new ArrayList(); - private final Set annotationValues = new HashSet(); + private final List binaryAnnotations = new ArrayList(5); + private final List annotations = new ArrayList(5); + private final Set annotationValues = new HashSet(5); public Span(TraceID traceId, String name, EndPoint endPoint) { this.traceID = traceId; @@ -37,6 +35,10 @@ public class Span { return annotations.add(annotation); } + public boolean addAnnotation(HippoBinaryAnnotation annotation) { + return binaryAnnotations.add(annotation); + } + public int getAnnotationSize() { return annotations.size(); } @@ -70,6 +72,10 @@ public class Span { for (HippoAnnotation annotation : annotations) { annotation.setEndPoint(endPoint); } + + for (HippoBinaryAnnotation annotation : binaryAnnotations) { + annotation.setEndPoint(endPoint); + } } public String toString() { diff --git a/src/main/java/com/profiler/context/State.java b/src/main/java/com/profiler/context/State.java deleted file mode 100644 index 316338cdf..000000000 --- a/src/main/java/com/profiler/context/State.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.profiler.context; - -import java.util.List; - -import com.profiler.context.tracer.Tracer; - -/** - * - * @author netspider - * - */ -@Deprecated -public class State { - - private TraceID id; - private boolean terminal; - private final List tracers; - - public State(TraceID id, boolean terminal, List tracers) { - this.id = id; - this.terminal = terminal; - this.tracers = tracers; - } - - public TraceID getId() { - return id; - } - - public boolean isTerminal() { - return terminal; - } - - public List getTracers() { - return tracers; - } - - public boolean addTracer(Tracer tracer) { - return tracers.add(tracer); - } - - public void setId(TraceID id) { - this.id = id; - } - - public void setTerminal(boolean terminal) { - this.terminal = terminal; - } - - @Override - public String toString() { - return "traceId=" + id + ", isTerminal=" + terminal + ", tracers=" + tracers; - } - -} diff --git a/src/main/java/com/profiler/context/Trace.java b/src/main/java/com/profiler/context/Trace.java index 4933f1698..1a542a377 100644 --- a/src/main/java/com/profiler/context/Trace.java +++ b/src/main/java/com/profiler/context/Trace.java @@ -1,10 +1,5 @@ package com.profiler.context; -import java.util.ArrayList; -import java.util.List; - -import com.profiler.context.tracer.DefaultTracer; -import com.profiler.context.tracer.Tracer; import com.profiler.util.NamedThreadLocal; /** @@ -14,13 +9,11 @@ import com.profiler.util.NamedThreadLocal; */ public class Trace { - private static final ThreadLocal traceId = new NamedThreadLocal("TraceId"); - private static final List tracers = new ArrayList(); - private static volatile boolean tracingEnabled = true; + private static final DeadlineSpanMap spanMap = new DeadlineSpanMap(); - static { - tracers.add(new DefaultTracer()); - } + private static final ThreadLocal traceId = new NamedThreadLocal("TraceId"); + + private static volatile boolean tracingEnabled = true; private Trace() { @@ -52,10 +45,6 @@ public class Trace { return traceId.get(); } - public static List getTracers() { - return tracers; - } - public static void enable() { tracingEnabled = true; } @@ -69,50 +58,96 @@ public class Trace { return new TraceID(current.getTraceId(), current.getSpanId(), SpanID.newSpanID(), current.isSampled(), current.getFlags()); } - public static void addTracer(final Tracer tracer) { - tracers.add(tracer); - } - public static void setTraceId(TraceID traceId) { Trace.traceId.set(traceId); } - private static void record(Record record) { - if (!tracingEnabled) - return; + private static void mutate(TraceID traceId, SpanUpdater spanUpdater) { + Span span = spanMap.update(traceId, spanUpdater); - List tracers = getTracers(); - - for (Tracer t : tracers) { - t.record(record); + if (span.isExistsAnnotationType("CR") || span.isExistsAnnotationType("SS")) { + spanMap.remove(traceId); + logSpan(span); } } + private static void logSpan(Span span) { + // TODO: send span to server + System.out.println("\n\nWrite span hash=" + span.hashCode() + ", value=" + span + ", spanMap.size=" + spanMap.size() + ", threadid=" + Thread.currentThread().getId() + "\n\n"); + } + public static void record(Annotation annotation) { - record(new Record(getTraceId(), System.currentTimeMillis(), annotation, null)); + if (!tracingEnabled) + return; + + annotate(annotation.getCode(), null); } public static void record(Annotation annotation, long duration) { - record(new Record(getTraceId(), System.currentTimeMillis(), annotation, duration)); + if (!tracingEnabled) + return; + + annotate(annotation.getCode(), duration); } - public static void recordBinary(String key, Object value) { - record(new Record(getTraceId(), System.currentTimeMillis(), new Annotation.BinaryAnnotation(key, value), null)); + public static void recordAttibute(final String key, final Object value) { + if (!tracingEnabled) + return; + + mutate(getTraceId(), new SpanUpdater() { + @Override + public Span updateSpan(Span span) { + span.addAnnotation(new HippoBinaryAnnotation(System.currentTimeMillis(), key, value, span.getEndPoint(), null)); + return span; + } + }); } - public static void record(String message) { - record(new Record(getTraceId(), System.currentTimeMillis(), new Annotation.Message(message), null)); + public static void recordMessage(String message) { + if (!tracingEnabled) + return; + + annotate(message, null); } - public static void recordRpcName(String service, String rpc) { - record(new Record(getTraceId(), System.currentTimeMillis(), new Annotation.RpcName(service, rpc), null)); + public static void recordRpcName(final String service, final String rpc) { + if (!tracingEnabled) + return; + + mutate(getTraceId(), new SpanUpdater() { + @Override + public Span updateSpan(Span span) { + span.setServiceName(service); + span.setName(rpc); + return span; + } + }); } - public static void recordClientAddr(String ip, int port) { - record(new Record(getTraceId(), System.currentTimeMillis(), new Annotation.ClientAddr(ip, port), null)); + public static void recordEndPoint(final String ip, final int port) { + if (!tracingEnabled) + return; + + mutate(getTraceId(), new SpanUpdater() { + @Override + public Span updateSpan(Span span) { + // set endpoint to both span and annotations + span.setEndPoint(new EndPoint(ip, port)); + return span; + } + }); } - public static void recordServerAddr(String ip, int port) { - record(new Record(getTraceId(), System.currentTimeMillis(), new Annotation.ServerAddr(ip, port), null)); + private static void annotate(final String value, final Long duration) { + if (!tracingEnabled) + return; + + mutate(getTraceId(), new SpanUpdater() { + @Override + public Span updateSpan(Span span) { + span.addAnnotation(new HippoAnnotation(System.currentTimeMillis(), value, span.getEndPoint(), duration)); + return span; + } + }); } } \ No newline at end of file diff --git a/src/main/java/com/profiler/context/TraceStack.java b/src/main/java/com/profiler/context/TraceStack.java deleted file mode 100644 index 4cb2ea861..000000000 --- a/src/main/java/com/profiler/context/TraceStack.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.profiler.context; - -import com.profiler.util.NamedThreadLocal; - -@Deprecated -public class TraceStack { - - private static final class Local { - - private static final ThreadLocal context = new NamedThreadLocal("StateContext"); - private static volatile int size = 0; - - static int add() { - size += 1; - return size - 1; - } - - static void set(int i, State value) { - assert i < size; - - State[] ctx = context.get(); - - if (ctx == null) { - ctx = new State[size]; - } else { - State[] oldCtx = ctx; - ctx = new State[size]; - System.arraycopy(oldCtx, 0, ctx, 0, oldCtx.length); - } - - ctx[i] = value; - context.set(ctx); - } - - static State get(int i) { - State[] ctx = context.get(); - - if (ctx == null || ctx.length <= i) { - return null; - } - - return ctx[i]; - } - - static void clear(int i) { - set(i, null); - } - } - - private final int me; - - public TraceStack() { - me = Local.add(); - } - - public void set(State state) { - Local.set(me, state); - } - - public void clear() { - Local.clear(me); - } - - public State get() { - return Local.get(me); - } -} diff --git a/src/main/java/com/profiler/context/tracer/DefaultTracer.java b/src/main/java/com/profiler/context/tracer/DefaultTracer.java deleted file mode 100644 index ca575b07c..000000000 --- a/src/main/java/com/profiler/context/tracer/DefaultTracer.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.profiler.context.tracer; - -import com.profiler.context.Annotation; -import com.profiler.context.Annotation.ClientAddr; -import com.profiler.context.Annotation.RpcName; -import com.profiler.context.Annotation.ServerAddr; -import com.profiler.context.DeadlineSpanMap; -import com.profiler.context.Record; -import com.profiler.context.Span; -import com.profiler.context.SpanUpdater; -import com.profiler.context.TraceID; - -public class DefaultTracer implements Tracer { - - private final DeadlineSpanMap spanMap = new DeadlineSpanMap(); - - private void mutate(TraceID traceId, SpanUpdater spanUpdater) { - Span span = spanMap.update(traceId, spanUpdater); - - if (span.isExistsAnnotationType("CR") || span.isExistsAnnotationType("SS")) { - spanMap.remove(traceId); - logSpan(span); - } - } - - private void annotate(final Record record, final String value) { - mutate(record.getTraceId(), new SpanUpdater() { - @Override - public Span updateSpan(Span span) { - span.addAnnotation(new HippoAnnotation(record.getTimestamp(), value, span.getEndPoint(), record.getDuration())); - return span; - } - }); - } - - private void setEndPoint(Record record, final EndPoint endPoint) { - mutate(record.getTraceId(), new SpanUpdater() { - @Override - public Span updateSpan(Span span) { - // set endpoint to both span and annotations - span.setEndPoint(endPoint); - return span; - } - }); - } - - private void logSpan(Span span) { - // TODO: send span to server - System.out.println("\n\nWrite span hash=" + span.hashCode() + ", value=" + span + ", spanMap.size=" + spanMap.size() + ", threadid=" + Thread.currentThread().getId() + "\n\n"); - } - - @Override - public void record(final Record record) { - final Annotation ann = record.getAnnotation(); - - if (ann instanceof Annotation.ClientSend) { - annotate(record, "CS"); - } else if (ann instanceof Annotation.ClientRecv) { - annotate(record, "CR"); - } else if (ann instanceof Annotation.ServerSend) { - annotate(record, "SS"); - } else if (ann instanceof Annotation.ServerRecv) { - annotate(record, "SR"); - } else if (ann instanceof Annotation.Message) { - annotate(record, ((Annotation.Message) ann).getMessage()); - } else if (ann instanceof Annotation.RpcName) { - mutate(record.getTraceId(), new SpanUpdater() { - @Override - public Span updateSpan(Span span) { - RpcName a = (RpcName) ann; - span.setName(a.getRpc()); - span.setServiceName(a.getService()); - return span; - } - }); - } else if (ann instanceof Annotation.ClientAddr) { - ClientAddr a = (ClientAddr) ann; - setEndPoint(record, new EndPoint(a.getIp(), a.getPort())); - } else if (ann instanceof Annotation.ServerAddr) { - ServerAddr a = (ServerAddr) ann; - setEndPoint(record, new EndPoint(a.getIp(), a.getPort())); - } - } -} diff --git a/src/main/java/com/profiler/context/tracer/Tracer.java b/src/main/java/com/profiler/context/tracer/Tracer.java deleted file mode 100644 index cac988f27..000000000 --- a/src/main/java/com/profiler/context/tracer/Tracer.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.profiler.context.tracer; - -import com.profiler.context.Record; - -public interface Tracer { - - public void record(Record record); -} diff --git a/src/main/java/com/profiler/modifier/connector/interceptors/ExecuteMethodInterceptor.java b/src/main/java/com/profiler/modifier/connector/interceptors/ExecuteMethodInterceptor.java index 19b9aa73d..aeedf5f96 100644 --- a/src/main/java/com/profiler/modifier/connector/interceptors/ExecuteMethodInterceptor.java +++ b/src/main/java/com/profiler/modifier/connector/interceptors/ExecuteMethodInterceptor.java @@ -34,7 +34,7 @@ public class ExecuteMethodInterceptor implements StaticAroundInterceptor { TraceID nextId = Trace.getNextId(); - // UUID format을 그대로. + // UUID format을 그대로. request.addHeader(Header.HTTP_TRACE_ID.toString(), nextId.getTraceId().toString()); request.addHeader(Header.HTTP_SPAN_ID.toString(), Long.toString(nextId.getSpanId())); request.addHeader(Header.HTTP_PARENT_SPAN_ID.toString(), Long.toString(nextId.getParentSpanId())); @@ -42,9 +42,9 @@ public class ExecuteMethodInterceptor implements StaticAroundInterceptor { request.addHeader(Header.HTTP_FLAGS.toString(), String.valueOf(nextId.getFlags())); Trace.recordRpcName("http-call", ""); - Trace.recordServerAddr(host.getHostName(), host.getPort()); - Trace.record("http.uri=" + request.toString()); - Trace.record(new Annotation.ClientSend()); + Trace.recordEndPoint(host.getHostName(), host.getPort()); + Trace.recordMessage("http.uri=" + request.toString()); + Trace.record(Annotation.ClientSend); StopWatch.start("ExecuteMethodInterceptor"); } @@ -52,6 +52,6 @@ public class ExecuteMethodInterceptor implements StaticAroundInterceptor { @Override public void after(Object target, String className, String methodName, Object[] args, Object result) { System.out.println("\n\n\n\nHTTP AFTER"); - Trace.record(new Annotation.ClientRecv(), StopWatch.stopAndGetElapsed("ExecuteMethodInterceptor")); + Trace.record(Annotation.ClientRecv, StopWatch.stopAndGetElapsed("ExecuteMethodInterceptor")); } } \ No newline at end of file diff --git a/src/main/java/com/profiler/modifier/db/mysql/interceptors/ExecuteQueryMethodInterceptor.java b/src/main/java/com/profiler/modifier/db/mysql/interceptors/ExecuteQueryMethodInterceptor.java index d9ec5c295..cad45e8c3 100644 --- a/src/main/java/com/profiler/modifier/db/mysql/interceptors/ExecuteQueryMethodInterceptor.java +++ b/src/main/java/com/profiler/modifier/db/mysql/interceptors/ExecuteQueryMethodInterceptor.java @@ -27,13 +27,12 @@ public class ExecuteQueryMethodInterceptor implements StaticAroundInterceptor { // // TODO: add destination address // - + if (args.length > 0) { - System.out.println("Query=" + args[0]); - Trace.record("Query=" + args[0]); + Trace.recordAttibute("Query", args[0]); } - Trace.record(new Annotation.ClientSend()); + Trace.record(Annotation.ClientSend); StopWatch.start("ExecuteQueryMethodInterceptor"); } catch (Exception e) { @@ -47,6 +46,6 @@ public class ExecuteQueryMethodInterceptor implements StaticAroundInterceptor { return; } - Trace.record(new Annotation.ClientRecv(), StopWatch.stopAndGetElapsed("ExecuteQueryMethodInterceptor")); + Trace.record(Annotation.ClientRecv, StopWatch.stopAndGetElapsed("ExecuteQueryMethodInterceptor")); } } diff --git a/src/main/java/com/profiler/modifier/db/mysql/interceptors/ExecuteUpdateMethodInterceptor.java b/src/main/java/com/profiler/modifier/db/mysql/interceptors/ExecuteUpdateMethodInterceptor.java index 964ddacef..505977bd6 100644 --- a/src/main/java/com/profiler/modifier/db/mysql/interceptors/ExecuteUpdateMethodInterceptor.java +++ b/src/main/java/com/profiler/modifier/db/mysql/interceptors/ExecuteUpdateMethodInterceptor.java @@ -32,10 +32,10 @@ public class ExecuteUpdateMethodInterceptor implements StaticAroundInterceptor { // if (args.length > 0) { - Trace.record("Query=" + args[0]); + Trace.recordAttibute("Query", args[0]); } - Trace.record(new Annotation.ClientSend()); + Trace.record(Annotation.ClientSend); StopWatch.start("ExecuteUpdateMethodInterceptor"); } catch (Exception e) { @@ -50,6 +50,6 @@ public class ExecuteUpdateMethodInterceptor implements StaticAroundInterceptor { return; } - Trace.record(new Annotation.ClientRecv(), StopWatch.stopAndGetElapsed("ExecuteUpdateMethodInterceptor")); + Trace.record(Annotation.ClientRecv, StopWatch.stopAndGetElapsed("ExecuteUpdateMethodInterceptor")); } } diff --git a/src/main/java/com/profiler/modifier/tomcat/interceptors/InvokeMethodInterceptor.java b/src/main/java/com/profiler/modifier/tomcat/interceptors/InvokeMethodInterceptor.java index fc91b2a3a..51aa8b35d 100644 --- a/src/main/java/com/profiler/modifier/tomcat/interceptors/InvokeMethodInterceptor.java +++ b/src/main/java/com/profiler/modifier/tomcat/interceptors/InvokeMethodInterceptor.java @@ -5,7 +5,11 @@ import java.util.UUID; import javax.servlet.http.HttpServletRequest; -import com.profiler.context.*; +import com.profiler.context.Annotation; +import com.profiler.context.Header; +import com.profiler.context.SpanID; +import com.profiler.context.Trace; +import com.profiler.context.TraceID; import com.profiler.interceptor.StaticAroundInterceptor; import com.profiler.trace.RequestTracer; import com.profiler.util.NamedThreadLocal; @@ -13,22 +17,22 @@ import com.profiler.util.NumberUtils; public class InvokeMethodInterceptor implements StaticAroundInterceptor { - private ThreadLocal start = new NamedThreadLocal("InvokeMethodInterceptor-starttime"); + private ThreadLocal start = new NamedThreadLocal("InvokeMethodInterceptor-starttime"); - @Override - public void before(Object target, String className, String methodName, Object[] args) { - try { - HttpServletRequest request = (HttpServletRequest) args[0]; - String requestURL = request.getRequestURI(); - String clientIP = request.getRemoteAddr(); - String parameters = getParameter(request); + @Override + public void before(Object target, String className, String methodName, Object[] args) { + try { + HttpServletRequest request = (HttpServletRequest) args[0]; + String requestURL = request.getRequestURI(); + String clientIP = request.getRemoteAddr(); + String parameters = getParameter(request); - UUID traceID = getTraceId(request); - if (traceID != null) { - long parentSpanID = NumberUtils.parseLong(request.getHeader(Header.HTTP_PARENT_SPAN_ID.toString()), SpanID.NULL); - long spanID = NumberUtils.parseLong(request.getHeader(Header.HTTP_SPAN_ID.toString()), SpanID.NULL); - boolean sampled = Boolean.parseBoolean(request.getHeader(Header.HTTP_SAMPLED.toString())); - int flags = NumberUtils.parseInteger(request.getHeader(Header.HTTP_FLAGS.toString()), 0); + UUID traceID = getTraceId(request); + if (traceID != null) { + long parentSpanID = NumberUtils.parseLong(request.getHeader(Header.HTTP_PARENT_SPAN_ID.toString()), SpanID.NULL); + long spanID = NumberUtils.parseLong(request.getHeader(Header.HTTP_SPAN_ID.toString()), SpanID.NULL); + boolean sampled = Boolean.parseBoolean(request.getHeader(Header.HTTP_SAMPLED.toString())); + int flags = NumberUtils.parseInteger(request.getHeader(Header.HTTP_FLAGS.toString()), 0); TraceID id = new TraceID(traceID, parentSpanID, spanID, sampled, flags); @@ -40,56 +44,56 @@ public class InvokeMethodInterceptor implements StaticAroundInterceptor { Trace.setTraceId(TraceID.newTraceId()); } - Trace.recordRpcName("tomcat", requestURL); - Trace.recordServerAddr(request.getLocalAddr(), request.getLocalPort()); - Trace.record("Parameter=" + parameters); - Trace.record(new Annotation.ServerRecv()); + Trace.recordRpcName("tomcat", requestURL); + Trace.recordEndPoint(request.getLocalAddr(), request.getLocalPort()); + Trace.recordMessage("Parameter=" + parameters); + Trace.record(Annotation.ServerRecv); - RequestTracer.startTransaction(requestURL, clientIP, System.currentTimeMillis(), parameters); + RequestTracer.startTransaction(requestURL, clientIP, System.currentTimeMillis(), parameters); start.set(System.currentTimeMillis()); } catch (Exception e) { e.printStackTrace(); } } - - @Override - public void after(Object target, String className, String methodName, Object[] args, Object result) { - // TODO result 가 Exception 타입일경우 호출 실패임. - Trace.record(new Annotation.ServerSend(), System.currentTimeMillis() - start.get()); - start.remove(); - RequestTracer.endTransaction(); - } - - private UUID getTraceId(HttpServletRequest request) { - String header = request.getHeader(Header.HTTP_TRACE_ID.toString()); - if (header == null) { - return null; - } - try { - return UUID.fromString(header); - } catch (IllegalArgumentException e) { - return null; - } - } - private String getParameter(HttpServletRequest request) { - Enumeration attrs = request.getParameterNames(); - - StringBuilder params = new StringBuilder(); + @Override + public void after(Object target, String className, String methodName, Object[] args, Object result) { + // TODO result 가 Exception 타입일경우 호출 실패임. + Trace.record(Annotation.ServerSend, System.currentTimeMillis() - start.get()); + start.remove(); + RequestTracer.endTransaction(); + } - while (attrs.hasMoreElements()) { - String keyString = attrs.nextElement().toString(); - Object value = request.getParameter(keyString); + private UUID getTraceId(HttpServletRequest request) { + String header = request.getHeader(Header.HTTP_TRACE_ID.toString()); + if (header == null) { + return null; + } + try { + return UUID.fromString(header); + } catch (IllegalArgumentException e) { + return null; + } + } - if (value != null) { - String valueString = value.toString(); - int valueStringLength = valueString.length(); + private String getParameter(HttpServletRequest request) { + Enumeration attrs = request.getParameterNames(); - if (valueStringLength > 0 && valueStringLength < 100) - params.append(keyString).append("=").append(valueString); - } - } + StringBuilder params = new StringBuilder(); - return params.toString(); - } + while (attrs.hasMoreElements()) { + String keyString = attrs.nextElement().toString(); + Object value = request.getParameter(keyString); + + if (value != null) { + String valueString = value.toString(); + int valueStringLength = valueString.length(); + + if (valueStringLength > 0 && valueStringLength < 100) + params.append(keyString).append("=").append(valueString); + } + } + + return params.toString(); + } } diff --git a/src/test/java/com/profiler/context/SpanTest.java b/src/test/java/com/profiler/context/SpanTest.java index 8fce907fd..f0356646c 100644 --- a/src/test/java/com/profiler/context/SpanTest.java +++ b/src/test/java/com/profiler/context/SpanTest.java @@ -8,14 +8,10 @@ import junit.framework.Assert; import org.junit.Test; -import com.profiler.context.tracer.DefaultTracer; - public class SpanTest { @Test public void span() { - Trace.addTracer(new DefaultTracer()); - int testSize = 1; final CountDownLatch startLatch = new CountDownLatch(1); @@ -54,19 +50,18 @@ public class SpanTest { } Trace.setTraceId(Trace.getNextId()); - Trace.addTracer(new DefaultTracer()); - Trace.record("msg:client send"); - Trace.record(new Annotation.ClientSend()); + Trace.recordMessage("msg:client send"); + Trace.record(Annotation.ClientSend); - Trace.record("msg:server recv"); - Trace.record(new Annotation.ServerRecv()); + Trace.recordMessage("msg:server recv"); + Trace.record(Annotation.ServerRecv); - Trace.record("msg:server send"); - Trace.record(new Annotation.ServerSend()); + Trace.recordMessage("msg:server send"); + Trace.record(Annotation.ServerSend); - Trace.record("msg:client recv"); - Trace.record(new Annotation.ClientRecv()); + Trace.recordMessage("msg:client recv"); + Trace.record(Annotation.ClientRecv); endLatch.countDown(); } diff --git a/src/test/java/com/profiler/context/TraceTest.java b/src/test/java/com/profiler/context/TraceTest.java index f986a6caa..55d2df705 100644 --- a/src/test/java/com/profiler/context/TraceTest.java +++ b/src/test/java/com/profiler/context/TraceTest.java @@ -10,26 +10,26 @@ public class TraceTest { nextId.setSampled(Trace.getTraceId().isSampled()); Trace.setTraceId(nextId); - + // http server receive Trace.recordRpcName("service_name", "http://"); - Trace.recordServerAddr("localhost", 8080); - Trace.record(new Annotation.ServerRecv()); + Trace.recordEndPoint("localhost", 8080); + Trace.record(Annotation.ServerRecv); // get data form db getDataFromDB(); // response to client - Trace.record(new Annotation.ServerSend()); + Trace.record(Annotation.ServerSend); } private void getDataFromDB() { // db server request Trace.recordRpcName("mysql", "mysql"); - Trace.record("query"); - Trace.record(new Annotation.ClientSend()); + Trace.recordMessage("query"); + Trace.record(Annotation.ClientSend); // get a db response - Trace.record(new Annotation.ClientRecv()); + Trace.record(Annotation.ClientRecv); } }