@Override
    public void after(Object target, Object[] args, Object result, Throwable throwable) {
        if (isDebug) {
            logger.afterInterceptor(target, args, result, throwable);
        }

        final Trace trace = traceContext.currentRawTraceObject();
        if (trace == null) {
            return;
        }

        if (!validate(target)) {
            return;
        }

        final InterceptorScopeInvocation currentTransaction = this.scope.getCurrentInvocation();
        final Object attachment = currentTransaction.getAttachment();
        if (attachment instanceof ThriftClientCallContext) {
            if (!hasScope(trace)) {
                // not vertx trace.
                return;
            }

            if (!leaveScope(trace)) {
                if (logger.isInfoEnabled()) {
                    logger.info("Failed to leave scope. trace={}, sampled={}", trace, trace.canSampled());
                }
                // delete unstable trace.
                deleteTrace(trace);
                return;
            }

            if (!isEndScope(trace)) {
                // ignored recursive call.
                return;
            }

            if (!trace.canSampled()) {
                deleteTrace(trace);
                return;
            }

            try {
                final SpanEventRecorder recorder = trace.currentSpanEventRecorder();
                recorder.recordException(throwable);
                recorder.recordApi(this.descriptor);
            } catch (Throwable t) {
                logger.warn("AFTER. Cause:{}", t.getMessage(), t);
            } finally {
                trace.traceBlockEnd();
                deleteTrace(trace);
            }
        }
    }
This interceptor intercepts the point in which the client message is read, and creates a new trace object to indicate the starting point of a new span.
<ul>
<li>Synchronous
<p>
<tt>TBaseProcessorProcessInterceptor</tt> -> <tt>ProcessFunctionProcessInterceptor</tt> -> <tt>TProtocolReadFieldBeginInterceptor</tt> <->
<tt>TProtocolReadTTypeInterceptor</tt> -> <b><tt>TProtocolReadMessageEndInterceptor</tt></b></li>
<li>Asynchronous
<p>
<tt>TBaseAsyncProcessorProcessInterceptor</tt> -> <tt>TProtocolReadMessageBeginInterceptor</tt> -> <tt>TProtocolReadFieldBeginInterceptor</tt> <->
<tt>TProtocolReadTTypeInterceptor</tt> -> <b><tt>TProtocolReadMessageEndInterceptor</tt></b>
</ul>
<p>
Based on Thrift 0.8.0+

@author HyunGil Jeong
@see com.navercorp.pinpoint.plugin.thrift.interceptor.server.TBaseProcessorProcessInterceptor TBaseProcessorProcessInterceptor
@see com.navercorp.pinpoint.plugin.thrift.interceptor.server.ProcessFunctionProcessInterceptor ProcessFunctionProcessInterceptor
@see com.navercorp.pinpoint.plugin.thrift.interceptor.server.async.TBaseAsyncProcessorProcessInterceptor TBaseAsyncProcessProcessInterceptor
@see com.navercorp.pinpoint.plugin.thrift.interceptor.tprotocol.server.TProtocolReadMessageBeginInterceptor TProtocolReadMessageBeginInterceptor
@see com.navercorp.pinpoint.plugin.thrift.interceptor.tprotocol.server.TProtocolReadFieldBeginInterceptor TProtocolReadFieldBeginInterceptor
@see com.navercorp.pinpoint.plugin.thrift.interceptor.tprotocol.server.TProtocolReadTTypeInterceptor TProtocolReadTTypeInterceptor
agent-module/plugins/thrift/src/main/java/com/navercorp/pinpoint/plugin/thrift/interceptor/tprotocol/server/TProtocolReadMessageEndInterceptor.java