diff --git a/src/main/java/com/profiler/context/DeadlineSpanMap.java b/src/main/java/com/profiler/context/DeadlineSpanMap.java index 462985812..54179965f 100644 --- a/src/main/java/com/profiler/context/DeadlineSpanMap.java +++ b/src/main/java/com/profiler/context/DeadlineSpanMap.java @@ -18,7 +18,7 @@ public class DeadlineSpanMap { Span span = map.get(traceIdKey); if (span == null) { - span = new Span(traceId, null, null); + span = new Span(traceId); map.put(traceIdKey, span); TimerTask task = new FlushTimedoutSpanTask(span); diff --git a/src/main/java/com/profiler/context/Span.java b/src/main/java/com/profiler/context/Span.java index 6828c7ecd..6b8c9436b 100644 --- a/src/main/java/com/profiler/context/Span.java +++ b/src/main/java/com/profiler/context/Span.java @@ -25,10 +25,8 @@ public class Span { private final List annotations = new ArrayList(5); - public Span(TraceID traceId, String name, String endPoint) { + public Span(TraceID traceId) { this.traceID = traceId; - this.name = name; - this.endPoint = endPoint; } public TraceID getTraceID() { @@ -119,9 +117,8 @@ public class Span { com.profiler.common.dto.thrift.Span span = new com.profiler.common.dto.thrift.Span(); span.setAgentId(Agent.getInstance().getAgentId()); - span.setTimestamp(startTime); - // TODO api를 생성하고 여기를 고치자. - //span.setEndTime(startTime); + span.setStartTime(startTime); + span.setEndTime(endTime); span.setMostTraceId(traceID.getId().getMostSignificantBits()); span.setLeastTraceId(traceID.getId().getLeastSignificantBits()); span.setName(name); diff --git a/src/main/java/com/profiler/context/Trace.java b/src/main/java/com/profiler/context/Trace.java index f3e5f6fef..d8ac19eb2 100644 --- a/src/main/java/com/profiler/context/Trace.java +++ b/src/main/java/com/profiler/context/Trace.java @@ -71,14 +71,14 @@ public final class Trace { public AsyncTrace createAsyncTrace() { // 경우에 따라 별도 timeout 처리가 있어야 될수도 있음. TraceID nextTraceId = getNextTraceId(); - Span span = new Span(nextTraceId, null, null); + Span span = new Span(nextTraceId); AsyncTrace asyncTrace = new AsyncTrace(span); asyncTrace.setDataSender(this.getDataSender()); return asyncTrace; } private StackFrame createStackFrame(TraceID nextId, int stackId) { - Span span = new Span(nextId, null, null); + Span span = new Span(nextId); StackFrame stackFrame = new StackFrame(span); stackFrame.setStackFrameId(stackId); return stackFrame; @@ -93,16 +93,22 @@ public final class Trace { stackFrame.markBeforeTime(); } -// public void attachObject(Object object) { -// StackFrame stackFrame = getCurrentStackFrame(); -// stackFrame.attachObject(object); -// } + public void markAfterTime() { + StackFrame stackFrame = getCurrentStackFrame(); + stackFrame.markAfterTime(); + } public long afterTime() { StackFrame context = getCurrentStackFrame(); return context.afterTime(); } +// public void attachObject(Object object) { +// StackFrame stackFrame = getCurrentStackFrame(); +// stackFrame.attachObject(object); +// } + + public void traceBlockBegin(int stackId) { TraceID nextId = getNextTraceId(); callStack.push(); 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 032de5755..9630810e0 100644 --- a/src/main/java/com/profiler/modifier/connector/interceptors/ExecuteMethodInterceptor.java +++ b/src/main/java/com/profiler/modifier/connector/interceptors/ExecuteMethodInterceptor.java @@ -39,8 +39,8 @@ public class ExecuteMethodInterceptor implements StaticAroundInterceptor { return; } trace.traceBlockBegin(); - trace.markBeforeTime(); + TraceID nextId = trace.getCurrentTraceId(); final HttpHost host = (HttpHost) args[0]; final HttpRequest request = (HttpRequest) args[1]; @@ -51,7 +51,7 @@ public class ExecuteMethodInterceptor implements StaticAroundInterceptor { request.addHeader(Header.HTTP_SAMPLED.toString(), String.valueOf(nextId.isSampled())); request.addHeader(Header.HTTP_FLAGS.toString(), String.valueOf(nextId.getFlags())); - trace.record(Annotation.ClientSend); + trace.recordRpcName(request.getProtocolVersion().toString(), "CLIENT"); trace.recordEndPoint(request.getProtocolVersion().toString() + ":" + host.getHostName() + ":" + host.getPort()); trace.recordAttribute("http.url", request.getRequestLine().getUri()); @@ -70,7 +70,8 @@ public class ExecuteMethodInterceptor implements StaticAroundInterceptor { if (trace == null) { return; } - trace.record(Annotation.ClientRecv, trace.afterTime()); + + trace.markAfterTime(); trace.traceBlockEnd(); } } \ No newline at end of file diff --git a/src/main/java/com/profiler/modifier/db/interceptor/DriverConnectInterceptor.java b/src/main/java/com/profiler/modifier/db/interceptor/DriverConnectInterceptor.java index a9de0cf48..b33654b56 100644 --- a/src/main/java/com/profiler/modifier/db/interceptor/DriverConnectInterceptor.java +++ b/src/main/java/com/profiler/modifier/db/interceptor/DriverConnectInterceptor.java @@ -40,7 +40,6 @@ public class DriverConnectInterceptor implements StaticAroundInterceptor { return; } trace.traceBlockBegin(); - trace.record(Annotation.ClientSend); trace.markBeforeTime(); } @@ -79,7 +78,8 @@ public class DriverConnectInterceptor implements StaticAroundInterceptor { trace.recordAttribute("Success", "false"); trace.recordAttribute("Exception", th.getMessage()); } - trace.record(Annotation.ClientRecv, trace.afterTime()); + + trace.markAfterTime(); trace.traceBlockEnd(); } diff --git a/src/main/java/com/profiler/modifier/db/interceptor/PreparedStatementCreateInterceptor.java b/src/main/java/com/profiler/modifier/db/interceptor/PreparedStatementCreateInterceptor.java index 77e790af4..8bee05f44 100644 --- a/src/main/java/com/profiler/modifier/db/interceptor/PreparedStatementCreateInterceptor.java +++ b/src/main/java/com/profiler/modifier/db/interceptor/PreparedStatementCreateInterceptor.java @@ -3,6 +3,7 @@ package com.profiler.modifier.db.interceptor; import com.profiler.context.Trace; import com.profiler.context.TraceContext; import com.profiler.interceptor.StaticAfterInterceptor; +import com.profiler.interceptor.StaticAroundInterceptor; import com.profiler.modifier.db.util.DatabaseInfo; import com.profiler.util.InterceptorUtils; import com.profiler.util.MetaObject; @@ -13,7 +14,7 @@ import java.util.Arrays; import java.util.logging.Level; import java.util.logging.Logger; -public class PreparedStatementCreateInterceptor implements StaticAfterInterceptor { +public class PreparedStatementCreateInterceptor implements StaticAroundInterceptor { private final Logger logger = Logger.getLogger(PreparedStatementCreateInterceptor.class.getName()); // connection 용. @@ -22,6 +23,24 @@ public class PreparedStatementCreateInterceptor implements StaticAfterIntercepto private final MetaObject setSql = new MetaObject("__setSql", String.class); + @Override + public void before(Object target, String className, String methodName, String parameterDescription, Object[] args) { + if (logger.isLoggable(Level.INFO)) { + logger.info("before " + StringUtils.toString(target) + " " + className + "." + methodName + parameterDescription + " args:" + Arrays.toString(args)); + } + if (JDBCScope.isInternal()) { + logger.info("internal jdbc scope. skip trace"); + return; + } + TraceContext traceContext = TraceContext.getTraceContext(); + Trace trace = traceContext.currentTraceObject(); + if (trace == null) { + return; + } + trace.traceBlockBegin(); + trace.markBeforeTime(); + } + @Override public void after(Object target, String className, String methodName, String parameterDescription, Object[] args, Object result) { if (logger.isLoggable(Level.INFO)) { @@ -45,6 +64,8 @@ public class PreparedStatementCreateInterceptor implements StaticAfterIntercepto String sql = (String) args[0]; this.setSql.invoke(result, sql); } + trace.afterTime(); + trace.traceBlockEnd(); } diff --git a/src/main/java/com/profiler/modifier/db/interceptor/PreparedStatementExecuteQueryInterceptor.java b/src/main/java/com/profiler/modifier/db/interceptor/PreparedStatementExecuteQueryInterceptor.java index 139212316..98c2a77f4 100644 --- a/src/main/java/com/profiler/modifier/db/interceptor/PreparedStatementExecuteQueryInterceptor.java +++ b/src/main/java/com/profiler/modifier/db/interceptor/PreparedStatementExecuteQueryInterceptor.java @@ -45,6 +45,7 @@ public class PreparedStatementExecuteQueryInterceptor implements StaticAroundInt return; } trace.traceBlockBegin(); + trace.markBeforeTime(); try { DatabaseInfo databaseInfo = (DatabaseInfo) getUrl.invoke(target); // trace.recordRpcName("MYSQL", url); @@ -60,7 +61,7 @@ public class PreparedStatementExecuteQueryInterceptor implements StaticAroundInt clean(target); - trace.record(Annotation.ClientSend); + } catch (Exception e) { if (logger.isLoggable(Level.WARNING)) { logger.log(Level.WARNING, e.getMessage(), e); @@ -108,12 +109,13 @@ public class PreparedStatementExecuteQueryInterceptor implements StaticAroundInt Throwable th = (Throwable) result; trace.recordAttribute("Exception", th.getMessage()); } - trace.record(Annotation.ClientRecv); + } catch (Exception e) { if (logger.isLoggable(Level.WARNING)) { logger.log(Level.WARNING, e.getMessage(), e); } } finally { + trace.markAfterTime(); trace.traceBlockEnd(); } } diff --git a/src/main/java/com/profiler/modifier/db/interceptor/StatementExecuteQueryInterceptor.java b/src/main/java/com/profiler/modifier/db/interceptor/StatementExecuteQueryInterceptor.java index 5bead04b9..6ef8dc6c5 100644 --- a/src/main/java/com/profiler/modifier/db/interceptor/StatementExecuteQueryInterceptor.java +++ b/src/main/java/com/profiler/modifier/db/interceptor/StatementExecuteQueryInterceptor.java @@ -49,7 +49,7 @@ public class StatementExecuteQueryInterceptor implements StaticAroundInterceptor if (args.length > 0) { trace.recordAttribute("Statement", args[0]); } - trace.record(Annotation.ClientSend); + } catch (Exception e) { if (logger.isLoggable(Level.WARNING)) { logger.log(Level.WARNING, e.getMessage(), e); @@ -73,7 +73,8 @@ public class StatementExecuteQueryInterceptor implements StaticAroundInterceptor } trace.recordAttribute("Success", InterceptorUtils.isSuccess(result)); - trace.record(Annotation.ClientRecv, trace.afterTime()); + + trace.markAfterTime(); trace.traceBlockEnd(); } } diff --git a/src/main/java/com/profiler/modifier/db/interceptor/StatementExecuteUpdateInterceptor.java b/src/main/java/com/profiler/modifier/db/interceptor/StatementExecuteUpdateInterceptor.java index c7719d123..c9fc1a79e 100644 --- a/src/main/java/com/profiler/modifier/db/interceptor/StatementExecuteUpdateInterceptor.java +++ b/src/main/java/com/profiler/modifier/db/interceptor/StatementExecuteUpdateInterceptor.java @@ -40,6 +40,7 @@ public class StatementExecuteUpdateInterceptor implements StaticAroundIntercepto trace.traceBlockBegin(); trace.markBeforeTime(); + try { if (args.length > 0) { DatabaseInfo databaseInfo = (DatabaseInfo) this.getUrl.invoke(target); @@ -53,7 +54,6 @@ public class StatementExecuteUpdateInterceptor implements StaticAroundIntercepto trace.recordAttribute("Query", "args size is 0"); } - trace.record(Annotation.ClientSend); } catch (Exception e) { if (logger.isLoggable(Level.WARNING)) { @@ -77,7 +77,7 @@ public class StatementExecuteUpdateInterceptor implements StaticAroundIntercepto } // TODO 결과, 수행시간을.알수 있어야 될듯. - trace.record(Annotation.ClientRecv, trace.afterTime()); + trace.markAfterTime(); trace.traceBlockEnd(); } } diff --git a/src/main/java/com/profiler/modifier/db/interceptor/TransactionInterceptor.java b/src/main/java/com/profiler/modifier/db/interceptor/TransactionInterceptor.java index 5835ccfd9..d31caad83 100644 --- a/src/main/java/com/profiler/modifier/db/interceptor/TransactionInterceptor.java +++ b/src/main/java/com/profiler/modifier/db/interceptor/TransactionInterceptor.java @@ -74,10 +74,12 @@ public class TransactionInterceptor implements StaticAroundInterceptor { private void beforeStartTransaction(Trace trace, Connection target) { trace.traceBlockBegin(); + trace.markBeforeTime(); + DatabaseInfo databaseInfo = (DatabaseInfo) this.getUrl.invoke(target); trace.recordRpcName(getRpcName(databaseInfo), databaseInfo.getUrl()); trace.recordTerminalEndPoint(databaseInfo.getUrl()); - trace.record(Annotation.ClientSend); + } private String getRpcName(DatabaseInfo databaseInfo) { @@ -97,7 +99,7 @@ public class TransactionInterceptor implements StaticAroundInterceptor { Throwable th = (Throwable) result; trace.recordAttribute("Exception", th.getMessage()); } - trace.record(Annotation.ClientRecv); + } else { if (success) { trace.recordAttribute("Transaction", "autoCommit:false"); @@ -106,23 +108,26 @@ public class TransactionInterceptor implements StaticAroundInterceptor { Throwable th = (Throwable) result; trace.recordAttribute("Exception", th.getMessage()); } - trace.record(Annotation.ClientRecv); + } } catch (Exception e) { if (logger.isLoggable(Level.WARNING)) { logger.log(Level.WARNING, e.getMessage(), e); } } finally { + trace.markAfterTime(); trace.traceBlockEnd(); } } private void beforeCommit(Trace trace, Connection target) { trace.traceBlockBegin(); + trace.markBeforeTime(); + DatabaseInfo databaseInfo = (DatabaseInfo) this.getUrl.invoke(target); trace.recordRpcName(getRpcName(databaseInfo), databaseInfo.getUrl()); trace.recordTerminalEndPoint(databaseInfo.getUrl()); - trace.record(Annotation.ClientSend); +// trace.record(Annotation.ClientSend); } @@ -140,12 +145,13 @@ public class TransactionInterceptor implements StaticAroundInterceptor { Throwable th = (Throwable) result; trace.recordAttribute("Exception", th.getMessage()); } - trace.record(Annotation.ClientRecv); + } catch (Exception e) { if (logger.isLoggable(Level.WARNING)) { logger.log(Level.WARNING, e.getMessage(), e); } } finally { + trace.markAfterTime(); trace.traceBlockEnd(); } } @@ -153,10 +159,11 @@ public class TransactionInterceptor implements StaticAroundInterceptor { private void beforeRollback(Trace trace, Connection target) { trace.traceBlockBegin(); + trace.markBeforeTime(); + DatabaseInfo databaseInfo = (DatabaseInfo) this.getUrl.invoke(target); trace.recordRpcName(getRpcName(databaseInfo), databaseInfo.getUrl()); trace.recordTerminalEndPoint(databaseInfo.getUrl()); - trace.record(Annotation.ClientSend); } private void afterRollback(Trace trace, Connection target, Object result) { @@ -174,12 +181,13 @@ public class TransactionInterceptor implements StaticAroundInterceptor { Throwable th = (Throwable) result; trace.recordAttribute("Exception", th.getMessage()); } - trace.record(Annotation.ClientRecv); + } catch (Exception e) { if (logger.isLoggable(Level.WARNING)) { logger.log(Level.WARNING, e.getMessage(), e); } } finally { + trace.markAfterTime(); trace.traceBlockEnd(); } } 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 12495e21b..c6a850e2d 100644 --- a/src/main/java/com/profiler/modifier/tomcat/interceptors/StandardHostValveInvokeInterceptor.java +++ b/src/main/java/com/profiler/modifier/tomcat/interceptors/StandardHostValveInvokeInterceptor.java @@ -63,7 +63,6 @@ public class StandardHostValveInvokeInterceptor implements StaticAroundIntercept if (parameters != null && parameters.length() > 0) { trace.recordAttribute("http.params", parameters); } - trace.record(Annotation.ServerRecv); } catch (Exception e) { if (logger.isLoggable(Level.WARNING)) { @@ -89,8 +88,8 @@ public class StandardHostValveInvokeInterceptor implements StaticAroundIntercept logger.warning("Corrupted CallStack found. StackId not Root(0)"); // 문제 있는 callstack을 dump하면 도움이 될듯. } - // TODO result 가 Exception 타입일경우 호출 실패임. - trace.record(Annotation.ServerSend, trace.afterTime()); + + trace.markAfterTime(); trace.traceBlockEnd(); }