From 4dd76f06b56be3417996c7868cf1ee62bf9d19e7 Mon Sep 17 00:00:00 2001 From: ascrutae Date: Thu, 27 Apr 2017 15:49:26 +0800 Subject: [PATCH 1/3] Fix redis plugin don't work issue --- .../assist/NoConcurrencyAccessObject.java | 23 +++++--- .../jedis/v2/JedisMethodInterceptor.java | 56 +++++++++---------- 2 files changed, 43 insertions(+), 36 deletions(-) diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/interceptor/assist/NoConcurrencyAccessObject.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/interceptor/assist/NoConcurrencyAccessObject.java index 47a3d8857b3f..77b6128c05b5 100644 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/interceptor/assist/NoConcurrencyAccessObject.java +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/interceptor/assist/NoConcurrencyAccessObject.java @@ -2,32 +2,35 @@ import com.a.eye.skywalking.api.plugin.interceptor.EnhancedClassInstanceContext; import com.a.eye.skywalking.api.plugin.interceptor.InterceptorException; +import com.a.eye.skywalking.api.plugin.interceptor.enhance.InstanceMethodInvokeContext; /** * {@link NoConcurrencyAccessObject} is method invocation counter, - * when {@link #whenEnter(EnhancedClassInstanceContext, Runnable)}, counter + 1; - * and when {@link #whenExist(EnhancedClassInstanceContext, Runnable)}, counter -1; + * when {@link #whenEnter(EnhancedClassInstanceContext, InstanceMethodInvokeContext)} , counter + 1; + * and when {@link #whenExist(EnhancedClassInstanceContext)} , counter -1; * - * When, and only when, the first enter and last exist, also meaning first access, the Runnable is called. + * When, and only when, the first enter and last exist, also meaning first access, + * the {@link #enter(EnhancedClassInstanceContext, InstanceMethodInvokeContext)} + * and {@link #exit()} are called. * * @author wusheng */ -public class NoConcurrencyAccessObject { +public abstract class NoConcurrencyAccessObject { private static final String INVOKE_COUNTER_KEY = "__$invokeCounterKey"; - public void whenEnter(EnhancedClassInstanceContext context, Runnable runnable) { + public void whenEnter(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext) { if (!context.isContain(INVOKE_COUNTER_KEY)) { context.set(INVOKE_COUNTER_KEY, 0); } int counter = context.get(INVOKE_COUNTER_KEY, Integer.class); if (++counter == 1) { - runnable.run(); + enter(context, interceptorContext); } context.set(INVOKE_COUNTER_KEY, counter); } - public void whenExist(EnhancedClassInstanceContext context, Runnable runnable) { + public void whenExist(EnhancedClassInstanceContext context) { if (!context.isContain(INVOKE_COUNTER_KEY)) { throw new InterceptorException( "key=INVOKE_COUNTER_KEY not found is context. unexpected situation."); @@ -35,8 +38,12 @@ public void whenExist(EnhancedClassInstanceContext context, Runnable runnable) { int counter = context.get(INVOKE_COUNTER_KEY, Integer.class); if (--counter == 0) { - runnable.run(); + exit(); } context.set(INVOKE_COUNTER_KEY, counter); } + + protected abstract void enter(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext); + + protected abstract void exit(); } diff --git a/skywalking-sniffer/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/a/eye/skywalking/plugin/jedis/v2/JedisMethodInterceptor.java b/skywalking-sniffer/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/a/eye/skywalking/plugin/jedis/v2/JedisMethodInterceptor.java index b7f401280f5c..9eca1fc1a919 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/a/eye/skywalking/plugin/jedis/v2/JedisMethodInterceptor.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/a/eye/skywalking/plugin/jedis/v2/JedisMethodInterceptor.java @@ -44,28 +44,7 @@ public class JedisMethodInterceptor extends NoConcurrencyAccessObject implements @Override public void beforeMethod(final EnhancedClassInstanceContext context, final InstanceMethodInvokeContext interceptorContext, MethodInterceptResult result) { - this.whenEnter(context, new Runnable() { - @Override - public void run() { - Span span = ContextManager.createSpan("Jedis/" + interceptorContext.methodName()); - Tags.COMPONENT.set(span, REDIS_COMPONENT); - Tags.DB_TYPE.set(span, REDIS_COMPONENT); - Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_CLIENT); - tagPeer(span, context); - Tags.SPAN_LAYER.asDB(span); - if (StringUtil.isEmpty(context.get(KEY_OF_REDIS_HOST, String.class))) { - Tags.PEERS.set(span, String.valueOf(context.get(KEY_OF_REDIS_HOSTS))); - } else { - Tags.PEER_HOST.set(span, context.get(KEY_OF_REDIS_HOST, String.class)); - Tags.PEER_PORT.set(span, (Integer)context.get(KEY_OF_REDIS_PORT)); - } - - if (interceptorContext.allArguments().length > 0 - && interceptorContext.allArguments()[0] instanceof String) { - Tags.DB_STATEMENT.set(span, interceptorContext.methodName() + " " + interceptorContext.allArguments()[0]); - } - } - }); + this.whenEnter(context, interceptorContext); } /** @@ -84,12 +63,7 @@ private void tagPeer(Span span, EnhancedClassInstanceContext context) { @Override public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, Object ret) { - this.whenExist(context, new Runnable() { - @Override - public void run() { - ContextManager.stopSpan(); - } - }); + this.whenExist(context); return ret; } @@ -98,4 +72,30 @@ public void handleMethodException(Throwable t, EnhancedClassInstanceContext cont InstanceMethodInvokeContext interceptorContext) { ContextManager.activeSpan().log(t); } + + @Override + protected void enter(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext) { + Span span = ContextManager.createSpan("Jedis/" + interceptorContext.methodName()); + Tags.COMPONENT.set(span, REDIS_COMPONENT); + Tags.DB_TYPE.set(span, REDIS_COMPONENT); + Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_CLIENT); + tagPeer(span, context); + Tags.SPAN_LAYER.asDB(span); + if (StringUtil.isEmpty(context.get(KEY_OF_REDIS_HOST, String.class))) { + Tags.PEERS.set(span, String.valueOf(context.get(KEY_OF_REDIS_HOSTS))); + } else { + Tags.PEER_HOST.set(span, context.get(KEY_OF_REDIS_HOST, String.class)); + Tags.PEER_PORT.set(span, (Integer)context.get(KEY_OF_REDIS_PORT)); + } + + if (interceptorContext.allArguments().length > 0 + && interceptorContext.allArguments()[0] instanceof String) { + Tags.DB_STATEMENT.set(span, interceptorContext.methodName() + " " + interceptorContext.allArguments()[0]); + } + } + + @Override + protected void exit() { + ContextManager.stopSpan(); + } } From 24010d134b9d01fffc9d596ea213c1b79cbc8619 Mon Sep 17 00:00:00 2001 From: ascrutae Date: Thu, 27 Apr 2017 16:28:45 +0800 Subject: [PATCH 2/3] fix issue that test compile failed --- .../assist/NoConcurrencyAccessObjectTest.java | 46 ++++++++++++------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/plugin/assist/NoConcurrencyAccessObjectTest.java b/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/plugin/assist/NoConcurrencyAccessObjectTest.java index fcd83db592a7..91f2bc3efe26 100644 --- a/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/plugin/assist/NoConcurrencyAccessObjectTest.java +++ b/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/plugin/assist/NoConcurrencyAccessObjectTest.java @@ -2,41 +2,53 @@ import com.a.eye.skywalking.api.plugin.interceptor.EnhancedClassInstanceContext; import com.a.eye.skywalking.api.plugin.interceptor.assist.NoConcurrencyAccessObject; +import com.a.eye.skywalking.api.plugin.interceptor.enhance.InstanceMethodInvokeContext; import org.junit.Assert; import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; /** * @author wusheng */ +@RunWith(MockitoJUnitRunner.class) public class NoConcurrencyAccessObjectTest { + + @Mock + private InstanceMethodInvokeContext invokeContext; + @Test public void testEntraExitCounter() { - NoConcurrencyAccessObject object = new NoConcurrencyAccessObject(); final EnhancedClassInstanceContext context = new EnhancedClassInstanceContext(); - object.whenEnter(context, new Runnable() { + NoConcurrencyAccessObject first = new NoConcurrencyAccessObject(){ + @Override - public void run() { + protected void enter(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext) { context.set("firstEntrance", true); } - }); - object.whenEnter(context, new Runnable() { - @Override - public void run() { - context.set("secondEntrance", true); - } - }); - object.whenExist(context, new Runnable() { - @Override - public void run() { + + @Override protected void exit() { context.set("firstExit", true); } - }); - object.whenExist(context, new Runnable() { + }; + + NoConcurrencyAccessObject second = new NoConcurrencyAccessObject(){ + @Override - public void run() { + protected void enter(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext) { + context.set("secondEntrance", true); + } + + @Override protected void exit() { context.set("lastEntrance", true); } - }); + }; + + first.whenEnter(context, invokeContext); + second.whenEnter(context, invokeContext); + first.whenExist(context); + second.whenExist(context); Assert.assertTrue(!context.isContain("secondEntrance")); Assert.assertTrue(!context.isContain("firstExit")); From 73401d1077bd69ac34f15b4945b157e7eb8f1a6f Mon Sep 17 00:00:00 2001 From: ascrutae Date: Thu, 27 Apr 2017 16:58:24 +0800 Subject: [PATCH 3/3] fix ci failed issue --- .../collector/worker/httpserver/AbstractPostTestCase.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/httpserver/AbstractPostTestCase.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/httpserver/AbstractPostTestCase.java index 3c0bf7af8333..3e0ac3c485c5 100644 --- a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/httpserver/AbstractPostTestCase.java +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/httpserver/AbstractPostTestCase.java @@ -26,8 +26,8 @@ public class AbstractPostTestCase { @Before public void init() { - ClusterWorkerContext clusterWorkerContext = mock(ClusterWorkerContext.class); - LocalWorkerContext localWorkerContext = mock(LocalWorkerContext.class); + ClusterWorkerContext clusterWorkerContext = PowerMockito.mock(ClusterWorkerContext.class); + LocalWorkerContext localWorkerContext = PowerMockito.mock(LocalWorkerContext.class); post = spy(new TestAbstractPost(TestAbstractPost.WorkerRole.INSTANCE, clusterWorkerContext, localWorkerContext)); }