Skip to content

Commit 92b076c

Browse files
authored
Enhance redisson plugin to adopt uniform tags (#438)
1 parent 5cffa07 commit 92b076c

File tree

7 files changed

+174
-33
lines changed

7 files changed

+174
-33
lines changed

CHANGES.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ Release Notes.
2626
* Put `Agent-Version` property reading in the premain stage to avoid deadlock when using `jarsigner`.
2727
* Add a config `agent.enable`(default: true) to support disabling the agent through system property `-Dskywalking.agent.disable=false`
2828
or system environment variable setting `SW_AGENT_ENABLE=false`.
29+
* Enhance redisson plugin to adopt uniform tags.
2930

3031
#### Documentation
3132

apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/tag/Tags.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,11 @@ public static final class HTTP {
130130
*/
131131
public static final StringTag CACHE_KEY = new StringTag(18, "cache.key");
132132

133+
/**
134+
* CACHE_INSTANCE records the cache instance
135+
*/
136+
public static final StringTag CACHE_INSTANCE = new StringTag(20, "cache.instance");
137+
133138
public static final String VAL_LOCAL_SPAN_AS_LOGIC_ENDPOINT = "{\"logic-span\":true}";
134139

135140
public static final StringTag SQL_PARAMETERS = new StringTag(19, "db.sql.parameters");

apm-sniffer/apm-sdk-plugin/redisson-3.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/redisson/v3/RedisConnectionMethodInterceptor.java

Lines changed: 38 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818

1919
package org.apache.skywalking.apm.plugin.redisson.v3;
2020

21-
import io.netty.buffer.ByteBuf;
2221
import io.netty.channel.Channel;
2322
import org.apache.skywalking.apm.agent.core.context.ContextManager;
2423
import org.apache.skywalking.apm.agent.core.context.tag.Tags;
@@ -32,13 +31,15 @@
3231
import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
3332
import org.apache.skywalking.apm.network.trace.component.ComponentsDefine;
3433
import org.apache.skywalking.apm.plugin.redisson.v3.util.ClassUtil;
34+
import org.apache.skywalking.apm.util.StringUtil;
3535
import org.redisson.client.RedisClient;
3636
import org.redisson.client.RedisConnection;
3737
import org.redisson.client.protocol.CommandData;
3838
import org.redisson.client.protocol.CommandsData;
3939

4040
import java.lang.reflect.Method;
4141
import java.net.InetSocketAddress;
42+
import java.util.Optional;
4243

4344
public class RedisConnectionMethodInterceptor implements InstanceMethodsAroundInterceptor, InstanceConstructorInterceptor {
4445

@@ -58,43 +59,29 @@ public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allAr
5859
InetSocketAddress remoteAddress = (InetSocketAddress) channel.remoteAddress();
5960
String dbInstance = remoteAddress.getAddress().getHostAddress() + ":" + remoteAddress.getPort();
6061

61-
StringBuilder dbStatement = new StringBuilder();
6262
String operationName = "Redisson/";
63+
String command = "";
64+
Object[] arguments = new Object[0];
6365

6466
if (allArguments[0] instanceof CommandsData) {
6567
operationName = operationName + "BATCH_EXECUTE";
66-
CommandsData commands = (CommandsData) allArguments[0];
67-
for (CommandData commandData : commands.getCommands()) {
68-
addCommandData(dbStatement, commandData);
69-
dbStatement.append(";");
70-
}
68+
command = "BATCH_EXECUTE";
7169
} else if (allArguments[0] instanceof CommandData) {
7270
CommandData commandData = (CommandData) allArguments[0];
73-
String command = commandData.getCommand().getName();
71+
command = commandData.getCommand().getName();
7472
operationName = operationName + command;
75-
addCommandData(dbStatement, commandData);
73+
arguments = commandData.getParams();
7674
}
7775

7876
AbstractSpan span = ContextManager.createExitSpan(operationName, peer);
7977
span.setComponent(ComponentsDefine.REDISSON);
80-
Tags.DB_TYPE.set(span, "Redis");
81-
Tags.DB_INSTANCE.set(span, dbInstance);
82-
Tags.DB_STATEMENT.set(span, dbStatement.toString());
83-
SpanLayer.asCache(span);
84-
}
78+
Tags.CACHE_TYPE.set(span, "Redis");
79+
Tags.CACHE_INSTANCE.set(span, dbInstance);
80+
Tags.CACHE_CMD.set(span, command);
8581

86-
private void addCommandData(StringBuilder dbStatement, CommandData commandData) {
87-
dbStatement.append(commandData.getCommand().getName());
88-
if (RedissonPluginConfig.Plugin.Redisson.TRACE_REDIS_PARAMETERS && commandData.getParams() != null) {
89-
for (Object param : commandData.getParams()) {
90-
dbStatement.append(DELIMITER_SPACE);
91-
String paramStr = param instanceof ByteBuf ? QUESTION_MARK : String.valueOf(param.toString());
92-
if (paramStr.length() > RedissonPluginConfig.Plugin.Redisson.REDIS_PARAMETER_MAX_LENGTH) {
93-
paramStr = paramStr.substring(0, RedissonPluginConfig.Plugin.Redisson.REDIS_PARAMETER_MAX_LENGTH) + ABBR;
94-
}
95-
dbStatement.append(paramStr);
96-
}
97-
}
82+
getKey(arguments).ifPresent(key -> Tags.CACHE_KEY.set(span, key));
83+
parseOperation(command.toLowerCase()).ifPresent(op -> Tags.CACHE_OP.set(span, op));
84+
SpanLayer.asCache(span);
9885
}
9986

10087
@Override
@@ -131,4 +118,29 @@ public void onConstruct(EnhancedInstance objInst, Object[] allArguments) {
131118
}
132119
objInst.setSkyWalkingDynamicField(peer);
133120
}
121+
122+
private Optional<String> getKey(Object[] allArguments) {
123+
if (!RedissonPluginConfig.Plugin.Redisson.TRACE_REDIS_PARAMETERS) {
124+
return Optional.empty();
125+
}
126+
if (allArguments.length == 0) {
127+
return Optional.empty();
128+
}
129+
Object argument = allArguments[0];
130+
// include null
131+
if (!(argument instanceof String)) {
132+
return Optional.empty();
133+
}
134+
return Optional.of(StringUtil.cut((String) argument, RedissonPluginConfig.Plugin.Redisson.REDIS_PARAMETER_MAX_LENGTH));
135+
}
136+
137+
private Optional<String> parseOperation(String cmd) {
138+
if (RedissonPluginConfig.Plugin.Redisson.OPERATION_MAPPING_READ.contains(cmd)) {
139+
return Optional.of("read");
140+
}
141+
if (RedissonPluginConfig.Plugin.Redisson.OPERATION_MAPPING_WRITE.contains(cmd)) {
142+
return Optional.of("write");
143+
}
144+
return Optional.empty();
145+
}
134146
}

