package com.navercorp.pinpoint.plugin.resin.interceptor;
import javax.servlet.DispatcherType;
import javax.servlet.http.HttpServletRequest;
import com.navercorp.pinpoint.bootstrap.context.MethodDescriptor;
import com.navercorp.pinpoint.bootstrap.context.SpanEventRecorder;
import com.navercorp.pinpoint.bootstrap.context.Trace;
import com.navercorp.pinpoint.bootstrap.context.TraceContext;
import com.navercorp.pinpoint.bootstrap.interceptor.AroundInterceptor;
import com.navercorp.pinpoint.bootstrap.logging.PLogger;
import com.navercorp.pinpoint.bootstrap.logging.PLoggerFactory;
import com.navercorp.pinpoint.plugin.resin.TraceAccessor;
/**
*
* @author huangpengjie@fang.com
*
*/
public class ErrorPageManagerInterceptor implements AroundInterceptor {
private PLogger logger = PLoggerFactory.getLogger(this.getClass());
private boolean isDebug = logger.isDebugEnabled();
private TraceContext traceContext;
private MethodDescriptor methodDescriptor;
public ErrorPageManagerInterceptor(TraceContext traceContext, MethodDescriptor methodDescriptor) {
super();
this.traceContext = traceContext;
this.methodDescriptor = methodDescriptor;
}
@Override
public void before(Object target, Object[] args) {
}
@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;
}
// TODO STATDISABLE this logic was added to disable statistics tracing
if (!trace.canSampled()) {
traceContext.removeTraceObject();
return;
}
final Exception exception = (Exception) args[0];
try {
SpanEventRecorder recorder = trace.currentSpanEventRecorder();
recorder.recordApi(methodDescriptor);
recorder.recordException(exception);
} catch (Throwable th) {
if (logger.isWarnEnabled()) {
logger.warn("AFTER. Caused:{}", th.getMessage(), th);
}
} finally {
traceContext.removeTraceObject();
deleteTrace(trace, target, args, result, throwable);
}
}
private void deleteTrace(Trace trace, Object target, Object[] args, Object result, Throwable throwable) {
trace.traceBlockEnd();
final HttpServletRequest request = (HttpServletRequest) args[1];
if (!isAsynchronousProcess(request)) {
trace.close();
// reset
setTraceMetadata(request, null);
}
}
private boolean isAsynchronousProcess(final HttpServletRequest request) {
return request.getDispatcherType() == DispatcherType.ASYNC;
}
private void setTraceMetadata(final HttpServletRequest request, final Trace trace) {
if (request instanceof TraceAccessor) {
((TraceAccessor) request)._$PINPOINT$_setTrace(trace);
}
}
}