From f6a0aedccd6ecf1ba0f334cf5507216a7feb1f44 Mon Sep 17 00:00:00 2001 From: Jaehong Kim Date: Tue, 23 Sep 2014 14:16:22 +0900 Subject: [PATCH 1/5] #7 redis&nBase-ARC interceptor --- .../bootstrap/config/ProfilerConfig.java | 19 +- .../pinpoint/common/ServiceType.java | 6 + pom.xml | 20 +- profiler/pom.xml | 15 + .../ClassFileTransformerDispatcher.java | 320 ++++---- .../modifier/DefaultModifierRegistry.java | 777 +++++++++--------- .../modifier/redis/JedisClientModifier.java | 58 ++ .../modifier/redis/JedisModifier.java | 76 ++ .../modifier/redis/JedisPipelineModifier.java | 82 ++ .../modifier/redis/RedisClusterModifier.java | 70 ++ .../redis/RedisClusterPipelineModifier.java | 72 ++ .../redis/filter/JedisMethodNames.java | 188 +++++ .../filter/JedisPipelineMethodNames.java | 33 + .../redis/filter/NameBasedMethodFilter.java | 36 + .../redis/filter/RedisClusterMethodNames.java | 56 ++ .../RedisClusterPipelineMethodNames.java | 34 + .../JedisClientConstructorInterceptor.java | 54 ++ .../JedisConstructorInterceptor.java | 69 ++ .../interceptor/JedisMethodInterceptor.java | 58 ++ .../JedisPipelineConstructorInterceptor.java | 50 ++ .../JedisPipelineMethodInterceptor.java | 60 ++ ...disPipelineSetClientMethodInterceptor.java | 51 ++ .../RedisClusterConstructorInterceptor.java | 54 ++ .../RedisClusterMethodInterceptor.java | 59 ++ ...ClusterPipelineConstructorInterceptor.java | 48 ++ ...RedisClusterPipelineMethodInterceptor.java | 59 ++ .../modifier/redis/JedisModifierTest.java | 71 ++ .../redis/JedisPipelineModifierTest.java | 75 ++ .../redis/RedisClusterModifierTest.java | 61 ++ .../RedisClusterPipelineModifierTest.java | 55 ++ .../redis/filter/JedisMethodNamesTest.java | 19 + .../filter/JedisPipelineMethodNamesTest.java | 21 + .../filter/RedisClusterMethodNamesTest.java | 25 + .../RedisClusterPipelineMethodNamesTest.java | 23 + testweb/pom.xml | 17 + .../testweb/controller/RedisController.java | 95 +++ testweb/src/main/resources/redis-context.xml | 26 + testweb/src/main/resources/root-context.xml | 149 ++-- 38 files changed, 2449 insertions(+), 612 deletions(-) create mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisClientModifier.java create mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisModifier.java create mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisPipelineModifier.java create mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterModifier.java create mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterPipelineModifier.java create mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/filter/JedisMethodNames.java create mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/filter/JedisPipelineMethodNames.java create mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/filter/NameBasedMethodFilter.java create mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/filter/RedisClusterMethodNames.java create mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/filter/RedisClusterPipelineMethodNames.java create mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisClientConstructorInterceptor.java create mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisConstructorInterceptor.java create mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisMethodInterceptor.java create mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisPipelineConstructorInterceptor.java create mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisPipelineMethodInterceptor.java create mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisPipelineSetClientMethodInterceptor.java create mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterConstructorInterceptor.java create mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterMethodInterceptor.java create mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterPipelineConstructorInterceptor.java create mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterPipelineMethodInterceptor.java create mode 100644 profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisModifierTest.java create mode 100644 profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisPipelineModifierTest.java create mode 100644 profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterModifierTest.java create mode 100644 profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterPipelineModifierTest.java create mode 100644 profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/filter/JedisMethodNamesTest.java create mode 100644 profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/filter/JedisPipelineMethodNamesTest.java create mode 100644 profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/filter/RedisClusterMethodNamesTest.java create mode 100644 profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/filter/RedisClusterPipelineMethodNamesTest.java create mode 100644 testweb/src/main/java/com/nhn/pinpoint/testweb/controller/RedisController.java create mode 100644 testweb/src/main/resources/redis-context.xml diff --git a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/config/ProfilerConfig.java b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/config/ProfilerConfig.java index ec079d4fb..13fd3cc44 100644 --- a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/config/ProfilerConfig.java +++ b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/config/ProfilerConfig.java @@ -68,6 +68,9 @@ public class ProfilerConfig { private boolean mybatis = true; + private boolean redis = true; + private boolean nBaseArc = true; + /** * apache http client */ @@ -446,7 +449,15 @@ public class ProfilerConfig { return mybatis; } - /** + public boolean isRedisEnabled() { + return redis; + } + + public boolean isNBaseArcEnabled() { + return nBaseArc; + } + + /** * TODO remove this. 테스트 장비에서 call stack view가 잘 보이는지 테스트 하려고 추가함. * * @param className @@ -565,6 +576,10 @@ public class ProfilerConfig { this.ningAsyncHttpClientProfileParamDumpSize = readInt(prop, "profiler.ning.asynchttpclient.param.dumpsize", 1024); this.ningAsyncHttpClientProfileParamSamplingRate = readInt(prop, "profiler.asynchttpclient.param.sampling.rate", 1); + // redis & nBase-ARC + this.redis = readBoolean(prop, "profiler.redis", true); + this.nBaseArc = readBoolean(prop, "profiler.nBaseArc", true); + // // FIXME 임시용, line game netty configuration // @@ -729,6 +744,8 @@ public class ProfilerConfig { sb.append("\n arucsKeyTrace=").append(arucsKeyTrace); sb.append("\n memcached=").append(memcached); sb.append("\n memcachedKeyTrace=").append(memcachedKeyTrace); + sb.append("\n redis=").append(redis); + sb.append("\n nBaseArc=").append(nBaseArc); sb.append("\n ibatis=").append(ibatis); sb.append("\n mybatis=").append(mybatis); sb.append("\n apacheHttpClient4Profile=").append(apacheHttpClient4Profile); diff --git a/commons/src/main/java/com/navercorp/pinpoint/common/ServiceType.java b/commons/src/main/java/com/navercorp/pinpoint/common/ServiceType.java index 3dc39c20e..63bd8ff17 100644 --- a/commons/src/main/java/com/navercorp/pinpoint/common/ServiceType.java +++ b/commons/src/main/java/com/navercorp/pinpoint/common/ServiceType.java @@ -108,6 +108,12 @@ public enum ServiceType { ARCUS_FUTURE_GET((short) 8101, "ARCUS", TERMINAL, !RECORD_STATISTICS, INCLUDE_DESTINATION, FAST_SCHEMA), ARCUS_EHCACHE_FUTURE_GET((short) 8102, "ARCUS-EHCACHE", TERMINAL, !RECORD_STATISTICS, INCLUDE_DESTINATION, FAST_SCHEMA), + /** + * Redis & nBase-ARC + */ + REDIS((short) 8200, "REDIS", TERMINAL, RECORD_STATISTICS, INCLUDE_DESTINATION, FAST_SCHEMA), + NBASE_ARC((short) 8250, "NBASE_ARC", TERMINAL, RECORD_STATISTICS, INCLUDE_DESTINATION, FAST_SCHEMA), + /** * Connector, Client */ diff --git a/pom.xml b/pom.xml index a7780bec0..6e685ddc9 100644 --- a/pom.xml +++ b/pom.xml @@ -203,7 +203,7 @@ spring-aspects ${spring.version} - + com.codahale.metrics @@ -433,9 +433,25 @@ ehcache 1.6.2 + + + com.nhncorp + triples-redis-client + 1.3.3 + + + + redis.clients + jedis + 2.4.1 + - + + org.springframework.data + spring-data-redis + 1.1.1.RELEASE + org.apache.httpcomponents diff --git a/profiler/pom.xml b/profiler/pom.xml index 28458ecb1..9b430ce55 100644 --- a/profiler/pom.xml +++ b/profiler/pom.xml @@ -220,6 +220,21 @@ provided + + + + com.nhncorp + triples-redis-client + provided + + + + + redis.clients + jedis + provided + + + + + com.nhncorp + triples-redis-client + + + + + redis.clients + jedis + + + + org.springframework.data + spring-data-redis + diff --git a/testweb/src/main/java/com/nhn/pinpoint/testweb/controller/RedisController.java b/testweb/src/main/java/com/nhn/pinpoint/testweb/controller/RedisController.java new file mode 100644 index 000000000..87ad6b92f --- /dev/null +++ b/testweb/src/main/java/com/nhn/pinpoint/testweb/controller/RedisController.java @@ -0,0 +1,95 @@ +package com.nhn.pinpoint.testweb.controller; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import redis.clients.jedis.Jedis; +import redis.clients.jedis.Pipeline; + +import com.nhncorp.redis.cluster.gateway.GatewayClient; +import com.nhncorp.redis.cluster.pipeline.RedisClusterPipeline; +import com.nhncorp.redis.cluster.spring.StringRedisClusterTemplate; + +@Controller +public class RedisController { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + private static final String HOST = "10.99.116.91"; + private static final int PORT = 6390; + + public static final String IBATIS_VIEW = "orm/ibatis"; + public static final String MYBATIS_VIEW = "orm/mybatis"; + + @Autowired + private GatewayClient client; + + @Autowired + private StringRedisClusterTemplate redisTemplate; + + @RequestMapping(value = "/redis/jedis") + @ResponseBody + public String jedis(Model model) { + logger.info("/redis/jedis"); + + final Jedis jedis = new Jedis(HOST, PORT); + + jedis.get("foo"); + jedis.close(); + + return "OK"; + } + + @RequestMapping(value = "/redis/jedis/pipeline") + @ResponseBody + public String jedisPipeline(Model model) { + logger.info("/redis/jedis/pipeline - add, update, get, delete"); + + final Jedis jedis = new Jedis(HOST, PORT); + Pipeline pipeline = jedis.pipelined(); + + pipeline.set("foo", "bar"); + pipeline.get("foo"); + pipeline.expire("foo", 1); + pipeline.syncAndReturnAll(); + + jedis.close(); + + return "OK"; + } + + @RequestMapping(value = "/redis/nBaseArc") + @ResponseBody + public String nBaseArc(Model model) { + logger.info("/redis/nBaseArc"); + + client.get("foo"); + + return "OK"; + } + + @RequestMapping(value = "/redis/nBaseArc/pipeline") + @ResponseBody + public String nBaseArcPipeline(Model model) { + logger.info("/redis/nBaseArc/pipeline"); + + RedisClusterPipeline pipeline = null; + try { + pipeline = client.pipeline(); + pipeline.set("foo", "bar"); + pipeline.get("foo"); + pipeline.expire("foo", 1); + pipeline.syncAndReturnAll(); + } finally { + if (pipeline != null) { + pipeline.close(); + } + } + + return "OK"; + } +} \ No newline at end of file diff --git a/testweb/src/main/resources/redis-context.xml b/testweb/src/main/resources/redis-context.xml new file mode 100644 index 000000000..e860b31f9 --- /dev/null +++ b/testweb/src/main/resources/redis-context.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/testweb/src/main/resources/root-context.xml b/testweb/src/main/resources/root-context.xml index 8b498a52f..fd4fed067 100644 --- a/testweb/src/main/resources/root-context.xml +++ b/testweb/src/main/resources/root-context.xml @@ -1,74 +1,75 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 4d4738ded76c7d8f6bbba9673d136ad87a1e76a4 Mon Sep 17 00:00:00 2001 From: Jaehong Kim Date: Wed, 24 Sep 2014 18:38:47 +0900 Subject: [PATCH 2/5] #7 add pipeline & trace destination id --- .../interceptor/tracevalue/MapTraceValue.java | 14 ++++ .../pinpoint/common/ServiceType.java | 2 +- .../modifier/DefaultModifierRegistry.java | 4 ++ .../modifier/redis/GatewayModifier.java | 68 +++++++++++++++++++ .../modifier/redis/GatewayServerModifier.java | 66 ++++++++++++++++++ .../modifier/redis/JedisClientModifier.java | 6 +- .../modifier/redis/JedisModifier.java | 4 +- .../modifier/redis/JedisPipelineModifier.java | 4 +- .../modifier/redis/RedisClusterModifier.java | 4 +- .../redis/RedisClusterPipelineModifier.java | 4 +- .../GatewayConstructorInterceptor.java | 56 +++++++++++++++ .../interceptor/GatewayMethodInterceptor.java | 46 +++++++++++++ .../GatewayServerMethodInterceptor.java | 38 +++++++++++ .../JedisClientConstructorInterceptor.java | 33 +++++---- .../JedisConstructorInterceptor.java | 46 +++++++------ .../interceptor/JedisMethodInterceptor.java | 31 +++------ .../JedisPipelineConstructorInterceptor.java | 25 ++++--- .../JedisPipelineMethodInterceptor.java | 35 +++------- ...disPipelineSetClientMethodInterceptor.java | 24 +++---- .../RedisClusterConstructorInterceptor.java | 31 +++++---- .../RedisClusterMethodInterceptor.java | 34 +++------- ...ClusterPipelineConstructorInterceptor.java | 25 ++++--- ...RedisClusterPipelineMethodInterceptor.java | 34 +++------- .../modifier/redis/JedisModifierTest.java | 2 +- .../redis/JedisPipelineModifierTest.java | 2 +- .../redis/RedisClusterModifierTest.java | 29 +++++++- .../RedisClusterPipelineModifierTest.java | 29 ++++++-- 27 files changed, 496 insertions(+), 200 deletions(-) create mode 100644 bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/tracevalue/MapTraceValue.java create mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/GatewayModifier.java create mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/GatewayServerModifier.java create mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/GatewayConstructorInterceptor.java create mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/GatewayMethodInterceptor.java create mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/GatewayServerMethodInterceptor.java diff --git a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/tracevalue/MapTraceValue.java b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/tracevalue/MapTraceValue.java new file mode 100644 index 000000000..a4af1a81e --- /dev/null +++ b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/tracevalue/MapTraceValue.java @@ -0,0 +1,14 @@ +package com.nhn.pinpoint.bootstrap.interceptor.tracevalue; + +import java.util.Map; + +/** + * + * @author jaehong.kim + * + */ +public interface MapTraceValue extends TraceValue { + void __setTraceBindValue(Map value); + + Map __getTraceBindValue(); +} diff --git a/commons/src/main/java/com/navercorp/pinpoint/common/ServiceType.java b/commons/src/main/java/com/navercorp/pinpoint/common/ServiceType.java index 63bd8ff17..4f27c3ddb 100644 --- a/commons/src/main/java/com/navercorp/pinpoint/common/ServiceType.java +++ b/commons/src/main/java/com/navercorp/pinpoint/common/ServiceType.java @@ -111,7 +111,7 @@ public enum ServiceType { /** * Redis & nBase-ARC */ - REDIS((short) 8200, "REDIS", TERMINAL, RECORD_STATISTICS, INCLUDE_DESTINATION, FAST_SCHEMA), + REDIS((short) 8200, "REDIS", TERMINAL, RECORD_STATISTICS, !INCLUDE_DESTINATION, FAST_SCHEMA), NBASE_ARC((short) 8250, "NBASE_ARC", TERMINAL, RECORD_STATISTICS, INCLUDE_DESTINATION, FAST_SCHEMA), /** diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/DefaultModifierRegistry.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/DefaultModifierRegistry.java index 86e7dd841..a1f1fb702 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/DefaultModifierRegistry.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/DefaultModifierRegistry.java @@ -59,6 +59,8 @@ import com.nhn.pinpoint.profiler.modifier.orm.ibatis.SqlMapClientImplModifier; import com.nhn.pinpoint.profiler.modifier.orm.ibatis.SqlMapSessionImplModifier; import com.nhn.pinpoint.profiler.modifier.orm.mybatis.DefaultSqlSessionModifier; import com.nhn.pinpoint.profiler.modifier.orm.mybatis.SqlSessionTemplateModifier; +import com.nhn.pinpoint.profiler.modifier.redis.GatewayModifier; +import com.nhn.pinpoint.profiler.modifier.redis.GatewayServerModifier; import com.nhn.pinpoint.profiler.modifier.redis.JedisClientModifier; import com.nhn.pinpoint.profiler.modifier.redis.JedisModifier; import com.nhn.pinpoint.profiler.modifier.redis.JedisPipelineModifier; @@ -391,6 +393,8 @@ public class DefaultModifierRegistry implements ModifierRegistry { public void addNBaseArcSupport() { if (profilerConfig.isNBaseArcEnabled()) { + addModifier(new GatewayModifier(byteCodeInstrumentor, agent)); + addModifier(new GatewayServerModifier(byteCodeInstrumentor, agent)); addModifier(new RedisClusterModifier(byteCodeInstrumentor, agent)); addModifier(new RedisClusterPipelineModifier(byteCodeInstrumentor, agent)); } diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/GatewayModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/GatewayModifier.java new file mode 100644 index 000000000..fec26e844 --- /dev/null +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/GatewayModifier.java @@ -0,0 +1,68 @@ +package com.nhn.pinpoint.profiler.modifier.redis; + +import java.security.ProtectionDomain; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.nhn.pinpoint.bootstrap.Agent; +import com.nhn.pinpoint.bootstrap.interceptor.Interceptor; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; +import com.nhn.pinpoint.profiler.interceptor.bci.ByteCodeInstrumentor; +import com.nhn.pinpoint.profiler.interceptor.bci.InstrumentClass; +import com.nhn.pinpoint.profiler.interceptor.bci.Method; +import com.nhn.pinpoint.profiler.modifier.AbstractModifier; + +/** + * Gateway(nBase-ARC client) modifier + * + * @author jaehong.kim + * + */ +public class GatewayModifier extends AbstractModifier { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + public GatewayModifier(ByteCodeInstrumentor byteCodeInstrumentor, Agent agent) { + super(byteCodeInstrumentor, agent); + } + + @Override + public String getTargetClass() { + return "com/nhncorp/redis/cluster/gateway/Gateway"; + } + + @Override + public byte[] modify(ClassLoader classLoader, String className, ProtectionDomain protectedDomain, byte[] classFileBuffer) { + if (logger.isInfoEnabled()) { + logger.info("Modifing. {}", className); + } + + try { + final InstrumentClass instrumentClass = byteCodeInstrumentor.getClass(className); + + // trace destinationId + instrumentClass.addTraceValue(MapTraceValue.class); + final Interceptor constructorInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.nhn.pinpoint.profiler.modifier.redis.interceptor.GatewayConstructorInterceptor"); + instrumentClass.addConstructorInterceptor(new String[] { "com.nhncorp.redis.cluster.gateway.GatewayConfig" }, constructorInterceptor); + + // method + final List declaredMethods = instrumentClass.getDeclaredMethods(); + for (Method method : declaredMethods) { + if (method.getMethodName().equals("getServer")) { + final Interceptor methodInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.nhn.pinpoint.profiler.modifier.redis.interceptor.GatewayMethodInterceptor"); + instrumentClass.addInterceptor(method.getMethodName(), method.getMethodParams(), methodInterceptor); + } + } + + return instrumentClass.toBytecode(); + } catch (Exception e) { + if (logger.isWarnEnabled()) { + logger.warn("redis.GatewayModifier(nBase-ARC) fail. Target class is " + getTargetClass() + ", Caused " + e.getMessage(), e); + } + } + + return null; + } +} \ No newline at end of file diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/GatewayServerModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/GatewayServerModifier.java new file mode 100644 index 000000000..9d423cb26 --- /dev/null +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/GatewayServerModifier.java @@ -0,0 +1,66 @@ +package com.nhn.pinpoint.profiler.modifier.redis; + +import java.security.ProtectionDomain; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.nhn.pinpoint.bootstrap.Agent; +import com.nhn.pinpoint.bootstrap.interceptor.Interceptor; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; +import com.nhn.pinpoint.profiler.interceptor.bci.ByteCodeInstrumentor; +import com.nhn.pinpoint.profiler.interceptor.bci.InstrumentClass; +import com.nhn.pinpoint.profiler.interceptor.bci.Method; +import com.nhn.pinpoint.profiler.modifier.AbstractModifier; + +/** + * RedisCluster(nBase-ARC client) modifier + * + * @author jaehong.kim + * + */ +public class GatewayServerModifier extends AbstractModifier { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + public GatewayServerModifier(ByteCodeInstrumentor byteCodeInstrumentor, Agent agent) { + super(byteCodeInstrumentor, agent); + } + + @Override + public String getTargetClass() { + return "com/nhncorp/redis/cluster/gateway/GatewayServer"; + } + + @Override + public byte[] modify(ClassLoader classLoader, String className, ProtectionDomain protectedDomain, byte[] classFileBuffer) { + if (logger.isInfoEnabled()) { + logger.info("Modifing. {}", className); + } + + try { + final InstrumentClass instrumentClass = byteCodeInstrumentor.getClass(className); + + // trace host & port + instrumentClass.addTraceValue(MapTraceValue.class); + + // method + final List declaredMethods = instrumentClass.getDeclaredMethods(); + for (Method method : declaredMethods) { + if (method.getMethodName().equals("getResource")) { + final Interceptor methodInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.nhn.pinpoint.profiler.modifier.redis.interceptor.GatewayServerMethodInterceptor"); + instrumentClass.addInterceptor(method.getMethodName(), method.getMethodParams(), methodInterceptor); + } + } + + return instrumentClass.toBytecode(); + } catch (Exception e) { + if (logger.isWarnEnabled()) { + logger.warn("redis.GatewayModifier(nBase-ARC) fail. Target class is " + getTargetClass() + ", Caused " + e.getMessage(), e); + } + } + + return null; + } +} \ No newline at end of file diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisClientModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisClientModifier.java index 18c76ff10..97533c907 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisClientModifier.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisClientModifier.java @@ -7,7 +7,7 @@ import org.slf4j.LoggerFactory; import com.nhn.pinpoint.bootstrap.Agent; import com.nhn.pinpoint.bootstrap.interceptor.Interceptor; -import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.ObjectTraceValue; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; import com.nhn.pinpoint.profiler.interceptor.bci.ByteCodeInstrumentor; import com.nhn.pinpoint.profiler.interceptor.bci.InstrumentClass; import com.nhn.pinpoint.profiler.modifier.AbstractModifier; @@ -40,8 +40,8 @@ public class JedisClientModifier extends AbstractModifier { try { final InstrumentClass instrumentClass = byteCodeInstrumentor.getClass(className); - // trace host & port - instrumentClass.addTraceValue(ObjectTraceValue.class); + // trace endPoint + instrumentClass.addTraceValue(MapTraceValue.class); final Interceptor constructorInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.nhn.pinpoint.profiler.modifier.redis.interceptor.JedisClientConstructorInterceptor"); instrumentClass.addConstructorInterceptor(new String[] { "java.lang.String" }, constructorInterceptor); instrumentClass.addConstructorInterceptor(new String[] { "java.lang.String", "int" }, constructorInterceptor); diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisModifier.java index cc9bc54b7..5826770e0 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisModifier.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisModifier.java @@ -8,7 +8,7 @@ import org.slf4j.LoggerFactory; import com.nhn.pinpoint.bootstrap.Agent; import com.nhn.pinpoint.bootstrap.interceptor.Interceptor; -import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.ObjectTraceValue; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; import com.nhn.pinpoint.profiler.interceptor.bci.ByteCodeInstrumentor; import com.nhn.pinpoint.profiler.interceptor.bci.InstrumentClass; import com.nhn.pinpoint.profiler.interceptor.bci.Method; @@ -45,7 +45,7 @@ public class JedisModifier extends AbstractModifier { final InstrumentClass instrumentClass = byteCodeInstrumentor.getClass(className); // trace host & port - instrumentClass.addTraceValue(ObjectTraceValue.class); + instrumentClass.addTraceValue(MapTraceValue.class); final Interceptor constructorInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.nhn.pinpoint.profiler.modifier.redis.interceptor.JedisConstructorInterceptor"); instrumentClass.addConstructorInterceptor(new String[] { "java.lang.String" }, constructorInterceptor); try { diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisPipelineModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisPipelineModifier.java index 7b098759f..e1356efb6 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisPipelineModifier.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisPipelineModifier.java @@ -8,7 +8,7 @@ import org.slf4j.LoggerFactory; import com.nhn.pinpoint.bootstrap.Agent; import com.nhn.pinpoint.bootstrap.interceptor.Interceptor; -import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.ObjectTraceValue; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; import com.nhn.pinpoint.profiler.interceptor.bci.ByteCodeInstrumentor; import com.nhn.pinpoint.profiler.interceptor.bci.InstrumentClass; import com.nhn.pinpoint.profiler.interceptor.bci.Method; @@ -45,7 +45,7 @@ public class JedisPipelineModifier extends AbstractModifier { final InstrumentClass instrumentClass = byteCodeInstrumentor.getClass(className); // trace host & port - instrumentClass.addTraceValue(ObjectTraceValue.class); + instrumentClass.addTraceValue(MapTraceValue.class); final Interceptor constructorInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.nhn.pinpoint.profiler.modifier.redis.interceptor.JedisPipelineConstructorInterceptor"); try { // jedis 1.x diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterModifier.java index e63c14c57..7f899d22f 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterModifier.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterModifier.java @@ -8,7 +8,7 @@ import org.slf4j.LoggerFactory; import com.nhn.pinpoint.bootstrap.Agent; import com.nhn.pinpoint.bootstrap.interceptor.Interceptor; -import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.ObjectTraceValue; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; import com.nhn.pinpoint.profiler.interceptor.bci.ByteCodeInstrumentor; import com.nhn.pinpoint.profiler.interceptor.bci.InstrumentClass; import com.nhn.pinpoint.profiler.interceptor.bci.Method; @@ -45,7 +45,7 @@ public class RedisClusterModifier extends AbstractModifier { final InstrumentClass instrumentClass = byteCodeInstrumentor.getClass(className); // trace host & port - instrumentClass.addTraceValue(ObjectTraceValue.class); + instrumentClass.addTraceValue(MapTraceValue.class); final Interceptor constructorInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.nhn.pinpoint.profiler.modifier.redis.interceptor.RedisClusterConstructorInterceptor"); instrumentClass.addConstructorInterceptor(new String[] { "java.lang.String" }, constructorInterceptor); instrumentClass.addConstructorInterceptor(new String[] { "java.lang.String", "int" }, constructorInterceptor); diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterPipelineModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterPipelineModifier.java index 7ba721789..cb84f6132 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterPipelineModifier.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterPipelineModifier.java @@ -8,7 +8,7 @@ import org.slf4j.LoggerFactory; import com.nhn.pinpoint.bootstrap.Agent; import com.nhn.pinpoint.bootstrap.interceptor.Interceptor; -import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.ObjectTraceValue; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; import com.nhn.pinpoint.profiler.interceptor.bci.ByteCodeInstrumentor; import com.nhn.pinpoint.profiler.interceptor.bci.InstrumentClass; import com.nhn.pinpoint.profiler.interceptor.bci.Method; @@ -45,7 +45,7 @@ public class RedisClusterPipelineModifier extends AbstractModifier { final InstrumentClass instrumentClass = byteCodeInstrumentor.getClass(className); // trace host & port - instrumentClass.addTraceValue(ObjectTraceValue.class); + instrumentClass.addTraceValue(MapTraceValue.class); final Interceptor constructorInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.nhn.pinpoint.profiler.modifier.redis.interceptor.RedisClusterPipelineConstructorInterceptor"); try { instrumentClass.addConstructorInterceptor(new String[] { "com.nhncorp.redis.cluster.gateway.GatewayServer" }, constructorInterceptor); diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/GatewayConstructorInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/GatewayConstructorInterceptor.java new file mode 100644 index 000000000..f421f164c --- /dev/null +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/GatewayConstructorInterceptor.java @@ -0,0 +1,56 @@ +package com.nhn.pinpoint.profiler.modifier.redis.interceptor; + +import java.util.HashMap; +import java.util.Map; + +import com.nhn.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; +import com.nhn.pinpoint.bootstrap.interceptor.TargetClassLoader; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; +import com.nhn.pinpoint.bootstrap.logging.PLogger; +import com.nhn.pinpoint.bootstrap.logging.PLoggerFactory; +import com.nhncorp.redis.cluster.gateway.GatewayConfig; + +/** + * Gateway(nBase-ARC client) constructor interceptor + * - trace destinationId + * + * @author jaehong.kim + * + */ +public class GatewayConstructorInterceptor implements SimpleAroundInterceptor, TargetClassLoader { + + private final PLogger logger = PLoggerFactory.getLogger(this.getClass()); + private final boolean isDebug = logger.isDebugEnabled(); + + @Override + public void before(Object target, Object[] args) { + if (isDebug) { + logger.beforeInterceptor(target, args); + } + + if (!(target instanceof MapTraceValue)) { + return; + } + + final GatewayConfig config = (GatewayConfig) args[0]; + final Map traceValue = new HashMap(); + try { + if (config.getDomainAddress() != null) { + traceValue.put("destinationId", config.getDomainAddress()); + } else if (config.getIpAddress() != null) { + traceValue.put("destinationId", config.getIpAddress()); + } else if (config.getClusterName() != null) { + // over 1.1.x + traceValue.put("destinationId", config.getClusterName()); + } + } catch (Exception ignored) { + // backward compatibility error + } + + ((MapTraceValue) target).__setTraceBindValue(traceValue); + } + + @Override + public void after(Object target, Object[] args, Object result, Throwable throwable) { + } +} \ No newline at end of file diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/GatewayMethodInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/GatewayMethodInterceptor.java new file mode 100644 index 000000000..6601f588d --- /dev/null +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/GatewayMethodInterceptor.java @@ -0,0 +1,46 @@ +package com.nhn.pinpoint.profiler.modifier.redis.interceptor; + +import java.util.HashMap; +import java.util.Map; + +import com.nhn.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; +import com.nhn.pinpoint.bootstrap.interceptor.TargetClassLoader; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; +import com.nhn.pinpoint.bootstrap.logging.PLogger; +import com.nhn.pinpoint.bootstrap.logging.PLoggerFactory; + +/** + * Gateway(nBase-ARC client) getServer() method interceptor + * - trace destinationId + * + * @author jaehong.kim + * + */ +public class GatewayMethodInterceptor implements SimpleAroundInterceptor, TargetClassLoader { + private final PLogger logger = PLoggerFactory.getLogger(this.getClass()); + private final boolean isDebug = logger.isDebugEnabled(); + + @Override + public void before(Object target, Object[] args) { + } + + @Override + public void after(Object target, Object[] args, Object result, Throwable throwable) { + if (isDebug) { + logger.beforeInterceptor(target, args); + } + + if (!(target instanceof MapTraceValue) || result == null || !(result instanceof MapTraceValue)) { + return; + } + + // result - GatewayServer + final Map gatewayTraceValue = ((MapTraceValue) target).__getTraceBindValue(); + if (gatewayTraceValue != null) { + final Map traceValue = new HashMap(); + // copy to destinationId + traceValue.put("destinationId", gatewayTraceValue.get("destinationId")); + ((MapTraceValue) result).__setTraceBindValue(traceValue); + } + } +} \ No newline at end of file diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/GatewayServerMethodInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/GatewayServerMethodInterceptor.java new file mode 100644 index 000000000..59397aacc --- /dev/null +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/GatewayServerMethodInterceptor.java @@ -0,0 +1,38 @@ +package com.nhn.pinpoint.profiler.modifier.redis.interceptor; + +import java.util.Map; + +import com.nhn.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; +import com.nhn.pinpoint.bootstrap.interceptor.TargetClassLoader; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; + +/** + * GatewayServer(nBase-ARC client) getResource() method interceptor + * - trace destinationId + * + * @author jaehong.kim + * + */ +public class GatewayServerMethodInterceptor implements SimpleAroundInterceptor, TargetClassLoader { + + @Override + public void before(Object target, Object[] args) { + } + + @Override + public void after(Object target, Object[] args, Object result, Throwable throwable) { + if (!(target instanceof MapTraceValue) || result == null || !(result instanceof MapTraceValue)) { + return; + } + + // result - RedisCluster + final Map gatewayServerTraceValue = ((MapTraceValue) target).__getTraceBindValue(); + if (gatewayServerTraceValue != null) { + final Map traceValue = ((MapTraceValue) result).__getTraceBindValue(); + // copy to destinationId + if (traceValue != null) { + traceValue.put("destinationId", gatewayServerTraceValue.get("destinationId")); + } + } + } +} \ No newline at end of file diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisClientConstructorInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisClientConstructorInterceptor.java index fd71df1d7..921f04daf 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisClientConstructorInterceptor.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisClientConstructorInterceptor.java @@ -5,12 +5,13 @@ import java.util.Map; import com.nhn.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; import com.nhn.pinpoint.bootstrap.interceptor.TargetClassLoader; -import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.ObjectTraceValue; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; import com.nhn.pinpoint.bootstrap.logging.PLogger; import com.nhn.pinpoint.bootstrap.logging.PLoggerFactory; /** - * Redis client(jedis) constructor interceptor + * Jedis client(redis client) constructor interceptor + * - trace endPoint * * @author jaehong.kim * @@ -26,26 +27,28 @@ public class JedisClientConstructorInterceptor implements SimpleAroundIntercepto logger.beforeInterceptor(target, args); } - if (!(target instanceof ObjectTraceValue)) { + // trace endPoint + if (!(target instanceof MapTraceValue)) { return; } - // trace host & port - final ObjectTraceValue traceValue = (ObjectTraceValue) target; - final Map map = new HashMap(); + final StringBuilder endPoint = new StringBuilder(); // first arg - host if (args[0] instanceof String) { - map.put("host", args[0]); - // default port - map.put("port", 6379); + endPoint.append(args[0]); + + // second arg - port + if (args.length >= 2 && args[1] instanceof Integer) { + endPoint.append(":").append(args[1]); + } else { + // default port + endPoint.append(":").append(6379); + } } - // second arg - port - if (args.length >= 2 && args[1] instanceof Integer) { - map.put("port", args[1]); - } - - traceValue.__setTraceObject(map); + final Map traceValue = new HashMap(); + traceValue.put("endPoint", endPoint.toString()); + ((MapTraceValue) target).__setTraceBindValue(traceValue); } @Override diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisConstructorInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisConstructorInterceptor.java index 839ad747a..ee433b61f 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisConstructorInterceptor.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisConstructorInterceptor.java @@ -8,12 +8,13 @@ import redis.clients.jedis.JedisShardInfo; import com.nhn.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; import com.nhn.pinpoint.bootstrap.interceptor.TargetClassLoader; -import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.ObjectTraceValue; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; import com.nhn.pinpoint.bootstrap.logging.PLogger; import com.nhn.pinpoint.bootstrap.logging.PLoggerFactory; /** - * Redis client(jedis) constructor interceptor + * Jedis (redis client) constructor interceptor + * - trace endPoint * * @author jaehong.kim * @@ -22,45 +23,48 @@ public class JedisConstructorInterceptor implements SimpleAroundInterceptor, Tar private final PLogger logger = PLoggerFactory.getLogger(this.getClass()); private final boolean isDebug = logger.isDebugEnabled(); - + @Override public void before(Object target, Object[] args) { if (isDebug) { logger.beforeInterceptor(target, args); } - if (!(target instanceof ObjectTraceValue)) { + // trace endPoint + if (!(target instanceof MapTraceValue)) { return; } - // trace host & port - final ObjectTraceValue traceValue = (ObjectTraceValue) target; - final Map map = new HashMap(); - + final StringBuilder endPoint = new StringBuilder(); try { // first arg - host if (args[0] instanceof String) { - map.put("host", args[0]); - // default port - map.put("port", 6379); + endPoint.append(args[0]); + // second arg - port + if (args.length >= 2 && args[1] instanceof Integer) { + endPoint.append(":").append(args[1]); + } else { + // default port + endPoint.append(":").append(6379); + } } else if (args[0] instanceof URI) { final URI uri = (URI) args[0]; - map.put("host", uri.getHost()); - map.put("port", uri.getPort()); + endPoint.append(uri.getHost()); + endPoint.append(":"); + endPoint.append(uri.getPort()); } else if (args[0] instanceof JedisShardInfo) { final JedisShardInfo info = (JedisShardInfo) args[0]; - map.put("host", info.getHost()); - map.put("port", info.getPort()); + endPoint.append(info.getHost()); + endPoint.append(":"); + endPoint.append(info.getPort()); } - - // second arg - port - if (args.length >= 2 && args[1] instanceof Integer) { - map.put("port", args[1]); - } - traceValue.__setTraceObject(map); } catch (Exception ignored) { // expect 'class not found exception - JedisShardInfo' } + + final Map traceValue = new HashMap(); + traceValue.put("endPoint", endPoint.toString()); + ((MapTraceValue) target).__setTraceBindValue(traceValue); } @Override diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisMethodInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisMethodInterceptor.java index 76434b827..2f1e43136 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisMethodInterceptor.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisMethodInterceptor.java @@ -5,11 +5,11 @@ import java.util.Map; import com.nhn.pinpoint.bootstrap.context.RecordableTrace; import com.nhn.pinpoint.bootstrap.interceptor.SpanEventSimpleAroundInterceptor; import com.nhn.pinpoint.bootstrap.interceptor.TargetClassLoader; -import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.ObjectTraceValue; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; import com.nhn.pinpoint.common.ServiceType; /** - * Redis client(jedis) method interceptor + * Jedis (redis client) method interceptor * * @author jaehong.kim * @@ -27,30 +27,17 @@ public class JedisMethodInterceptor extends SpanEventSimpleAroundInterceptor imp @Override public void doInAfterTrace(RecordableTrace trace, Object target, Object[] args, Object result, Throwable throwable) { - String destinationId = "Unknown"; - String endPoint = "Unknown"; - if (target instanceof ObjectTraceValue) { - // find host & port - final ObjectTraceValue traceValue = (ObjectTraceValue) target; - if (traceValue.__getTraceObject() != null && traceValue.__getTraceObject() instanceof Map) { - final Map map = (Map) traceValue.__getTraceObject(); - final Object host = map.get("host"); - final Object port = map.get("port"); - - if (host != null) { - destinationId = (String) host; - if (port != null) { - endPoint = (String) host + ":" + port; - } else { - endPoint = (String) host; - } - } + String endPoint = null; + if (target instanceof MapTraceValue) { + final Map traceValue = ((MapTraceValue) target).__getTraceBindValue(); + if (traceValue != null) { + endPoint = (String) traceValue.get("endPoint"); } } trace.recordApi(getMethodDescriptor()); - trace.recordEndPoint(endPoint); - trace.recordDestinationId(destinationId); + trace.recordEndPoint(endPoint != null ? endPoint : "Unknown"); + trace.recordDestinationId(ServiceType.REDIS.toString()); trace.recordServiceType(ServiceType.REDIS); trace.recordException(throwable); trace.markAfterTime(); diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisPipelineConstructorInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisPipelineConstructorInterceptor.java index d9b3e401f..04f62ff7e 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisPipelineConstructorInterceptor.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisPipelineConstructorInterceptor.java @@ -5,12 +5,13 @@ import java.util.Map; import com.nhn.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; import com.nhn.pinpoint.bootstrap.interceptor.TargetClassLoader; -import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.ObjectTraceValue; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; import com.nhn.pinpoint.bootstrap.logging.PLogger; import com.nhn.pinpoint.bootstrap.logging.PLoggerFactory; /** - * Redis client(jedis) constructor interceptor + * Jedis Pipeline(redis client) constructor interceptor + * - trace endPoint * * @author jaehong.kim * @@ -26,22 +27,20 @@ public class JedisPipelineConstructorInterceptor implements SimpleAroundIntercep logger.beforeInterceptor(target, args); } - if (!(target instanceof ObjectTraceValue) || !(args[0] instanceof ObjectTraceValue)) { + // trace endPoint + if (!(target instanceof MapTraceValue) || !(args[0] instanceof MapTraceValue)) { return; } - // trace host & port - final ObjectTraceValue traceValue = (ObjectTraceValue) target; - final Map map = new HashMap(); - // first arg - redis.clients.jedis.Client - final ObjectTraceValue clientTraceValue = (ObjectTraceValue) args[0]; - if (clientTraceValue.__getTraceObject() != null) { - final Map clientMap = (Map) clientTraceValue.__getTraceObject(); - map.put("host", clientMap.get("host")); - map.put("port", clientMap.get("port")); + final Map clientTraceValue = ((MapTraceValue) args[0]).__getTraceBindValue(); + if (clientTraceValue == null) { + return; } - traceValue.__setTraceObject(map); + + final Map traceValue = new HashMap(); + traceValue.put("endPoint", clientTraceValue.get("endPoint")); + ((MapTraceValue) target).__setTraceBindValue(traceValue); } @Override diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisPipelineMethodInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisPipelineMethodInterceptor.java index b8da4bc19..a5a47c406 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisPipelineMethodInterceptor.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisPipelineMethodInterceptor.java @@ -5,11 +5,11 @@ import java.util.Map; import com.nhn.pinpoint.bootstrap.context.RecordableTrace; import com.nhn.pinpoint.bootstrap.interceptor.SpanEventSimpleAroundInterceptor; import com.nhn.pinpoint.bootstrap.interceptor.TargetClassLoader; -import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.ObjectTraceValue; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; import com.nhn.pinpoint.common.ServiceType; /** - * Redis client(jedis) method interceptor + * Jedis Pipeline(redis client) method interceptor * * @author jaehong.kim * @@ -27,32 +27,17 @@ public class JedisPipelineMethodInterceptor extends SpanEventSimpleAroundInterce @Override public void doInAfterTrace(RecordableTrace trace, Object target, Object[] args, Object result, Throwable throwable) { - trace.recordApi(getMethodDescriptor()); - - String destinationId = "Unknown"; - String endPoint = "Unknown"; - - if (target instanceof ObjectTraceValue) { - // find host & port - final ObjectTraceValue traceValue = (ObjectTraceValue) target; - if (traceValue.__getTraceObject() != null) { - final Map map = (Map) traceValue.__getTraceObject(); - final Object host = map.get("host"); - final Object port = map.get("port"); - - if (host != null) { - destinationId = (String) host; - if (port != null) { - endPoint = (String) host + ":" + port; - } else { - endPoint = (String) host; - } - } + String endPoint = null; + if (target instanceof MapTraceValue) { + final Map traceValue = ((MapTraceValue) target).__getTraceBindValue(); + if (traceValue != null) { + endPoint = (String) traceValue.get("endPoint"); } } - trace.recordEndPoint(endPoint); - trace.recordDestinationId(destinationId); + trace.recordApi(getMethodDescriptor()); + trace.recordEndPoint(endPoint != null ? endPoint : "Unknown"); + trace.recordDestinationId(ServiceType.REDIS.toString()); trace.recordServiceType(ServiceType.REDIS); trace.recordException(throwable); trace.markAfterTime(); diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisPipelineSetClientMethodInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisPipelineSetClientMethodInterceptor.java index ec46e2998..7bf7fa2c5 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisPipelineSetClientMethodInterceptor.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisPipelineSetClientMethodInterceptor.java @@ -5,12 +5,12 @@ import java.util.Map; import com.nhn.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; import com.nhn.pinpoint.bootstrap.interceptor.TargetClassLoader; -import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.ObjectTraceValue; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; import com.nhn.pinpoint.bootstrap.logging.PLogger; import com.nhn.pinpoint.bootstrap.logging.PLoggerFactory; /** - * Redis client(jedis) pipeline method interceptor + * Jedis pipeline (redis client) setClient method interceptor * * @author jaehong.kim * @@ -25,24 +25,20 @@ public class JedisPipelineSetClientMethodInterceptor implements SimpleAroundInte logger.beforeInterceptor(target, args); } - if (!(target instanceof ObjectTraceValue) || !(args[0] instanceof ObjectTraceValue)) { + // trace endPoint + if (!(target instanceof MapTraceValue) || !(args[0] instanceof MapTraceValue)) { return; } - // trace host & port - final ObjectTraceValue traceValue = (ObjectTraceValue) target; - final Map map = new HashMap(); - // first arg - redis.clients.jedis.Client - final ObjectTraceValue clientTraceValue = (ObjectTraceValue) args[0]; - if (clientTraceValue.__getTraceObject() != null) { - final Map clientMap = (Map) clientTraceValue.__getTraceObject(); - map.put("host", clientMap.get("host")); - map.put("port", clientMap.get("port")); + final Map clientTraceValue = ((MapTraceValue) args[0]).__getTraceBindValue(); + if (clientTraceValue == null) { + return; } - traceValue.__setTraceObject(map); - return; + final Map traceValue = new HashMap(); + traceValue.put("endPoint", clientTraceValue.get("endPoint")); + ((MapTraceValue) target).__setTraceBindValue(traceValue); } @Override diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterConstructorInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterConstructorInterceptor.java index c0731c2d9..e3ad9c824 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterConstructorInterceptor.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterConstructorInterceptor.java @@ -5,12 +5,12 @@ import java.util.Map; import com.nhn.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; import com.nhn.pinpoint.bootstrap.interceptor.TargetClassLoader; -import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.ObjectTraceValue; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; import com.nhn.pinpoint.bootstrap.logging.PLogger; import com.nhn.pinpoint.bootstrap.logging.PLoggerFactory; /** - * nBase-ARC client constructor interceptor + * RedisCluster(nBase-ARC client) constructor interceptor - trace endPoint * * @author jaehong.kim * @@ -26,26 +26,27 @@ public class RedisClusterConstructorInterceptor implements SimpleAroundIntercept logger.beforeInterceptor(target, args); } - if (!(target instanceof ObjectTraceValue)) { + if (!(target instanceof MapTraceValue)) { return; } - // trace host & port - final ObjectTraceValue traceValue = (ObjectTraceValue) target; - final Map map = new HashMap(); - + // trace endPoint // first arg - host + final StringBuilder endPoint = new StringBuilder(); if (args[0] instanceof String) { - map.put("host", args[0]); - // default port - map.put("port", 6379); + endPoint.append(args[0]); + // second arg - port + if (args.length >= 2 && args[1] instanceof Integer) { + endPoint.append(":").append(args[1]); + } else { + // default port + endPoint.append(":").append(6379); + } } - // second arg - port - if (args.length >= 2 && args[1] instanceof Integer) { - map.put("port", args[1]); - } - traceValue.__setTraceObject(map); + final Map traceValue = new HashMap(); + traceValue.put("endPoint", endPoint.toString()); + ((MapTraceValue) target).__setTraceBindValue(traceValue); } @Override diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterMethodInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterMethodInterceptor.java index 4b181b130..c7eebb3be 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterMethodInterceptor.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterMethodInterceptor.java @@ -5,11 +5,11 @@ import java.util.Map; import com.nhn.pinpoint.bootstrap.context.RecordableTrace; import com.nhn.pinpoint.bootstrap.interceptor.SpanEventSimpleAroundInterceptor; import com.nhn.pinpoint.bootstrap.interceptor.TargetClassLoader; -import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.ObjectTraceValue; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; import com.nhn.pinpoint.common.ServiceType; /** - * nBase-ARC client method interceptor + * RedisCluster(nBase-ARC client) method interceptor * * @author jaehong.kim * @@ -27,31 +27,19 @@ public class RedisClusterMethodInterceptor extends SpanEventSimpleAroundIntercep @Override public void doInAfterTrace(RecordableTrace trace, Object target, Object[] args, Object result, Throwable throwable) { - String destinationId = "Unknown"; - String endPoint = "Unknown"; - if (target instanceof ObjectTraceValue) { - // find host:port - final ObjectTraceValue traceValue = (ObjectTraceValue) target; - if (traceValue.__getTraceObject() != null && traceValue.__getTraceObject() instanceof Map) { - final Map map = (Map) traceValue.__getTraceObject(); - final Object host = map.get("host"); - final Object port = map.get("port"); - - if (host != null) { - destinationId = (String) host; - if (port != null) { - endPoint = (String) host + ":" + port; - } else { - endPoint = (String) host; - } - } + String destinationId = null; + String endPoint = null; + if (target instanceof MapTraceValue) { + final Map traceValue = ((MapTraceValue) target).__getTraceBindValue(); + if (traceValue != null) { + destinationId = (String) traceValue.get("destinationId"); + endPoint = (String) traceValue.get("endPoint"); } } - System.out.println("### method: " + getMethodDescriptor().getMethodName()); trace.recordApi(getMethodDescriptor()); - trace.recordEndPoint(endPoint); - trace.recordDestinationId(destinationId); + trace.recordEndPoint(endPoint != null ? endPoint : "Unknown"); + trace.recordDestinationId(destinationId != null ? destinationId : ServiceType.NBASE_ARC.toString()); trace.recordServiceType(ServiceType.NBASE_ARC); trace.recordException(throwable); trace.markAfterTime(); diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterPipelineConstructorInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterPipelineConstructorInterceptor.java index cb40c089f..eee4aa0f4 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterPipelineConstructorInterceptor.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterPipelineConstructorInterceptor.java @@ -5,13 +5,14 @@ import java.util.Map; import com.nhn.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; import com.nhn.pinpoint.bootstrap.interceptor.TargetClassLoader; -import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.ObjectTraceValue; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; import com.nhn.pinpoint.bootstrap.logging.PLogger; import com.nhn.pinpoint.bootstrap.logging.PLoggerFactory; import com.nhncorp.redis.cluster.gateway.GatewayServer; /** - * nBase-ARC client constructor interceptor + * RedisCluster pipeline(nBase-ARC client) constructor interceptor + * - trace destinationId & endPoint * * @author jaehong.kim * @@ -27,19 +28,25 @@ public class RedisClusterPipelineConstructorInterceptor implements SimpleAroundI logger.beforeInterceptor(target, args); } - if (!(target instanceof ObjectTraceValue)) { + if (!(target instanceof MapTraceValue)) { return; } - // trace host & port - final ObjectTraceValue traceValue = (ObjectTraceValue) target; - final Map map = new HashMap(); + // trace destinationId & endPoint + final Map traceValue = new HashMap(); // first arg : GatewayServer final GatewayServer server = (GatewayServer) args[0]; - map.put("host", server.getAddress().getHost()); - map.put("port", server.getAddress().getPort()); - traceValue.__setTraceObject(map); + traceValue.put("endPoint", server.getAddress().getHost() + ":" + server.getAddress().getPort()); + + if (args[0] instanceof MapTraceValue) { + final Map gatewayServerTraceValue = ((MapTraceValue) args[0]).__getTraceBindValue(); + if (gatewayServerTraceValue != null) { + traceValue.put("destinationId", gatewayServerTraceValue.get("destinationId")); + } + } + + ((MapTraceValue) target).__setTraceBindValue(traceValue); } @Override diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterPipelineMethodInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterPipelineMethodInterceptor.java index 1abb1f4e6..7c2bee674 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterPipelineMethodInterceptor.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterPipelineMethodInterceptor.java @@ -5,11 +5,11 @@ import java.util.Map; import com.nhn.pinpoint.bootstrap.context.RecordableTrace; import com.nhn.pinpoint.bootstrap.interceptor.SpanEventSimpleAroundInterceptor; import com.nhn.pinpoint.bootstrap.interceptor.TargetClassLoader; -import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.ObjectTraceValue; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; import com.nhn.pinpoint.common.ServiceType; /** - * nBase-ARC client method interceptor + * RedisCluster pipeline(nBase-ARC client) method interceptor * * @author jaehong.kim * @@ -27,31 +27,19 @@ public class RedisClusterPipelineMethodInterceptor extends SpanEventSimpleAround @Override public void doInAfterTrace(RecordableTrace trace, Object target, Object[] args, Object result, Throwable throwable) { - String destinationId = "Unknown"; - String endPoint = "Unknown"; - if (target instanceof ObjectTraceValue) { - // find host:port - final ObjectTraceValue traceValue = (ObjectTraceValue) target; - if (traceValue.__getTraceObject() != null && traceValue.__getTraceObject() instanceof Map) { - final Map map = (Map) traceValue.__getTraceObject(); - final Object host = map.get("host"); - final Object port = map.get("port"); - - if (host != null) { - destinationId = (String) host; - if (port != null) { - endPoint = (String) host + ":" + port; - } else { - endPoint = (String) host; - } - } + String destinationId = null; + String endPoint = null; + if (target instanceof MapTraceValue) { + final Map traceValue = ((MapTraceValue) target).__getTraceBindValue(); + if (traceValue != null) { + destinationId = (String) traceValue.get("destinationId"); + endPoint = (String) traceValue.get("endPoint"); } } - System.out.println("### method: " + getMethodDescriptor().getMethodName()); trace.recordApi(getMethodDescriptor()); - trace.recordEndPoint(endPoint); - trace.recordDestinationId(destinationId); + trace.recordEndPoint(endPoint != null ? endPoint : "Unknown"); + trace.recordDestinationId(destinationId != null ? destinationId : ServiceType.NBASE_ARC.toString()); trace.recordServiceType(ServiceType.NBASE_ARC); trace.recordException(throwable); trace.markAfterTime(); diff --git a/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisModifierTest.java b/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisModifierTest.java index 669e26a7c..b649b46ac 100644 --- a/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisModifierTest.java +++ b/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisModifierTest.java @@ -47,7 +47,7 @@ public class JedisModifierTest extends BasePinpointTest { SpanEventBo event = spanEvents.get(0); assertEquals(HOST + ":" + PORT, event.getEndPoint()); - assertEquals(HOST, event.getDestinationId()); + assertEquals("REDIS", event.getDestinationId()); assertEquals(ServiceType.REDIS, event.getServiceType()); assertNull(event.getExceptionMessage()); } diff --git a/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisPipelineModifierTest.java b/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisPipelineModifierTest.java index 37367157e..41f5a5106 100644 --- a/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisPipelineModifierTest.java +++ b/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisPipelineModifierTest.java @@ -49,7 +49,7 @@ public class JedisPipelineModifierTest extends BasePinpointTest { SpanEventBo event = spanEvents.get(0); assertEquals(HOST + ":" + PORT, event.getEndPoint()); - assertEquals(HOST, event.getDestinationId()); + assertEquals("REDIS", event.getDestinationId()); assertEquals(ServiceType.REDIS, event.getServiceType()); assertNull(event.getExceptionMessage()); } diff --git a/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterModifierTest.java b/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterModifierTest.java index b5d4576d3..d52d968bf 100644 --- a/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterModifierTest.java +++ b/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterModifierTest.java @@ -1,4 +1,3 @@ - package com.nhn.pinpoint.profiler.modifier.redis; import static org.junit.Assert.assertEquals; @@ -16,16 +15,21 @@ import com.nhn.pinpoint.common.ServiceType; import com.nhn.pinpoint.common.bo.SpanEventBo; import com.nhn.pinpoint.profiler.junit4.BasePinpointTest; import com.nhncorp.redis.cluster.RedisCluster; +import com.nhncorp.redis.cluster.gateway.GatewayClient; +import com.nhncorp.redis.cluster.gateway.GatewayConfig; public class RedisClusterModifierTest extends BasePinpointTest { private static final String HOST = "10.99.116.91"; private static final int PORT = 6390; + private static final String ZK_ADDRESS = "dev.xnbasearc.navercorp.com:2181"; + private static final String CLUSTER_NAME = "java_client_test"; private RedisCluster redis; @Before public void before() { redis = new RedisCluster(HOST, PORT); + } @Test @@ -36,12 +40,33 @@ public class RedisClusterModifierTest extends BasePinpointTest { assertEquals(1, spanEvents.size()); SpanEventBo event = spanEvents.get(0); - assertEquals(HOST, event.getDestinationId()); + assertEquals("NBASE_ARC", event.getDestinationId()); assertEquals(HOST + ":" + PORT, event.getEndPoint()); assertEquals(ServiceType.NBASE_ARC, event.getServiceType()); assertNull(event.getExceptionMessage()); } + @Test + public void traceDestinationId() { + GatewayConfig config = new GatewayConfig(); + config.setZkAddress(ZK_ADDRESS); + config.setClusterName(CLUSTER_NAME); + + GatewayClient client = new GatewayClient(config); + + client.get("foo"); + + final List spanEvents = getCurrentSpanEvents(); + SpanEventBo event = spanEvents.get(spanEvents.size() - 1); + + assertEquals(CLUSTER_NAME, event.getDestinationId()); + assertEquals(HOST + ":" + PORT, event.getEndPoint()); + assertEquals(ServiceType.NBASE_ARC, event.getServiceType()); + assertNull(event.getExceptionMessage()); + + client.destroy(); + } + @Test public void traceMethodThrowException() { // 에러가 발생한 경우에 대한 event 결과를 확인한다. diff --git a/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterPipelineModifierTest.java b/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterPipelineModifierTest.java index 079310696..e067e2e05 100644 --- a/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterPipelineModifierTest.java +++ b/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterPipelineModifierTest.java @@ -1,7 +1,6 @@ package com.nhn.pinpoint.profiler.modifier.redis; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import java.util.List; @@ -9,12 +8,10 @@ import java.util.List; import org.junit.Before; import org.junit.Test; -import redis.clients.jedis.exceptions.JedisDataException; import com.nhn.pinpoint.common.ServiceType; import com.nhn.pinpoint.common.bo.SpanEventBo; import com.nhn.pinpoint.profiler.junit4.BasePinpointTest; -import com.nhncorp.redis.cluster.RedisCluster; import com.nhncorp.redis.cluster.gateway.GatewayAddress; import com.nhncorp.redis.cluster.gateway.GatewayClient; import com.nhncorp.redis.cluster.gateway.GatewayConfig; @@ -24,6 +21,8 @@ import com.nhncorp.redis.cluster.pipeline.RedisClusterPipeline; public class RedisClusterPipelineModifierTest extends BasePinpointTest { private static final String HOST = "10.99.116.91"; private static final int PORT = 6390; + private static final String ZK_ADDRESS = "dev.xnbasearc.navercorp.com:2181"; + private static final String CLUSTER_NAME = "java_client_test"; private RedisClusterPipeline pipeline; @@ -46,10 +45,32 @@ public class RedisClusterPipelineModifierTest extends BasePinpointTest { assertEquals(2, spanEvents.size()); SpanEventBo event = spanEvents.get(0); - assertEquals(HOST, event.getDestinationId()); + assertEquals("NBASE_ARC", event.getDestinationId()); assertEquals(HOST + ":" + PORT, event.getEndPoint()); assertEquals(ServiceType.NBASE_ARC, event.getServiceType()); assertNull(event.getExceptionMessage()); } + + @Test + public void traceDestinationId() { + GatewayConfig config = new GatewayConfig(); + config.setZkAddress(ZK_ADDRESS); + config.setClusterName(CLUSTER_NAME); + GatewayClient client = new GatewayClient(config); + RedisClusterPipeline pipeline = client.pipeline(); + + pipeline.get("foo"); + pipeline.syncAndReturnAll(); + + final List spanEvents = getCurrentSpanEvents(); + SpanEventBo event = spanEvents.get(spanEvents.size() - 1); + + assertEquals(CLUSTER_NAME, event.getDestinationId()); + assertEquals(HOST + ":" + PORT, event.getEndPoint()); + assertEquals(ServiceType.NBASE_ARC, event.getServiceType()); + assertNull(event.getExceptionMessage()); + + client.destroy(); + } } \ No newline at end of file From 605755ca661a148692982489aa42ebd81961af49 Mon Sep 17 00:00:00 2001 From: Jaehong Kim Date: Wed, 24 Sep 2014 18:38:47 +0900 Subject: [PATCH 3/5] #7 need merge ... --- .../bootstrap/config/ProfilerConfig.java | 1 + .../interceptor/InterceptorRegistry.java | 275 +++++++++--------- .../interceptor/tracevalue/MapTraceValue.java | 14 + .../pinpoint/common/ServiceType.java | 3 +- .../modifier/DefaultModifierRegistry.java | 4 + .../modifier/redis/GatewayModifier.java | 68 +++++ .../modifier/redis/GatewayServerModifier.java | 66 +++++ .../modifier/redis/JedisClientModifier.java | 6 +- .../modifier/redis/JedisModifier.java | 4 +- .../modifier/redis/JedisPipelineModifier.java | 4 +- .../modifier/redis/RedisClusterModifier.java | 4 +- .../redis/RedisClusterPipelineModifier.java | 4 +- .../GatewayConstructorInterceptor.java | 56 ++++ .../interceptor/GatewayMethodInterceptor.java | 46 +++ .../GatewayServerMethodInterceptor.java | 38 +++ .../JedisClientConstructorInterceptor.java | 33 ++- .../JedisConstructorInterceptor.java | 46 +-- .../interceptor/JedisMethodInterceptor.java | 31 +- .../JedisPipelineConstructorInterceptor.java | 25 +- .../JedisPipelineMethodInterceptor.java | 35 +-- ...disPipelineSetClientMethodInterceptor.java | 24 +- .../RedisClusterConstructorInterceptor.java | 31 +- .../RedisClusterMethodInterceptor.java | 34 +-- ...ClusterPipelineConstructorInterceptor.java | 25 +- ...RedisClusterPipelineMethodInterceptor.java | 34 +-- .../modifier/redis/JedisModifierTest.java | 2 +- .../redis/JedisPipelineModifierTest.java | 2 +- .../redis/RedisClusterModifierTest.java | 29 +- .../RedisClusterPipelineModifierTest.java | 29 +- 29 files changed, 637 insertions(+), 336 deletions(-) create mode 100644 bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/tracevalue/MapTraceValue.java create mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/GatewayModifier.java create mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/GatewayServerModifier.java create mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/GatewayConstructorInterceptor.java create mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/GatewayMethodInterceptor.java create mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/GatewayServerMethodInterceptor.java diff --git a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/config/ProfilerConfig.java b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/config/ProfilerConfig.java index 13fd3cc44..7056c516c 100644 --- a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/config/ProfilerConfig.java +++ b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/config/ProfilerConfig.java @@ -579,6 +579,7 @@ public class ProfilerConfig { // redis & nBase-ARC this.redis = readBoolean(prop, "profiler.redis", true); this.nBaseArc = readBoolean(prop, "profiler.nBaseArc", true); + // // FIXME 임시용, line game netty configuration diff --git a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/InterceptorRegistry.java b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/InterceptorRegistry.java index 7e6448560..71ea7e06b 100644 --- a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/InterceptorRegistry.java +++ b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/InterceptorRegistry.java @@ -1,136 +1,139 @@ -package com.nhn.pinpoint.bootstrap.interceptor; - -import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * @author emeroad - */ -public class InterceptorRegistry { - - private static final LoggingInterceptor DUMMY = new LoggingInterceptor("com.nhn.pinpoint.profiler.interceptor.DUMMY"); - - public static final InterceptorRegistry REGISTRY = new InterceptorRegistry(); - - private final static int DEFAULT_MAX = 1024; - private final int max; - - private final AtomicInteger id = new AtomicInteger(0); - private final StaticAroundInterceptor[] index; - private final SimpleAroundInterceptor[] simpleIndex; - -// private final ConcurrentMap nameIndex = new ConcurrentHashMap(); - - public InterceptorRegistry() { - this(DEFAULT_MAX); - } - - InterceptorRegistry(int max) { - this.max = max; - this.index = new StaticAroundInterceptor[max]; - this.simpleIndex = new SimpleAroundInterceptor[max]; - } - - - public int addInterceptor0(StaticAroundInterceptor interceptor) { - if (interceptor == null) { - return -1; - } - int newId = nextId(); - if (newId > max) { - throw new IndexOutOfBoundsException("size=" + index.length + " id=" + id); - } - - this.index[newId] = interceptor; -// this.nameIndex.put(interceptor.getClass().getName(), newId); - return newId; - } - - private int nextId() { - return id.getAndIncrement(); - } - - int addSimpleInterceptor0(SimpleAroundInterceptor interceptor) { - if (interceptor == null) { - return -1; - } - int newId = nextId(); - if (newId > max) { - throw new IndexOutOfBoundsException("size=" + index.length + " id=" + id); - } - - this.simpleIndex[newId] = interceptor; -// this.nameIndex.put(interceptor.getClass().getName(), newId); - return newId; - } - - public StaticAroundInterceptor getInterceptor0(int key) { - StaticAroundInterceptor interceptor = index[key]; - if (interceptor == null) { - // 로직이 잘못되었을 경우 에러가 발생하지 않도록 더미를 리턴. - return DUMMY; - } - return interceptor; - } - - SimpleAroundInterceptor getSimpleInterceptor0(int key) { - SimpleAroundInterceptor interceptor = simpleIndex[key]; - if (interceptor == null) { - // 로직이 잘못되었을경우 에러가 발생하지 않도록 더미를 리턴. - return DUMMY; - } - return interceptor; - } - -// SimpleAroundInterceptor getInterceptor0(int key) { -// StaticAfterInterceptor interceptor = index[key]; -// if (interceptor == null) { -// // 로직이 잘못되었을 경우 에러가 발생하지 않도록 더미를 리턴. -// return DUMMY; -// } -// return interceptor; -// } -// public Interceptor findInterceptor0(String interceptorName) { -// Integer indexNumber = this.nameIndex.get(interceptorName); -// if (indexNumber != null) { -// return index[indexNumber]; -// } -// return null; -// } - - public static int addInterceptor(StaticAroundInterceptor interceptor) { - return REGISTRY.addInterceptor0(interceptor); - } - - public static StaticAroundInterceptor getInterceptor(int key) { - return REGISTRY.getInterceptor0(key); - } - - - public static Interceptor findInterceptor(int key) { - SimpleAroundInterceptor simpleInterceptor = REGISTRY.getSimpleInterceptor0(key); - if (simpleInterceptor != null) { - return simpleInterceptor; - } - StaticAroundInterceptor staticAroundInterceptor = REGISTRY.getInterceptor0(key); - if (staticAroundInterceptor != null) { - return staticAroundInterceptor; - } - Logger logger = Logger.getLogger(InterceptorRegistry.class.getName()); - if (logger.isLoggable(Level.WARNING)) { - logger.warning("interceptor not found. id:" + key); - } - return DUMMY; - } - - public static int addSimpleInterceptor(SimpleAroundInterceptor interceptor) { - return REGISTRY.addSimpleInterceptor0(interceptor); - } - - - public static SimpleAroundInterceptor getSimpleInterceptor(int key) { - return REGISTRY.getSimpleInterceptor0(key); - } - -} +package com.nhn.pinpoint.bootstrap.interceptor; + +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * @author emeroad + */ +public class InterceptorRegistry { + + private static final LoggingInterceptor DUMMY = new LoggingInterceptor("com.nhn.pinpoint.profiler.interceptor.DUMMY"); + + public static final InterceptorRegistry REGISTRY = new InterceptorRegistry(); + + private final static int DEFAULT_MAX = 4096; + private final int max; + + private final AtomicInteger id = new AtomicInteger(0); + private final StaticAroundInterceptor[] index; + private final SimpleAroundInterceptor[] simpleIndex; + +// private final ConcurrentMap nameIndex = new ConcurrentHashMap(); + + public InterceptorRegistry() { + this(DEFAULT_MAX); + } + + InterceptorRegistry(int max) { + this.max = max; + this.index = new StaticAroundInterceptor[max]; + this.simpleIndex = new SimpleAroundInterceptor[max]; + } + + + public int addInterceptor0(StaticAroundInterceptor interceptor) { + if (interceptor == null) { + return -1; + } + int newId = nextId(); + + if (newId > max) { + throw new IndexOutOfBoundsException("size=" + index.length + ", id=" + id); + } + + this.index[newId] = interceptor; +// this.nameIndex.put(interceptor.getClass().getName(), newId); + return newId; + } + + private int nextId() { + int number = id.getAndIncrement(); + + return number; + } + + int addSimpleInterceptor0(SimpleAroundInterceptor interceptor) { + if (interceptor == null) { + return -1; + } + int newId = nextId(); + if (newId >= max) { + throw new IndexOutOfBoundsException("size=" + index.length + ", id=" + id); + } + + this.simpleIndex[newId] = interceptor; +// this.nameIndex.put(interceptor.getClass().getName(), newId); + return newId; + } + + public StaticAroundInterceptor getInterceptor0(int key) { + StaticAroundInterceptor interceptor = index[key]; + if (interceptor == null) { + // 로직이 잘못되었을 경우 에러가 발생하지 않도록 더미를 리턴. + return DUMMY; + } + return interceptor; + } + + SimpleAroundInterceptor getSimpleInterceptor0(int key) { + SimpleAroundInterceptor interceptor = simpleIndex[key]; + if (interceptor == null) { + // 로직이 잘못되었을경우 에러가 발생하지 않도록 더미를 리턴. + return DUMMY; + } + return interceptor; + } + +// SimpleAroundInterceptor getInterceptor0(int key) { +// StaticAfterInterceptor interceptor = index[key]; +// if (interceptor == null) { +// // 로직이 잘못되었을 경우 에러가 발생하지 않도록 더미를 리턴. +// return DUMMY; +// } +// return interceptor; +// } +// public Interceptor findInterceptor0(String interceptorName) { +// Integer indexNumber = this.nameIndex.get(interceptorName); +// if (indexNumber != null) { +// return index[indexNumber]; +// } +// return null; +// } + + public static int addInterceptor(StaticAroundInterceptor interceptor) { + return REGISTRY.addInterceptor0(interceptor); + } + + public static StaticAroundInterceptor getInterceptor(int key) { + return REGISTRY.getInterceptor0(key); + } + + + public static Interceptor findInterceptor(int key) { + SimpleAroundInterceptor simpleInterceptor = REGISTRY.getSimpleInterceptor0(key); + if (simpleInterceptor != null) { + return simpleInterceptor; + } + StaticAroundInterceptor staticAroundInterceptor = REGISTRY.getInterceptor0(key); + if (staticAroundInterceptor != null) { + return staticAroundInterceptor; + } + Logger logger = Logger.getLogger(InterceptorRegistry.class.getName()); + if (logger.isLoggable(Level.WARNING)) { + logger.warning("interceptor not found. id:" + key); + } + return DUMMY; + } + + public static int addSimpleInterceptor(SimpleAroundInterceptor interceptor) { + return REGISTRY.addSimpleInterceptor0(interceptor); + } + + + public static SimpleAroundInterceptor getSimpleInterceptor(int key) { + return REGISTRY.getSimpleInterceptor0(key); + } + +} diff --git a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/tracevalue/MapTraceValue.java b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/tracevalue/MapTraceValue.java new file mode 100644 index 000000000..a4af1a81e --- /dev/null +++ b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/tracevalue/MapTraceValue.java @@ -0,0 +1,14 @@ +package com.nhn.pinpoint.bootstrap.interceptor.tracevalue; + +import java.util.Map; + +/** + * + * @author jaehong.kim + * + */ +public interface MapTraceValue extends TraceValue { + void __setTraceBindValue(Map value); + + Map __getTraceBindValue(); +} diff --git a/commons/src/main/java/com/navercorp/pinpoint/common/ServiceType.java b/commons/src/main/java/com/navercorp/pinpoint/common/ServiceType.java index 63bd8ff17..6b2de4155 100644 --- a/commons/src/main/java/com/navercorp/pinpoint/common/ServiceType.java +++ b/commons/src/main/java/com/navercorp/pinpoint/common/ServiceType.java @@ -111,9 +111,10 @@ public enum ServiceType { /** * Redis & nBase-ARC */ - REDIS((short) 8200, "REDIS", TERMINAL, RECORD_STATISTICS, INCLUDE_DESTINATION, FAST_SCHEMA), + REDIS((short) 8200, "REDIS", TERMINAL, RECORD_STATISTICS, !INCLUDE_DESTINATION, FAST_SCHEMA), NBASE_ARC((short) 8250, "NBASE_ARC", TERMINAL, RECORD_STATISTICS, INCLUDE_DESTINATION, FAST_SCHEMA), + /** * Connector, Client */ diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/DefaultModifierRegistry.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/DefaultModifierRegistry.java index 86e7dd841..a1f1fb702 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/DefaultModifierRegistry.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/DefaultModifierRegistry.java @@ -59,6 +59,8 @@ import com.nhn.pinpoint.profiler.modifier.orm.ibatis.SqlMapClientImplModifier; import com.nhn.pinpoint.profiler.modifier.orm.ibatis.SqlMapSessionImplModifier; import com.nhn.pinpoint.profiler.modifier.orm.mybatis.DefaultSqlSessionModifier; import com.nhn.pinpoint.profiler.modifier.orm.mybatis.SqlSessionTemplateModifier; +import com.nhn.pinpoint.profiler.modifier.redis.GatewayModifier; +import com.nhn.pinpoint.profiler.modifier.redis.GatewayServerModifier; import com.nhn.pinpoint.profiler.modifier.redis.JedisClientModifier; import com.nhn.pinpoint.profiler.modifier.redis.JedisModifier; import com.nhn.pinpoint.profiler.modifier.redis.JedisPipelineModifier; @@ -391,6 +393,8 @@ public class DefaultModifierRegistry implements ModifierRegistry { public void addNBaseArcSupport() { if (profilerConfig.isNBaseArcEnabled()) { + addModifier(new GatewayModifier(byteCodeInstrumentor, agent)); + addModifier(new GatewayServerModifier(byteCodeInstrumentor, agent)); addModifier(new RedisClusterModifier(byteCodeInstrumentor, agent)); addModifier(new RedisClusterPipelineModifier(byteCodeInstrumentor, agent)); } diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/GatewayModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/GatewayModifier.java new file mode 100644 index 000000000..fec26e844 --- /dev/null +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/GatewayModifier.java @@ -0,0 +1,68 @@ +package com.nhn.pinpoint.profiler.modifier.redis; + +import java.security.ProtectionDomain; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.nhn.pinpoint.bootstrap.Agent; +import com.nhn.pinpoint.bootstrap.interceptor.Interceptor; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; +import com.nhn.pinpoint.profiler.interceptor.bci.ByteCodeInstrumentor; +import com.nhn.pinpoint.profiler.interceptor.bci.InstrumentClass; +import com.nhn.pinpoint.profiler.interceptor.bci.Method; +import com.nhn.pinpoint.profiler.modifier.AbstractModifier; + +/** + * Gateway(nBase-ARC client) modifier + * + * @author jaehong.kim + * + */ +public class GatewayModifier extends AbstractModifier { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + public GatewayModifier(ByteCodeInstrumentor byteCodeInstrumentor, Agent agent) { + super(byteCodeInstrumentor, agent); + } + + @Override + public String getTargetClass() { + return "com/nhncorp/redis/cluster/gateway/Gateway"; + } + + @Override + public byte[] modify(ClassLoader classLoader, String className, ProtectionDomain protectedDomain, byte[] classFileBuffer) { + if (logger.isInfoEnabled()) { + logger.info("Modifing. {}", className); + } + + try { + final InstrumentClass instrumentClass = byteCodeInstrumentor.getClass(className); + + // trace destinationId + instrumentClass.addTraceValue(MapTraceValue.class); + final Interceptor constructorInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.nhn.pinpoint.profiler.modifier.redis.interceptor.GatewayConstructorInterceptor"); + instrumentClass.addConstructorInterceptor(new String[] { "com.nhncorp.redis.cluster.gateway.GatewayConfig" }, constructorInterceptor); + + // method + final List declaredMethods = instrumentClass.getDeclaredMethods(); + for (Method method : declaredMethods) { + if (method.getMethodName().equals("getServer")) { + final Interceptor methodInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.nhn.pinpoint.profiler.modifier.redis.interceptor.GatewayMethodInterceptor"); + instrumentClass.addInterceptor(method.getMethodName(), method.getMethodParams(), methodInterceptor); + } + } + + return instrumentClass.toBytecode(); + } catch (Exception e) { + if (logger.isWarnEnabled()) { + logger.warn("redis.GatewayModifier(nBase-ARC) fail. Target class is " + getTargetClass() + ", Caused " + e.getMessage(), e); + } + } + + return null; + } +} \ No newline at end of file diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/GatewayServerModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/GatewayServerModifier.java new file mode 100644 index 000000000..9d423cb26 --- /dev/null +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/GatewayServerModifier.java @@ -0,0 +1,66 @@ +package com.nhn.pinpoint.profiler.modifier.redis; + +import java.security.ProtectionDomain; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.nhn.pinpoint.bootstrap.Agent; +import com.nhn.pinpoint.bootstrap.interceptor.Interceptor; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; +import com.nhn.pinpoint.profiler.interceptor.bci.ByteCodeInstrumentor; +import com.nhn.pinpoint.profiler.interceptor.bci.InstrumentClass; +import com.nhn.pinpoint.profiler.interceptor.bci.Method; +import com.nhn.pinpoint.profiler.modifier.AbstractModifier; + +/** + * RedisCluster(nBase-ARC client) modifier + * + * @author jaehong.kim + * + */ +public class GatewayServerModifier extends AbstractModifier { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + public GatewayServerModifier(ByteCodeInstrumentor byteCodeInstrumentor, Agent agent) { + super(byteCodeInstrumentor, agent); + } + + @Override + public String getTargetClass() { + return "com/nhncorp/redis/cluster/gateway/GatewayServer"; + } + + @Override + public byte[] modify(ClassLoader classLoader, String className, ProtectionDomain protectedDomain, byte[] classFileBuffer) { + if (logger.isInfoEnabled()) { + logger.info("Modifing. {}", className); + } + + try { + final InstrumentClass instrumentClass = byteCodeInstrumentor.getClass(className); + + // trace host & port + instrumentClass.addTraceValue(MapTraceValue.class); + + // method + final List declaredMethods = instrumentClass.getDeclaredMethods(); + for (Method method : declaredMethods) { + if (method.getMethodName().equals("getResource")) { + final Interceptor methodInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.nhn.pinpoint.profiler.modifier.redis.interceptor.GatewayServerMethodInterceptor"); + instrumentClass.addInterceptor(method.getMethodName(), method.getMethodParams(), methodInterceptor); + } + } + + return instrumentClass.toBytecode(); + } catch (Exception e) { + if (logger.isWarnEnabled()) { + logger.warn("redis.GatewayModifier(nBase-ARC) fail. Target class is " + getTargetClass() + ", Caused " + e.getMessage(), e); + } + } + + return null; + } +} \ No newline at end of file diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisClientModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisClientModifier.java index 18c76ff10..97533c907 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisClientModifier.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisClientModifier.java @@ -7,7 +7,7 @@ import org.slf4j.LoggerFactory; import com.nhn.pinpoint.bootstrap.Agent; import com.nhn.pinpoint.bootstrap.interceptor.Interceptor; -import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.ObjectTraceValue; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; import com.nhn.pinpoint.profiler.interceptor.bci.ByteCodeInstrumentor; import com.nhn.pinpoint.profiler.interceptor.bci.InstrumentClass; import com.nhn.pinpoint.profiler.modifier.AbstractModifier; @@ -40,8 +40,8 @@ public class JedisClientModifier extends AbstractModifier { try { final InstrumentClass instrumentClass = byteCodeInstrumentor.getClass(className); - // trace host & port - instrumentClass.addTraceValue(ObjectTraceValue.class); + // trace endPoint + instrumentClass.addTraceValue(MapTraceValue.class); final Interceptor constructorInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.nhn.pinpoint.profiler.modifier.redis.interceptor.JedisClientConstructorInterceptor"); instrumentClass.addConstructorInterceptor(new String[] { "java.lang.String" }, constructorInterceptor); instrumentClass.addConstructorInterceptor(new String[] { "java.lang.String", "int" }, constructorInterceptor); diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisModifier.java index cc9bc54b7..5826770e0 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisModifier.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisModifier.java @@ -8,7 +8,7 @@ import org.slf4j.LoggerFactory; import com.nhn.pinpoint.bootstrap.Agent; import com.nhn.pinpoint.bootstrap.interceptor.Interceptor; -import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.ObjectTraceValue; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; import com.nhn.pinpoint.profiler.interceptor.bci.ByteCodeInstrumentor; import com.nhn.pinpoint.profiler.interceptor.bci.InstrumentClass; import com.nhn.pinpoint.profiler.interceptor.bci.Method; @@ -45,7 +45,7 @@ public class JedisModifier extends AbstractModifier { final InstrumentClass instrumentClass = byteCodeInstrumentor.getClass(className); // trace host & port - instrumentClass.addTraceValue(ObjectTraceValue.class); + instrumentClass.addTraceValue(MapTraceValue.class); final Interceptor constructorInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.nhn.pinpoint.profiler.modifier.redis.interceptor.JedisConstructorInterceptor"); instrumentClass.addConstructorInterceptor(new String[] { "java.lang.String" }, constructorInterceptor); try { diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisPipelineModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisPipelineModifier.java index 7b098759f..e1356efb6 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisPipelineModifier.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisPipelineModifier.java @@ -8,7 +8,7 @@ import org.slf4j.LoggerFactory; import com.nhn.pinpoint.bootstrap.Agent; import com.nhn.pinpoint.bootstrap.interceptor.Interceptor; -import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.ObjectTraceValue; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; import com.nhn.pinpoint.profiler.interceptor.bci.ByteCodeInstrumentor; import com.nhn.pinpoint.profiler.interceptor.bci.InstrumentClass; import com.nhn.pinpoint.profiler.interceptor.bci.Method; @@ -45,7 +45,7 @@ public class JedisPipelineModifier extends AbstractModifier { final InstrumentClass instrumentClass = byteCodeInstrumentor.getClass(className); // trace host & port - instrumentClass.addTraceValue(ObjectTraceValue.class); + instrumentClass.addTraceValue(MapTraceValue.class); final Interceptor constructorInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.nhn.pinpoint.profiler.modifier.redis.interceptor.JedisPipelineConstructorInterceptor"); try { // jedis 1.x diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterModifier.java index e63c14c57..7f899d22f 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterModifier.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterModifier.java @@ -8,7 +8,7 @@ import org.slf4j.LoggerFactory; import com.nhn.pinpoint.bootstrap.Agent; import com.nhn.pinpoint.bootstrap.interceptor.Interceptor; -import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.ObjectTraceValue; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; import com.nhn.pinpoint.profiler.interceptor.bci.ByteCodeInstrumentor; import com.nhn.pinpoint.profiler.interceptor.bci.InstrumentClass; import com.nhn.pinpoint.profiler.interceptor.bci.Method; @@ -45,7 +45,7 @@ public class RedisClusterModifier extends AbstractModifier { final InstrumentClass instrumentClass = byteCodeInstrumentor.getClass(className); // trace host & port - instrumentClass.addTraceValue(ObjectTraceValue.class); + instrumentClass.addTraceValue(MapTraceValue.class); final Interceptor constructorInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.nhn.pinpoint.profiler.modifier.redis.interceptor.RedisClusterConstructorInterceptor"); instrumentClass.addConstructorInterceptor(new String[] { "java.lang.String" }, constructorInterceptor); instrumentClass.addConstructorInterceptor(new String[] { "java.lang.String", "int" }, constructorInterceptor); diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterPipelineModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterPipelineModifier.java index 7ba721789..cb84f6132 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterPipelineModifier.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterPipelineModifier.java @@ -8,7 +8,7 @@ import org.slf4j.LoggerFactory; import com.nhn.pinpoint.bootstrap.Agent; import com.nhn.pinpoint.bootstrap.interceptor.Interceptor; -import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.ObjectTraceValue; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; import com.nhn.pinpoint.profiler.interceptor.bci.ByteCodeInstrumentor; import com.nhn.pinpoint.profiler.interceptor.bci.InstrumentClass; import com.nhn.pinpoint.profiler.interceptor.bci.Method; @@ -45,7 +45,7 @@ public class RedisClusterPipelineModifier extends AbstractModifier { final InstrumentClass instrumentClass = byteCodeInstrumentor.getClass(className); // trace host & port - instrumentClass.addTraceValue(ObjectTraceValue.class); + instrumentClass.addTraceValue(MapTraceValue.class); final Interceptor constructorInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.nhn.pinpoint.profiler.modifier.redis.interceptor.RedisClusterPipelineConstructorInterceptor"); try { instrumentClass.addConstructorInterceptor(new String[] { "com.nhncorp.redis.cluster.gateway.GatewayServer" }, constructorInterceptor); diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/GatewayConstructorInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/GatewayConstructorInterceptor.java new file mode 100644 index 000000000..f421f164c --- /dev/null +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/GatewayConstructorInterceptor.java @@ -0,0 +1,56 @@ +package com.nhn.pinpoint.profiler.modifier.redis.interceptor; + +import java.util.HashMap; +import java.util.Map; + +import com.nhn.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; +import com.nhn.pinpoint.bootstrap.interceptor.TargetClassLoader; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; +import com.nhn.pinpoint.bootstrap.logging.PLogger; +import com.nhn.pinpoint.bootstrap.logging.PLoggerFactory; +import com.nhncorp.redis.cluster.gateway.GatewayConfig; + +/** + * Gateway(nBase-ARC client) constructor interceptor + * - trace destinationId + * + * @author jaehong.kim + * + */ +public class GatewayConstructorInterceptor implements SimpleAroundInterceptor, TargetClassLoader { + + private final PLogger logger = PLoggerFactory.getLogger(this.getClass()); + private final boolean isDebug = logger.isDebugEnabled(); + + @Override + public void before(Object target, Object[] args) { + if (isDebug) { + logger.beforeInterceptor(target, args); + } + + if (!(target instanceof MapTraceValue)) { + return; + } + + final GatewayConfig config = (GatewayConfig) args[0]; + final Map traceValue = new HashMap(); + try { + if (config.getDomainAddress() != null) { + traceValue.put("destinationId", config.getDomainAddress()); + } else if (config.getIpAddress() != null) { + traceValue.put("destinationId", config.getIpAddress()); + } else if (config.getClusterName() != null) { + // over 1.1.x + traceValue.put("destinationId", config.getClusterName()); + } + } catch (Exception ignored) { + // backward compatibility error + } + + ((MapTraceValue) target).__setTraceBindValue(traceValue); + } + + @Override + public void after(Object target, Object[] args, Object result, Throwable throwable) { + } +} \ No newline at end of file diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/GatewayMethodInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/GatewayMethodInterceptor.java new file mode 100644 index 000000000..6601f588d --- /dev/null +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/GatewayMethodInterceptor.java @@ -0,0 +1,46 @@ +package com.nhn.pinpoint.profiler.modifier.redis.interceptor; + +import java.util.HashMap; +import java.util.Map; + +import com.nhn.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; +import com.nhn.pinpoint.bootstrap.interceptor.TargetClassLoader; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; +import com.nhn.pinpoint.bootstrap.logging.PLogger; +import com.nhn.pinpoint.bootstrap.logging.PLoggerFactory; + +/** + * Gateway(nBase-ARC client) getServer() method interceptor + * - trace destinationId + * + * @author jaehong.kim + * + */ +public class GatewayMethodInterceptor implements SimpleAroundInterceptor, TargetClassLoader { + private final PLogger logger = PLoggerFactory.getLogger(this.getClass()); + private final boolean isDebug = logger.isDebugEnabled(); + + @Override + public void before(Object target, Object[] args) { + } + + @Override + public void after(Object target, Object[] args, Object result, Throwable throwable) { + if (isDebug) { + logger.beforeInterceptor(target, args); + } + + if (!(target instanceof MapTraceValue) || result == null || !(result instanceof MapTraceValue)) { + return; + } + + // result - GatewayServer + final Map gatewayTraceValue = ((MapTraceValue) target).__getTraceBindValue(); + if (gatewayTraceValue != null) { + final Map traceValue = new HashMap(); + // copy to destinationId + traceValue.put("destinationId", gatewayTraceValue.get("destinationId")); + ((MapTraceValue) result).__setTraceBindValue(traceValue); + } + } +} \ No newline at end of file diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/GatewayServerMethodInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/GatewayServerMethodInterceptor.java new file mode 100644 index 000000000..59397aacc --- /dev/null +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/GatewayServerMethodInterceptor.java @@ -0,0 +1,38 @@ +package com.nhn.pinpoint.profiler.modifier.redis.interceptor; + +import java.util.Map; + +import com.nhn.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; +import com.nhn.pinpoint.bootstrap.interceptor.TargetClassLoader; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; + +/** + * GatewayServer(nBase-ARC client) getResource() method interceptor + * - trace destinationId + * + * @author jaehong.kim + * + */ +public class GatewayServerMethodInterceptor implements SimpleAroundInterceptor, TargetClassLoader { + + @Override + public void before(Object target, Object[] args) { + } + + @Override + public void after(Object target, Object[] args, Object result, Throwable throwable) { + if (!(target instanceof MapTraceValue) || result == null || !(result instanceof MapTraceValue)) { + return; + } + + // result - RedisCluster + final Map gatewayServerTraceValue = ((MapTraceValue) target).__getTraceBindValue(); + if (gatewayServerTraceValue != null) { + final Map traceValue = ((MapTraceValue) result).__getTraceBindValue(); + // copy to destinationId + if (traceValue != null) { + traceValue.put("destinationId", gatewayServerTraceValue.get("destinationId")); + } + } + } +} \ No newline at end of file diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisClientConstructorInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisClientConstructorInterceptor.java index fd71df1d7..921f04daf 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisClientConstructorInterceptor.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisClientConstructorInterceptor.java @@ -5,12 +5,13 @@ import java.util.Map; import com.nhn.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; import com.nhn.pinpoint.bootstrap.interceptor.TargetClassLoader; -import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.ObjectTraceValue; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; import com.nhn.pinpoint.bootstrap.logging.PLogger; import com.nhn.pinpoint.bootstrap.logging.PLoggerFactory; /** - * Redis client(jedis) constructor interceptor + * Jedis client(redis client) constructor interceptor + * - trace endPoint * * @author jaehong.kim * @@ -26,26 +27,28 @@ public class JedisClientConstructorInterceptor implements SimpleAroundIntercepto logger.beforeInterceptor(target, args); } - if (!(target instanceof ObjectTraceValue)) { + // trace endPoint + if (!(target instanceof MapTraceValue)) { return; } - // trace host & port - final ObjectTraceValue traceValue = (ObjectTraceValue) target; - final Map map = new HashMap(); + final StringBuilder endPoint = new StringBuilder(); // first arg - host if (args[0] instanceof String) { - map.put("host", args[0]); - // default port - map.put("port", 6379); + endPoint.append(args[0]); + + // second arg - port + if (args.length >= 2 && args[1] instanceof Integer) { + endPoint.append(":").append(args[1]); + } else { + // default port + endPoint.append(":").append(6379); + } } - // second arg - port - if (args.length >= 2 && args[1] instanceof Integer) { - map.put("port", args[1]); - } - - traceValue.__setTraceObject(map); + final Map traceValue = new HashMap(); + traceValue.put("endPoint", endPoint.toString()); + ((MapTraceValue) target).__setTraceBindValue(traceValue); } @Override diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisConstructorInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisConstructorInterceptor.java index 839ad747a..ee433b61f 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisConstructorInterceptor.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisConstructorInterceptor.java @@ -8,12 +8,13 @@ import redis.clients.jedis.JedisShardInfo; import com.nhn.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; import com.nhn.pinpoint.bootstrap.interceptor.TargetClassLoader; -import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.ObjectTraceValue; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; import com.nhn.pinpoint.bootstrap.logging.PLogger; import com.nhn.pinpoint.bootstrap.logging.PLoggerFactory; /** - * Redis client(jedis) constructor interceptor + * Jedis (redis client) constructor interceptor + * - trace endPoint * * @author jaehong.kim * @@ -22,45 +23,48 @@ public class JedisConstructorInterceptor implements SimpleAroundInterceptor, Tar private final PLogger logger = PLoggerFactory.getLogger(this.getClass()); private final boolean isDebug = logger.isDebugEnabled(); - + @Override public void before(Object target, Object[] args) { if (isDebug) { logger.beforeInterceptor(target, args); } - if (!(target instanceof ObjectTraceValue)) { + // trace endPoint + if (!(target instanceof MapTraceValue)) { return; } - // trace host & port - final ObjectTraceValue traceValue = (ObjectTraceValue) target; - final Map map = new HashMap(); - + final StringBuilder endPoint = new StringBuilder(); try { // first arg - host if (args[0] instanceof String) { - map.put("host", args[0]); - // default port - map.put("port", 6379); + endPoint.append(args[0]); + // second arg - port + if (args.length >= 2 && args[1] instanceof Integer) { + endPoint.append(":").append(args[1]); + } else { + // default port + endPoint.append(":").append(6379); + } } else if (args[0] instanceof URI) { final URI uri = (URI) args[0]; - map.put("host", uri.getHost()); - map.put("port", uri.getPort()); + endPoint.append(uri.getHost()); + endPoint.append(":"); + endPoint.append(uri.getPort()); } else if (args[0] instanceof JedisShardInfo) { final JedisShardInfo info = (JedisShardInfo) args[0]; - map.put("host", info.getHost()); - map.put("port", info.getPort()); + endPoint.append(info.getHost()); + endPoint.append(":"); + endPoint.append(info.getPort()); } - - // second arg - port - if (args.length >= 2 && args[1] instanceof Integer) { - map.put("port", args[1]); - } - traceValue.__setTraceObject(map); } catch (Exception ignored) { // expect 'class not found exception - JedisShardInfo' } + + final Map traceValue = new HashMap(); + traceValue.put("endPoint", endPoint.toString()); + ((MapTraceValue) target).__setTraceBindValue(traceValue); } @Override diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisMethodInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisMethodInterceptor.java index 76434b827..2f1e43136 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisMethodInterceptor.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisMethodInterceptor.java @@ -5,11 +5,11 @@ import java.util.Map; import com.nhn.pinpoint.bootstrap.context.RecordableTrace; import com.nhn.pinpoint.bootstrap.interceptor.SpanEventSimpleAroundInterceptor; import com.nhn.pinpoint.bootstrap.interceptor.TargetClassLoader; -import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.ObjectTraceValue; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; import com.nhn.pinpoint.common.ServiceType; /** - * Redis client(jedis) method interceptor + * Jedis (redis client) method interceptor * * @author jaehong.kim * @@ -27,30 +27,17 @@ public class JedisMethodInterceptor extends SpanEventSimpleAroundInterceptor imp @Override public void doInAfterTrace(RecordableTrace trace, Object target, Object[] args, Object result, Throwable throwable) { - String destinationId = "Unknown"; - String endPoint = "Unknown"; - if (target instanceof ObjectTraceValue) { - // find host & port - final ObjectTraceValue traceValue = (ObjectTraceValue) target; - if (traceValue.__getTraceObject() != null && traceValue.__getTraceObject() instanceof Map) { - final Map map = (Map) traceValue.__getTraceObject(); - final Object host = map.get("host"); - final Object port = map.get("port"); - - if (host != null) { - destinationId = (String) host; - if (port != null) { - endPoint = (String) host + ":" + port; - } else { - endPoint = (String) host; - } - } + String endPoint = null; + if (target instanceof MapTraceValue) { + final Map traceValue = ((MapTraceValue) target).__getTraceBindValue(); + if (traceValue != null) { + endPoint = (String) traceValue.get("endPoint"); } } trace.recordApi(getMethodDescriptor()); - trace.recordEndPoint(endPoint); - trace.recordDestinationId(destinationId); + trace.recordEndPoint(endPoint != null ? endPoint : "Unknown"); + trace.recordDestinationId(ServiceType.REDIS.toString()); trace.recordServiceType(ServiceType.REDIS); trace.recordException(throwable); trace.markAfterTime(); diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisPipelineConstructorInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisPipelineConstructorInterceptor.java index d9b3e401f..04f62ff7e 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisPipelineConstructorInterceptor.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisPipelineConstructorInterceptor.java @@ -5,12 +5,13 @@ import java.util.Map; import com.nhn.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; import com.nhn.pinpoint.bootstrap.interceptor.TargetClassLoader; -import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.ObjectTraceValue; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; import com.nhn.pinpoint.bootstrap.logging.PLogger; import com.nhn.pinpoint.bootstrap.logging.PLoggerFactory; /** - * Redis client(jedis) constructor interceptor + * Jedis Pipeline(redis client) constructor interceptor + * - trace endPoint * * @author jaehong.kim * @@ -26,22 +27,20 @@ public class JedisPipelineConstructorInterceptor implements SimpleAroundIntercep logger.beforeInterceptor(target, args); } - if (!(target instanceof ObjectTraceValue) || !(args[0] instanceof ObjectTraceValue)) { + // trace endPoint + if (!(target instanceof MapTraceValue) || !(args[0] instanceof MapTraceValue)) { return; } - // trace host & port - final ObjectTraceValue traceValue = (ObjectTraceValue) target; - final Map map = new HashMap(); - // first arg - redis.clients.jedis.Client - final ObjectTraceValue clientTraceValue = (ObjectTraceValue) args[0]; - if (clientTraceValue.__getTraceObject() != null) { - final Map clientMap = (Map) clientTraceValue.__getTraceObject(); - map.put("host", clientMap.get("host")); - map.put("port", clientMap.get("port")); + final Map clientTraceValue = ((MapTraceValue) args[0]).__getTraceBindValue(); + if (clientTraceValue == null) { + return; } - traceValue.__setTraceObject(map); + + final Map traceValue = new HashMap(); + traceValue.put("endPoint", clientTraceValue.get("endPoint")); + ((MapTraceValue) target).__setTraceBindValue(traceValue); } @Override diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisPipelineMethodInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisPipelineMethodInterceptor.java index b8da4bc19..a5a47c406 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisPipelineMethodInterceptor.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisPipelineMethodInterceptor.java @@ -5,11 +5,11 @@ import java.util.Map; import com.nhn.pinpoint.bootstrap.context.RecordableTrace; import com.nhn.pinpoint.bootstrap.interceptor.SpanEventSimpleAroundInterceptor; import com.nhn.pinpoint.bootstrap.interceptor.TargetClassLoader; -import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.ObjectTraceValue; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; import com.nhn.pinpoint.common.ServiceType; /** - * Redis client(jedis) method interceptor + * Jedis Pipeline(redis client) method interceptor * * @author jaehong.kim * @@ -27,32 +27,17 @@ public class JedisPipelineMethodInterceptor extends SpanEventSimpleAroundInterce @Override public void doInAfterTrace(RecordableTrace trace, Object target, Object[] args, Object result, Throwable throwable) { - trace.recordApi(getMethodDescriptor()); - - String destinationId = "Unknown"; - String endPoint = "Unknown"; - - if (target instanceof ObjectTraceValue) { - // find host & port - final ObjectTraceValue traceValue = (ObjectTraceValue) target; - if (traceValue.__getTraceObject() != null) { - final Map map = (Map) traceValue.__getTraceObject(); - final Object host = map.get("host"); - final Object port = map.get("port"); - - if (host != null) { - destinationId = (String) host; - if (port != null) { - endPoint = (String) host + ":" + port; - } else { - endPoint = (String) host; - } - } + String endPoint = null; + if (target instanceof MapTraceValue) { + final Map traceValue = ((MapTraceValue) target).__getTraceBindValue(); + if (traceValue != null) { + endPoint = (String) traceValue.get("endPoint"); } } - trace.recordEndPoint(endPoint); - trace.recordDestinationId(destinationId); + trace.recordApi(getMethodDescriptor()); + trace.recordEndPoint(endPoint != null ? endPoint : "Unknown"); + trace.recordDestinationId(ServiceType.REDIS.toString()); trace.recordServiceType(ServiceType.REDIS); trace.recordException(throwable); trace.markAfterTime(); diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisPipelineSetClientMethodInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisPipelineSetClientMethodInterceptor.java index ec46e2998..7bf7fa2c5 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisPipelineSetClientMethodInterceptor.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisPipelineSetClientMethodInterceptor.java @@ -5,12 +5,12 @@ import java.util.Map; import com.nhn.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; import com.nhn.pinpoint.bootstrap.interceptor.TargetClassLoader; -import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.ObjectTraceValue; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; import com.nhn.pinpoint.bootstrap.logging.PLogger; import com.nhn.pinpoint.bootstrap.logging.PLoggerFactory; /** - * Redis client(jedis) pipeline method interceptor + * Jedis pipeline (redis client) setClient method interceptor * * @author jaehong.kim * @@ -25,24 +25,20 @@ public class JedisPipelineSetClientMethodInterceptor implements SimpleAroundInte logger.beforeInterceptor(target, args); } - if (!(target instanceof ObjectTraceValue) || !(args[0] instanceof ObjectTraceValue)) { + // trace endPoint + if (!(target instanceof MapTraceValue) || !(args[0] instanceof MapTraceValue)) { return; } - // trace host & port - final ObjectTraceValue traceValue = (ObjectTraceValue) target; - final Map map = new HashMap(); - // first arg - redis.clients.jedis.Client - final ObjectTraceValue clientTraceValue = (ObjectTraceValue) args[0]; - if (clientTraceValue.__getTraceObject() != null) { - final Map clientMap = (Map) clientTraceValue.__getTraceObject(); - map.put("host", clientMap.get("host")); - map.put("port", clientMap.get("port")); + final Map clientTraceValue = ((MapTraceValue) args[0]).__getTraceBindValue(); + if (clientTraceValue == null) { + return; } - traceValue.__setTraceObject(map); - return; + final Map traceValue = new HashMap(); + traceValue.put("endPoint", clientTraceValue.get("endPoint")); + ((MapTraceValue) target).__setTraceBindValue(traceValue); } @Override diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterConstructorInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterConstructorInterceptor.java index c0731c2d9..e3ad9c824 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterConstructorInterceptor.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterConstructorInterceptor.java @@ -5,12 +5,12 @@ import java.util.Map; import com.nhn.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; import com.nhn.pinpoint.bootstrap.interceptor.TargetClassLoader; -import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.ObjectTraceValue; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; import com.nhn.pinpoint.bootstrap.logging.PLogger; import com.nhn.pinpoint.bootstrap.logging.PLoggerFactory; /** - * nBase-ARC client constructor interceptor + * RedisCluster(nBase-ARC client) constructor interceptor - trace endPoint * * @author jaehong.kim * @@ -26,26 +26,27 @@ public class RedisClusterConstructorInterceptor implements SimpleAroundIntercept logger.beforeInterceptor(target, args); } - if (!(target instanceof ObjectTraceValue)) { + if (!(target instanceof MapTraceValue)) { return; } - // trace host & port - final ObjectTraceValue traceValue = (ObjectTraceValue) target; - final Map map = new HashMap(); - + // trace endPoint // first arg - host + final StringBuilder endPoint = new StringBuilder(); if (args[0] instanceof String) { - map.put("host", args[0]); - // default port - map.put("port", 6379); + endPoint.append(args[0]); + // second arg - port + if (args.length >= 2 && args[1] instanceof Integer) { + endPoint.append(":").append(args[1]); + } else { + // default port + endPoint.append(":").append(6379); + } } - // second arg - port - if (args.length >= 2 && args[1] instanceof Integer) { - map.put("port", args[1]); - } - traceValue.__setTraceObject(map); + final Map traceValue = new HashMap(); + traceValue.put("endPoint", endPoint.toString()); + ((MapTraceValue) target).__setTraceBindValue(traceValue); } @Override diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterMethodInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterMethodInterceptor.java index 4b181b130..c7eebb3be 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterMethodInterceptor.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterMethodInterceptor.java @@ -5,11 +5,11 @@ import java.util.Map; import com.nhn.pinpoint.bootstrap.context.RecordableTrace; import com.nhn.pinpoint.bootstrap.interceptor.SpanEventSimpleAroundInterceptor; import com.nhn.pinpoint.bootstrap.interceptor.TargetClassLoader; -import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.ObjectTraceValue; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; import com.nhn.pinpoint.common.ServiceType; /** - * nBase-ARC client method interceptor + * RedisCluster(nBase-ARC client) method interceptor * * @author jaehong.kim * @@ -27,31 +27,19 @@ public class RedisClusterMethodInterceptor extends SpanEventSimpleAroundIntercep @Override public void doInAfterTrace(RecordableTrace trace, Object target, Object[] args, Object result, Throwable throwable) { - String destinationId = "Unknown"; - String endPoint = "Unknown"; - if (target instanceof ObjectTraceValue) { - // find host:port - final ObjectTraceValue traceValue = (ObjectTraceValue) target; - if (traceValue.__getTraceObject() != null && traceValue.__getTraceObject() instanceof Map) { - final Map map = (Map) traceValue.__getTraceObject(); - final Object host = map.get("host"); - final Object port = map.get("port"); - - if (host != null) { - destinationId = (String) host; - if (port != null) { - endPoint = (String) host + ":" + port; - } else { - endPoint = (String) host; - } - } + String destinationId = null; + String endPoint = null; + if (target instanceof MapTraceValue) { + final Map traceValue = ((MapTraceValue) target).__getTraceBindValue(); + if (traceValue != null) { + destinationId = (String) traceValue.get("destinationId"); + endPoint = (String) traceValue.get("endPoint"); } } - System.out.println("### method: " + getMethodDescriptor().getMethodName()); trace.recordApi(getMethodDescriptor()); - trace.recordEndPoint(endPoint); - trace.recordDestinationId(destinationId); + trace.recordEndPoint(endPoint != null ? endPoint : "Unknown"); + trace.recordDestinationId(destinationId != null ? destinationId : ServiceType.NBASE_ARC.toString()); trace.recordServiceType(ServiceType.NBASE_ARC); trace.recordException(throwable); trace.markAfterTime(); diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterPipelineConstructorInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterPipelineConstructorInterceptor.java index cb40c089f..eee4aa0f4 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterPipelineConstructorInterceptor.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterPipelineConstructorInterceptor.java @@ -5,13 +5,14 @@ import java.util.Map; import com.nhn.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; import com.nhn.pinpoint.bootstrap.interceptor.TargetClassLoader; -import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.ObjectTraceValue; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; import com.nhn.pinpoint.bootstrap.logging.PLogger; import com.nhn.pinpoint.bootstrap.logging.PLoggerFactory; import com.nhncorp.redis.cluster.gateway.GatewayServer; /** - * nBase-ARC client constructor interceptor + * RedisCluster pipeline(nBase-ARC client) constructor interceptor + * - trace destinationId & endPoint * * @author jaehong.kim * @@ -27,19 +28,25 @@ public class RedisClusterPipelineConstructorInterceptor implements SimpleAroundI logger.beforeInterceptor(target, args); } - if (!(target instanceof ObjectTraceValue)) { + if (!(target instanceof MapTraceValue)) { return; } - // trace host & port - final ObjectTraceValue traceValue = (ObjectTraceValue) target; - final Map map = new HashMap(); + // trace destinationId & endPoint + final Map traceValue = new HashMap(); // first arg : GatewayServer final GatewayServer server = (GatewayServer) args[0]; - map.put("host", server.getAddress().getHost()); - map.put("port", server.getAddress().getPort()); - traceValue.__setTraceObject(map); + traceValue.put("endPoint", server.getAddress().getHost() + ":" + server.getAddress().getPort()); + + if (args[0] instanceof MapTraceValue) { + final Map gatewayServerTraceValue = ((MapTraceValue) args[0]).__getTraceBindValue(); + if (gatewayServerTraceValue != null) { + traceValue.put("destinationId", gatewayServerTraceValue.get("destinationId")); + } + } + + ((MapTraceValue) target).__setTraceBindValue(traceValue); } @Override diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterPipelineMethodInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterPipelineMethodInterceptor.java index 1abb1f4e6..7c2bee674 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterPipelineMethodInterceptor.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterPipelineMethodInterceptor.java @@ -5,11 +5,11 @@ import java.util.Map; import com.nhn.pinpoint.bootstrap.context.RecordableTrace; import com.nhn.pinpoint.bootstrap.interceptor.SpanEventSimpleAroundInterceptor; import com.nhn.pinpoint.bootstrap.interceptor.TargetClassLoader; -import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.ObjectTraceValue; +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; import com.nhn.pinpoint.common.ServiceType; /** - * nBase-ARC client method interceptor + * RedisCluster pipeline(nBase-ARC client) method interceptor * * @author jaehong.kim * @@ -27,31 +27,19 @@ public class RedisClusterPipelineMethodInterceptor extends SpanEventSimpleAround @Override public void doInAfterTrace(RecordableTrace trace, Object target, Object[] args, Object result, Throwable throwable) { - String destinationId = "Unknown"; - String endPoint = "Unknown"; - if (target instanceof ObjectTraceValue) { - // find host:port - final ObjectTraceValue traceValue = (ObjectTraceValue) target; - if (traceValue.__getTraceObject() != null && traceValue.__getTraceObject() instanceof Map) { - final Map map = (Map) traceValue.__getTraceObject(); - final Object host = map.get("host"); - final Object port = map.get("port"); - - if (host != null) { - destinationId = (String) host; - if (port != null) { - endPoint = (String) host + ":" + port; - } else { - endPoint = (String) host; - } - } + String destinationId = null; + String endPoint = null; + if (target instanceof MapTraceValue) { + final Map traceValue = ((MapTraceValue) target).__getTraceBindValue(); + if (traceValue != null) { + destinationId = (String) traceValue.get("destinationId"); + endPoint = (String) traceValue.get("endPoint"); } } - System.out.println("### method: " + getMethodDescriptor().getMethodName()); trace.recordApi(getMethodDescriptor()); - trace.recordEndPoint(endPoint); - trace.recordDestinationId(destinationId); + trace.recordEndPoint(endPoint != null ? endPoint : "Unknown"); + trace.recordDestinationId(destinationId != null ? destinationId : ServiceType.NBASE_ARC.toString()); trace.recordServiceType(ServiceType.NBASE_ARC); trace.recordException(throwable); trace.markAfterTime(); diff --git a/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisModifierTest.java b/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisModifierTest.java index 669e26a7c..b649b46ac 100644 --- a/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisModifierTest.java +++ b/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisModifierTest.java @@ -47,7 +47,7 @@ public class JedisModifierTest extends BasePinpointTest { SpanEventBo event = spanEvents.get(0); assertEquals(HOST + ":" + PORT, event.getEndPoint()); - assertEquals(HOST, event.getDestinationId()); + assertEquals("REDIS", event.getDestinationId()); assertEquals(ServiceType.REDIS, event.getServiceType()); assertNull(event.getExceptionMessage()); } diff --git a/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisPipelineModifierTest.java b/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisPipelineModifierTest.java index 37367157e..41f5a5106 100644 --- a/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisPipelineModifierTest.java +++ b/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisPipelineModifierTest.java @@ -49,7 +49,7 @@ public class JedisPipelineModifierTest extends BasePinpointTest { SpanEventBo event = spanEvents.get(0); assertEquals(HOST + ":" + PORT, event.getEndPoint()); - assertEquals(HOST, event.getDestinationId()); + assertEquals("REDIS", event.getDestinationId()); assertEquals(ServiceType.REDIS, event.getServiceType()); assertNull(event.getExceptionMessage()); } diff --git a/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterModifierTest.java b/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterModifierTest.java index b5d4576d3..d52d968bf 100644 --- a/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterModifierTest.java +++ b/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterModifierTest.java @@ -1,4 +1,3 @@ - package com.nhn.pinpoint.profiler.modifier.redis; import static org.junit.Assert.assertEquals; @@ -16,16 +15,21 @@ import com.nhn.pinpoint.common.ServiceType; import com.nhn.pinpoint.common.bo.SpanEventBo; import com.nhn.pinpoint.profiler.junit4.BasePinpointTest; import com.nhncorp.redis.cluster.RedisCluster; +import com.nhncorp.redis.cluster.gateway.GatewayClient; +import com.nhncorp.redis.cluster.gateway.GatewayConfig; public class RedisClusterModifierTest extends BasePinpointTest { private static final String HOST = "10.99.116.91"; private static final int PORT = 6390; + private static final String ZK_ADDRESS = "dev.xnbasearc.navercorp.com:2181"; + private static final String CLUSTER_NAME = "java_client_test"; private RedisCluster redis; @Before public void before() { redis = new RedisCluster(HOST, PORT); + } @Test @@ -36,12 +40,33 @@ public class RedisClusterModifierTest extends BasePinpointTest { assertEquals(1, spanEvents.size()); SpanEventBo event = spanEvents.get(0); - assertEquals(HOST, event.getDestinationId()); + assertEquals("NBASE_ARC", event.getDestinationId()); assertEquals(HOST + ":" + PORT, event.getEndPoint()); assertEquals(ServiceType.NBASE_ARC, event.getServiceType()); assertNull(event.getExceptionMessage()); } + @Test + public void traceDestinationId() { + GatewayConfig config = new GatewayConfig(); + config.setZkAddress(ZK_ADDRESS); + config.setClusterName(CLUSTER_NAME); + + GatewayClient client = new GatewayClient(config); + + client.get("foo"); + + final List spanEvents = getCurrentSpanEvents(); + SpanEventBo event = spanEvents.get(spanEvents.size() - 1); + + assertEquals(CLUSTER_NAME, event.getDestinationId()); + assertEquals(HOST + ":" + PORT, event.getEndPoint()); + assertEquals(ServiceType.NBASE_ARC, event.getServiceType()); + assertNull(event.getExceptionMessage()); + + client.destroy(); + } + @Test public void traceMethodThrowException() { // 에러가 발생한 경우에 대한 event 결과를 확인한다. diff --git a/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterPipelineModifierTest.java b/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterPipelineModifierTest.java index 079310696..e067e2e05 100644 --- a/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterPipelineModifierTest.java +++ b/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterPipelineModifierTest.java @@ -1,7 +1,6 @@ package com.nhn.pinpoint.profiler.modifier.redis; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import java.util.List; @@ -9,12 +8,10 @@ import java.util.List; import org.junit.Before; import org.junit.Test; -import redis.clients.jedis.exceptions.JedisDataException; import com.nhn.pinpoint.common.ServiceType; import com.nhn.pinpoint.common.bo.SpanEventBo; import com.nhn.pinpoint.profiler.junit4.BasePinpointTest; -import com.nhncorp.redis.cluster.RedisCluster; import com.nhncorp.redis.cluster.gateway.GatewayAddress; import com.nhncorp.redis.cluster.gateway.GatewayClient; import com.nhncorp.redis.cluster.gateway.GatewayConfig; @@ -24,6 +21,8 @@ import com.nhncorp.redis.cluster.pipeline.RedisClusterPipeline; public class RedisClusterPipelineModifierTest extends BasePinpointTest { private static final String HOST = "10.99.116.91"; private static final int PORT = 6390; + private static final String ZK_ADDRESS = "dev.xnbasearc.navercorp.com:2181"; + private static final String CLUSTER_NAME = "java_client_test"; private RedisClusterPipeline pipeline; @@ -46,10 +45,32 @@ public class RedisClusterPipelineModifierTest extends BasePinpointTest { assertEquals(2, spanEvents.size()); SpanEventBo event = spanEvents.get(0); - assertEquals(HOST, event.getDestinationId()); + assertEquals("NBASE_ARC", event.getDestinationId()); assertEquals(HOST + ":" + PORT, event.getEndPoint()); assertEquals(ServiceType.NBASE_ARC, event.getServiceType()); assertNull(event.getExceptionMessage()); } + + @Test + public void traceDestinationId() { + GatewayConfig config = new GatewayConfig(); + config.setZkAddress(ZK_ADDRESS); + config.setClusterName(CLUSTER_NAME); + GatewayClient client = new GatewayClient(config); + RedisClusterPipeline pipeline = client.pipeline(); + + pipeline.get("foo"); + pipeline.syncAndReturnAll(); + + final List spanEvents = getCurrentSpanEvents(); + SpanEventBo event = spanEvents.get(spanEvents.size() - 1); + + assertEquals(CLUSTER_NAME, event.getDestinationId()); + assertEquals(HOST + ":" + PORT, event.getEndPoint()); + assertEquals(ServiceType.NBASE_ARC, event.getServiceType()); + assertNull(event.getExceptionMessage()); + + client.destroy(); + } } \ No newline at end of file From 3d1d571d4419c84859f5c5d2588e1c7ea7119dbe Mon Sep 17 00:00:00 2001 From: Jaehong Kim Date: Thu, 25 Sep 2014 11:37:50 +0900 Subject: [PATCH 4/5] #7 add properties - redis/nbaseArc enabled --- .../bootstrap/config/ProfilerConfig.java | 34 ++++++++++++++++++- .../ClassFileTransformerDispatcher.java | 2 +- .../modifier/DefaultModifierRegistry.java | 29 +++++++++++----- .../src/main/resources-dev/pinpoint.config | 11 ++++++ .../src/main/resources-local/pinpoint.config | 11 ++++++ .../main/resources-release/pinpoint.config | 12 +++++++ .../src/main/resources-test/pinpoint.config | 14 +++++++- .../resources/applicationContext-testweb.xml | 1 + 8 files changed, 103 insertions(+), 11 deletions(-) diff --git a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/config/ProfilerConfig.java b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/config/ProfilerConfig.java index 21b15161a..1cf77b12b 100644 --- a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/config/ProfilerConfig.java +++ b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/config/ProfilerConfig.java @@ -70,6 +70,11 @@ public class ProfilerConfig { private boolean ibatis = true; private boolean mybatis = true; + + private boolean redis = true; + private boolean redisPipeline = true; + private boolean nbaseArc = true; + private boolean nbaseArcPipeline = true; /** * apache http client @@ -460,6 +465,23 @@ public class ProfilerConfig { public boolean isMyBatisEnabled() { return mybatis; } + + public boolean isRedisEnabled() { + return redis; + } + + public boolean isRedisPipelineEnabled() { + return redisPipeline; + } + + public boolean isNbaseArcEnabled() { + return nbaseArc; + } + + public boolean isNbaseArcPipelineEnabled() { + return nbaseArcPipeline; + } + /** * TODO remove this. 테스트 장비에서 call stack view가 잘 보이는지 테스트 하려고 추가함. @@ -583,6 +605,12 @@ public class ProfilerConfig { this.ningAsyncHttpClientProfileParamDumpSize = readInt(prop, "profiler.ning.asynchttpclient.param.dumpsize", 1024); this.ningAsyncHttpClientProfileParamSamplingRate = readInt(prop, "profiler.asynchttpclient.param.sampling.rate", 1); + // redis & nBase-ARC + this.redis = readBoolean(prop, "profiler.redis", true); + this.redisPipeline = readBoolean(prop, "profiler.redis.pipeline", true); + this.nbaseArc = readBoolean(prop, "profiler.nbase_arc", true); + this.nbaseArcPipeline = readBoolean(prop, "profiler.nbase_arc.pipeline", true); + // // FIXME 임시용, line game netty configuration // @@ -595,7 +623,7 @@ public class ProfilerConfig { this.samplingEnable = readBoolean(prop, "profiler.sampling.enable", true); this.samplingRate = readInt(prop, "profiler.sampling.rate", 1); - + // 샘플링 + io 조절 bufferSize 결정 this.ioBufferingEnable = readBoolean(prop, "profiler.io.buffering.enable", true); // 버퍼 사이즈는 여기에 있는것은 문제가 있는것도 같음. 설정 조정의 필요성이 있음. @@ -752,6 +780,10 @@ public class ProfilerConfig { sb.append(", arucsKeyTrace=").append(arucsKeyTrace); sb.append(", memcached=").append(memcached); sb.append(", memcachedKeyTrace=").append(memcachedKeyTrace); + sb.append(", redis=").append(redis); + sb.append(", redisPipeline=").append(redisPipeline); + sb.append(", nbaseArc=").append(nbaseArc); + sb.append(", nbaseArcPipeline=").append(nbaseArcPipeline); sb.append(", ibatis=").append(ibatis); sb.append(", mybatis=").append(mybatis); sb.append(", apacheHttpClient4Profile=").append(apacheHttpClient4Profile); diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/ClassFileTransformerDispatcher.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/ClassFileTransformerDispatcher.java index d047631ff..1409e03c0 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/ClassFileTransformerDispatcher.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/ClassFileTransformerDispatcher.java @@ -154,7 +154,7 @@ public class ClassFileTransformerDispatcher implements ClassFileTransformer { // redis, nBase-ARC modifierRepository.addRedisSupport(); - modifierRepository.addNBaseArcSupport(); + modifierRepository.addNbaseArcSupport(); return modifierRepository; } diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/DefaultModifierRegistry.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/DefaultModifierRegistry.java index 369a7fa0d..733949524 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/DefaultModifierRegistry.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/DefaultModifierRegistry.java @@ -365,16 +365,29 @@ public class DefaultModifierRegistry implements ModifierRegistry { } public void addRedisSupport() { - addModifier(new JedisClientModifier(byteCodeInstrumentor, agent)); - addModifier(new JedisModifier(byteCodeInstrumentor, agent)); - addModifier(new JedisPipelineModifier(byteCodeInstrumentor, agent)); + if(profilerConfig.isRedisEnabled()) { + addModifier(new JedisModifier(byteCodeInstrumentor, agent)); + } + + if(profilerConfig.isRedisPipelineEnabled()) { + addModifier(new JedisClientModifier(byteCodeInstrumentor, agent)); + addModifier(new JedisPipelineModifier(byteCodeInstrumentor, agent)); + } } - public void addNBaseArcSupport() { - addModifier(new GatewayModifier(byteCodeInstrumentor, agent)); - addModifier(new GatewayServerModifier(byteCodeInstrumentor, agent)); - addModifier(new RedisClusterModifier(byteCodeInstrumentor, agent)); - addModifier(new RedisClusterPipelineModifier(byteCodeInstrumentor, agent)); + public void addNbaseArcSupport() { + if(profilerConfig.isNbaseArcEnabled() || profilerConfig.isNbaseArcPipelineEnabled()) { + addModifier(new GatewayModifier(byteCodeInstrumentor, agent)); + addModifier(new GatewayServerModifier(byteCodeInstrumentor, agent)); + + if(profilerConfig.isNbaseArcEnabled()) { + addModifier(new RedisClusterModifier(byteCodeInstrumentor, agent)); + } + + if(profilerConfig.isNbaseArcPipelineEnabled()) { + addModifier(new RedisClusterPipelineModifier(byteCodeInstrumentor, agent)); + } + } } private void addIBatisSupport() { diff --git a/profiler/src/main/resources-dev/pinpoint.config b/profiler/src/main/resources-dev/pinpoint.config index 6811a852e..5e512af68 100644 --- a/profiler/src/main/resources-dev/pinpoint.config +++ b/profiler/src/main/resources-dev/pinpoint.config @@ -172,3 +172,14 @@ profiler.orm.ibatis=true ########################################################### profiler.orm.mybatis=true +########################################################### +# redis # +########################################################### +profiler.redis=true +profiler.redis.pipeline=true + +########################################################### +# nBase-ARC # +########################################################### +profiler.nbase_arc=true +profiler.nbase_arc.pipeline=true diff --git a/profiler/src/main/resources-local/pinpoint.config b/profiler/src/main/resources-local/pinpoint.config index 4c55d7aa0..347abd83d 100644 --- a/profiler/src/main/resources-local/pinpoint.config +++ b/profiler/src/main/resources-local/pinpoint.config @@ -180,3 +180,14 @@ profiler.orm.ibatis=true ########################################################### profiler.orm.mybatis=true +########################################################### +# redis # +########################################################### +profiler.redis=true +profiler.redis.pipeline=true + +########################################################### +# nBase-ARC # +########################################################### +profiler.nbase_arc=true +profiler.nbase_arc.pipeline=true diff --git a/profiler/src/main/resources-release/pinpoint.config b/profiler/src/main/resources-release/pinpoint.config index ca16e06cd..c5bef1e68 100644 --- a/profiler/src/main/resources-release/pinpoint.config +++ b/profiler/src/main/resources-release/pinpoint.config @@ -175,3 +175,15 @@ profiler.orm.ibatis=true ########################################################### profiler.orm.mybatis=true + +########################################################### +# redis # +########################################################### +profiler.redis=true +profiler.redis.pipeline=true + +########################################################### +# nBase-ARC # +########################################################### +profiler.nbase_arc=true +profiler.nbase_arc.pipeline=true diff --git a/profiler/src/main/resources-test/pinpoint.config b/profiler/src/main/resources-test/pinpoint.config index 63d306517..c1c8578a8 100644 --- a/profiler/src/main/resources-test/pinpoint.config +++ b/profiler/src/main/resources-test/pinpoint.config @@ -99,4 +99,16 @@ profiler.spandatasender.write.queue.size=5120 profiler.statdatasender.write.queue.size=5120 #profiler.statdatasender.socket.sendbuffersize=1048576 -#profiler.statdatasender.socket.timeout=3000 \ No newline at end of file +#profiler.statdatasender.socket.timeout=3000 + +########################################################### +# redis # +########################################################### +profiler.redis=true +profiler.redis.pipeline=true + +########################################################### +# nBase-ARC # +########################################################### +profiler.nbase_arc=true +profiler.nbase_arc.pipeline=true diff --git a/testweb/src/main/resources/applicationContext-testweb.xml b/testweb/src/main/resources/applicationContext-testweb.xml index 26ea5d329..a5663dfd7 100644 --- a/testweb/src/main/resources/applicationContext-testweb.xml +++ b/testweb/src/main/resources/applicationContext-testweb.xml @@ -17,6 +17,7 @@ + traceValue = new HashMap(); try { + final GatewayConfig config = (GatewayConfig) args[0]; if (config.getDomainAddress() != null) { traceValue.put("destinationId", config.getDomainAddress()); } else if (config.getIpAddress() != null) { @@ -44,7 +44,7 @@ public class GatewayConstructorInterceptor implements SimpleAroundInterceptor, T traceValue.put("destinationId", config.getClusterName()); } } catch (Exception ignored) { - // backward compatibility error + // backward compatibility error or expect 'class not found exception - GatewayConfig' } ((MapTraceValue) target).__setTraceBindValue(traceValue); diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/GatewayMethodInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/GatewayMethodInterceptor.java index 6601f588d..8b8a0a2af 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/GatewayMethodInterceptor.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/GatewayMethodInterceptor.java @@ -11,7 +11,7 @@ import com.nhn.pinpoint.bootstrap.logging.PLoggerFactory; /** * Gateway(nBase-ARC client) getServer() method interceptor - * - trace destinationId + * - trace destinationId * * @author jaehong.kim * diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/GatewayServerMethodInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/GatewayServerMethodInterceptor.java index 59397aacc..7e64e9c14 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/GatewayServerMethodInterceptor.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/GatewayServerMethodInterceptor.java @@ -5,15 +5,19 @@ import java.util.Map; import com.nhn.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; import com.nhn.pinpoint.bootstrap.interceptor.TargetClassLoader; import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; +import com.nhn.pinpoint.bootstrap.logging.PLogger; +import com.nhn.pinpoint.bootstrap.logging.PLoggerFactory; /** * GatewayServer(nBase-ARC client) getResource() method interceptor - * - trace destinationId + * - trace destinationId * * @author jaehong.kim * */ public class GatewayServerMethodInterceptor implements SimpleAroundInterceptor, TargetClassLoader { + private final PLogger logger = PLoggerFactory.getLogger(this.getClass()); + private final boolean isDebug = logger.isDebugEnabled(); @Override public void before(Object target, Object[] args) { @@ -21,6 +25,10 @@ public class GatewayServerMethodInterceptor implements SimpleAroundInterceptor, @Override public void after(Object target, Object[] args, Object result, Throwable throwable) { + if (isDebug) { + logger.beforeInterceptor(target, args); + } + if (!(target instanceof MapTraceValue) || result == null || !(result instanceof MapTraceValue)) { return; } diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisConstructorInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisConstructorInterceptor.java index ee433b61f..c81e8d51c 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisConstructorInterceptor.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisConstructorInterceptor.java @@ -14,7 +14,7 @@ import com.nhn.pinpoint.bootstrap.logging.PLoggerFactory; /** * Jedis (redis client) constructor interceptor - * - trace endPoint + * - trace endPoint * * @author jaehong.kim * diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisPipelineConstructorInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisPipelineConstructorInterceptor.java index 04f62ff7e..6e56d2b5f 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisPipelineConstructorInterceptor.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisPipelineConstructorInterceptor.java @@ -11,7 +11,7 @@ import com.nhn.pinpoint.bootstrap.logging.PLoggerFactory; /** * Jedis Pipeline(redis client) constructor interceptor - * - trace endPoint + * - trace endPoint * * @author jaehong.kim * diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterPipelineConstructorInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterPipelineConstructorInterceptor.java index eee4aa0f4..ef2b1f90e 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterPipelineConstructorInterceptor.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterPipelineConstructorInterceptor.java @@ -12,7 +12,7 @@ import com.nhncorp.redis.cluster.gateway.GatewayServer; /** * RedisCluster pipeline(nBase-ARC client) constructor interceptor - * - trace destinationId & endPoint + * - trace destinationId & endPoint * * @author jaehong.kim * @@ -36,8 +36,12 @@ public class RedisClusterPipelineConstructorInterceptor implements SimpleAroundI final Map traceValue = new HashMap(); // first arg : GatewayServer - final GatewayServer server = (GatewayServer) args[0]; - traceValue.put("endPoint", server.getAddress().getHost() + ":" + server.getAddress().getPort()); + try { + final GatewayServer server = (GatewayServer) args[0]; + traceValue.put("endPoint", server.getAddress().getHost() + ":" + server.getAddress().getPort()); + } catch(Exception ignored) { + // expect 'class not found exception - GatewayServer' + } if (args[0] instanceof MapTraceValue) { final Map gatewayServerTraceValue = ((MapTraceValue) args[0]).__getTraceBindValue(); diff --git a/profiler/src/main/resources-dev/pinpoint.config b/profiler/src/main/resources-dev/pinpoint.config index 6811a852e..5e512af68 100644 --- a/profiler/src/main/resources-dev/pinpoint.config +++ b/profiler/src/main/resources-dev/pinpoint.config @@ -172,3 +172,14 @@ profiler.orm.ibatis=true ########################################################### profiler.orm.mybatis=true +########################################################### +# redis # +########################################################### +profiler.redis=true +profiler.redis.pipeline=true + +########################################################### +# nBase-ARC # +########################################################### +profiler.nbase_arc=true +profiler.nbase_arc.pipeline=true diff --git a/profiler/src/main/resources-local/pinpoint.config b/profiler/src/main/resources-local/pinpoint.config index 4c55d7aa0..347abd83d 100644 --- a/profiler/src/main/resources-local/pinpoint.config +++ b/profiler/src/main/resources-local/pinpoint.config @@ -180,3 +180,14 @@ profiler.orm.ibatis=true ########################################################### profiler.orm.mybatis=true +########################################################### +# redis # +########################################################### +profiler.redis=true +profiler.redis.pipeline=true + +########################################################### +# nBase-ARC # +########################################################### +profiler.nbase_arc=true +profiler.nbase_arc.pipeline=true diff --git a/profiler/src/main/resources-release/pinpoint.config b/profiler/src/main/resources-release/pinpoint.config index ca16e06cd..c5bef1e68 100644 --- a/profiler/src/main/resources-release/pinpoint.config +++ b/profiler/src/main/resources-release/pinpoint.config @@ -175,3 +175,15 @@ profiler.orm.ibatis=true ########################################################### profiler.orm.mybatis=true + +########################################################### +# redis # +########################################################### +profiler.redis=true +profiler.redis.pipeline=true + +########################################################### +# nBase-ARC # +########################################################### +profiler.nbase_arc=true +profiler.nbase_arc.pipeline=true diff --git a/profiler/src/main/resources-test/pinpoint.config b/profiler/src/main/resources-test/pinpoint.config index 63d306517..c1c8578a8 100644 --- a/profiler/src/main/resources-test/pinpoint.config +++ b/profiler/src/main/resources-test/pinpoint.config @@ -99,4 +99,16 @@ profiler.spandatasender.write.queue.size=5120 profiler.statdatasender.write.queue.size=5120 #profiler.statdatasender.socket.sendbuffersize=1048576 -#profiler.statdatasender.socket.timeout=3000 \ No newline at end of file +#profiler.statdatasender.socket.timeout=3000 + +########################################################### +# redis # +########################################################### +profiler.redis=true +profiler.redis.pipeline=true + +########################################################### +# nBase-ARC # +########################################################### +profiler.nbase_arc=true +profiler.nbase_arc.pipeline=true diff --git a/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisModifierTest.java b/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisModifierTest.java index b649b46ac..70c71ceac 100644 --- a/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisModifierTest.java +++ b/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisModifierTest.java @@ -2,9 +2,7 @@ package com.nhn.pinpoint.profiler.modifier.redis; import static org.junit.Assert.*; -import java.util.HashMap; import java.util.List; -import java.util.Map; import org.junit.After; import org.junit.Before; diff --git a/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisPipelineModifierTest.java b/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisPipelineModifierTest.java index 41f5a5106..73ecc1658 100644 --- a/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisPipelineModifierTest.java +++ b/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisPipelineModifierTest.java @@ -54,7 +54,6 @@ public class JedisPipelineModifierTest extends BasePinpointTest { assertNull(event.getExceptionMessage()); } - @Ignore @Test public void traceMethodThrowException() { // 에러가 발생한 경우에 대한 event 결과를 확인한다. diff --git a/testweb/src/main/resources/applicationContext-testweb.xml b/testweb/src/main/resources/applicationContext-testweb.xml index 26ea5d329..a5663dfd7 100644 --- a/testweb/src/main/resources/applicationContext-testweb.xml +++ b/testweb/src/main/resources/applicationContext-testweb.xml @@ -17,6 +17,7 @@ +