apm-sniffer/apm-sdk-plugin/redisson-3.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/redisson/v3/RedissonPluginConfig.java

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@
2020

2121
import org.apache.skywalking.apm.agent.core.boot.PluginConfig;
2222

23+
import java.util.Arrays;
24+
import java.util.HashSet;
25+
import java.util.Set;
26+
2327
public class RedissonPluginConfig {
2428
public static class Plugin {
2529
@PluginConfig(root = RedissonPluginConfig.class)
@@ -36,6 +40,118 @@ public static class Redisson {
3640
* Set a negative number to save specified length of parameter string to the tag.
3741
*/
3842
public static int REDIS_PARAMETER_MAX_LENGTH = 128;
43+
44+
/**
45+
* Operation represent a cache span is "write" or "read" action , and "op"(operation) is tagged with key "cache.op" usually
46+
* This config term define which command should be converted to write Operation .
47+
*
48+
* @see org.apache.skywalking.apm.agent.core.context.tag.Tags#CACHE_OP
49+
* @see RedisConnectionMethodInterceptor#parseOperation(String)
50+
*/
51+
public static Set<String> OPERATION_MAPPING_WRITE = new HashSet<>(Arrays.asList(
52+
"getset",
53+
"set",
54+
"setbit",
55+
"setex ",
56+
"setnx ",
57+
"setrange",
58+
"strlen ",
59+
"mset",
60+
"msetnx ",
61+
"psetex",
62+
"incr ",
63+
"incrby ",
64+
"incrbyfloat",
65+
"decr ",
66+
"decrby ",
67+
"append ",
68+
"hmset",
69+
"hset",
70+
"hsetnx ",
71+
"hincrby",
72+
"hincrbyfloat",
73+
"hdel",
74+
"rpoplpush",
75+
"rpush",
76+
"rpushx",
77+
"lpush",
78+
"lpushx",
79+
"lrem",
80+
"ltrim",
81+
"lset",
82+
"brpoplpush",
83+
"linsert",
84+
"sadd",
85+
"sdiff",
86+
"sdiffstore",
87+
"sinterstore",
88+
"sismember",
89+
"srem",
90+
"sunion",
91+
"sunionstore",
92+
"sinter",
93+
"zadd",
94+
"zincrby",
95+
"zinterstore",
96+
"zrange",
97+
"zrangebylex",
98+
"zrangebyscore",
99+
"zrank",
100+
"zrem",
101+
"zremrangebylex",
102+
"zremrangebyrank",
103+
"zremrangebyscore",
104+
"zrevrange",
105+
"zrevrangebyscore",
106+
"zrevrank",
107+
"zunionstore",
108+
"xadd",
109+
"xdel",
110+
"del",
111+
"xtrim"
112+
));
113+
/**
114+
* Operation represent a cache span is "write" or "read" action , and "op"(operation) is tagged with key "cache.op" usually
115+
* This config term define which command should be converted to write Operation .
116+
*
117+
* @see org.apache.skywalking.apm.agent.core.context.tag.Tags#CACHE_OP
118+
* @see RedisConnectionMethodInterceptor#parseOperation(String)
119+
*/
120+
public static Set<String> OPERATION_MAPPING_READ = new HashSet<>(Arrays.asList(
121+
"getrange",
122+
"getbit ",
123+
"mget",
124+
"hvals",
125+
"hkeys",
126+
"hlen",
127+
"hexists",
128+
"hget",
129+
"hgetall",
130+
"hmget",
131+
"blpop",
132+
"brpop",
133+
"lindex",
134+
"llen",
135+
"lpop",
136+
"lrange",
137+
"rpop",
138+
"scard",
139+
"srandmember",
140+
"spop",
141+
"sscan",
142+
"smove",
143+
"zlexcount",
144+
"zscore",
145+
"zscan",
146+
"zcard",
147+
"zcount",
148+
"xget",
149+
"get",
150+
"xread",
151+
"xlen",
152+
"xrange",
153+
"xrevrange"
154+
));
39155
}
40156
}
41157
}

