diff --git a/src/main/java/com/nhn/pinpoint/profiler/context/DefaultAsyncTrace.java b/src/main/java/com/nhn/pinpoint/profiler/context/DefaultAsyncTrace.java index 4d88325ff..616684d5e 100644 --- a/src/main/java/com/nhn/pinpoint/profiler/context/DefaultAsyncTrace.java +++ b/src/main/java/com/nhn/pinpoint/profiler/context/DefaultAsyncTrace.java @@ -114,6 +114,7 @@ public class DefaultAsyncTrace implements AsyncTrace { if (result instanceof Throwable) { Throwable th = (Throwable) result; String drop = StringUtils.drop(th.getMessage()); + recordAttribute(AnnotationKey.EXCEPTION, drop); // TODO 비동기 api일 경우, span에 exception을 마크하기가 까다로움 diff --git a/src/main/java/com/nhn/pinpoint/profiler/context/DefaultTrace.java b/src/main/java/com/nhn/pinpoint/profiler/context/DefaultTrace.java index 1dd59e7a0..adad88fff 100644 --- a/src/main/java/com/nhn/pinpoint/profiler/context/DefaultTrace.java +++ b/src/main/java/com/nhn/pinpoint/profiler/context/DefaultTrace.java @@ -225,10 +225,9 @@ public final class DefaultTrace implements Trace { if (result instanceof Throwable) { final Throwable th = (Throwable) result; final String drop = StringUtils.drop(th.getMessage(), 256); - -// this.currentStackFrame.setExceptionId(); - recordAttribute(AnnotationKey.EXCEPTION, drop); - recordAttribute(AnnotationKey.EXCEPTION_CLASS, th.getClass().getName()); + // exception class가 proxy라서 class Name이 불규칙하면 문제가 발생할수 있다. + final int exceptionId = traceContext.cacheString(th.getClass().getName()); + this.currentStackFrame.setExceptionInfo(exceptionId, drop); final Span span = getCallStack().getSpan(); if (!span.isSetErrCode()) { diff --git a/src/main/java/com/nhn/pinpoint/profiler/context/RootStackFrame.java b/src/main/java/com/nhn/pinpoint/profiler/context/RootStackFrame.java index f9e6946b0..20e2b8781 100644 --- a/src/main/java/com/nhn/pinpoint/profiler/context/RootStackFrame.java +++ b/src/main/java/com/nhn/pinpoint/profiler/context/RootStackFrame.java @@ -68,8 +68,8 @@ public class RootStackFrame implements StackFrame { } @Override - public void setExceptionId(int id) { - this.span.setExceptionId(id); + public void setExceptionInfo(int exceptionId, String exceptionMessage) { + this.span.setExceptionInfo(exceptionId, exceptionMessage); } @Override diff --git a/src/main/java/com/nhn/pinpoint/profiler/context/Span.java b/src/main/java/com/nhn/pinpoint/profiler/context/Span.java index ce9b93f7a..7f9709331 100644 --- a/src/main/java/com/nhn/pinpoint/profiler/context/Span.java +++ b/src/main/java/com/nhn/pinpoint/profiler/context/Span.java @@ -2,6 +2,7 @@ package com.nhn.pinpoint.profiler.context; import com.nhn.pinpoint.profiler.AgentInformation; import com.nhn.pinpoint.profiler.DefaultAgent; +import com.nhn.pinpoint.thrift.dto.TIntStringValue; import com.nhn.pinpoint.thrift.dto.TSpan; /** @@ -60,14 +61,12 @@ public class Span extends TSpan implements Thriftable { this.addToAnnotations(annotation); } - @Override - public void setExceptionId(int exceptionId) { - super.setExceptionId(exceptionId); - } - - @Override - public int getExceptionId() { - return super.getExceptionId(); + public void setExceptionInfo(int exceptionClassId, String exceptionMessage) { + final TIntStringValue exceptionInfo = new TIntStringValue(exceptionClassId); + if (exceptionMessage != null && !exceptionMessage.isEmpty()) { + exceptionInfo.setStringValue(exceptionMessage); + } + super.setExceptionInfo(exceptionInfo); } public boolean isSetErrCode() { diff --git a/src/main/java/com/nhn/pinpoint/profiler/context/SpanEvent.java b/src/main/java/com/nhn/pinpoint/profiler/context/SpanEvent.java index e60ecd678..88b6796ae 100644 --- a/src/main/java/com/nhn/pinpoint/profiler/context/SpanEvent.java +++ b/src/main/java/com/nhn/pinpoint/profiler/context/SpanEvent.java @@ -2,6 +2,7 @@ package com.nhn.pinpoint.profiler.context; import com.nhn.pinpoint.profiler.DefaultAgent; import com.nhn.pinpoint.thrift.dto.TAgentKey; +import com.nhn.pinpoint.thrift.dto.TIntStringValue; import com.nhn.pinpoint.thrift.dto.TSpanEvent; /** @@ -28,6 +29,14 @@ public class SpanEvent extends TSpanEvent implements Thriftable { this.addToAnnotations(annotation); } + public void setExceptionInfo(int exceptionClassId, String exceptionMessage) { + final TIntStringValue exceptionInfo = new TIntStringValue(exceptionClassId); + if (exceptionMessage != null && !exceptionMessage.isEmpty()) { + exceptionInfo.setStringValue(exceptionMessage); + } + super.setExceptionInfo(exceptionInfo); + } + public void markStartTime() { // spanEvent.setStartElapsed((int) (startTime - parentSpanStartTime)); diff --git a/src/main/java/com/nhn/pinpoint/profiler/context/SpanEventStackFrame.java b/src/main/java/com/nhn/pinpoint/profiler/context/SpanEventStackFrame.java index dfa7b031a..d46d03662 100644 --- a/src/main/java/com/nhn/pinpoint/profiler/context/SpanEventStackFrame.java +++ b/src/main/java/com/nhn/pinpoint/profiler/context/SpanEventStackFrame.java @@ -68,8 +68,8 @@ public class SpanEventStackFrame implements StackFrame { } @Override - public void setExceptionId(int id) { -// this.spanEvent.setExceptionId(id); + public void setExceptionInfo(int exceptionId, String exceptionMessage) { + this.spanEvent.setExceptionInfo(exceptionId, exceptionMessage); } @Override diff --git a/src/main/java/com/nhn/pinpoint/profiler/context/StackFrame.java b/src/main/java/com/nhn/pinpoint/profiler/context/StackFrame.java index 674d388bc..33f757f54 100644 --- a/src/main/java/com/nhn/pinpoint/profiler/context/StackFrame.java +++ b/src/main/java/com/nhn/pinpoint/profiler/context/StackFrame.java @@ -23,7 +23,7 @@ public interface StackFrame { void setApiId(int apiId); - void setExceptionId(int id); + void setExceptionInfo(int exceptionId, String exceptionMessage); void setServiceType(short serviceType); diff --git a/src/main/java/com/nhn/pinpoint/profiler/modifier/arcus/interceptor/BaseOperationTransitionStateInterceptor.java b/src/main/java/com/nhn/pinpoint/profiler/modifier/arcus/interceptor/BaseOperationTransitionStateInterceptor.java index 47e9450a1..8aa8108c8 100644 --- a/src/main/java/com/nhn/pinpoint/profiler/modifier/arcus/interceptor/BaseOperationTransitionStateInterceptor.java +++ b/src/main/java/com/nhn/pinpoint/profiler/modifier/arcus/interceptor/BaseOperationTransitionStateInterceptor.java @@ -26,6 +26,7 @@ import com.nhn.pinpoint.profiler.util.MetaObject; /** * */ +@Deprecated public class BaseOperationTransitionStateInterceptor implements SimpleAroundInterceptor, ByteCodeMethodDescriptorSupport, TraceContextSupport { private final PLogger logger = PLoggerFactory.getLogger(this.getClass()); diff --git a/src/main/java/com/nhn/pinpoint/profiler/modifier/arcus/interceptor/FutureGetInterceptor.java b/src/main/java/com/nhn/pinpoint/profiler/modifier/arcus/interceptor/FutureGetInterceptor.java index b0d04bae9..81065e8f0 100644 --- a/src/main/java/com/nhn/pinpoint/profiler/modifier/arcus/interceptor/FutureGetInterceptor.java +++ b/src/main/java/com/nhn/pinpoint/profiler/modifier/arcus/interceptor/FutureGetInterceptor.java @@ -70,7 +70,7 @@ public class FutureGetInterceptor implements SimpleAroundInterceptor, ByteCodeMe // trace.recordAttribute(AnnotationKey.ARCUS_COMMAND, annotation); // find the target node - Operation op = (Operation) getOperation.invoke(target); + final Operation op = (Operation) getOperation.invoke(target); if (op != null) { MemcachedNode handlingNode = op.getHandlingNode(); SocketAddress socketAddress = handlingNode.getSocketAddress(); @@ -92,10 +92,13 @@ public class FutureGetInterceptor implements SimpleAroundInterceptor, ByteCodeMe trace.recordServiceType(ServiceType.MEMCACHED_FUTURE_GET); } - trace.recordException(op.getException()); - if (op.isCancelled()) { - trace.recordAttribute(AnnotationKey.EXCEPTION, "cancelled by user"); + if (op != null) { + trace.recordException(op.getException()); } +// cancel일때 exception은 안던지는 것인가? +// if (op.isCancelled()) { +// trace.recordAttribute(AnnotationKey.EXCEPTION, "cancelled by user"); +// } trace.markAfterTime(); } finally {