From f594c99a56351a7cf5bb8a826c8da4ce4f85c0e7 Mon Sep 17 00:00:00 2001 From: ascrutae Date: Sun, 12 Jun 2016 17:36:07 +0800 Subject: [PATCH] =?UTF-8?q?1.Redis=E9=9B=86=E7=BE=A4=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jedis/v2/plugin/JedisBaseInterceptor.java | 48 +++++++++ .../v2/plugin/JedisClusterInterceptor.java | 29 ++++++ .../jedis/v2/plugin/JedisInterceptor.java | 99 +++++-------------- .../define/JedisClusterPluginDefine.java | 29 ++++++ .../src/main/resources/skywalking-plugin.def | 3 +- .../jedis/v2/plugin/JedisClusterTest.java | 51 ++++++++++ 6 files changed, 185 insertions(+), 74 deletions(-) create mode 100644 skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisBaseInterceptor.java create mode 100644 skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisClusterInterceptor.java create mode 100644 skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/define/JedisClusterPluginDefine.java create mode 100644 skywalking-sdk-plugin/jedis-2.x-plugin/src/test/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisClusterTest.java diff --git a/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisBaseInterceptor.java b/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisBaseInterceptor.java new file mode 100644 index 000000000..035a05f25 --- /dev/null +++ b/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisBaseInterceptor.java @@ -0,0 +1,48 @@ +package com.ai.cloud.skywalking.jedis.v2.plugin; + +import com.ai.cloud.skywalking.buriedpoint.RPCBuriedPointSender; +import com.ai.cloud.skywalking.model.Identification; +import com.ai.cloud.skywalking.plugin.interceptor.EnhancedClassInstanceContext; +import com.ai.cloud.skywalking.plugin.interceptor.MethodInvokeContext; +import com.ai.cloud.skywalking.plugin.interceptor.assist.FirstInvokeInterceptor; + +public abstract class JedisBaseInterceptor extends FirstInvokeInterceptor { + protected static final String REDIS_CONN_INFO_KEY = "redisClusterConnInfo"; + + private static RPCBuriedPointSender sender = new RPCBuriedPointSender(); + + @Override + public void beforeMethod(EnhancedClassInstanceContext context, MethodInvokeContext interceptorContext) { + if (this.isFirstBeforeMethod(context)) { + /** + * redis server wouldn't process rpc context. ignore the + * return(ContextData) of sender's beforeSend + */ + Identification.IdentificationBuilder builder = Identification + .newBuilder() + .viewPoint( + context.get(REDIS_CONN_INFO_KEY, String.class) + + " " + interceptorContext.methodName()) + .spanType(RedisBuriedPointType.instance()); + if (interceptorContext.allArguments().length > 0 + && interceptorContext.allArguments()[0] instanceof String) { + builder.businessKey("key=" + + interceptorContext.allArguments()[0]); + } + sender.beforeSend(builder.build()); + } + } + + @Override + public Object afterMethod(EnhancedClassInstanceContext context, MethodInvokeContext interceptorContext, Object ret) { + if (this.isLastAfterMethod(context)) { + sender.afterSend(); + } + return ret; + } + + @Override + public void handleMethodException(Throwable t, EnhancedClassInstanceContext context, MethodInvokeContext interceptorContext, Object ret) { + sender.handleException(t); + } +} diff --git a/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisClusterInterceptor.java b/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisClusterInterceptor.java new file mode 100644 index 000000000..732783ff9 --- /dev/null +++ b/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisClusterInterceptor.java @@ -0,0 +1,29 @@ +package com.ai.cloud.skywalking.jedis.v2.plugin; + +import com.ai.cloud.skywalking.plugin.interceptor.ConstructorInvokeContext; +import com.ai.cloud.skywalking.plugin.interceptor.EnhancedClassInstanceContext; +import redis.clients.jedis.HostAndPort; + +import java.util.Set; + +/** + * Created by xin on 16-6-12. + */ +public class JedisClusterInterceptor extends JedisBaseInterceptor { + @Override + public void onConstruct(EnhancedClassInstanceContext context, ConstructorInvokeContext interceptorContext) { + StringBuilder redisConnInfo = new StringBuilder(); + if (interceptorContext.allArguments().length > 0) { + if (interceptorContext.allArguments()[0] instanceof Set) { + Set hostAndPorts = (Set) interceptorContext.allArguments()[0]; + for (HostAndPort hostAndPort : hostAndPorts) { + redisConnInfo.append(hostAndPort.toString()).append(";"); + } + } else if (interceptorContext.allArguments()[0] instanceof HostAndPort) { + HostAndPort hostAndPort = (HostAndPort) interceptorContext.allArguments()[0]; + redisConnInfo.append(hostAndPort.toString()).append(";"); + } + } + context.set(REDIS_CONN_INFO_KEY, redisConnInfo.toString()); + } +} diff --git a/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisInterceptor.java b/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisInterceptor.java index 6d4b64b73..5a5896f11 100644 --- a/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisInterceptor.java +++ b/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisInterceptor.java @@ -1,82 +1,35 @@ package com.ai.cloud.skywalking.jedis.v2.plugin; -import java.net.URI; - -import redis.clients.jedis.JedisShardInfo; - import com.ai.cloud.skywalking.buriedpoint.RPCBuriedPointSender; -import com.ai.cloud.skywalking.model.Identification; -import com.ai.cloud.skywalking.model.Identification.IdentificationBuilder; import com.ai.cloud.skywalking.plugin.interceptor.ConstructorInvokeContext; import com.ai.cloud.skywalking.plugin.interceptor.EnhancedClassInstanceContext; -import com.ai.cloud.skywalking.plugin.interceptor.MethodInvokeContext; -import com.ai.cloud.skywalking.plugin.interceptor.assist.FirstInvokeInterceptor; - -public class JedisInterceptor extends FirstInvokeInterceptor { - private static final String REDIS_CONN_INFO_KEY = "redisConnInfo"; - - private static RPCBuriedPointSender sender = new RPCBuriedPointSender(); - - @Override - public void onConstruct(EnhancedClassInstanceContext context, - ConstructorInvokeContext interceptorContext) { - String redisConnInfo = ""; - if (interceptorContext.allArguments().length > 0) { - if (interceptorContext.allArguments()[0] instanceof String) { - redisConnInfo = (String) interceptorContext.allArguments()[0]; - if (interceptorContext.allArguments().length > 1) { - redisConnInfo += ":" - + (Integer) interceptorContext.allArguments()[1]; - } - } else if (interceptorContext.allArguments()[0] instanceof JedisShardInfo) { - JedisShardInfo shardInfo = (JedisShardInfo) interceptorContext - .allArguments()[0]; - redisConnInfo = shardInfo.getHost() + ":" + shardInfo.getPort(); - } else if (interceptorContext.allArguments()[0] instanceof URI) { - URI uri = (URI) interceptorContext.allArguments()[0]; - redisConnInfo = uri.getHost() + ":" + uri.getPort(); - } - } - context.set(REDIS_CONN_INFO_KEY, redisConnInfo); - } - - @Override - public void beforeMethod(EnhancedClassInstanceContext context, - MethodInvokeContext interceptorContext) { - if (this.isFirstBeforeMethod(context)) { - /** - * redis server wouldn't process rpc context. ignore the - * return(ContextData) of sender's beforeSend - */ - IdentificationBuilder builder = Identification - .newBuilder() - .viewPoint( - context.get(REDIS_CONN_INFO_KEY, String.class) - + " " + interceptorContext.methodName()) - .spanType(RedisBuriedPointType.instance()); - if (interceptorContext.allArguments().length > 0 - && interceptorContext.allArguments()[0] instanceof String) { - builder.businessKey("key=" - + interceptorContext.allArguments()[0]); - } - sender.beforeSend(builder.build()); - } - } +import redis.clients.jedis.JedisShardInfo; - @Override - public Object afterMethod(EnhancedClassInstanceContext context, - MethodInvokeContext interceptorContext, Object ret) { - if (this.isLastAfterMethod(context)) { - sender.afterSend(); - } - return ret; - } +import java.net.URI; - @Override - public void handleMethodException(Throwable t, - EnhancedClassInstanceContext context, - MethodInvokeContext interceptorContext, Object ret) { - sender.handleException(t); - } +public class JedisInterceptor extends JedisBaseInterceptor { + + @Override + public void onConstruct(EnhancedClassInstanceContext context, + ConstructorInvokeContext interceptorContext) { + String redisConnInfo = ""; + if (interceptorContext.allArguments().length > 0) { + if (interceptorContext.allArguments()[0] instanceof String) { + redisConnInfo = (String) interceptorContext.allArguments()[0]; + if (interceptorContext.allArguments().length > 1) { + redisConnInfo += ":" + + (Integer) interceptorContext.allArguments()[1]; + } + } else if (interceptorContext.allArguments()[0] instanceof JedisShardInfo) { + JedisShardInfo shardInfo = (JedisShardInfo) interceptorContext + .allArguments()[0]; + redisConnInfo = shardInfo.getHost() + ":" + shardInfo.getPort(); + } else if (interceptorContext.allArguments()[0] instanceof URI) { + URI uri = (URI) interceptorContext.allArguments()[0]; + redisConnInfo = uri.getHost() + ":" + uri.getPort(); + } + } + context.set(REDIS_CONN_INFO_KEY, redisConnInfo); + } } diff --git a/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/define/JedisClusterPluginDefine.java b/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/define/JedisClusterPluginDefine.java new file mode 100644 index 000000000..a03011272 --- /dev/null +++ b/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/define/JedisClusterPluginDefine.java @@ -0,0 +1,29 @@ +package com.ai.cloud.skywalking.jedis.v2.plugin.define; + +import com.ai.cloud.skywalking.jedis.v2.plugin.JedisClusterInterceptor; +import com.ai.cloud.skywalking.plugin.interceptor.IAroundInterceptor; +import com.ai.cloud.skywalking.plugin.interceptor.InterceptorDefine; +import com.ai.cloud.skywalking.plugin.interceptor.MethodMatcher; +import com.ai.cloud.skywalking.plugin.interceptor.matcher.AnyMethodMatcher; +import com.ai.cloud.skywalking.plugin.interceptor.matcher.MethodsExclusiveMatcher; +import com.ai.cloud.skywalking.plugin.interceptor.matcher.SimpleMethodMatcher; + +public class JedisClusterPluginDefine implements InterceptorDefine { + + @Override + public String getBeInterceptedClassName() { + return "redis.clients.jedis.JedisCluster"; + } + + @Override + public MethodMatcher[] getBeInterceptedMethodsMatchers() { + return new MethodMatcher[]{ + new SimpleMethodMatcher("set") + }; + } + + @Override + public IAroundInterceptor instance() { + return new JedisClusterInterceptor(); + } +} diff --git a/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/resources/skywalking-plugin.def b/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/resources/skywalking-plugin.def index e76d47d99..814dad0a9 100644 --- a/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/resources/skywalking-plugin.def +++ b/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/resources/skywalking-plugin.def @@ -1 +1,2 @@ -com.ai.cloud.skywalking.jedis.v2.plugin.define.JedisPluginDefine \ No newline at end of file +com.ai.cloud.skywalking.jedis.v2.plugin.define.JedisPluginDefine +com.ai.cloud.skywalking.jedis.v2.plugin.define.JedisClusterPluginDefine \ No newline at end of file diff --git a/skywalking-sdk-plugin/jedis-2.x-plugin/src/test/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisClusterTest.java b/skywalking-sdk-plugin/jedis-2.x-plugin/src/test/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisClusterTest.java new file mode 100644 index 000000000..4e8cabaa0 --- /dev/null +++ b/skywalking-sdk-plugin/jedis-2.x-plugin/src/test/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisClusterTest.java @@ -0,0 +1,51 @@ +package com.ai.cloud.skywalking.jedis.v2.plugin; + +import com.ai.cloud.skywalking.plugin.TracingBootstrap; +import org.junit.Test; +import redis.clients.jedis.HostAndPort; +import redis.clients.jedis.JedisCluster; + +import java.lang.reflect.InvocationTargetException; +import java.sql.SQLException; +import java.util.HashSet; +import java.util.Set; + +public class JedisClusterTest { + @Test + public void test() throws IllegalAccessException, IllegalArgumentException, + InvocationTargetException, NoSuchMethodException, + SecurityException, ClassNotFoundException { + TracingBootstrap + .main(new String[]{"com.ai.cloud.skywalking.jedis.v2.plugin.JedisClusterTest"}); + } + + public static void main(String[] args) throws ClassNotFoundException, + SQLException, InterruptedException { + JedisCluster jedisCluster = null; + try { + jedisCluster = new JedisCluster(getHostAndPorts()); + long start = System.currentTimeMillis(); + jedisCluster.set("11111", "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"); + long end = System.currentTimeMillis(); + System.out.println(end - start + "ms"); + jedisCluster.del("11111"); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private static Set getHostAndPorts() { + Set redisEnv = new HashSet(); + redisEnv.add(new HostAndPort("127.0.0.1", 7000)); + redisEnv.add(new HostAndPort("127.0.0.1", 7001)); + redisEnv.add(new HostAndPort("127.0.0.1", 7002)); + redisEnv.add(new HostAndPort("127.0.0.1", 7003)); + redisEnv.add(new HostAndPort("127.0.0.1", 7004)); + redisEnv.add(new HostAndPort("127.0.0.1", 7005)); + return redisEnv; + } + + public void testNormal() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException, InterruptedException { + JedisClusterTest.main(null); + } +} -- GitLab