Merge pull request #178 from ascrutae/zhangxin/fix/150
Redis plugin cannot work on tomcat
This commit is contained in:
commit
30b7950310
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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"));
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue