From 84f8903df55015cf47bc71f16291ec4da8becfe0 Mon Sep 17 00:00:00 2001 From: Jaehong Kim Date: Mon, 3 Nov 2014 11:27:01 +0900 Subject: [PATCH] #7 add super class interceptor --- .../modifier/redis/BinaryJedisModifier.java | 35 +++++++++ .../redis/BinaryRedisClusterModifier.java | 22 ++++++ .../BinaryTriplesRedisClusterModifier.java | 34 +++++++++ .../JedisMultiKeyPipelineBaseModifier.java | 22 ++++++ .../redis/JedisPipelineBaseModifier.java | 75 +++++++++++++++++++ .../redis/TriplesRedisClusterModifier.java | 22 ++++++ 6 files changed, 210 insertions(+) create mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/BinaryJedisModifier.java create mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/BinaryRedisClusterModifier.java create mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/BinaryTriplesRedisClusterModifier.java create mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisMultiKeyPipelineBaseModifier.java create mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisPipelineBaseModifier.java create mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/TriplesRedisClusterModifier.java diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/BinaryJedisModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/BinaryJedisModifier.java new file mode 100644 index 000000000..381f3a7a5 --- /dev/null +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/BinaryJedisModifier.java @@ -0,0 +1,35 @@ +package com.nhn.pinpoint.profiler.modifier.redis; + +import java.security.ProtectionDomain; + +import com.nhn.pinpoint.bootstrap.Agent; +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.InstrumentException; +import com.nhn.pinpoint.profiler.interceptor.bci.NotFoundInstrumentException; + +/** + * jedis(redis client) modifier + * + * @author jaehong.kim + * + */ +public class BinaryJedisModifier extends JedisModifier { + + public BinaryJedisModifier(ByteCodeInstrumentor byteCodeInstrumentor, Agent agent) { + super(byteCodeInstrumentor, agent); + } + + @Override + public String getTargetClass() { + return "redis/clients/jedis/BinaryJedis"; + } + + @Override + protected void beforeAddInterceptor(ClassLoader classLoader, ProtectionDomain protectedDomain, final InstrumentClass instrumentClass) throws NotFoundInstrumentException, InstrumentException { + // trace endPoint. + instrumentClass.addTraceValue(MapTraceValue.class); + } + +} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/BinaryRedisClusterModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/BinaryRedisClusterModifier.java new file mode 100644 index 000000000..39dd766f8 --- /dev/null +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/BinaryRedisClusterModifier.java @@ -0,0 +1,22 @@ +package com.nhn.pinpoint.profiler.modifier.redis; + +import com.nhn.pinpoint.bootstrap.Agent; +import com.nhn.pinpoint.profiler.interceptor.bci.ByteCodeInstrumentor; + +/** + * RedisCluster(nBase-ARC client) modifier + * + * @author jaehong.kim + * + */ +public class BinaryRedisClusterModifier extends RedisClusterModifier { + + public BinaryRedisClusterModifier(ByteCodeInstrumentor byteCodeInstrumentor, Agent agent) { + super(byteCodeInstrumentor, agent); + } + + @Override + public String getTargetClass() { + return "com/nhncorp/redis/cluster/BinaryRedisCluster"; + } +} \ No newline at end of file diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/BinaryTriplesRedisClusterModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/BinaryTriplesRedisClusterModifier.java new file mode 100644 index 000000000..6475e2c4f --- /dev/null +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/BinaryTriplesRedisClusterModifier.java @@ -0,0 +1,34 @@ +package com.nhn.pinpoint.profiler.modifier.redis; + +import java.security.ProtectionDomain; + +import com.nhn.pinpoint.bootstrap.Agent; +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.InstrumentException; +import com.nhn.pinpoint.profiler.interceptor.bci.NotFoundInstrumentException; + +/** + * RedisCluster(nBase-ARC client) modifier + * + * @author jaehong.kim + * + */ +public class BinaryTriplesRedisClusterModifier extends RedisClusterModifier { + + public BinaryTriplesRedisClusterModifier(ByteCodeInstrumentor byteCodeInstrumentor, Agent agent) { + super(byteCodeInstrumentor, agent); + } + + @Override + public String getTargetClass() { + return "com/nhncorp/redis/cluster/triples/BinaryTriplesRedisCluster"; + } + + @Override + protected void beforeAddInterceptor(ClassLoader classLoader, ProtectionDomain protectedDomain, final InstrumentClass instrumentClass) throws NotFoundInstrumentException, InstrumentException { + // trace destinationId, endPoint + instrumentClass.addTraceValue(MapTraceValue.class); + } +} \ No newline at end of file diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisMultiKeyPipelineBaseModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisMultiKeyPipelineBaseModifier.java new file mode 100644 index 000000000..7f78770fd --- /dev/null +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisMultiKeyPipelineBaseModifier.java @@ -0,0 +1,22 @@ +package com.nhn.pinpoint.profiler.modifier.redis; + +import com.nhn.pinpoint.bootstrap.Agent; +import com.nhn.pinpoint.profiler.interceptor.bci.ByteCodeInstrumentor; + +/** + * jedis(redis client) pipeline modifier + * + * @author jaehong.kim + * + */ +public class JedisMultiKeyPipelineBaseModifier extends JedisPipelineBaseModifier { + + public JedisMultiKeyPipelineBaseModifier(ByteCodeInstrumentor byteCodeInstrumentor, Agent agent) { + super(byteCodeInstrumentor, agent); + } + + @Override + public String getTargetClass() { + return "redis/clients/jedis/MultiKeyPipelineBase"; + } +} \ No newline at end of file diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisPipelineBaseModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisPipelineBaseModifier.java new file mode 100644 index 000000000..97cc2eab9 --- /dev/null +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisPipelineBaseModifier.java @@ -0,0 +1,75 @@ +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.profiler.interceptor.bci.ByteCodeInstrumentor; +import com.nhn.pinpoint.profiler.interceptor.bci.InstrumentClass; +import com.nhn.pinpoint.profiler.interceptor.bci.InstrumentException; +import com.nhn.pinpoint.profiler.interceptor.bci.Method; +import com.nhn.pinpoint.profiler.interceptor.bci.NotFoundInstrumentException; +import com.nhn.pinpoint.profiler.modifier.AbstractModifier; +import com.nhn.pinpoint.profiler.modifier.redis.filter.JedisPipelineMethodNames; +import com.nhn.pinpoint.profiler.modifier.redis.filter.NameBasedMethodFilter; + +/** + * jedis(redis client) pipeline modifier + * + * @author jaehong.kim + * + */ +public class JedisPipelineBaseModifier extends AbstractModifier { + + protected final Logger logger = LoggerFactory.getLogger(this.getClass()); + + public JedisPipelineBaseModifier(ByteCodeInstrumentor byteCodeInstrumentor, Agent agent) { + super(byteCodeInstrumentor, agent); + } + + @Override + public String getTargetClass() { + return "redis/clients/jedis/PipelineBase"; + } + + @Override + public byte[] modify(ClassLoader classLoader, String className, ProtectionDomain protectedDomain, byte[] classFileBuffer) { + if (logger.isInfoEnabled()) { + logger.info("Modifing. {}", className); + } + + byteCodeInstrumentor.checkLibrary(classLoader, className); + try { + final InstrumentClass instrumentClass = byteCodeInstrumentor.getClass(className); + + beforeAddInterceptor(classLoader, protectedDomain, instrumentClass); + + // method + addMethodInterceptor(classLoader, protectedDomain, instrumentClass); + + return instrumentClass.toBytecode(); + } catch (Exception e) { + if (logger.isWarnEnabled()) { + logger.warn("Failed to modifier. caused={}", e.getMessage(), e); + } + } + + return null; + } + + protected void beforeAddInterceptor(ClassLoader classLoader, ProtectionDomain protectedDomain, final InstrumentClass instrumentClass) throws NotFoundInstrumentException, InstrumentException { + // nothing + } + + protected void addMethodInterceptor(ClassLoader classLoader, ProtectionDomain protectedDomain, final InstrumentClass instrumentClass) throws NotFoundInstrumentException, InstrumentException { + final List declaredMethods = instrumentClass.getDeclaredMethods(new NameBasedMethodFilter(JedisPipelineMethodNames.get())); + for (Method method : declaredMethods) { + final Interceptor methodInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.nhn.pinpoint.profiler.modifier.redis.interceptor.JedisPipelineMethodInterceptor"); + instrumentClass.addInterceptor(method.getMethodName(), method.getMethodParams(), methodInterceptor); + } + } +} \ No newline at end of file diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/TriplesRedisClusterModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/TriplesRedisClusterModifier.java new file mode 100644 index 000000000..92ffcbb8c --- /dev/null +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/TriplesRedisClusterModifier.java @@ -0,0 +1,22 @@ +package com.nhn.pinpoint.profiler.modifier.redis; + +import com.nhn.pinpoint.bootstrap.Agent; +import com.nhn.pinpoint.profiler.interceptor.bci.ByteCodeInstrumentor; + +/** + * RedisCluster(nBase-ARC client) modifier + * + * @author jaehong.kim + * + */ +public class TriplesRedisClusterModifier extends RedisClusterModifier { + + public TriplesRedisClusterModifier(ByteCodeInstrumentor byteCodeInstrumentor, Agent agent) { + super(byteCodeInstrumentor, agent); + } + + @Override + public String getTargetClass() { + return "com/nhncorp/redis/cluster/triples/TriplesRedisCluster"; + } +} \ No newline at end of file