Skip to content

Commit b54ce7d

Browse files
authored
SLOWLOG GET for Redis 4.0+ (#2084)
1 parent a07f707 commit b54ce7d

File tree

6 files changed

+113
-24
lines changed

6 files changed

+113
-24
lines changed

src/main/java/redis/clients/jedis/BinaryJedis.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3516,15 +3516,15 @@ public Long slowlogLen() {
35163516
}
35173517

35183518
@Override
3519-
public List<byte[]> slowlogGetBinary() {
3519+
public List<Object> slowlogGetBinary() {
35203520
client.slowlogGet();
3521-
return client.getBinaryMultiBulkReply();
3521+
return client.getObjectMultiBulkReply();
35223522
}
35233523

35243524
@Override
3525-
public List<byte[]> slowlogGetBinary(final long entries) {
3525+
public List<Object> slowlogGetBinary(final long entries) {
35263526
client.slowlogGet(entries);
3527-
return client.getBinaryMultiBulkReply();
3527+
return client.getObjectMultiBulkReply();
35283528
}
35293529

35303530
@Override

src/main/java/redis/clients/jedis/HostAndPort.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,19 @@ public String toString() {
5252
return host + ":" + port;
5353
}
5454

55+
/**
56+
* Creates HostAndPort with <i>unconverted</i> host.
57+
*
58+
* @param string String to parse. Must be in <b>"host:port"</b> format. Port is mandatory.
59+
* @return parsed HostAndPort
60+
*/
61+
public static HostAndPort from(String string) {
62+
int lastColon = string.lastIndexOf(":");
63+
String host = string.substring(0, lastColon);
64+
int port = Integer.parseInt(string.substring(lastColon + 1));
65+
return new HostAndPort(host, port);
66+
}
67+
5568
/**
5669
* Splits String into host and port parts.
5770
* String must be in ( host + ":" + port ) format.

src/main/java/redis/clients/jedis/Protocol.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,10 +283,17 @@ public static enum Keyword {
283283
ID, IDLE, TIME, RETRYCOUNT, FORCE, USAGE, SAMPLES, STREAM, GROUPS, CONSUMERS, HELP, FREQ,
284284
SETUSER, GETUSER, DELUSER, WHOAMI, CAT, GENPASS, USERS;
285285

286+
/**
287+
* @deprecated This will be private in future. Use {@link #getRaw()}.
288+
*/
286289
public final byte[] raw;
287290

288291
Keyword() {
289292
raw = SafeEncoder.encode(this.name().toLowerCase(Locale.ENGLISH));
290293
}
294+
295+
public byte[] getRaw() {
296+
return raw;
297+
}
291298
}
292299
}

src/main/java/redis/clients/jedis/commands/AdvancedBinaryJedisCommands.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ public interface AdvancedBinaryJedisCommands {
1616

1717
Long slowlogLen();
1818

19-
List<byte[]> slowlogGetBinary();
19+
List<Object> slowlogGetBinary();
2020

21-
List<byte[]> slowlogGetBinary(long entries);
21+
List<Object> slowlogGetBinary(long entries);
2222

2323
Long objectRefcount(byte[] key);
2424

src/main/java/redis/clients/jedis/util/Slowlog.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,17 @@
33
import java.util.ArrayList;
44
import java.util.List;
55

6+
import redis.clients.jedis.HostAndPort;
7+
68
public class Slowlog {
9+
710
private final long id;
811
private final long timeStamp;
912
private final long executionTime;
1013
private final List<String> args;
14+
private HostAndPort clientIpPort;
15+
private String clientName;
16+
1117
private static final String COMMA = ",";
1218

1319
@SuppressWarnings("unchecked")
@@ -23,6 +29,10 @@ private Slowlog(List<Object> properties) {
2329
for (byte[] barg : bargs) {
2430
this.args.add(SafeEncoder.encode(barg));
2531
}
32+
if (properties.size() == 4) return;
33+
34+
this.clientIpPort = HostAndPort.from(SafeEncoder.encode((byte[]) properties.get(4)));
35+
this.clientName = SafeEncoder.encode((byte[]) properties.get(5));
2636
}
2737

2838
@SuppressWarnings("unchecked")
@@ -35,7 +45,7 @@ public static List<Slowlog> from(List<Object> nestedMultiBulkReply) {
3545

3646
return logs;
3747
}
38-
48+
3949
public long getId() {
4050
return id;
4151
}
@@ -52,6 +62,14 @@ public List<String> getArgs() {
5262
return args;
5363
}
5464

65+
public HostAndPort getClientIpPort() {
66+
return clientIpPort;
67+
}
68+
69+
public String getClientName() {
70+
return clientName;
71+
}
72+
5573
@Override
5674
public String toString() {
5775
return new StringBuilder().append(id).append(COMMA).append(timeStamp).append(COMMA)
Lines changed: 68 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,42 @@
11
package redis.clients.jedis.tests.commands;
22

3+
import static org.junit.Assert.assertArrayEquals;
34
import static org.junit.Assert.assertEquals;
45
import static org.junit.Assert.assertNotNull;
56
import static org.junit.Assert.assertTrue;
67

78
import java.util.List;
8-
9+
import org.junit.After;
10+
import org.junit.Before;
911
import org.junit.Test;
1012

13+
import redis.clients.jedis.Protocol;
14+
import redis.clients.jedis.util.SafeEncoder;
1115
import redis.clients.jedis.util.Slowlog;
1216

1317
public class SlowlogCommandsTest extends JedisCommandTestBase {
1418

19+
private static final String SLOWLOG_TIME_PARAM = "slowlog-log-slower-than";
20+
private static final String ZERO = "0";
21+
private String slowlogTimeValue;
22+
23+
@Before
24+
@Override
25+
public void setUp() throws Exception {
26+
super.setUp();
27+
slowlogTimeValue = jedis.configGet(SLOWLOG_TIME_PARAM).get(1);
28+
}
29+
30+
@After
31+
@Override
32+
public void tearDown() throws Exception {
33+
jedis.configSet(SLOWLOG_TIME_PARAM, slowlogTimeValue);
34+
super.tearDown();
35+
}
36+
1537
@Test
1638
public void slowlog() {
17-
final String slowlogTimeParam = "slowlog-log-slower-than";
18-
final String slowlogTimeValue = jedis.configGet(slowlogTimeParam).get(1);
19-
20-
jedis.configSet("slowlog-log-slower-than", "0");
39+
jedis.configSet(SLOWLOG_TIME_PARAM, ZERO);
2140
jedis.set("foo", "bar");
2241
jedis.set("foo2", "bar2");
2342

@@ -30,27 +49,59 @@ public void slowlog() {
3049
assertTrue(log.getExecutionTime() >= 0);
3150
assertNotNull(log.getArgs());
3251

33-
List<byte[]> breducedLog = jedis.slowlogGetBinary(1);
52+
List<Object> breducedLog = jedis.slowlogGetBinary(1);
3453
assertEquals(1, breducedLog.size());
3554

3655
List<Slowlog> log1 = jedis.slowlogGet();
37-
List<byte[]> blog1 = jedis.slowlogGetBinary();
56+
List<Object> blog1 = jedis.slowlogGetBinary();
3857

3958
assertNotNull(log1);
4059
assertNotNull(blog1);
60+
}
4161

42-
long len1 = jedis.slowlogLen();
43-
62+
@Test
63+
public void slowlogObjectDetails() {
64+
final String clientName = "slowlog-object-client";
65+
jedis.clientSetname(clientName);
4466
jedis.slowlogReset();
67+
jedis.configSet(SLOWLOG_TIME_PARAM, ZERO);
4568

46-
List<Slowlog> log2 = jedis.slowlogGet();
47-
List<byte[]> blog2 = jedis.slowlogGetBinary();
48-
long len2 = jedis.slowlogLen();
49-
50-
assertTrue(len1 > len2);
51-
assertTrue(log1.size() > log2.size());
52-
assertTrue(blog1.size() > blog2.size());
69+
List<Slowlog> logs = jedis.slowlogGet(); // Get only 'CONFIG SET'
70+
assertEquals(1, logs.size());
71+
Slowlog log = logs.get(0);
72+
assertTrue(log.getId() > 0);
73+
assertTrue(log.getTimeStamp() > 0);
74+
assertTrue(log.getExecutionTime() > 0);
75+
assertEquals(4, log.getArgs().size());
76+
assertEquals(SafeEncoder.encode(Protocol.Command.CONFIG.getRaw()), log.getArgs().get(0));
77+
assertEquals(SafeEncoder.encode(Protocol.Keyword.SET.getRaw()), log.getArgs().get(1));
78+
assertEquals(SLOWLOG_TIME_PARAM, log.getArgs().get(2));
79+
assertEquals(ZERO, log.getArgs().get(3));
80+
assertEquals("127.0.0.1", log.getClientIpPort().getHost());
81+
assertTrue(log.getClientIpPort().getPort() > 0);
82+
assertEquals(clientName, log.getClientName());
83+
}
5384

54-
jedis.configSet(slowlogTimeParam, slowlogTimeValue);
85+
@Test
86+
public void slowlogBinaryDetails() {
87+
final byte[] clientName = SafeEncoder.encode("slowlog-binary-client");
88+
jedis.clientSetname(clientName);
89+
jedis.slowlogReset();
90+
jedis.configSet(SafeEncoder.encode(SLOWLOG_TIME_PARAM), SafeEncoder.encode(ZERO));
91+
92+
List<Object> logs = jedis.slowlogGetBinary(); // Get only 'CONFIG SET'
93+
assertEquals(1, logs.size());
94+
List<Object> log = (List<Object>) logs.get(0);
95+
assertTrue((Long) log.get(0) > 0);
96+
assertTrue((Long) log.get(1) > 0);
97+
assertTrue((Long) log.get(2) > 0);
98+
List<Object> args = (List<Object>) log.get(3);
99+
assertEquals(4, args.size());
100+
assertArrayEquals(Protocol.Command.CONFIG.getRaw(), (byte[]) args.get(0));
101+
assertArrayEquals(Protocol.Keyword.SET.getRaw(), (byte[]) args.get(1));
102+
assertArrayEquals(SafeEncoder.encode(SLOWLOG_TIME_PARAM), (byte[]) args.get(2));
103+
assertArrayEquals(Protocol.toByteArray(0), (byte[]) args.get(3));
104+
assertTrue(SafeEncoder.encode((byte[]) log.get(4)).startsWith("127.0.0.1:"));
105+
assertArrayEquals(clientName, (byte[]) log.get(5));
55106
}
56107
}

0 commit comments

Comments
 (0)