fix issue

This commit is contained in:
ascrutae 2017-03-04 23:12:55 +08:00
parent d1f320a0e8
commit 8c5b1e8cb8
10 changed files with 57 additions and 180 deletions

View File

@ -54,11 +54,11 @@ public class DubboInterceptor implements InstanceMethodsAroundInterceptor {
Span span = ContextManager.INSTANCE.createSpan(generateOperationName(requestURL, invocation));
Tags.URL.set(span, generateRequestURL(requestURL, invocation));
Tags.COMPONENT.set(span, DUBBO_COMPONENT);
Tags.PEER_HOST.set(span, requestURL.getHost());
Tags.PEER_PORT.set(span, requestURL.getPort());
Tags.SPAN_LAYER.asRPCFramework(span);
if (isConsumer) {
Tags.PEER_HOST.set(span, requestURL.getHost());
Tags.PEER_PORT.set(span, requestURL.getPort());
Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_CLIENT);
ContextCarrier contextCarrier = new ContextCarrier();
ContextManager.INSTANCE.inject(contextCarrier);

View File

@ -24,7 +24,7 @@ import org.apache.http.StatusLine;
*/
public class HttpClientExecuteInterceptor implements InstanceMethodsAroundInterceptor {
public static final String HEADER_NAME_OF_CONTEXT_DATA = "SWTraceContext";
private static final String COMPONENT_NAME = "Http";
private static final String COMPONENT_NAME = "HttpClient";
@Override
public void beforeMethod(EnhancedClassInstanceContext context,
@ -56,7 +56,7 @@ public class HttpClientExecuteInterceptor implements InstanceMethodsAroundInterc
* @return request URL
*/
private String generateURL(HttpHost httpHost, HttpRequest httpRequest) {
return httpHost.getSchemeName() + "://" + httpHost.getHostName() + ":" + httpHost.getPort() + httpRequest.getRequestLine().getUri();
return httpRequest.getRequestLine().getUri();
}
@Override

View File

@ -1,40 +0,0 @@
package com.a.eye.skywalking.plugin.motan;
import com.a.eye.skywalking.api.plugin.interceptor.EnhancedClassInstanceContext;
import com.a.eye.skywalking.api.plugin.interceptor.enhance.InstanceMethodInvokeContext;
import com.a.eye.skywalking.api.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor;
import com.a.eye.skywalking.api.plugin.interceptor.enhance.MethodInterceptResult;
/**
* {@link MotanConsumerFetchRequestURLInterceptor} record {@link com.weibo.api.motan.rpc.URL} to {@link EnhancedClassInstanceContext#context}
* for the operation name that create span need.
*
* @author zhangxin
*/
public class MotanConsumerFetchRequestURLInterceptor implements InstanceMethodsAroundInterceptor {
private static final String CONTEXT_NAME_OF_REQUEST_URL = "REQUEST_URL";
/**
* Fetch the request url from the first param of all constructor, and put request
* url into {@link EnhancedClassInstanceContext#context}.
*
* @param context instance context, a class instance only has one {@link EnhancedClassInstanceContext} instance.
* @param interceptorContext method context, includes class name, method name, etc.
* @param result change this result, if you want to truncate the method.
*/
@Override
public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, MethodInterceptResult result) {
context.set(CONTEXT_NAME_OF_REQUEST_URL, interceptorContext.allArguments()[0]);
}
@Override
public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, Object ret) {
return ret;
}
@Override
public void handleMethodException(Throwable t, EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext) {
// do nothing
}
}

View File

@ -3,6 +3,8 @@ package com.a.eye.skywalking.plugin.motan;
import com.a.eye.skywalking.api.context.ContextCarrier;
import com.a.eye.skywalking.api.context.ContextManager;
import com.a.eye.skywalking.api.plugin.interceptor.EnhancedClassInstanceContext;
import com.a.eye.skywalking.api.plugin.interceptor.enhance.ConstructorInvokeContext;
import com.a.eye.skywalking.api.plugin.interceptor.enhance.InstanceConstructorInterceptor;
import com.a.eye.skywalking.api.plugin.interceptor.enhance.InstanceMethodInvokeContext;
import com.a.eye.skywalking.api.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor;
import com.a.eye.skywalking.api.plugin.interceptor.enhance.MethodInterceptResult;
@ -13,37 +15,41 @@ import com.weibo.api.motan.rpc.Response;
import com.weibo.api.motan.rpc.URL;
/**
* {@link MotanConsumerInvokeInterceptor} create span by fetch request url from
* {@link EnhancedClassInstanceContext#context} and transport serialized context
* data to provider side through {@link Request#setAttachment(String, String)}.
* Current trace segment will ref the trace segment from previous level if the serialized context data that fetch
* from {@link Request#getAttachments()} is not null.
*
* {@link MotanConsumerInterceptor} intercept all constructor of {@link com.weibo.api.motan.rpc.AbstractProvider} for record
* the request url from consumer side.
*
* @author zhangxin
*/
public class MotanConsumerInvokeInterceptor implements InstanceMethodsAroundInterceptor {
public class MotanConsumerInterceptor implements InstanceConstructorInterceptor, InstanceMethodsAroundInterceptor {
/**
* Context name of request url in {@link EnhancedClassInstanceContext#context}.
* The
*/
private static final String CONTEXT_NAME_OF_REQUEST_URL = "REQUEST_URL";
private static final String KEY_NAME_OF_REQUEST_URL = "REQUEST_URL";
/**
* Attachment key of the serialized context data.
* The {@link Request#getAttachments()} key. It maps to the serialized {@link ContextCarrier}.
*/
private static final String ATTACHMENT_KEY_OF_CONTEXT_DATA = "SWTraceContext";
/**
* Motan component
*/
private static final String MOTAN_COMPONENT = "Motan";
@Override
public void onConstruct(EnhancedClassInstanceContext context, ConstructorInvokeContext interceptorContext) {
context.set(KEY_NAME_OF_REQUEST_URL, interceptorContext.allArguments()[1]);
}
@Override
public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext,
MethodInterceptResult result) {
URL url = (URL) context.get(CONTEXT_NAME_OF_REQUEST_URL);
URL url = (URL) context.get(KEY_NAME_OF_REQUEST_URL);
com.weibo.api.motan.rpc.Request request = (com.weibo.api.motan.rpc.Request) interceptorContext.allArguments()[0];
if (url != null) {
Request request = (Request) interceptorContext.allArguments()[0];
Span span = ContextManager.INSTANCE.createSpan(generateOperationName(url, request));
Tags.PEER_HOST.set(span, url.getHost());
Tags.PEER_PORT.set(span, url.getPort());
@ -64,10 +70,9 @@ public class MotanConsumerInvokeInterceptor implements InstanceMethodsAroundInte
Response response = (Response) ret;
if (response != null && response.getException() != null) {
Span span = ContextManager.INSTANCE.activeSpan();
span.log(response.getException());
Tags.ERROR.set(span, true);
span.log(response.getException());
}
ContextManager.INSTANCE.stopSpan();
return ret;
}
@ -79,6 +84,8 @@ public class MotanConsumerInvokeInterceptor implements InstanceMethodsAroundInte
}
/**
* Generate operation name.
*

View File

@ -3,8 +3,6 @@ package com.a.eye.skywalking.plugin.motan;
import com.a.eye.skywalking.api.context.ContextCarrier;
import com.a.eye.skywalking.api.context.ContextManager;
import com.a.eye.skywalking.api.plugin.interceptor.EnhancedClassInstanceContext;
import com.a.eye.skywalking.api.plugin.interceptor.enhance.ConstructorInvokeContext;
import com.a.eye.skywalking.api.plugin.interceptor.enhance.InstanceConstructorInterceptor;
import com.a.eye.skywalking.api.plugin.interceptor.enhance.InstanceMethodInvokeContext;
import com.a.eye.skywalking.api.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor;
import com.a.eye.skywalking.api.plugin.interceptor.enhance.MethodInterceptResult;
@ -13,56 +11,43 @@ import com.a.eye.skywalking.trace.Span;
import com.a.eye.skywalking.trace.tag.Tags;
import com.weibo.api.motan.rpc.Request;
import com.weibo.api.motan.rpc.Response;
import com.weibo.api.motan.rpc.URL;
/**
* Current trace segment will ref the trace segment from previous level if the serialized context data that fetch
* from {@link Request#getAttachments()} is not null.
*
* {@link MotanProviderInterceptor} intercept all constructor of {@link com.weibo.api.motan.rpc.AbstractProvider} for record
* the request url from consumer side.
* {@link MotanProviderInterceptor} create span by fetch request url from
* {@link EnhancedClassInstanceContext#context} and transport serialized context
* data to provider side through {@link Request#setAttachment(String, String)}.
*
* @author zhangxin
*/
public class MotanProviderInterceptor implements InstanceConstructorInterceptor, InstanceMethodsAroundInterceptor {
public class MotanProviderInterceptor implements InstanceMethodsAroundInterceptor {
/**
* The
* Context name of request url in {@link EnhancedClassInstanceContext#context}.
*/
private static final String KEY_NAME_OF_REQUEST_URL = "REQUEST_URL";
private static final String CONTEXT_NAME_OF_REQUEST_URL = "REQUEST_URL";
/**
* The {@link Request#getAttachments()} key. It maps to the serialized {@link ContextCarrier}.
* Attachment key of the serialized context data.
*/
private static final String ATTACHMENT_KEY_OF_CONTEXT_DATA = "SWTraceContext";
/**
* Motan component
*/
private static final String MOTAN_COMPONENT = "Motan";
@Override
public void onConstruct(EnhancedClassInstanceContext context, ConstructorInvokeContext interceptorContext) {
context.set(KEY_NAME_OF_REQUEST_URL, interceptorContext.allArguments()[0]);
}
@Override
public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext,
MethodInterceptResult result) {
URL url = (URL) context.get(KEY_NAME_OF_REQUEST_URL);
if (url != null) {
com.weibo.api.motan.rpc.Request request = (com.weibo.api.motan.rpc.Request) interceptorContext.allArguments()[0];
Span span = ContextManager.INSTANCE.createSpan(generateViewPoint(request));
Tags.COMPONENT.set(span, MOTAN_COMPONENT);
Tags.URL.set(span, url.getIdentity());
Tags.PEER_PORT.set(span, url.getPort());
Tags.PEER_HOST.set(span, url.getHost());
Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_SERVER);
Tags.SPAN_LAYER.asRPCFramework(span);
Request request = (Request) interceptorContext.allArguments()[0];
Span span = ContextManager.INSTANCE.createSpan(generateViewPoint(request));
Tags.COMPONENT.set(span, MOTAN_COMPONENT);
Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_SERVER);
Tags.SPAN_LAYER.asRPCFramework(span);
String serializedContextData = request.getAttachments().get(ATTACHMENT_KEY_OF_CONTEXT_DATA);
if (!StringUtil.isEmpty(serializedContextData)) {
ContextManager.INSTANCE.extract(new ContextCarrier().deserialize(serializedContextData));
}
String serializedContextData = request.getAttachments().get(ATTACHMENT_KEY_OF_CONTEXT_DATA);
if (!StringUtil.isEmpty(serializedContextData)) {
ContextManager.INSTANCE.extract(new ContextCarrier().deserialize(serializedContextData));
}
}
@ -72,9 +57,10 @@ public class MotanProviderInterceptor implements InstanceConstructorInterceptor,
Response response = (Response) ret;
if (response != null && response.getException() != null) {
Span span = ContextManager.INSTANCE.activeSpan();
Tags.ERROR.set(span, true);
span.log(response.getException());
Tags.ERROR.set(span, true);
}
ContextManager.INSTANCE.stopSpan();
return ret;
}
@ -92,5 +78,4 @@ public class MotanProviderInterceptor implements InstanceConstructorInterceptor,
viewPoint.append("(" + request.getParamtersDesc() + ")");
return viewPoint.toString();
}
}

