Skip to content

Commit e6cdd8a

Browse files
authored
Merge pull request #2466 from newrelic/jedis-6-support
Jedis 6 support
2 parents 6c9941a + a18e159 commit e6cdd8a

File tree

4 files changed

+188
-0
lines changed

4 files changed

+188
-0
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
jar {
2+
manifest { attributes 'Implementation-Title': 'com.newrelic.instrumentation.jedis-6.0.0' }
3+
}
4+
5+
dependencies {
6+
implementation(project(":agent-bridge"))
7+
implementation(project(":agent-bridge-datastore"))
8+
implementation(project(":newrelic-api"))
9+
implementation(project(":newrelic-weaver-api"))
10+
implementation("redis.clients:jedis:6.0.0")
11+
}
12+
13+
verifyInstrumentation {
14+
passesOnly 'redis.clients:jedis:[6.0.0,)'
15+
excludeRegex 'redis.clients:jedis:.*-(m|rc|RC|alpha|beta)[0-9]*'
16+
exclude 'redis.clients:jedis:3.6.2'
17+
18+
}
19+
20+
site {
21+
title 'Jedis'
22+
type 'Datastore'
23+
}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
/*
2+
*
3+
* * Copyright 2025 New Relic Corporation. All rights reserved.
4+
* * SPDX-License-Identifier: Apache-2.0
5+
*
6+
*/
7+
8+
package redis.clients.jedis;
9+
10+
import com.newrelic.agent.bridge.AgentBridge;
11+
import com.newrelic.agent.bridge.datastore.DatastoreVendor;
12+
import com.newrelic.api.agent.DatastoreParameters;
13+
import com.newrelic.api.agent.NewRelic;
14+
import com.newrelic.api.agent.Trace;
15+
import com.newrelic.api.agent.weaver.MatchType;
16+
import com.newrelic.api.agent.weaver.NewField;
17+
import com.newrelic.api.agent.weaver.Weave;
18+
import com.newrelic.api.agent.weaver.Weaver;
19+
import redis.clients.jedis.commands.ProtocolCommand;
20+
21+
import java.nio.charset.StandardCharsets;
22+
import java.util.logging.Level;
23+
24+
@SuppressWarnings({ "ResultOfMethodCallIgnored", "WeakerAccess", "unused" }) // Weaver.callOriginal(), matching signatures
25+
@Weave(type = MatchType.BaseClass, originalName = "redis.clients.jedis.Connection")
26+
public abstract class Connection_Instrumentation {
27+
28+
@NewField
29+
private long db = 0;
30+
31+
abstract HostAndPort getHostAndPort();
32+
33+
public void disconnect() {
34+
db = 0;
35+
Weaver.callOriginal();
36+
}
37+
38+
@Trace
39+
public void sendCommand(final ProtocolCommand cmd, final byte[]... args) {
40+
Weaver.callOriginal();
41+
if (args != null && args.length > 0) {
42+
updateDbIndex(cmd, new String(args[0], StandardCharsets.UTF_8));
43+
}
44+
}
45+
46+
@Trace
47+
public void sendCommand(final ProtocolCommand cmd, final String... args) {
48+
Weaver.callOriginal();
49+
if (args != null && args.length > 0) {
50+
updateDbIndex(cmd, args[0]);
51+
}
52+
}
53+
54+
@Trace(leaf = true)
55+
public void sendCommand(final CommandArguments args) {
56+
Weaver.callOriginal();
57+
58+
ProtocolCommand cmd = args.getCommand();
59+
reportMethodAsExternal(cmd);
60+
61+
}
62+
63+
private void updateDbIndex(ProtocolCommand cmd, String arg0) {
64+
try {
65+
if (cmd == Protocol.Command.SELECT) {
66+
db = Long.parseLong(arg0);
67+
}
68+
} catch (Throwable t) {
69+
AgentBridge.getAgent().getLogger().log(Level.FINER, t, "Unable to set DB index");
70+
}
71+
}
72+
73+
private void reportMethodAsExternal(ProtocolCommand command) {
74+
String operation = "unknown";
75+
try {
76+
77+
operation = new String(command.getRaw(), Protocol.CHARSET).toLowerCase();
78+
} catch (Exception ignored) {
79+
}
80+
81+
NewRelic.getAgent().getTracedMethod().reportAsExternal(DatastoreParameters
82+
.product(DatastoreVendor.Redis.name())
83+
.collection(null)
84+
.operation(operation)
85+
.instance(getHostAndPort().getHost(), getHostAndPort().getPort())
86+
.databaseName(String.valueOf(db))
87+
.build());
88+
}
89+
90+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
/*
2+
*
3+
* * Copyright 2025 New Relic Corporation. All rights reserved.
4+
* * SPDX-License-Identifier: Apache-2.0
5+
*
6+
*/
7+
8+
package redis.clients.jedis;
9+
10+
import com.newrelic.agent.bridge.datastore.DatastoreVendor;
11+
import com.newrelic.api.agent.DatastoreParameters;
12+
import com.newrelic.api.agent.NewRelic;
13+
import com.newrelic.api.agent.Trace;
14+
import com.newrelic.api.agent.weaver.MatchType;
15+
import com.newrelic.api.agent.weaver.Weave;
16+
import com.newrelic.api.agent.weaver.Weaver;
17+
18+
@SuppressWarnings({ "ResultOfMethodCallIgnored", "unused" })
19+
@Weave(type = MatchType.ExactClass, originalName = "redis.clients.jedis.JedisPubSubBase")
20+
public class JedisPubSubBase_Instrumentation {
21+
22+
private final JedisSafeAuthenticator authenticator = Weaver.callOriginal();
23+
24+
@Trace
25+
public void onMessage(Object channel, Object message) {
26+
Weaver.callOriginal();
27+
28+
reportMethodAsExternal("message");
29+
}
30+
31+
@Trace
32+
public void onPMessage(Object pattern, Object channel, Object message) {
33+
Weaver.callOriginal();
34+
35+
reportMethodAsExternal("message");
36+
}
37+
38+
@Trace
39+
public void onSubscribe(Object channel, int subscribedChannels) {
40+
Weaver.callOriginal();
41+
42+
reportMethodAsExternal("subscribe");
43+
}
44+
45+
@Trace
46+
public void onUnsubscribe(Object channel, int subscribedChannels) {
47+
Weaver.callOriginal();
48+
49+
reportMethodAsExternal("unsubscribe");
50+
}
51+
52+
@Trace
53+
public void onPUnsubscribe(Object pattern, int subscribedChannels) {
54+
Weaver.callOriginal();
55+
56+
reportMethodAsExternal("unsubscribe");
57+
}
58+
59+
@Trace
60+
public void onPSubscribe(Object pattern, int subscribedChannels) {
61+
Weaver.callOriginal();
62+
63+
reportMethodAsExternal("subscribe");
64+
}
65+
66+
private void reportMethodAsExternal(String commandName) {
67+
NewRelic.getAgent().getTracedMethod().reportAsExternal(DatastoreParameters
68+
.product(DatastoreVendor.Redis.name())
69+
.collection(null)
70+
.operation(commandName)
71+
.instance(authenticator.client.getHostAndPort().getHost(), authenticator.client.getHostAndPort().getPort())
72+
.build());
73+
}
74+
}

settings.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,7 @@ include 'instrumentation:jedis-2.7.2'
224224
include 'instrumentation:jedis-3.0.0'
225225
include 'instrumentation:jedis-4.0.0'
226226
include 'instrumentation:jedis-5.0.0'
227+
include 'instrumentation:jedis-6.0.0'
227228
include 'instrumentation:jersey-1'
228229
include 'instrumentation:jersey-2'
229230
include 'instrumentation:jersey-3'

0 commit comments

Comments
 (0)