diff --git a/CHANGES.md b/CHANGES.md
index 66f717e538..b6b6724e40 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -13,6 +13,9 @@ Release Notes.
* Add support for `Derby`/`Sybase`/`SQLite`/`DB2`/`OceanBase` jdbc url format in `URLParser`.
* Optimize spring-plugins:scheduled-annotation-plugin compatibility about Spring 6.1.x support.
* Add a forceIgnoring mechanism in a CROSS_THREAD scenario.
+* Fix NPE in Redisson plugin since Redisson 3.20.0.
+* Support for showing batch command details and ignoring PING commands in Redisson plugin.
+* Fix peer value of Master-Slave mode in Redisson plugin.
All issues and pull requests are [here](https://github.com/apache/skywalking/milestone/213?closed=1)
diff --git a/apm-sniffer/apm-sdk-plugin/redisson-3.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/redisson-3.x-plugin/pom.xml
index 2e0d14219d..19f79cbc3e 100644
--- a/apm-sniffer/apm-sdk-plugin/redisson-3.x-plugin/pom.xml
+++ b/apm-sniffer/apm-sdk-plugin/redisson-3.x-plugin/pom.xml
@@ -31,7 +31,7 @@
redisson-3.x-plugin
http://maven.apache.org
- 3.6.0
+ 3.20.0
diff --git a/apm-sniffer/apm-sdk-plugin/redisson-3.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/redisson/v3/ConnectionManagerInterceptor.java b/apm-sniffer/apm-sdk-plugin/redisson-3.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/redisson/v3/ConnectionManagerInterceptor.java
index d4b352deea..8cdb79b9ff 100644
--- a/apm-sniffer/apm-sdk-plugin/redisson-3.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/redisson/v3/ConnectionManagerInterceptor.java
+++ b/apm-sniffer/apm-sdk-plugin/redisson-3.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/redisson/v3/ConnectionManagerInterceptor.java
@@ -18,6 +18,7 @@
package org.apache.skywalking.apm.plugin.redisson.v3;
+import java.util.Objects;
import org.apache.skywalking.apm.agent.core.context.util.PeerFormat;
import org.apache.skywalking.apm.agent.core.logging.api.ILog;
import org.apache.skywalking.apm.agent.core.logging.api.LogManager;
@@ -26,11 +27,12 @@
import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
import org.apache.skywalking.apm.plugin.redisson.v3.util.ClassUtil;
import org.redisson.config.Config;
-import org.redisson.connection.ConnectionManager;
import java.lang.reflect.Method;
import java.net.URI;
import java.util.Collection;
+import org.redisson.connection.MasterSlaveConnectionManager;
+import org.redisson.connection.ServiceManager;
public class ConnectionManagerInterceptor implements InstanceMethodsAroundInterceptor {
@@ -45,14 +47,19 @@ public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allAr
public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class>[] argumentsTypes,
Object ret) throws Throwable {
try {
- ConnectionManager connectionManager = (ConnectionManager) objInst;
- Config config = connectionManager.getCfg();
-
- Object singleServerConfig = ClassUtil.getObjectField(config, "singleServerConfig");
- Object sentinelServersConfig = ClassUtil.getObjectField(config, "sentinelServersConfig");
- Object masterSlaveServersConfig = ClassUtil.getObjectField(config, "masterSlaveServersConfig");
- Object clusterServersConfig = ClassUtil.getObjectField(config, "clusterServersConfig");
- Object replicatedServersConfig = ClassUtil.getObjectField(config, "replicatedServersConfig");
+ Config config = getConfig(objInst);
+ Object singleServerConfig = null;
+ Object sentinelServersConfig = null;
+ Object masterSlaveServersConfig = null;
+ Object clusterServersConfig = null;
+ Object replicatedServersConfig = null;
+ if (Objects.nonNull(config)) {
+ singleServerConfig = ClassUtil.getObjectField(config, "singleServerConfig");
+ sentinelServersConfig = ClassUtil.getObjectField(config, "sentinelServersConfig");
+ masterSlaveServersConfig = ClassUtil.getObjectField(config, "masterSlaveServersConfig");
+ clusterServersConfig = ClassUtil.getObjectField(config, "clusterServersConfig");
+ replicatedServersConfig = ClassUtil.getObjectField(config, "replicatedServersConfig");
+ }
StringBuilder peer = new StringBuilder();
EnhancedInstance retInst = (EnhancedInstance) ret;
@@ -70,7 +77,7 @@ public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allA
}
if (masterSlaveServersConfig != null) {
Object masterAddress = ClassUtil.getObjectField(masterSlaveServersConfig, "masterAddress");
- peer.append(getPeer(masterAddress));
+ peer.append(getPeer(masterAddress)).append(";");
appendAddresses(peer, (Collection) ClassUtil.getObjectField(masterSlaveServersConfig, "slaveAddresses"));
retInst.setSkyWalkingDynamicField(PeerFormat.shorten(peer.toString()));
return ret;
@@ -118,6 +125,22 @@ static String getPeer(Object obj) {
}
}
+ private Config getConfig(EnhancedInstance objInst) {
+ Config config = null;
+ MasterSlaveConnectionManager connectionManager = (MasterSlaveConnectionManager) objInst;
+ try {
+ config = (Config) ClassUtil.getObjectField(connectionManager, "cfg");
+ } catch (NoSuchFieldException | IllegalAccessException ignore) {
+ try {
+ ServiceManager serviceManager = (ServiceManager) ClassUtil.getObjectField(
+ connectionManager, "serviceManager");
+ config = serviceManager.getCfg();
+ } catch (NoSuchFieldException | IllegalAccessException ignore2) {
+ }
+ }
+ return config;
+ }
+
@Override
public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments,
Class>[] argumentsTypes, Throwable t) {
diff --git a/apm-sniffer/apm-sdk-plugin/redisson-3.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/redisson/v3/RedisConnectionMethodInterceptor.java b/apm-sniffer/apm-sdk-plugin/redisson-3.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/redisson/v3/RedisConnectionMethodInterceptor.java
index 60956c7a64..f660ca1a15 100644
--- a/apm-sniffer/apm-sdk-plugin/redisson-3.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/redisson/v3/RedisConnectionMethodInterceptor.java
+++ b/apm-sniffer/apm-sdk-plugin/redisson-3.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/redisson/v3/RedisConnectionMethodInterceptor.java
@@ -19,6 +19,7 @@
package org.apache.skywalking.apm.plugin.redisson.v3;
import io.netty.channel.Channel;
+import java.util.stream.Collectors;
import org.apache.skywalking.apm.agent.core.context.ContextManager;
import org.apache.skywalking.apm.agent.core.context.tag.Tags;
import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan;
@@ -66,11 +67,18 @@ public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allAr
if (allArguments[0] instanceof CommandsData) {
operationName = operationName + "BATCH_EXECUTE";
command = "BATCH_EXECUTE";
+ if (RedissonPluginConfig.Plugin.Redisson.SHOW_BATCH_COMMANDS) {
+ command += ":" + showBatchCommands((CommandsData) allArguments[0]);
+ }
} else if (allArguments[0] instanceof CommandData) {
CommandData commandData = (CommandData) allArguments[0];
command = commandData.getCommand().getName();
- operationName = operationName + command;
- arguments = commandData.getParams();
+ if ("PING".equals(command) && !RedissonPluginConfig.Plugin.Redisson.SHOW_PING_COMMAND) {
+ return;
+ } else {
+ operationName = operationName + command;
+ arguments = commandData.getParams();
+ }
}
AbstractSpan span = ContextManager.createExitSpan(operationName, peer);
@@ -143,4 +151,11 @@ private Optional parseOperation(String cmd) {
}
return Optional.empty();
}
+
+ private String showBatchCommands(CommandsData commandsData) {
+ return commandsData.getCommands()
+ .stream()
+ .map(data -> data.getCommand().getName())
+ .collect(Collectors.joining(";"));
+ }
}
diff --git a/apm-sniffer/apm-sdk-plugin/redisson-3.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/redisson/v3/RedissonPluginConfig.java b/apm-sniffer/apm-sdk-plugin/redisson-3.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/redisson/v3/RedissonPluginConfig.java
index 52dedcb10a..aeb0a5f270 100644
--- a/apm-sniffer/apm-sdk-plugin/redisson-3.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/redisson/v3/RedissonPluginConfig.java
+++ b/apm-sniffer/apm-sdk-plugin/redisson-3.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/redisson/v3/RedissonPluginConfig.java
@@ -40,6 +40,14 @@ public static class Redisson {
* Set a negative number to save specified length of parameter string to the tag.
*/
public static int REDIS_PARAMETER_MAX_LENGTH = 128;
+ /**
+ * If set to true, the PING command would be collected.
+ */
+ public static boolean SHOW_PING_COMMAND = false;
+ /**
+ * If set to true, the detail of the Redis batch commands would be collected.
+ */
+ public static boolean SHOW_BATCH_COMMANDS = false;
/**
* Operation represent a cache span is "write" or "read" action , and "op"(operation) is tagged with key "cache.op" usually
diff --git a/docs/en/setup/service-agent/java-agent/Supported-list.md b/docs/en/setup/service-agent/java-agent/Supported-list.md
index 1fa2672282..12b712bbf4 100644
--- a/docs/en/setup/service-agent/java-agent/Supported-list.md
+++ b/docs/en/setup/service-agent/java-agent/Supported-list.md
@@ -87,7 +87,7 @@ metrics based on the tracing data.
* [aerospike](https://github.com/aerospike/aerospike-client-java) 3.x -> 6.x
* Redis
* [Jedis](https://github.com/xetorthio/jedis) 2.x-4.x
- * [Redisson](https://github.com/redisson/redisson) Easy Java Redis client 3.5.2+
+ * [Redisson](https://github.com/redisson/redisson) Easy Java Redis client 3.5.0 -> 3.30.0
* [Lettuce](https://github.com/lettuce-io/lettuce-core) 5.x
* [MongoDB Java Driver](https://github.com/mongodb/mongo-java-driver) 2.13-2.14, 3.4.0-3.12.7, 4.0.0-4.1.0
* Memcached Client
diff --git a/test/plugin/scenarios/redisson-scenario/support-version.list b/test/plugin/scenarios/redisson-scenario/support-version.list
index 78009656c1..aa0a5594df 100644
--- a/test/plugin/scenarios/redisson-scenario/support-version.list
+++ b/test/plugin/scenarios/redisson-scenario/support-version.list
@@ -14,6 +14,13 @@
# See the License for the specific language governing permissions and
# limitations under the License.
+# 3.5.0-3.12.4, 3.26.1-3.30.0 have been tested, and 3.12.5-3.26.0 are also supported but not included in the test
+3.30.0
+3.29.0
+3.28.0
+3.27.2
+3.26.1
+3.12.4
3.11.5
3.10.7
3.9.1