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 3c0bf7af8333948704148f539dc71fb8ec17d714..3e0ac3c485c56278472360b8c6c43de18848b6d0 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)); } 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 47a3d8857b3fdbbbe59b49794c27917a08c8915d..77b6128c05b5cfe4af95e092abad900b581c60fb 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 @@ package com.a.eye.skywalking.api.plugin.interceptor.assist; 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 class NoConcurrencyAccessObject { 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-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 fcd83db592a77ad82152fbf4875bb01edde81d8f..91f2bc3efe26e90593bfdc19efd146c745240b63 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 @@ package com.a.eye.skywalking.api.plugin.assist; 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")); 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 b7f401280f5c3c2b3ec74b1aeaaf3e7f86af0614..9eca1fc1a9193ff06ab5d6d1e52e16ec7367ad9e 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 @@ public class JedisMethodInterceptor extends NoConcurrencyAccessObject implements @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 class JedisMethodInterceptor extends NoConcurrencyAccessObject implements 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(); + } }