View File

@ -3,8 +3,7 @@ package com.a.eye.skywalking.plugin.motan.define;
import com.a.eye.skywalking.api.plugin.interceptor.ConstructorInterceptPoint;
import com.a.eye.skywalking.api.plugin.interceptor.InstanceMethodsInterceptPoint;
import com.a.eye.skywalking.api.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine;
import com.a.eye.skywalking.plugin.motan.MotanConsumerFetchRequestURLInterceptor;
import com.a.eye.skywalking.plugin.motan.MotanConsumerInvokeInterceptor;
import com.a.eye.skywalking.plugin.motan.MotanProviderInterceptor;
import com.weibo.api.motan.rpc.Request;
import com.weibo.api.motan.rpc.URL;
@ -15,19 +14,17 @@ import static net.bytebuddy.matcher.ElementMatchers.named;
/**
* {@link MotanConsumerInstrumentation} presents that skywalking intercept
* {@link com.weibo.api.motan.cluster.support.ClusterSpi#call(Request)} by using {@link MotanConsumerInvokeInterceptor} and
* intercept {@link com.weibo.api.motan.cluster.support.ClusterSpi#setUrl(URL)} by using
* {@link MotanConsumerFetchRequestURLInterceptor} to intercept{@link MotanConsumerFetchRequestURLInterceptor}.
* {@link com.weibo.api.motan.cluster.support.ClusterSpi#call(Request)} by using {@link MotanProviderInterceptor}.
*
* @author zhangxin
*/
public class MotanConsumerInstrumentation extends ClassInstanceMethodsEnhancePluginDefine {
private static final String ENHANCE_CLASS = "com.weibo.api.motan.cluster.support.ClusterSpi";
private static final String ENHANCE_CLASS = "com.weibo.api.motan.transport.ProviderMessageRouter";
private static final String FETCH_REQUEST_URL_INTERCEPT_CLASS = "com.a.eye.skywalking.plugin.motan.MotanConsumerFetchRequestURLInterceptor";
// private static final String FETCH_REQUEST_URL_INTERCEPT_CLASS = "com.a.eye.skywalking.plugin.motan.MotanConsumerFetchRequestURLInterceptor";
private static final String INVOKE_INTERCEPT_CLASS = "com.a.eye.skywalking.plugin.motan.MotanConsumerInvokeInterceptor";
private static final String INVOKE_INTERCEPT_CLASS = "com.a.eye.skywalking.plugin.motan.MotanProviderInterceptor";
@Override
protected String enhanceClassName() {
@ -42,16 +39,6 @@ public class MotanConsumerInstrumentation extends ClassInstanceMethodsEnhancePlu
@Override
protected InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() {
return new InstanceMethodsInterceptPoint[]{new InstanceMethodsInterceptPoint() {
@Override
public ElementMatcher<MethodDescription> getMethodsMatcher() {
return named("setUrl");
}
@Override
public String getMethodsInterceptor() {
return FETCH_REQUEST_URL_INTERCEPT_CLASS;
}
}, new InstanceMethodsInterceptPoint() {
@Override
public ElementMatcher<MethodDescription> getMethodsMatcher() {
return named("call");

View File

@ -3,7 +3,7 @@ package com.a.eye.skywalking.plugin.motan.define;
import com.a.eye.skywalking.api.plugin.interceptor.ConstructorInterceptPoint;
import com.a.eye.skywalking.api.plugin.interceptor.InstanceMethodsInterceptPoint;
import com.a.eye.skywalking.api.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine;
import com.a.eye.skywalking.plugin.motan.MotanProviderInterceptor;
import com.a.eye.skywalking.plugin.motan.MotanConsumerInterceptor;
import com.weibo.api.motan.rpc.Request;
import net.bytebuddy.description.method.MethodDescription;
@ -14,7 +14,7 @@ import static net.bytebuddy.matcher.ElementMatchers.named;
/**
* {@link MotanProviderInstrumentation} presents that skywalking will use
* {@link MotanProviderInterceptor} to intercept
* {@link MotanConsumerInterceptor} to intercept
* all constructor of {@link com.weibo.api.motan.rpc.AbstractProvider} and
* {@link com.weibo.api.motan.rpc.AbstractProvider#call(Request)}.
*
@ -25,15 +25,15 @@ public class MotanProviderInstrumentation extends ClassInstanceMethodsEnhancePlu
/**
* Enhance class.
*/
private static final String ENHANCE_CLASS = "com.weibo.api.motan.rpc.AbstractProvider";
private static final String ENHANCE_CLASS = "com.weibo.api.motan.rpc.AbstractReferer";
/**
* Class that intercept all constructor of ${@link com.weibo.api.motan.rpc.AbstractProvider}.
*/
private static final String CONSTRUCTOR_INTERCEPT_CLASS = "com.a.eye.skywalking.plugin.motan.MotanProviderInterceptor";
private static final String CONSTRUCTOR_INTERCEPT_CLASS = "com.a.eye.skywalking.plugin.motan.MotanConsumerInterceptor";
/**
* Class that intercept {@link com.weibo.api.motan.rpc.AbstractProvider#call(Request)}.
*/
private static final String PROVIDER_INVOKE_INTERCEPT_CLASS = "com.a.eye.skywalking.plugin.motan.MotanProviderInterceptor";
private static final String PROVIDER_INVOKE_INTERCEPT_CLASS = "com.a.eye.skywalking.plugin.motan.MotanConsumerInterceptor";
@Override
protected String enhanceClassName() {

View File

@ -1,54 +0,0 @@
package com.a.eye.skywalking.plugin.motan;
import com.a.eye.skywalking.api.plugin.interceptor.EnhancedClassInstanceContext;
import com.a.eye.skywalking.api.plugin.interceptor.enhance.InstanceMethodInvokeContext;
import com.weibo.api.motan.rpc.URL;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Matchers;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class MotanConsumerFetchRequestURLInterceptorTest {
private MotanConsumerFetchRequestURLInterceptor requestURLInterceptor;
@Mock
private EnhancedClassInstanceContext instanceContext;
@Mock
private InstanceMethodInvokeContext interceptorContext;
private URL url;
@Before
public void setUp() {
requestURLInterceptor = new MotanConsumerFetchRequestURLInterceptor();
url = URL.valueOf("motan://127.0.0.0.1:34000/com.a.eye.skywalking.test.TestService");
when(interceptorContext.allArguments()).thenReturn(new Object[]{url});
}
@Test
public void testFetchRequestURL() {
requestURLInterceptor.beforeMethod(instanceContext, interceptorContext, null);
requestURLInterceptor.afterMethod(instanceContext, interceptorContext, null);
verify(instanceContext, times(1)).set(Matchers.any(), Matchers.any());
}
@Test
public void testFetchRequestURLWithException(){
requestURLInterceptor.beforeMethod(instanceContext, interceptorContext, null);
requestURLInterceptor.handleMethodException(new RuntimeException(), instanceContext, interceptorContext);
requestURLInterceptor.afterMethod(instanceContext, interceptorContext, null);
verify(instanceContext, times(1)).set(Matchers.any(), Matchers.any());
}
}

View File

@ -3,6 +3,7 @@ package com.a.eye.skywalking.plugin.motan;
import com.a.eye.skywalking.api.context.TracerContext;
import com.a.eye.skywalking.api.plugin.interceptor.EnhancedClassInstanceContext;
import com.a.eye.skywalking.api.plugin.interceptor.enhance.InstanceMethodInvokeContext;
import com.a.eye.skywalking.plugin.motan.define.MotanConsumerInstrumentation;
import com.a.eye.skywalking.sniffer.mock.context.MockTracerContextListener;
import com.a.eye.skywalking.sniffer.mock.context.SegmentAssert;
import com.a.eye.skywalking.trace.LogData;
@ -32,11 +33,11 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class MotanConsumerInvokeInterceptorTest {
public class MotanConsumerInterceptorTest {
private MockTracerContextListener contextListener;
private MotanConsumerInvokeInterceptor invokeInterceptor;
private MotanConsumerInterceptor invokeInterceptor;
@Mock
private EnhancedClassInstanceContext instanceContext;
@Mock
@ -51,7 +52,7 @@ public class MotanConsumerInvokeInterceptorTest {
@Before
public void setUp() {
contextListener = new MockTracerContextListener();
invokeInterceptor = new MotanConsumerInvokeInterceptor();
invokeInterceptor = new MotanConsumerInterceptor();
url = URL.valueOf("motan://127.0.0.1:34000/com.a.eye.skywalking.test.TestService");
TracerContext.ListenerManager.add(contextListener);

View File

@ -71,12 +71,6 @@ public class MotanProviderInterceptorTest {
when(constructorInvokeContext.allArguments()).thenReturn(new Object[]{url});
}
@Test
public void testFetchRequestURL() {
invokeInterceptor.onConstruct(instanceContext, constructorInvokeContext);
verify(instanceContext, times(1)).set(Matchers.any(), Matchers.any());
}
@Test
public void testInvokerWithoutRefSegment() {
invokeInterceptor.beforeMethod(instanceContext, interceptorContext, null);
@ -170,10 +164,7 @@ public class MotanProviderInterceptorTest {
assertThat(span.getOperationName(), is("com.a.eye.skywalking.test.TestService.test(java.lang.String, java.lang.Object)"));
assertThat(Tags.COMPONENT.get(span), is("Motan"));
assertThat(Tags.SPAN_KIND.get(span), is(Tags.SPAN_KIND_SERVER));
assertThat(Tags.PEER_HOST.get(span), is("127.0.0.1"));
assertThat(Tags.PEER_PORT.get(span), is(34000));
assertTrue(Tags.SPAN_LAYER.isRPCFramework(span));
assertThat(Tags.URL.get(span), is("motan://127.0.0.1:34000/default_rpc/com.a.eye.skywalking.test.TestService/1.0/service"));
}