package com.navercorp.pinpoint.plugin.hystrix.interceptor; import com.navercorp.pinpoint.bootstrap.context.AsyncTraceId; import com.navercorp.pinpoint.bootstrap.context.MethodDescriptor; import com.navercorp.pinpoint.bootstrap.context.SpanEventRecorder; import com.navercorp.pinpoint.bootstrap.context.TraceContext; import com.navercorp.pinpoint.bootstrap.interceptor.SpanAsyncEventSimpleAroundInterceptor; import com.navercorp.pinpoint.plugin.hystrix.HystrixPluginConstants; import com.navercorp.pinpoint.plugin.hystrix.field.EnclosingInstanceFieldGetter; /** * for hystrix-core above 1.4 * * Created by jack on 4/21/16. */ public abstract class HystrixObservableCallInterceptor extends SpanAsyncEventSimpleAroundInterceptor { protected HystrixObservableCallInterceptor(TraceContext traceContext, MethodDescriptor methodDescriptor) { super(traceContext, methodDescriptor); } @Override protected void doInBeforeTrace(SpanEventRecorder recorder, AsyncTraceId asyncTraceId, Object target, Object[] arqgs) { } @Override protected void doInAfterTrace(SpanEventRecorder recorder, Object target, Object[] args, Object result, Throwable throwable) { recorder.recordServiceType(HystrixPluginConstants.HYSTRIX_INTERNAL_SERVICE_TYPE); recorder.recordApi(methodDescriptor); recorder.recordAttribute(HystrixPluginConstants.HYSTRIX_COMMAND_EXECUTION_ANNOTATION_KEY, getExecutionType()); recorder.recordException(throwable); } @Override protected AsyncTraceId getAsyncTraceId(Object target) { return super.getAsyncTraceId(getEnclosingInstance(target)); } protected abstract String getExecutionType(); protected Object getEnclosingInstance(Object target) { if (!(target instanceof EnclosingInstanceFieldGetter)) { if (isDebug) { logger.debug("Invalid target object. Need field accessor({}).", EnclosingInstanceFieldGetter.class.getName()); } return null; } else { return ((EnclosingInstanceFieldGetter) target)._$PINPOINT$_getEnclosingInstance(); } } }