提交 30b79503 编写于 作者: wu-sheng's avatar wu-sheng 提交者: GitHub

Merge pull request #178 from ascrutae/zhangxin/fix/150

Redis plugin cannot work on tomcat
...@@ -26,8 +26,8 @@ public class AbstractPostTestCase { ...@@ -26,8 +26,8 @@ public class AbstractPostTestCase {
@Before @Before
public void init() { public void init() {
ClusterWorkerContext clusterWorkerContext = mock(ClusterWorkerContext.class); ClusterWorkerContext clusterWorkerContext = PowerMockito.mock(ClusterWorkerContext.class);
LocalWorkerContext localWorkerContext = mock(LocalWorkerContext.class); LocalWorkerContext localWorkerContext = PowerMockito.mock(LocalWorkerContext.class);
post = spy(new TestAbstractPost(TestAbstractPost.WorkerRole.INSTANCE, clusterWorkerContext, localWorkerContext)); post = spy(new TestAbstractPost(TestAbstractPost.WorkerRole.INSTANCE, clusterWorkerContext, localWorkerContext));
} }
......
...@@ -2,32 +2,35 @@ package com.a.eye.skywalking.api.plugin.interceptor.assist; ...@@ -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.EnhancedClassInstanceContext;
import com.a.eye.skywalking.api.plugin.interceptor.InterceptorException; 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, * {@link NoConcurrencyAccessObject} is method invocation counter,
* when {@link #whenEnter(EnhancedClassInstanceContext, Runnable)}, counter + 1; * when {@link #whenEnter(EnhancedClassInstanceContext, InstanceMethodInvokeContext)} , counter + 1;
* and when {@link #whenExist(EnhancedClassInstanceContext, Runnable)}, 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 * @author wusheng
*/ */
public class NoConcurrencyAccessObject { public abstract class NoConcurrencyAccessObject {
private static final String INVOKE_COUNTER_KEY = "__$invokeCounterKey"; 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)) { if (!context.isContain(INVOKE_COUNTER_KEY)) {
context.set(INVOKE_COUNTER_KEY, 0); context.set(INVOKE_COUNTER_KEY, 0);
} }
int counter = context.get(INVOKE_COUNTER_KEY, int counter = context.get(INVOKE_COUNTER_KEY,
Integer.class); Integer.class);
if (++counter == 1) { if (++counter == 1) {
runnable.run(); enter(context, interceptorContext);
} }
context.set(INVOKE_COUNTER_KEY, counter); context.set(INVOKE_COUNTER_KEY, counter);
} }
public void whenExist(EnhancedClassInstanceContext context, Runnable runnable) { public void whenExist(EnhancedClassInstanceContext context) {
if (!context.isContain(INVOKE_COUNTER_KEY)) { if (!context.isContain(INVOKE_COUNTER_KEY)) {
throw new InterceptorException( throw new InterceptorException(
"key=INVOKE_COUNTER_KEY not found is context. unexpected situation."); "key=INVOKE_COUNTER_KEY not found is context. unexpected situation.");
...@@ -35,8 +38,12 @@ public class NoConcurrencyAccessObject { ...@@ -35,8 +38,12 @@ public class NoConcurrencyAccessObject {
int counter = context.get(INVOKE_COUNTER_KEY, int counter = context.get(INVOKE_COUNTER_KEY,
Integer.class); Integer.class);
if (--counter == 0) { if (--counter == 0) {
runnable.run(); exit();
} }
context.set(INVOKE_COUNTER_KEY, counter); context.set(INVOKE_COUNTER_KEY, counter);
} }
protected abstract void enter(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext);
protected abstract void exit();
} }
...@@ -2,41 +2,53 @@ package com.a.eye.skywalking.api.plugin.assist; ...@@ -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.EnhancedClassInstanceContext;
import com.a.eye.skywalking.api.plugin.interceptor.assist.NoConcurrencyAccessObject; 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.Assert;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
/** /**
* @author wusheng * @author wusheng
*/ */
@RunWith(MockitoJUnitRunner.class)
public class NoConcurrencyAccessObjectTest { public class NoConcurrencyAccessObjectTest {
@Mock
private InstanceMethodInvokeContext invokeContext;
@Test @Test
public void testEntraExitCounter() { public void testEntraExitCounter() {
NoConcurrencyAccessObject object = new NoConcurrencyAccessObject();
final EnhancedClassInstanceContext context = new EnhancedClassInstanceContext(); final EnhancedClassInstanceContext context = new EnhancedClassInstanceContext();
object.whenEnter(context, new Runnable() { NoConcurrencyAccessObject first = new NoConcurrencyAccessObject(){
@Override @Override
public void run() { protected void enter(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext) {
context.set("firstEntrance", true); context.set("firstEntrance", true);
} }
});
object.whenEnter(context, new Runnable() { @Override protected void exit() {
@Override
public void run() {
context.set("secondEntrance", true);
}
});
object.whenExist(context, new Runnable() {
@Override
public void run() {
context.set("firstExit", true); context.set("firstExit", true);
} }
}); };
object.whenExist(context, new Runnable() {
NoConcurrencyAccessObject second = new NoConcurrencyAccessObject(){
@Override @Override
public void run() { protected void enter(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext) {
context.set("secondEntrance", true);
}
@Override protected void exit() {
context.set("lastEntrance", true); 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("secondEntrance"));
Assert.assertTrue(!context.isContain("firstExit")); Assert.assertTrue(!context.isContain("firstExit"));
......
...@@ -44,28 +44,7 @@ public class JedisMethodInterceptor extends NoConcurrencyAccessObject implements ...@@ -44,28 +44,7 @@ public class JedisMethodInterceptor extends NoConcurrencyAccessObject implements
@Override @Override
public void beforeMethod(final EnhancedClassInstanceContext context, public void beforeMethod(final EnhancedClassInstanceContext context,
final InstanceMethodInvokeContext interceptorContext, MethodInterceptResult result) { final InstanceMethodInvokeContext interceptorContext, MethodInterceptResult result) {
this.whenEnter(context, new Runnable() { this.whenEnter(context, interceptorContext);
@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]);
}
}
});
} }
/** /**
...@@ -84,12 +63,7 @@ public class JedisMethodInterceptor extends NoConcurrencyAccessObject implements ...@@ -84,12 +63,7 @@ public class JedisMethodInterceptor extends NoConcurrencyAccessObject implements
@Override @Override
public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext,
Object ret) { Object ret) {
this.whenExist(context, new Runnable() { this.whenExist(context);
@Override
public void run() {
ContextManager.stopSpan();
}
});
return ret; return ret;
} }
...@@ -98,4 +72,30 @@ public class JedisMethodInterceptor extends NoConcurrencyAccessObject implements ...@@ -98,4 +72,30 @@ public class JedisMethodInterceptor extends NoConcurrencyAccessObject implements
InstanceMethodInvokeContext interceptorContext) { InstanceMethodInvokeContext interceptorContext) {
ContextManager.activeSpan().log(t); 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();
}
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册