提交 2ffb0ea4 编写于 作者: A ascrutae 提交者: gaohongtao

fix jetty plugin works incorrect

上级 3bb1b825
......@@ -21,6 +21,7 @@ package org.skywalking.apm.plugin.jetty.v9.server;
import java.lang.reflect.Method;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.server.HttpChannel;
import org.skywalking.apm.agent.core.context.CarrierItem;
import org.skywalking.apm.agent.core.context.ContextCarrier;
import org.skywalking.apm.agent.core.context.ContextManager;
......@@ -36,8 +37,8 @@ public class HandleInterceptor implements InstanceMethodsAroundInterceptor {
@Override
public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes,
MethodInterceptResult result) throws Throwable {
String requestURI = (String)allArguments[0];
HttpServletRequest servletRequest = (HttpServletRequest)allArguments[2];
HttpChannel httpChannel = (HttpChannel)allArguments[0];
HttpServletRequest servletRequest = httpChannel.getRequest();
ContextCarrier contextCarrier = new ContextCarrier();
......@@ -47,7 +48,7 @@ public class HandleInterceptor implements InstanceMethodsAroundInterceptor {
next.setHeadValue(servletRequest.getHeader(next.getHeadKey()));
}
AbstractSpan span = ContextManager.createEntrySpan(requestURI, contextCarrier);
AbstractSpan span = ContextManager.createEntrySpan(servletRequest.getRequestURI(), contextCarrier);
Tags.URL.set(span, servletRequest.getRequestURL().toString());
Tags.HTTP.METHOD.set(span, servletRequest.getMethod());
span.setComponent(ComponentsDefine.JETTY_SERVER);
......@@ -57,7 +58,8 @@ public class HandleInterceptor implements InstanceMethodsAroundInterceptor {
@Override
public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes,
Object ret) throws Throwable {
HttpServletResponse servletResponse = (HttpServletResponse)allArguments[3];
HttpChannel httpChannel = (HttpChannel)allArguments[0];
HttpServletResponse servletResponse = httpChannel.getResponse();
AbstractSpan span = ContextManager.activeSpan();
if (servletResponse.getStatus() >= 400) {
span.errorOccurred();
......
......@@ -26,17 +26,18 @@ import org.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMet
import org.skywalking.apm.agent.core.plugin.match.ClassMatch;
import static net.bytebuddy.matcher.ElementMatchers.named;
import static org.skywalking.apm.agent.core.plugin.bytebuddy.ArgumentTypeNameMatch.takesArgumentWithType;
import static org.skywalking.apm.agent.core.plugin.match.NameMatch.byName;
/**
* {@link HandlerListInstrumentation} enhance the <code>handle</code> method in <code>org.eclipse.jetty.server.handler.HandlerList</code>
* {@link JettyInstrumentation} enhance the <code>handle</code> method in <code>org.eclipse.jetty.server.handler.HandlerList</code>
* by <code>org.skywalking.apm.plugin.jetty.v9.server.HandleInterceptor</code>
*
* @author zhangxin
*/
public class HandlerListInstrumentation extends ClassInstanceMethodsEnhancePluginDefine {
public class JettyInstrumentation extends ClassInstanceMethodsEnhancePluginDefine {
private static final String ENHANCE_CLASS = "org.eclipse.jetty.server.handler.HandlerList";
private static final String ENHANCE_CLASS = "org.eclipse.jetty.server.Server";
private static final String ENHANCE_METHOD = "handle";
private static final String INTERCEPTOR_CLASS = "org.skywalking.apm.plugin.jetty.v9.server.HandleInterceptor";
......@@ -48,7 +49,7 @@ public class HandlerListInstrumentation extends ClassInstanceMethodsEnhancePlugi
return new InstanceMethodsInterceptPoint[] {
new InstanceMethodsInterceptPoint() {
@Override public ElementMatcher<MethodDescription> getMethodsMatcher() {
return named(ENHANCE_METHOD);
return named(ENHANCE_METHOD).and(takesArgumentWithType(0, "org.eclipse.jetty.server.HttpChannel"));
}
@Override public String getMethodsInterceptor() {
......
jetty-server-9.x=org.skywalking.apm.plugin.jetty.v9.server.define.HandlerListInstrumentation
jetty-server-9.x=org.skywalking.apm.plugin.jetty.v9.server.define.JettyInstrumentation
......@@ -19,9 +19,9 @@
package org.skywalking.apm.plugin.jetty.v9.server;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.server.HttpChannel;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Response;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
......@@ -58,7 +58,7 @@ import static org.skywalking.apm.agent.test.tools.SpanAssert.assertTag;
@PowerMockRunnerDelegate(TracingSegmentRunner.class)
public class HandleInterceptorTest {
private HandleInterceptor tomcatInvokeInterceptor;
private HandleInterceptor jettyInvokeInterceptor;
@SegmentStoragePoint
private SegmentStorage segmentStorage;
......@@ -66,36 +66,39 @@ public class HandleInterceptorTest {
public AgentServiceRule serviceRule = new AgentServiceRule();
@Mock
private HttpServletRequest request;
private Request request;
@Mock
private Request baseRequest;
@Mock
private HttpServletResponse response;
private Response response;
@Mock
private MethodInterceptResult methodInterceptResult;
@Mock
private EnhancedInstance enhancedInstance;
@Mock
private HttpChannel httpChannel;
private Object[] arguments;
private Class[] argumentType;
@Before
public void setUp() throws Exception {
tomcatInvokeInterceptor = new HandleInterceptor();
jettyInvokeInterceptor = new HandleInterceptor();
when(request.getRequestURI()).thenReturn("/test/testRequestURL");
when(request.getRequestURL()).thenReturn(new StringBuffer("http://localhost:8080/test/testRequestURL"));
when(response.getStatus()).thenReturn(200);
arguments = new Object[] {"/test/testRequestURL", baseRequest, request, response};
argumentType = new Class[] {String.class, baseRequest.getClass(), request.getClass(), response.getClass()};
when(httpChannel.getResponse()).thenReturn(response);
when(httpChannel.getRequest()).thenReturn(request);
arguments = new Object[] {httpChannel};
argumentType = new Class[] {httpChannel.getClass()};
}
@Test
public void testWithoutSerializedContextData() throws Throwable {
tomcatInvokeInterceptor.beforeMethod(enhancedInstance, null, arguments, argumentType, methodInterceptResult);
tomcatInvokeInterceptor.afterMethod(enhancedInstance, null, arguments, argumentType, null);
jettyInvokeInterceptor.beforeMethod(enhancedInstance, null, arguments, argumentType, methodInterceptResult);
jettyInvokeInterceptor.afterMethod(enhancedInstance, null, arguments, argumentType, null);
assertThat(segmentStorage.getTraceSegments().size(), is(1));
TraceSegment traceSegment = segmentStorage.getTraceSegments().get(0);
......@@ -107,8 +110,8 @@ public class HandleInterceptorTest {
public void testWithSerializedContextData() throws Throwable {
when(request.getHeader(SW3CarrierItem.HEADER_NAME)).thenReturn("1.234.111|3|1|1|#192.168.1.8:18002|#/portal/|#/testEntrySpan|#AQA*#AQA*Et0We0tQNQA*");
tomcatInvokeInterceptor.beforeMethod(enhancedInstance, null, arguments, argumentType, methodInterceptResult);
tomcatInvokeInterceptor.afterMethod(enhancedInstance, null, arguments, argumentType, null);
jettyInvokeInterceptor.beforeMethod(enhancedInstance, null, arguments, argumentType, methodInterceptResult);
jettyInvokeInterceptor.afterMethod(enhancedInstance, null, arguments, argumentType, null);
assertThat(segmentStorage.getTraceSegments().size(), is(1));
TraceSegment traceSegment = segmentStorage.getTraceSegments().get(0);
......@@ -120,9 +123,9 @@ public class HandleInterceptorTest {
@Test
public void testWithOccurException() throws Throwable {
tomcatInvokeInterceptor.beforeMethod(enhancedInstance, null, arguments, argumentType, methodInterceptResult);
tomcatInvokeInterceptor.handleMethodException(enhancedInstance, null, arguments, argumentType, new RuntimeException());
tomcatInvokeInterceptor.afterMethod(enhancedInstance, null, arguments, argumentType, null);
jettyInvokeInterceptor.beforeMethod(enhancedInstance, null, arguments, argumentType, methodInterceptResult);
jettyInvokeInterceptor.handleMethodException(enhancedInstance, null, arguments, argumentType, new RuntimeException());
jettyInvokeInterceptor.afterMethod(enhancedInstance, null, arguments, argumentType, null);
assertThat(segmentStorage.getTraceSegments().size(), is(1));
TraceSegment traceSegment = segmentStorage.getTraceSegments().get(0);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册