From 0b2d8bc2f38ed3590c7946396ce439ccea1d36fc Mon Sep 17 00:00:00 2001 From: edeleon Date: Fri, 14 Jun 2024 18:15:14 -0700 Subject: [PATCH 1/5] added jedis-5.0.0 to be included in Weaver Instrumentation --- settings.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/settings.gradle b/settings.gradle index b3838b6793..66c617cb31 100644 --- a/settings.gradle +++ b/settings.gradle @@ -203,6 +203,7 @@ include 'instrumentation:jedis-2.7.1' include 'instrumentation:jedis-2.7.2' include 'instrumentation:jedis-3.0.0' include 'instrumentation:jedis-4.0.0' +include 'instrumentation:jedis-5.0.0' include 'instrumentation:jersey-1' include 'instrumentation:jersey-2' include 'instrumentation:jersey-3' From 8c1731954dc8cee8a07a6123f000a692c52f1f72 Mon Sep 17 00:00:00 2001 From: edeleon Date: Fri, 14 Jun 2024 18:16:53 -0700 Subject: [PATCH 2/5] added new jedis-5.0.0 instrumentation module --- instrumentation/jedis-5.0.0/build.gradle | 24 +++++ .../jedis/Connection_Instrumentation.java | 90 +++++++++++++++++++ .../JedisPubSubBase_Instrumentation.java | 77 ++++++++++++++++ 3 files changed, 191 insertions(+) create mode 100644 instrumentation/jedis-5.0.0/build.gradle create mode 100644 instrumentation/jedis-5.0.0/src/main/java/redis/clients/jedis/Connection_Instrumentation.java create mode 100644 instrumentation/jedis-5.0.0/src/main/java/redis/clients/jedis/JedisPubSubBase_Instrumentation.java diff --git a/instrumentation/jedis-5.0.0/build.gradle b/instrumentation/jedis-5.0.0/build.gradle new file mode 100644 index 0000000000..5e26c5da1f --- /dev/null +++ b/instrumentation/jedis-5.0.0/build.gradle @@ -0,0 +1,24 @@ +jar { + manifest { attributes 'Implementation-Title': 'com.newrelic.instrumentation.jedis-5.0.0' } +} + +dependencies { + implementation(project(":agent-bridge")) + implementation(project(":agent-bridge-datastore")) + implementation(project(":newrelic-api")) + implementation(project(":newrelic-weaver-api")) + implementation("redis.clients:jedis:5.0.0") +} + +verifyInstrumentation { + passes 'redis.clients:jedis:[5.0.0,6.0.0)' + fails 'redis.clients:jedis:[1.4.0,3.8.0]' + excludeRegex 'redis.clients:jedis:.*-(m|rc|RC|alpha|beta)[0-9]*' + exclude 'redis.clients:jedis:3.6.2' + +} + +site { + title 'Jedis' + type 'Datastore' +} \ No newline at end of file diff --git a/instrumentation/jedis-5.0.0/src/main/java/redis/clients/jedis/Connection_Instrumentation.java b/instrumentation/jedis-5.0.0/src/main/java/redis/clients/jedis/Connection_Instrumentation.java new file mode 100644 index 0000000000..53bf8511a6 --- /dev/null +++ b/instrumentation/jedis-5.0.0/src/main/java/redis/clients/jedis/Connection_Instrumentation.java @@ -0,0 +1,90 @@ +/* + * + * * Copyright 2020 New Relic Corporation. All rights reserved. + * * SPDX-License-Identifier: Apache-2.0 + * + */ + +package redis.clients.jedis; + +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.agent.bridge.datastore.DatastoreVendor; +import com.newrelic.api.agent.DatastoreParameters; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.weaver.MatchType; +import com.newrelic.api.agent.weaver.NewField; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; +import redis.clients.jedis.commands.ProtocolCommand; + +import java.nio.charset.StandardCharsets; +import java.util.logging.Level; + +@SuppressWarnings({ "ResultOfMethodCallIgnored", "WeakerAccess", "unused" }) // Weaver.callOriginal(), matching signatures +@Weave(type = MatchType.BaseClass, originalName = "redis.clients.jedis.Connection") +public abstract class Connection_Instrumentation { + + @NewField + private long db = 0; + + abstract HostAndPort getHostAndPort(); + + public void disconnect() { + db = 0; + Weaver.callOriginal(); + } + + @Trace + public void sendCommand(final ProtocolCommand cmd, final byte[]... args) { + Weaver.callOriginal(); + if (args != null && args.length > 0) { + updateDbIndex(cmd, new String(args[0], StandardCharsets.UTF_8)); + } + } + + @Trace + public void sendCommand(final ProtocolCommand cmd, final String... args) { + Weaver.callOriginal(); + if (args != null && args.length > 0) { + updateDbIndex(cmd, args[0]); + } + } + + @Trace(leaf = true) + public void sendCommand(final CommandArguments args) { + Weaver.callOriginal(); + + ProtocolCommand cmd = args.getCommand(); + reportMethodAsExternal(cmd); + + } + + private void updateDbIndex(ProtocolCommand cmd, String arg0) { + try { + if (cmd == Protocol.Command.SELECT) { + db = Long.parseLong(arg0); + } + } catch (Throwable t) { + AgentBridge.getAgent().getLogger().log(Level.FINER, t, "Unable to set DB index"); + } + } + + private void reportMethodAsExternal(ProtocolCommand command) { + String operation = "unknown"; + try { + + operation = new String(command.getRaw(), Protocol.CHARSET).toLowerCase(); + } catch (Exception ignored) { + } + + NewRelic.getAgent().getTracedMethod().reportAsExternal(DatastoreParameters + .product(DatastoreVendor.Redis.name()) + .collection(null) + .operation(operation) + .instance(getHostAndPort().getHost(), getHostAndPort().getPort()) + .databaseName(String.valueOf(db)) + .build()); + } + +} diff --git a/instrumentation/jedis-5.0.0/src/main/java/redis/clients/jedis/JedisPubSubBase_Instrumentation.java b/instrumentation/jedis-5.0.0/src/main/java/redis/clients/jedis/JedisPubSubBase_Instrumentation.java new file mode 100644 index 0000000000..314b032d93 --- /dev/null +++ b/instrumentation/jedis-5.0.0/src/main/java/redis/clients/jedis/JedisPubSubBase_Instrumentation.java @@ -0,0 +1,77 @@ +package redis.clients.jedis; + +import com.newrelic.agent.bridge.datastore.DatastoreVendor; +import com.newrelic.api.agent.DatastoreParameters; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.weaver.MatchType; +import com.newrelic.api.agent.weaver.NewField; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; + +@SuppressWarnings({ "ResultOfMethodCallIgnored", "unused" }) +@Weave(type = MatchType.ExactClass, originalName = "redis.clients.jedis.JedisPubSubBase") +public class JedisPubSubBase_Instrumentation { + + private volatile Connection client; + + public final void proceed(Connection client, Object... channels) { + Weaver.callOriginal(); + } + + public void proceedWithPatterns(Connection client, Object... channels) { + Weaver.callOriginal(); + } + + @Trace + public void onMessage(Object channel, Object message) { + Weaver.callOriginal(); + + reportMethodAsExternal("message"); + } + + @Trace + public void onPMessage(Object pattern, Object channel, Object message) { + Weaver.callOriginal(); + + reportMethodAsExternal("message"); + } + + @Trace + public void onSubscribe(Object channel, int subscribedChannels) { + Weaver.callOriginal(); + + reportMethodAsExternal("subscribe"); + } + + @Trace + public void onUnsubscribe(Object channel, int subscribedChannels) { + Weaver.callOriginal(); + + reportMethodAsExternal("unsubscribe"); + } + + @Trace + public void onPUnsubscribe(Object pattern, int subscribedChannels) { + Weaver.callOriginal(); + + reportMethodAsExternal("unsubscribe"); + } + + @Trace + public void onPSubscribe(Object pattern, int subscribedChannels) { + Weaver.callOriginal(); + + reportMethodAsExternal("subscribe"); + } + + private void reportMethodAsExternal(String commandName) { + NewRelic.getAgent().getTracedMethod().reportAsExternal(DatastoreParameters + .product(DatastoreVendor.Redis.name()) + .collection(null) + .operation(commandName) + .instance(client.getHostAndPort().getHost(), client.getHostAndPort().getPort()) + .build()); + + } +} From 9ddbac2d4ce70479c4147007e7ca53be0e77410f Mon Sep 17 00:00:00 2001 From: edeleon Date: Wed, 3 Jul 2024 15:37:57 -0700 Subject: [PATCH 3/5] update imports --- .../redis/clients/jedis/JedisPubSubBase_Instrumentation.java | 1 - 1 file changed, 1 deletion(-) diff --git a/instrumentation/jedis-5.0.0/src/main/java/redis/clients/jedis/JedisPubSubBase_Instrumentation.java b/instrumentation/jedis-5.0.0/src/main/java/redis/clients/jedis/JedisPubSubBase_Instrumentation.java index 314b032d93..b78202c2aa 100644 --- a/instrumentation/jedis-5.0.0/src/main/java/redis/clients/jedis/JedisPubSubBase_Instrumentation.java +++ b/instrumentation/jedis-5.0.0/src/main/java/redis/clients/jedis/JedisPubSubBase_Instrumentation.java @@ -5,7 +5,6 @@ import com.newrelic.api.agent.NewRelic; import com.newrelic.api.agent.Trace; import com.newrelic.api.agent.weaver.MatchType; -import com.newrelic.api.agent.weaver.NewField; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; From fc4aa05d2a87c1b767ded738e8e1be7126b6877e Mon Sep 17 00:00:00 2001 From: edeleon Date: Wed, 17 Jul 2024 15:46:38 -0700 Subject: [PATCH 4/5] update verifyInstrumentation --- instrumentation/jedis-5.0.0/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation/jedis-5.0.0/build.gradle b/instrumentation/jedis-5.0.0/build.gradle index 5e26c5da1f..0efd5985bf 100644 --- a/instrumentation/jedis-5.0.0/build.gradle +++ b/instrumentation/jedis-5.0.0/build.gradle @@ -11,7 +11,7 @@ dependencies { } verifyInstrumentation { - passes 'redis.clients:jedis:[5.0.0,6.0.0)' + passesOnly 'redis.clients:jedis:[5.0.0,)' fails 'redis.clients:jedis:[1.4.0,3.8.0]' excludeRegex 'redis.clients:jedis:.*-(m|rc|RC|alpha|beta)[0-9]*' exclude 'redis.clients:jedis:3.6.2' From 3fa82210a6bfb917ff7e3a623eacec5fc043a859 Mon Sep 17 00:00:00 2001 From: edeleon Date: Fri, 2 Aug 2024 16:09:49 -0700 Subject: [PATCH 5/5] update/add copyright header --- .../redis/clients/jedis/Connection_Instrumentation.java | 2 +- .../clients/jedis/JedisPubSubBase_Instrumentation.java | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/instrumentation/jedis-5.0.0/src/main/java/redis/clients/jedis/Connection_Instrumentation.java b/instrumentation/jedis-5.0.0/src/main/java/redis/clients/jedis/Connection_Instrumentation.java index 53bf8511a6..cbd9290f2b 100644 --- a/instrumentation/jedis-5.0.0/src/main/java/redis/clients/jedis/Connection_Instrumentation.java +++ b/instrumentation/jedis-5.0.0/src/main/java/redis/clients/jedis/Connection_Instrumentation.java @@ -1,6 +1,6 @@ /* * - * * Copyright 2020 New Relic Corporation. All rights reserved. + * * Copyright 2024 New Relic Corporation. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * */ diff --git a/instrumentation/jedis-5.0.0/src/main/java/redis/clients/jedis/JedisPubSubBase_Instrumentation.java b/instrumentation/jedis-5.0.0/src/main/java/redis/clients/jedis/JedisPubSubBase_Instrumentation.java index b78202c2aa..ea19f8affc 100644 --- a/instrumentation/jedis-5.0.0/src/main/java/redis/clients/jedis/JedisPubSubBase_Instrumentation.java +++ b/instrumentation/jedis-5.0.0/src/main/java/redis/clients/jedis/JedisPubSubBase_Instrumentation.java @@ -1,3 +1,10 @@ +/* + * + * * Copyright 2024 New Relic Corporation. All rights reserved. + * * SPDX-License-Identifier: Apache-2.0 + * + */ + package redis.clients.jedis; import com.newrelic.agent.bridge.datastore.DatastoreVendor;