apm-sniffer/config/agent.config

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,3 +305,7 @@ plugin.jedis.operation_mapping_read=${SW_PLUGIN_JEDIS_OPERATION_MAPPING_READ:get
305305
plugin.redisson.trace_redis_parameters=${SW_PLUGIN_REDISSON_TRACE_REDIS_PARAMETERS:false}
306306
# If set to positive number and plugin.redisson.trace_redis_parameters is set to true, Redis command parameters would be collected and truncated to this length.
307307
plugin.redisson.redis_parameter_max_length=${SW_PLUGIN_REDISSON_REDIS_PARAMETER_MAX_LENGTH:128}
308+
# Specify which command should be converted to write operation
309+
plugin.redisson.operation_mapping_write=${SW_PLUGIN_REDISSON_OPERATION_MAPPING_WRITE:getset,set,setbit,setex,setnx,setrange,strlen,mset,msetnx,psetex,incr,incrby,incrbyfloat,decr,decrby,append,hmset,hset,hsetnx,hincrby,hincrbyfloat,hdel,rpoplpush,rpush,rpushx,lpush,lpushx,lrem,ltrim,lset,brpoplpush,linsert,sadd,sdiff,sdiffstore,sinterstore,sismember,srem,sunion,sunionstore,sinter,zadd,zincrby,zinterstore,zrange,zrangebylex,zrangebyscore,zrank,zrem,zremrangebylex,zremrangebyrank,zremrangebyscore,zrevrange,zrevrangebyscore,zrevrank,zunionstore,xadd,xdel,del,xtrim}
310+
# Specify which command should be converted to read operation
311+
plugin.redisson.operation_mapping_read=${SW_PLUGIN_REDISSON_OPERATION_MAPPING_READ:getrange,getbit,mget,hvals,hkeys,hlen,hexists,hget,hgetall,hmget,blpop,brpop,lindex,llen,lpop,lrange,rpop,scard,srandmember,spop,sscan,smove,zlexcount,zscore,zscan,zcard,zcount,xget,get,xread,xlen,xrange,xrevrange}

0 commit comments

Comments
 (0)